Abundera QR Pro/ Documentation

Abundera QR Pro API

REST API-referens för pro.qr.abundera.ai. Skapa, redigera och analysera dynamiska QR-koder programmatiskt. Allt är JSON över HTTPS, autentiserat via bearer-token.

Senast uppdaterad: 2026-04-18 · support@abundera.ai · OpenAPI 3.1-spec (JSON) · Officiella SDK:er (TS / Python / Go)

Maskinläsbar spec:/docs/openapi.json, importera i Postman, Insomnia eller valfri OpenAPI 3.1-klient. Täcker 36 kundvända endpoints för Codes, Analytics, Groups, Teams, Webhooks och User. Admin- och Stripe-webhook-endpoints är avsiktligt exkluderade (enbart service-to-service).

Introduktion

Med Abundera QR Pro API kan du skapa, redigera och analysera dynamiska QR-koder programmatiskt, allt en utvecklare vill automatisera från dashboarden. Teamhantering, fakturering och kontosöder stannar i dashboardens gränssnitt; detta API är avgränsat till utvecklarrelaterade kodoperationer.

Bas-URL: https://pro.qr.abundera.ai/api

Format på förfrågningar: JSON (Content-Type: application/json) för POST / PATCH / DELETE.

Format på svar: JSON (application/json; charset=utf-8).

Tillgänglighet: API-åtkomst är en Business+-funktion. Solo-planer kan använda dashboarden men inte API:et.

Autentisering

Varje förfrågan bär en API-nyckel som bearer-token:

Authorization: Bearer abnd_qrpro_...

Skapa och återkalla nycklar på /account/keys (Business-, Team- eller Agency-nivå). Den råa abnd_qrpro_...-token visas exakt en gång vid skapandet, spara den omedelbart. Vi lagrar bara dess SHA-256-hash; det finns inget sätt att återfå en förlorad nyckel.

Oautentiserade förfrågningar returnerar 401 { "error": "not_signed_in" }. Ogiltiga eller återkallade nycklar returnerar 401 { "error": "invalid_api_key" }.

API-nycklar är kopplade till den användare som skapade dem. Om den användaren är med i ett team arbetar endpoints nedan automatiskt mot teamets koder (kontext för aktuellt team lagras på användarkontot och hanteras via dashboarden).

Hastighetsgränser

Tillämpas per API-nyckel. Varje svar innehåller X-RateLimit-Limit, X-RateLimit-Remaining och X-RateLimit-Reset (unix-sekunder när fönstret rullar om).

PlanGränsFönster
Business1 000 förfrågningar / dagUTC-dag
Team10 000 förfrågningar / dagUTC-dag
Agency50 000 förfrågningar / dagUTC-dag
Solo(403 insufficient_plan),

Förfrågningar som överskrider budgeten returnerar 429 { "error": "rate_limited", "window": "day", "retry_at": 1234567890 } med en Retry-After-header i sekunder.

Skanningar är inte hastighetsbegränsade, omdirigeringens kritiska väg (aqr.net/{shortcode}) har ingen autentisering och ingen per-skanningsbudget. Varje plan har ett explicit månatligt skanningstak (100 k / 1 M / 10 M / 30 M). Överskrider du taket löser omdirigeringen ändå; vi e-postar dig så att du kan bestämma om du vill uppgradera eller rida ut en engångspik. Planerar du mer än ~10 M dagliga skanningar? Kontakta oss för att samordna kapaciteten.

Fel

Varje felsvar är JSON med en maskinläsbar error-kod och, vid behov, ytterligare kontext:

{ "error": "plan_limit", "plan": "business", "limit": 500, "current": 500 }
StatusKodBetydelse
400validation_errorBrödtextfält klarade inte validering. Svaret innehåller field + message.
401not_signed_in / invalid_api_keyBearer-token saknas, är ogiltig eller har återkallats.
402plan_limitDu har nått planens tak för aktiva + pausade koder. Svaret innehåller plan, limit, current.
402plan_expiredKontot har passerat 90-dagarsrespiten; uppgradera för att återuppta.
403insufficient_planAPI-åtkomst kräver Business eller högre. Solo-användare träffar detta.
403insufficient_roleDin teamroll tillåter inte den begärda ändringen (admin+ krävs).
404not_foundResursen finns inte eller är inte synlig inom ditt scope.
409code_not_editableKoden har status grace eller expired; återaktivera för att redigera.
429rate_limitedPlanens dagliga budget har överskridits. Se Hastighetsgränser.
500internalOhanterat serverfel, kontakta support om det är reproducerbart.

Koder

Dynamiska QR-koder: en 7-teckens Base58-kortkod som omdirigerar via aqr.net/{shortcode}. Varje kod har en statisk backup-QR som du kan ladda ned från dashboarden, om du någonsin slutar betala fungerar den statiska versionen fortfarande utan att röra vår omdirigering.

