Campaigns API

Create, list, update, and delete campaigns

Campaigns API

Campaigns are the primary resource in the API — all recipients and wallet cards are organized under campaigns.

List Campaigns

GET
/campaigns
Required scope: campaigns:read

Retrieve a list of campaigns for your organization.

Query Parameters

ParameterTypeRequiredDescription
limitintegerNoMaximum results (1-100, default: 20)
offsetintegerNoNumber of results to skip (default: 0)
statusstringNoFilter by status: draft, active, completed, archived
campaignTypestringNoFilter by type: event, coupon, loyalty, access, generic
Response
{
  "success": true,
  "data": {
    "campaigns": [
      {
        "id": "campaign_abc123",
        "name": "Tech Conference 2025",
        "campaignType": "event",
        "status": "active",
        "createdAt": "2025-12-01T10:00:00Z"
      }
    ],
    "pagination": {
      "total": 10,
      "limit": 20,
      "offset": 0,
      "hasMore": false
    }
  }
}

Create Campaign

POST
/campaigns
Required scope: campaigns:write

Create a new campaign. Campaigns are the primary resource in the API.

Request Parameters

ParameterTypeRequiredDescription
namestringYesCampaign name
campaignTypestringYesType: event, coupon, loyalty, access, generic
campaignDataobjectYesCampaign-specific data (inherited by recipients)
campaignData.barcodeTypestringNoBarcode type: none, qr (default), aztec, pdf417, code128
campaignData.barcodeValueStrategystringNoBarcode value strategy: auto (default) or custom
startDatestringNoStart date (ISO 8601 format: YYYY-MM-DD)
endDatestringNoEnd date (ISO 8601 format: YYYY-MM-DD). For single-day events the platform may persist startDate + 1 day when not split.
timezonestringNoIANA timezone (e.g. Europe/Amsterdam); merged into campaignData.timezone (default UTC)
providerTypesarrayNoProviders: ["all"], ["apple"], ["google"], ["eudiw"] (default: ["all"])
metadataobjectNoCustom metadata (key-value pairs)
Response
{
  "success": true,
  "data": {
    "id": "campaign_abc123",
    "name": "Tech Conference 2025",
    "campaignType": "event",
    "status": "active",
    "campaignData": {
      "location": "San Francisco Convention Center",
      "barcodeType": "qr",
      "barcodeValueStrategy": "auto"
    },
    "startDate": "2025-12-15",
    "endDate": "2025-12-17",
    "eventStartsAt": "2025-12-15T17:00:00.000Z",
    "eventEndsAt": "2025-12-16T17:00:00.000Z",
    "providerTypes": ["all"],
    "createdAt": "2025-12-01T10:00:00Z",
    "updatedAt": "2025-12-01T10:00:00Z"
  }
}

Get Campaign

GET
/campaigns/{campaignId}
Required scope: campaigns:read

Retrieve details of a specific campaign.

Response
{
  "success": true,
  "data": {
    "id": "campaign_abc123",
    "name": "Tech Conference 2025",
    "campaignType": "event",
    "status": "active",
    "campaignData": {
      "location": "San Francisco Convention Center",
      "barcodeType": "qr",
      "barcodeValueStrategy": "auto"
    },
    "startDate": "2025-12-15",
    "endDate": "2025-12-17",
    "eventStartsAt": "2025-12-15T17:00:00.000Z",
    "eventEndsAt": "2025-12-16T17:00:00.000Z",
    "providerTypes": ["all"],
    "createdAt": "2025-12-01T10:00:00Z",
    "updatedAt": "2025-12-01T10:00:00Z"
  }
}

Update Campaign

PATCH
/campaigns/{campaignId}
Required scope: campaigns:write

Update a campaign. Changes automatically propagate to all active wallet cards for this campaign.

Response
{
  "success": true,
  "data": {
    "id": "campaign_abc123",
    "name": "Tech Conference 2025 Updated",
    "status": "active",
    "eventStartsAt": "2025-12-15T17:00:00.000Z",
    "eventEndsAt": "2025-12-16T17:00:00.000Z",
    "updatedAt": "2025-12-01T11:00:00Z"
  }
}

Immutable Settings: Once a campaign has recipients, barcodeValueStrategy becomes immutable and cannot be changed. Attempting to change this setting will return a 400 Bad Request error with code SETTING_LOCKED.

Campaign Status

Campaigns have four possible status values:

Response Fields

StatusDescriptionWhen SetCan Change To
draftCampaign is being set up, not yet launchedInitial status when campaign is createdactive (when first recipient is invited), archived (manual)
activeCampaign is live and has invited recipientsAutomatically set when first recipient is invited, or manually via APIarchived (manual), completed (automatic when eventEndsAt is in the past)
completedEvent window has endedSet automatically by the platform when event_ends_at is before the current time. Cannot be set via PATCH (status: "completed" is rejected).archived (manual)
archivedCampaign is hidden from main listManually set via API or dashboarddraft (via unarchive)

Schedule fields eventStartsAt / eventEndsAt (UTC instants) are returned on campaign resources and are derived from startDate, optional multi-day endDate, campaignData times (doors_open_time, start_time, end_time), and campaignData.timezone.

Delete Campaign

DELETE
/campaigns/{campaignId}
Required scope: campaigns:write

Delete a campaign.

Response
{
  "success": true,
  "data": {
    "id": "campaign_abc123",
    "deleted": true
  }
}