Qravio
QR code API for campaigns

A tracked code for every placement in a campaign

One code for the whole campaign tells you it worked. One code per placement tells you where. Generate them from your campaign tooling, each with its own UTM tags and live dates.

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": "Diwali poster Mumbai",
        "type": "website",
        "category": "dynamic",
        "content": {
          "url": "https://example.com/diwali"
        },
        "destinations": [
          {
            "target_url": "https://example.com/diwali"
          }
        ],
        "client_ref": "diwali26-poster-mumbai",
        "utm": {
          "source": "poster",
          "medium": "offline",
          "campaign": "diwali26",
          "content": "mumbai"
        },
        "start_at": "2026-10-20T00:00:00Z",
        "end_at": "2026-11-10T23:59:00Z"
      },
      {
        "name": "Diwali poster Pune",
        "type": "website",
        "category": "dynamic",
        "content": {
          "url": "https://example.com/diwali"
        },
        "destinations": [
          {
            "target_url": "https://example.com/diwali"
          }
        ],
        "client_ref": "diwali26-poster-pune",
        "utm": {
          "source": "poster",
          "medium": "offline",
          "campaign": "diwali26",
          "content": "pune"
        },
        "start_at": "2026-10-20T00:00:00Z",
        "end_at": "2026-11-10T23:59:00Z"
      }
    ]
  }'

How the integration works

Your campaign tool or a script creates one code per placement, store or print run with the placement as the client_ref and utm fields set. start_at and end_at line the codes up with the flight dates.

  1. 1Create an API key under Developers.
  2. 2Send one item per placement to POST /qrcodes/bulk, each with utm fields and the flight dates.
  3. 3Hand the preview_url SVGs to the print or design team.
  4. 4Read per-code analytics, or let UTM tags carry the visits into your web analytics.

What you get

UTM on the redirect

utm source, medium, campaign, term and content are appended when the code redirects, so visits land in your analytics correctly tagged.

Flight dates

start_at and end_at keep a code dark before launch and after the campaign ends.

Placement-level results

Every code has its own scan analytics by day, device and country.

Milestone alerts

On Agency, a scan.milestone webhook fires when a code crosses a scan threshold.

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.

Campaigns API FAQ

Do UTM tags work on every QR type?

They apply to codes that redirect to a URL, such as website codes. Page-type codes host their own page, so there is no onward URL to tag.

Can I change a placement after printing?

Yes. PATCH the destination or the UTM fields; the printed code does not change.

How do I compare placements?

Each code has its own analytics endpoint, and folders or tags let you group a campaign for the dashboard view.

Start generating codes

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