My Insider Pass
v1.2.0

API Reference

The Insider Pass API allows brands, creators, and developers to programmatically create wallet passes, manage pass metadata, send lock-screen push notifications, and track user engagement across Apple Wallet and Google Wallet.

Introduction

The Insider Pass API allows brands, creators, and developers to programmatically create wallet passes, manage pass metadata, send lock-screen push notifications, and track user engagement across Apple Wallet and Google Wallet.

With this API, you can:

  • Create and update wallet passes
  • Generate dynamic pass content
  • Send direct push notifications to pass holders
  • Add and manage geo-triggered locations
  • Search, filter, and list passes at scale
  • Manage API keys for secure integration

All endpoints are JSON-based and follow REST conventions.

Base URL

All API requests should be made to:

https://api.insiderpass.com

API Versioning

The API uses URL-based versioning. All endpoints are prefixed with /v1. When we release breaking changes, we'll introduce a new version (e.g., /v2). The current version is v1.2.0.

Rate Limiting

API requests are rate-limited to ensure fair usage and system stability:

  • 100 requests per minute per API key
  • 10,000 requests per hour per API key

Rate limit headers are included in all responses: X-RateLimit-Limit, X-RateLimit-Remaining, and X-RateLimit-Reset. When limits are exceeded, you'll receive a 429 Too Many Requests response.

Response Format

All responses are returned as JSON. Dates and timestamps use ISO-8601 format (e.g., 2025-12-01T20:20:00Z).

List endpoints return paginated results with the following structure:

{
"data": [...],
"total": 100,
"has_more": true,
"next_offset": 20
}

Error Handling

Errors are returned with appropriate HTTP status codes and a JSON error object:

{
"error": {
"code": "invalid_request",
"message": "The request is missing a required parameter.",
"type": "invalid_request_error"
}
}

Common status codes: 400 Bad Request, 401 Unauthorized, 404 Not Found, 429 Too Many Requests, 500 Server Error. See the Error Codes section for details.

Authentication

All requests to the Insider Pass API require an API key. Your API key must be included in the Authorization header for each request.

Getting Started

API keys are managed by Insider Pass to ensure account security and subscription validation. To get your first API key:

Request Your API Key

API keys are only issued to accounts with active subscriptions. Submit a request through our contact form, and our team will verify your account status and provide your API key.

Request API Key
  • After receiving your key: Log into your Insider Pass dashboard and navigate to Settings → API Keys to view and manage your keys
  • Additional keys: Use the Create API Key endpoint to create additional keys programmatically (requires an existing API key from an account with an active subscription)

Important: API keys can only be created for accounts with active subscriptions. The programmatic endpoint requires authentication with an existing API key and will return 403 Forbidden if your account subscription is not active.

Environment Keys

API keys are prefixed to indicate their environment:

  • sk_test_... - Test keys for development and testing
  • sk_live_... - Production keys for live applications

Test keys operate on a separate test environment and don't affect production data.

Security Best Practices

  • Never commit keys to version control - Use environment variables or secure secret management
  • Use environment variables - Store keys in .env files (never commit these) or your platform's secret management
  • Rotate keys regularly - Create new keys and revoke old ones periodically for enhanced security
  • Use separate keys per environment - Different keys for development, staging, and production
  • Restrict key permissions - Create keys with minimal required permissions when possible

Error Responses

Authentication errors return the following status codes:

  • 401 Unauthorized - Missing or invalid API key
  • 403 Forbidden - Valid key but insufficient permissions, or account subscription is not active
# Example 401 response
{
"error": {
"code": "invalid_api_key",
"message": "Invalid API key provided.",
"type": "authentication_error"
}
}
Authentication
# Example Authorization header Authorization: Bearer YOUR_API_KEY

API Keys

Create and manage additional API keys for your Insider Pass account. This endpoint requires:

  • An active Insider Pass account with an active subscription
  • Authentication with an existing API key (root or primary key)

Need your first API key?

API keys are issued only to accounts with active subscriptions. Request your API key through our contact form.

Request API Key via Contact Form

