The fields that decide quality
Onlyname is required. In practice three fields decide whether the
conversations are any good, because they go straight into the agent’s prompt:
The rest tune behavior:
An initiative is created as
DRAFT. A draft is fully editable. After launch,
what the agent says stays editable — name, objective, context,
guidingQuestions, flagCondition and identityDeflection — and the edit
reaches the next turn of every conversation already open, with no publish step.
That is the intended way to fix wording mid-run. smartSendingMode also stays
editable, and applies to the next message the initiative sends.
Responses include isTransactional, true for a Transactional. GET /api/v1/initiatives returns every kind when you pass neither isRecurring nor isTransactional. Passing isRecurring alone leaves Transactionals out, and isTransactional=true returns only Transactionals. A launch of a Transactional whose setup is incomplete is refused with journey_not_ready.
A Transactional starts only from its event, so send each event with the single-event endpoint (POST /api/v1/cdp/events). Batch event recording stores the events but does not trigger enrollment. You cannot add people to a Transactional by hand; that is refused with 422 transactional_event_only.
Everything else — channel, language, maxAttempts, isRecurring,
contextSchema and the voice and reward settings — is draft-only, because it
cannot change under conversations already in flight. A PATCH that names one of
them on a launched initiative fails with 409 initiative_not_draft and lists the
fields it refused, changing nothing. A COMPLETED or CANCELED initiative is
frozen outright.
One edit a launched initiative refuses even though the field is editable:
clearing context or objective. Both are required to launch, so emptying
one would leave the agent with no brief on conversations already open. Sending
"" (or only whitespace) fails and changes nothing; send the new text instead.
Dropping a guiding question from a launched initiative that already collected
answers for it archives the question rather than deleting it. The agent stops
asking it from the next turn and no new answers are extracted, but the answers
already collected are kept: they still appear in insights, the data view, CSV
exports (column marked (archived)) and the data summary (archived: true). A
question with no answers yet, or any question on a draft, is deleted outright.
An archived question can’t be restored or edited; sending its old id again
creates a new question.
initiatives_update takes guidingQuestions as the complete set, not a
patch. Omit the field to leave the questions alone. When you send it, carry each
existing question’s id (from initiatives_get) to edit it in place — a
question you leave out counts as dropping it, which on a launched initiative
archives it (see above). So the round-trip is: read, edit the array keeping
every id you mean to keep, write.
Within a question you send, a field you leave out keeps its current value. That
applies to answerType, scaleMin, scaleMax and options: an edit that names
only id and questionText re-words the question and changes nothing else, so a
multiple-choice question keeps its type and its answer options. To change one of
them, send it — including options: [] to clear the options, and a new
answerType to retype the question, which discards options that no longer apply.
OPEN is the default only for a question you are adding.
Lifecycle
What “ready to launch” means
A launch that is not ready fails with a specific code rather than a generic error, which tells you exactly what to fix:Launching publishes the initiative’s journey for you, on WhatsApp and
email alike, so you do not need a separate publish call. You do have to have
built that journey first: a new initiative does not come with one, and a
launch without one is refused. On WhatsApp, a missing channel
on the opening message is filled in automatically when there is only one
sensible answer: the initiative’s own channel, otherwise the organization’s
primary, otherwise its only sendable one.
Participants
Participants exist only inside an initiative, addressed under/initiatives/{id}/participants. There is no global participant list, and there
is no delete: stopping a participant halts their outreach and keeps the data.
A participantId is one person’s single pass through the journey, so a person
enrolled twice has two of them. It is the same id journey_run.*
webhooks report as run.engagementId — capture it there to stop a
specific run later without listing participants at all.
Each person needs the identifier of the initiative’s channel: phoneNumber in
E.164 format on WhatsApp, email on an email initiative. The other one is
optional. A row without the channel’s identifier comes back in errors as
missing_phone_number or missing_email and is not enrolled; every other row in
the request still goes through. Each added row echoes the phoneNumber and
email you sent for it, null when you sent none.
Enrolling sends a real message. People on your Do Not Contact list are skipped
by the platform rather than by whoever wrote the flow, on both channels, so a
suppressed contact enrolled by mistake is not contacted and comes back as
contact_suppressed.
Reading results
Three read paths, all covered in extraction: the aggregate summary for the whole initiative, the per participant record with its extracted values, and the full transcripts.Related
Journeys
The flow an initiative runs, and how to shape it when the default is not what
you want.
Extraction
The typed fields every conversation should yield. Set this before launching.
Segments
Define who the initiative reaches, and remember to evaluate it.
Inbound conversations
The other direction, where no initiative is involved.