Przejdź do treści

API kodów kreskowych i QR

Kody kreskowe i QR z Twojego programu. Te same symboliki, te same reguły i ten sam renderer co darmowe generatory na qreska.com, oraz kody dynamiczne z panelu.

Dla kogo

API jest w planach Biznes (10 000 wywołań miesięcznie) i Pro (100 000 wywołań miesięcznie). Klucz tworzysz w panelu, na stronie API.

Przejdź do panelu

Adres i klucz

Wszystkie trasy są pod adresem https://app.qreska.com/api/v1. Każde wywołanie niesie klucz w nagłówku, nigdy w adresie, bo adresy trafiają do logów i historii przeglądarki. Klucza nie umieszczaj w kodzie strony, który trafia do przeglądarki: API jest dla Twojego serwera.

Klucz API z panelu, w nagłówku Authorization: Bearer qrk_…

Opis wszystkich tras w formacie OpenAPI 3.1, do wczytania w Postmanie, Insomnii albo generatorze klienta: https://app.qreska.com/api/v1/openapi.json?lang=pl

Limity

  • Miesięczny limit wywołań z planu liczy się w miesiącu kalendarzowym (UTC). Liczy się każde wywołanie z poprawnym kluczem, także zakończone błędem walidacji; nie liczą się odrzucone przez brak klucza i przez limit.
  • Do 20 wywołań na sekundę na zespół. Ponad to odpowiedź 429 z nagłówkiem Retry-After.
  • Każda odpowiedź ma nagłówki RateLimit-Limit, RateLimit-Remaining i RateLimit-Reset (sekundy do początku następnego miesiąca).

Co zapisujemy

Treść kodów statycznych rysujemy w pamięci i zapominamy po wysłaniu odpowiedzi. W dzienniku wywołań, który widzisz w panelu, jest czas, klucz, metoda, trasa bez danych, wynik i czas odpowiedzi — bez treści i bez adresu IP. Szczegóły w polityce prywatności.

Przykłady

Kod EAN-13 jako PNG w 600 dpi:

curl -X POST https://app.qreska.com/api/v1/barcodes \
  -H "Authorization: Bearer $QRESKA_KEY" \
  -H "Content-Type: application/json" \
  -d '{"symbology":"ean-13","data":"590123412345","format":"png","dpi":600}' \
  -o ean-13.png

Kod dynamiczny, a potem zmiana jego celu:

curl -X POST https://app.qreska.com/api/v1/codes \
  -H "Authorization: Bearer $QRESKA_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"Flyer","target":{"type":"url","url":"https://example.com/offer"}}'

curl -X PATCH https://app.qreska.com/api/v1/codes/$CODE_ID \
  -H "Authorization: Bearer $QRESKA_KEY" \
  -H "Content-Type: application/json" \
  -d '{"target":{"type":"url","url":"https://example.com/winter"}}'

SDK dla JavaScriptu i PHP

Dwie małe biblioteki bez zależności: dla Node.js 18+ (TypeScript, fetch) i dla PHP 8.1+ (curl). Obsługują klucz, błędy jako wyjątki z kodem z tabeli wyżej, ponowienie po 429 rate_limited i stronicowanie listy kodów. Do czasu publikacji w npm i Packagist instalujesz je z katalogów sdk/js i sdk/php w repozytorium.

JavaScript i TypeScript:

import { Qreska } from "@qreska/sdk";

const qreska = new Qreska({ apiKey: process.env.QRESKA_KEY });
const file = await qreska.barcode({ symbology: "ean-13", data: "590123412345", format: "png" });
const code = await qreska.codes.create({
  name: "Flyer",
  target: { type: "url", url: "https://example.com/offer" },
});

PHP:

$qreska = new \Qreska\Client(getenv('QRESKA_KEY'));
$file = $qreska->barcode(['symbology' => 'ean-13', 'data' => '590123412345', 'format' => 'png']);
file_put_contents('ean-13.png', $file->data);
$code = $qreska->createCode([
    'name' => 'Flyer',
    'target' => ['type' => 'url', 'url' => 'https://example.com/offer'],
]);

Numery GTIN, ISBN i ISSN

Numery GTIN/EAN nadaje organizacja GS1, w Polsce GS1 Polska. Qreska tylko rysuje kod z numeru, który już masz.

W Polsce numery ISBN nadaje Krajowe Biuro ISBN w Bibliotece Narodowej. Qreska tylko rysuje kod z numeru, który już masz.

