API Mosaqo dla programistów
API REST na tej samej przestrzeni roboczej, której używasz w aplikacji. Wszystko poniżej działa z jednym kluczem API i dowolnym klientem HTTP.
Co możesz zrobić
- Tworzyć kody QR z własnych rekordów — pojedynczo albo dziesięć tysięcy z pliku CSV.
- Zmienić, dokąd prowadzi wydrukowany kod, jednym wywołaniem i bez ponownego druku.
- Pobrać gotową kartę w PNG, SVG lub PDF i dołączyć ją do rekordu w CRM.
- Czytać skanowania i zagregowaną analitykę, filtrowane przez reguły prywatności Twojej przestrzeni.
- Otrzymywać podpisane webhooki, gdy kody są tworzone, publikowane, zmieniane lub archiwizowane.
Szybki start
Utwórz klucz w sekcji Bulk & API swojej przestrzeni, zaznacz zakresy qr:write i qr:read i skopiuj sekret — pokazujemy go tylko raz.
Sprawdź klucz i dowiedz się, którą przestrzeń otwiera:
curl https://api.mosaqo.app/v1/public-api/me \
-H "Authorization: Bearer $MOSAQO_KEY"Utwórz dynamiczny kod QR:
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" }
}'Opublikuj go — to właśnie uruchamia przekierowanie — a potem pobierz obraz gotowy do druku:
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.pngMiesiące później, gdy kampania się zmieni, przekieruj ten sam wydrukowany kod bez ponownego druku:
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" }'Uwierzytelnianie
Wyślij sekret w dowolny z dwóch sposobów. Oba obowiązują przez całe v1.
Authorization: Bearer mosaqo_xxx
X-Mosaqo-API-Key: mosaqo_xxxKlucz należy do dokładnie jednej przestrzeni roboczej, więc ścieżki nie potrzebują jej identyfikatora: wystarczy /v1/public-api/qr. Starsza forma /v1/public-api/workspaces/{workspaceId}/qr nadal działa.
| Zakres | Pozwala na |
|---|---|
qr:read | Listowanie i odczyt kodów QR, folderów i szablonów |
qr:write | Tworzenie, zmianę, przekierowanie, publikację, archiwizację i usuwanie |
exports:read | Pobieranie wyrenderowanych kart |
analytics:read | Zagregowaną analitykę i pojedyncze skanowania |
bulk:write | Tworzenie i odczyt zadań zbiorczych |
webhooks:write | Zarządzanie subskrypcjami webhooków |
Klucze można unieważnić, nadać im datę wygaśnięcia i ograniczyć do listy dozwolonych adresów IP. Jeśli to ta lista odrzuciła klucz, mówimy o tym wprost, zamiast pozwolić mu wyglądać na nieważny.
Paginacja
Listy używają paginacji kluczowej. Odsyłaj pagination.nextCursor bez zmian: wiersze nigdy się nie powtórzą ani nie znikną dlatego, że coś zmieniono w trakcie synchronizacji — co ma znaczenie przy nocnym przebiegu.
curl "https://api.mosaqo.app/v1/public-api/qr?limit=50&cursor=$CURSOR" \
-H "Authorization: Bearer $MOSAQO_KEY"Aby odpytywać o zmiany zamiast przechodzić wszystko, dodaj updatedSince=2026-08-05T00:00:00Z.
Błędy
Każdy błąd niesie stabilny code, na którym można się rozgałęzić, czytelny message oraz requestId, który warto podać wsparciu.
{
"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 | Kody | Co zrobić |
|---|---|---|
| 401 | invalid_api_key | Klucza brakuje, został unieważniony albo wygasł. Poproś użytkownika o ponowne połączenie. |
| 403 | insufficient_scope, ip_not_allowed, workspace_mismatch, quota_exceeded | Klucz jest ważny, ale nie ma tego uprawnienia. Ponowne połączenie nic nie da. |
| 404 | not_found | Nie ma takiego rekordu w tej przestrzeni. |
| 409 | idempotency_conflict, idempotency_in_progress | Klucz użyty ponownie z innymi danymi albo pierwsza próba wciąż trwa. |
| 422 | validation_failed, invalid_cursor, approval_required, contrast_check_failed | Popraw dane wejściowe. Nigdy nie ponawiaj bez zmian. |
| 429 | rate_limited | Odczekaj liczbę sekund z nagłówka Retry-After. |
Limity zapytań
Każda odpowiedź niesie Twój bieżący budżet, nie tylko te odrzucone:
X-RateLimit-Limit: 600
X-RateLimit-Remaining: 574
X-RateLimit-Reset: 1785942718Limit to zabezpieczenie przed nadużyciami, a nie plan taryfowy: nie oznacza ani kwoty, ani rozliczeń, ani przejścia wyżej.
Idempotentność
Idempotency-Key jest opcjonalny. Wyślij go — dowolny unikalny ciąg — a ponowienie identycznego żądania w ciągu 24 godzin odtworzy pierwotną odpowiedź zamiast działać dwa razy. Ten sam klucz z innymi danymi zwróci 409. Bez klucza żądanie po prostu się wykona, bez ochrony przed powtórzeniem.
Dalej
- Webhooki — katalog zdarzeń i jak zweryfikować dostarczenie.
- Przepisy — wzorce dla Make, Zapier, n8n i systemów CRM.
- Dokumentacja API — każdy endpoint, z konsolą na żywo.