Abundera QR Pro API
REST API संदर्भ pro.qr.abundera.ai के लिए। प्रोग्रामेटिक रूप से डायनेमिक QR कोड बनाएं, संपादित करें और विश्लेषण करें। सब कुछ bearer token से प्रमाणित HTTPS पर JSON के रूप में।
/docs/openapi.json, Postman, Insomnia, या किसी भी OpenAPI 3.1 क्लाइंट में आयात करें। Codes, Analytics, Groups, Teams, Webhooks और User में 36 customer-facing endpoints शामिल हैं। Admin + Stripe-webhook endpoints जानबूझकर बाहर रखे गए हैं (केवल service-to-service)।परिचय
Abundera QR Pro API आपको प्रोग्रामेटिक रूप से डायनेमिक QR कोड बनाने, संपादित करने और विश्लेषण करने देता है, वह सब जो एक डेवलपर dashboard से ऑटोमेट करना चाहता है। टीम प्रबंधन, बिलिंग और खाता प्रवाह dashboard UI में ही रहते हैं; यह API developer-grade कोड संचालन तक सीमित है।
Base URL: https://pro.qr.abundera.ai/api
Request format: JSON (Content-Type: application/json) POST / PATCH / DELETE पर।
Response format: JSON (application/json; charset=utf-8)।
उपलब्धता: API एक्सेस Business+ फीचर है। Solo प्लान dashboard उपयोग कर सकते हैं लेकिन API नहीं।
प्रमाणीकरण
हर request bearer token के रूप में एक API key ले जाती है:
Authorization: Bearer abnd_qrpro_.../account/keys पर keys बनाएं और रद्द करें (Business, Team, या Agency tier)। raw abnd_qrpro_... token निर्माण के समय केवल एक बार दिखाया जाता है, तुरंत सुरक्षित करें। हम केवल इसका SHA-256 hash संग्रहीत करते हैं; खोई key वापस नहीं मिल सकती।
बिना प्रमाणीकरण के requests 401 { "error": "not_signed_in" } लौटाती हैं। अमान्य या रद्द keys 401 { "error": "invalid_api_key" } लौटाती हैं।
API keys उस उपयोगकर्ता तक सीमित हैं जिसने उन्हें बनाया। यदि वह उपयोगकर्ता किसी टीम का सदस्य है, तो नीचे के endpoints स्वतः टीम के कोड पर काम करते हैं (current-team context उपयोगकर्ता खाते पर संग्रहीत है और dashboard से प्रबंधित होता है)।
दर सीमाएं
प्रति API key लागू। हर response में X-RateLimit-Limit, X-RateLimit-Remaining, और X-RateLimit-Reset (unix सेकंड जब window रीसेट होती है) होते हैं।
| Plan | सीमा | Window |
|---|---|---|
| Business | 1,000 requests / दिन | UTC दिन |
| Team | 10,000 requests / दिन | UTC दिन |
| Agency | 50,000 requests / दिन | UTC दिन |
| Solo | (403 insufficient_plan) | , |
बजट से अधिक requests 429 { "error": "rate_limited", "window": "day", "retry_at": 1234567890 } और सेकंड में Retry-After header के साथ लौटती हैं।
स्कैन rate-limited नहीं हैं, redirect hot path (aqr.net/{shortcode}) में कोई auth और कोई per-scan बजट नहीं है। प्रत्येक plan में स्पष्ट मासिक स्कैन cap है (100k / 1M / 10M / 30M)। Cap पार होने पर redirect फिर भी काम करता है; हम आपको email करते हैं ताकि आप तय करें कि अपग्रेड करना है या एकमुश्त spike झेलना है। ~10M दैनिक स्कैन से अधिक की योजना बना रहे हैं? क्षमता समन्वय के लिए email करें।
त्रुटियां
हर error response JSON है जिसमें machine-readable error code और जहां प्रासंगिक हो, अतिरिक्त संदर्भ होता है:
{ "error": "plan_limit", "plan": "business", "limit": 500, "current": 500 }| Status | Code | अर्थ |
|---|---|---|
| 400 | validation_error | Body field validation में विफल। Response में field + message शामिल हैं। |
| 401 | not_signed_in / invalid_api_key | गुम, अमान्य या रद्द bearer token। |
| 402 | plan_limit | आपके plan की active+paused code cap पर। Response में plan, limit, current शामिल हैं। |
| 402 | plan_expired | खाता 90-दिन की grace window से आगे है; फिर शुरू करने के लिए अपग्रेड करें। |
| 403 | insufficient_plan | API एक्सेस के लिए Business या उच्चतर चाहिए। Solo उपयोगकर्ता यहां पहुंचते हैं। |
| 403 | insufficient_role | आपकी टीम भूमिका अनुरोधित mutation की अनुमति नहीं देती (admin+ आवश्यक)। |
| 404 | not_found | Resource मौजूद नहीं, या आपके scope में दिखाई नहीं देता। |
| 409 | code_not_editable | Code grace या expired status में है; संपादित करने के लिए reactivate करें। |
| 429 | rate_limited | Per-plan दैनिक बजट पार हो गया। देखें दर सीमाएं। |
| 500 | internal | अनहैंडल server error, यदि reproducible हो तो support को email करें। |
कोड
डायनेमिक QR कोड: एक 7-char Base58 shortcode जो aqr.net/{shortcode} के माध्यम से redirect करता है। हर कोड एक static-backup QR के साथ आता है जिसे dashboard से डाउनलोड किया जा सकता है, यदि आप कभी भुगतान बंद करें, तो static version हमारे redirect को छुए बिना काम करता रहता है।
GET /api/codes
आपके current scope (personal, या जिस टीम के अंतर्गत आप काम कर रहे हैं) के सभी कोड सूचीबद्ध करें। प्रति कोड 30-दिन के स्कैन rollup के साथ array लौटाता है।
$ 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
नया डायनेमिक कोड बनाएं। insert से पहले आपके plan की active+paused code cap जांची जाती है। न्यूनतम 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" }Generated shortcode और print योग्य short_url सहित बनाई गई row के साथ 201 लौटाता है।
GET /api/codes/{id}
एकल कोड प्राप्त करें। यदि आपके scope में नहीं है तो 404।
PATCH /api/codes/{id}
कोई भी mutable field अपडेट करें। सबसे सामान्य उपयोग: पहले से प्रिंट हुए कोड का destination 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/uuidबदलाव सेकंडों में redirect में फैल जाते हैं। PATCH के लिए valid status मान: "active", "paused"। हटाने के लिए DELETE का उपयोग करें।
DELETE /api/codes/{id}
Soft-delete। grace_until = now + 90 days के साथ status=grace में जाता है। पूरी grace window के दौरान redirect काम करता रहता है, यह no-lock-in pricing promise का ठोस रूप है। 90 दिनों के बाद कोड expired हो जाता है और redirect 410 Gone लौटाता है।
POST /api/codes/import
Array payload से bulk-create करें (यह qr.abundera.ai पर "Save to Pro" flow द्वारा भी उपयोग किया जाता है)। एकल कोड payload या array स्वीकार करता है। Plan limit batch से पहले एक बार जांची जाती है।
Analytics
GET /api/codes/{id}/analytics
Query params:
range=7d|30d|90d|1y|3y, आपके plan की retention तक सीमित (Solo 1y, Business 2y, Team/Agency 3y)।granularity=day|hour, hourly केवल Team और Agency के लिए; hourly के लिए अधिकतम 7-दिन की window।
{
"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 }
]
}Window में 5 से कम स्कैन वाले देश गोपनीयता के लिए "Other" में मिला दिए जाते हैं (देखें गोपनीयता मॉडल)।
API keys
/account/keys dashboard page से keys बनाएं और रद्द करें। प्रोग्रामेटिक self-management API के माध्यम से केवल read-only है, आप अपनी keys सूचीबद्ध और रद्द कर सकते हैं, लेकिन नई key बनाने के लिए dashboard चाहिए (chicken-and-egg: key बनाने के लिए key चाहिए)।
GET /api/keys
अपनी API keys सूचीबद्ध करें। raw token कभी नहीं लौटाता, केवल metadata।
{
"keys": [
{ "id": "uuid", "label": "Production server",
"created_at": 1713288000, "last_used_at": 1713370000 }
],
"allowed": true,
"plan": "business"
}DELETE /api/keys/{id}
रद्द करें। Key तुरंत काम करना बंद कर देती है; इसके बाद इसे ले जाने वाली कोई भी request 401 invalid_api_key लौटाती है।
डेटा निर्यात
GET /api/user/export
अपना पूरा डेटासेट, codes.csv (हर कोड, grace + expired सहित), scans.csv (एकत्रित दैनिक rollup), और format समझाने वाला README.txt, ZIP के रूप में डाउनलोड करें। Archive application/zip के रूप में निकलता है; इसे file में pipe करें:
$ curl -H "Authorization: Bearer abnd_qrpro_..." -o abundera-qr-export.zip https://pro.qr.abundera.ai/api/user/exportकहीं भी re-import करें। यह portable-format guarantee है, यदि आप अपना डेटा खुद रखते हैं तो कोई vendor lock-in संभव नहीं।
गोपनीयता मॉडल
स्कैन aggregate ही पूरी गोपनीयता कहानी है। redirect hot path पर प्रति स्कैन हम क्या संग्रहीत करते हैं:
code_id, आपके कौन से कोड को स्कैन किया गयाday_bucket, UTC तारीख (YYYY-MM-DD)। आपको लौटाए गए aggregate में sub-day precision नहीं।country, Cloudflare केCF-IPCountryheader से ISO-3166-1 alpha-2। कोई शहर नहीं, कोई region नहीं, कोई geo-IP lookup नहीं।device_type, short User-Agent regex से वर्गीकृतmobile/tablet/desktop/unknown। raw UA string वर्गीकरण के समय त्याग दी जाती है।scan_count, aggregate counter, हर hit पर upserted।
हम नहीं संग्रहीत करते: IP addresses (hashed या अन्यथा), raw User-Agent strings, city-level geo, sub-day timestamps, referer, cookies, retargeting pixels, या कोई भी individual-identifying vector। 5 का noise floor छोटे-aggregate re-identification को दबाता है।
Team और Agency tiers अतिरिक्त रूप से hour_bucket (YYYY-MM-DD-HH UTC) के साथ parallel hourly aggregate लिखते हैं। वही गोपनीयता मॉडल, hour से बारीक कोई timestamps नहीं, वही noise floor, individual-scanner data की वही अनुपस्थिति।
पूरी कहानी पढ़ें: free-tool site पर /manifesto/ और /no-lock-in/।