Schedules
Schedules turn a one-off audience into a recurring one. A schedule clones the definition of a completed audience at creation time and, on every cycle, rebuilds that audience over a rolling data window - optionally re-exporting the result to one of your endpoint connections, exactly like a one-off activation. This is the same Scheduler your team uses in the Audience Manager (Analyses - Scheduler).
Schedules are a gated capability: they require additional permissions which need to be approved by your Account Manager.
All schedule endpoints are authenticated and JSON-only. Send Authorization: Bearer <token> and Accept: application/json on every call (plus
Content-Type: application/json on the POSTs). Reads use the read rate bucket
(120 requests/min per caller); writes use the write bucket (30 requests/min per
caller). Every endpoint is scoped to your own company; a schedule belonging to
another company is reported as not found.
How schedules work
Cycles. Each cycle the platform creates a fresh audience named
<schedule name> - #<cycle number> from the stored definition, restamped to
that cycle’s data window. Origin data is weekly, so an Origin dataset’s window
is widened to the whole Monday-to-Sunday weeks it touches, the same widening
Create Audience applies. A
cross purchase block is
not restamped: it keeps the dates it was built with, so every cycle reports
purchases over the same window. The produced audiences appear in
List Audiences
and follow the normal audience lifecycle (104 Completed is the only
success). When the schedule carries an activation block, the export is created
automatically once the cycle’s audience completes, but only when that audience
passes the activation checks for the schedule’s pricing model and your
organization is under its monthly data-scan limit. Otherwise the cycle is not
exported, and the schedule read does not say so.
Data-scan limit. A cycle that falls while your organization is over its
monthly data-scan limit is skipped: no audience is built, nothing is exported,
and the schedule’s owner gets a notification. The Custom Date ending counts a
skipped cycle as one of its runs, so the schedule makes fewer runs. The
Recurrences ending does not count it, so the schedule still makes every run
and finishes later.
Data windows. recurrence.window_type picks how the window is derived each
cycle - fetch the valid values from
Get Schedule Windows.
Rolling windows (for example Last 7 Days, Last 30 Days, Custom) end three
days before the run time, allowing signal deliveries to settle; calendar
windows (Last Full Month, Last 3 Full Months) cover the full prior calendar
months. The Custom window uses your own day count via
recurrence.window_days.
Endings. recurrence.ending.type picks when the recurrence stops - fetch
the valid values from
Get Schedule Endings.
A schedule can run forever, stop after a fixed number of recurrences, or stop
at a date. When the ending condition is met the schedule becomes Fulfilled.
Schedule status. A schedule is Active (running), Deactivated (paused
via Deactivate) or Fulfilled (its
ending condition was met). This status is the schedule’s own lifecycle - it is
distinct from the status of the audiences the schedule produces.
Settings are fixed at creation. A schedule’s definition snapshot, recurrence and activation settings cannot be edited afterwards - delete the schedule and create a new one to change them. Deleting the source audience later does not affect the schedule (the definition is a copy).
Credentials. Unlike
Create Activation,
a schedule never accepts credentials. Each scheduled export is delivered
with the partner input values the schedule stores (activation.audience_inputs,
and per stream inputs and service_account). The credentials stored on the
referenced endpoint connection are not copied into the exports, so changing
them does not change the schedule.
Create Schedule
POST /api/v2/analyses/schedules/create
Creates a schedule from an existing completed audience owned by your company
and arms the first run. Omit activation for a refresh-only schedule (the
audience is rebuilt every cycle but nothing is exported).
Auth: bearer token + Accept: application/json + Content-Type: application/json. Rate limit: write bucket (30 requests/min). Optional:
Idempotency-Key header (see Audiences).
Body
| Field | Type | Required | Description |
|---|---|---|---|
name | string | Yes | Schedule name (letters, numbers, spaces, hyphens and underscores; max 255). Cycle audiences are named <name> - #<cycle>. |
audience_id | integer | Yes | The audience to make recurring. Must be owned by your company and completed, and every cohort it was built from must be your company’s own. Its definition is snapshotted server-side. Its first cycle must be one your account can build: its dataset types and analyses, and for a Deidentified audience the first data window (at most two weeks with USA, no earlier than the look-back), are checked as Create Audience checks them, or the schedule is refused (see Errors). |
project_id | integer | No | Project folder to file the schedule under (see Projects). |
recurrence | object | Yes | The cadence, window and ending settings below. |
recurrence.start | string | Yes | First run time, Y-m-d H:i:s, interpreted in recurrence.timezone. Must be in the future. |
recurrence.timezone | string | Yes | IANA timezone identifier the recurrence runs in (for example America/New_York). |
recurrence.frequency | string | Yes | Cadence value - fetch valid values from Get Schedule Frequencies. |
recurrence.window_type | integer | Yes | Data window id - fetch valid values from Get Schedule Windows. |
recurrence.window_days | integer | Conditional | The day count for the Custom window (1-365). Required with that window, not accepted with any other. |
recurrence.ending.type | integer | Yes | Ending id - fetch valid values from Get Schedule Endings. |
recurrence.ending.after_recurrences | integer | Conditional | Number of cycles to run. Required with the Recurrences ending, not accepted with any other. |
recurrence.ending.end_date | string | Conditional | The date the recurrence ends, Y-m-d, on or after the date of recurrence.start. Required with the Custom Date ending, not accepted with any other. It is turned into a cycle count when the schedule is created: the cycle at recurrence.start plus every later cycle that starts by 00:00 on this date. daily, weekly, and bi-weekly cycles are 1, 7, and 14 days apart: weekly from 2026-10-15 06:00:00 to 2027-01-01 runs 12 cycles. monthly cycles are one calendar month apart, on the start’s day of the month, or on the last day of a shorter month and on that day from then on: monthly from 2026-10-15 06:00:00 to 2027-10-15 runs 12 cycles, the last on 2027-09-15. |
activation | object | No | Auto-export settings for every cycle. Omit for a refresh-only schedule. |
activation.endpoint_connection_id | integer | Yes, with activation | The endpoint connection to export to - fetch yours from Get Endpoint Connections. The partner and its input definitions are resolved from the connection. |
activation.pricing_model_id | integer | Yes, with activation | A pricing model that Get Pricing Models lists for the connection’s partner and one of the audience’s dataset types (its dataset_types). Each scheduled activation takes its price. |
activation.audience_inputs | array | No | Partner account-detail values, index-matched to the connection’s partner.inputs definitions (same contract as Create Activation, the delivery bucket rules included). |
activation.datastreams | array | No | The partner outputs to enable: { id, status, compression, inputs, service_account, visualizing_status } per stream. Per-stream inputs fall back to audience_inputs. |
activation.limit | integer | No | Maximum devices to export per cycle. Omit or 0 to export the full audience. |
activation.price | number | No | Ignored. Each scheduled activation takes the price of activation.pricing_model_id when it runs. |
activation.freq_limit | boolean | No | Enable the visit-frequency range filter on each export. |
activation.freq_min | integer | No | Minimum visit frequency (with freq_limit). |
activation.freq_max | integer | No | Maximum visit frequency (with freq_limit). |
activation.affinity_spend_limit | boolean | With activation.affinity_spend_min / activation.affinity_spend_max | Audiences of one Transactions dataset only: each export delivers only the people whose spend falls in a range, as on Create Activation. |
activation.affinity_spend_min | number | No | Lowest spend per person to deliver, in dollars (included). |
activation.affinity_spend_max | number | No | Spend per person to stay below, in dollars (excluded). |
activation.affinity_txn_limit | boolean | With activation.affinity_txn_min / activation.affinity_txn_max | Audiences of one Transactions dataset only: each export delivers only the people whose number of transactions falls in a range. |
activation.affinity_txn_min | integer | No | Fewest transactions per person to deliver (included). |
activation.affinity_txn_max | integer | No | Most transactions per person to deliver (included). |
activation.compression | string | No | Output compression. Defaults to gzip. |
activation.credentials is not accepted (see
How schedules work); activation.partner_id,
activation.partner_name and activation.pricing_model are server-resolved
from the connection and not accepted either.
An Index Exchange activation follows the
Index Exchange rules of
Create Activation: a missing or invalid IX CPM USD, an invalid IX Access or
IX Segment ID, or a CTV audience is refused with the same 422 texts.
curl -X POST "https://console.intuizi.com/api/v2/analyses/schedules/create" \
-H "Authorization: Bearer <YOUR_TOKEN>" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Idempotency-Key: <UNIQUE_KEY>" \
-d '{
"name": "Weekly Coffee Refresh",
"audience_id": 8891,
"project_id": 12,
"recurrence": {
"start": "2026-08-01 09:00:00",
"timezone": "America/New_York",
"frequency": "weekly",
"window_type": 4,
"ending": { "type": 2, "after_recurrences": 12 }
},
"activation": {
"endpoint_connection_id": 12,
"pricing_model_id": 3,
"audience_inputs": ["acme-advertiser"],
"datastreams": [
{ "id": 7, "status": true, "compression": "gzip" }
]
}
}'Response
recurrence.cycles is the live cycle bookkeeping: done counts completed
cycles, available is how many the ending allows, last_run / next_run
carry the previous and upcoming data windows (m/d/Y dates) and the upcoming
run time. last_run is null before the first cycle; next_run is null
once the schedule is fulfilled.
{
"status": "success",
"code": 201,
"message": "Resource created successfully.",
"data": [
{
"id": 42,
"name": "Weekly Coffee Refresh",
"status": { "id": 1, "name": "Active" },
"source_audience": { "id": 8891, "name": "Coffee visitors L30" },
"project": { "id": 12, "name": "Retail 2026" },
"created_by": { "name": "Jane Doe", "email": "jane@acme.com" },
"recurrence": {
"start": "2026-08-01 09:00:00",
"timezone": "America/New_York",
"frequency": "weekly",
"window": { "id": 4, "name": "Last 30 Days" },
"window_days": null,
"ending": { "type": 2, "after_recurrences": 12, "end_date": null },
"cycles": {
"done": 0,
"available": 12,
"last_run": null,
"next_run": {
"time": "08/01/2026 09:00",
"date_start": "06/30/2026",
"date_end": "07/29/2026"
}
}
},
"activation": {
"enabled": true,
"partner": { "name": "The Trade Desk", "description": "Programmatic advertising platform" },
"pricing_model": { "name": "CPM", "price": 1.5 },
"datastreams": [ { "name": "S3", "compression": "gzip" } ]
},
"created_at": "2026-07-21 10:00:00",
"updated_at": "2026-07-21 10:00:00"
}
]
}List Schedules
GET /api/v2/analyses/schedules/index
Lists the schedules owned by your company, most recent first, paginated. Each item has the same shape as the create response.
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 schedule name (case-insensitive contains). |
Response
{
"status": "success",
"code": 200,
"message": "Resources fetched successfully.",
"data": {
"items": [
{ "id": 42, "name": "Weekly Coffee Refresh", "status": { "id": 1, "name": "Active" } }
],
"pagination": { "current_page": 1, "per_page": 25, "total": 1, "last_page": 1 }
}
}Get Schedule
GET /api/v2/analyses/schedules/{id}
Fetches one schedule owned by your company, in the same shape as the create response.
Auth: bearer token + Accept: application/json. Rate limit: read bucket
(120 requests/min).
Path parameters
| Field | Type | Required | Description |
|---|---|---|---|
id | integer | Yes | The schedule id to fetch. Must be owned by your company. |
Activate Schedule
POST /api/v2/analyses/schedules/activate
Sets the schedule Active and, when its recurrence is no longer armed (a
deactivation outlasted the pending run), re-arms it: the next run is rolled
forward from now on the stored cadence, with the data window restamped to
match. A schedule whose ending condition has already been met is not re-armed.
Responds with the updated schedule in the create response shape.
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 schedule id to activate. Must be owned by your company. |
Deactivate Schedule
POST /api/v2/analyses/schedules/deactivate
Pauses the schedule: upcoming cycles are skipped until it is activated again. Audiences and activations already produced are untouched, and a cycle already building when you deactivate still completes and, with an activation block, is still exported. Responds with the updated schedule in the create response shape.
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 schedule id to deactivate. Must be owned by your company. |
Delete Schedule
POST /api/v2/analyses/schedules/delete-by-id
Deletes one schedule owned by your company. The recurrence stops; audiences and activations already produced by the schedule keep working exactly as before. To change a schedule’s settings, delete it and create a new one.
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 schedule id to delete. Must be owned by your company. |
Response
{
"status": "success",
"code": 200,
"message": "Resource deleted successfully.",
"data": []
}