The Future Demand API uses a handful of short identifiers that show up everywhere. This page is the reference for what they mean.

At a glance

NameStands forExampleWhere it comes from
partner_idPartner / tenantpartner-id-acme, fd123Cognito cognito:groups claim on IdToken
client_idSame entity, internal numeric form1042id field in GET /partners/ response
user_id / subCognito user subjectb1e2...Cognito sub claim on IdToken
eidEvent idevt_abc123 (or numeric)id field in GET /events/ items
tcTaste cluster namefamily_outings_munichtc field on cluster + campaign entities
tc_run_idTaste cluster run42tc_run_id field on the same entities
cidCampaign id (composite)42_evt_abc123_family-outings-munichComputed client-side
audience_idSaved audience (Wave)aud_777Returned from POST /setup_processes/.../boost
package_idPackage Builder packagepkg_555Returned from POST /package_builder/packages
tc_run_id ∈ packageCluster generation inside a package42Embedded in package payload

Identifier rules

partner_id

  • Always present on a Cognito-authenticated user’s cognito:groups claim.
  • Pattern: partner-id-<slug> or fd<digits> for legacy partners.
  • Send as X-Preferred-Partner-Id header on every authenticated request.
  • Immutable for the lifetime of the partner.

client_id

  • Returned as id from GET /partners/.
  • Same entity as partner_id but in an internal numeric/string form.
  • Required only by a few legacy endpoints; prefer partner_id wherever both are accepted.

eid (event id)

  • Returned as id on every event payload. The reference webapp aliases it to eid when constructing URLs (api/events.js:12,179).
  • Used as a path segment: /events/{eid}/..., /setup_processes/{eid}, /campaigns/{eid}/....
  • Stable for the life of the event. Renaming or rescheduling the event does not change it.

tc (taste cluster)

  • A string label for a cluster, scoped to one event + one run.
  • Used as a path segment for per-cluster operations: /package_builder/packages/{packageId}/{tc}/customer_list, /campaigns/{eid}/{tc}/{tc_run_id}/creative.
  • May contain spaces or hyphens — URL-encode in path segments.
  • The reference webapp slugifies it (tc.replace(/\s+/g, "-")) when composing cid, but does not slugify it when sending as a path segment to per-cluster endpoints. Mirror that.

tc_run_id

  • Integer (or short string) identifying one generation of the cluster set for an event.
  • Old runs remain readable so existing campaigns stay valid. A new run does not invalidate older runs.
  • When listing clusters for an event, you’ll typically receive the latest run. Campaigns store the run they were created against — preserve it.

cid (campaign id)

  • Computed client-side as ${tc_run_id}_${eid}_${tc-slug} (see webapp/src/api/campaigns.js:54).
  • Used to navigate within your own UI; the API mostly accepts the three components separately as path segments. Don’t send cid as a single parameter unless the endpoint explicitly wants it.

audience_id / saved_audience_id

  • Issued by the upstream ad platform (e.g. Meta) once a Wave campaign is published. Surfaced back as audience_id on campaign records and saved_audience_id on per-cluster edits.

package_id

  • Returned from POST /package_builder/packages as { id }. Use it for every subsequent operation on the package (status poll, content fetch, CSV download, regenerate).

Special partner identifiers

Some Cognito groups grant elevated capability:
GroupCapability
fd-adminPlatform admin — can act across partners. Never expose admin-only endpoints in your UI.
back-office-adminSame scope, narrower role.
webapp-access-group-<N>Access tier within the reference webapp; safe to ignore.
account-disabledReject login.
external-userReject login (not allowed in first-party apps).

Common pitfalls

cid is composed from a slugified tc. But the path-segment usage in /campaigns/{eid}/{tc}/{tc_run_id}/... and /package_builder/packages/{packageId}/{tc}/customer_list uses the raw tc (URL-encoded). Mixing the two produces 404s.
A campaign is uniquely identified by (eid, tc, tc_run_id) — all three are required for any per-campaign mutation. If you only persist (eid, tc) client-side, you’ll silently target the wrong run after the next refresh.
For endpoints with a partner_id query param, send the public partner id. For endpoints documented to expect client_id, read it from GET /partners/. Don’t substitute.
The API accepts both; partners that mix the two in URL building (/events/${eid} with eid coerced to number) lose leading-zero or prefix-style ids. Treat eid as an opaque string.