Access Control: This endpoint will return 403 Forbidden if your account subscription is not active. Your first API key must be requested through our contact form after account signup.

POST /v1/api-keys

Body Parameters

name string Required

Human-readable label for the API key (e.g., "Production Key").

Request
curl -X POST https://api.insiderpass.com/v1/api-keys \ -H "Authorization: Bearer sk_live_..." \ -H "Content-Type: application/json" \ -d '{ "name": "Production Key" }'
Response
{
"id": "key_abc123",
"name": "Production Key",
"key": "sk_live_xxx",
"created_at": "2025-12-01T20:20:00Z"
}

Response Fields

id string

Unique identifier for the API key. Use this ID to reference the key in management operations.

name string

Human-readable label you provided when creating the key. Useful for identifying keys in your dashboard.

key string

The full API key secret (e.g., sk_live_xxx). Store this securely — it's only shown once when created. If lost, you'll need to create a new key.

created_at string (ISO-8601)

Timestamp indicating when the key was created.

Key Management

To revoke or delete an API key:

  • Dashboard: Navigate to Settings → API Keys and click "Revoke" next to the key you want to delete
  • API: Use DELETE /v1/api-keys/{id} (requires authentication with a different key)

Revoked keys immediately stop working. Any requests using a revoked key will return 401 Unauthorized.

Usage Notes

Consider creating multiple API keys for:

  • Environment separation: Different keys for development, staging, and production
  • Service isolation: Separate keys for different services or microservices
  • Access control: Keys with different permission levels or scopes
  • Key rotation: Maintain multiple keys to enable zero-downtime rotation

List wallet passes

Retrieve a list of wallet passes with optional filters for segmentation and search.

GET /v1/passes

Query Parameters

member_name string

Filter passes by member name.

tier string

Filter passes by membership tier.

brand_id string

Filter passes belonging to a specific brand.

limit integer

Maximum number of passes to return. Default: 20, Maximum: 100.

offset integer

Number of passes to skip before starting to collect the result set. Default: 0. Use for pagination.

Example
curl "https://api.insiderpass.com/v1/passes?tier=Premium&brand_id=brand_twainai&limit=20" \ -H "Authorization: Bearer sk_live_..."
Response
{
"data": [
{
"id": "pass_12345",
"member_name": "David Martinez",
"tier": "Premium Tier",
"points_value": 250,
"brand_id": "brand_twainai",
"status": "active",
"created_at": "2025-12-01T20:40:00Z"
}
...
],
"total": 150,
"has_more": true,
"next_offset": 20
}

Response Structure

The response includes pagination metadata:

data array

Array of pass objects matching your query parameters. Each object contains the full pass details (see Pass object).

total integer

Total number of passes matching the query (across all pages).

has_more boolean

Indicates whether more results are available. Use next_offset to fetch the next page.

next_offset integer

Offset value to use for the next page request. Omitted if has_more is false.

Pagination

To paginate through results, use the offset parameter:

# First page (default)
GET /v1/passes?limit=20&offset=0

# Second page
GET /v1/passes?limit=20&offset=20

# Third page
GET /v1/passes?limit=20&offset=40

Create a wallet pass

Creates a new wallet pass for a member. The response includes wallet URLs for Apple Wallet and Google Wallet plus metadata about the pass.

POST /v1/passes

Body Parameters

member_name string Required

Name of the member who owns the pass. Max length: 100 characters.

tier string Optional

Tier or level of the member (e.g., Listener Tier, Premium Tier). Max length: 50 characters.

points_label string Optional

Label displayed next to the points value on the pass. Max length: 30 characters.

points_value integer Optional

Current number of points associated with the member. Range: 0 to 999999. Default: 0.

brand_id string Optional

Identifier of the brand or project that owns this pass. Must match an existing brand ID in your account. Format: alphanumeric with underscores, max 50 characters.

qr_action_text string Optional

Call-to-action text shown with the QR code on the pass. Max length: 100 characters.

metadata object Optional

Custom key-value metadata to associate with the pass (e.g., email, referral_code). Keys and values must be strings. Max 20 keys per pass. Email values should be valid email format.

