Abundera QR Pro API
REST API -viite palvelulle pro.qr.abundera.ai. Luo, muokkaa ja analysoi dynaamisia QR-koodeja ohjelmallisesti. Kaikki on JSON HTTPS:n yli, todennettu bearer-tokenilla.
/docs/openapi.json, import into Postman, Insomnia, or any OpenAPI 3.1 client. Covers 36 customer-facing endpoints across Codes, Analytics, Groups, Teams, Webhooks, and User. Admin + Stripe-webhook endpoints are intentionally excluded (service-to-service only).Johdanto
Abundera QR Pro -rajapinta antaa sinun luoda, muokata ja analysoida dynaamisia QR-koodeja ohjelmallisesti, kaikki mitä kehittäjä haluaa automatisoida koontinäytöstä. Tiimin hallinta, laskutus ja tilivirtaukset pysyvät koontinäytön käyttöliittymässä; tämä rajapinta on suhteutettu kehittäjätason koodioperaatioihin.
Perus-URL: https://pro.qr.abundera.ai/api
Pyyntömuoto: JSON (Content-Type: application/json) on POST / PATCH / DELETE.
Vastausmuoto: JSON (application/json; charset=utf-8).
Saatavuus: Rajapintakäyttö on Business+-ominaisuus. Solo-suunnitelmat voivat käyttää koontinäyttöä, mutta eivät rajapintaa.
Todennus
Jokainen pyyntö kantaa API-avainta bearer-tokenina:
Authorization: Bearer abnd_qrpro_...Luo ja peruuta avaimia osoitteessa /account/keys (Business-, Team- tai Agency-taso). Raaka abnd_qrpro_... -token näytetään täsmälleen kerran luonnin yhteydessä, tallenna se heti. Tallennamme vain sen SHA-256-tiivisteen; kadonnutta avainta ei voi palauttaa.
Unauthenticated requests return 401 { "error": "not_signed_in" }. Invalid or revoked keys return 401 { "error": "invalid_api_key" }.
API-avaimet on suhteutettu niitä luoneelle käyttäjälle. Jos kyseinen käyttäjä on tiimin jäsen, alla olevat päätepisteet toimivat automaattisesti tiimin koodeihin (nykyisen tiimin konteksti tallennetaan käyttäjätilille ja hallitaan koontinäytön kautta).
Nopeusrajoitukset
Pakotettu API-avainkohtaisesti. Jokainen vastaus sisältää X-RateLimit-Limit-, X-RateLimit-Remaining- ja X-RateLimit-Reset-otsakkeet (unix-sekunnit, kun ikkuna nollautuu).
| Suunnitelma | Raja | Ikkuna |
|---|---|---|
| Business | 1 000 pyyntöä / pv | UTC-päivä |
| Team | 10 000 pyyntöä / pv | UTC-päivä |
| Agency | 50 000 pyyntöä / pv | UTC-päivä |
| Solo | (403 insufficient_plan) | , |
Over-budget requests return 429 { "error": "rate_limited", "window": "day", "retry_at": 1234567890 } with a Retry-After header in seconds.
Skannauksia ei rajoiteta, uudelleenohjauksen nopealla polulla (aqr.net/{shortcode}) ei ole todennusta eikä skannaajuskohtaista budjettia. Jokaisella suunnitelmalla on selkeä kuukausittainen skannausraja (100 000 / 1 M / 10 M / 30 M). Ylitä raja ja uudelleenohjaus toimii silti; lähetämme sinulle sähköpostia, jotta voit päättää päivityksestä tai odottaa kertaluonteista piikkiä. Suunnitteletko yli ~10 miljoonaa päivittäistä skannausta? Lähetä meille sähköpostia kapasiteetin koordinoimiseksi.
Virheet
Jokainen virhesvastaus on JSON, jossa on koneluettava error-koodi ja tarvittaessa lisäkonteksti:
{ "error": "plan_limit", "plan": "business", "limit": 500, "current": 500 }| Tila | Koodi | Merkitys |
|---|---|---|
| 400 | validation_error | Kenttä epäonnistui validoinnissa. Vastaus sisältää field + message. |
| 401 | not_signed_in / invalid_api_key | Puuttuva, virheellinen tai peruutettu bearer-token. |
| 402 | plan_limit | Suunnitelmasi aktiivisten+pysäytettyjen koodien katossa. Vastaus sisältää plan, limit, current. |
| 402 | plan_expired | Tili on ylittänyt 90 päivän lisäajan; päivitä jatkaaksesi. |
| 403 | insufficient_plan | Rajapintakäyttö vaatii Business- tai korkeamman tason. Solo-käyttäjät kohtaavat tämän. |
| 403 | insufficient_role | Tiimiroolisi ei salli pyydettyä muutosta (järjestelmänvalvoja+ vaaditaan). |
| 404 | not_found | Resurssia ei ole olemassa tai se ei ole näkyvissä laajuutessasi. |
| 409 | code_not_editable | Koodi on lisäaika- tai vanhentuneessa tilassa; aktivoi uudelleen muokkaamista varten. |
| 429 | rate_limited | Per-plan daily budget exceeded. See Nopeusrajoitukset. |
| 500 | internal | Käsittelemätön palvelinvirhe, lähetä sähköpostia tukeen, jos toistettavissa. |
Koodit
Dynaamiset QR-koodit: 7-merkkinen Base58-lyhytkoodi, joka uudelleenohjaa aqr.net/{shortcode}:n kautta. Jokaisessa koodissa on staattinen varakopio-QR, jonka voit ladata koontinäytöstä, jos joskus lopetat maksamisen, staattinen versio ratkaisee koskematta uudelleenohjauksemme.
GET /api/codes
Listaa kaikki koodit nykyisessä laajuudessasi (henkilökohtainen tai tiimi, jonka alaisuudessa toimit). Palauttaa taulukon, jossa 30 päivän skannauskoosteet per koodi.
$ 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
Luo uusi dynaaminen koodi. Suunnitelmasi aktiivisten+pysäytettyjen koodien katto tarkistetaan ennen lisäystä. Minimaalinen body:
{ "url": "https://example.com/landing" }Täydellinen mukauttaminen (kaikki valinnaisia):
{ "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" }Palauttaa 201 + luodun rivin, joka sisältää generoidun shortcode:n ja short_url:n, joka tulostetaan.
GET /api/codes/{id}
Hae yksittäinen koodi. 404, jos ei laajuudessasi.
PATCH /api/codes/{id}
Päivitä mikä tahansa muutettava kenttä. Yleisin käyttö: muuta jo tulostetun koodin kohde-URL.
$ 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/uuidMuutokset välittyvät uudelleenohjaukseen sekunnin sisällä. Kelvolliset status-arvot PATCH:ille: "active", "paused". Poistamiseen käytä DELETE.
DELETE /api/codes/{id}
Pehmeä poisto. Siirtyy tilaan status=grace, jossa grace_until = nyt + 90 päivää. Uudelleenohjaus toimii edelleen koko lisäajan, tämä on hinnoittelulupauksen konkreettinen toteutus. 90 päivän jälkeen koodi siirtyy tilaan expired ja uudelleenohjaus palauttaa 410 Gone.
POST /api/codes/import
Joukoluonti taulukko-hyötykuormasta (käytetään myös "Tallenna Pro:hon" -virtauksessa osoitteessa qr.abundera.ai). Hyväksyy yksittäisen koodin hyötykuorman tai taulukon. Suunnitelman raja tarkistetaan kerran ennen erää.
Analytiikka
GET /api/codes/{id}/analytics
Kyselyparametrit:
range=7d|30d|90d|1y|3y, rajattu suunnitelmasi säilytykseen (Solo 1v, Business 2v, Team/Agency 3v).granularity=day|hour, tuntikohtainen on vain Team ja Agency; max 7 päivän ikkuna tuntikohtaiselle.
{
"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 }
]
}Countries with fewer than 5 scans in the window are folded into "Other" for privacy (see Tietosuojamalli).
API-avaimet
Luo ja peruuta avaimia /account/keys -koontinäyttösivulta. Ohjelmallinen itsehallinta on vain luku -tilassa rajapinnan kautta, voit listata avaimesi ja peruuttaa ne, mutta uuden avaimen luominen vaatii koontinäytön (muna-kana-ongelma: tarvitsisit avaimen luodaksesi avaimen).
GET /api/keys
Listaa API-avaimesi. Ei koskaan palauta raakaa tokenia, vain metadataa.
{
"keys": [
{ "id": "uuid", "label": "Production server",
"created_at": 1713288000, "last_used_at": 1713370000 }
],
"allowed": true,
"plan": "business"
}DELETE /api/keys/{id}
Peruuta. Avain lakkaa toimimasta heti; mikä tahansa sitä kantava pyyntö palauttaa sen jälkeen 401 invalid_api_key.
Datan vienti
GET /api/user/export
Lataa ZIP, joka sisältää täyden tietojoukkojen, codes.csv (jokainen koodi, mukaan lukien lisäaika + vanhentunut), scans.csv (koottu päivittäinen koosteys) ja README.txt, joka selittää muodon. Arkisto lähetetään muodossa application/zip; putkita se tiedostoon:
$ curl -H "Authorization: Bearer abnd_qrpro_..." \
-o abundera-qr-export.zip \
https://pro.qr.abundera.ai/api/user/exportTuo uudelleen minne tahansa. Tämä on siirrettävyysmuodon takuu, toimittajaan lukittuminen ei ole mahdollista, jos omistat datasi.
Tietosuojamalli
Skannauskoosteys on koko tietosuojatarina. Mitä tallennamme per skannaus uudelleenohjauksen nopealla polulla:
code_id, mikä koodeistasi skannattiinday_bucket, UTC-päivämäärä (YYYY-MM-DD). Ei alle päivän tarkkuutta palautetussa koosteessa.country, ISO-3166-1 alpha-2 CloudflarenCF-IPCountry-otsakkeesta. Ei kaupunkia, ei aluetta, ei geo-IP-hakua.device_type,mobile/tablet/desktop/unknown, luokiteltu lyhyestä User-Agent-regexistä. Raaka UA-merkkijono hylätään luokitteluhetkellä.scan_count, koosteyhteenlaskuri, upserted jokaisella osumalla.
Mitä emme tallenna: IP-osoitteita (tiivistettyinä tai muuten), raa'ita User-Agent-merkkijonoja, kaupunkitason geotietoja, alle päivän aikaleimoja, referer-tietoja, evästeitä, uudelleenkohdennuspikseleitä tai mitään yksilöivää vektoria. Melukerroin 5 estää pienien koosteiden uudelleentunnistamisen.
Team- ja Agency-tasot kirjoittavat lisäksi rinnakkaisen tuntikoosteen hour_bucket:lla (YYYY-MM-DD-HH UTC). Sama tietosuojamalli, ei alle tunnin aikaleimoja, sama melukerroin, sama yksilöiden skannaustietojen puuttuminen.
Lue koko tarina: /manifesto/ ja /no-lock-in/ ilmaistyökalun sivustolla.