W Polsce numery ISSN nadaje Krajowy Ośrodek ISSN w Bibliotece Narodowej. Qreska tylko rysuje kod z numeru, który już masz.

Błędy

Błędy mają format application/problem+json (RFC 9457). Pole code jest stałe i do porównań w programie; title jest dla człowieka, po polsku albo po angielsku według nagłówka Accept-Language. Przy błędach walidacji errors wskazuje pola: path to miejsce w ciele żądania, code to powód.

Błędy
KodStatusZnaczenie
unauthorized401Brak klucza API albo klucz jest nieznany lub unieważniony.
forbidden403Plan tej organizacji nie obejmuje API.
suspended403Organizacja jest zawieszona do wyjaśnienia: nie może tworzyć kodów ani zmieniać celów.
not_found404Nie ma takiego zasobu w tej organizacji.
invalid_request400Żądanie nie jest poprawnym JSON-em albo nie pasuje do schematu.
invalid_data422Tej treści nie da się zapisać w wybranej symbolice.
blocked_target422Ten adres jest na liście zablokowanych albo prowadzi do oszustwa lub złośliwego oprogramowania.
plan_limit409Plan nie pozwala na więcej kodów dynamicznych.
quota_exceeded429Miesięczny limit wywołań API planu jest wykorzystany.
rate_limited429Za dużo wywołań na sekundę. Spróbuj ponownie za chwilę.
internal500Błąd po naszej stronie. Spróbuj ponownie; jeśli się powtarza, napisz do nas.

Trasy

Zużycie w tym miesiącu

GET /api/v1/usage

Plan zespołu, liczba wywołań w bieżącym miesiącu i limit. Najprostszy sposób, żeby sprawdzić, że klucz działa; samo wywołanie też się liczy.

Odpowiedź: 200 JSON

Lista symbolik

GET /api/v1/symbologies

Symboliki, które przyjmuje POST /api/v1/barcodes: identyfikator, rodzaj, przykład, domyślne wymiary w mm, przełączniki z wartościami i informacja, kto nadaje numery.

Odpowiedź: 200 JSON

Rodzaje treści QR

GET /api/v1/qr-contents

Rodzaje treści dla pola qrContent (Wi-Fi, wizytówka, e-mail, przelew…) z ich polami. Te same co na stronach /qr.

Odpowiedź: 200 JSON

Kod statyczny

POST /api/v1/barcodes

Rysuje kod z podanej treści i zwraca plik w wybranym formacie. Wartość po normalizacji, na przykład z cyfrą kontrolną, jest w nagłówku Qreska-Value; ostrzeżenia, które nie zatrzymały rysowania (kontrast, wymiar modułu), w nagłówku Qreska-Warning.

Ciało żądania (JSON)

Ciało żądania (JSON)
PoleTypWartościOpis
symbologywymaganestringjedna z: ean-13, ean-8, upc-a, upc-e, isbn, issn, itf-14, gs1-128, code-128, code-39, interleaved-2-of-5, codabar, pharmacode, data-matrix, gs1-data-matrix, pdf417, aztec, micro-qr, qrSymbolika, jak w adresie generatora: ean-13, code-128, qr…
datastringdo 8000 znakówTreść kodu. Dla QR zamiast niej możesz podać qrContent.
qrContentobjectTylko dla qr: rodzaj treści i wartości jej pól; serwis złoży z nich treść tak jak strona /qr.
addonstringdo 5 znakówDodatek 2- lub 5-cyfrowy, dla symbolik, które go mają (EAN-13, UPC-A, ISBN…).
optionsobjectPrzełączniki symboliki, na przykład errorCorrection dla QR. Lista w GET /api/v1/symbologies.
formatstringjedna z: svg, png, pdf, json; domyślnie "svg"Format pliku.
moduleWidthMmnumberod 0.1 do 5Szerokość modułu (X) w mm.
barHeightMmnumberod 3 do 300Wysokość kresek w mm, dla kodów 1D.
hriobjectTekst pod kodem 1D: czy go pokazać i jaka ma być wysokość cyfr w mm.
colorsobjectKolory #RRGGBB kresek i tła. Czerwone i pomarańczowe kreski kodów 1D są odrzucane, bo skaner laserowy ich nie widzi.
rotationnumberjedna z: 0, 90, 180, 270Obrót w stopniach.
moduleShapestringjedna z: square, rounded, dotTylko dla qr: kształt modułów.
dpiintegerod 72 do 1200; domyślnie 300Rozdzielczość PNG. Każdy moduł ma całą liczbę pikseli, a DPI zapisane w pliku zgadza się z wymiarem w mm.
pdfobjectStrona PDF: dopasowana do kodu z marginesem albo A4.