Request
curl -X POST https://api.insiderpass.com/v1/passes \ -H "Authorization: Bearer sk_live_..." \ -H "Content-Type: application/json" \ -d '{ "member_name": "David Martinez", "tier": "Listener Tier", "points_label": "AI Insight Points", "points_value": 250, "brand_id": "brand_twainai", "qr_action_text": "Share your pass to earn rewards", "metadata": { "email": "david@example.com", "referral_code": "TWIAI-1234" } }'
Response
{
"id": "pass_12345",
"member_name": "David Martinez",
"status": "active",
"barcode_url": "https://...",
"wallet_urls": {
"apple": "https://...",
"google": "https://..."
},
"created_at": "2025-12-01T20:40:00Z"
}

Response Fields

The response includes the complete pass object with the following fields:

id string

Unique identifier for the pass (e.g., pass_12345). Use this ID for subsequent operations.

wallet_urls object

Contains apple and google URLs. Share these URLs with users to add the pass to their wallet. URLs are valid indefinitely.

barcode_url string

URL to the QR code image for the pass. Use this to display the barcode in your application.

status string

Initial status is always active. See Pass object for all possible status values.

created_at string (ISO-8601)

Timestamp when the pass was created.

Error Scenarios

400 Bad Request

Returned when validation fails:

  • Missing required field (member_name)
  • Invalid field format (e.g., invalid email in metadata)
  • Field exceeds maximum length
  • points_value outside valid range
404 Not Found

Returned when brand_id doesn't exist in your account.

409 Conflict

Returned when attempting to create a duplicate pass (same member_name and brand_id combination already exists). Use Update Pass to modify existing passes.

Validation Example

# Example 400 error response
{
"error": {
"code": "validation_error",
"message": "points_value must be between 0 and 999999",
"field": "points_value"
}
}

Get a wallet pass

Retrieves the details of an existing wallet pass by its ID. Returns the complete pass object including all fields and metadata.

GET /v1/passes/{id}

Path Parameters

id string Required

The unique identifier of the pass to retrieve (e.g., pass_12345).

Example
curl https://api.insiderpass.com/v1/passes/pass_12345 \ -H "Authorization: Bearer sk_live_..."
Response
{
"id": "pass_12345",
"member_name": "David Martinez",
"tier": "Premium Tier",
"points_value": 250,
"status": "active",
"wallet_urls": {
"apple": "https://...",
"google": "https://..."
},
"created_at": "2025-12-01T20:40:00Z",
"updated_at": "2025-12-01T21:00:00Z"
}

Use Cases

  • Verify pass details before updating
  • Retrieve wallet URLs to display to users
  • Check pass status before sending notifications
  • Display pass information in your application

Error Responses

404 Not Found

Returned when the pass ID doesn't exist or has been deleted.

401 Unauthorized

Returned when the API key is invalid or expired.

Update a wallet pass

Update specific fields on an existing wallet pass. This endpoint supports partial updates — only include the fields you want to change. Common updates include points, tier, QR action text, and status.

PATCH /v1/passes/{id}

Body Parameters

All parameters are optional. Only include fields you want to update.

points_value integer

Updated points value for the member. Range: 0 to 999999.

tier string

Updated tier (e.g., Premium Tier). Max length: 50 characters.

qr_action_text string

Updated call-to-action text shown with the QR code. Max length: 100 characters.

status string

Pass status. Valid values: active, inactive, disabled.

Request
curl -X PATCH https://api.insiderpass.com/v1/passes/pass_12345 \ -H "Authorization: Bearer sk_live_..." \ -H "Content-Type: application/json" \ -d '{ "points_value": 500, "tier": "Premium Tier" }'
Response
# Returns the complete updated pass object
{
"id": "pass_12345",
"points_value": 500,
"tier": "Premium Tier",
"updated_at": "2025-12-01T21:00:00Z"
...
}

Partial Update Behavior

Only send the fields you want to update. Fields not included in the request remain unchanged. For example, to update only points:

PATCH /v1/passes/pass_12345
{ "points_value": 500 }

