Skip to content

Create an audience

POST
/v1/audiences
curl --request POST \
--url https://dev-api.infiniteaudience.ai/v1/audiences \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{ "name": "West Coast Adults 25-44", "segment_refs": [ { "segment_id": "seg_abc123", "role": "include" }, { "segment_id": "seg_def456", "role": "include" }, { "segment_id": "seg_sup789", "role": "exclude" } ], "set_logic": "union" }'

Creates a named audience — a subtype-agnostic composition wrapper that references one or more segments (include or exclude role) for delivery.

Audiences are always status: active immediately on creation. The underlying segments determine data readiness — only deliver an audience after all its include-role segments are active.

Composition options:

  • Use segment_refs (preferred) to specify each segment and its role (include or exclude) explicitly.

  • Use segment_ids / excluded_segment_ids (convenience shorthand) as a flat list when all included segments share the same include role.

  • Use set_logic to control how multiple include-role segments are combined: union (default) — a record matches ANY included segment (OR) — or intersection — a record must match EVERY included segment (AND).

  • Excluded segments are always subtracted from the composed include result (AND NOT), regardless of set_logic: result = (included segments combined by set_logic) MINUS (excluded segments).

To create matched, similarity, or propensity segments, use POST /v1/segments. Requires ‘purchase’ scope.

Media typeapplication/json
object
name
required

Display name for the audience.

string
>= 1 characters <= 120 characters
segment_refs

Preferred composition format. Each entry specifies a segment and its role. Supersedes segment_ids / excluded_segment_ids if provided.

Array<object>
object
segment_id
required
string
role
required
string
Allowed values: include exclude
segment_ids

Convenience shorthand: IDs of segments to include (role: include). Use segment_refs for mixed include/exclude compositions.

Array<string>
excluded_segment_ids

Convenience shorthand: IDs of segments to exclude from the composition.

Array<string>
set_logic

How to combine the include-role segments. Exclusions always apply as AND NOT.

string
default: union
Allowed values: union intersection
visibility

Org (default) — visible to all members of the org. private — visible only to the creating user.

string
Allowed values: org private
campaign_id

Optional. If provided, the created audience is automatically linked to this campaign. The audience can belong to at most one campaign at a time. Omit if you are not using campaign workspaces.

string
Examples

Audience with explicit segment roles

{
"name": "West Coast Adults 25-44",
"segment_refs": [
{
"segment_id": "seg_abc123",
"role": "include"
},
{
"segment_id": "seg_def456",
"role": "include"
},
{
"segment_id": "seg_sup789",
"role": "exclude"
}
],
"set_logic": "union"
}

Audience created.

Media typeapplication/json
object
audience_id
required
string
name
required
string
status
required

Active = ready for delivery; archived = soft-deleted via PATCH status:archived (excluded from list by default); expired = past 90-day TTL. Note: pending/failed statuses belong on segments, not audiences.

string
Allowed values: active archived expired
version
required
integer
quote_id

ID of the most recent delivery quote for this audience.

string | null
quote_total_cents

Total cost in cents from the most recent delivery quote.

integer | null
parent_audience_id

ID of the audience this was forked from (null if not a fork).

string | null
forked_from_snapshot_version

Snapshot version of the parent audience at the time of forking.

integer | null
linked_campaign_id

ID of the campaign this audience is linked to, if any.

string | null
record_count

Total resolved records across all composed segments.

integer | null
matched_record_count

Records contributed by matched-subtype segments in this audience’s composition. Present only when the composition includes at least one included matched segment; null for pure-filter or non-matched compositions.

integer | null
match_count

Records resolved to a known identity, for an audience created via the direct file-upload flow (POST /v1/match/file). Populated when that upload’s matching pipeline completes; null before then or for audiences not created that way — use matched_record_count for a composition-level matched count instead.

integer | null
input_record_count

Rows in the originally uploaded identity file, for an audience created via POST /v1/match/file. Same population conditions as match_count.

integer | null
match_rate

Match_count / input_record_count, rounded to 4 decimal places. Null unless both match_count and input_record_count are present.

number | null
expires_at
required

ISO date — 90-day hard expiry from creation

string
version_created_at
string | null
visibility
required

Org (default) — visible to all members of the org. private — visible only to the creating user.

string
Allowed values: org private
segment_refs
required

Composition of segments that define this audience. Each entry specifies a segment and its role (include or exclude) in the set operation.

Array<object>
object
segment_id
required

ID of the referenced segment.

string
role
required

Whether the segment’s records are included in or excluded from the audience.

string
Allowed values: include exclude
segment_ids

Cache of include-role segment IDs (denormalized from segment_refs for query efficiency).

Array<string>
excluded_segment_ids

Cache of exclude-role segment IDs (denormalized from segment_refs for query efficiency).

Array<string>
segments
required

Expanded summaries of the include-role segments, in segment_ids order. Populated on both list and single-GET responses. Best-effort — missing or deleted segment docs are skipped, so this array may be shorter than segment_ids.

