A verification QR code on every certificate
A certificate is only as good as the ability to check it. Print a code on each one that opens its verification page, created by the system that issues the certificate.
curl -X POST https://api.qravio.app/api/public/v1/qrcodes/bulk \
-H "Authorization: Bearer $QRAVIO_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"items": [
{
"name": "Certificate CRT-2026-10451",
"type": "url",
"category": "static",
"content": {
"url": "https://example.com/verify/CRT-2026-10451"
},
"client_ref": "crt-2026-10451"
},
{
"name": "Certificate CRT-2026-10452",
"type": "url",
"category": "static",
"content": {
"url": "https://example.com/verify/CRT-2026-10452"
},
"client_ref": "crt-2026-10452"
}
]
}'How the integration works
Your LMS or credential platform calls the API when a certificate is issued, with the certificate ID as the client_ref, and places the preview_url SVG on the document. Verification URLs are usually permanent, so static codes fit: they do not count against your QR allowance and keep working with no dependency on us.
- 1Create an API key under Developers.
- 2When certificates are issued, send them to POST /qrcodes/bulk as static codes, with the certificate ID as client_ref.
- 3Render each preview_url SVG onto the certificate PDF.
- 4Revoking a certificate happens on your verification page, which the code already opens.
What you get
No allowance used
Static codes are not counted against the plan QR limit, so a year of graduates does not need a bigger plan for codes alone.
Works forever
A static code holds the URL in the pattern itself. It keeps working even if you leave Qravio.
Vector output
preview_url returns an SVG, so the code stays sharp at any print size.
Idempotent issuing
Re-running an issuing job with the same client_refs returns the codes already made.
What each plan allows
Every call counts against the monthly quota, and a bulk request counts one call per item. Static codes use calls but not the dynamic QR allowance.
| Plan | API calls | Dynamic QRs | Webhooks |
|---|---|---|---|
| Free, Starter | No API access | n/a | No |
| Pro | 3,000 a month | 300 | Scan, lead, scan limit |
| Agency | 25,000 a month | No cap | Adds scan milestones |
Prices are on the pricing page.
Certificates API FAQ
Why static rather than dynamic?
A verification URL rarely changes, and static codes cost no allowance and never depend on a live service. Choose dynamic only if you want scan analytics or may move the verification site.
Can I revoke a certificate through the code?
With static codes, revocation belongs on your verification page. With dynamic codes you could also pause the code, but the page is the more reliable record.
How many can I issue a month?
One API call each: 3,000 a month on Pro and 25,000 on Agency.
Other things teams build
Packaging
Generate a unique, editable QR code per SKU or production batch from your ERP. Repoint printed boxes after they ship and see scans by country.
Tickets
Issue a unique QR code per ticket from your booking system, stop it working after the event, and pause it when a ticket is refunded.
Restaurant tables
Generate a QR code for every table across every outlet from your POS, and see which tables and outlets get scanned, and when.
Inventory
Tag every asset with a QR code generated from your inventory system. Static codes for permanent labels, dynamic codes when the record can move.
Loyalty
Issue a personal QR code per loyalty member from your CRM, and receive a webhook each time it is scanned.
Campaigns
Generate a tracked QR code for every placement, store or channel in a campaign, with UTM tags and a schedule, from your own tools.
SaaS products
Add editable, tracked QR codes to your own product. Create them on behalf of your customers, organise them per account, and show scan analytics in your UI.
Start generating codes
Create an account, upgrade to Pro or Agency, and make a key under Developers in your workspace.