Activations
Activate (export) a completed audience to an endpoint connection, then list, read and delete activations - and preview the frequency filter an activation would apply before you create it. Activation is asynchronous: the create call returns immediately with a new id, and you poll the get endpoint until its datastreams report their output.
All activation endpoints are authenticated and JSON-only. Send Authorization: Bearer <token> and Accept: application/json on every call (plus Content-Type: application/json on the POST create). Reads use the read rate bucket (120
requests/min per caller); create and delete use the write bucket (30 requests/min
per caller).
Create Activation
POST /api/v2/analyses/activations/create
Creates an activation that exports a custom audience owned by your company to a
company-scoped endpoint connection. The audience must be 104 Completed and
hold at least 500 unique devices - the audience read’s
is_activation_allowed field tells you eligibility up front. When it is false,
eligibility.reasons[0].message tells you why (device floor, Affinity device
coverage, retention) and the activation endpoint returns 422 with the same
message. The export is queued asynchronously; poll
GET /api/v2/analyses/activations/{id} for its
status and datastream output.
Auth: bearer token + Accept: application/json + Content-Type: application/json. Rate limit: write bucket (30 requests/min). Optional:
Idempotency-Key header (see below).
Body
| Field | Type | Required | Description |
|---|---|---|---|
audience_id | integer | Yes | The audience to export. Must be owned by your company. |
endpoint_connection_id | integer | Yes | The destination endpoint connection. Must be owned by your company. Resolves the partner, pricing and datastreams server-side. |
pricing_model_id | integer | Yes | A pricing model that Get Pricing Models lists for the connection’s partner and one of the audience’s dataset types (its dataset_types). The activation takes its price. |
description | string | No | A label for the activation (max 255 chars). |
project_id | integer | No | One of your company’s projects to file the activation under. Without it, the activation is filed under the audience’s project. |
credentials | object | No | Caller-supplied destination credentials (see the credentials note). Write-only and sensitive. |
audience_inputs | array | Per partner definitions | Partner account-detail values, index-matched to the connection’s partner.inputs definitions from Get Endpoint Connections. Inputs flagged required must be supplied for every enabled datastream (here or per stream). A bucket and folder prefix follow the delivery bucket rules: a standard bucket name that is not an Intuizi bucket, or your organization’s delivery folder in an Intuizi delivery bucket. |
datastreams | object[] | No | The partner outputs to enable. Each entry is { id, status, compression, inputs, service_account, visualizing_status }. |
datastreams[].inputs | array | Per partner definitions | Per-stream partner input values, index-matched to partner.inputs exactly like audience_inputs (per-stream values win). |
datastreams[].service_account | object | No | The decoded service-account JSON key. Only accepted when the partner defines a file-type input (GCP-style destinations); otherwise rejected. Write-only and sensitive. |
datastreams[].visualizing_status | boolean | No | Whether this stream also feeds visualization. |
datastreams[].id | integer | Required with datastreams | The datastream id (re-resolved server-side through your company’s permitted set). An enabled stream must apply to the audience’s dataset types - each item of Get Datastreams lists its dataset_types, and a lookalike audience counts as cohorts. A mismatch is a 422 naming the stream; it is not silently dropped, because a stream run against the wrong dataset produces a broken file rather than an empty one. |
datastreams[].status | boolean | No | Whether to enable this datastream. |
datastreams[].compression | string | No | Compression for this datastream. |
freq_limit | boolean | With freq_min / freq_max | Enable the frequency filter. The export applies freq_min / freq_max only when this is true, so bounds sent without an explicit freq_limit are rejected - a filter is never applied implicitly. Must be true when filter_hash is sent. |
freq_min | integer | With filter_hash | Lowest distinct visit-day count to export (inclusive). Preview the resulting count first with Preview Activation. |
freq_max | integer | With filter_hash | Highest distinct visit-day count to export (inclusive). |
filter_hash | string | No | The filter_hash returned by Preview Activation for the same audience_id, freq_min and freq_max. Recomputed server-side from the audience as stored now; a different range, or an audience rebuilt since the preview, is rejected - so the export applies exactly what was previewed. Echoed on the activation read. |
limit | integer | No | Result cap. |
distance_limit | boolean | No | Enable the distance limit. |
distance | number | No | Distance value. |
score_limit | boolean | With min_score / max_score | Lookalike Model audiences only: export only a score range. See Activation limits. |
min_score | number | With score_limit true | Lowest score band to export, given as its upper bound: 0.1 to 1.0 in steps of 0.1. 0.7 exports the scores above 0.6. |
max_score | number | With score_limit true | Highest score band to export, given as its upper bound (1.0 keeps the top band). Not below min_score. |
affinity_spend_limit | boolean | With affinity_spend_min / affinity_spend_max | Audiences of one Transactions dataset only: deliver only the people whose spend falls in a range. See Activation limits. |
affinity_spend_min | number | No | Lowest spend per person to deliver, in dollars (included). Omit for no lower bound. |
affinity_spend_max | number | No | Spend per person to stay below, in dollars (excluded), above 0. Omit for no upper bound. |
affinity_txn_limit | boolean | With affinity_txn_min / affinity_txn_max | Audiences of one Transactions dataset only: deliver only the people whose number of transactions falls in a range. |
affinity_txn_min | integer | No | Fewest transactions per person to deliver (included). Omit for no lower bound. |
affinity_txn_max | integer | No | Most transactions per person to deliver (included), at least 1. Omit for no upper bound. |
compression | string | No | Top-level compression. |
price | number | No | Ignored. The activation takes the price of its pricing model. |
notification | boolean | No | Whether to notify on completion. |
partner_id, partner_name and pricing_model are prohibited in the body.
The partner, pricing and datastreams are always derived server-side from the
company-scoped endpoint_connection_id. Sending any of these prohibited fields is
rejected with 422.Activation limits
Besides the frequency filter, an activation can deliver only part of the audience, with the same limits as the Audience Manager. Each needs its flag:
- Score range (
score_limitwithmin_scoreandmax_score), for Lookalike Model audiences. Scores run from 0 to 1 in bands of0.1, and both bounds are band upper bounds:min_score0.7withmax_score1.0exports the scores above0.6, the top four bands. Both bounds are required, each one of0.1,0.2…1.0. - Spend (
affinity_spend_limitwithaffinity_spend_minand / oraffinity_spend_max) and transactions (affinity_txn_limitwithaffinity_txn_minand / oraffinity_txn_max), for audiences made of one Transactions (AffinityTransactions) dataset. They compare each person’s total spend, in dollars, and number of transactions across the transactions the audience matched, as each data provider reports them - the same totals as the Audience Manager’s Limit by Spend / Transactions. Spend includes its minimum and excludes its maximum; transactions include both ends. Leave a bound out to keep that end open. With both limits on, a person must pass both.
These limit what an activation delivers from the built audience. They are not
the Transactions dataset’s spend_min / spend_max / txn_min / txn_max on
Create Audience, which
decide who enters the audience when it is built.
As with freq_limit, nothing is applied or dropped silently: bounds sent
without their flag, a flag set to true without its bounds, and a limit on an
audience it does not apply to are rejected with 422, and so are a bound
that is not a finite number and a range that can match no one (a spend maximum
of 0, a transaction maximum of 0). With a flag set to
false, its bounds are still validated, then not applied. These ranges have
no preview; filters on the activation read echoes what was applied.
{
"audience_id": 93,
"endpoint_connection_id": 12,
"pricing_model_id": 3,
"affinity_spend_limit": true,
"affinity_spend_min": 50,
"affinity_spend_max": 250,
"affinity_txn_limit": true,
"affinity_txn_min": 2
}Caller-supplied credentials
credentials is an optional, write-only and sensitive map of string keys to
simple values (strings, numbers or booleans). It is never logged, never echoed,
and never returned in any response.
- The export is delivered with the partner input values you send:
audience_inputs, and per streaminputsandservice_account. The credentials stored on the endpoint connection are never copied into the activation. - If the connection has no stored credentials and the caller supplies
none, the activation is rejected with
422.
curl -X POST "https://console.intuizi.com/api/v2/analyses/activations/create" \
-H "Authorization: Bearer <YOUR_TOKEN>" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Idempotency-Key: <UNIQUE_KEY>" \
-d '{
"audience_id": 88,
"endpoint_connection_id": 12,
"pricing_model_id": 3,
"description": "Q1 retail export",
"datastreams": [
{ "id": 7, "status": true }
]
}'Index Exchange
For an Index Exchange connection, audience_inputs is index-matched to the connection’s partner.inputs: IX Segment ID, IX Segment Name, IX CPM USD, IX Access.
IX CPM USDis required: a number from 0.01 to 99.99 with at most two decimals. It is the segment’s marketplace CPM on Index Exchange (USD, a flat CPM taken out of the buyer’s bid). It is not the price per identifier that Intuizi charges.IX Accessispublicorprivate. Default:public.- A missing or invalid CPM, an invalid
IX AccessorIX Segment ID, and a CTV audience are refused with 422. The 422messageis exactly one of:Index Exchange: IX CPM USD is required - the segment's marketplace CPM in USD, e.g. 1.35 (rate card: Location 1.35, Apps 1.10, Transactions 1.55).Index Exchange: IX CPM USD must be a number between 0.01 and 99.99 with at most two decimals.Index Exchange: IX Access must be 'public' or 'private'.Index Exchange: CTV audiences cannot be delivered from the console. IX matches CTV on TV device ids, which console exports do not produce. Use the IX segment loader (intuizi-tools).Index Exchange: IX Segment ID must be 1-255 characters with no whitespace.
- An Index Exchange connection needs no credentials. Its
requires_credentialsflag isfalsein Get Endpoint Connections. Only an organization that Index Exchange is enabled for can use it: for any other organization the connection is404. - Create Schedule applies the same rules to its
activationblock and returns the same422texts. A scheduled activation refreshes one segment: once a cycle has registered its segment (taxonomy: "uploaded"), later cycles deliver to thatsegment_id. - The pricing model read shows a
delivery_label, for exampleDevice ID (MAID) -> ie_data/deviceifaorIP address -> ie_data/deviceip. - Get Activation and the
activation.completedwebhook returndelivery.index_exchange, ornullwhen the worker wrote no Index Exchange result. Keys:segment_id,segment_name,match_key,folder,files,rows,taxonomy,delivered_at,cpm_usd,rate_source,access_requested,publication. publicationkeys:state,ix_segment_numeric_id,applied_cpm,applied_access,checked_at,handoff. Thestatevaluepending_manualmeans the file is delivered, and the fee and the publication are still applied by hand on Index Exchange.
Response
The response never includes the endpoint JSON, credentials, result links or
device identifiers. created_by, partner and pricing_model are always
objects (empty {} when they cannot be resolved). filters echoes the
frequency filter the export applies (freq_min / freq_max only apply when
freq_limit is true) and the activation limits under
the body’s names, and filter_hash the preview hash the activation was
created with (null when none was sent).
{
"status": "success",
"code": 201,
"message": "Resource created successfully.",
"data": [
{
"id": 501,
"description": "Q1 retail export",
"status": { "id": 100, "name": "Initiating" },
"audience": { "id": 88, "name": "Coffee Buyers NYC" },
"created_by": { "name": "Jane Doe", "email": "jane.doe@acme.example" },
"project": { "id": 4, "name": "Retail 2025" },
"partner": { "name": "Acme DSP", "description": "Programmatic DSP" },
"pricing_model": { "name": "CPM", "price": 2.5 },
"datastreams": [],
"delivery": { "index_exchange": null },
"filters": {
"freq_limit": false, "freq_min": null, "freq_max": null,
"score_limit": false, "min_score": null, "max_score": null,
"affinity_spend_limit": false, "affinity_spend_min": null, "affinity_spend_max": null,
"affinity_txn_limit": false, "affinity_txn_min": null, "affinity_txn_max": null
},
"filter_hash": null,
"created_at": "2025-02-01 12:00:00",
"updated_at": "2025-02-01 12:00:00"
}
]
}Idempotency
The optional Idempotency-Key header makes a create safe to retry. The key is
caller-generated: any unique string up to 255 characters (a UUID v4 is
typical), one per logical create - reuse it only when retrying that same
request. The first
request with a given key runs normally and the successful (2xx) response is cached
per caller. A retry with the same key and the same body replays the stored
response verbatim with an Idempotency-Replayed: true header, so no duplicate
activation is created. A retry with the same key but a different body returns
409 Conflict. See Idempotency for the full replay
semantics and the eight endpoints that honor the header.
Preview Activation
GET /api/v2/analyses/activations/preview
Read-only dry run of the frequency filter an activation would apply to a
Completed audience. It returns the exact device count the Audience Manager
shows as Limit Audience for the same Freq. Range: the audience’s stored
frequency histogram (distinct visit days -> devices) summed over the inclusive
[freq_min, freq_max] range, which is the same predicate the export applies.
Alongside the count you get the histogram, its valid bounds, the audience total,
the read-only recency window, the audience eligibility and a canonical
filter_hash. Nothing is created, queued, exported, scheduled or billed - call
it once per candidate range.
The audience must be 104 Completed and built with a frequency analysis -
Visitation Frequency, Apps Frequency or Web Frequency in the
Audience Manager, or the matching analyses key on
Create Audience.
Any other audience - a day-part frequency analysis, a lookalike or cohort, an
audience built without a frequency analysis - is refused; the filter is never
approximated. For a worked agent session see
Preview, then Activate.
Recency is not an input: the date window is fixed by the audience definition
and echoed read-only as recency. The preview accepts exactly the three
parameters below; any other parameter is rejected.
Auth: bearer token + Accept: application/json. Rate limit: read bucket
(120 requests/min).
Query parameters
| Field | Type | Required | Description |
|---|---|---|---|
audience_id | integer | Yes | A Completed audience owned by your company, built with exactly one frequency analysis (see Frequency analyses). |
freq_min | integer | Yes | Lowest distinct visit-day count to include (inclusive). Must be at least frequency_bounds.min - 1 for a “1+” range, 2 for “2+”. |
freq_max | integer | Yes | Highest distinct visit-day count to include (inclusive). Must not exceed frequency_bounds.max; use that bound for an open-ended “N+” range. |
curl "https://console.intuizi.com/api/v2/analyses/activations/preview?audience_id=88&freq_min=2&freq_max=5" \
-H "Authorization: Bearer <YOUR_TOKEN>" \
-H "Accept: application/json"Response
filtered_count is exact. source_count is the audience total shown on the
audience itself (an approximate distinct count, about 2.3% standard error) and
histogram_total is the exact sum of the histogram, so the two can differ
slightly; a [1, frequency_bounds.max] range returns histogram_total.
as_of is when the audience’s stored results were last updated.
To activate exactly what was previewed, send the same audience_id, freq_min
and freq_max with freq_limit: true and the returned filter_hash to
Create Activation; the activation read
then echoes both.
{
"status": "success",
"code": 200,
"message": "Resource fetched successfully.",
"data": [
{
"audience": {
"id": 88,
"name": "Coffee Buyers NYC",
"status": { "id": 104, "name": "Completed" },
"is_activation_allowed": true,
"eligibility": {
"allowed": true,
"reasons": [],
"metrics": { "unique_eids": 5100, "unique_scids": null, "eid_scid_ratio": null, "is_affinity": false }
}
},
"dataset_type": "POI",
"analysis_type": "frequency",
"recency": [
{ "dataset_type": "POI", "start_date": "06/01/2026", "end_date": "07/31/2026" }
],
"source_count": 5100,
"histogram_total": 5000,
"filtered_count": 2000,
"frequency_bounds": { "min": 1, "max": 5 },
"histogram": [
{ "index": 1, "counts": 3000 },
{ "index": 2, "counts": 1200 },
{ "index": 3, "counts": 500 },
{ "index": 5, "counts": 300 }
],
"applied_filters": { "freq_limit": true, "freq_min": 2, "freq_max": 5 },
"filter_hash": "sha256:4f9d0c7e1b2a8d3f6e5c4b3a2918f7e6d5c4b3a291807f6e5d4c3b2a19180706",
"method": "histogram_sum",
"as_of": "2026-08-01 06:12:44",
"limitations": [
"filtered_count is the exact number of devices whose distinct visit-day count inside the audience date window falls within [freq_min, freq_max] (both inclusive) - the same figure the Audience Manager shows as Limit Audience for that Freq. Range, and the same predicate the export applies.",
"source_count is the audience total shown on the audience itself (an approximate distinct count, about 2.3% standard error); histogram_total is the exact sum of the frequency histogram, so the two can differ slightly. A [1, max] range returns histogram_total."
]
}
]
}List Activations
GET /api/v2/analyses/activations/index
Lists the activations owned by your company, most recent first, paginated.
Auth: bearer token + Accept: application/json. Rate limit: read bucket (120
requests/min).
Query parameters
| Field | Type | Required | Description |
|---|---|---|---|
per_page | integer | No | Items per page. Defaults to 25, capped at 100. |
page | integer | No | Page number (standard pagination). |
search | string | No | Optional free-text filter on the activation description (case-insensitive contains). |
curl "https://console.intuizi.com/api/v2/analyses/activations/index?per_page=25" \
-H "Authorization: Bearer <YOUR_TOKEN>" \
-H "Accept: application/json"Response
{
"status": "success",
"code": 200,
"message": "Resources fetched successfully.",
"data": {
"items": [
{
"id": 501,
"description": "Q1 retail export",
"status": { "id": 104, "name": "Completed" },
"audience": { "id": 88, "name": "Coffee Buyers NYC" },
"created_by": { "name": "Jane Doe", "email": "jane.doe@acme.example" },
"project": { "id": 4, "name": "Retail 2025" },
"partner": { "name": "Acme DSP", "description": "Programmatic DSP" },
"pricing_model": { "name": "CPM", "price": 2.5 },
"datastreams": [
{ "name": "match_file", "status": "success", "results": { "uri": "s3://bucket/path/output.csv" } }
],
"created_at": "2025-02-01 12:00:00",
"updated_at": "2025-02-02 09:30:00"
}
],
"pagination": {
"current_page": 1,
"per_page": 25,
"total": 1,
"last_page": 1
}
}
}Get Activation
GET /api/v2/analyses/activations/{id}
Retrieves a single activation by id.
The same read is also available at GET /api/v2/my-data/activations/{id} for
backward compatibility; both return the identical response shape.
Auth: bearer token + Accept: application/json. Rate limit: read bucket (120
requests/min).
Path parameters
| Field | Type | Required | Description |
|---|---|---|---|
id | integer | Yes | The activation id to fetch. |
curl "https://console.intuizi.com/api/v2/analyses/activations/501" \
-H "Authorization: Bearer <YOUR_TOKEN>" \
-H "Accept: application/json"Response
Each entry in datastreams[] carries a name, a status, an always-object
results ({ "uri": "s3://..." } or { "gs://..." } when an output file is
available, else {}), and an error string only when the datastream failed.
The name is the stream’s internal slug, not the name
Get Datastreams
prints. The status is success for a delivered stream, failed when it
failed, or skipped when it cannot run on the audience’s data, and the last
two carry an error.
Output URIs are normalized to their s3:// or gs:// form. Storage locations
and URLs are removed from the error, and an error passed through from the query
engine or cloud storage is cut to its first sentence, which states the reason.
{
"status": "success",
"code": 200,
"message": "Resource fetched successfully.",
"data": [
{
"id": 501,
"description": "Q1 retail export",
"status": { "id": 104, "name": "Completed" },
"audience": { "id": 88, "name": "Coffee Buyers NYC" },
"created_by": { "name": "Jane Doe", "email": "jane.doe@acme.example" },
"project": { "id": 4, "name": "Retail 2025" },
"partner": { "name": "Acme DSP", "description": "Programmatic DSP" },
"pricing_model": { "name": "CPM", "price": 2.5 },
"datastreams": [
{
"name": "match_file",
"status": "success",
"results": { "uri": "s3://bucket/path/output.csv" }
}
],
"delivery": { "index_exchange": null },
"filters": {
"freq_limit": true, "freq_min": 2, "freq_max": 5,
"score_limit": false, "min_score": null, "max_score": null,
"affinity_spend_limit": false, "affinity_spend_min": null, "affinity_spend_max": null,
"affinity_txn_limit": false, "affinity_txn_min": null, "affinity_txn_max": null
},
"filter_hash": "sha256:4f9d0c7e1b2a8d3f6e5c4b3a2918f7e6d5c4b3a291807f6e5d4c3b2a19180706",
"created_at": "2025-02-01 12:00:00",
"updated_at": "2025-02-02 09:30:00"
}
]
}delivery.index_exchange is null unless the activation went to Index
Exchange and the export reached it. An Index Exchange activation reads:
"delivery": {
"index_exchange": {
"segment_id": "intuizi_5495",
"segment_name": "Intuizi - Brooks Running visitors L90",
"match_key": "device_id",
"folder": "ie_data/deviceifa",
"files": ["s3://ix-bucket/ie_data/deviceifa/20261010120000.append.csv.gz"],
"rows": 8297,
"taxonomy": "uploaded",
"delivered_at": "2026-10-10T12:00:41Z",
"cpm_usd": "1.35",
"rate_source": "operator",
"access_requested": "public",
"publication": {
"state": "pending_manual",
"ix_segment_numeric_id": null,
"applied_cpm": null,
"applied_access": null,
"checked_at": null,
"handoff": "In the Index Exchange UI > Segments > intuizi_5495 > Permissions & Fees: set Public, Standard fee 1.35 USD CPM. IX lists new segments about 2-5 h after delivery."
}
}
}taxonomy is uploaded when the export registered a new segment, or
skipped (existing segment) when the activation reused the IX Segment ID
you supplied.
Delete Activation
POST /api/v2/analyses/activations/delete-by-id
Soft-deletes an activation.
Auth: bearer token + Accept: application/json + Content-Type: application/json. Rate limit: write bucket (30 requests/min).
Body
| Field | Type | Required | Description |
|---|---|---|---|
id | integer | Yes | The activation id to delete. Must be owned by your company. |
curl -X POST "https://console.intuizi.com/api/v2/analyses/activations/delete-by-id" \
-H "Authorization: Bearer <YOUR_TOKEN>" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{ "id": 501 }'Response
{
"status": "success",
"code": 200,
"message": "Resource deleted successfully.",
"data": []
}