Odpowiedź: 200 Plik: SVG, PNG, PDF, JSON

Lista kodów dynamicznych

GET /api/v1/codes

Kody zespołu, od najnowszego, stronami. Następną stronę pobierasz z kursorem z pola nextCursor; null oznacza koniec listy.

Parametry

Parametry
PoleTypWartościOpis
qstringdo 200 znakówSzukaj w nazwie, adresie kodu i adresie celu.
projectIdstringdo 100 znakówTylko kody z tego projektu.
limitintegerod 1 do 100; domyślnie 50Liczba kodów na stronie.
cursorstringdo 200 znakówKursor z nextCursor poprzedniej strony.

Odpowiedź: 200 JSON

Nowy kod dynamiczny

POST /api/v1/codes

Tworzy kod dynamiczny z celem. Cel przechodzi te same sprawdzenia co w panelu: listę zablokowanych domen i Google Web Risk. Obowiązują limity planu.

Ciało żądania (JSON)

Ciało żądania (JSON)
PoleTypWartościOpis
namewymaganestringdo 120 znakówNazwa kodu, widoczna w panelu.
targetwymaganeobjectCel: url, vcard, wifi, links albo menu (pdf tylko z plikiem wgranym w panelu).
projectIdobjectProjekt, do którego trafi kod.

Odpowiedź: 201 JSON

Kod dynamiczny

GET /api/v1/codes/{id}

Jeden kod zespołu z celem i ustawieniami. Hasło nigdy nie jest zwracane, tylko informacja, czy jest.

Odpowiedź: 200 JSON

Zmiana kodu dynamicznego

PATCH /api/v1/codes/{id}

Zmienia cel, nazwę, projekt, wygląd, stan albo opcje. Nowy cel działa od razu, a w historii kodu w panelu widać, że zmienił go ten klucz.

Ciało żądania (JSON)

Ciało żądania (JSON)
PoleTypWartościOpis
namestringdo 120 znakówNowa nazwa.
targetobjectNowy cel.
projectIdobjectProjekt albo null, żeby wyjąć kod z projektu.
appearanceobjectWygląd: wymiar modułu, poziom korekcji, kolory, kształt, obrót, logo.
statusstringjedna z: active, pausedactive albo paused. Zablokowanego kodu nie da się wznowić.
passwordobjectHasło, o które kod zapyta, albo null, żeby je usunąć.
expiresAtobjectOd tej chwili kod pokazuje, że wygasł; null usuwa datę.
scanLimitobjectPo tylu skanach kod pokazuje, że wygasł; null usuwa limit.

Odpowiedź: 200 JSON

Usunięcie kodu dynamicznego

DELETE /api/v1/codes/{id}

Usuwa kod z listy. Jego adres od tej chwili pokazuje, że kod jest nieaktywny, i nigdy nie trafi do nikogo innego.

Odpowiedź: 204 Bez treści

Statystyki skanów

GET /api/v1/codes/{id}/scans

Skany ludzi (bez botów) dzień po dniu, sumy okresu, poprzedniego okresu i od początku oraz najczęstsze kraje, miasta, systemy, urządzenia i przeglądarki.

Parametry

Parametry
PoleTypWartościOpis
daysstringjedna z: 7, 30, 90, 365; domyślnie "30"Okres w dniach.

Odpowiedź: 200 JSON

Obraz kodu dynamicznego

GET /api/v1/codes/{id}/image

Kod narysowany z wyglądem zapisanym w panelu. Kod z logo WebP jest dostępny tylko jako SVG; w PNG i PDF wgraj logo PNG, JPEG albo SVG.

Parametry

Parametry
PoleTypWartościOpis
formatstringjedna z: svg, png, pdf; domyślnie "svg"Format pliku.
dpiintegerod 72 do 1200; domyślnie 300Rozdzielczość PNG.

Odpowiedź: 200 Plik: SVG, PNG, PDF

Lista projektów

GET /api/v1/projects

Projekty, w które zespół grupuje kody.

Odpowiedź: 200 JSON

Nowy projekt

POST /api/v1/projects

Tworzy projekt; jego id podajesz w polu projectId kodu.

Ciało żądania (JSON)

Ciało żądania (JSON)
PoleTypWartościOpis
namewymaganestringdo 80 znakówNazwa projektu.

Odpowiedź: 201 JSON