On this page
Getting started
Core resources
Endpoints
Reference
Introduction
The Qravio REST API lets you create, manage, and analyze QR codes programmatically. It’s available on the Pro and Agency plans. All requests are made over HTTPS and authenticated with an API key. Responses are JSON.
https://api.qravio.app/api/public/v1Authentication
Authenticate by sending your API key as a bearer token in the Authorization header (or the X-API-Key header). Create and manage keys in your dashboard under Developers. Keep keys secret — they carry full access to your workspace’s QR codes.
curl https://api.qravio.app/api/public/v1/qrcodes \
-H "Authorization: Bearer qr_live_your_api_key"
# Alternatively, use the X-API-Key header:
curl https://api.qravio.app/api/public/v1/qrcodes \
-H "X-API-Key: qr_live_your_api_key"Rate limits
Each workspace has a monthly call quota based on its plan. Every response includes rate-limit headers. Exceeding the quota returns 429 with a Retry-After header.
- Free / StarterNo API access
- Pro3,000 calls / month
- Agency25,000 calls / month
X-RateLimit-Limit: 25000
X-RateLimit-Remaining: 24871
X-RateLimit-Reset: 1781913600X-RateLimit-LimitintegerYour monthly call allowance.
X-RateLimit-RemainingintegerCalls remaining in the current period.
X-RateLimit-ResetintegerUnix epoch (seconds) when the quota resets.
Retry-AfterintegerOn 429 only — seconds until the quota resets.
Errors
Qravio uses standard HTTP status codes. Errors return a JSON body with a single detail message.
401UnauthorizedMissing, invalid, revoked, or expired API key.
402Payment RequiredYour plan’s QR-code limit (max_qr) is reached.
403ForbiddenWorkspace lacks api_access, or the QR type isn’t in your plan.
404Not FoundThe QR code doesn’t exist in your workspace.
422Unprocessable EntityRequest payload failed validation.
429Too Many RequestsMonthly call quota exceeded. See Retry-After.
503Service UnavailableQuota/usage lookup failed — retry shortly.
{
"detail": "API access requires a Pro or higher plan."
}The QR Code object
idstring (uuid)Unique identifier for the QR code.
workspace_idstring (uuid)The workspace that owns this QR code.
namestringDisplay name.
typestringQR type (e.g. website, vcard, business). See QR types.
categorystring"dynamic" (editable destination) or "static".
short_codestring | null6-char short code used in the scan URL.
statusstring | null"active" or "inactive".
folder_idstring | nullParent folder, if organized into one.
custom_domain_idstring | nullVerified custom domain used for the short link.
ab_enabledbooleanTrue when an A/B test is active (>1 active website destination). Server-computed.
is_password_protectedbooleanTrue when a visitor password gate is active.
destinationsarray<Destination>Routing destinations (see below).
designobject | nullVisual design settings (dots, colors, logo, frame, output).
contentobject | nullType-specific content payload. See QR types.
total_scansintegerAll-time scan count.
created_bystring | nullUser who created the QR code.
created_atstring (ISO 8601) | nullCreation timestamp.
updated_atstring (ISO 8601) | nullLast update timestamp.
Destination object
idstring (uuid)Destination identifier.
target_urlstringThe URL this destination routes to.
weightinteger | nullA/B routing weight 0–100 (default 100).
is_activeboolean | nullWhether this destination is active.
labelstring | nullHuman-readable variant name.
variant_keystring | nullStable variant id (a, b, c…) used for sticky routing & analytics.
rulesobject | nullConditional routing rules (geo, device, time).
{
"id": "9f8b2c1a-1234-4d5e-8f90-abc123def456",
"workspace_id": "11111111-1111-1111-1111-111111111111",
"name": "Spring campaign",
"type": "website",
"category": "dynamic",
"short_code": "Ab3X9z",
"status": "active",
"ab_enabled": false,
"is_password_protected": false,
"destinations": [
{
"id": "22222222-2222-2222-2222-222222222222",
"target_url": "https://example.com/spring",
"weight": 100,
"is_active": true,
"label": "Landing",
"variant_key": "a"
}
],
"content": { "url": "https://example.com/spring" },
"total_scans": 1240,
"created_at": "2026-06-22T10:15:00Z",
"updated_at": "2026-06-22T10:15:00Z"
}The Analytics object
total_scansintegerAll-time total scans.
unique_scansintegerAll-time unique (session-deduplicated) visitors.
scans_todayintegerScans so far in the current UTC day.
wow_changenumberWeek-over-week change as a percentage.
daily_scansarray<{ date, scans }>Per-day series, clamped to your plan’s retention window.
scans_by_deviceobject{ mobile, tablet, desktop, bot } counts.
scans_by_countryobjectCountry code → scan count.
last_scanned_atstring (ISO 8601) | nullTimestamp of the most recent scan.
{
"total_scans": 1240,
"unique_scans": 980,
"scans_today": 42,
"wow_change": 12.5,
"daily_scans": [
{ "date": "2026-06-21", "scans": 58 },
{ "date": "2026-06-22", "scans": 42 }
],
"scans_by_device": { "mobile": 900, "tablet": 60, "desktop": 270, "bot": 10 },
"scans_by_country": { "US": 720, "IN": 310, "GB": 95 },
"last_scanned_at": "2026-06-22T11:02:00Z"
}/qrcodesList QR codes
Returns every QR code in the API key’s workspace, newest first.
curl https://api.qravio.app/api/public/v1/qrcodes \
-H "Authorization: Bearer qr_live_your_api_key"[
{ "id": "9f8b2c1a-…", "name": "Spring campaign", "type": "website", "total_scans": 1240, "…": "…" }
]/qrcodesCreate a QR code
Creates a QR code in your workspace. For dynamic QRs, include at least one destination. The content object shape depends on type — see QR types. Plan limits (max_qr) and allowed dynamic_qr_types are enforced.
Body parameters
namestringRequiredDisplay name.
typestringRequiredQR type (e.g. website, vcard, business).
categorystringRequired"dynamic" or "static".
contentobjectRequiredType-specific payload. See QR types.
destinationsarray<Destination>Required for dynamic QRs — where the code routes.
statusstringDefaults to "active".
folder_idstring (uuid)Organize into a folder.
custom_domain_idstring (uuid)Use a verified custom domain.
designobjectVisual design (dots, colors, logo, frame, output).
page_designobjectLanding-page theme for page-type QRs.
curl -X POST https://api.qravio.app/api/public/v1/qrcodes \
-H "Authorization: Bearer qr_live_your_api_key" \
-H "Content-Type: application/json" \
-d '{
"name": "Spring campaign",
"type": "website",
"category": "dynamic",
"content": { "url": "https://example.com/spring" },
"destinations": [{ "target_url": "https://example.com/spring" }]
}'{ "id": "9f8b2c1a-…", "short_code": "Ab3X9z", "type": "website", "…": "…" }/qrcodes/{id}Retrieve a QR code
Fetches a single QR code by id.
Path parameters
idstring (uuid)RequiredThe QR code id. Must belong to your API key’s workspace.
curl https://api.qravio.app/api/public/v1/qrcodes/9f8b2c1a-1234-4d5e-8f90-abc123def456 \
-H "Authorization: Bearer qr_live_your_api_key"/qrcodes/{id}Update a QR code
Partially updates a QR code. Send only the fields you want to change. Passing destinations replaces all existing destinations.
Path parameters
idstring (uuid)RequiredThe QR code id. Must belong to your API key’s workspace.
Body parameters
namestringNew display name.
statusstring"active" or "inactive".
contentobjectUpdated type-specific content.
destinationsarray<Destination>Replaces all destinations.
designobjectUpdated design.
folder_idstring | nullMove to a folder, or null to remove.
passwordstringEnable a visitor password gate.
remove_passwordbooleanSet true to disable the password gate.
curl -X PATCH https://api.qravio.app/api/public/v1/qrcodes/9f8b2c1a-1234-4d5e-8f90-abc123def456 \
-H "Authorization: Bearer qr_live_your_api_key" \
-H "Content-Type: application/json" \
-d '{ "name": "Summer campaign", "status": "active" }'/qrcodes/{id}Delete a QR code
Permanently deletes a QR code. Printed codes using this short link will stop working.
Path parameters
idstring (uuid)RequiredThe QR code id. Must belong to your API key’s workspace.
curl -X DELETE https://api.qravio.app/api/public/v1/qrcodes/9f8b2c1a-1234-4d5e-8f90-abc123def456 \
-H "Authorization: Bearer qr_live_your_api_key"/qrcodes/{id}/analyticsGet QR analytics
Returns scan analytics for a QR code. The daily series is clamped to your plan’s retention window.
Path parameters
idstring (uuid)RequiredThe QR code id. Must belong to your API key’s workspace.
curl https://api.qravio.app/api/public/v1/qrcodes/9f8b2c1a-1234-4d5e-8f90-abc123def456/analytics \
-H "Authorization: Bearer qr_live_your_api_key"QR types
When creating a QR code, the content object’s shape depends on the type. Each type reads from one field below (* = required). Available dynamic types depend on your plan.
Free
website, vcard_plus
Starter
website, vcard_plus, pdf, list_links, business
Pro / Agency
all 13: website, pdf, images, vcard_plus, video, list_links, mp3, business, social_media, event, coupon, apps, landing_page
website / urlcontent.urlurltextcontent.texttextemailcontent.emailContentemail*, subject, bodysmscontent.smsContentnumber*, message*whatsappcontent.whatsAppContentnumber*, messagewificontent.wifiContentnetwork_name*, encryption*, password, hiddenbitcoincontent.bitcoinContentaddress*, amount*, label, messagepaypalcontent.paypalContentusername*, amount*, notevcard / vcard_pluscontent.vCardContentfirst_name*, last_name*, phone, email, company, …businesscontent.businessContentbusiness_name*, phone, email, address, business_hours, themesocial_mediacontent.socialMediaContentprofileName*, instagram, facebook, twitter, linkedin, youtube, websiteeventcontent.eventContentevent_name, start_date, location, rsvp_url, …couponcontent.couponContenttitle*, discountType, discountValue, code, termsappscontent.appContentappName*, appStoreUrl, playStoreUrllanding_pagecontent.landingPageContenttitle*, subtitle, buttonText, buttonUrl, themepdf / video / mp3content.fileContentfile_id*, file_path*, file_name*, content_type*, size_bytes*imagescontent.imagesContentarray of file objectslist_linkscontent.listOfLinkContentprofile_name*, bio, links[] (id*, title*, url*)Static types (available on all plans): url, text, vcard, email, sms, whatsapp, wifi, bitcoin, paypal.