---
title: "Create a delivery"
method: POST
path: "/deliveries"
tags: ["Deliveries"]
---

# Create a delivery

`POST /deliveries`

## Request

- Base URL: `https://api.indexone.io`
- URL: `https://api.indexone.io/deliveries`
- Auth: API key in header `x-api-key` and API key in header `Authorization`

Creates a delivery rule: a schedule plus a payload plus a destination. Deliveries are workflow-engine rows in their own table and are picked up by the same execution coordinator as workflows, so a delivery behaves exactly like a workflow at runtime.

A delivery **is** an ordinary workflow: `operations` is a plain list of operation nodes, exactly as a workflow stores them, and nothing is expanded at run time. Two shapes cover everything:

- **Standard** — `trigger -> index_panel -> send_<channel>`, where the channel is `send_email`, `send_webhook`, `send_sftp` or `send_s3`. The trigger is `index_event_trigger` (fires when a target index publishes `value_eod`, `universe`, `weighting` or `holdings`), `trigger` (cron) or `manual_trigger`. The console's one-click form writes and reads back exactly these nodes, so the workflow builder shows what actually runs.
- **Partner** — `trigger -> send_<partner>` (`send_alphabot`, `send_alphathena`, `send_stratifi`, `send_refinitiv`). A partner operation is the whole flow — it reads the data, formats it the one way that partner accepts and sends it over the one transport that partner speaks — so there is no `index_panel` node; you supply only the per-index account binding, such as `ric_map` for LSEG.

`operations` is required. Every operation and its parameters are listed in the live catalog at `GET /schema`.

The new delivery is linked into the team's `deliveries` map and the coordinator is notified immediately, so a `live` delivery with an `index_event` trigger can fire the same day. Note the success status is **200, not 201**.

## Request body

- object
  - `team_id` string, required: Owning team. Must be a team the caller belongs to.
  - `name` string, required
  - `description` string
  - `stage` 'live' | 'draft': `live` starts scheduling immediately.
  - `timezone` string
  - `index_id` string: Single target index. Use `index_ids` for several.
  - `index_ids` string[]: Target indices. Both `idx_...` and legacy uuid ids are accepted.
  - `operations` DeliveryOperationNode[], required: The delivery's operations, in execution order: `trigger -> index_panel -> send_<channel>` for a standard delivery, `trigger -> send_<partner>` for a partner one. Required.
    - `id` string, required: Node id, unique within the list. Downstream nodes wire to it by this id.
    - `operation` string, required: Operation name from the catalog, e.g. `index_event_trigger`, `trigger`, `manual_trigger`, `index_panel`, `send_email`.
    - `use_cache` boolean: Whether the engine may reuse a cached result for this node. Delivery nodes are written with `false`.
    - `input` object[]: Upstream nodes. Each entry is an object whose single key is `$ref`, set to an upstream node's `id` — see the request example. A trigger has no input.
    - `parameters` object: Parameters for that operation. A parameter may take an upstream node's output instead of a literal value by using the same `$ref` form against that node's output path, e.g. the trigger's `fired_index_ids`.

## Response `200`

The created delivery, plus the coordinator notification result.

- object

## Other responses

- `400`: `name required`, `operations required`, or `no team resolved for this caller`.
- `401`: Missing or invalid id token.
- `403`: Caller is not a member of `team_id`.
- `429`: API key usage-plan rate limit exceeded.

---

[API](https://skmtc.dev/indexone/apis/index-one-rest-api.md) · [All operations](https://skmtc.dev/indexone/apis/index-one-rest-api/llms.txt) · [OpenAPI document](https://skmtc.dev/indexone/apis/index-one-rest-api/revisions/df5a92216a9c?raw)
