Zapier API Reference
Complete API documentation for the QR Code Maker Zapier integration. Includes OAuth 2.0 authentication, all endpoints, request/response formats, and webhooks.
Complete API reference for integrating QR Code Maker with Zapier. This documentation covers authentication, all available endpoints, request/response formats, and webhook events.
Base URL
https://qr-code-maker.app
Authentication
The API uses OAuth 2.0 with the authorization code flow.
OAuth 2.0 Flow
- Authorization Request - Redirect user to authorize
- Authorization Code - User approves, receives code
- Token Exchange - Exchange code for access token
- API Requests - Use Bearer token for all requests
- Token Refresh - Refresh when access token expires
Authorization Endpoint
GET /oauth/authorize
Query Parameters:
| Parameter | Type | Required | Description |
|---|---|---|---|
client_id | string | Yes | Your OAuth client ID |
redirect_uri | string | Yes | URL to redirect after authorization |
response_type | string | Yes | Must be code |
state | string | Yes | Random string for CSRF protection |
scope | string | No | Space-separated scopes (default: all) |
Available Scopes:
| Scope | Description |
|---|---|
qr_codes:read | Read QR codes and their details |
qr_codes:write | Create, update, and delete QR codes |
analytics:read | Access scan statistics |
webhooks:write | Manage webhook subscriptions |
Example Request:
GET /oauth/authorize?client_id=your_client_id&redirect_uri=https://zapier.com/callback&response_type=code&state=abc123&scope=qr_codes:read%20qr_codes:write%20analytics:read
Token Exchange
POST /api/oauth/token
Exchange an authorization code for access and refresh tokens.
Request Headers:
Content-Type: application/x-www-form-urlencoded
Request Body:
| Parameter | Type | Required | Description |
|---|---|---|---|
grant_type | string | Yes | Must be authorization_code |
code | string | Yes | Authorization code from redirect |
redirect_uri | string | Yes | Must match original redirect_uri |
client_id | string | Yes | Your OAuth client ID |
client_secret | string | Yes | Your OAuth client secret |
Example Request:
curl -X POST https://qr-code-maker.app/api/oauth/token \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "grant_type=authorization_code" \
-d "code=AUTH_CODE_HERE" \
-d "redirect_uri=https://zapier.com/callback" \
-d "client_id=your_client_id" \
-d "client_secret=your_client_secret"
Success Response (200):
{
"access_token": "qrc_at_xxxxxxxxxxxxxxxx",
"token_type": "Bearer",
"expires_in": 3600,
"refresh_token": "qrc_rt_xxxxxxxxxxxxxxxx",
"scope": "qr_codes:read qr_codes:write analytics:read"
}
Token Lifetimes:
| Token | Lifetime |
|---|---|
| Authorization code | 10 minutes |
| Access token | 1 hour |
| Refresh token | 30 days |
Token Refresh
POST /api/oauth/refresh
Refresh an expired access token.
Request Body:
| Parameter | Type | Required | Description |
|---|---|---|---|
grant_type | string | Yes | Must be refresh_token |
refresh_token | string | Yes | Your refresh token |
client_id | string | Yes | Your OAuth client ID |
client_secret | string | Yes | Your OAuth client secret |
Example Request:
curl -X POST https://qr-code-maker.app/api/oauth/refresh \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "grant_type=refresh_token" \
-d "refresh_token=qrc_rt_xxxxxxxx" \
-d "client_id=your_client_id" \
-d "client_secret=your_client_secret"
Success Response (200):
{
"access_token": "qrc_at_yyyyyyyyyyyyyyyy",
"token_type": "Bearer",
"expires_in": 3600,
"refresh_token": "qrc_rt_yyyyyyyyyyyyyyyy",
"scope": "qr_codes:read qr_codes:write analytics:read"
}
Note: Refresh tokens are rotated on each use. The old refresh token becomes invalid.
API Endpoints
All API requests require a Bearer token in the Authorization header:
Authorization: Bearer qrc_at_xxxxxxxx
Test Connection
GET /api/zapier/me
Verify the API connection and retrieve account information.
Example Request:
curl https://qr-code-maker.app/api/zapier/me \
-H "Authorization: Bearer qrc_at_xxxxxxxx"
Success Response (200):
{
"id": "user_uuid",
"email": "user@example.com",
"organization_id": "org_uuid",
"organization_name": "My Company"
}
List QR Codes
GET /api/zapier/qr
Retrieve a paginated list of QR codes. Results are sorted by creation date (newest first).
Query Parameters:
| Parameter | Type | Default | Description |
|---|---|---|---|
page | integer | 1 | Page number |
limit | integer | 20 | Items per page (max 100) |
folder_id | string | - | Filter by folder |
status | string | - | Filter by status: active or paused |
type_id | string | - | Filter by type: website, vcard, wifi, etc. |
Example Request:
curl "https://qr-code-maker.app/api/zapier/qr?page=1&limit=20" \
-H "Authorization: Bearer qrc_at_xxxxxxxx"
Success Response (200):
{
"items": [
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "Summer Campaign",
"short_code": "abc123",
"type_id": "website",
"category": "dynamic",
"status": "active",
"content": {
"url": "https://example.com/summer"
},
"scan_count": 1250,
"last_scanned_at": "2026-01-18T14:30:00Z",
"created_at": "2026-01-01T10:00:00Z",
"updated_at": "2026-01-15T09:00:00Z",
"folder_id": "folder_uuid",
"qr_image_url": "https://qr-code-maker.app/api/qr/550e8400-e29b-41d4-a716-446655440000/image",
"tracking_url": "https://qr-code-maker.app/r/abc123",
"dashboard_url": "https://qr-code-maker.app/dashboard/qr/550e8400-e29b-41d4-a716-446655440000"
}
],
"total": 156,
"has_more": true
}
Create QR Code
POST /api/zapier/qr
Create a new QR code.
Request Headers:
Content-Type: application/json
Authorization: Bearer qrc_at_xxxxxxxx
Request Body:
| Field | Type | Required | Description |
|---|---|---|---|
name | string | Yes | Display name for the QR code |
type_id | string | Yes | QR code type (see types below) |
content | object | Yes | Type-specific content |
folder_id | string | No | Folder to place QR code in |
Supported QR Code Types:
| Type ID | Content Fields |
|---|---|
website | { "url": "https://..." } |
vcard | { "firstName": "", "lastName": "", "phone": "", "email": "", ... } |
wifi | { "ssid": "", "password": "", "security": "WPA" } |
email | { "email": "", "subject": "", "body": "" } |
sms | { "phone": "", "message": "" } |
phone | { "phone": "" } |
text | { "text": "" } |
event | { "title": "", "startDate": "", "endDate": "", "location": "" } |
Example Request:
curl -X POST https://qr-code-maker.app/api/zapier/qr \
-H "Authorization: Bearer qrc_at_xxxxxxxx" \
-H "Content-Type: application/json" \
-d '{
"name": "Product Launch",
"type_id": "website",
"content": {
"url": "https://example.com/launch"
},
"folder_id": "folder_uuid"
}'
Success Response (201):
{
"id": "new_qr_uuid",
"name": "Product Launch",
"short_code": "xyz789",
"type_id": "website",
"category": "dynamic",
"status": "active",
"content": {
"url": "https://example.com/launch"
},
"scan_count": 0,
"last_scanned_at": null,
"created_at": "2026-01-18T15:00:00Z",
"updated_at": "2026-01-18T15:00:00Z",
"folder_id": "folder_uuid",
"qr_image_url": "https://qr-code-maker.app/api/qr/new_qr_uuid/image",
"tracking_url": "https://qr-code-maker.app/r/xyz789",
"dashboard_url": "https://qr-code-maker.app/dashboard/qr/new_qr_uuid"
}
Get QR Code
GET /api/zapier/qr/{id}
Retrieve a specific QR code by ID.
Path Parameters:
| Parameter | Type | Description |
|---|---|---|
id | string | QR code UUID |
Example Request:
curl https://qr-code-maker.app/api/zapier/qr/550e8400-e29b-41d4-a716-446655440000 \
-H "Authorization: Bearer qrc_at_xxxxxxxx"
Success Response (200):
Returns the full QR code object (same format as list items).
Update QR Code
PATCH /api/zapier/qr/{id}
Update an existing QR code.
Request Body:
| Field | Type | Required | Description |
|---|---|---|---|
name | string | No | New display name |
content | object | No | New content (type-specific) |
status | string | No | active or paused |
Example Request:
curl -X PATCH https://qr-code-maker.app/api/zapier/qr/550e8400-e29b-41d4-a716-446655440000 \
-H "Authorization: Bearer qrc_at_xxxxxxxx" \
-H "Content-Type: application/json" \
-d '{
"name": "Summer Campaign 2026",
"content": {
"url": "https://example.com/summer2026"
}
}'
Success Response (200):
Returns the updated QR code object.
Delete QR Code
DELETE /api/zapier/qr/{id}
Permanently delete a QR code.
Example Request:
curl -X DELETE https://qr-code-maker.app/api/zapier/qr/550e8400-e29b-41d4-a716-446655440000 \
-H "Authorization: Bearer qrc_at_xxxxxxxx"
Success Response (204):
No content returned.
Search QR Codes
GET /api/zapier/qr/search
Search QR codes by name.
Query Parameters:
| Parameter | Type | Required | Description |
|---|---|---|---|
q | string | Yes | Search query (matches name) |
limit | integer | No | Max results (default 20, max 100) |
Example Request:
curl "https://qr-code-maker.app/api/zapier/qr/search?q=campaign" \
-H "Authorization: Bearer qrc_at_xxxxxxxx"
Success Response (200):
{
"items": [
{ ... QR code object ... }
],
"total": 5
}
Get QR Code Analytics
GET /api/zapier/qr/{id}/analytics
Retrieve scan statistics for a QR code.
Query Parameters:
| Parameter | Type | Default | Description |
|---|---|---|---|
period | string | 30d | Time period: 7d, 30d, 90d, all |
Example Request:
curl "https://qr-code-maker.app/api/zapier/qr/550e8400-e29b-41d4-a716-446655440000/analytics?period=30d" \
-H "Authorization: Bearer qrc_at_xxxxxxxx"
Success Response (200):
{
"qr_code_id": "550e8400-e29b-41d4-a716-446655440000",
"period": "30d",
"total_scans": 1250,
"unique_visitors": 890,
"scans_by_day": [
{ "date": "2026-01-18", "count": 45 },
{ "date": "2026-01-17", "count": 52 }
],
"top_countries": [
{ "country": "US", "count": 650 },
{ "country": "GB", "count": 200 }
],
"top_cities": [
{ "city": "New York", "country": "US", "count": 180 },
{ "city": "Los Angeles", "country": "US", "count": 120 }
],
"devices": {
"mobile": 980,
"desktop": 220,
"tablet": 50
}
}
List Folders
GET /api/zapier/folders
Retrieve all folders for organizing QR codes.
Example Request:
curl https://qr-code-maker.app/api/zapier/folders \
-H "Authorization: Bearer qrc_at_xxxxxxxx"
Success Response (200):
{
"items": [
{
"id": "folder_uuid",
"name": "Marketing Campaigns",
"qr_count": 24,
"created_at": "2026-01-01T10:00:00Z"
}
]
}
Webhooks (REST Hooks)
Subscribe to receive real-time notifications when events occur.
Subscribe to Webhook
POST /api/zapier/webhooks/subscribe
Create a new webhook subscription.
Request Body:
| Field | Type | Required | Description |
|---|---|---|---|
target_url | string | Yes | URL to receive webhook payloads |
event | string | Yes | Event type to subscribe to |
Available Events:
| Event | Description |
|---|---|
qr.scanned | QR code was scanned |
qr.created | New QR code created |
qr.milestone.100 | QR code reached 100 scans |
qr.milestone.500 | QR code reached 500 scans |
qr.milestone.1000 | QR code reached 1,000 scans |
qr.milestone.5000 | QR code reached 5,000 scans |
qr.milestone.10000 | QR code reached 10,000 scans |
Example Request:
curl -X POST https://qr-code-maker.app/api/zapier/webhooks/subscribe \
-H "Authorization: Bearer qrc_at_xxxxxxxx" \
-H "Content-Type: application/json" \
-d '{
"target_url": "https://hooks.zapier.com/hooks/catch/123/abc",
"event": "qr.scanned"
}'
Success Response (201):
{
"id": "webhook_subscription_uuid",
"target_url": "https://hooks.zapier.com/hooks/catch/123/abc",
"event": "qr.scanned",
"created_at": "2026-01-18T15:00:00Z"
}
Unsubscribe from Webhook
DELETE /api/zapier/webhooks/{id}
Remove a webhook subscription.
Example Request:
curl -X DELETE https://qr-code-maker.app/api/zapier/webhooks/webhook_subscription_uuid \
-H "Authorization: Bearer qrc_at_xxxxxxxx"
Success Response (204):
No content returned.
Webhook Payload Format
Webhooks are delivered as POST requests to your target URL.
Request Headers:
Content-Type: application/json
X-QRC-Event: qr.scanned
X-QRC-Signature: sha256=xxxxxxxxxxxxxxxxxxxxxxxxxx
Signature Verification:
The X-QRC-Signature header contains an HMAC-SHA256 signature of the request body. Verify it using your webhook secret to ensure the request is authentic.
Example Payload (qr.scanned):
{
"event": "qr.scanned",
"timestamp": "2026-01-18T15:30:00Z",
"data": {
"qr_code": {
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "Summer Campaign",
"short_code": "abc123",
"type_id": "website",
"scan_count": 1251
},
"scan": {
"country": "US",
"city": "New York",
"device_type": "mobile",
"browser": "Safari",
"scanned_at": "2026-01-18T15:30:00Z"
}
}
}
Example Payload (qr.milestone.1000):
{
"event": "qr.milestone.1000",
"timestamp": "2026-01-18T15:30:00Z",
"data": {
"qr_code": {
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "Summer Campaign",
"short_code": "abc123",
"type_id": "website",
"scan_count": 1000
},
"milestone": 1000
}
}
Error Handling
The API uses standard HTTP status codes and returns errors in a consistent format.
Error Response Format
{
"error": {
"code": "ERROR_CODE",
"message": "Human-readable error description"
}
}
HTTP Status Codes
| Status | Description |
|---|---|
200 | Success |
201 | Created |
204 | No Content (successful deletion) |
400 | Bad Request - Invalid parameters |
401 | Unauthorized - Invalid or missing token |
403 | Forbidden - Insufficient permissions |
404 | Not Found - Resource doesn't exist |
422 | Unprocessable Entity - Validation error |
429 | Too Many Requests - Rate limit exceeded |
500 | Internal Server Error |
Error Codes
| Code | Description |
|---|---|
invalid_request | Request is malformed or missing required fields |
invalid_token | Access token is invalid or expired |
insufficient_scope | Token lacks required permissions |
resource_not_found | Requested QR code or folder doesn't exist |
validation_error | Request body failed validation |
rate_limit_exceeded | Too many requests, retry after delay |
quota_exceeded | Account has reached QR code limit |
Rate Limiting
- Limit: 100 requests per minute per access token
- Headers: Rate limit info is returned in response headers
X-RateLimit-Limit: 100
X-RateLimit-Remaining: 95
X-RateLimit-Reset: 1737214200
When rate limited, the response includes a Retry-After header:
HTTP/1.1 429 Too Many Requests
Retry-After: 30
Getting Started
- Visit our Zapier integration to connect your account
- Authorize QR Code Maker when prompted
- Create your first Zap using our triggers and actions
Support
Questions about the API? Contact support@qr-code-maker.app.