GET /api/v1/campaigns/:campaign_id
Purpose
GET /api/v1/campaigns/:campaign_id returns one campaign detail object in the
same shape as a campaign list row, plus detail-only fields:
descriptionofferingplayers_engagedassociationsfor CRM bonus campaigns
Query parameters
| Query param | Meaning | Notes |
|---|---|---|
campaign_id | Required path parameter | Synthetic campaign ID such as crm_bonus:<bonus_id> or crm_reactive:<flow_id> |
tenant_id | Optional tenant scope | Narrows the in-memory campaign lookup to the tenant-scoped record set |
Data sources
Campaign detail does not hit a special detail table. It rebuilds the same merged campaign record set used by the list endpoint, then returns the matching record.
That means detail data comes from the same sources as the list:
- CRM
lifecycle_pools - CRM
content_pools - CRM
bonuses - CRM
content - CRM
reward_log - CRM
actions_log - Notify Triggers
flows_v2 - Notify Triggers
flow_versions_v2 - Notify Triggers
flow_runs_v2 - Notify Triggers
flow_working_copies_v2 - Notify Triggers
flow_release_attempts_v2 - Spark Bonus
dispatches
If no matching record is found, the endpoint returns 404.
Shared fields
Every field described for GET /api/v1/campaigns row items also applies here:
- identity
- title
- status
- type
- benefits
- scope
- channels
campaign_originui_status
Detail-only fields
| Field | How it is filled | Source or derivation |
|---|---|---|
description | Human-readable detail text | CRM text placeholders or wager/title fallbacks; trigger flow description or name |
offering | Lightweight name/kind object | CRM uses {name, kind:"bonus"}; trigger uses {name, kind:"automation"} |
players_engaged | Activated-player count | Unique activated-player attribution derived from CRM reward usage or Spark dispatches |
associations | CRM lifecycle route metadata | Stage, content-pool ID, scope, type, channels, and lifecycle readiness for each route |
CRM detail mapping
For CRM-backed campaigns, each detail record represents exactly one bonus ID:
titleprefers localizedbonus_component.component.art_bundle.titleoffering.nameprefersbonus_available.title, thenbonus_available.internal_namedescriptionprefers cleaned text placeholders like email subject/body, then wager art/title fallbacksimage_urlcomes from content placeholders such ashero_banner_image_urlstart_atandend_atcome from that bonus, not from an aggregate across its content poolassociationspreserves every lifecycle stage and content pool that references the bonus
Trigger detail mapping
For trigger-backed campaigns:
titlecomes fromflows_v2.namedescriptioncomes fromflows_v2.description, thennameoffering.namemirrors the flow namechannelscome from notification action refs on the selected flow version
The selected flow version is:
- the released version, when it exists and contains notification actions
- otherwise the newest version that contains notification actions
Truth gaps to keep in mind
offeringis currently a minimal map, not a richer typed model.- CRM titles and descriptions use fallback heuristics across localized bonus and content metadata.