Developers

API reference

Manage QR codes, links, leads and products, and read scan events. Authenticate with `Authorization: Bearer qriva_…`. Keys are created by workspace admins under Integrations → API and can be limited to specific resources. Every response carries `X-Qriva-Api-Version`.

Base URL https://qr-iva.com/api/v1Version 2026-09-13OpenAPI 3.1 JSON18 endpoints

Authentication & limits

  • Send Authorization: Bearer qriva_…. Admins create keys under Integrations → API and can limit a key to resources, e.g. contacts:read.
  • 600 (Pro), 3,000 (Company) or 20,000 (Enterprise) requests per hour per key (429 when exceeded).
  • Lists take limit (1–200) and offset, and return total.
  • Errors look like {"error":{"code","message"}}.
  • Writes to leads accept Idempotency-Key; a repeat within 24 h returns the first response.

Webhooks

Signed POSTs to your endpoint. Headers: X-Qriva-Event, X-Qriva-Delivery (same on every retry), X-Qriva-Timestamp, X-Qriva-Signature = hex HMAC-SHA256 of `${timestamp}.${raw body}` with your endpoint secret; during a secret rotation also X-Qriva-Signature-Previous. Respond 2xx within 8 seconds. Failures are retried 6 times over about 21 hours.

Events: scan.createdlead.capturedlead.status_changedlead.assignedlead.tag_addedautomation.actioncode.createdcode.updatedalert.raisedproduct.scanned

Codes

GET/codesscope codes:read

List QR codes

ParameterInDescription
statusqueryactive | paused | archived
tagqueryOnly codes with this tag
qqueryName contains
limitqueryinteger
offsetqueryinteger

Responses: 200 Codes, newest first401 Missing or invalid key.403 The key lacks the scope this call needs.429 Rate limit: 600 requests per hour per key.

cURL

curl -X GET "https://qr-iva.com/api/v1/codes" \
  -H "Authorization: Bearer $QRIVA_KEY"

POST/codesscope codes:write

Create a dynamic QR code

Body fieldTypeNotes
name *string
destination *string, uri
slugstring
tagsarray

Responses: 201 Created401 Missing or invalid key.403 The key lacks the scope this call needs.422 The body failed validation; the message says which field.429 Rate limit: 600 requests per hour per key.

cURL

curl -X POST "https://qr-iva.com/api/v1/codes" \
  -H "Authorization: Bearer $QRIVA_KEY" \
  -H "Content-Type: application/json" -d '{…}'

GET/codes/{id}scope codes:read

Get a QR code

ParameterInDescription
id *pathstring, uuid

Responses: 200 The code401 Missing or invalid key.403 The key lacks the scope this call needs.404 Not found in this workspace.

cURL

curl -X GET "https://qr-iva.com/api/v1/codes/ID" \
  -H "Authorization: Bearer $QRIVA_KEY"

PATCH/codes/{id}scope codes:write

Repoint or rename a code, pause or archive it

ParameterInDescription
id *pathstring, uuid
Body fieldTypeNotes
namestring
destinationstring, uri
statusactive | paused | archived
tagsarray

Responses: 200 Updated401 Missing or invalid key.403 The key lacks the scope this call needs.404 Not found in this workspace.422 The body failed validation; the message says which field.

cURL

curl -X PATCH "https://qr-iva.com/api/v1/codes/ID" \
  -H "Authorization: Bearer $QRIVA_KEY" \
  -H "Content-Type: application/json" -d '{…}'

DELETE/codes/{id}scope codes:write

Archive a code (printed codes keep resolving to a holding page)

ParameterInDescription
id *pathstring, uuid

Responses: 200 Archived401 Missing or invalid key.403 The key lacks the scope this call needs.404 Not found in this workspace.

cURL

curl -X DELETE "https://qr-iva.com/api/v1/codes/ID" \
  -H "Authorization: Bearer $QRIVA_KEY"

GET/codes/{id}/imagescope codes:read

Download the artwork

ParameterInDescription
id *pathstring, uuid
formatquerysvg | png | jpg | pdf

Responses: 200 The image401 Missing or invalid key.403 The key lacks the scope this call needs.404 Not found in this workspace.

cURL

curl -X GET "https://qr-iva.com/api/v1/codes/ID/image" \
  -H "Authorization: Bearer $QRIVA_KEY"

Links

POST/linksscope links:write

Create a short link

Body fieldTypeNotes
name *string
destination *string, urihttp(s) URL; screened against threat lists before it is saved
statusactive | paused | archived
slugstringCustom back-half, 3–32 characters
tagsarray
utmobject
starts_atstring, date-time
expires_atstring, date-time
expired_urlstring, uri
scan_limitinteger | null
scan_limit_uniqueboolean
limit_urlstring, uri
safe_previewboolean
passwordstring | null

Responses: 201 Created401 Missing or invalid key.403 The key lacks the scope this call needs.422 The body failed validation; the message says which field.429 Rate limit: 600 requests per hour per key.

