Qravio
QR code API for certificates

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
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.

  1. 1Create an API key under Developers.
  2. 2When certificates are issued, send them to POST /qrcodes/bulk as static codes, with the certificate ID as client_ref.
  3. 3Render each preview_url SVG onto the certificate PDF.
  4. 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.

PlanAPI callsDynamic QRsWebhooks
Free, StarterNo API accessn/aNo
Pro3,000 a month300Scan, lead, scan limit
Agency25,000 a monthNo capAdds 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.

Start generating codes

Create an account, upgrade to Pro or Agency, and make a key under Developers in your workspace.