Pushes
A push stores the project’s source archive and files a new version of every journey and template whose bundle changed; a key that did not change gets none. It returns as soon as that is stored, and each version then moves from compiling to ready or failed on its own, so one file that cannot compile costs its own key and nothing else. A push turns nothing on: that is the journey’s enable flag.
POST /v1/pushes
Section titled “POST /v1/pushes”Push a built app
Auth: Session token, or an org pipeline key.
Request body
{ "data": { "manifest": { "protocol": 3, "sdk": "string", "journeys": [ { "key": "string", "tags": [], "trigger": { "event": "string" }, "purpose": "string", "enrollment": { "cooldown": "string" }, "description": "string", "from": "string", "spine": [ { "name": "sleep", "detail": "string", "timeout": "string", "steps": [], "otherwise": [] } ], "bundle": "string" } ], "templates": [ { "key": "string", "tags": [], "sendClass": "marketing", "verifyLink": true, "unsubscribeLink": false, "propsSchema": { "key": {} }, "bundle": "string" } ], "purposes": [ { "key": "string", "label": "string", "default": "denied" } ], "source": "string" }, "appId": "string", "orgId": "string" }}| Field | Type | Required | Constraints |
|---|---|---|---|
data |
object | yes | |
data.manifest |
object | yes | |
data.manifest.protocol |
3 | yes | |
data.manifest.sdk |
string | yes | length 1–∞ |
data.manifest.journeys |
object[] | yes | items 0–100 |
data.manifest.journeys[] |
object | yes | |
data.manifest.journeys[].key |
string | yes | length 0–64 |
data.manifest.journeys[].tags |
string[] | no | default []; items 0–20 |
data.manifest.journeys[].trigger |
object | object | yes | |
data.manifest.journeys[].purpose |
string | yes | length 0–50 |
data.manifest.journeys[].enrollment |
object | no | |
data.manifest.journeys[].enrollment.cooldown |
string | integer | yes | |
data.manifest.journeys[].description |
string | no | length 0–500 |
data.manifest.journeys[].from |
string | no | length 0–200 |
data.manifest.journeys[].spine |
object[] | yes | |
data.manifest.journeys[].spine[] |
object | yes | |
data.manifest.journeys[].spine[].name |
“sleep” | “waitForEvent” | “send.email” | “send.webhook” | “traits.set” | “traits.unset” | “profile.get” | “profiles.get” | “events.track” | “restart” | “if” | “loop” | “end” | yes | |
data.manifest.journeys[].spine[].detail |
string | no | length 0–200 |
data.manifest.journeys[].spine[].timeout |
string | no | length 0–50 |
data.manifest.journeys[].spine[].steps |
object[] | no | |
data.manifest.journeys[].spine[].otherwise |
object[] | no | |
data.manifest.journeys[].bundle |
string | yes | |
data.manifest.templates |
object[] | yes | items 0–200 |
data.manifest.templates[] |
object | yes | |
data.manifest.templates[].key |
string | yes | length 0–64 |
data.manifest.templates[].tags |
string[] | no | default []; items 0–20 |
data.manifest.templates[].sendClass |
“marketing” | “transactional” | yes | |
data.manifest.templates[].verifyLink |
boolean | yes | |
data.manifest.templates[].unsubscribeLink |
boolean | no | default false |
data.manifest.templates[].propsSchema |
record<string, any> | yes | |
data.manifest.templates[].bundle |
string | yes | |
data.manifest.purposes |
object[] | no | items 0–20 |
data.manifest.purposes[] |
object | no | |
data.manifest.purposes[].key |
string | yes | length 0–50 |
data.manifest.purposes[].label |
string | yes | length 1–50 |
data.manifest.purposes[].default |
“denied” | yes | |
data.manifest.source |
string | yes | |
data.appId |
string | yes | length 0–200 |
data.orgId |
string | yes | length 0–200 |
Response 201
{ "data": { "id": "string", "orgId": "string", "appId": "string", "seq": 42, "manifest": { "protocol": 42, "sdk": "string", "journeys": [ { "key": "string", "tags": {}, "trigger": { "event": "string" }, "purpose": "string", "enrollment": { "cooldown": "string" }, "description": "string", "from": "string", "spine": [ { "name": "sleep", "detail": "string", "timeout": "string", "steps": [], "otherwise": [] } ], "bundle": "string" } ], "templates": [ { "key": "string", "tags": {}, "sendClass": "marketing", "verifyLink": true, "unsubscribeLink": false, "propsSchema": { "key": {} }, "bundle": "string" } ], "purposes": [ { "key": "string", "label": "string", "default": "denied" } ], "source": "string" }, "manifestDigest": "string", "sourceDigest": "string", "createdBy": "string", "createdAt": "2026-01-15T09:30:00.000Z", "versions": [ { "id": "string", "orgId": "string", "key": "string", "kind": "journey", "appId": "string", "pushId": "string", "moduleDigest": "string", "manifest": { "key": "string", "tags": {}, "trigger": { "event": "string" }, "purpose": "string", "enrollment": { "cooldown": "string" }, "description": "string", "from": "string", "spine": [ { "name": "sleep", "detail": "string", "timeout": "string", "steps": [], "otherwise": [] } ], "bundle": "string" }, "status": "compiling", "pushedAt": "2026-01-15T09:30:00.000Z", "compiledAt": "2026-01-15T09:30:00.000Z", "error": "string" } ], "compiledEntries": 42, "totalEntries": 42 }, "meta": { "requestId": "string", "nextCursor": "string", "hasMore": true }}| Field | Type | Required | Constraints |
|---|---|---|---|
data |
object | yes | |
data.id |
string | yes | |
data.orgId |
string | yes | |
data.appId |
string | yes | |
data.seq |
integer | yes | -2147483648 ≤ x ≤ 2147483647 |
data.manifest |
object | yes | |
data.manifest.protocol |
integer | yes | |
data.manifest.sdk |
string | yes | length 1–∞ |
data.manifest.journeys |
object[] | yes | items 0–100 |
data.manifest.journeys[] |
object | yes | |
data.manifest.journeys[].key |
string | yes | length 0–64 |
data.manifest.journeys[].tags |
any | yes | |
data.manifest.journeys[].trigger |
object | object | yes | |
data.manifest.journeys[].purpose |
string | yes | length 0–50 |
data.manifest.journeys[].enrollment |
object | no | |
data.manifest.journeys[].enrollment.cooldown |
string | integer | yes | |
data.manifest.journeys[].description |
string | no | length 0–500 |
data.manifest.journeys[].from |
string | no | length 0–200 |
data.manifest.journeys[].spine |
object[] | yes | |
data.manifest.journeys[].spine[] |
object | yes | |
data.manifest.journeys[].spine[].name |
“sleep” | “waitForEvent” | “send.email” | “send.webhook” | “traits.set” | “traits.unset” | “profile.get” | “profiles.get” | “events.track” | “restart” | “if” | “loop” | “end” | yes | |
data.manifest.journeys[].spine[].detail |
string | no | length 0–200 |
data.manifest.journeys[].spine[].timeout |
string | no | length 0–50 |
data.manifest.journeys[].spine[].steps |
object[] | no | |
data.manifest.journeys[].spine[].otherwise |
object[] | no | |
data.manifest.journeys[].bundle |
string | yes | |
data.manifest.templates |
object[] | yes | items 0–200 |
data.manifest.templates[] |
object | yes | |
data.manifest.templates[].key |
string | yes | length 0–64 |
data.manifest.templates[].tags |
any | yes | |
data.manifest.templates[].sendClass |
“marketing” | “transactional” | yes | |
data.manifest.templates[].verifyLink |
boolean | yes | |
data.manifest.templates[].unsubscribeLink |
boolean | yes | default false |
data.manifest.templates[].propsSchema |
record<string, any> | yes | |
data.manifest.templates[].bundle |
string | yes | |
data.manifest.purposes |
object[] | no | items 0–20 |
data.manifest.purposes[] |
object | no | |
data.manifest.purposes[].key |
string | yes | length 0–50 |
data.manifest.purposes[].label |
string | yes | length 1–50 |
data.manifest.purposes[].default |
“denied” | yes | |
data.manifest.source |
string | yes | |
data.manifestDigest |
string | yes | |
data.sourceDigest |
string | yes | |
data.createdBy |
string | yes | |
data.createdAt |
string (date-time) | yes | |
data.versions |
object[] | yes | |
data.versions[] |
object | yes | |
data.versions[].id |
string | yes | |
data.versions[].orgId |
string | yes | |
data.versions[].key |
string | yes | |
data.versions[].kind |
“journey” | “template” | yes | |
data.versions[].appId |
string | yes | |
data.versions[].pushId |
string | yes | |
data.versions[].moduleDigest |
string | null | yes | |
data.versions[].manifest |
object | object | yes | |
data.versions[].status |
“compiling” | “ready” | “failed” | yes | |
data.versions[].pushedAt |
string (date-time) | yes | |
data.versions[].compiledAt |
string (date-time) | null | yes | |
data.versions[].error |
string | null | yes | |
data.compiledEntries |
integer | yes | |
data.totalEntries |
integer | yes | |
meta |
object | no | |
meta.requestId |
string | no | |
meta.nextCursor |
string | null | no | |
meta.hasMore |
boolean | no |
Errors follow the shared envelope and code table.
GET /v1/pushes
Section titled “GET /v1/pushes”List pushes, newest first
Auth: Session token.
Query parameters
{ "cursor": "string", "limit": 50, "appId": "string"}| Field | Type | Required | Constraints |
|---|---|---|---|
cursor |
string | no | |
limit |
integer | no | default 50; 1 ≤ x ≤ 100 |
appId |
string | no | length 0–200 |
Response 200
{ "data": [ { "id": "string", "orgId": "string", "appId": "string", "seq": 42, "manifest": { "protocol": 42, "sdk": "string", "journeys": [ { "key": "string", "tags": {}, "trigger": { "event": "string" }, "purpose": "string", "enrollment": { "cooldown": "string" }, "description": "string", "from": "string", "spine": [ { "name": "sleep", "detail": "string", "timeout": "string", "steps": [], "otherwise": [] } ], "bundle": "string" } ], "templates": [ { "key": "string", "tags": {}, "sendClass": "marketing", "verifyLink": true, "unsubscribeLink": false, "propsSchema": { "key": {} }, "bundle": "string" } ], "purposes": [ { "key": "string", "label": "string", "default": "denied" } ], "source": "string" }, "manifestDigest": "string", "sourceDigest": "string", "createdBy": "string", "createdAt": "2026-01-15T09:30:00.000Z", "versions": [ { "id": "string", "orgId": "string", "key": "string", "kind": "journey", "appId": "string", "pushId": "string", "moduleDigest": "string", "manifest": { "key": "string", "tags": {}, "trigger": { "event": "string" }, "purpose": "string", "enrollment": { "cooldown": "string" }, "description": "string", "from": "string", "spine": [ { "name": "sleep", "detail": "string", "timeout": "string", "steps": [], "otherwise": [] } ], "bundle": "string" }, "status": "compiling", "pushedAt": "2026-01-15T09:30:00.000Z", "compiledAt": "2026-01-15T09:30:00.000Z", "error": "string" } ], "compiledEntries": 42, "totalEntries": 42 } ], "meta": { "requestId": "string", "nextCursor": "string", "hasMore": true }}| Field | Type | Required | Constraints |
|---|---|---|---|
data |
object[] | yes | |
data[] |
object | yes | |
data[].id |
string | yes | |
data[].orgId |
string | yes | |
data[].appId |
string | yes | |
data[].seq |
integer | yes | -2147483648 ≤ x ≤ 2147483647 |
data[].manifest |
object | yes | |
data[].manifest.protocol |
integer | yes | |
data[].manifest.sdk |
string | yes | length 1–∞ |
data[].manifest.journeys |
object[] | yes | items 0–100 |
data[].manifest.journeys[] |
object | yes | |
data[].manifest.journeys[].key |
string | yes | length 0–64 |
data[].manifest.journeys[].tags |
any | yes | |
data[].manifest.journeys[].trigger |
object | object | yes | |
data[].manifest.journeys[].purpose |
string | yes | length 0–50 |
data[].manifest.journeys[].enrollment |
object | no | |
data[].manifest.journeys[].enrollment.cooldown |
string | integer | yes | |
data[].manifest.journeys[].description |
string | no | length 0–500 |
data[].manifest.journeys[].from |
string | no | length 0–200 |
data[].manifest.journeys[].spine |
object[] | yes | |
data[].manifest.journeys[].spine[] |
object | yes | |
data[].manifest.journeys[].bundle |
string | yes | |
data[].manifest.templates |
object[] | yes | items 0–200 |
data[].manifest.templates[] |
object | yes | |
data[].manifest.templates[].key |
string | yes | length 0–64 |
data[].manifest.templates[].tags |
any | yes | |
data[].manifest.templates[].sendClass |
“marketing” | “transactional” | yes | |
data[].manifest.templates[].verifyLink |
boolean | yes | |
data[].manifest.templates[].unsubscribeLink |
boolean | yes | default false |
data[].manifest.templates[].propsSchema |
record<string, any> | yes | |
data[].manifest.templates[].bundle |
string | yes | |
data[].manifest.purposes |
object[] | no | items 0–20 |
data[].manifest.purposes[] |
object | no | |
data[].manifest.purposes[].key |
string | yes | length 0–50 |
data[].manifest.purposes[].label |
string | yes | length 1–50 |
data[].manifest.purposes[].default |
“denied” | yes | |
data[].manifest.source |
string | yes | |
data[].manifestDigest |
string | yes | |
data[].sourceDigest |
string | yes | |
data[].createdBy |
string | yes | |
data[].createdAt |
string (date-time) | yes | |
data[].versions |
object[] | yes | |
data[].versions[] |
object | yes | |
data[].versions[].id |
string | yes | |
data[].versions[].orgId |
string | yes | |
data[].versions[].key |
string | yes | |
data[].versions[].kind |
“journey” | “template” | yes | |
data[].versions[].appId |
string | yes | |
data[].versions[].pushId |
string | yes | |
data[].versions[].moduleDigest |
string | null | yes | |
data[].versions[].manifest |
object | object | yes | |
data[].versions[].status |
“compiling” | “ready” | “failed” | yes | |
data[].versions[].pushedAt |
string (date-time) | yes | |
data[].versions[].compiledAt |
string (date-time) | null | yes | |
data[].versions[].error |
string | null | yes | |
data[].compiledEntries |
integer | yes | |
data[].totalEntries |
integer | yes | |
meta |
object | no | |
meta.requestId |
string | no | |
meta.nextCursor |
string | null | no | |
meta.hasMore |
boolean | no |
Errors follow the shared envelope and code table.
GET /v1/pushes/{id}
Section titled “GET /v1/pushes/{id}”Inspect one push and what it compiled
Auth: Session token.
Response 200
{ "data": { "id": "string", "orgId": "string", "appId": "string", "seq": 42, "manifest": { "protocol": 42, "sdk": "string", "journeys": [ { "key": "string", "tags": {}, "trigger": { "event": "string" }, "purpose": "string", "enrollment": { "cooldown": "string" }, "description": "string", "from": "string", "spine": [ { "name": "sleep", "detail": "string", "timeout": "string", "steps": [], "otherwise": [] } ], "bundle": "string" } ], "templates": [ { "key": "string", "tags": {}, "sendClass": "marketing", "verifyLink": true, "unsubscribeLink": false, "propsSchema": { "key": {} }, "bundle": "string" } ], "purposes": [ { "key": "string", "label": "string", "default": "denied" } ], "source": "string" }, "manifestDigest": "string", "sourceDigest": "string", "createdBy": "string", "createdAt": "2026-01-15T09:30:00.000Z", "versions": [ { "id": "string", "orgId": "string", "key": "string", "kind": "journey", "appId": "string", "pushId": "string", "moduleDigest": "string", "manifest": { "key": "string", "tags": {}, "trigger": { "event": "string" }, "purpose": "string", "enrollment": { "cooldown": "string" }, "description": "string", "from": "string", "spine": [ { "name": "sleep", "detail": "string", "timeout": "string", "steps": [], "otherwise": [] } ], "bundle": "string" }, "status": "compiling", "pushedAt": "2026-01-15T09:30:00.000Z", "compiledAt": "2026-01-15T09:30:00.000Z", "error": "string" } ], "compiledEntries": 42, "totalEntries": 42 }, "meta": { "requestId": "string", "nextCursor": "string", "hasMore": true }}| Field | Type | Required | Constraints |
|---|---|---|---|
data |
object | yes | |
data.id |
string | yes | |
data.orgId |
string | yes | |
data.appId |
string | yes | |
data.seq |
integer | yes | -2147483648 ≤ x ≤ 2147483647 |
data.manifest |
object | yes | |
data.manifest.protocol |
integer | yes | |
data.manifest.sdk |
string | yes | length 1–∞ |
data.manifest.journeys |
object[] | yes | items 0–100 |
data.manifest.journeys[] |
object | yes | |
data.manifest.journeys[].key |
string | yes | length 0–64 |
data.manifest.journeys[].tags |
any | yes | |
data.manifest.journeys[].trigger |
object | object | yes | |
data.manifest.journeys[].purpose |
string | yes | length 0–50 |
data.manifest.journeys[].enrollment |
object | no | |
data.manifest.journeys[].enrollment.cooldown |
string | integer | yes | |
data.manifest.journeys[].description |
string | no | length 0–500 |
data.manifest.journeys[].from |
string | no | length 0–200 |
data.manifest.journeys[].spine |
object[] | yes | |
data.manifest.journeys[].spine[] |
object | yes | |
data.manifest.journeys[].spine[].name |
“sleep” | “waitForEvent” | “send.email” | “send.webhook” | “traits.set” | “traits.unset” | “profile.get” | “profiles.get” | “events.track” | “restart” | “if” | “loop” | “end” | yes | |
data.manifest.journeys[].spine[].detail |
string | no | length 0–200 |
data.manifest.journeys[].spine[].timeout |
string | no | length 0–50 |
data.manifest.journeys[].spine[].steps |
object[] | no | |
data.manifest.journeys[].spine[].otherwise |
object[] | no | |
data.manifest.journeys[].bundle |
string | yes | |
data.manifest.templates |
object[] | yes | items 0–200 |
data.manifest.templates[] |
object | yes | |
data.manifest.templates[].key |
string | yes | length 0–64 |
data.manifest.templates[].tags |
any | yes | |
data.manifest.templates[].sendClass |
“marketing” | “transactional” | yes | |
data.manifest.templates[].verifyLink |
boolean | yes | |
data.manifest.templates[].unsubscribeLink |
boolean | yes | default false |
data.manifest.templates[].propsSchema |
record<string, any> | yes | |
data.manifest.templates[].bundle |
string | yes | |
data.manifest.purposes |
object[] | no | items 0–20 |
data.manifest.purposes[] |
object | no | |
data.manifest.purposes[].key |
string | yes | length 0–50 |
data.manifest.purposes[].label |
string | yes | length 1–50 |
data.manifest.purposes[].default |
“denied” | yes | |
data.manifest.source |
string | yes | |
data.manifestDigest |
string | yes | |
data.sourceDigest |
string | yes | |
data.createdBy |
string | yes | |
data.createdAt |
string (date-time) | yes | |
data.versions |
object[] | yes | |
data.versions[] |
object | yes | |
data.versions[].id |
string | yes | |
data.versions[].orgId |
string | yes | |
data.versions[].key |
string | yes | |
data.versions[].kind |
“journey” | “template” | yes | |
data.versions[].appId |
string | yes | |
data.versions[].pushId |
string | yes | |
data.versions[].moduleDigest |
string | null | yes | |
data.versions[].manifest |
object | object | yes | |
data.versions[].status |
“compiling” | “ready” | “failed” | yes | |
data.versions[].pushedAt |
string (date-time) | yes | |
data.versions[].compiledAt |
string (date-time) | null | yes | |
data.versions[].error |
string | null | yes | |
data.compiledEntries |
integer | yes | |
data.totalEntries |
integer | yes | |
meta |
object | no | |
meta.requestId |
string | no | |
meta.nextCursor |
string | null | no | |
meta.hasMore |
boolean | no |
Errors follow the shared envelope and code table.
GET /v1/pushes/{id}/source
Section titled “GET /v1/pushes/{id}/source”Download the pushed source tarball
Auth: Session token.
Errors follow the shared envelope and code table.