Abundera QR Pro API
เอกสารอ้างอิง REST API สำหรับ pro.qr.abundera.ai สร้าง แก้ไข และวิเคราะห์ QR code แบบไดนามิกผ่านโปรแกรม ทุกอย่างเป็น JSON ผ่าน HTTPS และยืนยันตัวตนด้วย bearer token
/docs/openapi.json, นำเข้าใน Postman, Insomnia หรือ client ที่รองรับ OpenAPI 3.1 ครอบคลุม 36 endpoint สำหรับลูกค้าใน Codes, Analytics, Groups, Teams, Webhooks และ User โดยไม่รวม endpoint ของ Admin และ Stripe-webhook (สำหรับบริการถึงบริการเท่านั้น)บทนำ
Abundera QR Pro API ช่วยให้คุณสร้าง แก้ไข และวิเคราะห์ QR code แบบไดนามิกผ่านโปรแกรม ทุกอย่างที่นักพัฒนาต้องการทำอัตโนมัติจาก dashboard การจัดการทีม การเรียกเก็บเงิน และขั้นตอนบัญชีอยู่ใน UI ของ dashboard; API นี้จำกัดเฉพาะการดำเนินการ code ระดับนักพัฒนา
Base URL: https://pro.qr.abundera.ai/api
รูปแบบคำขอ: JSON (Content-Type: application/json) สำหรับ POST / PATCH / DELETE
รูปแบบการตอบกลับ: JSON (application/json; charset=utf-8).
ความพร้อมใช้งาน: การเข้าถึง API เป็นคุณสมบัติของ Business ขึ้นไป แผน Solo ใช้ dashboard ได้แต่ไม่สามารถเข้าถึง API ได้
การยืนยันตัวตน
ทุกคำขอต้องแนบ API key เป็น bearer token:
Authorization: Bearer abnd_qrpro_...สร้างและเพิกถอน key ได้ที่ /account/keys (แผน Business, Team หรือ Agency) โทเค็น abnd_qrpro_... ดิบแสดงเพียงครั้งเดียวเมื่อสร้าง โปรดเก็บทันที เราจัดเก็บเฉพาะ SHA-256 hash ของมัน และไม่มีวิธีกู้คืน key ที่สูญหาย
คำขอที่ไม่ผ่านการยืนยันตัวตนจะคืนค่า 401 { "error": "not_signed_in" } คำขอที่ใช้ key ไม่ถูกต้องหรือถูกเพิกถอนจะคืนค่า 401 { "error": "invalid_api_key" }.
API key ถูกจำกัดขอบเขตไว้กับผู้ใช้ที่สร้างมัน หากผู้ใช้นั้นเป็นสมาชิกของทีม endpoint ด้านล่างจะดำเนินการกับ code ของทีมโดยอัตโนมัติ (บริบททีมปัจจุบันจัดเก็บในบัญชีผู้ใช้และจัดการผ่าน dashboard)
อัตราจำกัด
บังคับใช้ต่อ API key ทุกการตอบกลับมี X-RateLimit-Limit, X-RateLimit-Remaining, and X-RateLimit-Reset (unix seconds เมื่อหน้าต่างรีเซ็ต)
| แผน | จำกัด | หน้าต่าง |
|---|---|---|
| Business | 1,000 คำขอ / วัน | UTC วัน |
| Team | 10,000 คำขอ / วัน | UTC วัน |
| Agency | 50,000 คำขอ / วัน | UTC วัน |
| Solo | (403 insufficient_plan) | , |
คำขอที่เกินงบประมาณจะคืนค่า 429 { "error": "rate_limited", "window": "day", "retry_at": 1234567890 } พร้อม header Retry-After เป็นวินาที
การสแกนไม่มีอัตราจำกัด, เส้นทาง redirect หลัก (aqr.net/{shortcode}) ไม่ต้องยืนยันตัวตนและไม่มีงบประมาณต่อการสแกน แต่ละแผนมีจำนวนสแกนต่อเดือนที่กำหนดไว้ชัดเจน (100K / 1M / 10M / 30M) หากเกินจำนวน redirect ยังคงทำงาน เราจะส่งอีเมลให้คุณตัดสินใจว่าจะอัปเกรดหรือรอให้ผ่านช่วงพีคชั่วคราว หากวางแผนเกิน ~10M การสแกนต่อวัน ติดต่อเรา เพื่อประสานงานด้านความจุ
ข้อผิดพลาด
ทุกการตอบกลับข้อผิดพลาดเป็น JSON พร้อมรหัส error ที่อ่านได้ด้วยเครื่องและข้อมูลเพิ่มเติมตามกรณี:
{ "error": "plan_limit", "plan": "business", "limit": 500, "current": 500 }| สถานะ | รหัส | ความหมาย |
|---|---|---|
| 400 | validation_error | ฟิลด์ใน body ผ่านการตรวจสอบไม่ผ่าน การตอบกลับมี field + message |
| 401 | not_signed_in / invalid_api_key | bearer token หายไป ไม่ถูกต้อง หรือถูกเพิกถอน |
| 402 | plan_limit | ถึงจำนวน code สูงสุดที่ใช้งาน+หยุดชั่วคราวของแผนแล้ว การตอบกลับมี plan, limit, current |
| 402 | plan_expired | บัญชีเกินระยะผ่อนผัน 90 วัน อัปเกรดเพื่อดำเนินการต่อ |
| 403 | insufficient_plan | การเข้าถึง API ต้องการ Business ขึ้นไป ผู้ใช้ Solo จะพบข้อผิดพลาดนี้ |
| 403 | insufficient_role | บทบาทในทีมของคุณไม่อนุญาตให้แก้ไขที่ร้องขอ (ต้องการ admin ขึ้นไป) |
| 404 | not_found | ทรัพยากรไม่มีอยู่หรือไม่ปรากฏในขอบเขตของคุณ |
| 409 | code_not_editable | code อยู่ในสถานะผ่อนผันหรือหมดอายุ เปิดใช้งานอีกครั้งเพื่อแก้ไข |
| 429 | rate_limited | Per-plan daily budget exceeded. See อัตราจำกัด. |
| 500 | internal | ข้อผิดพลาดเซิร์ฟเวอร์ที่ไม่ได้จัดการ, ส่งอีเมลฝ่ายสนับสนุนหากเกิดซ้ำ |
Codes
QR code แบบไดนามิก: shortcode Base58 ขนาด 7 ตัวอักษรที่เปลี่ยนเส้นทางผ่าน aqr.net/{shortcode} ทุก code มี QR สำรองแบบสแตติกที่ดาวน์โหลดได้จาก dashboard หากคุณหยุดชำระเงิน เวอร์ชันสแตติกยังคงใช้งานได้โดยไม่ผ่าน redirect ของเรา
GET /api/codes
แสดงรายการ code ทั้งหมดในขอบเขตปัจจุบันของคุณ (ส่วนตัว หรือทีมที่กำลังใช้งานอยู่) คืนค่าเป็น array พร้อมสรุปการสแกน 30 วันต่อ code
$ 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
สร้าง code แบบไดนามิกใหม่ จำนวน code สูงสุดที่ใช้งาน+หยุดชั่วคราวของแผนจะถูกตรวจสอบก่อนแทรก body ขั้นต่ำ:
{ "url": "https://example.com/landing" }ปรับแต่งเต็มรูปแบบ (ทั้งหมดไม่บังคับ):
{ "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" }คืนค่า 201 + แถวที่สร้างพร้อม shortcode ที่สร้างขึ้นและ short_url สำหรับพิมพ์
GET /api/codes/{id}
ดึง code เดียว คืนค่า 404 หากไม่อยู่ในขอบเขตของคุณ
PATCH /api/codes/{id}
อัปเดตฟิลด์ที่แก้ไขได้ การใช้งานที่พบบ่อยที่สุด: เปลี่ยน URL ปลายทางของ code ที่พิมพ์แล้ว
$ 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การเปลี่ยนแปลงจะมีผลกับ redirect ภายในไม่กี่วินาที ค่า status ที่ใช้ได้สำหรับ PATCH: "active", "paused" หากต้องการลบ ใช้ DELETE
DELETE /api/codes/{id}
ลบแบบ soft-delete ย้ายไปเป็น status=grace โดย grace_until = now + 90 วัน redirect ยังคงทำงานตลอดระยะผ่อนผัน นี่คือคำสัญญาราคาแบบไม่ล็อกผู้ใช้ที่เป็นรูปธรรม หลังจาก 90 วัน code จะกลายเป็น expired และ redirect จะคืนค่า 410 Gone
POST /api/codes/import
สร้างจำนวนมากจาก array payload (ใช้ในขั้นตอน "บันทึกไปยัง Pro" บน qr.abundera.ai ด้วย) รับ payload ของ code เดียวหรือ array ตรวจสอบขีดจำกัดแผนครั้งเดียวก่อนประมวลผลชุด
Analytics
GET /api/codes/{id}/analytics
พารามิเตอร์คำขอ:
range=7d|30d|90d|1y|3y, จำกัดตามการเก็บข้อมูลของแผน (Solo 1 ปี, Business 2 ปี, Team/Agency 3 ปี)granularity=day|hour, รายชั่วโมงสำหรับ Team และ Agency เท่านั้น; หน้าต่างสูงสุด 7 วันสำหรับรายชั่วโมง
{
"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 โมเดลความเป็นส่วนตัว).
API keys
สร้างและเพิกถอน key จากหน้า dashboard /account/keys การจัดการตนเองผ่านโปรแกรมผ่าน API อยู่ในโหมดอ่านอย่างเดียว คุณสามารถแสดงรายการและเพิกถอน key ได้ แต่การสร้าง key ใหม่ต้องใช้ dashboard (ปัญหาไก่กับไข่: ต้องใช้ key เพื่อสร้าง key)
GET /api/keys
แสดงรายการ API key ของคุณ ไม่คืนค่าโทเค็นดิบ, แค่ metadata เท่านั้น
{
"keys": [
{ "id": "uuid", "label": "Production server",
"created_at": 1713288000, "last_used_at": 1713370000 }
],
"allowed": true,
"plan": "business"
}DELETE /api/keys/{id}
เพิกถอน key หยุดทำงานทันที คำขอที่ใช้ key นี้จะคืนค่า 401 invalid_api_key ในภายหลัง
ส่งออกข้อมูล
GET /api/user/export
ดาวน์โหลด ZIP ที่มีชุดข้อมูลทั้งหมดของคุณ, codes.csv (ทุก code รวมถึงผ่อนผัน + หมดอายุ), scans.csv (สรุปรายวันรวม) และ README.txt ที่อธิบายรูปแบบ ไฟล์บีบอัดเป็น application/zip; ส่งต่อไปยังไฟล์:
$ curl -H "Authorization: Bearer abnd_qrpro_..." \
-o abundera-qr-export.zip \
https://pro.qr.abundera.ai/api/user/exportนำเข้าได้ทุกที่ นี่คือการรับประกันรูปแบบพกพา, ไม่มีการล็อกผู้ใช้กับผู้ให้บริการหากคุณเป็นเจ้าของข้อมูล
โมเดลความเป็นส่วนตัว
ข้อมูลสรุปการสแกนคือภาพรวมความเป็นส่วนตัวทั้งหมด สิ่งที่เราจัดเก็บต่อการสแกนในเส้นทาง redirect หลัก:
code_id, code ใดของคุณถูกสแกนday_bucket, วันที่ UTC (YYYY-MM-DD) ไม่มีความละเอียดย่อยกว่าวันในข้อมูลสรุปที่คืนให้คุณcountry, ISO-3166-1 alpha-2 จาก headerCF-IPCountryของ Cloudflare ไม่มีข้อมูลเมือง ภูมิภาค หรือการค้นหา geo-IPdevice_type,mobile/tablet/desktop/unknownจำแนกด้วย User-Agent regex สั้น สตริง UA ดิบถูกทิ้งทันทีหลังจำแนกscan_count, ตัวนับสรุป อัปเดตทุกครั้งที่มีการสแกน
สิ่งที่เราไม่จัดเก็บ: ที่อยู่ IP (ทั้งแบบ hash และอื่น ๆ), สตริง User-Agent ดิบ, ข้อมูลภูมิศาสตร์ระดับเมือง, timestamp ย่อยกว่าวัน, referer, cookie, retargeting pixel หรือข้อมูลระบุตัวตนใด ๆ ระดับต่ำสุดที่ 5 การสแกนป้องกันการระบุตัวตนจากข้อมูลกลุ่มเล็ก
แผน Team และ Agency จะเขียนข้อมูลสรุปรายชั่วโมงแบบขนานพร้อม hour_bucket (YYYY-MM-DD-HH UTC) ด้วย โมเดลความเป็นส่วนตัวเดิม, ไม่มี timestamp ละเอียดกว่าชั่วโมง ระดับต่ำสุดเดิม ไม่มีข้อมูลผู้สแกนรายบุคคล
อ่านรายละเอียดเพิ่มเติม: /manifesto/ และ /no-lock-in/ บนเว็บไซต์ Free Tool