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.
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
}'{
"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.
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.
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.
| GET /resources | Everything in one place. |
|---|---|
| POST /resources | Create QR code |
| GET · PATCH · DELETE /resources/{id} | Edit |
| POST /resources/batch | CSV import |
| POST /resources/bulk | Set folder and tags |
| GET /resources/{id}/analytics?days=30 | Statistics |
| GET /resources/{id}/history | Version history |
| GET · POST /assets | Files |
| GET /quotas | Start free. Know your limits. |
| GET /workspaces | Workspaces |