Abundera QR Pro API
REST API-reference til pro.qr.abundera.ai. Opret, rediger og analysér dynamiske QR-koder programmatisk. Alt er JSON over HTTPS, godkendt via bearer-token.
/docs/openapi.json, importer til Postman, Insomnia eller en hvilken som helst OpenAPI 3.1-klient. Dækker 36 kundevendte endpoints på tværs af Koder, Analyse, Grupper, Teams, Webhooks og Bruger. Admin- og Stripe-webhook-endpoints er bevidst udeladt (kun service-til-service).Introduktion
Abundera QR Pro API lader dig oprette, redigere og analysere dynamiske QR-koder programmatisk, alt det en udvikler vil automatisere fra dashboardet. Teamstyring, fakturering og kontohåndtering forbliver i dashboard-brugerfladen; dette API er afgrænset til kodeoperationer på udviklerplan.
Basis-URL: https://pro.qr.abundera.ai/api
Anmodningsformat: JSON (Content-Type: application/json) på POST / PATCH / DELETE.
Svarformat: JSON (application/json; charset=utf-8).
Tilgængelighed: API-adgang er en Business+-funktion. Solo-planer kan bruge dashboardet, men ikke API.
Godkendelse
Hver anmodning sender en API-nøgle som bearer-token:
Authorization: Bearer abnd_qrpro_...Opret og tilbagekald nøgler på /account/keys (Business-, Team- eller Agency-niveau). Det rå abnd_qrpro_...-token vises præcis én gang ved oprettelse, gem det med det samme. Vi opbevarer kun dets SHA-256-hash; der er ingen måde at gendanne en mistet nøgle.
Ugodkendte anmodninger returnerer 401 { "error": "not_signed_in" }. Ugyldige eller tilbagekaldte nøgler returnerer 401 { "error": "invalid_api_key" }.
API-nøgler er begrænset til den bruger, der oprettede dem. Hvis den bruger er medlem af et team, opererer endpoints nedenfor automatisk på teamets koder (den aktuelle teamkontekst er gemt på brugerkontoen og administreres via dashboardet).
Hastighedsbegrænsninger
Håndhæves pr. API-nøgle. Hvert svar indeholder X-RateLimit-Limit, X-RateLimit-Remaining og X-RateLimit-Reset (unix-sekunder for hvornår vinduet nulstilles).
| Plan | Grænse | Vindue |
|---|---|---|
| Business | 1.000 anmodninger / dag | UTC-dag |
| Team | 10.000 anmodninger / dag | UTC-dag |
| Agency | 50.000 anmodninger / dag | UTC-dag |
| Solo | (403 insufficient_plan) | , |
Anmodninger over budgettet returnerer 429 { "error": "rate_limited", "window": "day", "retry_at": 1234567890 } med en Retry-After-header i sekunder.
Scan er ikke hastighedsbegrænsede, redirect-stien (aqr.net/{shortcode}) kræver ingen godkendelse og har intet pr.-scan-budget. Hver plan har et eksplicit månedligt scan-loft (100K / 1M / 10M / 30M). Overskrider du loftet, virker redirect stadig; vi sender dig en e-mail, så du kan beslutte, om du vil opgradere eller ride en engangs-spike ud. Planlægger du over ca. 10 mio. daglige scan? Skriv til os for at koordinere kapaciteten.
Fejl
Hvert fejlsvar er JSON med en maskinlæsbar error-kode og, hvor relevant, yderligere kontekst:
{ "error": "plan_limit", "plan": "business", "limit": 500, "current": 500 }| Status | Kode | Betydning |
|---|---|---|
| 400 | validation_error | Et feltindhold bestod ikke validering. Svaret indeholder field + message. |
| 401 | not_signed_in / invalid_api_key | Manglende, ugyldig eller tilbagekaldt bearer-token. |
| 402 | plan_limit | Du har nået planens aktive+pauserede kodegrænse. Svaret indeholder plan, limit, current. |
| 402 | plan_expired | Kontoen har overskredet 90-dages henstandsvinduet; opgrader for at genoptage. |
| 403 | insufficient_plan | API-adgang kræver Business eller højere. Solo-brugere rammer dette. |
| 403 | insufficient_role | Din teamrolle tillader ikke den anmodede ændring (kræver admin+). |
| 404 | not_found | Ressourcen eksisterer ikke eller er ikke synlig i dit scope. |
| 409 | code_not_editable | Koden er i henstands- eller udløbet status; genaktivér for at redigere. |
| 429 | rate_limited | Planens daglige budget er overskredet. Se Hastighedsbegrænsninger. |
| 500 | internal | Uhåndteret serverfejl, skriv til support hvis det kan reproduceres. |
Koder
Dynamiske QR-koder: en 7-tegns Base58-kortkode, der redirecter via aqr.net/{shortcode}. Hver kode leveres med en statisk backup-QR, du kan downloade fra dashboardet, stopper du med at betale, virker den statiske version stadig uden at røre vores redirect.
GET /api/codes
Vis alle koder i dit aktuelle scope (personligt eller det team, du aktuelt handler under). Returnerer et array med en 30-dages scan-opsummering pr. kode.
$ curl -H "Authorization: Bearer abnd_qrpro_..." \
https://pro.qr.abundera.ai/api/codes
{
"codes": [
{ "id": "uuid", "shortcode": "aBc123x",
"url": "https://example.com/landing",
"label": "Q2 campaign", "tags": "q2,print",
"status": "active", "scans_30d": 1245,
"created_at": 1713288000, "updated_at": 1713370000 }
],
"plan": "business",
"plan_limit": 500,
"scope": { "type": "user" }
}POST /api/codes
Opret en ny dynamisk kode. Planens aktive+pauserede kodegrænse kontrolleres inden indsætning. Minimalt indhold:
{ "url": "https://example.com/landing" }Fuld tilpasning (alle valgfri):
{ "url": "https://example.com/landing",
"label": "Spring campaign",
"tags": "q2,print",
"qr_type": "url",
"style_json": "{...}",
"logo_key": "instagram",
"frame_style": "scan-me",
"frame_text": "SCAN ME" }Returnerer 201 + den oprettede række inklusive den genererede shortcode og den short_url, du printer.
GET /api/codes/{id}
Hent en enkelt kode. 404 hvis den ikke er i dit scope.
PATCH /api/codes/{id}
Opdatér et hvilket som helst muterbart felt. Den hyppigste brug: skift destinations-URL for en allerede trykt kode.
$ curl -X PATCH \
-H "Authorization: Bearer abnd_qrpro_..." \
-H "Content-Type: application/json" \
-d '{"url":"https://example.com/new-landing"}' \
https://pro.qr.abundera.ai/api/codes/uuidÆndringer slår igennem i redirect inden for få sekunder. Gyldige status-værdier til PATCH: "active", "paused". Brug DELETE til at slette.
DELETE /api/codes/{id}
Blød sletning. Overgår til status=grace med grace_until = now + 90 dage. Redirect fungerer fortsat i hele henstandsvinduet, det er det konkrete udtryk for løftet om ingen bindingstid. Efter 90 dage bliver koden expired og redirect returnerer 410 Gone.
POST /api/codes/import
Masseopret fra et array-payload (bruges også af "Gem til Pro"-flowet på qr.abundera.ai). Accepterer et enkelt kode-payload eller et array. Plangrænsen kontrolleres én gang inden batchen.
Analyse
GET /api/codes/{id}/analytics
Forespørgselsparametre:
range=7d|30d|90d|1y|3y, begrænset til planens opbevaringsperiode (Solo 1 år, Business 2 år, Team/Agency 3 år).granularity=day|hour, timegranularitet er kun Team og Agency; maks. 7-dages vindue for timer.
{
"range": "30d", "days": 30, "granularity": "day",
"total": 4321,
"timeseries": [
{ "bucket": "2026-04-01", "scans": 142 },
{ "bucket": "2026-04-02", "scans": 178 },
...
],
"by_country": [
{ "key": "US", "total": 3012 },
{ "key": "CA", "total": 402 },
{ "key": "Other", "total": 108 }
],
"by_device": [
{ "key": "mobile", "total": 3850 },
{ "key": "tablet", "total": 312 },
{ "key": "desktop", "total": 159 }
]
}Lande med færre end 5 scan i vinduet slås sammen i "Other" af hensyn til privatlivet (se Privatlivsmodel).
API keys
Opret og tilbagekald nøgler fra /account/keys-dashboardsiden. Programmatisk selvforvaltning er skrivebeskyttet via API, du kan vise dine nøgler og tilbagekalde dem, men oprettelse af en ny nøgle kræver dashboardet (hønen og ægget: du ville have brug for en nøgle for at oprette en nøgle).
GET /api/keys
Vis dine API-nøgler. Returnerer aldrig det rå token, kun metadata.
{
"keys": [
{ "id": "uuid", "label": "Production server",
"created_at": 1713288000, "last_used_at": 1713370000 }
],
"allowed": true,
"plan": "business"
}DELETE /api/keys/{id}
Tilbagekald. Nøglen holder op med at virke med det samme; enhver anmodning med den returnerer 401 invalid_api_key efterfølgende.
Dataeksport
GET /api/user/export
Download en ZIP med dit fulde datasæt, codes.csv (alle koder, inkl. henstands- og udløbne), scans.csv (aggregeret daglig opsummering) og en README.txt med forklaring af formatet. Arkivet udsendes som application/zip; send det videre til en fil:
$ curl -H "Authorization: Bearer abnd_qrpro_..." \
-o abundera-qr-export.zip \
https://pro.qr.abundera.ai/api/user/exportGenimporter hvor som helst. Det er garantien for et portabelt format, ingen leverandørbindingstid er mulig, når du ejer dine data.
Privatlivsmodel
Scan-aggregatet er hele privatlivshistorien. Hvad vi gemmer pr. scan på redirect-stien:
code_id, hvilken af dine koder der blev skannetday_bucket, UTC-dato (YYYY-MM-DD). Ingen sub-dag-præcision på det aggregat, der returneres til dig.country, ISO-3166-1 alpha-2 fra CloudflaresCF-IPCountry-header. Ingen by, ingen region, ingen geo-IP-opslag.device_type,mobile/tablet/desktop/unknown, klassificeret fra et kort User-Agent-regex. Den rå UA-streng kasseres på klassificeringstidspunktet.scan_count, aggregeret tæller, der upsettes ved hvert hit.
Hvad vi ikke gemmer: IP-adresser (hashede eller ej), rå User-Agent-strenge, bygeografi, sub-dag-tidsstempler, referer, cookies, retargeting-pixels eller nogen anden individuelt identificerende vektor. En støjgulv på 5 undertrykker re-identifikation af små aggregater.
Team- og Agency-niveauer skriver desuden et parallelt timesaggregat med hour_bucket (YYYY-MM-DD-HH UTC). Samme privatlivsmodel, ingen finere end time-tidsstempler, samme støjgulv, samme fravær af individuelle scannerdata.
Læs hele historien: /manifesto/ og /no-lock-in/ på det gratis-tool-site.