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

  1. Authorization Request - Redirect user to authorize
  2. Authorization Code - User approves, receives code
  3. Token Exchange - Exchange code for access token
  4. API Requests - Use Bearer token for all requests
  5. Token Refresh - Refresh when access token expires

Authorization Endpoint

GET /oauth/authorize

Query Parameters:

ParameterTypeRequiredDescription
client_idstringYesYour OAuth client ID
redirect_uristringYesURL to redirect after authorization
response_typestringYesMust be code
statestringYesRandom string for CSRF protection
scopestringNoSpace-separated scopes (default: all)

Available Scopes:

ScopeDescription
qr_codes:readRead QR codes and their details
qr_codes:writeCreate, update, and delete QR codes
analytics:readAccess scan statistics
webhooks:writeManage 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:

ParameterTypeRequiredDescription
grant_typestringYesMust be authorization_code
codestringYesAuthorization code from redirect
redirect_uristringYesMust match original redirect_uri
client_idstringYesYour OAuth client ID
client_secretstringYesYour 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:

TokenLifetime
Authorization code10 minutes
Access token1 hour
Refresh token30 days

Token Refresh

POST /api/oauth/refresh

Refresh an expired access token.

Request Body:

ParameterTypeRequiredDescription
grant_typestringYesMust be refresh_token
refresh_tokenstringYesYour refresh token
client_idstringYesYour OAuth client ID
client_secretstringYesYour 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:

ParameterTypeDefaultDescription
pageinteger1Page number
limitinteger20Items per page (max 100)
folder_idstring-Filter by folder
statusstring-Filter by status: active or paused
type_idstring-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:

FieldTypeRequiredDescription
namestringYesDisplay name for the QR code
type_idstringYesQR code type (see types below)
contentobjectYesType-specific content
folder_idstringNoFolder to place QR code in

Supported QR Code Types:

Type IDContent 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:

ParameterTypeDescription
idstringQR 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:

FieldTypeRequiredDescription
namestringNoNew display name
contentobjectNoNew content (type-specific)
statusstringNoactive 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:

ParameterTypeRequiredDescription
qstringYesSearch query (matches name)
limitintegerNoMax 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:

ParameterTypeDefaultDescription
periodstring30dTime 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:

FieldTypeRequiredDescription
target_urlstringYesURL to receive webhook payloads
eventstringYesEvent type to subscribe to

Available Events:

EventDescription
qr.scannedQR code was scanned
qr.createdNew QR code created
qr.milestone.100QR code reached 100 scans
qr.milestone.500QR code reached 500 scans
qr.milestone.1000QR code reached 1,000 scans
qr.milestone.5000QR code reached 5,000 scans
qr.milestone.10000QR 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

StatusDescription
200Success
201Created
204No Content (successful deletion)
400Bad Request - Invalid parameters
401Unauthorized - Invalid or missing token
403Forbidden - Insufficient permissions
404Not Found - Resource doesn't exist
422Unprocessable Entity - Validation error
429Too Many Requests - Rate limit exceeded
500Internal Server Error

Error Codes

CodeDescription
invalid_requestRequest is malformed or missing required fields
invalid_tokenAccess token is invalid or expired
insufficient_scopeToken lacks required permissions
resource_not_foundRequested QR code or folder doesn't exist
validation_errorRequest body failed validation
rate_limit_exceededToo many requests, retry after delay
quota_exceededAccount 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

  1. Visit our Zapier integration to connect your account
  2. Authorize QR Code Maker when prompted
  3. Create your first Zap using our triggers and actions

Support

Questions about the API? Contact support@qr-code-maker.app.