Field Mutability

The following fields cannot be updated:

  • id - Immutable identifier
  • member_name - Cannot be changed after creation
  • brand_id - Cannot be changed after creation
  • created_at - System-managed timestamp

Validation

The same validation rules apply as in Create Pass. Invalid values will return 400 Bad Request.

Delete a wallet pass

Soft-deletes a pass and disables future notifications. The pass will no longer be usable in the member's wallet, but the data is retained for historical purposes.

DELETE /v1/passes/{id}
Request
curl -X DELETE https://api.insiderpass.com/v1/passes/pass_12345 \ -H "Authorization: Bearer sk_live_..."
Response
# Returns 204 No Content on success

Soft Delete Explained

When you delete a pass, it's marked as deleted (soft delete) rather than permanently removed:

  • The pass is removed from active listings and cannot be retrieved via Get Pass
  • The pass becomes unusable in the user's wallet
  • Historical data is retained for analytics and audit purposes
  • The pass ID cannot be reused

Irreversibility

Deleted passes cannot be restored through the API. If you need to restore a pass, you'll need to:

  • Create a new pass with the same member information
  • Contact support if you need to recover historical data

Cascading Effects

Deleting a pass has the following effects:

  • Scheduled notifications: All pending/scheduled notifications for this pass are cancelled
  • Active notifications: Already sent notifications remain in the system but cannot be resent
  • Location triggers: The pass will no longer trigger location-based notifications

Response

On successful deletion, the API returns 204 No Content with an empty response body. If the pass doesn't exist, you'll receive 404 Not Found.

Create a notification

Send a push notification to a specific pass or pass group. Notifications appear on the user's lock screen and in their wallet pass.

POST /v1/notifications

List notifications

Retrieve a list of notifications that have been sent or scheduled, with support for filtering and pagination.

GET /v1/notifications

Query Parameters

pass_id string

Filter notifications by pass ID.

status string

Filter by status: queued, sent, delivered, failed.

created_after string (ISO-8601)

Filter notifications created after this timestamp.

created_before string (ISO-8601)

Filter notifications created before this timestamp.

limit integer

Maximum number of notifications to return. Default: 20, Maximum: 100.

offset integer

Number of notifications to skip. Default: 0.

Example
curl "https://api.insiderpass.com/v1/notifications?status=sent&limit=20" \ -H "Authorization: Bearer sk_live_..."
Response
{
"data": [
{
"id": "notif_67890",
"pass_id": "pass_12345",
"title": "New Episode Out!",
"status": "sent",
"created_at": "2025-12-01T21:00:00Z"
}
],
"total": 50,
"has_more": true,
"next_offset": 20
}

Notification detail

Retrieve, update, or delete a single notification by its ID, and access delivery statistics.

Create notification
curl https://api.insiderpass.com/v1/notifications/notif_67890 \ -H "Authorization: Bearer sk_live_..."
Response
curl -X PATCH https://api.insiderpass.com/v1/notifications/notif_67890 \ -H "Authorization: Bearer sk_live_..." \ -H "Content-Type: application/json" \ -d '{ "send_at": "2025-12-02T10:00:00Z" }'
Delete notification
curl -X DELETE https://api.insiderpass.com/v1/notifications/notif_67890 \ -H "Authorization: Bearer sk_live_..."
Notification statistics
curl https://api.insiderpass.com/v1/notifications/notif_67890/stats \ -H "Authorization: Bearer sk_live_..." # Returns delivery counts, open rates, timestamps, and device breakdown.

Body Parameters

pass_id string Required

ID of the pass (or pass group) that should receive the notification. Must be a valid, active pass ID.

title string Optional

Notification title shown on the lock screen. Max length: 100 characters. If omitted, defaults to your brand name.

body string Required

Text content of the notification message. Max length: 500 characters.

deep_link_url string Optional

