Abundera QR Pro API
Referensi REST API untuk pro.qr.abundera.ai. Buat, edit, dan analisis QR dinamis secara terprogram. Semuanya JSON melalui HTTPS, diautentikasi via bearer token.
/docs/openapi.json, impor ke Postman, Insomnia, atau klien OpenAPI 3.1 apa pun. Mencakup 36 endpoint yang menghadap pelanggan di seluruh Kode, Analitik, Grup, Tim, Webhook, dan Pengguna. Endpoint admin + Stripe-webhook sengaja dikecualikan (hanya service-to-service).Pendahuluan
Abundera QR Pro API memungkinkan Anda membuat, mengedit, dan menganalisis QR dinamis secara terprogram, semua yang ingin diotomasi developer dari dashboard. Manajemen tim, penagihan, dan alur akun tetap di dashboard UI; API ini dibatasi pada operasi kode tingkat developer.
Base URL: https://pro.qr.abundera.ai/api
Format permintaan: JSON (Content-Type: application/json) pada POST / PATCH / DELETE.
Format respons: JSON (application/json; charset=utf-8).
Ketersediaan: Akses API adalah fitur Business+. Paket Solo dapat menggunakan dashboard tetapi tidak API.
Autentikasi
Setiap permintaan membawa kunci API sebagai bearer token:
Authorization: Bearer abnd_qrpro_...Buat dan cabut kunci di /account/keys (tier Business, Team, atau Agency). Token abnd_qrpro_... mentah ditampilkan tepat sekali saat pembuatan, simpan segera. Kami hanya menyimpan hash SHA-256-nya; tidak ada cara untuk memulihkan kunci yang hilang.
Permintaan yang tidak diautentikasi mengembalikan 401 { "error": "not_signed_in" }. Kunci yang tidak valid atau dicabut mengembalikan 401 { "error": "invalid_api_key" }.
Kunci API dibatasi cakupannya untuk pengguna yang membuatnya. Jika pengguna tersebut adalah anggota tim, endpoint di bawah beroperasi pada kode tim secara otomatis (konteks tim saat ini disimpan di akun pengguna dan dikelola via dashboard).
Batas rate
Diterapkan per kunci API. Setiap respons membawa X-RateLimit-Limit, X-RateLimit-Remaining, dan X-RateLimit-Reset (detik unix saat jendela bergulir).
| Paket | Batas | Jendela |
|---|---|---|
| Business | 1.000 permintaan / hari | Hari UTC |
| Team | 10.000 permintaan / hari | Hari UTC |
| Agency | 50.000 permintaan / hari | Hari UTC |
| Solo | (403 insufficient_plan) | , |
Permintaan yang melebihi anggaran mengembalikan 429 { "error": "rate_limited", "window": "day", "retry_at": 1234567890 } dengan header Retry-After dalam detik.
Pemindaian tidak dibatasi rate, jalur redirect (aqr.net/{shortcode}) tidak memiliki autentikasi dan tidak ada anggaran per pemindaian. Setiap paket memiliki batas pemindaian bulanan yang eksplisit (100 ribu / 1 juta / 10 juta / 30 juta). Melampaui batas dan redirect tetap berfungsi; kami mengirim email agar Anda bisa memutuskan apakah akan upgrade atau melewati lonjakan sesekali. Merencanakan lebih dari ~10 juta pemindaian harian? Email kami untuk mengoordinasikan kapasitas.
Error
Setiap respons error adalah JSON dengan kode error yang dapat dibaca mesin dan, jika relevan, konteks tambahan:
{ "error": "plan_limit", "plan": "business", "limit": 500, "current": 500 }| Status | Kode | Arti |
|---|---|---|
| 400 | validation_error | Field body gagal validasi. Respons menyertakan field + message. |
| 401 | not_signed_in / invalid_api_key | Bearer token hilang, tidak valid, atau dicabut. |
| 402 | plan_limit | Mencapai batas kode aktif+dijeda paket Anda. Respons menyertakan plan, limit, current. |
| 402 | plan_expired | Akun sudah melewati jendela tenggang 90 hari; upgrade untuk melanjutkan. |
| 403 | insufficient_plan | Akses API memerlukan Business atau lebih tinggi. Pengguna Solo akan mendapat ini. |
| 403 | insufficient_role | Peran tim Anda tidak mengizinkan mutasi yang diminta (diperlukan admin+). |
| 404 | not_found | Sumber daya tidak ada, atau tidak terlihat dalam cakupan Anda. |
| 409 | code_not_editable | Kode dalam status grace atau kadaluwarsa; aktifkan kembali untuk mengedit. |
| 429 | rate_limited | Anggaran harian per paket terlampaui. Lihat Batas rate. |
| 500 | internal | Error server yang tidak ditangani, email dukungan jika dapat direproduksi. |
Kode
QR dinamis: shortcode 7-karakter Base58 yang melakukan redirect melalui aqr.net/{shortcode}. Setiap kode membawa QR backup statis yang bisa Anda unduh dari dashboard, jika Anda berhenti membayar, versi statis tetap berfungsi tanpa menyentuh redirect kami.
GET /api/codes
Daftar semua kode dalam cakupan Anda saat ini (personal, atau tim yang sedang Anda gunakan). Mengembalikan array dengan rollup pemindaian 30 hari per 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": "Kampanye Q2", "tags": "q2,cetak",
"status": "active", "scans_30d": 1245,
"created_at": 1713288000, "updated_at": 1713370000 }
],
"plan": "business",
"plan_limit": 500,
"scope": { "type": "user" }
}POST /api/codes
Buat kode dinamis baru. Batas kode aktif+dijeda paket Anda diperiksa sebelum insert. Body minimal:
{ "url": "https://example.com/landing" }Kustomisasi penuh (semuanya opsional):
{ "url": "https://example.com/landing",
"label": "Kampanye musim semi",
"tags": "q2,cetak",
"qr_type": "url",
"style_json": "{...}",
"logo_key": "instagram",
"frame_style": "scan-me",
"frame_text": "SCAN ME" }Mengembalikan 201 + baris yang dibuat termasuk shortcode yang dihasilkan dan short_url yang Anda cetak.
GET /api/codes/{id}
Ambil satu kode. 404 jika tidak dalam cakupan Anda.
PATCH /api/codes/{id}
Perbarui field yang bisa diubah. Penggunaan paling umum: mengubah URL tujuan kode yang sudah dicetak.
$ 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/uuidPerubahan disebarkan ke redirect dalam beberapa detik. Nilai status yang valid untuk PATCH: "active", "paused". Untuk menghapus, gunakan DELETE.
DELETE /api/codes/{id}
Soft-delete. Bertransisi ke status=grace dengan grace_until = sekarang + 90 hari. Redirect tetap berfungsi selama jendela grace penuh, ini adalah janji harga tanpa lock-in yang diwujudkan. Setelah 90 hari kode menjadi expired dan redirect mengembalikan 410 Gone.
POST /api/codes/import
Buat massal dari payload array (juga digunakan oleh alur "Simpan ke Pro" di qr.abundera.ai). Menerima payload kode tunggal atau array. Batas paket diperiksa sekali sebelum batch.
Analitik
GET /api/codes/{id}/analytics
Parameter query:
range=7d|30d|90d|1y|3y, dibatasi oleh retensi paket Anda (Solo 1 tahun, Business 2 tahun, Team/Agency 3 tahun).granularity=day|hour, per jam hanya untuk Team dan Agency; jendela maksimal 7 hari untuk per jam.
{
"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 }
]
}Negara dengan kurang dari 5 pemindaian dalam jendela dilipat ke "Other" untuk privasi (lihat Model privasi).
Kunci API
Buat dan cabut kunci dari halaman dashboard /account/keys. Manajemen mandiri terprogram hanya baca via API, Anda bisa mendaftar kunci dan mencabutnya, tetapi membuat kunci baru memerlukan dashboard (masalah ayam-dan-telur: Anda butuh kunci untuk membuat kunci).
GET /api/keys
Daftar kunci API Anda. Tidak pernah mengembalikan token mentah, hanya metadata.
{
"keys": [
{ "id": "uuid", "label": "Server produksi",
"created_at": 1713288000, "last_used_at": 1713370000 }
],
"allowed": true,
"plan": "business"
}DELETE /api/keys/{id}
Cabut. Kunci langsung berhenti berfungsi; setiap permintaan yang membawanya mengembalikan 401 invalid_api_key setelah itu.
Ekspor data
GET /api/user/export
Unduh ZIP yang berisi dataset lengkap Anda, codes.csv (setiap kode, termasuk grace + kadaluwarsa), scans.csv (rollup harian teragregasi), dan README.txt yang menjelaskan formatnya. Arsip diterbitkan sebagai application/zip; arahkan ke file:
$ curl -H "Authorization: Bearer abnd_qrpro_..." -o abundera-qr-export.zip https://pro.qr.abundera.ai/api/user/exportImpor kembali di mana saja. Ini adalah jaminan format portabel, tidak ada lock-in vendor yang mungkin jika Anda memiliki data Anda.
Model privasi
Agregat pemindaian adalah keseluruhan cerita privasi. Yang kami simpan per pemindaian pada jalur redirect:
code_id, kode Anda mana yang dipindaiday_bucket, tanggal UTC (YYYY-MM-DD). Tidak ada presisi sub-hari pada agregat yang dikembalikan kepada Anda.country, ISO-3166-1 alpha-2 dari headerCF-IPCountryCloudflare. Tidak ada kota, tidak ada wilayah, tidak ada pencarian geo-IP.device_type,mobile/tablet/desktop/unknown, diklasifikasikan dari regex User-Agent singkat. String UA mentah dibuang saat klasifikasi.scan_count, penghitung agregat, di-upsert pada setiap hit.
Yang tidak kami simpan: alamat IP (di-hash atau tidak), string User-Agent mentah, geo tingkat kota, timestamp sub-hari, referer, cookie, piksel retargeting, atau vektor identifikasi individu apa pun. Ambang batas 5 pemindaian menekan re-identifikasi agregat kecil.
Tier Team dan Agency juga menulis agregat per jam paralel dengan hour_bucket (YYYY-MM-DD-HH UTC). Model privasi yang sama, tidak ada timestamp lebih halus dari per jam, ambang batas yang sama, ketiadaan data pemindai individu yang sama.
Baca cerita lengkap: /manifesto/ dan /no-lock-in/ di situs free-tool.