cURL

curl -X POST "https://qr-iva.com/api/v1/links" \
  -H "Authorization: Bearer $QRIVA_KEY" \
  -H "Content-Type: application/json" -d '{…}'

Scans

GET/scansscope scans:read

Scan and page events, oldest first

ParameterInDescription
code_idqueryFilter by code
link_idqueryFilter by link
product_idqueryFilter by product
countryqueryISO country code
sourcequeryqr | link | page | product
fromqueryISO date-time, inclusive
toqueryISO date-time, inclusive
limitqueryinteger
offsetqueryinteger

Responses: 200 Events401 Missing or invalid key.403 The key lacks the scope this call needs.429 Rate limit: 600 requests per hour per key.

cURL

curl -X GET "https://qr-iva.com/api/v1/scans" \
  -H "Authorization: Bearer $QRIVA_KEY"

Leads

GET/contactsscope contacts:read

List leads

ParameterInDescription
form_idqueryOnly responses to this form
sincequeryCreated at or after (ISO date-time)
statusquerynew | contacted | qualified | won | lost | spam
tagqueryOnly leads with this tag
emailqueryExact e-mail (case-insensitive)
limitqueryinteger
offsetqueryinteger

Responses: 200 Leads, newest first; merged duplicates are left out401 Missing or invalid key.403 The key lacks the scope this call needs.429 Rate limit: 600 requests per hour per key.

cURL

curl -X GET "https://qr-iva.com/api/v1/contacts" \
  -H "Authorization: Bearer $QRIVA_KEY"

POST/contactsscope contacts:write

Add a lead

A lead with the same e-mail or phone as an existing one updates that lead (fills empty details, adds tags) and returns 200 — unless `on_duplicate` is `create`. New leads (201) trigger automations. Send `Idempotency-Key` to make retries safe.

ParameterInDescription
Idempotency-KeyheaderRepeats within 24 hours return the first response
Body fieldTypeNotes
namestring
emailstring, email
phonestring
companystring
countrystringTwo-letter code
citystring
dataobject
tagsarray
statusnew | contacted | qualified | won | lost | spam
consentboolean
consent_textstringRequired when consent is true: what the person agreed to, where and when
on_duplicatemerge | create

Responses: 200 Existing lead updated201 Created401 Missing or invalid key.403 The key lacks the scope this call needs.409 Idempotency-Key reused with a different body.422 The body failed validation; the message says which field.429 Rate limit: 600 requests per hour per key.

cURL

curl -X POST "https://qr-iva.com/api/v1/contacts" \
  -H "Authorization: Bearer $QRIVA_KEY" \
  -H "Content-Type: application/json" -d '{…}'

GET/contacts/{id}scope contacts:read

Get a lead

ParameterInDescription
id *pathstring, uuid

Responses: 200 The lead301 Merged into another lead; `merged_into` gives its id401 Missing or invalid key.403 The key lacks the scope this call needs.404 Not found in this workspace.

cURL

curl -X GET "https://qr-iva.com/api/v1/contacts/ID" \
  -H "Authorization: Bearer $QRIVA_KEY"

PATCH/contacts/{id}scope contacts:write

Update a lead's workflow

Changes are recorded in the lead's history and fire automations (status changed, assigned, tag added).

ParameterInDescription
id *pathstring, uuid
Body fieldTypeNotes
statusnew | contacted | qualified | won | lost | spam
owner_emailstring | null, email
follow_up_atstring | null, date-time
add_tagsarray
remove_tagsarray
notestring

Responses: 200 Updated401 Missing or invalid key.403 The key lacks the scope this call needs.404 Not found in this workspace.422 The body failed validation; the message says which field.

cURL

curl -X PATCH "https://qr-iva.com/api/v1/contacts/ID" \
  -H "Authorization: Bearer $QRIVA_KEY" \
  -H "Content-Type: application/json" -d '{…}'

Products

GET/productsscope products:read

List products

ParameterInDescription
gtinqueryExact GTIN
limitqueryinteger
offsetqueryinteger

Responses: 200 Products401 Missing or invalid key.403 The key lacks the scope this call needs.429 Rate limit: 600 requests per hour per key.

cURL

curl -X GET "https://qr-iva.com/api/v1/products" \
  -H "Authorization: Bearer $QRIVA_KEY"

POST/productsscope products:write

Create a product (GS1 Digital Link)

Body fieldTypeNotes
gtin *stringGTIN-8/12/13/14 with a valid check digit
name *string
brandstring
batchstring
serialstring

Responses: 201 Created401 Missing or invalid key.403 The key lacks the scope this call needs.422 The body failed validation; the message says which field.429 Rate limit: 600 requests per hour per key.

cURL

curl -X POST "https://qr-iva.com/api/v1/products" \
  -H "Authorization: Bearer $QRIVA_KEY" \
  -H "Content-Type: application/json" -d '{…}'