Optional deep link that opens when the user taps the notification. Must be a valid HTTP/HTTPS URL. Supports custom URL schemes (e.g., myapp://path) and universal links.

send_at string or null Optional

Optional ISO-8601 timestamp to schedule the notification. Use null to send immediately. Must be a future timestamp. Scheduled notifications can be updated or cancelled before they're sent.

Request
curl -X POST https://api.insiderpass.com/v1/notifications \ -H "Authorization: Bearer sk_live_..." \ -H "Content-Type: application/json" \ -d '{ "pass_id": "pass_12345", "title": "New Episode Out!", "body": "Check out our new breakdown of AI trends.", "deep_link_url": "https://thisweekinai.com/new-episode", "send_at": null }'
Response
{
"id": "notif_67890",
"status": "queued",
"pass_id": "pass_12345",
"created_at": "2025-12-01T21:00:00Z"
}

Notification Status Values

Notifications progress through the following statuses:

queued

Notification is scheduled and waiting to be sent. Applies to both immediate and scheduled notifications.

sent

Notification has been sent to the push notification service (Apple/Google). Delivery confirmation may be pending.

delivered

Notification was successfully delivered to the device. The user may or may not have seen it.

failed

Notification failed to send. Common reasons: invalid pass ID, pass deleted, device not registered, or service error.

Delivery Guarantees

Notification delivery operates on a best-effort basis:

  • Notifications are queued and sent as quickly as possible (typically within seconds)
  • Delivery depends on device connectivity and push notification service availability
  • Users may have notifications disabled or the app uninstalled
  • Failed notifications are not automatically retried (use the API to resend if needed)
  • Delivery status updates may take a few minutes to reflect accurately

Notification Limits

  • Rate limit: 100 notifications per minute per API key
  • Title length: Maximum 100 characters
  • Body length: Maximum 500 characters
  • Scheduled notifications: Can be scheduled up to 30 days in advance

Error Handling

400 Bad Request

Returned when validation fails:

  • Missing required field (body)
  • Invalid send_at timestamp (must be future)
  • Field exceeds maximum length
  • Invalid URL format for deep_link_url
404 Not Found

Returned when pass_id doesn't exist or the pass has been deleted.

429 Too Many Requests

Returned when you exceed the notification rate limit. Wait before retrying.

Notification Statistics Response

The stats endpoint returns detailed delivery metrics:

{
"notification_id": "notif_67890",
"status": "delivered",
"sent_count": 1,
"delivered_count": 1,
"failed_count": 0,
"opened_count": 0,
"sent_at": "2025-12-01T21:00:05Z",
"delivered_at": "2025-12-01T21:00:10Z",
"device_breakdown": {
"ios": 1,
"android": 0
}
}

List locations

Search and filter geo-trigger locations used to power proximity-based notifications.

GET /v1/locations

Query Parameters

brand_id string

Filter locations by brand ID.

name string

Search locations by name (partial match).

limit integer

Maximum number of locations to return. Default: 20, Maximum: 100.

offset integer

Number of locations to skip. Default: 0.

Example
curl "https://api.insiderpass.com/v1/locations?brand_id=brand_twainai" \ -H "Authorization: Bearer sk_live_..."
Response
{
"data": [
{
"id": "loc_12345",
"name": "Flagship Store",
"latitude": 40.7128,
"longitude": -74.0060,
"radius_meters": 150,
"created_at": "2025-12-01T20:00:00Z"
}
],
"total": 10,
"has_more": false
}

Create a location

Define a geo-triggered location where nearby pass holders can receive context-aware notifications.

POST /v1/locations

Body Parameters

name string Required

Name of the location (e.g., "Flagship Store"). Max length: 100 characters.

latitude number Required

Latitude in decimal degrees. Range: -90 to 90. Use WGS84 coordinate system.

longitude number Required

Longitude in decimal degrees. Range: -180 to 180. Use WGS84 coordinate system.

radius_meters integer Required

Radius of the geofence in meters. Range: 10 to 10000. Recommended: 50-500 meters for best accuracy and battery efficiency.

message string Optional

Default notification message shown when a user enters this location. Max length: 500 characters.

Request
curl -X POST https://api.insiderpass.com/v1/locations \ -H "Authorization: Bearer sk_live_..." \ -H "Content-Type: application/json" \ -d '{ "name": "Flagship Store", "latitude": 40.7128, "longitude": -74.0060, "radius_meters": 150, "message": "You're near our store! Stop in for a reward." }'

How Geofencing Works

When a pass holder's device enters the geofence (circular area defined by latitude, longitude, and radius):

  • The device detects proximity using GPS and location services
  • A notification is automatically sent to the pass holder
  • The notification uses the location's default message (if provided) or a custom message
  • Notifications are sent once per entry (re-entry after leaving triggers again)

GPS Accuracy Considerations

GPS accuracy varies based on several factors:

  • Outdoor accuracy: Typically 5-10 meters under clear sky conditions
  • Indoor accuracy: Can be 20-50 meters or worse, depending on building materials
  • Urban canyons: Tall buildings can reduce accuracy to 15-30 meters
  • Device quality: Newer devices generally have better GPS chips

Recommendation: Use a radius of at least 50 meters to account for GPS inaccuracy. For indoor locations, consider 100-200 meters.

Best Practices

  • Minimum radius: Use at least 50 meters to account for GPS inaccuracy
  • Maximum radius: Keep under 500 meters for most use cases to avoid false triggers
  • Battery impact: Larger radii and more locations increase battery drain. Balance coverage with efficiency
  • Location density: Avoid overlapping geofences with similar radii to prevent duplicate notifications
  • Testing: Test geofences in real-world conditions before deploying to production
  • User permissions: Ensure users have granted location permissions for their wallet app

Location detail

Retrieve, update, or delete a location by its ID.

Get location
curl https://api.insiderpass.com/v1/locations/loc_12345 \ -H "Authorization: Bearer sk_live_..."
Update location
curl -X PUT https://api.insiderpass.com/v1/locations/loc_12345 \ -H "Authorization: Bearer sk_live_..." \ -H "Content-Type: application/json" \ -d '{ "radius_meters": 200 }'
Delete location
curl -X DELETE https://api.insiderpass.com/v1/locations/loc_12345 \ -H "Authorization: Bearer sk_live_..."

Location Object Structure

The Get Location endpoint returns a complete location object:

{
"id": "loc_12345",
"name": "Flagship Store",
"latitude": 40.7128,
"longitude": -74.0060,
"radius_meters": 150,
"message": "You're near our store! Stop in for a reward.",
"created_at": "2025-12-01T20:00:00Z",
"updated_at": "2025-12-01T21:00:00Z"
}

Update Location Response

The Update Location endpoint (PUT) returns the complete updated location object, similar to the Get Location response. Only include fields you want to update in the request body.

Pass object

Standard representation of a wallet pass returned by the API.

Example
{
"id": "pass_12345",
"member_name": "Emily Davis",
"tier": "Insider Tier",
"points_label": "Thrive Credits",
"points_value": 150,
"brand_id": "makerthrive",
"qr_action_text": "Share your pass to earn Thrive Credits",
"status": "active",
"barcode_url": "https://...",
"wallet_urls": {
"apple": "https://...",
"google": "https://..."
},
"metadata": {
"email": "emily@example.com",
"referral_code": "THRIVE-1234"
},
"created_at": "2025-12-01T20:40:00Z",
"updated_at": "2025-12-01T21:00:00Z"
}

Field Documentation

id string Read-only

Unique identifier for the pass (e.g., pass_12345). Generated automatically on creation. Immutable.

member_name string Required on create

Name of the member who owns the pass. Max length: 100 characters. Cannot be updated after creation.

tier string | null Optional

Membership tier or level. Max length: 50 characters. Can be updated.

points_label string | null Optional

Label displayed next to points on the pass (e.g., "Credits", "Points"). Max length: 30 characters.

points_value integer Optional

Current points balance. Range: 0 to 999999. Default: 0. Can be updated.

brand_id string Required on create

Brand identifier. Must match an existing brand in your account. Cannot be updated after creation.

qr_action_text string | null Optional

Call-to-action text shown with QR code. Max length: 100 characters. Can be updated.

status string Read-only on create

Pass status. Enum: active, inactive, disabled. Default: active. Can be updated.

barcode_url string Read-only

URL to the QR code image. Generated automatically. Valid indefinitely.

wallet_urls object Read-only

Object containing wallet-specific URLs. Structure:

  • apple (string): URL for Apple Wallet
  • google (string): URL for Google Wallet

URLs are generated automatically and valid indefinitely. Share these with users to add the pass to their wallet.

metadata object Optional

Custom key-value pairs. Keys and values must be strings. Max 20 keys. Common use cases: email, referral_code, user_id. Can be updated.

created_at string (ISO-8601) Read-only

Timestamp when the pass was created. Format: ISO-8601 (e.g., 2025-12-01T20:40:00Z). UTC timezone.

updated_at string (ISO-8601) Read-only

Timestamp when the pass was last updated. Format: ISO-8601. UTC timezone. Equals created_at if never updated.

Status Enum Values

active

Pass is active and can receive notifications. Default status for new passes.

inactive

Pass is temporarily inactive. Cannot receive notifications but can be reactivated.

disabled

Pass is permanently disabled (typically after soft delete). Cannot receive notifications and cannot be reactivated.

Date Format

All timestamps use ISO-8601 format in UTC timezone:

2025-12-01T20:40:00Z

Format: YYYY-MM-DDTHH:mm:ssZ. The Z indicates UTC timezone.

Field Relationships

  • wallet_urls and barcode_url are generated automatically when a pass is created
  • status must be active for notifications to be delivered
  • points_value and points_label work together to display points on the pass
  • brand_id determines which brand's styling and configuration is used

Error Codes

The API uses standard HTTP status codes and returns error details in a consistent JSON format.

Error Response Format

All errors follow this structure:

{
"error": {
"code": "error_code_string",
"message": "Human-readable error message",
"type": "error_type"
// Optional: "field" indicates which field caused the error
"field": "field_name"
}
}

HTTP Status Codes

400 Bad Request

The request is malformed or contains invalid parameters.

{
"error": {
"code": "validation_error",
"message": "points_value must be between 0 and 999999",
"type": "invalid_request_error",
"field": "points_value"
}
}
401 Unauthorized

Authentication failed. The API key is missing, invalid, or expired.

{
"error": {
"code": "invalid_api_key",
"message": "Invalid API key provided.",
"type": "authentication_error"
}
}
403 Forbidden

The API key is valid but doesn't have permission to perform this action. This can occur when:

  • The account subscription is not active
  • The API key doesn't have sufficient permissions for the requested operation
  • The account has been suspended or restricted
{
"error": {
"code": "insufficient_permissions",
"message": "You don't have permission to perform this action.",
"type": "authentication_error"
}
}

If you believe this is an error, please contact support to verify your account status.

404 Not Found

The requested resource doesn't exist or has been deleted.

{
"error": {
"code": "resource_not_found",
"message": "Pass not found.",
"type": "invalid_request_error"
}
}
409 Conflict

The request conflicts with the current state (e.g., duplicate resource).

{
"error": {
"code": "duplicate_resource",
"message": "A pass with this member_name and brand_id already exists.",
"type": "invalid_request_error"
}
}
429 Too Many Requests

Rate limit exceeded. Wait before retrying. Check response headers for retry information.

# Response headers include:
X-RateLimit-Limit: 100
X-RateLimit-Remaining: 0
X-RateLimit-Reset: 1701456000

{
"error": {
"code": "rate_limit_exceeded",
"message": "Rate limit exceeded. Please retry after 60 seconds.",
"type": "rate_limit_error"
}
}
500 Internal Server Error

An unexpected server error occurred. Retry the request. If the problem persists, contact support.

{
"error": {
"code": "internal_server_error",
"message": "An unexpected error occurred. Please try again later.",
"type": "api_error"
}
}

Error Types

invalid_request_error

The request was invalid (e.g., missing required field, invalid format). Usually returns 400.

authentication_error

Authentication failed. Usually returns 401 or 403.

rate_limit_error

Rate limit exceeded. Returns 429.

api_error

An unexpected server error occurred. Returns 500.