Skip to content

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: it would have to retain them for the life of the recurrence. Each scheduled export authenticates with the credentials stored on the referenced endpoint connection at the moment it runs - keep them current in the console.

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

FieldTypeRequiredDescription
namestringYesSchedule name (letters, numbers, spaces, hyphens and underscores; max 255). Cycle audiences are named <name> - #<cycle>.
audience_idintegerYesThe audience to make recurring. Must be owned by your company and completed. Its definition is snapshotted server-side.
project_idintegerNoProject folder to file the schedule under (see Projects).
recurrenceobjectYesThe cadence, window and ending settings below.
recurrence.startstringYesFirst run time, Y-m-d H:i:s, interpreted in recurrence.timezone. Must be in the future.
recurrence.timezonestringYesIANA timezone identifier the recurrence runs in (for example America/New_York).
recurrence.frequencystringYesCadence value - fetch valid values from Get Schedule Frequencies.
recurrence.window_typeintegerYesData window id - fetch valid values from Get Schedule Windows.
recurrence.window_daysintegerConditionalThe day count for the Custom window (1-365). Required with that window, not accepted with any other.
recurrence.ending.typeintegerYesEnding id - fetch valid values from Get Schedule Endings.
recurrence.ending.after_recurrencesintegerConditionalNumber of cycles to run. Required with the Recurrences ending, not accepted with any other.
recurrence.ending.end_datestringConditionalThe 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.
activationobjectNoAuto-export settings for every cycle. Omit for a refresh-only schedule.
activation.endpoint_connection_idintegerYes, with activationThe 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_idintegerYes, with activationA pricing model available for the connection’s partner - fetch from Get Pricing Models.
activation.audience_inputsarrayNoPartner account-detail values, index-matched to the connection’s partner.inputs definitions (same contract as Create Activation).
activation.datastreamsarrayNoThe partner outputs to enable: { id, status, compression, inputs, service_account, visualizing_status } per stream. Per-stream inputs fall back to audience_inputs.
activation.limitintegerNoMaximum devices to export per cycle. Omit or 0 to export the full audience.
activation.pricenumberNoThe export cost figure recorded on each activation.
activation.freq_limitbooleanNoEnable the visit-frequency range filter on each export.
activation.freq_minintegerNoMinimum visit frequency (with freq_limit).
activation.freq_maxintegerNoMaximum visit frequency (with freq_limit).
activation.compressionstringNoOutput 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.

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" }
      ],
      "price": 1250.00
    }
  }'

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

FieldTypeRequiredDescription
per_pageintegerNoItems per page. Defaults to 25, capped at 100.
pageintegerNoPage number (standard pagination).
searchstringNoOptional 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

FieldTypeRequiredDescription
idintegerYesThe 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

FieldTypeRequiredDescription
idintegerYesThe 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

FieldTypeRequiredDescription
idintegerYesThe 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

FieldTypeRequiredDescription
idintegerYesThe schedule id to delete. Must be owned by your company.

Response

{
  "status": "success",
  "code": 200,
  "message": "Resource deleted successfully.",
  "data": []
}