QRinio

QRinio API v1

API documentation

Manage dynamic QR resources and short links from your server. Start with authentication, safe retries and revision-aware updates.

1. Authenticate

Verify your email and create an API key in account settings. Send it as a Bearer token from your server. Keys support resources, files and designs, plus reading quotas and workspaces. Account security, domain management and administration require a browser session. Never expose keys in client code.

2. Create a resource

This example creates a website QR redirect and a short link on the default domain. Both channels share one destination and consume their respective allowances. The response contains the resource ID, slug and revision. Render the /r/ address as a QR image; share /s/ as the short link. The API returns data, not image bytes.

Example request
curl --request POST 'https://qrinio.com/api/v1/resources' \
  --header "Authorization: Bearer $QRINIO_API_KEY" \
  --header 'Content-Type: application/json' \
  --header 'Idempotency-Key: product-42-v1' \
  --data '{
  "title": "Product 42",
  "targetUrl": "https://example.com/products/42",
  "qrEnabled": true,
  "shortEnabled": true
}'
Response excerpt
{
  "id": "00000000-0000-4000-8000-000000000042",
  "slug": "sample-code",
  "revision": 1
}

3. Update without overwriting teammates

Read the resource first and send its current revision with PATCH. On revision_conflict (409), fetch it again and reconcile the changes before retrying. DELETE with ?revision= moves it to trash; restore is available for 30 days. Permanent purge is separate. Archived and trashed items still count towards quotas.

Example request
curl --request PATCH 'https://qrinio.com/api/v1/resources/00000000-0000-4000-8000-000000000042' \
  --header "Authorization: Bearer $QRINIO_API_KEY" \
  --header 'Content-Type: application/json' \
  --data '{
  "revision": 1,
  "targetUrl": "https://example.com/products/42-v2"
}'

4. Retry and batch safely

Reuse the same Idempotency-Key and identical body when retrying creation. Keys are retained for 24 hours; changing the body with the same key returns 409. Batches require a key, accept 1–100 items with distinct row keys and return a status per item. HTTP 200 does not mean every row succeeded. Persist results in your own system.

Example request
curl --request POST 'https://qrinio.com/api/v1/resources/batch' \
  --header "Authorization: Bearer $QRINIO_API_KEY" \
  --header 'Content-Type: application/json' \
  --header 'Idempotency-Key: catalog-batch-42-v1' \
  --data '{
  "items": [
    {
      "key": "product-42",
      "data": {
        "title": "Product 42",
        "targetUrl": "https://example.com/products/42",
        "qrEnabled": true,
        "shortEnabled": true
      }
    }
  ]
}'

Limits and errors

Read /quotas for current allowances, including administrator overrides. API keys and sessions share account request limits; owned workspaces share the owner’s resource allowance. On 429, respect Retry-After and back off. Use the stable code field to handle errors; message is diagnostic text. Do not automatically retry validation, permission or quota failures.

Read requests per minute
120
Write requests per minute
30
Batch requests per minute
2

Endpoint reference

List resources with page (from 1), pageSize (1–100), q, status and workspaceId. With no workspaceId, only personal resources are returned. File lists use limit (1–200), offset, search and kind=pdf or image. Hosted profile, links and PDF resources require published=true to become public.

Endpoint reference
GET /resourcesEverything in one place.
POST /resourcesCreate QR code
GET · PATCH · DELETE /resources/{id}Edit
POST /resources/batchCSV import
POST /resources/bulkSet folder and tags
GET /resources/{id}/analytics?days=30Statistics
GET /resources/{id}/historyVersion history
GET · POST /assetsFiles
GET /quotasStart free. Know your limits.
GET /workspacesWorkspaces