Abundera QR Pro/ Documentation

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.

Terakhir diperbarui: 2026-04-18 · support@abundera.ai · Spesifikasi OpenAPI 3.1 (JSON) · SDK Resmi (TS / Python / Go)

Spesifikasi yang dapat dibaca mesin:/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).

PaketBatasJendela
Business1.000 permintaan / hariHari UTC
Team10.000 permintaan / hariHari UTC
Agency50.000 permintaan / hariHari 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 }
StatusKodeArti
400validation_errorField body gagal validasi. Respons menyertakan field + message.
401not_signed_in / invalid_api_keyBearer token hilang, tidak valid, atau dicabut.
402plan_limitMencapai batas kode aktif+dijeda paket Anda. Respons menyertakan plan, limit, current.
402plan_expiredAkun sudah melewati jendela tenggang 90 hari; upgrade untuk melanjutkan.
403insufficient_planAkses API memerlukan Business atau lebih tinggi. Pengguna Solo akan mendapat ini.
403insufficient_rolePeran tim Anda tidak mengizinkan mutasi yang diminta (diperlukan admin+).
404not_foundSumber daya tidak ada, atau tidak terlihat dalam cakupan Anda.
409code_not_editableKode dalam status grace atau kadaluwarsa; aktifkan kembali untuk mengedit.
429rate_limitedAnggaran harian per paket terlampaui. Lihat Batas rate.
500internalError 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/uuid

Perubahan 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/export

Impor 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 dipindai
  • day_bucket, tanggal UTC (YYYY-MM-DD). Tidak ada presisi sub-hari pada agregat yang dikembalikan kepada Anda.
  • country, ISO-3166-1 alpha-2 dari header CF-IPCountry Cloudflare. 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.