Skip to content

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.

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.

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.

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.

Download the pushed source tarball

Auth: Session token.

Errors follow the shared envelope and code table.