Skip to content

API Overview

API Overview

The qr3.app REST API is available at https://qr3.app/v1/.

Versioning

The API is versioned via the URL path (/v1/). Breaking changes always introduce a new major version.

Request Format

  • Content-Type: application/json
  • Authentication: Authorization: Bearer qr3_sk_xxx
  • Idempotency: POST requests can be made idempotent with Idempotency-Key: <uuid>

Response Format

All successful responses return JSON:

{
"id": "qr_abc123",
"type": "url",
"url": "https://example.com",
"short_url": "https://qr3.app/r7f3Kx",
"created_at": "2026-03-15T10:00:00.000Z"
}

List responses always include a meta.pagination structure:

{
"data": [...],
"meta": {
"request_id": "req_xxx",
"pagination": {
"has_more": true,
"next_cursor": "qr_abc",
"total_count": 142
}
}
}

Error Format (RFC 7807)

All errors follow the RFC 7807 Problem Details standard:

{
"type": "https://docs.qr3.app/errors/not-found",
"title": "Not Found",
"status": 404,
"detail": "QR code qr_xxx not found",
"instance": "/v1/codes/qr_xxx"
}
StatusError typeDescription
400bad-requestInvalid JSON or missing required fields
401authenticationMissing or invalid API key
403forbiddenNo permission for this resource
404not-foundResource not found
409conflictIdempotency key conflict
422validationInvalid input data (with errors array)
429rate-limitedRate limit exceeded
500internalInternal server error

Pagination

The API uses cursor-based pagination:

Terminal window
# First page
GET /v1/codes?limit=20
# Next page
GET /v1/codes?limit=20&cursor=qr_lastid

Rate Limits

Every response includes:

X-RateLimit-Limit: 30
X-RateLimit-Remaining: 28
X-RateLimit-Reset: 1742040120

Interactive API Reference

Test all endpoints directly in your browser:

→ Open API Reference (Scalar, interactive, with Try-it-out)