Mosaqo API för utvecklare
Ett REST-API mot samma arbetsyta som du använder i appen. Allt nedan fungerar med en enda API-nyckel och vilken HTTP-klient som helst.
Vad du kan göra
- Skapa QR-koder från dina egna poster — en i taget, eller tiotusen från en CSV.
- Ändra vart en tryckt kod pekar, med ett anrop och utan att trycka om något.
- Ladda ner det färdiga kortet som PNG, SVG eller PDF och fästa det på en CRM-post.
- Läsa skanningar och aggregerad analys, filtrerade av arbetsytans integritetsregler.
- Ta emot signerade webhooks när koder skapas, publiceras, ändras eller arkiveras.
Snabbstart
Skapa en nyckel under Bulk & API i din arbetsyta, kryssa i scopen qr:write och qr:read och kopiera hemligheten — den visas bara en gång.
Kontrollera nyckeln och ta reda på vilken arbetsyta den öppnar:
curl https://api.mosaqo.app/v1/public-api/me \
-H "Authorization: Bearer $MOSAQO_KEY"Skapa en dynamisk QR-kod:
curl -X POST https://api.mosaqo.app/v1/public-api/qr \
-H "Authorization: Bearer $MOSAQO_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Autumn campaign",
"mode": "dynamic",
"contentType": "url",
"content": { "targetUrl": "https://example.com/autumn" }
}'Publicera den — det är det som får omdirigeringen att fungera — och hämta sedan bilden du kan trycka:
curl -X POST https://api.mosaqo.app/v1/public-api/qr/$QR_ID/publish \
-H "Authorization: Bearer $MOSAQO_KEY"
curl https://api.mosaqo.app/v1/public-api/qr/$QR_ID/image?format=png&size=2048 \
-H "Authorization: Bearer $MOSAQO_KEY" -o campaign.pngMånader senare, när kampanjen flyttar, styr du om samma tryckta kod utan att trycka om den:
curl -X POST https://api.mosaqo.app/v1/public-api/qr/$QR_ID/destination \
-H "Authorization: Bearer $MOSAQO_KEY" \
-H "Content-Type: application/json" \
-d '{ "url": "https://example.com/winter" }'Autentisering
Skicka hemligheten på endera sättet. Båda gäller under hela v1.
Authorization: Bearer mosaqo_xxx
X-Mosaqo-API-Key: mosaqo_xxxEn nyckel hör till exakt en arbetsyta, så sökvägar behöver inget arbetsyte-id: /v1/public-api/qr räcker. Den äldre formen /v1/public-api/workspaces/{workspaceId}/qr fungerar fortfarande.
| Scope | Ger rätt till |
|---|---|
qr:read | Lista och läsa QR-koder, mappar och mallar |
qr:write | Skapa, ändra, styra om, publicera, arkivera och radera |
exports:read | Ladda ner renderade kort |
analytics:read | Aggregerad analys och enskilda skanningar |
bulk:write | Skapa och läsa massjobb |
webhooks:write | Hantera webhook-prenumerationer |
Nycklar kan återkallas, få ett utgångsdatum och begränsas till en IP-lista. Om det är listan som avvisar nyckeln säger vi det uttryckligen i stället för att låta den se ogiltig ut.
Paginering
Listor använder keyset-paginering. Skicka tillbaka pagination.nextCursor oförändrad: rader upprepas aldrig och försvinner aldrig för att något redigerats mitt i synkroniseringen — vilket spelar roll vid en nattlig körning.
curl "https://api.mosaqo.app/v1/public-api/qr?limit=50&cursor=$CURSOR" \
-H "Authorization: Bearer $MOSAQO_KEY"Vill du fråga efter ändringar i stället för att gå igenom allt lägger du till updatedSince=2026-08-05T00:00:00Z.
Fel
Varje fel bär en stabil code att grena på, ett läsbart message och ett requestId värt att nämna för supporten.
{
"error": "This API key does not have the qr:write scope.",
"message": "This API key does not have the qr:write scope.",
"code": "insufficient_scope",
"details": { "required": "qr:write", "granted": ["qr:read"] },
"requestId": "req-42"
}| Status | Koder | Vad du gör |
|---|---|---|
| 401 | invalid_api_key | Nyckeln saknas, är återkallad eller har gått ut. Be användaren ansluta på nytt. |
| 403 | insufficient_scope, ip_not_allowed, workspace_mismatch, quota_exceeded | Nyckeln är giltig men saknar rätten. Att ansluta på nytt hjälper inte. |
| 404 | not_found | Ingen sådan post i den här arbetsytan. |
| 409 | idempotency_conflict, idempotency_in_progress | En nyckel återanvänd med andra data, eller första försöket pågår fortfarande. |
| 422 | validation_failed, invalid_cursor, approval_required, contrast_check_failed | Rätta indata. Gör aldrig om försöket oförändrat. |
| 429 | rate_limited | Vänta antalet sekunder som Retry-After anger. |
Anropsgränser
Varje svar bär din aktuella budget, inte bara de som avvisas:
X-RateLimit-Limit: 600
X-RateLimit-Remaining: 574
X-RateLimit-Reset: 1785942718Gränsen är ett skydd mot missbruk, inte ett abonnemang: den innebär varken kvot, fakturering eller uppgradering.
Idempotens
Idempotency-Key är valfri. Skicka en — vilken unik sträng som helst — så spelar ett identiskt omförsök inom 24 timmar upp det ursprungliga svaret i stället för att agera två gånger. Samma nyckel med andra data ger 409. Utan nyckel körs anropet helt enkelt, utan skydd mot upprepning.
Vidare
- Webhooks — händelsekatalogen och hur du verifierar en leverans.
- Recept — mönster för Make, Zapier, n8n och CRM.
- API-referens — varje endpoint, med live-konsol.