Configure how people enter the journey by updating its ENTRY node: manual, segment (needs segmentId), cdp_event (needs eventName), or inbound (needs inboundAction and inboundChannelIds, optionally narrowed to an inboundKeyword), with an optional frequency cap, or an optional parallelRunsBy on cdp_event to give one person a concurrent run per event-property value. Fields belonging to the other trigger types are cleared.
Required for inbound triggers. INSTAGRAM_COMMENT / FACEBOOK_COMMENT listen to public comments on the account's posts instead of DMs; they require Instagram or Messenger channels whose connection was granted comment permission, and enroll the commenter without opening a conversation.
Required for inbound triggers: the channel ids to listen on. Must be NATIVE WhatsApp, SMS, Instagram or Messenger channels that are not deleted — WhatsApp and SMS additionally need an ONLINE sender, Instagram and Messenger have no sender row and need none (a Messenger Page still on the V1 bridge is withheld as NOT_NATIVE); if you pass an ineligible one the error names the eligible ids. For a comment action, only Instagram and Messenger channels are valid. Several published journeys may share one channel as long as their keywords differ: publishing a rule whose keyword (or blank catch-all) is already taken on that channel is refused with INBOUND_CHANNEL_TAKEN. Each arriving message enrols exactly one of them, the most specific matching rule, ties going to the older initiative.
The word the inbound message must match for this journey to enrol — e.g. 'PRECIO'. Blank or absent means the trigger is the catch-all and fires on ANY message arriving on the channel, which is almost never what you want beside other journeys on the same number. Several journeys may share one channel as long as their keywords differ — two rules with the same keyword on one channel, or two blank ones, are refused at publish with INBOUND_CHANNEL_TAKEN. The keyword is matched accent-, case- and punctuation-insensitively, and stored normalized.
How inboundKeyword is matched: EXACT (the message is only-the-word), ALL_WORDS (the message contains all-the-words, in any order), or CONTAINS (the message contains-the-word, adjacent and in order). All three are word-based, so no mode ever matches inside a longer word ('precioso' does not match 'precio'). Defaults to EXACT. Ignored when inboundKeyword is blank.
cdp_event only: let one person have several runs at once, one per distinct value of this event property (e.g. "paymentLinkId"). The journey becomes send only, the frequency cap is refused, and stop events match on the same property. See the ENTRY node docs in journeys_authoring_catalog. Cleared when the trigger changes to another type.
{"docsConfig":{"theme":"luma","$schema":"https://mintlify.com/docs.json","name":"Boom","description":"Boom's public API — REST and MCP over the same capabilities","colors":{"primary":"#3B3B3B","light":"#E5E5E5","dark":"#171717"},"logo":{"light":"https://mintcdn.com/boomai-c1f672dc/2DiZiPkeLvrlfzgs/logo.svg?fit=max\u0026auto=format\u0026n=2DiZiPkeLvrlfzgs\u0026q=85\u0026s=a014030c9acb0f3d8eee9de1fbe632a7","dark":"https://mintcdn.com/boomai-c1f672dc/2DiZiPkeLvrlfzgs/logo-dark.svg?fit=max\u0026auto=format\u0026n=2DiZiPkeLvrlfzgs\u0026q=85\u0026s=8ec1c838c16743220fd0e7f46a0be157","href":"/introduction"},"favicon":"https://mintcdn.com/boomai-c1f672dc/4m9zfCL8IkhJn1sI/favicon.svg?fit=max\u0026auto=format\u0026n=4m9zfCL8IkhJn1sI\u0026q=85\u0026s=949c3ecc5e2011cf0a7d4a0e33204c1d","appearance":{"default":"system"},"navbar":{"links":[{"href":"mailto:support@useboom.ai","label":"Support"},{"href":"https://app.useboom.ai","label":"Dashboard"}]},"icons":{"library":"lucide"},"contextual":{"options":["copy","view","assistant","chatgpt","claude"],"display":"header"},"styling":{"latex":true},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"boomai-c1f672dc","hasAudioNarration":false,"actualSubdomain":"boomai-c1f672dc","customDomains":["docs.useboom.ai"],"gitSource":{"type":"github","owner":"boom-tml","repo":"product-research","deployBranch":"main","contentDirectory":"docs-site","isPrivate":true,"mountPath":"","label":""},"chroma":{"collectionId":"ca542f17-f4ef-4bd7-9dec-4327eb890a84","liveDeploymentHistoryId":"6adada31c9b285ea9e7588cf","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6adada31c9b285ea9e7588cf"},"feedback":{"thumbs":true},"entitlements":{"AI_CHAT":{"status":"DISABLED"}},"buildId":"6adada31c9b285ea9e7588cf","clientVersion":"0.0.3965","searchFilterCounts":[{"language":"default","tag":"API","count":80},{"language":"default","tag":"Guides","count":34},{"language":"default","tag":"CDP","count":29},{"language":"default","tag":"Initiatives","count":23},{"language":"default","tag":"Journeys","count":22},{"language":"default","tag":"How Boom works","count":17},{"language":"default","tag":"Lead Capture","count":11},{"language":"default","tag":"Tutorials","count":10},{"language":"default","tag":"Segments","count":10},{"language":"default","tag":"Connect your tools","count":9}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true},"hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-v7-file-tree","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"pause-universal-search-reconcile","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"per-site-search-delta","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-private-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-nav-generations","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"byok-sep-25","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-agent-model-picker","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"isAtlas":false,"googleFontsInlined":false},"customCss":[{"filePath":"style.css","content":"html{font-size:14px}:root:root{--font-family-headings-custom:ui-sans-serif, system-ui, sans-serif;--font-family-body-custom:ui-sans-serif, system-ui, sans-serif}#page-title{font-weight:400!important;letter-spacing:-.025em!important}#content-area .prose h2{font-weight:400;letter-spacing:-.015em}#content-area .prose h3{font-weight:500;letter-spacing:-.008em}body{background-color:oklch(.97 0 0)}.dark body{background-color:oklch(.18 0 0)}#content-area .text-primary.font-semibold:not(.eyebrow){color:#18181b!important}.dark #content-area .text-primary.font-semibold:not(.eyebrow){color:#f4f4f5!important}#pagination{background-color:transparent!important;border:0!important;border-top:1px solid rgba(17,17,26,.08)!important;border-radius:0!important;padding:1.25rem 0 0!important}.dark #pagination{border-top-color:rgba(255,255,255,.08)!important}#footer a[href*=mintlify],#pagination a .flex-col.items-end,#pagination a .w-px{display:none!important}#pagination a.w-full>div{justify-content:flex-end!important}@media (min-width:1024px){#sidebar-content{width:18rem!important}#body-content{padding-left:18rem!important}}#sidebar-content a[aria-current=page]{background-color:oklch(.955 .004 80);border-radius:.5rem}.dark #sidebar-content a[aria-current=page]{background-color:rgba(255,255,255,.06)}#sidebar-content [class*=group i]:not(a):not(:has(a)),#sidebar-content h5,#sidebar-content li>div:first-child>p:first-child:not(:has(a)){font-size:.9rem!important;font-weight:600!important;letter-spacing:normal!important;text-transform:none!important}.boom-home{--bh-ink:oklch(0.145 0 0);--bh-muted:oklch(0.556 0 0);--bh-hero:oklch(0.984 0.003 85);--bh-card:oklch(0.984 0.003 85);--bh-line:rgba(0, 0, 0, 0.07);--bh-grain:url(\"data:image/svg+xml;utf8,\u003csvg xmlns='http://www.w3.org/2000/svg' width='220' height='220'>\u003cfilter id='n'>\u003cfeTurbulence type='fractalNoise' baseFrequency='0.72' numOctaves='3' stitchTiles='stitch'/>\u003cfeColorMatrix values='0 0 0 0 0.5 0 0 0 0 0.5 0 0 0 0 0.5 0 0 0 1.4 -0.2'/>\u003c/filter>\u003crect width='100%' height='100%' filter='url(%23n)'/>\u003c/svg>\");padding:.5rem 0 1rem;container-type:inline-size}.dark .boom-home{--bh-ink:oklch(0.978 0.001 286);--bh-muted:oklch(0.78 0.016 286);--bh-hero:rgba(255, 255, 255, 0.03);--bh-card:rgba(255, 255, 255, 0.03);--bh-line:rgba(255, 255, 255, 0.08)}.boom-home a,.boom-home a:focus,.boom-home a:hover{text-decoration:none;border:0}.boom-home span{display:block}.boom-home .bh-hero{position:relative;overflow:hidden;isolation:isolate;border-radius:24px;border:1px solid var(--bh-line);background:var(--bh-hero);padding:clamp(2.5rem,7vw,4.5rem) clamp(1.5rem,5vw,3.5rem);margin-bottom:1rem}.boom-home .bh-eyebrow{display:inline-block;font-size:.93rem;color:var(--bh-muted);border:1px solid var(--bh-line);border-radius:999px;padding:.3rem .8rem;background:rgba(255,255,255,.8)}.dark .boom-home .bh-eyebrow{background:rgba(255,255,255,.04)}.boom-home .bh-title{margin:1.4rem 0 0;max-width:14ch;font-weight:400;font-size:clamp(2.6rem,6.5vw,4.2rem);line-height:1.04;letter-spacing:-.025em;color:var(--bh-ink);opacity:.85;text-wrap:balance}.boom-home .bh-sub{margin:1.25rem 0 0;max-width:34rem;color:var(--bh-muted);font-size:1.15rem;line-height:1.6;text-wrap:pretty}.boom-home .bh-arcs{position:absolute;z-index:-1;right:-17rem;top:50%;width:34rem;height:34rem;transform:translateY(-50%);color:var(--bh-ink);opacity:.16;pointer-events:none}.boom-home .bh-arcs svg{width:100%;height:100%}@media (max-width:640px){.boom-home .bh-arcs{display:none}}.boom-home .bh-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:.75rem}@container (max-width: 820px){.boom-home .bh-grid{grid-template-columns:repeat(2,minmax(0,1fr))}}@container (max-width: 520px){.boom-home .bh-grid{grid-template-columns:1fr}}.boom-home .bh-tile{position:relative;overflow:hidden;isolation:isolate;height:17rem;border-radius:24px;border:1px solid var(--bh-line);background:var(--bh-card)}.boom-home .bh-tile:focus-visible{outline:2px solid var(--bh-ink);outline-offset:3px}.boom-home .bh-paint{position:absolute;inset:0;z-index:-1;opacity:0;background:var(--bh-paint);transition:opacity .5s ease-out}.boom-home .bh-paint::after{content:\"\";position:absolute;inset:0;mix-blend-mode:overlay;opacity:.7;background-image:var(--bh-grain)}.boom-home .bh-tile:focus-visible .bh-paint,.boom-home .bh-tile:hover .bh-paint{opacity:1}.boom-home .bh-tile:nth-child(1){--bh-paint:radial-gradient(85% 60% at 90% 0%, oklch(0.84 0.07 315) 0%, transparent 60%), linear-gradient(180deg, oklch(0.62 0.13 305), oklch(0.42 0.12 295))}.boom-home .bh-tile:nth-child(2){--bh-paint:radial-gradient(85% 60% at 90% 0%, oklch(0.9 0.09 85) 0%, transparent 60%), linear-gradient(180deg, oklch(0.72 0.13 55), oklch(0.5 0.14 22))}.boom-home .bh-tile:nth-child(3){--bh-paint:radial-gradient(85% 60% at 10% 0%, oklch(0.88 0.06 30) 0%, transparent 60%), linear-gradient(180deg, oklch(0.66 0.13 18), oklch(0.46 0.13 0))}.boom-home .bh-tile:nth-child(4){--bh-paint:radial-gradient(85% 60% at 90% 0%, oklch(0.88 0.06 220) 0%, transparent 60%), linear-gradient(180deg, oklch(0.66 0.11 240), oklch(0.4 0.1 258))}.boom-home .bh-tile:nth-child(5){--bh-paint:radial-gradient(85% 60% at 10% 0%, oklch(0.88 0.08 150) 0%, transparent 60%), linear-gradient(180deg, oklch(0.6 0.09 180), oklch(0.4 0.07 215))}.boom-home .bh-tile:nth-child(6){--bh-paint:radial-gradient(85% 60% at 90% 0%, oklch(0.8 0.09 295) 0%, transparent 60%), linear-gradient(180deg, oklch(0.55 0.15 280), oklch(0.33 0.11 268))}.boom-home .bh-art{position:absolute;inset:0 0 5.25rem;display:grid;place-items:center;padding:1.25rem 2rem 0;color:var(--bh-ink);opacity:.85;transition:color .5s ease,opacity .5s ease}.boom-home .bh-art svg{width:100%;max-width:230px;height:140px;overflow:visible}.boom-home .bh-text{position:absolute;inset:auto 0 0;height:5.25rem;padding:0 1.5rem;text-align:center}.boom-home .bh-h{font-size:1.15rem;font-weight:500;letter-spacing:-.008em;color:var(--bh-ink);transition:color .5s ease}.boom-home .bh-p{margin:.3rem auto 0;font-size:.95rem;font-weight:400;line-height:1.5;color:var(--bh-muted);text-wrap:pretty;transition:color .5s ease}.boom-home .bh-tile:focus-visible .bh-art,.boom-home .bh-tile:hover .bh-art{color:#fff;opacity:1}.boom-home .bh-tile:focus-visible .bh-h,.boom-home .bh-tile:hover .bh-h{color:#fff}.boom-home .bh-tile:focus-visible .bh-p,.boom-home .bh-tile:hover .bh-p{color:rgba(255,255,255,.85)}.boom-home svg .d,.boom-home svg .h{fill:none;stroke:currentColor;stroke-width:.75;vector-effect:non-scaling-stroke}.boom-home svg .d{stroke-dasharray:.5 3;stroke-linecap:round}.boom-home svg .f{fill:currentColor;stroke:none}body:has(.boom-home) #header,body:has(.boom-home) #page-context-menu,body:has(.boom-home) #page-context-menu-button,body:has(.boom-home) #pagination{display:none!important}body:has(.boom-home) #content-area{max-width:72rem!important}#page-context-menu button[aria-haspopup=menu]{height:calc(2rem + 2px)}"}],"page":{"pagePath":"api-reference/journeys/set-trigger","slug":"/api-reference/journeys/set-trigger","pageMetadata":{"title":"Set trigger","description":"Configure how people enter the journey by updating its ENTRY node: manual, segment (needs segmentId), cdp_event (needs eventName), or inbound (needs inboundAction and inboundChannelIds, optionally narrowed to an inboundKeyword), with an optional frequency cap, or an optional parallelRunsBy on cdp_event to give one person a concurrent run per event-property value. Fields belonging to the other trigger types are cleared.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json patch /api/v1/journeys/{journeyId}/trigger","href":"/api-reference/journeys/set-trigger","autogeneratedByOpenApi":true},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Configure how people enter the journey by updating its ENTRY node: manual, segment (needs segmentId), cdp_event (needs eventName), or inbound (needs inboundAction and inboundChannelIds, optionally narrowed to an inboundKeyword), with an optional frequency cap, or an optional parallelRunsBy on cdp_event to give one person a concurrent run per event-property value. Fields belonging to the other trigger types are cleared.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){return _jsx(_Fragment,{})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Set trigger","description":"Configure how people enter the journey by updating its ENTRY node: manual, segment (needs segmentId), cdp_event (needs eventName), or inbound (needs inboundAction and inboundChannelIds, optionally narrowed to an inboundKeyword), with an optional frequency cap, or an optional parallelRunsBy on cdp_event to give one person a concurrent run per event-property value. Fields belonging to the other trigger types are cleared.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json patch /api/v1/journeys/{journeyId}/trigger","href":"/api-reference/journeys/set-trigger","autogeneratedByOpenApi":true}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":[],"openApiReferenceData":{"operation":{"operationId":"journeys_set_trigger","summary":"Set trigger","description":"Configure how people enter the journey by updating its ENTRY node: manual, segment (needs segmentId), cdp_event (needs eventName), or inbound (needs inboundAction and inboundChannelIds, optionally narrowed to an inboundKeyword), with an optional frequency cap, or an optional parallelRunsBy on cdp_event to give one person a concurrent run per event-property value. Fields belonging to the other trigger types are cleared.","tags":["Journeys"],"requestBody":"d48b3941-ed95-4d4a-a411-2339ddbe0110","parameters":["2958dc07-f155-45dd-acfc-b72e763088aa"],"responses":{"200":"759d1a8d-a460-4d1d-bb88-bcf3ec6b9acb","400":"8fdb8150-251a-45b4-81e5-dfb3156dfe58","401":"ef843c6f-1c24-48a5-861d-124f217356c6","404":"f1881774-77a2-4a68-acc4-e6caf787a994","409":"b41e0095-7bdf-4fbc-800c-b637429aa018","422":"9d291905-331c-4e8c-9bb1-e9f66afe51cf","429":"31b6b73e-a127-4534-814f-b24a997fb56b","500":"981b219d-91ac-47a0-be8c-34095e7bc29d","503":"c26d937c-c44d-4205-9667-630e9c016e64"},"method":"patch","type":"path","servers":["c765c082-4d63-4903-8901-a4e25004f471","b80279d2-0255-46dc-bddc-f490bd7a2ec8"],"security":["ec2314a0-cdd3-4628-bc94-f84fbb0b23d0"],"path":"/api/v1/journeys/{journeyId}/trigger","baseUrlOptions":["https://www.useboom.ai","https://dev.useboom.ai"],"title":"Set trigger","codeSamples":[],"requiredOnlyExamples":false,"requestExampleType":"generated","responseExampleType":"generated"},"dependencies":{"parameters":{"2958dc07-f155-45dd-acfc-b72e763088aa":{"name":"journeyId","in":"path","required":true,"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"string","minLength":1,"description":"A draft journey id, or the initiative id (resolves to its current draft).","isRequired":true,"uniqueKey":"","typeLabel":"string"}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"triggerType":{"type":"string","enum":["manual","segment","cdp_event","inbound"],"description":"How people enter the journey.","isRequired":true,"uniqueKey":"triggerType","typeLabel":"enum\u003cstring>"},"segmentId":{"description":"Required for segment triggers. The segment's `id` (from segments_list / segments_get) — NOT its slug.","type":"string","uniqueKey":"segmentId","typeLabel":"string"},"segmentName":{"type":"string","uniqueKey":"segmentName","typeLabel":"string"},"eventName":{"description":"Required for cdp_event triggers.","type":"string","uniqueKey":"eventName","typeLabel":"string"},"inboundAction":{"description":"Required for inbound triggers. INSTAGRAM_COMMENT / FACEBOOK_COMMENT listen to public comments on the account's posts instead of DMs; they require Instagram or Messenger channels whose connection was granted comment permission, and enroll the commenter without opening a conversation.","type":"string","enum":["WHATSAPP_MESSAGE","SMS_MESSAGE","INSTAGRAM_MESSAGE","MESSENGER_MESSAGE","INSTAGRAM_COMMENT","FACEBOOK_COMMENT"],"uniqueKey":"inboundAction","typeLabel":"enum\u003cstring>"},"inboundChannelIds":{"description":"Required for inbound triggers: the channel ids to listen on. Must be NATIVE WhatsApp, SMS, Instagram or Messenger channels that are not deleted — WhatsApp and SMS additionally need an ONLINE sender, Instagram and Messenger have no sender row and need none (a Messenger Page still on the V1 bridge is withheld as NOT_NATIVE); if you pass an ineligible one the error names the eligible ids. For a comment action, only Instagram and Messenger channels are valid. Several published journeys may share one channel as long as their keywords differ: publishing a rule whose keyword (or blank catch-all) is already taken on that channel is refused with INBOUND_CHANNEL_TAKEN. Each arriving message enrols exactly one of them, the most specific matching rule, ties going to the older initiative.","type":"array","items":{"type":"string","uniqueKey":"inboundChannelIds.items.[INDEX]","typeLabel":"string"},"uniqueKey":"inboundChannelIds","typeLabel":"string[]"},"inboundKeyword":{"description":"The word the inbound message must match for this journey to enrol — e.g. 'PRECIO'. Blank or absent means the trigger is the catch-all and fires on ANY message arriving on the channel, which is almost never what you want beside other journeys on the same number. Several journeys may share one channel as long as their keywords differ — two rules with the same keyword on one channel, or two blank ones, are refused at publish with INBOUND_CHANNEL_TAKEN. The keyword is matched accent-, case- and punctuation-insensitively, and stored normalized.","type":"string","uniqueKey":"inboundKeyword","typeLabel":"string"},"inboundMatchMode":{"description":"How inboundKeyword is matched: EXACT (the message is only-the-word), ALL_WORDS (the message contains all-the-words, in any order), or CONTAINS (the message contains-the-word, adjacent and in order). All three are word-based, so no mode ever matches inside a longer word ('precioso' does not match 'precio'). Defaults to EXACT. Ignored when inboundKeyword is blank.","type":"string","enum":["EXACT","CONTAINS","ALL_WORDS"],"uniqueKey":"inboundMatchMode","typeLabel":"enum\u003cstring>"},"maxEnrollments":{"description":"Frequency cap; both-or-neither with enrollmentWindow.","type":"integer","minimum":1,"maximum":9007199254740991,"uniqueKey":"maxEnrollments","typeLabel":"integer"},"enrollmentWindow":{"description":"Frequency-cap window, e.g. '7d'.","type":"string","uniqueKey":"enrollmentWindow","typeLabel":"string"},"parallelRunsBy":{"description":"cdp_event only: let one person have several runs at once, one per distinct value of this event property (e.g. \"paymentLinkId\"). The journey becomes send only, the frequency cap is refused, and stop events match on the same property. See the ENTRY node docs in journeys_authoring_catalog. Cleared when the trigger changes to another type.","type":"string","minLength":1,"uniqueKey":"parallelRunsBy","typeLabel":"string"}},"required":["triggerType"],"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"segmentId":"\u003cstring>","segmentName":"\u003cstring>","eventName":"\u003cstring>","inboundChannelIds":["\u003cstring>"],"inboundKeyword":"\u003cstring>","maxEnrollments":4503599627370496,"enrollmentWindow":"\u003cstring>","parallelRunsBy":"\u003cstring>"}}},"exampleType":"generated"}},"exampleType":"generated"},"responses":{"759d1a8d-a460-4d1d-bb88-bcf3ec6b9acb":{"description":"Success","content":{"application/json":{"schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"id":{"type":"string","description":"Journey (workflow version) id.","isRequired":true,"uniqueKey":"id","typeLabel":"string"},"initiativeId":{"type":"string","description":"The initiative this journey belongs to.","isRequired":true,"uniqueKey":"initiativeId","typeLabel":"string"},"status":{"type":"string","enum":["DRAFT","PUBLISHED","STOPPED"],"description":"DRAFT (editable), PUBLISHED (live, frozen), or STOPPED (retired).","isRequired":true,"uniqueKey":"status","typeLabel":"enum\u003cstring>"},"version":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Version number within the initiative.","isRequired":true,"uniqueKey":"version","typeLabel":"integer"},"definition":{"type":"object","properties":{"name":{"type":"string","minLength":1,"description":"Journey name.","isRequired":true,"uniqueKey":"definition.name","typeLabel":"string"},"actions":{"minItems":1,"type":"array","items":{"oneOf":[{"type":"object","required":["id","kind"],"properties":{"id":{"type":"string","minLength":1,"description":"Node id, unique within the journey.","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.0.id","typeLabel":"string"},"kind":{"type":"string","const":"ENTRY","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.0.kind","typeLabel":"string"},"name":{"type":"string","minLength":1,"description":"The label shown on the canvas. Required before publishing.","uniqueKey":"definition.actions.items.[INDEX].oneOf.0.name","typeLabel":"string"},"position":{"type":"object","properties":{"x":{"type":"number","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.0.position.x","typeLabel":"number"},"y":{"type":"number","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.0.position.y","typeLabel":"number"}},"required":["x","y"],"additionalProperties":false,"description":"Explicit canvas position. Omit it and the server auto-lays-out the graph top-down; only set it to preserve a hand-arranged layout.","uniqueKey":"definition.actions.items.[INDEX].oneOf.0.position","typeLabel":"object"},"inputs":{"type":"object","properties":{"description":{"type":"string","uniqueKey":"definition.actions.items.[INDEX].oneOf.0.inputs.description","typeLabel":"string"},"triggerType":{"description":"How people enter: manual (added by an operator or API call), segment (on entering a segment), cdp_event (when an event is received), or inbound (when a message arrives on one of the org's channels). Defaults to manual.","type":"string","enum":["manual","segment","cdp_event","inbound"],"uniqueKey":"definition.actions.items.[INDEX].oneOf.0.inputs.triggerType","typeLabel":"enum\u003cstring>"},"segmentId":{"description":"Segment id — required when triggerType is segment.","type":"string","uniqueKey":"definition.actions.items.[INDEX].oneOf.0.inputs.segmentId","typeLabel":"string"},"segmentName":{"description":"Cached segment display name (optional).","type":"string","uniqueKey":"definition.actions.items.[INDEX].oneOf.0.inputs.segmentName","typeLabel":"string"},"eventName":{"description":"CDP event name — required when triggerType is cdp_event.","type":"string","uniqueKey":"definition.actions.items.[INDEX].oneOf.0.inputs.eventName","typeLabel":"string"},"inboundAction":{"description":"Which arrival fires the trigger — required when triggerType is inbound. INSTAGRAM_COMMENT / FACEBOOK_COMMENT listen to public comments on the account's posts instead of DMs; they require Instagram or Messenger channels whose connection was granted comment permission, and enroll the commenter without opening a conversation.","type":"string","enum":["WHATSAPP_MESSAGE","SMS_MESSAGE","INSTAGRAM_MESSAGE","MESSENGER_MESSAGE","INSTAGRAM_COMMENT","FACEBOOK_COMMENT"],"uniqueKey":"definition.actions.items.[INDEX].oneOf.0.inputs.inboundAction","typeLabel":"enum\u003cstring>"},"inboundChannelIds":{"description":"Channel ids to listen on — at least one required when triggerType is inbound. Must be NATIVE WhatsApp, SMS, Instagram or Messenger channels that are not deleted — WhatsApp and SMS additionally need an ONLINE sender, Instagram and Messenger have no sender row and need none (a Messenger Page still on the V1 bridge is withheld as NOT_NATIVE); journeys_set_trigger names the eligible ids if you pass an ineligible one. For a comment action, only Instagram and Messenger channels are valid. Several published journeys may share one channel as long as their keywords differ: publishing a rule whose keyword (or blank catch-all) is already taken on that channel is refused with INBOUND_CHANNEL_TAKEN. Each arriving message enrols exactly one of them, the most specific matching rule, ties going to the older initiative.","type":"array","items":{"type":"string","uniqueKey":"definition.actions.items.[INDEX].oneOf.0.inputs.inboundChannelIds.items.[INDEX]","typeLabel":"string"},"uniqueKey":"definition.actions.items.[INDEX].oneOf.0.inputs.inboundChannelIds","typeLabel":"string[]"},"inboundKeyword":{"description":"The word the inbound message must match for this journey to enrol — e.g. 'PRECIO'. Blank or absent means the trigger is the catch-all and fires on ANY message arriving on the channel, which is almost never what you want beside other journeys on the same number. Several journeys may share one channel as long as their keywords differ — two rules with the same keyword on one channel, or two blank ones, are refused at publish with INBOUND_CHANNEL_TAKEN. The keyword is matched accent-, case- and punctuation-insensitively, and stored normalized.","type":"string","uniqueKey":"definition.actions.items.[INDEX].oneOf.0.inputs.inboundKeyword","typeLabel":"string"},"inboundMatchMode":{"description":"How inboundKeyword is matched: EXACT (the message is only-the-word), ALL_WORDS (the message contains all-the-words, in any order), or CONTAINS (the message contains-the-word, adjacent and in order). All three are word-based, so no mode ever matches inside a longer word ('precioso' does not match 'precio'). Defaults to EXACT. Ignored when inboundKeyword is blank.","type":"string","enum":["EXACT","CONTAINS","ALL_WORDS"],"uniqueKey":"definition.actions.items.[INDEX].oneOf.0.inputs.inboundMatchMode","typeLabel":"enum\u003cstring>"},"maxEnrollments":{"description":"Frequency cap: max enrollments per person within enrollmentWindow. Both-or-neither with enrollmentWindow.","type":"integer","minimum":1,"maximum":9007199254740991,"uniqueKey":"definition.actions.items.[INDEX].oneOf.0.inputs.maxEnrollments","typeLabel":"integer"},"enrollmentWindow":{"description":"Rolling window for the frequency cap.","type":"string","uniqueKey":"definition.actions.items.[INDEX].oneOf.0.inputs.enrollmentWindow","typeLabel":"string"},"parallelRunsBy":{"description":"Let one person have several runs of this journey at the same time, one per distinct value of this event property (e.g. \"paymentLinkId\"). Use it when a person can have several of the same thing in flight, two payment links or two orders, and each needs its own sequence. Three things to know. It works on cdp_event triggers only, because the run is identified by a property of the triggering event; an event that does not carry the property is refused rather than enrolled. The journey becomes SEND ONLY: no wait-for-reply, conversation or AI nodes, because an inbound message belongs to the person and not to one run, so a single reply would wake every run at once. And every stop event listed in cancelOnEvents matches on this same property, so a completed one stops only its own run and leaves the person's other runs alive. Publish is refused if any of that is violated.","type":"string","minLength":1,"uniqueKey":"definition.actions.items.[INDEX].oneOf.0.inputs.parallelRunsBy","typeLabel":"string"}},"additionalProperties":false,"description":"Trigger node config. Exactly one ENTRY node per journey.","uniqueKey":"definition.actions.items.[INDEX].oneOf.0.inputs","typeLabel":"object"}},"additionalProperties":false,"uniqueKey":"definition.actions.items.[INDEX].oneOf.0","typeLabel":"object"},{"type":"object","required":["id","kind"],"properties":{"id":{"type":"string","minLength":1,"description":"Node id, unique within the journey.","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.1.id","typeLabel":"string"},"kind":{"type":"string","const":"SEND_MESSAGE","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.1.kind","typeLabel":"string"},"name":{"type":"string","minLength":1,"description":"The label shown on the canvas. Required before publishing.","uniqueKey":"definition.actions.items.[INDEX].oneOf.1.name","typeLabel":"string"},"position":{"type":"object","properties":{"x":{"type":"number","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.1.position.x","typeLabel":"number"},"y":{"type":"number","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.1.position.y","typeLabel":"number"}},"required":["x","y"],"additionalProperties":false,"description":"Explicit canvas position. Omit it and the server auto-lays-out the graph top-down; only set it to preserve a hand-arranged layout.","uniqueKey":"definition.actions.items.[INDEX].oneOf.1.position","typeLabel":"object"},"inputs":{"type":"object","properties":{"mode":{"description":"What this send carries: 'template' (an approved WhatsApp template, the default when omitted) or 'free_text' (prose you write, needing `body` instead of `templateId`). free_text emits SENT and WINDOW_CLOSED, both of which must be wired — Meta accepts free-form content only within 24 hours of the customer's last message, checked before sending. Prefer this over the deprecated SEND_WHATSAPP_TEXT node, which is the same send under an older name.","type":"string","enum":["template","free_text"],"uniqueKey":"definition.actions.items.[INDEX].oneOf.1.inputs.mode","typeLabel":"enum\u003cstring>"},"templateId":{"description":"Approved WhatsApp template id. Resolve ids from the catalog.","type":"string","uniqueKey":"definition.actions.items.[INDEX].oneOf.1.inputs.templateId","typeLabel":"string"},"templateName":{"type":"string","uniqueKey":"definition.actions.items.[INDEX].oneOf.1.inputs.templateName","typeLabel":"string"},"body":{"description":"The message text, for mode 'free_text' only. Placeholders are named, like {{customer.name}}, and EVERY one must have a matching entry in `bindings` or publish is refused: an unbound placeholder is sent literally, braces and all. Bind an upstream HTTP response with engagement.nodeOutputs.\u003cnodeId>.body.\u003cfield>.","type":"string","uniqueKey":"definition.actions.items.[INDEX].oneOf.1.inputs.body","typeLabel":"string"},"bindings":{"description":"Map of {{placeholder}} name → variable reference, for `body`. Template mode uses `templateBindings` instead.","type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string","uniqueKey":"definition.actions.items.[INDEX].oneOf.1.inputs.bindings.additionalProperties","typeLabel":"string"},"uniqueKey":"definition.actions.items.[INDEX].oneOf.1.inputs.bindings","typeLabel":"object"},"channel":{"description":"Always whatsapp. Other channels have their own node kind — SEND_SMS for a text, SEND_INSTAGRAM for Instagram, SEND_MESSENGER for Facebook Messenger.","type":"string","const":"whatsapp","uniqueKey":"definition.actions.items.[INDEX].oneOf.1.inputs.channel","typeLabel":"string"},"templateBindings":{"description":"Map of template placeholder → variable reference, or fixed text prefixed `literal:` (e.g. `{ \"2\": \"literal:BIENVENIDA20\" }`) for a value that is the same for every recipient. EVERY placeholder the template declares (body, header, footer, button URL) needs an entry or publish is refused, since an unbound one is sent literally. The only exception: a template whose sole placeholder is {{1}}, with no map at all, falls back to the customer name (not on a Transactional).","type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string","uniqueKey":"definition.actions.items.[INDEX].oneOf.1.inputs.templateBindings.additionalProperties","typeLabel":"string"},"uniqueKey":"definition.actions.items.[INDEX].oneOf.1.inputs.templateBindings","typeLabel":"object"},"channelId":{"description":"Sending WhatsApp channel (WABA) id. Required before publishing.","type":"string","uniqueKey":"definition.actions.items.[INDEX].oneOf.1.inputs.channelId","typeLabel":"string"},"sendImmediately":{"description":"Deprecated business-hours gate; prefer a preceding DELAY.","type":"boolean","uniqueKey":"definition.actions.items.[INDEX].oneOf.1.inputs.sendImmediately","typeLabel":"boolean"},"delivery":{"description":"How the send goes out. Omit for 'immediate'. 'draft' holds the rendered send in the Drafts queue until an org member approves or rejects it, and the run WAITS at this node: approve sends it and continues on SENT; reject emits REJECTED (optional edge — unwired, the run ends). 'draft_continue' queues the same draft but the run moves on at once over the SENT edge, before anything is sent (the step records QUEUED, not SENT): approving later only sends the message, rejecting only discards it, neither moves the customer, and there is no REJECTED handle. Use it to review a sample of a journey's messages without holding its runs, e.g. while migrating from another tool. A wait-for-reply after a queued WhatsApp send starts counting before the message goes out, so give it a timeout longer than the review takes. Both draft modes are refused (`drafts_disabled`) while drafts are turned off for the organization; a published drafted send reached while they're off is skipped (SKIPPED), never sent unreviewed.","type":"string","enum":["immediate","draft","draft_continue"],"uniqueKey":"definition.actions.items.[INDEX].oneOf.1.inputs.delivery","typeLabel":"enum\u003cstring>"},"draftTtlDays":{"description":"Drafted sends only (either draft mode): a draft nobody reviewed within this many days (1-30) expires and is never sent. A waiting run continues on REJECTED when its draft expires. Omit to keep drafts until someone decides them.","type":"integer","minimum":1,"maximum":30,"uniqueKey":"definition.actions.items.[INDEX].oneOf.1.inputs.draftTtlDays","typeLabel":"integer"}},"additionalProperties":false,"description":"Sends WhatsApp: an approved template (default), or free-text prose with mode 'free_text'.","uniqueKey":"definition.actions.items.[INDEX].oneOf.1.inputs","typeLabel":"object"}},"additionalProperties":false,"uniqueKey":"definition.actions.items.[INDEX].oneOf.1","typeLabel":"object"},{"type":"object","required":["id","kind"],"properties":{"id":{"type":"string","minLength":1,"description":"Node id, unique within the journey.","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.2.id","typeLabel":"string"},"kind":{"type":"string","const":"SEND_SMS","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.2.kind","typeLabel":"string"},"name":{"type":"string","minLength":1,"description":"The label shown on the canvas. Required before publishing.","uniqueKey":"definition.actions.items.[INDEX].oneOf.2.name","typeLabel":"string"},"position":{"type":"object","properties":{"x":{"type":"number","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.2.position.x","typeLabel":"number"},"y":{"type":"number","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.2.position.y","typeLabel":"number"}},"required":["x","y"],"additionalProperties":false,"description":"Explicit canvas position. Omit it and the server auto-lays-out the graph top-down; only set it to preserve a hand-arranged layout.","uniqueKey":"definition.actions.items.[INDEX].oneOf.2.position","typeLabel":"object"},"inputs":{"type":"object","properties":{"body":{"description":"The message text. Free text — SMS has no approved-template concept. Placeholders are named, like {{customer.name}}, and EVERY one must have a matching entry in `bindings` or publish is refused: an unbound placeholder is sent literally, braces and all. The opt-out footer and the brand are added by the system; do not write them into the body.","type":"string","uniqueKey":"definition.actions.items.[INDEX].oneOf.2.inputs.body","typeLabel":"string"},"channelId":{"description":"Sending SMS channel id. Required before publishing.","type":"string","uniqueKey":"definition.actions.items.[INDEX].oneOf.2.inputs.channelId","typeLabel":"string"},"bindings":{"description":"Map of {{placeholder}} name → variable reference. The builder writes the path as its own name ({\"customer.name\": \"customer.name\"}); an alias is allowed as long as the body uses the alias.","type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string","uniqueKey":"definition.actions.items.[INDEX].oneOf.2.inputs.bindings.additionalProperties","typeLabel":"string"},"uniqueKey":"definition.actions.items.[INDEX].oneOf.2.inputs.bindings","typeLabel":"object"},"optOutText":{"description":"Opt-out line for this node, overriding the organization's. Must contain the STOP keyword. Omit to use the organization's.","type":"string","uniqueKey":"definition.actions.items.[INDEX].oneOf.2.inputs.optOutText","typeLabel":"string"},"allowEmoji":{"description":"Keep emoji instead of stripping them. Defaults to false, because emoji force UCS-2 encoding, which cuts a message part from 160 characters to 70 and roughly doubles the cost.","type":"boolean","uniqueKey":"definition.actions.items.[INDEX].oneOf.2.inputs.allowEmoji","typeLabel":"boolean"}},"additionalProperties":false,"description":"Sends a plain-text SMS.","uniqueKey":"definition.actions.items.[INDEX].oneOf.2.inputs","typeLabel":"object"}},"additionalProperties":false,"uniqueKey":"definition.actions.items.[INDEX].oneOf.2","typeLabel":"object"},{"type":"object","required":["id","kind"],"properties":{"id":{"type":"string","minLength":1,"description":"Node id, unique within the journey.","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.3.id","typeLabel":"string"},"kind":{"type":"string","const":"SEND_WHATSAPP_TEXT","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.3.kind","typeLabel":"string"},"name":{"type":"string","minLength":1,"description":"The label shown on the canvas. Required before publishing.","uniqueKey":"definition.actions.items.[INDEX].oneOf.3.name","typeLabel":"string"},"position":{"type":"object","properties":{"x":{"type":"number","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.3.position.x","typeLabel":"number"},"y":{"type":"number","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.3.position.y","typeLabel":"number"}},"required":["x","y"],"additionalProperties":false,"description":"Explicit canvas position. Omit it and the server auto-lays-out the graph top-down; only set it to preserve a hand-arranged layout.","uniqueKey":"definition.actions.items.[INDEX].oneOf.3.position","typeLabel":"object"},"inputs":{"type":"object","properties":{"body":{"description":"The message text. Free text — no Meta template approval needed, which is the point of this node. Placeholders are named, like {{customer.name}}, and EVERY one must have a matching entry in `bindings` or publish is refused: an unbound placeholder is sent literally, braces and all. Bind an upstream HTTP response with engagement.nodeOutputs.\u003cnodeId>.body.\u003cfield>.","type":"string","uniqueKey":"definition.actions.items.[INDEX].oneOf.3.inputs.body","typeLabel":"string"},"channelId":{"description":"Sending WhatsApp channel (WABA) id. Required before publishing; it is also the per-number send throttle key.","type":"string","uniqueKey":"definition.actions.items.[INDEX].oneOf.3.inputs.channelId","typeLabel":"string"},"bindings":{"description":"Map of {{placeholder}} name → variable reference. The builder writes the path as its own name ({\"customer.name\": \"customer.name\"}); an alias is allowed as long as the body uses the alias.","type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string","uniqueKey":"definition.actions.items.[INDEX].oneOf.3.inputs.bindings.additionalProperties","typeLabel":"string"},"uniqueKey":"definition.actions.items.[INDEX].oneOf.3.inputs.bindings","typeLabel":"object"}},"additionalProperties":false,"description":"Sends free-text WhatsApp — author-written prose instead of an approved template. Emits SENT or WINDOW_CLOSED, and BOTH must be wired. Meta accepts free-form content only within 24 hours of the customer's last message; the node checks that BEFORE sending (Twilio would accept an out-of-window message and fail it asynchronously with 63016), so WINDOW_CLOSED means nothing was sent and is where you put an approved template. A node with no upstream WAIT_FOR_REPLY / MANAGE_CONVERSATION will usually take WINDOW_CLOSED — publish warns but does not block, because a customer who wrote recently on this number in ANY journey still has an open window.","uniqueKey":"definition.actions.items.[INDEX].oneOf.3.inputs","typeLabel":"object"}},"additionalProperties":false,"uniqueKey":"definition.actions.items.[INDEX].oneOf.3","typeLabel":"object"},{"type":"object","required":["id","kind"],"properties":{"id":{"type":"string","minLength":1,"description":"Node id, unique within the journey.","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.4.id","typeLabel":"string"},"kind":{"type":"string","const":"SEND_INSTAGRAM","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.4.kind","typeLabel":"string"},"name":{"type":"string","minLength":1,"description":"The label shown on the canvas. Required before publishing.","uniqueKey":"definition.actions.items.[INDEX].oneOf.4.name","typeLabel":"string"},"position":{"type":"object","properties":{"x":{"type":"number","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.4.position.x","typeLabel":"number"},"y":{"type":"number","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.4.position.y","typeLabel":"number"}},"required":["x","y"],"additionalProperties":false,"description":"Explicit canvas position. Omit it and the server auto-lays-out the graph top-down; only set it to preserve a hand-arranged layout.","uniqueKey":"definition.actions.items.[INDEX].oneOf.4.position","typeLabel":"object"},"inputs":{"type":"object","properties":{"body":{"description":"The message text. Free text — Instagram has no approved-template concept. Placeholders are named, like {{customer.name}}, and EVERY one must have a matching entry in `bindings` or publish is refused: an unbound placeholder is sent literally, braces and all.","type":"string","uniqueKey":"definition.actions.items.[INDEX].oneOf.4.inputs.body","typeLabel":"string"},"channelId":{"description":"Sending native Instagram channel id. Required before publishing, with no org-primary fallback.","type":"string","uniqueKey":"definition.actions.items.[INDEX].oneOf.4.inputs.channelId","typeLabel":"string"},"bindings":{"description":"Map of {{placeholder}} name → variable reference. The builder writes the path as its own name ({\"customer.name\": \"customer.name\"}); an alias is allowed as long as the body uses the alias.","type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string","uniqueKey":"definition.actions.items.[INDEX].oneOf.4.inputs.bindings.additionalProperties","typeLabel":"string"},"uniqueKey":"definition.actions.items.[INDEX].oneOf.4.inputs.bindings","typeLabel":"object"}},"additionalProperties":false,"description":"Sends free-text Instagram from a chosen native account — no template concept, so every message is author-written prose. Emits SENT or WINDOW_CLOSED, and BOTH must be wired. Meta accepts free-form content only within 24 hours of the customer's last message; the node checks that BEFORE sending, so WINDOW_CLOSED means nothing was sent. Instagram has no template fallback, so WINDOW_CLOSED usually leads to EXIT — say so explicitly rather than leaving it dangling. Exception: in a run an INSTAGRAM_COMMENT trigger started, a shut window sends one private reply to that comment instead (same account, comment under 7 days old and not yet replied to); Meta decides whether it lands.","uniqueKey":"definition.actions.items.[INDEX].oneOf.4.inputs","typeLabel":"object"}},"additionalProperties":false,"uniqueKey":"definition.actions.items.[INDEX].oneOf.4","typeLabel":"object"},{"type":"object","required":["id","kind"],"properties":{"id":{"type":"string","minLength":1,"description":"Node id, unique within the journey.","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.5.id","typeLabel":"string"},"kind":{"type":"string","const":"SEND_EMAIL","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.5.kind","typeLabel":"string"},"name":{"type":"string","minLength":1,"description":"The label shown on the canvas. Required before publishing.","uniqueKey":"definition.actions.items.[INDEX].oneOf.5.name","typeLabel":"string"},"position":{"type":"object","properties":{"x":{"type":"number","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.5.position.x","typeLabel":"number"},"y":{"type":"number","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.5.position.y","typeLabel":"number"}},"required":["x","y"],"additionalProperties":false,"description":"Explicit canvas position. Omit it and the server auto-lays-out the graph top-down; only set it to preserve a hand-arranged layout.","uniqueKey":"definition.actions.items.[INDEX].oneOf.5.position","typeLabel":"object"},"inputs":{"type":"object","properties":{"templateId":{"description":"A PUBLISHED email template id from journeys_email_templates. Required before publishing; a draft or archived template is refused at publish.","type":"string","uniqueKey":"definition.actions.items.[INDEX].oneOf.5.inputs.templateId","typeLabel":"string"},"templateName":{"description":"The template's name, cached so the canvas can label the node without a lookup. Copy it from journeys_email_templates.","type":"string","uniqueKey":"definition.actions.items.[INDEX].oneOf.5.inputs.templateName","typeLabel":"string"},"bindings":{"description":"Map of the template's variable key (its `variables[].key` in journeys_email_templates) → variable reference such as customer.name, or engagement.chatLink for the link that opens this run's web chat. Bind only what you want to reroute: a variable left out resolves its own `path`, as the template was authored.","type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string","uniqueKey":"definition.actions.items.[INDEX].oneOf.5.inputs.bindings.additionalProperties","typeLabel":"string"},"uniqueKey":"definition.actions.items.[INDEX].oneOf.5.inputs.bindings","typeLabel":"object"},"fallbacks":{"description":"Map of the template's variable key → text to send when that variable resolves blank (no value for this person), e.g. { \"customer.name\": \"cliente\" }, keyed by `variables[].key` like `bindings`. Overrides the template's own fallback for this step only. A variable with no fallback anywhere renders empty.","type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string","uniqueKey":"definition.actions.items.[INDEX].oneOf.5.inputs.fallbacks.additionalProperties","typeLabel":"string"},"uniqueKey":"definition.actions.items.[INDEX].oneOf.5.inputs.fallbacks","typeLabel":"object"},"fromSenderIdOverride":{"description":"Sender id to send From for this node only, overriding the template's pick and the org default. Must be a sender with usableAsFrom: true in journeys_email_templates. Omit to inherit.","type":"string","uniqueKey":"definition.actions.items.[INDEX].oneOf.5.inputs.fromSenderIdOverride","typeLabel":"string"},"replyToSenderIdOverride":{"description":"Sender id to use as Reply-To for this node only. Omit to inherit the template, then the org default.","type":"string","uniqueKey":"definition.actions.items.[INDEX].oneOf.5.inputs.replyToSenderIdOverride","typeLabel":"string"},"delivery":{"description":"How the send goes out. Omit for 'immediate'. 'draft' holds the rendered send in the Drafts queue until an org member approves or rejects it, and the run WAITS at this node: approve sends it and continues on SENT; reject emits REJECTED (optional edge — unwired, the run ends). 'draft_continue' queues the same draft but the run moves on at once over the SENT edge, before anything is sent (the step records QUEUED, not SENT): approving later only sends the message, rejecting only discards it, neither moves the customer, and there is no REJECTED handle. Use it to review a sample of a journey's messages without holding its runs, e.g. while migrating from another tool. A wait-for-reply after a queued WhatsApp send starts counting before the message goes out, so give it a timeout longer than the review takes. Both draft modes are refused (`drafts_disabled`) while drafts are turned off for the organization; a published drafted send reached while they're off is skipped (SKIPPED), never sent unreviewed.","type":"string","enum":["immediate","draft","draft_continue"],"uniqueKey":"definition.actions.items.[INDEX].oneOf.5.inputs.delivery","typeLabel":"enum\u003cstring>"},"draftTtlDays":{"description":"Drafted sends only (either draft mode): a draft nobody reviewed within this many days (1-30) expires and is never sent. A waiting run continues on REJECTED when its draft expires. Omit to keep drafts until someone decides them.","type":"integer","minimum":1,"maximum":30,"uniqueKey":"definition.actions.items.[INDEX].oneOf.5.inputs.draftTtlDays","typeLabel":"integer"}},"additionalProperties":false,"description":"Sends a PUBLISHED email template to the customer.","uniqueKey":"definition.actions.items.[INDEX].oneOf.5.inputs","typeLabel":"object"}},"additionalProperties":false,"uniqueKey":"definition.actions.items.[INDEX].oneOf.5","typeLabel":"object"},{"type":"object","required":["id","kind"],"properties":{"id":{"type":"string","minLength":1,"description":"Node id, unique within the journey.","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.6.id","typeLabel":"string"},"kind":{"type":"string","const":"SEND_MESSENGER","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.6.kind","typeLabel":"string"},"name":{"type":"string","minLength":1,"description":"The label shown on the canvas. Required before publishing.","uniqueKey":"definition.actions.items.[INDEX].oneOf.6.name","typeLabel":"string"},"position":{"type":"object","properties":{"x":{"type":"number","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.6.position.x","typeLabel":"number"},"y":{"type":"number","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.6.position.y","typeLabel":"number"}},"required":["x","y"],"additionalProperties":false,"description":"Explicit canvas position. Omit it and the server auto-lays-out the graph top-down; only set it to preserve a hand-arranged layout.","uniqueKey":"definition.actions.items.[INDEX].oneOf.6.position","typeLabel":"object"},"inputs":{"type":"object","properties":{"body":{"description":"The message text, at most 2000 characters. Free text — no approved-template concept. Placeholders are named, like {{customer.name}}, and EVERY one must have a matching entry in `bindings` or publish is refused: an unbound placeholder is sent literally, braces and all.","type":"string","uniqueKey":"definition.actions.items.[INDEX].oneOf.6.inputs.body","typeLabel":"string"},"channelId":{"description":"Sending native Messenger channel (Facebook Page) id, from journeys_message_channels (sendNodeKind SEND_MESSENGER). Required before publishing, with no org-primary fallback.","type":"string","uniqueKey":"definition.actions.items.[INDEX].oneOf.6.inputs.channelId","typeLabel":"string"},"bindings":{"description":"Map of {{placeholder}} name → variable reference. The builder writes the path as its own name ({\"customer.name\": \"customer.name\"}); an alias is allowed as long as the body uses the alias.","type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string","uniqueKey":"definition.actions.items.[INDEX].oneOf.6.inputs.bindings.additionalProperties","typeLabel":"string"},"uniqueKey":"definition.actions.items.[INDEX].oneOf.6.inputs.bindings","typeLabel":"object"}},"additionalProperties":false,"description":"Sends free-text Facebook Messenger from a chosen Page — every message is author-written prose. Emits SENT or WINDOW_CLOSED, and BOTH must be wired. Meta accepts it only within 24 hours of the customer's last message; the node checks that BEFORE sending, so WINDOW_CLOSED means nothing was sent. There is no template fallback, so WINDOW_CLOSED usually leads to EXIT — say so explicitly rather than leaving it dangling. Exception: in a run an FACEBOOK_COMMENT trigger started, a shut window sends one private reply to that comment instead (same Page, comment under 7 days old and not yet replied to); Meta decides whether it lands.","uniqueKey":"definition.actions.items.[INDEX].oneOf.6.inputs","typeLabel":"object"}},"additionalProperties":false,"uniqueKey":"definition.actions.items.[INDEX].oneOf.6","typeLabel":"object"},{"type":"object","required":["id","kind"],"properties":{"id":{"type":"string","minLength":1,"description":"Node id, unique within the journey.","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.7.id","typeLabel":"string"},"kind":{"type":"string","const":"CONVERSATION_BLOCK","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.7.kind","typeLabel":"string"},"name":{"type":"string","minLength":1,"description":"The label shown on the canvas. Required before publishing.","uniqueKey":"definition.actions.items.[INDEX].oneOf.7.name","typeLabel":"string"},"position":{"type":"object","properties":{"x":{"type":"number","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.7.position.x","typeLabel":"number"},"y":{"type":"number","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.7.position.y","typeLabel":"number"}},"required":["x","y"],"additionalProperties":false,"description":"Explicit canvas position. Omit it and the server auto-lays-out the graph top-down; only set it to preserve a hand-arranged layout.","uniqueKey":"definition.actions.items.[INDEX].oneOf.7.position","typeLabel":"object"},"inputs":{"type":"object","properties":{"goal":{"type":"string","uniqueKey":"definition.actions.items.[INDEX].oneOf.7.inputs.goal","typeLabel":"string"},"maxTimeout":{"description":"How long to wait for a reply before timing out.","type":"string","uniqueKey":"definition.actions.items.[INDEX].oneOf.7.inputs.maxTimeout","typeLabel":"string"},"mode":{"type":"string","enum":["AGENT","ESCALATE"],"uniqueKey":"definition.actions.items.[INDEX].oneOf.7.inputs.mode","typeLabel":"enum\u003cstring>"},"outputs":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.7.inputs.outputs.items.[INDEX].id","typeLabel":"string"},"label":{"type":"string","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.7.inputs.outputs.items.[INDEX].label","typeLabel":"string"},"type":{"type":"string","enum":["string","number","date","boolean","json"],"isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.7.inputs.outputs.items.[INDEX].type","typeLabel":"enum\u003cstring>"},"builtin":{"type":"boolean","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.7.inputs.outputs.items.[INDEX].builtin","typeLabel":"boolean"},"description":{"type":"string","uniqueKey":"definition.actions.items.[INDEX].oneOf.7.inputs.outputs.items.[INDEX].description","typeLabel":"string"}},"required":["id","label","type","builtin"],"additionalProperties":false,"uniqueKey":"definition.actions.items.[INDEX].oneOf.7.inputs.outputs.items.[INDEX]","typeLabel":"object"},"uniqueKey":"definition.actions.items.[INDEX].oneOf.7.inputs.outputs","typeLabel":"object[]"}},"additionalProperties":false,"description":"Legacy combined wait + AI conversation block.","uniqueKey":"definition.actions.items.[INDEX].oneOf.7.inputs","typeLabel":"object"}},"additionalProperties":false,"uniqueKey":"definition.actions.items.[INDEX].oneOf.7","typeLabel":"object"},{"type":"object","required":["id","kind"],"properties":{"id":{"type":"string","minLength":1,"description":"Node id, unique within the journey.","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.8.id","typeLabel":"string"},"kind":{"type":"string","const":"WAIT_FOR_REPLY","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.8.kind","typeLabel":"string"},"name":{"type":"string","minLength":1,"description":"The label shown on the canvas. Required before publishing.","uniqueKey":"definition.actions.items.[INDEX].oneOf.8.name","typeLabel":"string"},"position":{"type":"object","properties":{"x":{"type":"number","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.8.position.x","typeLabel":"number"},"y":{"type":"number","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.8.position.y","typeLabel":"number"}},"required":["x","y"],"additionalProperties":false,"description":"Explicit canvas position. Omit it and the server auto-lays-out the graph top-down; only set it to preserve a hand-arranged layout.","uniqueKey":"definition.actions.items.[INDEX].oneOf.8.position","typeLabel":"object"},"inputs":{"type":"object","properties":{"maxTimeout":{"description":"How long to wait for the first reply before timing out.","type":"string","uniqueKey":"definition.actions.items.[INDEX].oneOf.8.inputs.maxTimeout","typeLabel":"string"}},"additionalProperties":false,"description":"Waits for the person to reply.","uniqueKey":"definition.actions.items.[INDEX].oneOf.8.inputs","typeLabel":"object"}},"additionalProperties":false,"uniqueKey":"definition.actions.items.[INDEX].oneOf.8","typeLabel":"object"},{"type":"object","required":["id","kind"],"properties":{"id":{"type":"string","minLength":1,"description":"Node id, unique within the journey.","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.9.id","typeLabel":"string"},"kind":{"type":"string","const":"MANAGE_CONVERSATION","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.9.kind","typeLabel":"string"},"name":{"type":"string","minLength":1,"description":"The label shown on the canvas. Required before publishing.","uniqueKey":"definition.actions.items.[INDEX].oneOf.9.name","typeLabel":"string"},"position":{"type":"object","properties":{"x":{"type":"number","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.9.position.x","typeLabel":"number"},"y":{"type":"number","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.9.position.y","typeLabel":"number"}},"required":["x","y"],"additionalProperties":false,"description":"Explicit canvas position. Omit it and the server auto-lays-out the graph top-down; only set it to preserve a hand-arranged layout.","uniqueKey":"definition.actions.items.[INDEX].oneOf.9.position","typeLabel":"object"},"inputs":{"type":"object","properties":{"mode":{"description":"AGENT (AI-led) or ESCALATE (human handoff). Defaults to AGENT.","type":"string","enum":["AGENT","ESCALATE"],"uniqueKey":"definition.actions.items.[INDEX].oneOf.9.inputs.mode","typeLabel":"enum\u003cstring>"},"goal":{"description":"Instructions for this conversation step only, on top of the initiative objective (e.g. 'Confirm the delivery address before anything else'). AGENT mode only; ignored in ESCALATE.","type":"string","uniqueKey":"definition.actions.items.[INDEX].oneOf.9.inputs.goal","typeLabel":"string"},"inactivityTimeout":{"description":"Optional custom idle window (e.g. '2h', '30m') that overrides the global inactive-conversation close. Resets on each inbound message; after this much silence the node closes the conversation (routes CLOSED), unless the AI has escalated it to a human, in which case it stays open. Hard cap 24h; under 30m is allowed but flagged 'not recommended'. Requires the journey-inactivity-timeout flag.","type":"string","uniqueKey":"definition.actions.items.[INDEX].oneOf.9.inputs.inactivityTimeout","typeLabel":"string"}},"additionalProperties":false,"description":"Runs the AI-led conversation.","uniqueKey":"definition.actions.items.[INDEX].oneOf.9.inputs","typeLabel":"object"}},"additionalProperties":false,"uniqueKey":"definition.actions.items.[INDEX].oneOf.9","typeLabel":"object"},{"type":"object","required":["id","kind"],"properties":{"id":{"type":"string","minLength":1,"description":"Node id, unique within the journey.","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.10.id","typeLabel":"string"},"kind":{"type":"string","const":"DISPATCH_EVENT","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.10.kind","typeLabel":"string"},"name":{"type":"string","minLength":1,"description":"The label shown on the canvas. Required before publishing.","uniqueKey":"definition.actions.items.[INDEX].oneOf.10.name","typeLabel":"string"},"position":{"type":"object","properties":{"x":{"type":"number","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.10.position.x","typeLabel":"number"},"y":{"type":"number","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.10.position.y","typeLabel":"number"}},"required":["x","y"],"additionalProperties":false,"description":"Explicit canvas position. Omit it and the server auto-lays-out the graph top-down; only set it to preserve a hand-arranged layout.","uniqueKey":"definition.actions.items.[INDEX].oneOf.10.position","typeLabel":"object"},"inputs":{"type":"object","properties":{"eventName":{"type":"string","minLength":1,"description":"CDP event name to record. Must match the CDP name pattern.","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.10.inputs.eventName","typeLabel":"string"},"properties":{"description":"Literal string values, or { var: path } bindings resolved to typed values at dispatch time.","type":"object","propertyNames":{"type":"string"},"additionalProperties":{"oneOf":[{"type":"string","uniqueKey":"definition.actions.items.[INDEX].oneOf.10.inputs.properties.additionalProperties.oneOf.0","typeLabel":"string"},{"type":"object","required":["var"],"properties":{"var":{"type":"string","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.10.inputs.properties.additionalProperties.oneOf.1.var","typeLabel":"string"}},"additionalProperties":false,"uniqueKey":"definition.actions.items.[INDEX].oneOf.10.inputs.properties.additionalProperties.oneOf.1","typeLabel":"object"}],"uniqueKey":"definition.actions.items.[INDEX].oneOf.10.inputs.properties.additionalProperties","typeLabel":"string | object"},"uniqueKey":"definition.actions.items.[INDEX].oneOf.10.inputs.properties","typeLabel":"object"},"description":{"type":"string","uniqueKey":"definition.actions.items.[INDEX].oneOf.10.inputs.description","typeLabel":"string"}},"required":["eventName"],"additionalProperties":false,"description":"Records a CDP event for the person.","uniqueKey":"definition.actions.items.[INDEX].oneOf.10.inputs","typeLabel":"object"}},"additionalProperties":false,"uniqueKey":"definition.actions.items.[INDEX].oneOf.10","typeLabel":"object"},{"type":"object","required":["id","kind"],"properties":{"id":{"type":"string","minLength":1,"description":"Node id, unique within the journey.","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.11.id","typeLabel":"string"},"kind":{"type":"string","const":"DELAY","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.11.kind","typeLabel":"string"},"name":{"type":"string","minLength":1,"description":"The label shown on the canvas. Required before publishing.","uniqueKey":"definition.actions.items.[INDEX].oneOf.11.name","typeLabel":"string"},"position":{"type":"object","properties":{"x":{"type":"number","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.11.position.x","typeLabel":"number"},"y":{"type":"number","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.11.position.y","typeLabel":"number"}},"required":["x","y"],"additionalProperties":false,"description":"Explicit canvas position. Omit it and the server auto-lays-out the graph top-down; only set it to preserve a hand-arranged layout.","uniqueKey":"definition.actions.items.[INDEX].oneOf.11.position","typeLabel":"object"},"inputs":{"type":"object","properties":{"mode":{"description":"How the wait is measured. Defaults to duration.","type":"string","enum":["duration","until_date","until_weekday"],"uniqueKey":"definition.actions.items.[INDEX].oneOf.11.inputs.mode","typeLabel":"enum\u003cstring>"},"duration":{"description":"For mode duration.","type":"string","uniqueKey":"definition.actions.items.[INDEX].oneOf.11.inputs.duration","typeLabel":"string"},"targetAt":{"description":"ISO 8601 instant, for mode until_date.","type":"string","uniqueKey":"definition.actions.items.[INDEX].oneOf.11.inputs.targetAt","typeLabel":"string"},"weekdays":{"description":"ISO weekdays 1=Mon..7=Sun, for mode until_weekday.","type":"array","items":{"type":"integer","minimum":1,"maximum":7,"uniqueKey":"definition.actions.items.[INDEX].oneOf.11.inputs.weekdays.items.[INDEX]","typeLabel":"integer"},"uniqueKey":"definition.actions.items.[INDEX].oneOf.11.inputs.weekdays","typeLabel":"integer[]"},"windowStartMinutes":{"type":"integer","minimum":0,"maximum":1439,"uniqueKey":"definition.actions.items.[INDEX].oneOf.11.inputs.windowStartMinutes","typeLabel":"integer"},"windowEndMinutes":{"type":"integer","minimum":0,"maximum":1439,"uniqueKey":"definition.actions.items.[INDEX].oneOf.11.inputs.windowEndMinutes","typeLabel":"integer"},"timezone":{"description":"IANA timezone. Load-bearing for until_weekday.","type":"string","uniqueKey":"definition.actions.items.[INDEX].oneOf.11.inputs.timezone","typeLabel":"string"},"description":{"type":"string","uniqueKey":"definition.actions.items.[INDEX].oneOf.11.inputs.description","typeLabel":"string"}},"additionalProperties":false,"description":"Pauses the run.","uniqueKey":"definition.actions.items.[INDEX].oneOf.11.inputs","typeLabel":"object"}},"additionalProperties":false,"uniqueKey":"definition.actions.items.[INDEX].oneOf.11","typeLabel":"object"},{"type":"object","required":["id","kind"],"properties":{"id":{"type":"string","minLength":1,"description":"Node id, unique within the journey.","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.12.id","typeLabel":"string"},"kind":{"type":"string","const":"DECISION","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.12.kind","typeLabel":"string"},"name":{"type":"string","minLength":1,"description":"The label shown on the canvas. Required before publishing.","uniqueKey":"definition.actions.items.[INDEX].oneOf.12.name","typeLabel":"string"},"position":{"type":"object","properties":{"x":{"type":"number","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.12.position.x","typeLabel":"number"},"y":{"type":"number","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.12.position.y","typeLabel":"number"}},"required":["x","y"],"additionalProperties":false,"description":"Explicit canvas position. Omit it and the server auto-lays-out the graph top-down; only set it to preserve a hand-arranged layout.","uniqueKey":"definition.actions.items.[INDEX].oneOf.12.position","typeLabel":"object"},"inputs":{"type":"object","properties":{"logic":{"type":"string","enum":["AND","OR"],"isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.12.inputs.logic","typeLabel":"enum\u003cstring>"},"conditions":{"type":"array","items":{"oneOf":[{"type":"object","description":"One decision condition.","required":["kind","selectionPath","operator","value"],"properties":{"kind":{"type":"string","const":"value","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.12.inputs.conditions.items.[INDEX].oneOf.0.kind","typeLabel":"string"},"selectionPath":{"type":"string","description":"Dot-path into the run; must start with one of \"engagement.workflowState.\", \"engagement.extracted.\", \"engagement.nodeOutputs.\", \"engagement.conversation.\" (e.g. engagement.workflowState.totalPrice). customer.*, person.*, attributes.* and engagement.context.* are NOT resolvable here. Unlike the other roots, \"engagement.conversation.\" takes ONE OF a closed set of keys — hoursSinceLastInbound, lastInboundText, lastInboundKind, documentCount, newDocumentCount — and any other key is refused at publish rather than resolving blank. A single formatting helper may follow the path (\"| currency:MXN\", \"| count\"), including on engagement.conversation.*, whose key is checked with the helper stripped off.","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.12.inputs.conditions.items.[INDEX].oneOf.0.selectionPath","typeLabel":"string"},"operator":{"type":"string","enum":["eq","neq","gt","lt","contains","matchesKeyword","isSet"],"description":"How to compare. `contains` is a plain substring test, so \"precio\" also matches \"precioso\". `matchesKeyword` is the ENTRY inbound-trigger matcher instead — accent- and case-folded, matched on word boundaries — so an author who writes the same word on a trigger and mid-journey gets the same answer. Use `matchesKeyword` to route by what the customer said; a value that folds to no letters or digits is refused at publish, because it would match every message. Must also suit the selected field: text tests (`contains`, `matchesKeyword`) are refused on a number, and ordering (`gt`, `lt`) on text — see DECISION_OPERATOR_TYPE_MISMATCH.","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.12.inputs.conditions.items.[INDEX].oneOf.0.operator","typeLabel":"enum\u003cstring>"},"value":{"type":"string","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.12.inputs.conditions.items.[INDEX].oneOf.0.value","typeLabel":"string"}},"additionalProperties":false,"uniqueKey":"definition.actions.items.[INDEX].oneOf.12.inputs.conditions.items.[INDEX].oneOf.0","typeLabel":"object"},{"type":"object","description":"One decision condition.","required":["kind","eventName","subjectSelectionPath","occurred"],"properties":{"kind":{"type":"string","const":"event","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.12.inputs.conditions.items.[INDEX].oneOf.1.kind","typeLabel":"string"},"eventName":{"type":"string","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.12.inputs.conditions.items.[INDEX].oneOf.1.eventName","typeLabel":"string"},"subjectSelectionPath":{"type":"string","description":"Dot-path into the run; must start with one of \"engagement.workflowState.\", \"engagement.extracted.\", \"engagement.nodeOutputs.\", \"engagement.conversation.\" (e.g. engagement.workflowState.totalPrice). customer.*, person.*, attributes.* and engagement.context.* are NOT resolvable here. Unlike the other roots, \"engagement.conversation.\" takes ONE OF a closed set of keys — hoursSinceLastInbound, lastInboundText, lastInboundKind, documentCount, newDocumentCount — and any other key is refused at publish rather than resolving blank. A single formatting helper may follow the path (\"| currency:MXN\", \"| count\"), including on engagement.conversation.*, whose key is checked with the helper stripped off.","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.12.inputs.conditions.items.[INDEX].oneOf.1.subjectSelectionPath","typeLabel":"string"},"occurred":{"type":"boolean","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.12.inputs.conditions.items.[INDEX].oneOf.1.occurred","typeLabel":"boolean"}},"additionalProperties":false,"uniqueKey":"definition.actions.items.[INDEX].oneOf.12.inputs.conditions.items.[INDEX].oneOf.1","typeLabel":"object"},{"type":"object","description":"One decision condition.","required":["kind","eventNames","occurred"],"properties":{"kind":{"type":"string","const":"person_event","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.12.inputs.conditions.items.[INDEX].oneOf.2.kind","typeLabel":"string"},"eventNames":{"minItems":1,"type":"array","items":{"type":"string","uniqueKey":"definition.actions.items.[INDEX].oneOf.12.inputs.conditions.items.[INDEX].oneOf.2.eventNames.items.[INDEX]","typeLabel":"string"},"description":"Reserved event names (see journeys_event_catalog). The check passes when the run's person recorded at least one of them.","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.12.inputs.conditions.items.[INDEX].oneOf.2.eventNames","typeLabel":"string[]"},"occurred":{"type":"boolean","description":"true: YES when at least one occurred since the run started. false: YES when none did. The window opens strictly after the triggering event (or at enrollment for a run with none), so the trigger itself never counts. No single CDP person on the run → false either way. Use it for abandonment: trigger → DELAY → \"did any of {follow-up events} occur?\".","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.12.inputs.conditions.items.[INDEX].oneOf.2.occurred","typeLabel":"boolean"}},"additionalProperties":false,"uniqueKey":"definition.actions.items.[INDEX].oneOf.12.inputs.conditions.items.[INDEX].oneOf.2","typeLabel":"object"},{"type":"object","description":"One decision condition.","required":["kind","term"],"properties":{"kind":{"type":"string","const":"cdp_predicate","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.12.inputs.conditions.items.[INDEX].oneOf.3.kind","typeLabel":"string"},"term":{"type":"object","properties":{"attr":{"type":"string","minLength":1,"description":"Typed person column, `attributes.\u003ckey>`, or `computed.\u003ckey>`. See journeys_condition_catalog for the available attributes.","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.12.inputs.conditions.items.[INDEX].oneOf.3.term.attr","typeLabel":"string"},"type":{"type":"string","enum":["STRING","NUMBER","BOOLEAN","DATE","JSON","ARRAY"],"description":"CDP attribute type. Determines which `op` values are legal — see journeys_condition_catalog.","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.12.inputs.conditions.items.[INDEX].oneOf.3.term.type","typeLabel":"enum\u003cstring>"},"op":{"type":"string","minLength":1,"description":"Segments OperatorEnum value (eq | neq | gt | lt | in_last_n | ...). Must be legal for `type` — see journeys_condition_catalog.","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.12.inputs.conditions.items.[INDEX].oneOf.3.term.op","typeLabel":"string"},"value":{"oneOf":[{"type":"string","description":"Shape depends on `op`: a plain scalar for eq/neq/gt/lt/starts_with/…, an array for in/not_in/contains/not_contains, {from, to} for between, {amount, unit} for in_last_n/in_next_n/more_than_n_ago/more_than_n_from_now, {minAmount, maxAmount, unit} for between_n_and_m_ago, {daysOffset} for exactly_n_from_today. Omit entirely for is_null/is_not_null.","uniqueKey":"definition.actions.items.[INDEX].oneOf.12.inputs.conditions.items.[INDEX].oneOf.3.term.value.oneOf.0","typeLabel":"string"},{"type":"number","description":"Shape depends on `op`: a plain scalar for eq/neq/gt/lt/starts_with/…, an array for in/not_in/contains/not_contains, {from, to} for between, {amount, unit} for in_last_n/in_next_n/more_than_n_ago/more_than_n_from_now, {minAmount, maxAmount, unit} for between_n_and_m_ago, {daysOffset} for exactly_n_from_today. Omit entirely for is_null/is_not_null.","uniqueKey":"definition.actions.items.[INDEX].oneOf.12.inputs.conditions.items.[INDEX].oneOf.3.term.value.oneOf.1","typeLabel":"number"},{"type":"boolean","description":"Shape depends on `op`: a plain scalar for eq/neq/gt/lt/starts_with/…, an array for in/not_in/contains/not_contains, {from, to} for between, {amount, unit} for in_last_n/in_next_n/more_than_n_ago/more_than_n_from_now, {minAmount, maxAmount, unit} for between_n_and_m_ago, {daysOffset} for exactly_n_from_today. Omit entirely for is_null/is_not_null.","uniqueKey":"definition.actions.items.[INDEX].oneOf.12.inputs.conditions.items.[INDEX].oneOf.3.term.value.oneOf.2","typeLabel":"boolean"},{"type":"array","items":{"type":"any","uniqueKey":"definition.actions.items.[INDEX].oneOf.12.inputs.conditions.items.[INDEX].oneOf.3.term.value.oneOf.3.items.[INDEX]","typeLabel":"any"},"description":"Shape depends on `op`: a plain scalar for eq/neq/gt/lt/starts_with/…, an array for in/not_in/contains/not_contains, {from, to} for between, {amount, unit} for in_last_n/in_next_n/more_than_n_ago/more_than_n_from_now, {minAmount, maxAmount, unit} for between_n_and_m_ago, {daysOffset} for exactly_n_from_today. Omit entirely for is_null/is_not_null.","uniqueKey":"definition.actions.items.[INDEX].oneOf.12.inputs.conditions.items.[INDEX].oneOf.3.term.value.oneOf.3","typeLabel":"any[]"},{"type":"object","description":"Shape depends on `op`: a plain scalar for eq/neq/gt/lt/starts_with/…, an array for in/not_in/contains/not_contains, {from, to} for between, {amount, unit} for in_last_n/in_next_n/more_than_n_ago/more_than_n_from_now, {minAmount, maxAmount, unit} for between_n_and_m_ago, {daysOffset} for exactly_n_from_today. Omit entirely for is_null/is_not_null.","required":["from","to"],"properties":{"from":{"type":"string","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.12.inputs.conditions.items.[INDEX].oneOf.3.term.value.oneOf.4.from","typeLabel":"string"},"to":{"type":"string","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.12.inputs.conditions.items.[INDEX].oneOf.3.term.value.oneOf.4.to","typeLabel":"string"}},"additionalProperties":false,"uniqueKey":"definition.actions.items.[INDEX].oneOf.12.inputs.conditions.items.[INDEX].oneOf.3.term.value.oneOf.4","typeLabel":"object"},{"type":"object","description":"Shape depends on `op`: a plain scalar for eq/neq/gt/lt/starts_with/…, an array for in/not_in/contains/not_contains, {from, to} for between, {amount, unit} for in_last_n/in_next_n/more_than_n_ago/more_than_n_from_now, {minAmount, maxAmount, unit} for between_n_and_m_ago, {daysOffset} for exactly_n_from_today. Omit entirely for is_null/is_not_null.","required":["amount","unit"],"properties":{"amount":{"type":"integer","minimum":1,"maximum":9999,"isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.12.inputs.conditions.items.[INDEX].oneOf.3.term.value.oneOf.5.amount","typeLabel":"integer"},"unit":{"type":"string","enum":["days","weeks","months"],"isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.12.inputs.conditions.items.[INDEX].oneOf.3.term.value.oneOf.5.unit","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"uniqueKey":"definition.actions.items.[INDEX].oneOf.12.inputs.conditions.items.[INDEX].oneOf.3.term.value.oneOf.5","typeLabel":"object"},{"type":"object","description":"Shape depends on `op`: a plain scalar for eq/neq/gt/lt/starts_with/…, an array for in/not_in/contains/not_contains, {from, to} for between, {amount, unit} for in_last_n/in_next_n/more_than_n_ago/more_than_n_from_now, {minAmount, maxAmount, unit} for between_n_and_m_ago, {daysOffset} for exactly_n_from_today. Omit entirely for is_null/is_not_null.","required":["minAmount","maxAmount","unit"],"properties":{"minAmount":{"type":"integer","minimum":0,"maximum":9999,"isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.12.inputs.conditions.items.[INDEX].oneOf.3.term.value.oneOf.6.minAmount","typeLabel":"integer"},"maxAmount":{"type":"integer","minimum":1,"maximum":9999,"isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.12.inputs.conditions.items.[INDEX].oneOf.3.term.value.oneOf.6.maxAmount","typeLabel":"integer"},"unit":{"type":"string","enum":["days","weeks","months"],"isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.12.inputs.conditions.items.[INDEX].oneOf.3.term.value.oneOf.6.unit","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"uniqueKey":"definition.actions.items.[INDEX].oneOf.12.inputs.conditions.items.[INDEX].oneOf.3.term.value.oneOf.6","typeLabel":"object"},{"type":"object","description":"Shape depends on `op`: a plain scalar for eq/neq/gt/lt/starts_with/…, an array for in/not_in/contains/not_contains, {from, to} for between, {amount, unit} for in_last_n/in_next_n/more_than_n_ago/more_than_n_from_now, {minAmount, maxAmount, unit} for between_n_and_m_ago, {daysOffset} for exactly_n_from_today. Omit entirely for is_null/is_not_null.","required":["daysOffset"],"properties":{"daysOffset":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.12.inputs.conditions.items.[INDEX].oneOf.3.term.value.oneOf.7.daysOffset","typeLabel":"integer"},"rollForward":{"type":"object","properties":{"fromDow":{"type":"integer","minimum":0,"maximum":6,"isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.12.inputs.conditions.items.[INDEX].oneOf.3.term.value.oneOf.7.rollForward.fromDow","typeLabel":"integer"},"includeDows":{"minItems":1,"type":"array","items":{"type":"integer","minimum":0,"maximum":6,"uniqueKey":"definition.actions.items.[INDEX].oneOf.12.inputs.conditions.items.[INDEX].oneOf.3.term.value.oneOf.7.rollForward.includeDows.items.[INDEX]","typeLabel":"integer"},"isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.12.inputs.conditions.items.[INDEX].oneOf.3.term.value.oneOf.7.rollForward.includeDows","typeLabel":"integer[]"}},"required":["fromDow","includeDows"],"additionalProperties":false,"uniqueKey":"definition.actions.items.[INDEX].oneOf.12.inputs.conditions.items.[INDEX].oneOf.3.term.value.oneOf.7.rollForward","typeLabel":"object"}},"additionalProperties":false,"uniqueKey":"definition.actions.items.[INDEX].oneOf.12.inputs.conditions.items.[INDEX].oneOf.3.term.value.oneOf.7","typeLabel":"object"}],"uniqueKey":"definition.actions.items.[INDEX].oneOf.12.inputs.conditions.items.[INDEX].oneOf.3.term.value","typeLabel":"string · number · boolean · any[] · object · object · object · object"}},"required":["attr","type","op"],"additionalProperties":false,"description":"A single live person/computed predicate term. See journeys_condition_catalog for its shape and the legal operator/value pairing.","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.12.inputs.conditions.items.[INDEX].oneOf.3.term","typeLabel":"object"}},"additionalProperties":false,"uniqueKey":"definition.actions.items.[INDEX].oneOf.12.inputs.conditions.items.[INDEX].oneOf.3","typeLabel":"object"},{"type":"object","description":"One decision condition.","required":["kind","objectType","matchAttr","matchSelectionPath","exists"],"properties":{"kind":{"type":"string","const":"cdp_object","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.12.inputs.conditions.items.[INDEX].oneOf.4.kind","typeLabel":"string"},"objectType":{"type":"string","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.12.inputs.conditions.items.[INDEX].oneOf.4.objectType","typeLabel":"string"},"matchAttr":{"type":"string","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.12.inputs.conditions.items.[INDEX].oneOf.4.matchAttr","typeLabel":"string"},"matchSelectionPath":{"type":"string","description":"Dot-path into the run; must start with one of \"engagement.workflowState.\", \"engagement.extracted.\", \"engagement.nodeOutputs.\", \"engagement.conversation.\" (e.g. engagement.workflowState.totalPrice). customer.*, person.*, attributes.* and engagement.context.* are NOT resolvable here. Unlike the other roots, \"engagement.conversation.\" takes ONE OF a closed set of keys — hoursSinceLastInbound, lastInboundText, lastInboundKind, documentCount, newDocumentCount — and any other key is refused at publish rather than resolving blank. A single formatting helper may follow the path (\"| currency:MXN\", \"| count\"), including on engagement.conversation.*, whose key is checked with the helper stripped off.","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.12.inputs.conditions.items.[INDEX].oneOf.4.matchSelectionPath","typeLabel":"string"},"exists":{"type":"boolean","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.12.inputs.conditions.items.[INDEX].oneOf.4.exists","typeLabel":"boolean"}},"additionalProperties":false,"uniqueKey":"definition.actions.items.[INDEX].oneOf.12.inputs.conditions.items.[INDEX].oneOf.4","typeLabel":"object"},{"type":"object","description":"One decision condition.","required":["kind","objectType","term","quantifier"],"properties":{"kind":{"type":"string","const":"matched_object","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.12.inputs.conditions.items.[INDEX].oneOf.5.kind","typeLabel":"string"},"objectType":{"type":"string","minLength":1,"description":"Custom-object type whose matched rows (the rows that put this person in the entry segment, `workflowState.__matched.\u003ctype>`) are re-read LIVE. Segment-triggered journeys only; must be one of the segment's matched types.","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.12.inputs.conditions.items.[INDEX].oneOf.5.objectType","typeLabel":"string"},"term":{"type":"object","properties":{"attr":{"type":"string","minLength":1,"description":"The BARE attribute key of the matched object type, exactly as in its attribute catalog (e.g. `order_status`). No `attributes.`, `object.` or `computed.` prefix. `type` must equal the catalogued type.","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.12.inputs.conditions.items.[INDEX].oneOf.5.term.attr","typeLabel":"string"},"type":{"type":"string","enum":["STRING","NUMBER","BOOLEAN","DATE","JSON","ARRAY"],"description":"CDP attribute type. Determines which `op` values are legal — see journeys_condition_catalog.","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.12.inputs.conditions.items.[INDEX].oneOf.5.term.type","typeLabel":"enum\u003cstring>"},"op":{"type":"string","minLength":1,"description":"Segments OperatorEnum value (eq | neq | gt | lt | in_last_n | ...). Must be legal for `type` — see journeys_condition_catalog.","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.12.inputs.conditions.items.[INDEX].oneOf.5.term.op","typeLabel":"string"},"value":{"oneOf":[{"type":"string","description":"Shape depends on `op`: a plain scalar for eq/neq/gt/lt/starts_with/…, an array for in/not_in/contains/not_contains, {from, to} for between, {amount, unit} for in_last_n/in_next_n/more_than_n_ago/more_than_n_from_now, {minAmount, maxAmount, unit} for between_n_and_m_ago, {daysOffset} for exactly_n_from_today. Omit entirely for is_null/is_not_null.","uniqueKey":"definition.actions.items.[INDEX].oneOf.12.inputs.conditions.items.[INDEX].oneOf.5.term.value.oneOf.0","typeLabel":"string"},{"type":"number","description":"Shape depends on `op`: a plain scalar for eq/neq/gt/lt/starts_with/…, an array for in/not_in/contains/not_contains, {from, to} for between, {amount, unit} for in_last_n/in_next_n/more_than_n_ago/more_than_n_from_now, {minAmount, maxAmount, unit} for between_n_and_m_ago, {daysOffset} for exactly_n_from_today. Omit entirely for is_null/is_not_null.","uniqueKey":"definition.actions.items.[INDEX].oneOf.12.inputs.conditions.items.[INDEX].oneOf.5.term.value.oneOf.1","typeLabel":"number"},{"type":"boolean","description":"Shape depends on `op`: a plain scalar for eq/neq/gt/lt/starts_with/…, an array for in/not_in/contains/not_contains, {from, to} for between, {amount, unit} for in_last_n/in_next_n/more_than_n_ago/more_than_n_from_now, {minAmount, maxAmount, unit} for between_n_and_m_ago, {daysOffset} for exactly_n_from_today. Omit entirely for is_null/is_not_null.","uniqueKey":"definition.actions.items.[INDEX].oneOf.12.inputs.conditions.items.[INDEX].oneOf.5.term.value.oneOf.2","typeLabel":"boolean"},{"type":"array","items":{"type":"any","uniqueKey":"definition.actions.items.[INDEX].oneOf.12.inputs.conditions.items.[INDEX].oneOf.5.term.value.oneOf.3.items.[INDEX]","typeLabel":"any"},"description":"Shape depends on `op`: a plain scalar for eq/neq/gt/lt/starts_with/…, an array for in/not_in/contains/not_contains, {from, to} for between, {amount, unit} for in_last_n/in_next_n/more_than_n_ago/more_than_n_from_now, {minAmount, maxAmount, unit} for between_n_and_m_ago, {daysOffset} for exactly_n_from_today. Omit entirely for is_null/is_not_null.","uniqueKey":"definition.actions.items.[INDEX].oneOf.12.inputs.conditions.items.[INDEX].oneOf.5.term.value.oneOf.3","typeLabel":"any[]"},{"type":"object","description":"Shape depends on `op`: a plain scalar for eq/neq/gt/lt/starts_with/…, an array for in/not_in/contains/not_contains, {from, to} for between, {amount, unit} for in_last_n/in_next_n/more_than_n_ago/more_than_n_from_now, {minAmount, maxAmount, unit} for between_n_and_m_ago, {daysOffset} for exactly_n_from_today. Omit entirely for is_null/is_not_null.","required":["from","to"],"properties":{"from":{"type":"string","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.12.inputs.conditions.items.[INDEX].oneOf.5.term.value.oneOf.4.from","typeLabel":"string"},"to":{"type":"string","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.12.inputs.conditions.items.[INDEX].oneOf.5.term.value.oneOf.4.to","typeLabel":"string"}},"additionalProperties":false,"uniqueKey":"definition.actions.items.[INDEX].oneOf.12.inputs.conditions.items.[INDEX].oneOf.5.term.value.oneOf.4","typeLabel":"object"},{"type":"object","description":"Shape depends on `op`: a plain scalar for eq/neq/gt/lt/starts_with/…, an array for in/not_in/contains/not_contains, {from, to} for between, {amount, unit} for in_last_n/in_next_n/more_than_n_ago/more_than_n_from_now, {minAmount, maxAmount, unit} for between_n_and_m_ago, {daysOffset} for exactly_n_from_today. Omit entirely for is_null/is_not_null.","required":["amount","unit"],"properties":{"amount":{"type":"integer","minimum":1,"maximum":9999,"isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.12.inputs.conditions.items.[INDEX].oneOf.5.term.value.oneOf.5.amount","typeLabel":"integer"},"unit":{"type":"string","enum":["days","weeks","months"],"isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.12.inputs.conditions.items.[INDEX].oneOf.5.term.value.oneOf.5.unit","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"uniqueKey":"definition.actions.items.[INDEX].oneOf.12.inputs.conditions.items.[INDEX].oneOf.5.term.value.oneOf.5","typeLabel":"object"},{"type":"object","description":"Shape depends on `op`: a plain scalar for eq/neq/gt/lt/starts_with/…, an array for in/not_in/contains/not_contains, {from, to} for between, {amount, unit} for in_last_n/in_next_n/more_than_n_ago/more_than_n_from_now, {minAmount, maxAmount, unit} for between_n_and_m_ago, {daysOffset} for exactly_n_from_today. Omit entirely for is_null/is_not_null.","required":["minAmount","maxAmount","unit"],"properties":{"minAmount":{"type":"integer","minimum":0,"maximum":9999,"isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.12.inputs.conditions.items.[INDEX].oneOf.5.term.value.oneOf.6.minAmount","typeLabel":"integer"},"maxAmount":{"type":"integer","minimum":1,"maximum":9999,"isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.12.inputs.conditions.items.[INDEX].oneOf.5.term.value.oneOf.6.maxAmount","typeLabel":"integer"},"unit":{"type":"string","enum":["days","weeks","months"],"isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.12.inputs.conditions.items.[INDEX].oneOf.5.term.value.oneOf.6.unit","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"uniqueKey":"definition.actions.items.[INDEX].oneOf.12.inputs.conditions.items.[INDEX].oneOf.5.term.value.oneOf.6","typeLabel":"object"},{"type":"object","description":"Shape depends on `op`: a plain scalar for eq/neq/gt/lt/starts_with/…, an array for in/not_in/contains/not_contains, {from, to} for between, {amount, unit} for in_last_n/in_next_n/more_than_n_ago/more_than_n_from_now, {minAmount, maxAmount, unit} for between_n_and_m_ago, {daysOffset} for exactly_n_from_today. Omit entirely for is_null/is_not_null.","required":["daysOffset"],"properties":{"daysOffset":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.12.inputs.conditions.items.[INDEX].oneOf.5.term.value.oneOf.7.daysOffset","typeLabel":"integer"},"rollForward":{"type":"object","properties":{"fromDow":{"type":"integer","minimum":0,"maximum":6,"isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.12.inputs.conditions.items.[INDEX].oneOf.5.term.value.oneOf.7.rollForward.fromDow","typeLabel":"integer"},"includeDows":{"minItems":1,"type":"array","items":{"type":"integer","minimum":0,"maximum":6,"uniqueKey":"definition.actions.items.[INDEX].oneOf.12.inputs.conditions.items.[INDEX].oneOf.5.term.value.oneOf.7.rollForward.includeDows.items.[INDEX]","typeLabel":"integer"},"isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.12.inputs.conditions.items.[INDEX].oneOf.5.term.value.oneOf.7.rollForward.includeDows","typeLabel":"integer[]"}},"required":["fromDow","includeDows"],"additionalProperties":false,"uniqueKey":"definition.actions.items.[INDEX].oneOf.12.inputs.conditions.items.[INDEX].oneOf.5.term.value.oneOf.7.rollForward","typeLabel":"object"}},"additionalProperties":false,"uniqueKey":"definition.actions.items.[INDEX].oneOf.12.inputs.conditions.items.[INDEX].oneOf.5.term.value.oneOf.7","typeLabel":"object"}],"uniqueKey":"definition.actions.items.[INDEX].oneOf.12.inputs.conditions.items.[INDEX].oneOf.5.term.value","typeLabel":"string · number · boolean · any[] · object · object · object · object"}},"required":["attr","type","op"],"additionalProperties":false,"description":"Condition on the row's CURRENT attributes. `attr` is the bare object attribute key (e.g. `order_status`, not `object.attributes.order_status`); `type`/`op`/`value` follow the same rules as a cdp_predicate term.","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.12.inputs.conditions.items.[INDEX].oneOf.5.term","typeLabel":"object"},"quantifier":{"type":"string","enum":["any","all"],"description":"`any`: YES when at least one matched row passes. `all`: YES only when every matched row still exists and passes. No matched rows on the run → false.","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.12.inputs.conditions.items.[INDEX].oneOf.5.quantifier","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"uniqueKey":"definition.actions.items.[INDEX].oneOf.12.inputs.conditions.items.[INDEX].oneOf.5","typeLabel":"object"}],"uniqueKey":"definition.actions.items.[INDEX].oneOf.12.inputs.conditions.items.[INDEX]","typeLabel":"object"},"isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.12.inputs.conditions","typeLabel":"object[]"},"description":{"type":"string","uniqueKey":"definition.actions.items.[INDEX].oneOf.12.inputs.description","typeLabel":"string"}},"required":["logic","conditions"],"additionalProperties":false,"description":"Two-way branch. Emits YES / NO.","uniqueKey":"definition.actions.items.[INDEX].oneOf.12.inputs","typeLabel":"object"}},"additionalProperties":false,"uniqueKey":"definition.actions.items.[INDEX].oneOf.12","typeLabel":"object"},{"type":"object","required":["id","kind"],"properties":{"id":{"type":"string","minLength":1,"description":"Node id, unique within the journey.","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.13.id","typeLabel":"string"},"kind":{"type":"string","const":"CASE","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.13.kind","typeLabel":"string"},"name":{"type":"string","minLength":1,"description":"The label shown on the canvas. Required before publishing.","uniqueKey":"definition.actions.items.[INDEX].oneOf.13.name","typeLabel":"string"},"position":{"type":"object","properties":{"x":{"type":"number","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.13.position.x","typeLabel":"number"},"y":{"type":"number","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.13.position.y","typeLabel":"number"}},"required":["x","y"],"additionalProperties":false,"description":"Explicit canvas position. Omit it and the server auto-lays-out the graph top-down; only set it to preserve a hand-arranged layout.","uniqueKey":"definition.actions.items.[INDEX].oneOf.13.position","typeLabel":"object"},"inputs":{"type":"object","properties":{"selectionPath":{"type":"string","description":"Value to switch on; must start with one of \"attributes.\", \"engagement.extracted.\", \"engagement.nodeOutputs.\", \"matched.\" (e.g. attributes.plan_tier). \"matched.\u003ctype>.\u003cattr>\" (e.g. matched.order.order_status) switches on the CURRENT value of an attribute of the row that put the person in the entry segment — the first matched row of that type, read live; segment-triggered journeys only, and the type must be in the segment's matched types. A formatting helper (\"| currency:MXN\", \"| count\") is REFUSED here, unlike on a DECISION condition: CASE reads this path raw, so a helper would resolve blank and route case:default on every run.","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.13.inputs.selectionPath","typeLabel":"string"},"branches":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Stable branch id; edge handle is case:\u003cid>.","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.13.inputs.branches.items.[INDEX].id","typeLabel":"string"},"value":{"type":"string","description":"Value matched. Unique within the node.","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.13.inputs.branches.items.[INDEX].value","typeLabel":"string"},"label":{"type":"string","minLength":1,"description":"Required. Names the variant in analytics and on canvas.","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.13.inputs.branches.items.[INDEX].label","typeLabel":"string"}},"required":["id","value","label"],"additionalProperties":false,"uniqueKey":"definition.actions.items.[INDEX].oneOf.13.inputs.branches.items.[INDEX]","typeLabel":"object"},"description":"Up to 10 branches. A case:default handle is always required.","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.13.inputs.branches","typeLabel":"object[]"},"description":{"type":"string","uniqueKey":"definition.actions.items.[INDEX].oneOf.13.inputs.description","typeLabel":"string"}},"required":["selectionPath","branches"],"additionalProperties":false,"description":"N-way switch on a person attribute.","uniqueKey":"definition.actions.items.[INDEX].oneOf.13.inputs","typeLabel":"object"}},"additionalProperties":false,"uniqueKey":"definition.actions.items.[INDEX].oneOf.13","typeLabel":"object"},{"type":"object","required":["id","kind"],"properties":{"id":{"type":"string","minLength":1,"description":"Node id, unique within the journey.","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.14.id","typeLabel":"string"},"kind":{"type":"string","const":"RANDOM_SPLIT","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.14.kind","typeLabel":"string"},"name":{"type":"string","minLength":1,"description":"The label shown on the canvas. Required before publishing.","uniqueKey":"definition.actions.items.[INDEX].oneOf.14.name","typeLabel":"string"},"position":{"type":"object","properties":{"x":{"type":"number","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.14.position.x","typeLabel":"number"},"y":{"type":"number","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.14.position.y","typeLabel":"number"}},"required":["x","y"],"additionalProperties":false,"description":"Explicit canvas position. Omit it and the server auto-lays-out the graph top-down; only set it to preserve a hand-arranged layout.","uniqueKey":"definition.actions.items.[INDEX].oneOf.14.position","typeLabel":"object"},"inputs":{"type":"object","properties":{"arms":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Stable arm id; edge handle is split:\u003cid>.","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.14.inputs.arms.items.[INDEX].id","typeLabel":"string"},"weight":{"type":"integer","minimum":1,"maximum":100,"description":"Integer percentage. A node's arms must total 100.","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.14.inputs.arms.items.[INDEX].weight","typeLabel":"integer"},"label":{"type":"string","uniqueKey":"definition.actions.items.[INDEX].oneOf.14.inputs.arms.items.[INDEX].label","typeLabel":"string"}},"required":["id","weight"],"additionalProperties":false,"uniqueKey":"definition.actions.items.[INDEX].oneOf.14.inputs.arms.items.[INDEX]","typeLabel":"object"},"description":"At least 2 and at most 10 arms whose weights total exactly 100. There is no default handle — every roll lands on a declared arm.","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.14.inputs.arms","typeLabel":"object[]"},"description":{"type":"string","uniqueKey":"definition.actions.items.[INDEX].oneOf.14.inputs.description","typeLabel":"string"}},"required":["arms"],"additionalProperties":false,"description":"Randomly routes each run down one of N weighted arms.","uniqueKey":"definition.actions.items.[INDEX].oneOf.14.inputs","typeLabel":"object"}},"additionalProperties":false,"uniqueKey":"definition.actions.items.[INDEX].oneOf.14","typeLabel":"object"},{"type":"object","required":["id","kind"],"properties":{"id":{"type":"string","minLength":1,"description":"Node id, unique within the journey.","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.15.id","typeLabel":"string"},"kind":{"type":"string","const":"HTTP_REQUEST","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.15.kind","typeLabel":"string"},"name":{"type":"string","minLength":1,"description":"The label shown on the canvas. Required before publishing.","uniqueKey":"definition.actions.items.[INDEX].oneOf.15.name","typeLabel":"string"},"position":{"type":"object","properties":{"x":{"type":"number","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.15.position.x","typeLabel":"number"},"y":{"type":"number","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.15.position.y","typeLabel":"number"}},"required":["x","y"],"additionalProperties":false,"description":"Explicit canvas position. Omit it and the server auto-lays-out the graph top-down; only set it to preserve a hand-arranged layout.","uniqueKey":"definition.actions.items.[INDEX].oneOf.15.position","typeLabel":"object"},"inputs":{"type":"object","properties":{"method":{"type":"string","enum":["GET","POST","PUT","PATCH","DELETE"],"description":"HTTP method.","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.15.inputs.method","typeLabel":"enum\u003cstring>"},"url":{"type":"string","minLength":1,"description":"Target URL. Supports {{variable}} placeholders. Resolvable roots here: customer.\u003cfield> (a single flat field of the customer record), person.\u003cattribute> (CDP), env.\u003ckey> (journey environment), engagement.context.*, engagement.workflowState.*, engagement.extracted.*, engagement.nodeOutputs.\u003cnodeId>.*, engagement.documents (json body, whole quoted token, flag-gated), and engagement.conversation.id / engagement.conversation.inboxUrl — the conversation this run is talking to and its Shared Inbox deep link. Anything else substitutes as an empty string and is reported at publish as UNRESOLVABLE_HTTP_TOKEN. Note engagement.chatLink is SEND_EMAIL-only and does NOT resolve here.","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.15.inputs.url","typeLabel":"string"},"headers":{"description":"Request headers as key/value pairs. Values support the same {{variable}} placeholders as the url. Resolvable roots here: customer.\u003cfield> (a single flat field of the customer record), person.\u003cattribute> (CDP), env.\u003ckey> (journey environment), engagement.context.*, engagement.workflowState.*, engagement.extracted.*, engagement.nodeOutputs.\u003cnodeId>.*, engagement.documents (json body, whole quoted token, flag-gated), and engagement.conversation.id / engagement.conversation.inboxUrl — the conversation this run is talking to and its Shared Inbox deep link. Anything else substitutes as an empty string and is reported at publish as UNRESOLVABLE_HTTP_TOKEN. Note engagement.chatLink is SEND_EMAIL-only and does NOT resolve here.","type":"array","items":{"type":"object","properties":{"key":{"type":"string","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.15.inputs.headers.items.[INDEX].key","typeLabel":"string"},"value":{"type":"string","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.15.inputs.headers.items.[INDEX].value","typeLabel":"string"}},"required":["key","value"],"additionalProperties":false,"uniqueKey":"definition.actions.items.[INDEX].oneOf.15.inputs.headers.items.[INDEX]","typeLabel":"object"},"uniqueKey":"definition.actions.items.[INDEX].oneOf.15.inputs.headers","typeLabel":"object[]"},"body":{"description":"Request body. mode none sends no body. Supports the same {{variable}} placeholders as the url; in json mode a whole quoted token (\"{{engagement.documents}}\") substitutes as a JSON array. Resolvable roots here: customer.\u003cfield> (a single flat field of the customer record), person.\u003cattribute> (CDP), env.\u003ckey> (journey environment), engagement.context.*, engagement.workflowState.*, engagement.extracted.*, engagement.nodeOutputs.\u003cnodeId>.*, engagement.documents (json body, whole quoted token, flag-gated), and engagement.conversation.id / engagement.conversation.inboxUrl — the conversation this run is talking to and its Shared Inbox deep link. Anything else substitutes as an empty string and is reported at publish as UNRESOLVABLE_HTTP_TOKEN. Note engagement.chatLink is SEND_EMAIL-only and does NOT resolve here.","type":"object","properties":{"mode":{"type":"string","enum":["none","json","raw"],"isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.15.inputs.body.mode","typeLabel":"enum\u003cstring>"},"content":{"type":"string","uniqueKey":"definition.actions.items.[INDEX].oneOf.15.inputs.body.content","typeLabel":"string"},"contentType":{"type":"string","uniqueKey":"definition.actions.items.[INDEX].oneOf.15.inputs.body.contentType","typeLabel":"string"}},"required":["mode"],"additionalProperties":false,"uniqueKey":"definition.actions.items.[INDEX].oneOf.15.inputs.body","typeLabel":"object"},"credentialId":{"description":"Deprecated/legacy: HttpCredential row id used to authenticate the request. Prefer credentialKey.","type":"string","uniqueKey":"definition.actions.items.[INDEX].oneOf.15.inputs.credentialId","typeLabel":"string"},"credentialKey":{"description":"Logical credential key; the pinned environment selects the secret.","type":"string","uniqueKey":"definition.actions.items.[INDEX].oneOf.15.inputs.credentialKey","typeLabel":"string"},"timeoutMs":{"description":"Request timeout in milliseconds. Max 30000 (30s).","type":"integer","exclusiveMinimum":0,"maximum":30000,"uniqueKey":"definition.actions.items.[INDEX].oneOf.15.inputs.timeoutMs","typeLabel":"integer"},"maxAttempts":{"description":"Max attempts including the first. Max 5.","type":"integer","exclusiveMinimum":0,"maximum":5,"uniqueKey":"definition.actions.items.[INDEX].oneOf.15.inputs.maxAttempts","typeLabel":"integer"},"documentUrlTtlSeconds":{"description":"TTL (seconds, ≤86400) for presigned engagement.documents URLs this node emits. Default 86400.","type":"integer","exclusiveMinimum":0,"maximum":86400,"uniqueKey":"definition.actions.items.[INDEX].oneOf.15.inputs.documentUrlTtlSeconds","typeLabel":"integer"},"documentMimeTypes":{"description":"Allowlist of MIME types this node may egress in engagement.documents, e.g. ['application/pdf'] for an endpoint that only accepts PDFs. Omit (or pass an empty list) to send every document type — the default. A document whose type is not listed is withheld and counted in the step's documents.filteredCount, never silently dropped. Match is exact, trimmed and case-insensitive; a document with no recorded type is withheld whenever a list is set. Each entry must be a MIME type an inbound document can actually have, because a well-formed typo would match nothing and withhold everything: image/jpeg, image/png, image/webp, image/gif, application/pdf, video/mp4, text/vcard, text/html, application/msword, application/vnd.ms-excel, application/vnd.openxmlformats-officedocument.wordprocessingml.document, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/octet-stream.","type":"array","items":{"type":"string","minLength":1,"uniqueKey":"definition.actions.items.[INDEX].oneOf.15.inputs.documentMimeTypes.items.[INDEX]","typeLabel":"string"},"uniqueKey":"definition.actions.items.[INDEX].oneOf.15.inputs.documentMimeTypes","typeLabel":"string[]"}},"required":["method","url"],"additionalProperties":false,"description":"Calls an external HTTP endpoint. Emits SUCCESS or FAILED.","uniqueKey":"definition.actions.items.[INDEX].oneOf.15.inputs","typeLabel":"object"}},"additionalProperties":false,"uniqueKey":"definition.actions.items.[INDEX].oneOf.15","typeLabel":"object"},{"type":"object","required":["id","kind"],"properties":{"id":{"type":"string","minLength":1,"description":"Node id, unique within the journey.","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.16.id","typeLabel":"string"},"kind":{"type":"string","const":"ROUTE_TO_INITIATIVE","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.16.kind","typeLabel":"string"},"name":{"type":"string","minLength":1,"description":"The label shown on the canvas. Required before publishing.","uniqueKey":"definition.actions.items.[INDEX].oneOf.16.name","typeLabel":"string"},"position":{"type":"object","properties":{"x":{"type":"number","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.16.position.x","typeLabel":"number"},"y":{"type":"number","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.16.position.y","typeLabel":"number"}},"required":["x","y"],"additionalProperties":false,"description":"Explicit canvas position. Omit it and the server auto-lays-out the graph top-down; only set it to preserve a hand-arranged layout.","uniqueKey":"definition.actions.items.[INDEX].oneOf.16.position","typeLabel":"object"},"inputs":{"type":"object","properties":{"initiativeId":{"type":"string","minLength":1,"description":"Target initiative id to enroll this customer into.","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.16.inputs.initiativeId","typeLabel":"string"},"context":{"description":"Values stamped onto the new engagement, readable by its agent. A literal string, or { var: 'engagement.extracted.\u003cslug>' } resolved at route time.","type":"object","propertyNames":{"type":"string"},"additionalProperties":{"oneOf":[{"type":"string","uniqueKey":"definition.actions.items.[INDEX].oneOf.16.inputs.context.additionalProperties.oneOf.0","typeLabel":"string"},{"type":"object","required":["var"],"properties":{"var":{"type":"string","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.16.inputs.context.additionalProperties.oneOf.1.var","typeLabel":"string"}},"additionalProperties":false,"uniqueKey":"definition.actions.items.[INDEX].oneOf.16.inputs.context.additionalProperties.oneOf.1","typeLabel":"object"}],"uniqueKey":"definition.actions.items.[INDEX].oneOf.16.inputs.context.additionalProperties","typeLabel":"string | object"},"uniqueKey":"definition.actions.items.[INDEX].oneOf.16.inputs.context","typeLabel":"object"},"description":{"type":"string","uniqueKey":"definition.actions.items.[INDEX].oneOf.16.inputs.description","typeLabel":"string"}},"required":["initiativeId"],"additionalProperties":false,"description":"Terminal. Ends this engagement and enrolls the customer into another initiative, moving the live conversation onto a new session. Emits no signals — it has no outgoing edges.","uniqueKey":"definition.actions.items.[INDEX].oneOf.16.inputs","typeLabel":"object"}},"additionalProperties":false,"uniqueKey":"definition.actions.items.[INDEX].oneOf.16","typeLabel":"object"},{"type":"object","required":["id","kind"],"properties":{"id":{"type":"string","minLength":1,"description":"Node id, unique within the journey.","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.17.id","typeLabel":"string"},"kind":{"type":"string","const":"REQUEST_CALL_PERMISSION","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.17.kind","typeLabel":"string"},"name":{"type":"string","minLength":1,"description":"The label shown on the canvas. Required before publishing.","uniqueKey":"definition.actions.items.[INDEX].oneOf.17.name","typeLabel":"string"},"position":{"type":"object","properties":{"x":{"type":"number","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.17.position.x","typeLabel":"number"},"y":{"type":"number","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.17.position.y","typeLabel":"number"}},"required":["x","y"],"additionalProperties":false,"description":"Explicit canvas position. Omit it and the server auto-lays-out the graph top-down; only set it to preserve a hand-arranged layout.","uniqueKey":"definition.actions.items.[INDEX].oneOf.17.position","typeLabel":"object"},"inputs":{"type":"object","properties":{"channelId":{"description":"WhatsApp channel id from journeys_message_channels with `callingEnabled: true`. Required before publishing.","type":"string","uniqueKey":"definition.actions.items.[INDEX].oneOf.17.inputs.channelId","typeLabel":"string"},"timeout":{"description":"How long to wait for the customer's answer before TIMEOUT. Default 48h, at most 7d.","type":"string","uniqueKey":"definition.actions.items.[INDEX].oneOf.17.inputs.timeout","typeLabel":"string"}},"additionalProperties":false,"description":"Asks the customer for permission to call them on WhatsApp.","uniqueKey":"definition.actions.items.[INDEX].oneOf.17.inputs","typeLabel":"object"}},"additionalProperties":false,"uniqueKey":"definition.actions.items.[INDEX].oneOf.17","typeLabel":"object"},{"type":"object","required":["id","kind"],"properties":{"id":{"type":"string","minLength":1,"description":"Node id, unique within the journey.","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.18.id","typeLabel":"string"},"kind":{"type":"string","const":"PLACE_CALL","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.18.kind","typeLabel":"string"},"name":{"type":"string","minLength":1,"description":"The label shown on the canvas. Required before publishing.","uniqueKey":"definition.actions.items.[INDEX].oneOf.18.name","typeLabel":"string"},"position":{"type":"object","properties":{"x":{"type":"number","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.18.position.x","typeLabel":"number"},"y":{"type":"number","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.18.position.y","typeLabel":"number"}},"required":["x","y"],"additionalProperties":false,"description":"Explicit canvas position. Omit it and the server auto-lays-out the graph top-down; only set it to preserve a hand-arranged layout.","uniqueKey":"definition.actions.items.[INDEX].oneOf.18.position","typeLabel":"object"},"inputs":{"type":"object","properties":{"channelId":{"description":"WhatsApp channel id from journeys_message_channels with `callingEnabled: true`. Required before publishing.","type":"string","uniqueKey":"definition.actions.items.[INDEX].oneOf.18.inputs.channelId","typeLabel":"string"},"maxWait":{"description":"How long to wait for the call's outcome before TIMEOUT. Default 2h, at most 24h.","type":"string","uniqueKey":"definition.actions.items.[INDEX].oneOf.18.inputs.maxWait","typeLabel":"string"}},"additionalProperties":false,"description":"Calls the customer on WhatsApp; the initiative's voice agent talks.","uniqueKey":"definition.actions.items.[INDEX].oneOf.18.inputs","typeLabel":"object"}},"additionalProperties":false,"uniqueKey":"definition.actions.items.[INDEX].oneOf.18","typeLabel":"object"},{"type":"object","required":["id","kind"],"properties":{"id":{"type":"string","minLength":1,"description":"Node id, unique within the journey.","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.19.id","typeLabel":"string"},"kind":{"type":"string","const":"SEND_REWARD","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.19.kind","typeLabel":"string"},"name":{"type":"string","minLength":1,"description":"The label shown on the canvas. Required before publishing.","uniqueKey":"definition.actions.items.[INDEX].oneOf.19.name","typeLabel":"string"},"position":{"type":"object","properties":{"x":{"type":"number","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.19.position.x","typeLabel":"number"},"y":{"type":"number","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.19.position.y","typeLabel":"number"}},"required":["x","y"],"additionalProperties":false,"description":"Explicit canvas position. Omit it and the server auto-lays-out the graph top-down; only set it to preserve a hand-arranged layout.","uniqueKey":"definition.actions.items.[INDEX].oneOf.19.position","typeLabel":"object"},"inputs":{"type":"object","properties":{"amount":{"description":"Reward value in `currency`, at most two decimals. Must fall in the curated range (USD 1–2000, MXN 1–20000). Required before publishing.","type":"number","exclusiveMinimum":0,"uniqueKey":"definition.actions.items.[INDEX].oneOf.19.inputs.amount","typeLabel":"number"},"currency":{"description":"Reward currency. Required before publishing.","type":"string","enum":["USD","MXN"],"uniqueKey":"definition.actions.items.[INDEX].oneOf.19.inputs.currency","typeLabel":"enum\u003cstring>"},"criterion":{"description":"Who qualifies, in plain words (at most 500 characters), e.g. \"Finished the interview and gave a reason for leaving\". Judged by an AI against the conversation when the run reaches this node. Empty = everyone who reaches the node qualifies.","type":"string","maxLength":500,"uniqueKey":"definition.actions.items.[INDEX].oneOf.19.inputs.criterion","typeLabel":"string"},"delivery":{"description":"'conversation': a redemption link on WhatsApp, sent with the organization's approved reward template (REWARD_DELIVERY) from the journey's WhatsApp number. 'email': the reward provider emails the customer (needs an email on the person). Required before publishing.","type":"string","enum":["conversation","email"],"uniqueKey":"definition.actions.items.[INDEX].oneOf.19.inputs.delivery","typeLabel":"enum\u003cstring>"},"approval":{"description":"How each reward is approved. Only 'review' exists: a person approves each one in Drafts.","type":"string","const":"review","uniqueKey":"definition.actions.items.[INDEX].oneOf.19.inputs.approval","typeLabel":"string"}},"additionalProperties":false,"description":"Sends the customer a gift card through the organization’s connected Tremendous account.","uniqueKey":"definition.actions.items.[INDEX].oneOf.19.inputs","typeLabel":"object"}},"additionalProperties":false,"uniqueKey":"definition.actions.items.[INDEX].oneOf.19","typeLabel":"object"},{"type":"object","required":["id","kind"],"properties":{"id":{"type":"string","minLength":1,"description":"Node id, unique within the journey.","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.20.id","typeLabel":"string"},"kind":{"type":"string","const":"SHOPIFY_UPSERT_CUSTOMER","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.20.kind","typeLabel":"string"},"name":{"type":"string","minLength":1,"description":"The label shown on the canvas. Required before publishing.","uniqueKey":"definition.actions.items.[INDEX].oneOf.20.name","typeLabel":"string"},"position":{"type":"object","properties":{"x":{"type":"number","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.20.position.x","typeLabel":"number"},"y":{"type":"number","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.20.position.y","typeLabel":"number"}},"required":["x","y"],"additionalProperties":false,"description":"Explicit canvas position. Omit it and the server auto-lays-out the graph top-down; only set it to preserve a hand-arranged layout.","uniqueKey":"definition.actions.items.[INDEX].oneOf.20.position","typeLabel":"object"},"inputs":{"type":"object","properties":{"sourceId":{"description":"The Shopify store to write to: a Shopify source id from cdp_sources_list (provider SHOPIFY, status ACTIVE). Required before publishing.","type":"string","uniqueKey":"definition.actions.items.[INDEX].oneOf.20.inputs.sourceId","typeLabel":"string"},"tags":{"description":"Tags ADDED to the customer (never replacing the store's own), at most 10. Each may mix text and {{variables}} from engagement.* (e.g. {{engagement.workflowState.form_name}} for an event property, {{engagement.extracted.\u003ckey>}} for conversation-extracted data), person.* or customer.*; filled when the step runs, then trimmed to 40 characters, and a tag that fills blank is dropped. The 40-character limit applies to the fixed text. Absent = [\"boom-lead\"]; [] = none.","maxItems":10,"type":"array","items":{"type":"string","minLength":1,"maxLength":200,"uniqueKey":"definition.actions.items.[INDEX].oneOf.20.inputs.tags.items.[INDEX]","typeLabel":"string"},"uniqueKey":"definition.actions.items.[INDEX].oneOf.20.inputs.tags","typeLabel":"string[]"},"note":{"description":"Customer note, written only when the customer is created; an existing customer's note is never touched. May mix text and {{variables}} (same roots as tags); at most 500 characters of fixed text, and the filled note is cut to 500.","type":"string","maxLength":2000,"uniqueKey":"definition.actions.items.[INDEX].oneOf.20.inputs.note","typeLabel":"string"},"syncMarketingConsent":{"description":"Default true: when the triggering event records a marketing opt-in (Lead Capture `consent`, an embedded form's `consent_marketing`), the customer is subscribed in Shopify for email (if they have one) and SMS (if they have a phone). Never unsubscribes, and never re-subscribes a customer who unsubscribed in Shopify.","type":"boolean","uniqueKey":"definition.actions.items.[INDEX].oneOf.20.inputs.syncMarketingConsent","typeLabel":"boolean"},"updateExisting":{"description":"What happens when the store already has this customer (matched by email, then phone). 'fill_blanks' (default): only blank fields are filled, tags added and an opt-in applied — names, email and phone the store has are never overwritten. 'never': the customer is left untouched and the node takes SKIPPED.","type":"string","enum":["fill_blanks","never"],"uniqueKey":"definition.actions.items.[INDEX].oneOf.20.inputs.updateExisting","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"description":"Creates or updates the person as a Customer in the organization's connected Shopify store.","uniqueKey":"definition.actions.items.[INDEX].oneOf.20.inputs","typeLabel":"object"}},"additionalProperties":false,"uniqueKey":"definition.actions.items.[INDEX].oneOf.20","typeLabel":"object"},{"type":"object","required":["id","kind"],"properties":{"id":{"type":"string","minLength":1,"description":"Node id, unique within the journey.","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.21.id","typeLabel":"string"},"kind":{"type":"string","const":"LOAD_OBJECT","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.21.kind","typeLabel":"string"},"name":{"type":"string","minLength":1,"description":"The label shown on the canvas. Required before publishing.","uniqueKey":"definition.actions.items.[INDEX].oneOf.21.name","typeLabel":"string"},"position":{"type":"object","properties":{"x":{"type":"number","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.21.position.x","typeLabel":"number"},"y":{"type":"number","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.21.position.y","typeLabel":"number"}},"required":["x","y"],"additionalProperties":false,"description":"Explicit canvas position. Omit it and the server auto-lays-out the graph top-down; only set it to preserve a hand-arranged layout.","uniqueKey":"definition.actions.items.[INDEX].oneOf.21.position","typeLabel":"object"},"inputs":{"type":"object","properties":{"objectType":{"description":"The custom object type name (cdp_custom_object_types_list `name`). Required before publishing.","type":"string","minLength":1,"uniqueKey":"definition.actions.items.[INDEX].oneOf.21.inputs.objectType","typeLabel":"string"},"saveAs":{"description":"The variable name later steps read the record under: saveAs 'brand' → {{brand.logo_url}}, {{brand.primary_color}}; saveAs 'order' → {{order.total | currency:MXN}}. One lowercase word, unique per journey, not customer/person/engagement/event/env. Required before publishing. Publishing checks every \u003csaveAs>.\u003cfield> a later step (or its email template) reads is loaded by this node.","type":"string","pattern":"^[a-z][a-z0-9_]{0,39}$","uniqueKey":"definition.actions.items.[INDEX].oneOf.21.inputs.saveAs","typeLabel":"string"},"lookup":{"oneOf":[{"type":"object","description":"How to find the record: 'key' (an id the run carries) or 'relationship' (follow links from the run's person).","required":["by","keyPath"],"properties":{"by":{"type":"string","const":"key","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.21.inputs.lookup.oneOf.0.by","typeLabel":"string"},"keyPath":{"type":"string","minLength":1,"description":"A variable path whose value is the record's externalId, e.g. event.merchant_id, engagement.workflowState.merchant_id, person.merchant_id, or a field of another saved record such as order.merchant_id.","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.21.inputs.lookup.oneOf.0.keyPath","typeLabel":"string"}},"additionalProperties":false,"uniqueKey":"definition.actions.items.[INDEX].oneOf.21.inputs.lookup.oneOf.0","typeLabel":"object"},{"type":"object","description":"How to find the record: 'key' (an id the run carries) or 'relationship' (follow links from the run's person).","required":["by","path"],"properties":{"by":{"type":"string","const":"relationship","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.21.inputs.lookup.oneOf.1.by","typeLabel":"string"},"path":{"maxItems":3,"type":"array","items":{"oneOf":[{"type":"object","required":["kind","role","objectTypeId"],"properties":{"kind":{"type":"string","const":"PERSON_OBJECT","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.21.inputs.lookup.oneOf.1.path.items.[INDEX].oneOf.0.kind","typeLabel":"string"},"role":{"type":"string","minLength":1,"isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.21.inputs.lookup.oneOf.1.path.items.[INDEX].oneOf.0.role","typeLabel":"string"},"objectTypeId":{"type":"string","minLength":1,"isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.21.inputs.lookup.oneOf.1.path.items.[INDEX].oneOf.0.objectTypeId","typeLabel":"string"}},"additionalProperties":false,"uniqueKey":"definition.actions.items.[INDEX].oneOf.21.inputs.lookup.oneOf.1.path.items.[INDEX].oneOf.0","typeLabel":"object"},{"type":"object","required":["kind","role","direction","objectTypeId"],"properties":{"kind":{"type":"string","const":"OBJECT_OBJECT","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.21.inputs.lookup.oneOf.1.path.items.[INDEX].oneOf.1.kind","typeLabel":"string"},"role":{"type":"string","minLength":1,"isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.21.inputs.lookup.oneOf.1.path.items.[INDEX].oneOf.1.role","typeLabel":"string"},"direction":{"type":"string","enum":["PARENT_TO_CHILD","CHILD_TO_PARENT"],"isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.21.inputs.lookup.oneOf.1.path.items.[INDEX].oneOf.1.direction","typeLabel":"enum\u003cstring>"},"objectTypeId":{"type":"string","minLength":1,"isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.21.inputs.lookup.oneOf.1.path.items.[INDEX].oneOf.1.objectTypeId","typeLabel":"string"}},"additionalProperties":false,"uniqueKey":"definition.actions.items.[INDEX].oneOf.21.inputs.lookup.oneOf.1.path.items.[INDEX].oneOf.1","typeLabel":"object"}],"uniqueKey":"definition.actions.items.[INDEX].oneOf.21.inputs.lookup.oneOf.1.path.items.[INDEX]","typeLabel":"object"},"description":"Hops from the run's person to the record: first a PERSON_OBJECT edge (relationship role + the linked type's id), then OBJECT_OBJECT edges. [] means the type is linked to the person directly. Must match a path the relationship registries allow (checked at publish); the journey builder lists them.","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.21.inputs.lookup.oneOf.1.path","typeLabel":"object[]"}},"additionalProperties":false,"uniqueKey":"definition.actions.items.[INDEX].oneOf.21.inputs.lookup.oneOf.1","typeLabel":"object"}],"uniqueKey":"definition.actions.items.[INDEX].oneOf.21.inputs.lookup","typeLabel":"object"},"attributes":{"description":"The record's attributes to make available to later steps (at least 1, at most 30), read as {{\u003csaveAs>.\u003cattr>}}. Strings longer than 2000 characters are cut.","maxItems":30,"type":"array","items":{"type":"string","minLength":1,"uniqueKey":"definition.actions.items.[INDEX].oneOf.21.inputs.attributes.items.[INDEX]","typeLabel":"string"},"uniqueKey":"definition.actions.items.[INDEX].oneOf.21.inputs.attributes","typeLabel":"string[]"},"orderBy":{"description":"When several records match, the one with the lowest ('asc') or highest ('desc') value of this attribute wins; records missing it come last. Without orderBy, several matches load nothing.","type":"object","properties":{"attribute":{"type":"string","minLength":1,"isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.21.inputs.orderBy.attribute","typeLabel":"string"},"direction":{"type":"string","enum":["asc","desc"],"isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.21.inputs.orderBy.direction","typeLabel":"enum\u003cstring>"}},"required":["attribute","direction"],"additionalProperties":false,"uniqueKey":"definition.actions.items.[INDEX].oneOf.21.inputs.orderBy","typeLabel":"object"}},"additionalProperties":false,"description":"Loads one custom object record so later steps can use its attributes.","uniqueKey":"definition.actions.items.[INDEX].oneOf.21.inputs","typeLabel":"object"}},"additionalProperties":false,"uniqueKey":"definition.actions.items.[INDEX].oneOf.21","typeLabel":"object"},{"type":"object","required":["id","kind"],"properties":{"id":{"type":"string","minLength":1,"description":"Node id, unique within the journey.","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.22.id","typeLabel":"string"},"kind":{"type":"string","const":"EXIT","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.22.kind","typeLabel":"string"},"name":{"type":"string","minLength":1,"description":"The label shown on the canvas. Required before publishing.","uniqueKey":"definition.actions.items.[INDEX].oneOf.22.name","typeLabel":"string"},"position":{"type":"object","properties":{"x":{"type":"number","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.22.position.x","typeLabel":"number"},"y":{"type":"number","isRequired":true,"uniqueKey":"definition.actions.items.[INDEX].oneOf.22.position.y","typeLabel":"number"}},"required":["x","y"],"additionalProperties":false,"description":"Explicit canvas position. Omit it and the server auto-lays-out the graph top-down; only set it to preserve a hand-arranged layout.","uniqueKey":"definition.actions.items.[INDEX].oneOf.22.position","typeLabel":"object"},"inputs":{"type":"object","properties":{"outcome":{"type":"string","uniqueKey":"definition.actions.items.[INDEX].oneOf.22.inputs.outcome","typeLabel":"string"}},"additionalProperties":false,"description":"Terminal node.","uniqueKey":"definition.actions.items.[INDEX].oneOf.22.inputs","typeLabel":"object"}},"additionalProperties":false,"uniqueKey":"definition.actions.items.[INDEX].oneOf.22","typeLabel":"object"}],"uniqueKey":"definition.actions.items.[INDEX]","typeLabel":"object"},"description":"The nodes. Exactly one ENTRY, and at least one end point (EXIT or ROUTE_TO_INITIATIVE), are required to publish.","isRequired":true,"uniqueKey":"definition.actions","typeLabel":"object[]"},"edges":{"type":"array","items":{"type":"object","properties":{"from":{"type":"string","description":"Source node id.","isRequired":true,"uniqueKey":"definition.edges.items.[INDEX].from","typeLabel":"string"},"to":{"type":"string","description":"Target node id.","isRequired":true,"uniqueKey":"definition.edges.items.[INDEX].to","typeLabel":"string"},"sourceHandle":{"type":"string","description":"The emitted signal that activates this edge (e.g. SENT, REPLIED, YES, case:\u003cid>). A handle may wire to at most one node.","isRequired":true,"uniqueKey":"definition.edges.items.[INDEX].sourceHandle","typeLabel":"string"},"metadata":{"type":"object","properties":{"signalCategory":{"type":"string","enum":["lifecycle","system"],"uniqueKey":"definition.edges.items.[INDEX].metadata.signalCategory","typeLabel":"enum\u003cstring>"},"signalDescription":{"type":"string","uniqueKey":"definition.edges.items.[INDEX].metadata.signalDescription","typeLabel":"string"}},"additionalProperties":false,"uniqueKey":"definition.edges.items.[INDEX].metadata","typeLabel":"object"}},"required":["from","to","sourceHandle"],"additionalProperties":false,"description":"A connection: node `from` routes to `to` when it emits `sourceHandle`.","uniqueKey":"definition.edges.items.[INDEX]","typeLabel":"object"},"description":"The connections between node handles.","isRequired":true,"uniqueKey":"definition.edges","typeLabel":"object[]"},"id":{"description":"Journey id; carried for round-trip ergonomics. Optional on create.","type":"string","uniqueKey":"definition.id","typeLabel":"string"},"metadata":{"type":"object","properties":{"initiativeType":{"type":"string","uniqueKey":"definition.metadata.initiativeType","typeLabel":"string"},"version":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"uniqueKey":"definition.metadata.version","typeLabel":"integer"},"cancelOnEvents":{"description":"Cancel an in-flight run when any of these events arrive.","type":"object","properties":{"eventNames":{"type":"array","items":{"type":"string","uniqueKey":"definition.metadata.cancelOnEvents.eventNames.items.[INDEX]","typeLabel":"string"},"isRequired":true,"uniqueKey":"definition.metadata.cancelOnEvents.eventNames","typeLabel":"string[]"},"matchRunKey":{"description":"Cancel only the run whose key equals this event's `parallelRunsBy` property, instead of every run the person has. Leave it unset on a journey with several runs at once: that already matches on the key, and setting it to false there is refused at publish, because one completed payment would stop the person's other payments too.","type":"boolean","uniqueKey":"definition.metadata.cancelOnEvents.matchRunKey","typeLabel":"boolean"}},"required":["eventNames"],"additionalProperties":false,"uniqueKey":"definition.metadata.cancelOnEvents","typeLabel":"object"},"environmentId":{"description":"Pinned environment whose non-secret {{env.*}} values HTTP nodes resolve against. Frozen at publish. The server preserves the stored value when a whole-graph update omits it.","type":"string","uniqueKey":"definition.metadata.environmentId","typeLabel":"string"}},"additionalProperties":false,"description":"Optional journey-level metadata.","uniqueKey":"definition.metadata","typeLabel":"object"}},"required":["name","actions","edges"],"additionalProperties":false,"description":"The full journey graph.","isRequired":true,"uniqueKey":"definition","typeLabel":"object"}},"required":["id","initiativeId","status","version","definition"],"additionalProperties":false,"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"id":"\u003cstring>","initiativeId":"\u003cstring>","status":"DRAFT","version":0,"definition":{"name":"\u003cstring>","actions":[{"id":"\u003cstring>","kind":"ENTRY","name":"\u003cstring>","position":{"x":123,"y":123},"inputs":{"description":"\u003cstring>","triggerType":"manual","segmentId":"\u003cstring>","segmentName":"\u003cstring>","eventName":"\u003cstring>","inboundAction":"WHATSAPP_MESSAGE","inboundChannelIds":["\u003cstring>"],"inboundKeyword":"\u003cstring>","inboundMatchMode":"EXACT","maxEnrollments":4503599627370496,"enrollmentWindow":"\u003cstring>","parallelRunsBy":"\u003cstring>"}}],"edges":[{"from":"\u003cstring>","to":"\u003cstring>","sourceHandle":"\u003cstring>","metadata":{"signalCategory":"lifecycle","signalDescription":"\u003cstring>"}}],"id":"\u003cstring>","metadata":{"initiativeType":"\u003cstring>","version":0,"cancelOnEvents":{"eventNames":["\u003cstring>"],"matchRunKey":true},"environmentId":"\u003cstring>"}}}}},"exampleType":"generated"}},"exampleType":"generated"},"8fdb8150-251a-45b4-81e5-dfb3156dfe58":{"description":"Validation failed or the request cannot proceed.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"Stable machine-readable error code (snake_case).","isRequired":true,"uniqueKey":"error.code","typeLabel":"string"},"message":{"type":"string","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"}},"required":["code","message"],"isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"required":["error"],"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":{"code":"\u003cstring>","message":"\u003cstring>"}}}},"exampleType":"generated"}},"exampleType":"generated"},"ef843c6f-1c24-48a5-861d-124f217356c6":{"description":"Missing, malformed, or revoked API key.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"Stable machine-readable error code (snake_case).","isRequired":true,"uniqueKey":"error.code","typeLabel":"string"},"message":{"type":"string","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"}},"required":["code","message"],"isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"required":["error"],"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":{"code":"\u003cstring>","message":"\u003cstring>"}}}},"exampleType":"generated"}},"exampleType":"generated"},"f1881774-77a2-4a68-acc4-e6caf787a994":{"description":"The resource does not exist in this organization.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"Stable machine-readable error code (snake_case).","isRequired":true,"uniqueKey":"error.code","typeLabel":"string"},"message":{"type":"string","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"}},"required":["code","message"],"isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"required":["error"],"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":{"code":"\u003cstring>","message":"\u003cstring>"}}}},"exampleType":"generated"}},"exampleType":"generated"},"b41e0095-7bdf-4fbc-800c-b637429aa018":{"description":"Conflicts with the current state (duplicates, wrong lifecycle state).","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"Stable machine-readable error code (snake_case).","isRequired":true,"uniqueKey":"error.code","typeLabel":"string"},"message":{"type":"string","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"}},"required":["code","message"],"isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"required":["error"],"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":{"code":"\u003cstring>","message":"\u003cstring>"}}}},"exampleType":"generated"}},"exampleType":"generated"},"9d291905-331c-4e8c-9bb1-e9f66afe51cf":{"description":"The request is well-formed but semantically invalid.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"Stable machine-readable error code (snake_case).","isRequired":true,"uniqueKey":"error.code","typeLabel":"string"},"message":{"type":"string","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"}},"required":["code","message"],"isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"required":["error"],"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":{"code":"\u003cstring>","message":"\u003cstring>"}}}},"exampleType":"generated"}},"exampleType":"generated"},"31b6b73e-a127-4534-814f-b24a997fb56b":{"description":"Rate limit exceeded — retry after `Retry-After`.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"Stable machine-readable error code (snake_case).","isRequired":true,"uniqueKey":"error.code","typeLabel":"string"},"message":{"type":"string","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"}},"required":["code","message"],"isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"required":["error"],"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":{"code":"\u003cstring>","message":"\u003cstring>"}}}},"exampleType":"generated"}},"exampleType":"generated"},"981b219d-91ac-47a0-be8c-34095e7bc29d":{"description":"Internal server error.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"Stable machine-readable error code (snake_case).","isRequired":true,"uniqueKey":"error.code","typeLabel":"string"},"message":{"type":"string","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"}},"required":["code","message"],"isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"required":["error"],"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":{"code":"\u003cstring>","message":"\u003cstring>"}}}},"exampleType":"generated"}},"exampleType":"generated"},"c26d937c-c44d-4205-9667-630e9c016e64":{"description":"Transient error — retry with a narrower request.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","description":"Stable machine-readable error code (snake_case).","isRequired":true,"uniqueKey":"error.code","typeLabel":"string"},"message":{"type":"string","isRequired":true,"uniqueKey":"error.message","typeLabel":"string"}},"required":["code","message"],"isRequired":true,"uniqueKey":"error","typeLabel":"object"}},"required":["error"],"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"error":{"code":"\u003cstring>","message":"\u003cstring>"}}}},"exampleType":"generated"}},"exampleType":"generated"}},"security":{"ec2314a0-cdd3-4628-bc94-f84fbb0b23d0":{"bearerAuth":{"type":"http","scheme":"bearer","description":"Organization API key, sent as `Authorization: Bearer boom_org_...`.","scopes":[],"schemeName":"bearerAuth"}}},"servers":{"c765c082-4d63-4903-8901-a4e25004f471":{"url":"https://www.useboom.ai","description":"Production"},"b80279d2-0255-46dc-bddc-f490bd7a2ec8":{"url":"https://dev.useboom.ai","description":"Development (sandbox — use a development organization API key)"}},"processedSecurityOptions":[{"schemes":[{"scheme":{"type":"http","scheme":"bearer","description":"Organization API key, sent as `Authorization: Bearer boom_org_...`.","scopes":[],"schemeName":"bearerAuth"},"schema":{"title":"Bearer Auth","type":"string","isRequired":true,"description":"Organization API key, sent as `Authorization: Bearer boom_org_...`.","format":"bearer","typeLabel":"string\u003cbearer>","deprecated":false},"schemeName":"bearerAuth","name":"Authorization"}],"title":"bearerAuth"}]},"originalFileLocation":"api-reference/openapi.json"},"subdomain":"boomai-c1f672dc","siteName":"Boom","title":"Set trigger - Boom","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-10-22T19:58:56.233Z","originalFileLocation":"api-reference/journeys/set-trigger.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Configure how people enter the journey by updating its ENTRY node: manual, segment (needs segmentId), cdp_event (needs eventName), or inbound (needs inboundAction and inboundChannelIds, optionally narrowed to an inboundKeyword), with an optional frequency cap, or an optional parallelRunsBy on cdp_event to give one person a concurrent run per event-property value. Fields belonging to the other trigger types are cleared.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Boom\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/boomai-c1f672dc/nVSaLoJMoPadjXEM/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/boomai-c1f672dc/nVSaLoJMoPadjXEM/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/boomai-c1f672dc/nVSaLoJMoPadjXEM/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/boomai-c1f672dc/nVSaLoJMoPadjXEM/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/boomai-c1f672dc/nVSaLoJMoPadjXEM/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/boomai-c1f672dc/nVSaLoJMoPadjXEM/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/boomai-c1f672dc/nVSaLoJMoPadjXEM/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/boomai-c1f672dc/nVSaLoJMoPadjXEM/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/boomai-c1f672dc/nVSaLoJMoPadjXEM/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Set trigger - Boom\">\u003cmeta data-mint-head property=\"og:description\" content=\"Configure how people enter the journey by updating its ENTRY node: manual, segment (needs segmentId), cdp_event (needs eventName), or inbound (needs inboundAction and inboundChannelIds, optionally narrowed to an inboundKeyword), with an optional frequency cap, or an optional parallelRunsBy on cdp_event to give one person a concurrent run per event-property value. Fields belonging to the other trigger types are cleared.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Boom\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.useboom.ai/api-reference/journeys/set-trigger\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://boomai-c1f672dc.mintlify.app/_mintlify/api/og/v2?division=Journeys\u0026amp;title=Set+trigger\u0026amp;description=Configure+how+people+enter+the+journey+by+updating+its+ENTRY+node%3A+manual%2C+segment+%28needs+segmentId%29%2C+cdp_event+%28needs+eventName%29%2C+or+inbound+%28needs+inboundActi\u0026amp;theme=83c6d51bda2a99f16cf59c6e\u0026amp;signature=c443530b945f776ab0f0deb33c317c754f126a9740b6d8c3b6d1b8e09c582787\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Set trigger - Boom\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Configure how people enter the journey by updating its ENTRY node: manual, segment (needs segmentId), cdp_event (needs eventName), or inbound (needs inboundAction and inboundChannelIds, optionally narrowed to an inboundKeyword), with an optional frequency cap, or an optional parallelRunsBy on cdp_event to give one person a concurrent run per event-property value. Fields belonging to the other trigger types are cleared.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://boomai-c1f672dc.mintlify.app/_mintlify/api/og/v2?division=Journeys\u0026amp;title=Set+trigger\u0026amp;description=Configure+how+people+enter+the+journey+by+updating+its+ENTRY+node%3A+manual%2C+segment+%28needs+segmentId%29%2C+cdp_event+%28needs+eventName%29%2C+or+inbound+%28needs+inboundActi\u0026amp;theme=83c6d51bda2a99f16cf59c6e\u0026amp;signature=c443530b945f776ab0f0deb33c317c754f126a9740b6d8c3b6d1b8e09c582787\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/boomai-c1f672dc/nVSaLoJMoPadjXEM/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Boom\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#3B3B3B\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.useboom.ai/api-reference/journeys/set-trigger\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/api-reference/journeys/set-trigger.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.useboom.ai/#organization\",\"name\":\"Boom\",\"url\":\"https://docs.useboom.ai\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/boomai-c1f672dc/2DiZiPkeLvrlfzgs/logo.svg?fit=max\u0026auto=format\u0026n=2DiZiPkeLvrlfzgs\u0026q=85\u0026s=a014030c9acb0f3d8eee9de1fbe632a7\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.useboom.ai#website\",\"name\":\"Boom\",\"url\":\"https://docs.useboom.ai\",\"publisher\":{\"@id\":\"https://docs.useboom.ai/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.useboom.ai/api-reference/journeys/set-trigger#webpage\",\"url\":\"https://docs.useboom.ai/api-reference/journeys/set-trigger\",\"name\":\"Set trigger\",\"description\":\"Configure how people enter the journey by updating its ENTRY node: manual, segment (needs segmentId), cdp_event (needs eventName), or inbound (needs inboundAction and inboundChannelIds, optionally narrowed to an inboundKeyword), with an optional frequency cap, or an optional parallelRunsBy on cdp_event to give one person a concurrent run per event-property value. Fields belonging to the other trigger types are cleared.\",\"dateModified\":\"2026-10-22T19:58:56.233Z\",\"isPartOf\":{\"@id\":\"https://docs.useboom.ai#website\"},\"breadcrumb\":{\"@id\":\"https://docs.useboom.ai/api-reference/journeys/set-trigger#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.useboom.ai/api-reference/journeys/set-trigger#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Journeys\",\"item\":\"https://docs.useboom.ai/api-reference/journeys/list-journeys\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Set trigger\",\"item\":\"https://docs.useboom.ai/api-reference/journeys/set-trigger\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://docs.useboom.ai/api-reference/journeys/set-trigger#apireference\",\"headline\":\"Set trigger\",\"name\":\"Set trigger\",\"description\":\"Configure how people enter the journey by updating its ENTRY node: manual, segment (needs segmentId), cdp_event (needs eventName), or inbound (needs inboundAction and inboundChannelIds, optionally narrowed to an inboundKeyword), with an optional frequency cap, or an optional parallelRunsBy on cdp_event to give one person a concurrent run per event-property value. Fields belonging to the other trigger types are cleared.\",\"url\":\"https://docs.useboom.ai/api-reference/journeys/set-trigger\",\"mainEntityOfPage\":{\"@id\":\"https://docs.useboom.ai/api-reference/journeys/set-trigger#webpage\"},\"dateModified\":\"2026-10-22T19:58:56.233Z\",\"publisher\":{\"@id\":\"https://docs.useboom.ai/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.useboom.ai#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Boom\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Boom","nav":{"global":null,"tabs":[{"tab":"Guides","icon":"book-open","pages":[{"title":"Guides","href":"/introduction"}]},{"tab":"Tutorials","icon":"circle-play","pages":[{"title":"Tutorials","href":"/tutorials/overview"}]},{"tab":"CDP","icon":"layers","pages":[{"title":"CDP","href":"/cdp/overview"}]},{"tab":"API","icon":"code","groups":[{"group":"Overview","pages":[{"title":"API","sidebarTitle":"Introduction","href":"/api-reference/overview"},{"title":"Quickstart","href":"/quickstart"},{"title":"Authentication","href":"/authentication"},{"title":"Rate limits \u0026 errors","href":"/rate-limits-and-errors"}]},{"group":"Initiatives","icon":"rocket","pages":[{"title":"List initiatives","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /api/v1/initiatives","href":"/api-reference/initiatives/list-initiatives"},{"title":"Get initiative","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /api/v1/initiatives/{id}","href":"/api-reference/initiatives/get-initiative"},{"title":"Create initiative","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json post /api/v1/initiatives","href":"/api-reference/initiatives/create-initiative"},{"title":"Update initiative","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json patch /api/v1/initiatives/{id}","href":"/api-reference/initiatives/update-initiative"},{"title":"Launch initiative","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json post /api/v1/initiatives/{id}/launch","href":"/api-reference/initiatives/launch-initiative"},{"title":"Cancel initiative","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json post /api/v1/initiatives/{id}/cancel","href":"/api-reference/initiatives/cancel-initiative"},{"title":"Pause initiative","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json post /api/v1/initiatives/{id}/pause","href":"/api-reference/initiatives/pause-initiative"},{"title":"Resume initiative","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json post /api/v1/initiatives/{id}/resume","href":"/api-reference/initiatives/resume-initiative"},{"title":"Archive initiative","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json post /api/v1/initiatives/{id}/archive","href":"/api-reference/initiatives/archive-initiative"},{"title":"Unarchive initiative","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json post /api/v1/initiatives/{id}/unarchive","href":"/api-reference/initiatives/unarchive-initiative"},{"title":"Get templates","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /api/v1/initiatives/{id}/templates","href":"/api-reference/initiatives/get-templates"},{"title":"Set template","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json post /api/v1/initiatives/{id}/templates","href":"/api-reference/initiatives/set-template"},{"title":"Data summary","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /api/v1/initiatives/{id}/data/summary","href":"/api-reference/initiatives/data-summary"},{"title":"List success metrics","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /api/v1/initiatives/{id}/success-metrics","href":"/api-reference/initiatives/list-success-metrics"},{"title":"Success-metric catalog","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /api/v1/initiatives/{id}/success-metrics/catalog","href":"/api-reference/initiatives/success-metric-catalog"},{"title":"Add or replace a success metric","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json post /api/v1/initiatives/{id}/success-metrics","href":"/api-reference/initiatives/add-or-replace-a-success-metric"},{"title":"Delete a success metric","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json delete /api/v1/initiatives/{id}/success-metrics/{rootId}","href":"/api-reference/initiatives/delete-a-success-metric"},{"title":"Add participants","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json post /api/v1/initiatives/{id}/participants","href":"/api-reference/initiatives/add-participants"},{"title":"List participants","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /api/v1/initiatives/{id}/participants","href":"/api-reference/initiatives/list-participants"},{"title":"Get participant","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /api/v1/initiatives/{id}/participants/{participantId}","href":"/api-reference/initiatives/get-participant"},{"title":"Participant messages","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /api/v1/initiatives/{id}/participants/{participantId}/messages","href":"/api-reference/initiatives/participant-messages"},{"title":"List transcripts","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /api/v1/initiatives/{id}/transcripts","href":"/api-reference/initiatives/list-transcripts"},{"title":"Stop participant","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json post /api/v1/initiatives/{id}/participants/{participantId}/stop","href":"/api-reference/initiatives/stop-participant"}]},{"group":"Journeys","icon":"route","pages":[{"title":"List journeys","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /api/v1/journeys","href":"/api-reference/journeys/list-journeys"},{"title":"Get journey","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /api/v1/journeys/{journeyId}","href":"/api-reference/journeys/get-journey"},{"title":"Get journey definition","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /api/v1/journeys/{journeyId}/definition","href":"/api-reference/journeys/get-journey-definition"},{"title":"Node catalog","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /api/v1/journeys/catalog","href":"/api-reference/journeys/node-catalog"},{"title":"Validate journey","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json post /api/v1/journeys/validate","href":"/api-reference/journeys/validate-journey"},{"title":"Create draft","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json post /api/v1/journeys","href":"/api-reference/journeys/create-draft"},{"title":"Update draft","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json patch /api/v1/journeys/{journeyId}","href":"/api-reference/journeys/update-draft"},{"title":"Add node","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json post /api/v1/journeys/{journeyId}/nodes","href":"/api-reference/journeys/add-node"},{"title":"Update node","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json patch /api/v1/journeys/{journeyId}/nodes/{nodeId}","href":"/api-reference/journeys/update-node"},{"title":"Delete node","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json delete /api/v1/journeys/{journeyId}/nodes/{nodeId}","href":"/api-reference/journeys/delete-node"},{"title":"Connect nodes","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json post /api/v1/journeys/{journeyId}/edges","href":"/api-reference/journeys/connect-nodes"},{"title":"Disconnect nodes","description":"Remove edges leaving a node. Narrow by target and/or handle; with neither, all outgoing edges from the node are removed.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json delete /api/v1/journeys/{journeyId}/edges","href":"/api-reference/journeys/disconnect-nodes"},{"title":"Set trigger","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json patch /api/v1/journeys/{journeyId}/trigger","href":"/api-reference/journeys/set-trigger"},{"title":"Fork journey","description":"Copy a PUBLISHED journey into a fresh editable draft. The live version keeps running until the new draft is published. Use this to edit a live journey safely.","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json post /api/v1/journeys/{journeyId}/fork","href":"/api-reference/journeys/fork-journey"},{"title":"Publish journey","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json post /api/v1/journeys/{journeyId}/publish","href":"/api-reference/journeys/publish-journey"},{"title":"Stop journey","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json post /api/v1/journeys/{journeyId}/stop","href":"/api-reference/journeys/stop-journey"},{"title":"List message channels","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /api/v1/journeys/message-channels","href":"/api-reference/journeys/list-message-channels"},{"title":"List message templates","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /api/v1/journeys/message-templates","href":"/api-reference/journeys/list-message-templates"},{"title":"List email templates","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /api/v1/journeys/email-templates","href":"/api-reference/journeys/list-email-templates"},{"title":"Event catalog","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /api/v1/journeys/event-catalog","href":"/api-reference/journeys/event-catalog"},{"title":"Condition catalog","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /api/v1/journeys/condition-catalog","href":"/api-reference/journeys/condition-catalog"},{"title":"Message variable catalog","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /api/v1/journeys/{journeyId}/message-variables","href":"/api-reference/journeys/message-variable-catalog"}]},{"group":"Segments","icon":"blend","pages":[{"title":"List segments","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /api/v1/segments","href":"/api-reference/segments/list-segments"},{"title":"Get a segment","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /api/v1/segments/{slug}","href":"/api-reference/segments/get-a-segment"},{"title":"List segment members","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /api/v1/segments/{slug}/members","href":"/api-reference/segments/list-segment-members"},{"title":"Get the segment filter catalog","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /api/v1/segments/catalog","href":"/api-reference/segments/get-the-segment-filter-catalog"},{"title":"Validate a segment filter","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json post /api/v1/segments/validate","href":"/api-reference/segments/validate-a-segment-filter"},{"title":"Create a segment","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json post /api/v1/segments","href":"/api-reference/segments/create-a-segment"},{"title":"Update a segment","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json patch /api/v1/segments/{slug}","href":"/api-reference/segments/update-a-segment"},{"title":"Delete a segment","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json delete /api/v1/segments/{slug}","href":"/api-reference/segments/delete-a-segment"},{"title":"Preview a segment filter","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json post /api/v1/segments/preview","href":"/api-reference/segments/preview-a-segment-filter"},{"title":"Evaluate a segment now","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json post /api/v1/segments/{slug}/evaluate","href":"/api-reference/segments/evaluate-a-segment-now"}]},{"group":"WhatsApp","icon":"https://mintlify.s3.us-west-1.amazonaws.com/boomai-c1f672dc/whatsapp.svg","pages":[{"title":"List numbers","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /api/v1/whatsapp-numbers","href":"/api-reference/whatsapp-templates/list-numbers"},{"title":"List templates","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /api/v1/templates","href":"/api-reference/whatsapp-templates/list-templates"},{"title":"Create template","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json post /api/v1/templates","href":"/api-reference/whatsapp-templates/create-template"},{"title":"Get template","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /api/v1/templates/{id}","href":"/api-reference/whatsapp-templates/get-template"},{"title":"Update template tracking","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json patch /api/v1/templates/{id}/tracking","href":"/api-reference/whatsapp-templates/update-template-tracking"}]},{"group":"Email templates","icon":"envelope","pages":[{"title":"List email templates","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /api/v1/email-templates","href":"/api-reference/email-templates/list-email-templates"},{"title":"Get email template","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /api/v1/email-templates/{templateId}","href":"/api-reference/email-templates/get-email-template"},{"title":"Create email template","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json post /api/v1/email-templates","href":"/api-reference/email-templates/create-email-template"},{"title":"Update email template","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json patch /api/v1/email-templates/{templateId}","href":"/api-reference/email-templates/update-email-template"}]},{"group":"Lead Capture","icon":"magnet","pages":[{"title":"List Lead Capture pop-ups","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /api/v1/lead-capture/forms","href":"/api-reference/lead-capture/list-lead-capture-pop-ups"},{"title":"Get a Lead Capture pop-up","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /api/v1/lead-capture/forms/{formId}","href":"/api-reference/lead-capture/get-a-lead-capture-pop-up"},{"title":"Create a Lead Capture pop-up","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json post /api/v1/lead-capture/forms","href":"/api-reference/lead-capture/create-a-lead-capture-pop-up"},{"title":"Update a Lead Capture pop-up","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json patch /api/v1/lead-capture/forms/{formId}","href":"/api-reference/lead-capture/update-a-lead-capture-pop-up"},{"title":"List the leads a pop-up collected","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /api/v1/lead-capture/forms/{formId}/leads","href":"/api-reference/lead-capture/list-the-leads-a-pop-up-collected"},{"title":"List embedded forms","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /api/v1/lead-capture/embedded-forms","href":"/api-reference/lead-capture/list-embedded-forms"},{"title":"Get an embedded form","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /api/v1/lead-capture/embedded-forms/{formId}","href":"/api-reference/lead-capture/get-an-embedded-form"},{"title":"Create an embedded form","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json post /api/v1/lead-capture/embedded-forms","href":"/api-reference/lead-capture/create-an-embedded-form"},{"title":"Update an embedded form","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json patch /api/v1/lead-capture/embedded-forms/{formId}","href":"/api-reference/lead-capture/update-an-embedded-form"},{"title":"Publish an embedded form","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json post /api/v1/lead-capture/embedded-forms/{formId}/publish","href":"/api-reference/lead-capture/publish-an-embedded-form"},{"title":"List an embedded form’s responses","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /api/v1/lead-capture/embedded-forms/{formId}/responses","href":"/api-reference/lead-capture/list-an-embedded-form’s-responses"}]},{"group":"Message logs","icon":"scroll-text","pages":[{"title":"List message delivery logs","deprecated":null,"version":null,"openapi":"/api-reference/openapi.json get /api/v1/message-logs","href":"/api-reference/message-logs/list-message-delivery-logs"}]}]}]},"title":"Set trigger - Boom","buildId":"dpl_849ArpqvBiCczQiT1Y1stNGpbqHT","deploymentId":"dpl_849ArpqvBiCczQiT1Y1stNGpbqHT","dynamics":["c2aa737661","b0f84f53ff","a9bb46feb3","2b790eda92"],"chunks":["OpenApiReferenceProvider-Bbp7I60D.js","utils-C3RIvJha.js","cloneDeep-izs3Hzxb.js","_Uint8Array-BVIqJ90l.js","isObjectLike-C8vmzPEN.js","isArray-Dcu1dQ5t.js","utils-DqD-vLt8.js","toString-BX-iyh8G.js","isSymbol-CSH9U2Gm.js","addUniqueKeysToSchema-B31Loprg.js","snippetPresets-DKpk-b8t.js","style-to-object-BY3JEAdk.js","v4-DIgz8zy6.js","Page-n7I5XbKb.js","ApiExamples-Cj65AhOR.js","isEqual-BfaiBbcl.js","usePlaygroundInputsStore-BXtn5gcC.js","shallow-RY2b03Cp.js","getApiPlaygroundDisplay-B0jeiPk3.js","CodeSnippet-CYgBjjwn.js","CodeSnippets-DOngDrYB.js","getPastedJson-DRQbJx-T.js","icon-CQiQCicY.js","MethodPill-BKTLdNtu.js","DuplicateIcon-B9jpAdat.js","createIcon-DCddRrXv.js","DynamicMarkdown-a8hUKrw6.js","SectionHeading-eECVV2eH.js","axios-vUo_bRtp.js","Markdown--GF7ZIpf.js","clsx-DZLdJUrt.js","lib--scc4DXi.js","lib-B8HbPgcC.js","html-void-elements-mCSPHezU.js","dist-2LoAhjKH.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js","AssistantPageLink-Zwc0ZncM.js"]}