Array<object>

Lightweight summary of a constituent segment, expanded server-side from the audience’s composition. Returned on both list and single-GET audience responses. subtype is the segment’s own subtype — use the first entry of segments (the primary included segment) to derive subtype-specific presentation for the audience.

object
id
required

Segment document ID.

string
name
required

Segment display name.

string
record_count
required

Cached record count of the segment. Null if never counted.

integer | null
subtype
required

Subtype of the constituent segment.

string
Allowed values: filter matched similarity propensity
input_record_count
required

Matched subtype only. Count of records in the uploaded identity file. Null otherwise.

integer | null
match_count
required

Matched subtype only. Count of records successfully matched. Null otherwise.

integer | null
excluded_segments
required

Expanded summaries of the exclude-role segments, in excluded_segment_ids order. Same expansion semantics as segments.

Array<object>

Lightweight summary of a constituent segment, expanded server-side from the audience’s composition. Returned on both list and single-GET audience responses. subtype is the segment’s own subtype — use the first entry of segments (the primary included segment) to derive subtype-specific presentation for the audience.

object
id
required

Segment document ID.

string
name
required

Segment display name.

string
record_count
required

Cached record count of the segment. Null if never counted.

integer | null
subtype
required

Subtype of the constituent segment.

string
Allowed values: filter matched similarity propensity
input_record_count
required

Matched subtype only. Count of records in the uploaded identity file. Null otherwise.

integer | null
match_count
required

Matched subtype only. Count of records successfully matched. Null otherwise.

integer | null
set_logic

How the include-role segments are combined: union = a record matches ANY included segment (OR); intersection = a record must match EVERY included segment (AND). Segments in excluded_segment_ids are always subtracted from that result (AND NOT), regardless of set_logic.

string
Allowed values: union intersection
created_at
required
string format: date-time
updated_at
required
string format: date-time
Examples
Examplecreated

Audience created

{
"audience_id": "aud_abc123",
"name": "West Coast Adults 25-44",
"status": "active",
"version": 1,
"record_count": null,
"expires_at": "2026-09-27",
"visibility": "org",
"segment_refs": [
{
"segment_id": "seg_abc123",
"role": "include"
},
{
"segment_id": "seg_def456",
"role": "include"
}
],
"segment_ids": [
"seg_abc123",
"seg_def456"
],
"excluded_segment_ids": [],
"segments": [
{
"id": "seg_abc123",
"name": "West Coast States",
"record_count": 1204331,
"subtype": "filter",
"input_record_count": null,
"match_count": null
},
{
"id": "seg_def456",
"name": "Adults 25-44",
"record_count": 8443210,
"subtype": "filter",
"input_record_count": null,
"match_count": null
}
],
"excluded_segments": [],
"set_logic": "union",
"created_at": "2026-06-22T18:00:00Z",
"updated_at": "2026-06-22T18:00:00Z"
}

Invalid request — malformed body, missing required attribute, or failed validation. See error and message for details.

Media typeapplication/json
object
error
required

Stable machine-readable error code (e.g. INVALID_STATUS_TRANSITION, BILLING_INSUFFICIENT_BALANCE). Always present.

string
message

Human-readable explanation of the error.

string
code

Alternate machine-readable code — present on some endpoints as an alias for error for backward compatibility.

string
request_id

Opaque support/debug identifier when available.

string
key
additional properties
any
Examples
Examplevalidation_error
{
"error": "Bad Request",
"code": "MISSING_SEGMENTS",
"message": "segment_ids is required for filter audiences."
}

Missing or invalid Bearer token. Obtain one via POST /v1/auth/token. When a token was supplied but rejected, code distinguishes TOKEN_EXPIRED (the token’s lifetime has passed — request a new one via POST /v1/auth/token and retry) from TOKEN_INVALID (malformed or revoked — re-authenticate).

Media typeapplication/json
object
error
required

Stable machine-readable error code (e.g. INVALID_STATUS_TRANSITION, BILLING_INSUFFICIENT_BALANCE). Always present.

string
message

Human-readable explanation of the error.

string
code

Alternate machine-readable code — present on some endpoints as an alias for error for backward compatibility.

string
request_id

Opaque support/debug identifier when available.

string
key
additional properties
any
Examples
{
"error": "Unauthorized: Missing or invalid Authorization header"
}

Token is valid but lacks the required scope for this endpoint. Check the endpoint description for the required scope (discovery, purchase, or account).

Media typeapplication/json
object
error
required

Stable machine-readable error code (e.g. INVALID_STATUS_TRANSITION, BILLING_INSUFFICIENT_BALANCE). Always present.

string
message

Human-readable explanation of the error.

string
code

Alternate machine-readable code — present on some endpoints as an alias for error for backward compatibility.

string
request_id

Opaque support/debug identifier when available.

string
key
additional properties
any
Examples
Examplemissing_scope
{
"error": "SCOPE_REQUIRED",
"message": "This endpoint requires the purchase scope."
}