GET /api/codes

Lista alla koder i ditt aktuella scope (personligt, eller det team du för närvarande agerar under). Returnerar en array med en 30-dagars skanningssammanfattning per kod.

$ 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

Skapa en ny dynamisk kod. Planens tak för aktiva + pausade koder kontrolleras före infogning. Minimal brödtext:

{ "url": "https://example.com/landing" }

Full anpassning (alla valfria):

{ "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" }

Returnerar 201 + den skapade raden inklusive genererad shortcode och den short_url du skriver ut.

GET /api/codes/{id}

Hämta en enskild kod. 404 om den inte finns i ditt scope.

PATCH /api/codes/{id}

Uppdatera valfritt redigerbart fält. Vanligaste användningen: ändra mål-URL för en redan tryckt kod.

$ 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

Ändringar sprids till omdirigeringen inom sekunder. Giltiga status-värden för PATCH: "active", "paused". Använd DELETE för att ta bort.

DELETE /api/codes/{id}

Mjuk borttagning. Övergår till status=grace med grace_until = now + 90 days. Omdirigeringen fortsätter fungera under hela respitfönstret, detta är löftet om ingen inlåsning konkretiserat. Efter 90 dagar blir koden expired och omdirigeringen returnerar 410 Gone.

POST /api/codes/import

Massskapa från ett array-payload (används även av flödet "Spara till Pro" på qr.abundera.ai). Accepterar ett enskilt kodpayload eller en array. Plangränsen kontrolleras en gång innan batchen.

Analys

GET /api/codes/{id}/analytics

Frågeparametrar:

  • range=7d|30d|90d|1y|3y, begränsas till planens retention (Solo 1 år, Business 2 år, Team/Agency 3 år).
  • granularity=day|hour, timme är enbart för Team och Agency; max 7-dagarsfönster för timvis.
{
  "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 }
  ]
}

Länder med färre än 5 skanningar i fönstret slås ihop till "Other" av integritetsskäl (se Integritetsmodell).

API-nycklar

Skapa och återkalla nycklar från /account/keys-sidan i dashboarden. Programmatisk självhantering är skrivskyddad via API:et, du kan lista dina nycklar och återkalla dem, men att skapa en ny nyckel kräver dashboarden (hönan och ägget: du skulle behöva en nyckel för att skapa en nyckel).

GET /api/keys

Lista dina API-nycklar. Returnerar aldrig den råa token, bara metadata.

{
  "keys": [
    { "id": "uuid", "label": "Production server",
      "created_at": 1713288000, "last_used_at": 1713370000 }
  ],
  "allowed": true,
  "plan": "business"
}

DELETE /api/keys/{id}

Återkalla. Nyckeln slutar fungera omedelbart; alla efterföljande förfrågningar som bär den returnerar 401 invalid_api_key.

Dataexport

GET /api/user/export

Ladda ned en ZIP med ditt fullständiga dataset, codes.csv (alla koder, inklusive grace + expired), scans.csv (aggregerad daglig sammanfattning) och en README.txt som förklarar formatet. Arkivet levereras som application/zip; dirigera till en fil:

$ curl -H "Authorization: Bearer abnd_qrpro_..."        -o abundera-qr-export.zip        https://pro.qr.abundera.ai/api/user/export

Återimportera var som helst. Det här är garantin för portabelt format, ingen inlåsning är möjlig om du äger dina uppgifter.

Integritetsmodell

Skanningsaggregatets är hela integritetsberättelsen. Vad vi lagrar per skanning på omdirigeringens kritiska väg:

  • code_id, vilken av dina koder som skannades
  • day_bucket, UTC-datum (YYYY-MM-DD). Ingen upplösning under dag i aggregatet som returneras till dig.
  • country, ISO-3166-1 alpha-2 från Cloudflares CF-IPCountry-header. Ingen stad, ingen region, ingen geo-IP-uppslaging.
  • device_type, mobile / tablet / desktop / unknown, klassificerat från ett kort User-Agent-regex. Den råa UA-strängen kasseras vid klassificeringstillfället.
  • scan_count, aggregerad räknare, upsertas vid varje träff.

Vad vi inte lagrar: IP-adresser (hashade eller ej), råa User-Agent-strängar, geo på stadsnivå, tidsstämplar under dag, referer, cookies, återmarknadsföringspixlar eller någon vektor som identifierar individer. Ett brusträttröskel på 5 undertrycker reidentifiering av liten aggregatdata.

Team- och Agency-nivåer skriver dessutom ett parallellt timvisaggregat med hour_bucket (YYYY-MM-DD-HH UTC). Samma integritetsmodell, ingen upplösning under timme, samma brusträtttröskel, samma avsaknad av data om enskilda skanners.

Läs hela berättelsen: /manifesto/ och /no-lock-in/ på den kostnadsfria verktygsplatsen.