Hoppa till innehåll

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.png

Må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_xxx

En 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.

ScopeGer rätt till
qr:readLista och läsa QR-koder, mappar och mallar
qr:writeSkapa, ändra, styra om, publicera, arkivera och radera
exports:readLadda ner renderade kort
analytics:readAggregerad analys och enskilda skanningar
bulk:writeSkapa och läsa massjobb
webhooks:writeHantera 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"
}
StatusKoderVad du gör
401invalid_api_keyNyckeln saknas, är återkallad eller har gått ut. Be användaren ansluta på nytt.
403insufficient_scope, ip_not_allowed, workspace_mismatch, quota_exceededNyckeln är giltig men saknar rätten. Att ansluta på nytt hjälper inte.
404not_foundIngen sådan post i den här arbetsytan.
409idempotency_conflict, idempotency_in_progressEn nyckel återanvänd med andra data, eller första försöket pågår fortfarande.
422validation_failed, invalid_cursor, approval_required, contrast_check_failedRätta indata. Gör aldrig om försöket oförändrat.
429rate_limitedVä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: 1785942718

Grä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.