To let an assistant use these tools, grant Customer CRM on the consent screen, or just
Outreach streams under its Fine-tune. The scope is outreach.
Read tools work with Read only or Read & write access; write tools only with
Read & write.
Your assistant doesn't see these tools straight away. It finds them with search_tools or
describe_tools, and runs one with use_tool, passing its name and
arguments. Most assistants do this for you: just ask for what you want.
What your assistant is told about this group
Messages to your EXISTING customers by SMS, WhatsApp and email. A stream has a brief, an agent that handles replies, and a message (written by AI for each person, or fixed). People join it from CRM workflows, the leads list or add_outreach_people. Drafts wait for approval unless the stream sends automatically. approve_outreach_drafts, release_outreach_draft and send_outreach_follow_up reach REAL CUSTOMERS: show the user the drafts and get their go-ahead first. Spreadsheets are uploaded on the stream's page. A sequence sends later steps (set_outreach_steps) until the person engages; stop_outreach_person stops them for one person; preview_outreach_step shows what the AI might write for a step not yet due. A newsletter sends its message to its members (list_outreach_members) on a schedule; send_outreach_issue_now and skip_outreach_issue change what goes when. A survey asks one question and records each answer. A stream lives on: cancel_outreach_pending stops what's in progress without ending it, close_outreach_stream stops new people joining, and archive_outreach_stream takes a closed stream off the list. Advisers can also run an IRESS protection quote as themselves (request_iress_quote) and follow the client up with Nurture with AI (start_nurture_from_iress_quote).
The descriptions below are the ones your assistant reads, so they're written for it. When a connection covers more than one
organisation, the assistant passes org (the organisation's slug, from list_orgs) to say which one.
list_outreach_streams
Read List outreach streams
The org's outreach streams (outbound SMS / WhatsApp / email to existing customers), newest first. status narrows to active or closed (canceled is only on older streams). Archived streams (archived_at set) are left out unless include_archived is true.
Arguments
| Field | Type | Description |
|---|---|---|
| status | string |
One of: "active", "canceled", "closed"
|
| include_archived | boolean | |
| limit | integer | |
| org | string | Organisation slug: required when this authorization covers more than one organisation (see list_orgs) |
get_outreach_stream
Read Get an outreach stream
One stream: its settings and message, pipeline counters (analysed, skipped, sent, errors), the outcome funnel in distinct people (replied, booked, applications, bound) and how many drafts are waiting for approval. in_progress is what cancel_outreach_pending would stop. context_blocks lists what a fixed message can use as {{ blocks.<handle>... }}: each attached block's handle, whether it's stale, and the paths into its latest data with a sample value.
Arguments
| Field | Type | Description |
|---|---|---|
| id required | string | |
| org | string | Organisation slug: required when this authorization covers more than one organisation (see list_orgs) |
list_outreach_people
Read List people on an outreach stream
The people on a stream, one entry per person with a row per channel (status, draft, errors, reply/booking flags), 50 per page. row_status filters on any channel row ("ready" = drafts waiting for approval, "errored" = analysis or send failures); query searches name, contact details, drafts and data; sort is line, customer or status.
Arguments
| Field | Type | Description |
|---|---|---|
| stream_id required | string | |
| row_status | string |
One of: "pending_analysis", "analyzing", "ready", "analysis_failed", "skipped", "excluded", "pending_send", "sending", "sent", "send_failed", "canceled", "scheduled", "errored"
|
| source | string |
One of: "upload", "typed", "workflow", "leads", "widget"
|
| query | string | |
| sort | string |
One of: "line", "customer", "status"
|
| dir | string |
One of: "asc", "desc"
|
| page | integer | |
| issue_number | integer | A newsletter: only that issue's rows (0: people turned away as they joined). Omit for every row. |
| org | string | Organisation slug: required when this authorization covers more than one organisation (see list_orgs) |
get_outreach_person
Read Get one person on an outreach stream
Every channel row for the person a row belongs to: drafts, statuses, errors and the data their drafts were written from.
Arguments
| Field | Type | Description |
|---|---|---|
| stream_id required | string | |
| row_id required | string | |
| org | string | Organisation slug: required when this authorization covers more than one organisation (see list_orgs) |
create_outreach_stream
Write Create an outreach stream
Creates an outreach stream (empty: people join afterwards). Next, set_outreach_message sets what people receive; until then the AI drafts a message per person from the brief.
Arguments
| Field | Type | Description |
|---|---|---|
| kind | string |
The stream's shape. mailshot: one message (fixed or AI) to everyone, with no link, opener, IRESS quotes or follow-up. conversation (default): an AI opener the agent follows through, with an optional link, opener, quotes and one follow-up nudge. sequence: the message then later steps (set_outreach_steps), each a while after the one before, stopping when the person engages (stop_on); no follow_up_after_days; people join from lists, the leads list or workflows (enrol_outreach); marketing. reminder: messages placed around a date each person has (a renewal): step 1 at offset_days, later steps at theirs (set_outreach_steps), each sent at send_at_local_time; people join from a list (date_column) or workflows and the leads list (date_field). Service (default) or first-party marketing; it stops only on an opt-out unless stop_on says more. newsletter: the message (fixed with context blocks, or AI) to every member on a schedule, each run an issue; people join from lists, the leads list or workflows and stay until they unsubscribe or are removed (nothing else stops it; no follow-up or opener); marketing. survey: one question (survey) with at most one reminder step (set_outreach_steps), which stops when they reply; the agent records the answer; no link or opener; service (default) or first-party marketing. reminder, newsletter and survey aren't available to most organisations yet and are refused; offer conversation, sequence or mailshot.
One of: "conversation", "sequence", "mailshot", "reminder", "newsletter", "survey"
|
| date_column | string | Reminder only: the column of an uploaded list that holds each person's date (e.g. "Renewal date"; ISO, UK day-first or "12 March 2027"). "" clears it. |
| date_field | string | Reminder only: the key of a lead field holding a date (list_crm_fields), read for people a workflow or the leads list enrols. "" clears it. |
| offset_days | integer | Reminder only: where its first message sits around each person's date, in days: -30 is thirty days before, 0 the day itself, 1 the day after (a year either side at most; default -7). |
| send_at_local_time | string | Reminder and newsletter: the time of day its messages (or issues) send, "HH:MM" in the org's time zone (default "10:00"). |
| schedule | object | Newsletter only: when its issues go, at send_at_local_time in the org's time zone. {cadence: "weekly", weekday: "tuesday"}, {cadence: "fortnightly", weekday: "tuesday"}, {cadence: "monthly", day: 1} (1 to 31, a short month's last day for a day it hasn't, or "last"), or {cadence: "monthly", week: "first", weekday: "tuesday"} (first, second, third, fourth or last). starts_on ("YYYY-MM-DD"): no issue before it, and the week a fortnightly one counts from. |
| schedule.cadence | string |
One of: "weekly", "fortnightly", "monthly"
|
| schedule.weekday | string |
One of: "sunday", "monday", "tuesday", "wednesday", "thursday", "friday", "saturday"
|
| schedule.day | integer or string | |
| schedule.week | string |
One of: "first", "second", "third", "fourth", "last"
|
| schedule.starts_on | string | |
| skip_if_unchanged | boolean | Newsletter only: skip an issue (it's recorded as skipped) when every context block its message uses is unchanged since the last issue went, so the same articles aren't sent twice. Default true. |
| survey | object | Survey only: its question. question_key: the lead field each answer is kept in (list_crm_fields; created when the org hasn't one, e.g. recommend_score). question: the question as the org asks it. answer_type: nps (0 to 10), rating (1 to 5), yes_no or text. follow_up_question (optional, not for text): asked after a low score (6 or under, 1 or 2, a no), its answer kept as <question_key>_comment. The agent asks, confirms and records each answer as a fact and a "Survey response" outcome. |
| survey.question_key | string | |
| survey.question | string | |
| survey.answer_type | string |
One of: "nps", "rating", "yes_no", "text"
|
| survey.follow_up_question | string | |
| reenter_after_finishing | boolean | Sequence only: when a workflow enrols someone whose run has finished (every step sent, or stopped), start them on it again from step 1. Default false: once per person. |
| stop_on | array of string | Sequence and reminder: what stops a person's later steps. reply, link (they opened their link or chatted on its page), quote_or_booking (they started a quote or booked from it). An opt-out always stops them. Default: all three; a reminder's, none. |
| purpose | string |
What the messages are for, checked against each person's consent as they join, while drafts wait and at send. service: about their enquiry, quote or policy (no selling; any kind may be service, but not a stream whose link opens a quote form or that gets IRESS quotes; a reminder's and a survey's default). first_party_marketing (default): the org's own products. third_party_marketing: another company's offers, only to people who agreed to them, and only where the org's consent policy allows it.
One of: "service", "first_party_marketing", "third_party_marketing"
|
| name required | string | |
| brief required | string | What the stream is for, in the org's words: the AI drafts from it. |
| goal required | string |
One of: "engagement", "bookings", "sales", "other"
|
| channels required | array of string | |
| all_channels | boolean | Message each person on every listed channel, not just the first that reaches them. |
| agent_id required | string | The agent that handles replies; it needs an enabled deployment on every channel. |
| auto_send | boolean | false (default) holds every draft for approval. |
| pace_per_hour | integer | |
| follow_up_after_days | integer | 0 = no follow-up nudge. |
| follow_up_quote_original | boolean | |
| whatsapp_template_id | string | For WhatsApp: the approved template (an id from list_whatsapp_templates) the first message goes out on. Omit to use the org's "Outreach first message" template. |
| cta_url | string | Where each person's link goes: any page carrying the org's quote form or chat (its mini-site, or its own website with the embeds). Each person gets their own short link with a token added; {{cta_link}} places it in a fixed message, drafted ones include it. "" removes the link. |
| custom_opener | boolean | When someone opens their link, the chat writes them a greeting from their context and opener_brief. false: the page's usual greeting. |
| opener_brief | string | What the custom opener should do, e.g. "welcome them back and connect the product to the cover they hold". Needed when custom_opener is on. |
| iress_quotes | boolean | Get each person a fresh IRESS whole-of-market quote before drafting, and write a check-in giving them the new price (needs IRESS market quoting and drafted messages). Nothing else is sent to them about it. |
| quote_assumptions | object | What a quote assumes where a person's record doesn't say (the message says so). Defaults: age 40, Office Manager, non-smoker, male when the name doesn't tell, £250,000 cover over 20 years. |
| quote_assumptions.age | integer | |
| quote_assumptions.occupation | string | An occupation on the insurers' list |
| quote_assumptions.smoker | boolean | |
| quote_assumptions.sex | string |
One of: "male", "female"
|
| quote_assumptions.cover_amount | integer | Pounds |
| quote_assumptions.term_years | integer | |
| sender_user_id | string | Write the messages as this team member (a user id of an active member) instead of the AI agent: drafted in their voice, sent under their name, each held for approval (auto_send must be off). "" puts the agent back. |
| reply_to_email | string | Send replies straight to this email inbox instead of the agent (the AI never sees them). Needs an email-only stream with no follow-up, and not a conversation (its replies always go to the agent). "" sends replies to the agent again. |
| from_name | string | The name its emails come from (e.g. the organisation's), in place of the agent's or the team member's it's written as. The address doesn't change. "" uses that default again. |
| reply_email_template | string | The email design everything sent once the person has replied wears (the agent's answers and the team's from the inbox): "builtin:<key>" (e.g. "builtin:plain" or "builtin:gmail", so replies read like a normal email), "custom:<id>" (list_email_templates) or "" for the same design as the outreach emails. Email streams whose replies come to the agent only (not with reply_to_email). |
| context_block_ids | array of string | Context blocks the drafts may draw on (list_context_blocks), in order; a fetched block is read at its latest. Replaces the list; omit to leave it. |
| org | string | Organisation slug: required when this authorization covers more than one organisation (see list_orgs) |
update_outreach_stream
Write Update an outreach stream
Changes a stream's settings: name, brief, goal, channels, reply agent, send gate and follow-up. Every field is required, as on the stream's settings form: read the stream first and send the current values for anything unchanged. A stream's kind and purpose are fixed when it's created and can't be changed here: for a different one, create a new stream. Its kind decides what applies: a mailshot has no link, opener, quotes or follow-up (send cta_url "", custom_opener false and follow_up_after_days 0), and a sequence has follow_up_after_days 0. Switching auto_send on means future drafts go to REAL CUSTOMERS without review: confirm with the user.
Arguments
| Field | Type | Description |
|---|---|---|
| reenter_after_finishing | boolean | Sequence only (see create_outreach_stream). Omit to leave it. |
| date_column | string | Reminder only: the column of an uploaded list that holds each person's date (e.g. "Renewal date"; ISO, UK day-first or "12 March 2027"). "" clears it; omit to leave it. |
| date_field | string | Reminder only: the key of a lead field holding a date (list_crm_fields), read for people a workflow or the leads list enrols. "" clears it; omit to leave it. |
| offset_days | integer | Reminder only: where its first message sits around each person's date, in days: -30 is thirty days before, 0 the day itself, 1 the day after (a year either side at most; omit to leave it). |
| send_at_local_time | string | Reminder and newsletter: the time of day its messages (or issues) send, "HH:MM" in the org's time zone (omit to leave it). |
| schedule | object | Newsletter only: when its issues go, at send_at_local_time in the org's time zone. {cadence: "weekly", weekday: "tuesday"}, {cadence: "fortnightly", weekday: "tuesday"}, {cadence: "monthly", day: 1} (1 to 31, a short month's last day for a day it hasn't, or "last"), or {cadence: "monthly", week: "first", weekday: "tuesday"} (first, second, third, fourth or last). starts_on ("YYYY-MM-DD"): no issue before it, and the week a fortnightly one counts from. |
| schedule.cadence | string |
One of: "weekly", "fortnightly", "monthly"
|
| schedule.weekday | string |
One of: "sunday", "monday", "tuesday", "wednesday", "thursday", "friday", "saturday"
|
| schedule.day | integer or string | |
| schedule.week | string |
One of: "first", "second", "third", "fourth", "last"
|
| schedule.starts_on | string | |
| skip_if_unchanged | boolean | Newsletter only: skip an issue (it's recorded as skipped) when every context block its message uses is unchanged since the last issue went, so the same articles aren't sent twice. Default true. |
| survey | object | Survey only: its question. question_key: the lead field each answer is kept in (list_crm_fields; created when the org hasn't one, e.g. recommend_score). question: the question as the org asks it. answer_type: nps (0 to 10), rating (1 to 5), yes_no or text. follow_up_question (optional, not for text): asked after a low score (6 or under, 1 or 2, a no), its answer kept as <question_key>_comment. The agent asks, confirms and records each answer as a fact and a "Survey response" outcome. |
| survey.question_key | string | |
| survey.question | string | |
| survey.answer_type | string |
One of: "nps", "rating", "yes_no", "text"
|
| survey.follow_up_question | string | |
| stop_on | array of string | Sequence and reminder: what stops a person's later steps (see create_outreach_stream). Replaces the list; omit to leave it. |
| id required | string | |
| name required | string | |
| brief required | string | What the stream is for, in the org's words: the AI drafts from it. |
| goal required | string |
One of: "engagement", "bookings", "sales", "other"
|
| channels required | array of string | |
| all_channels | boolean | Message each person on every listed channel, not just the first that reaches them. |
| agent_id required | string | The agent that handles replies; it needs an enabled deployment on every channel. |
| auto_send | boolean | false (default) holds every draft for approval. |
| pace_per_hour | integer | |
| follow_up_after_days | integer | 0 = no follow-up nudge. |
| follow_up_quote_original | boolean | |
| whatsapp_template_id | string | For WhatsApp: the approved template (an id from list_whatsapp_templates) the first message goes out on. Omit to use the org's "Outreach first message" template. |
| cta_url | string | Where each person's link goes: any page carrying the org's quote form or chat (its mini-site, or its own website with the embeds). Each person gets their own short link with a token added; {{cta_link}} places it in a fixed message, drafted ones include it. "" removes the link. |
| custom_opener | boolean | When someone opens their link, the chat writes them a greeting from their context and opener_brief. false: the page's usual greeting. |
| opener_brief | string | What the custom opener should do, e.g. "welcome them back and connect the product to the cover they hold". Needed when custom_opener is on. |
| iress_quotes | boolean | Get each person a fresh IRESS whole-of-market quote before drafting, and write a check-in giving them the new price (needs IRESS market quoting and drafted messages). Nothing else is sent to them about it. |
| quote_assumptions | object | What a quote assumes where a person's record doesn't say (the message says so). Defaults: age 40, Office Manager, non-smoker, male when the name doesn't tell, £250,000 cover over 20 years. |
| quote_assumptions.age | integer | |
| quote_assumptions.occupation | string | An occupation on the insurers' list |
| quote_assumptions.smoker | boolean | |
| quote_assumptions.sex | string |
One of: "male", "female"
|
| quote_assumptions.cover_amount | integer | Pounds |
| quote_assumptions.term_years | integer | |
| sender_user_id | string | Write the messages as this team member (a user id of an active member) instead of the AI agent: drafted in their voice, sent under their name, each held for approval (auto_send must be off). "" puts the agent back. |
| reply_to_email | string | Send replies straight to this email inbox instead of the agent (the AI never sees them). Needs an email-only stream with no follow-up, and not a conversation (its replies always go to the agent). "" sends replies to the agent again. |
| from_name | string | The name its emails come from (e.g. the organisation's), in place of the agent's or the team member's it's written as. The address doesn't change. "" uses that default again. Omit to leave it. |
| reply_email_template | string | The email design everything sent once the person has replied wears (the agent's answers and the team's from the inbox): "builtin:<key>" (e.g. "builtin:plain" or "builtin:gmail", so replies read like a normal email), "custom:<id>" (list_email_templates) or "" for the same design as the outreach emails. Email streams whose replies come to the agent only (not with reply_to_email). Omit to leave it (it is dropped when email is, or once replies go to reply_to_email). |
| context_block_ids | array of string | Context blocks the drafts may draw on (list_context_blocks), in order; a fetched block is read at its latest. Replaces the list; omit to leave it. |
| org | string | Organisation slug: required when this authorization covers more than one organisation (see list_orgs) |
set_outreach_message
Write Set an outreach stream's message
What people on the stream receive (on a sequence, reminder or survey: step 1, its first message; the later steps are set_outreach_steps): message_mode "drafted" (the AI writes one per person from the brief) or "fixed" (message_body with merge fields, and message_subject for email). message_format "text" (simple formatting: **bold**, [link](url), ## headings, lists; no HTML tags) or, on an email-only stream, "html" (the email body's own markup, inside the email design; values are filled in escaped). email_template is "builtin:<key>", "custom:<id>" or "" for the agent's own. redraft_waiting rewrites drafts still waiting for approval (hand-edited drafts are kept). A fixed message can use the stream's context blocks by handle: {{ blocks.<handle>.text }} for a block's text, and a fetched block's data by path, e.g. {{ blocks.news.items[0].title }} or {% for item in blocks.news.items limit: 3 %}{{ item.title }} {% endfor %} (get_outreach_stream lists the handles and paths). Only attached blocks; an unknown path, a missing or empty value PRINTED (guard it with {% if ... %} or | default:), or a block that's missed two refreshes stops that person's message. Values are filled in again just before sending.
Arguments
| Field | Type | Description |
|---|---|---|
| id required | string | |
| message_mode required | string |
One of: "drafted", "fixed"
|
| message_body | string | |
| message_subject | string | |
| message_format | string |
One of: "text", "html"
|
| email_template | string | |
| redraft_waiting | boolean | |
| org | string | Organisation slug: required when this authorization covers more than one organisation (see list_orgs) |
set_outreach_steps
Write Set an outreach sequence's steps
A sequence, reminder or survey stream's later messages, step 2 and on, in order: replaces the steps it has (step 1 is the stream's own message, set_outreach_message). Each step is sent delay_minutes (60 to 129600) after the step before it went (or, with send_at_local_time on a whole-days delay, that many days after the day it went at that time, in the org's time zone), unless the person engaged in a way the stream stops on, opted out or was stopped. A reminder's steps take offset_days instead (from each person's date: -7 a week before, 0 on the day, 1 the day after), kept in date order and each after step 1's; {{anchor_date}} and {{days_until}} are merge fields. content_mode "fixed": message_body (merge fields and {{ blocks.<handle> }} as in set_outreach_message, written as text) and message_subject for email. "drafted": the AI writes it from brief, added to the stream's brief. At most 10 messages including step 1 (a survey: its question and one reminder, which stops when they reply). [] removes every later step. People waiting on a step get it on the new delay and time. Quiet hours still hold any send until they end. Later steps go through the stream's approval gate like the first: on an auto_send stream they go to REAL CUSTOMERS without review.
Arguments
| Field | Type | Description |
|---|---|---|
| id required | string | |
| steps required | array of object | |
| steps[].delay_minutes | integer | Sequence: after the step before it was sent, e.g. 4320 for 3 days. |
| steps[].send_at_local_time | string | Sequence, optional: "HH:MM" in the org's time zone, for a delay of whole days (a multiple of 1440). 4320 with "09:00" goes 3 days after the day the step before went, at 9am. Leave out for the exact delay. |
| steps[].offset_days | integer | Reminder: days from each person's date, e.g. -7, 0 or 1. |
| steps[].content_mode required | string |
One of: "fixed", "drafted"
|
| steps[].message_subject | string | |
| steps[].message_body | string | |
| steps[].brief | string | For a drafted step: what this message does. |
| steps[].thread | string |
Email: "reply" (default) sends it in the thread the person's previous step started, "Re:" its subject unless the step has its own; "new" starts a thread (and a fixed one needs message_subject). Texts and WhatsApp always carry on the same conversation.
One of: "reply", "new"
|
| steps[].quote_previous | boolean | With thread "reply": quote the previous step's email below, as a mail client would. |
| steps[].whatsapp_template_id | string | Needed on a stream that sends WhatsApp: the approved template (list_whatsapp_templates) the step goes out on when the person's 24-hour window is closed. Inside it, the same words go as a message. |
| org | string | Organisation slug: required when this authorization covers more than one organisation (see list_orgs) |
set_outreach_landing
Write Set where an outreach stream's quote link lands
Gives each person on the stream their own quote link ({{quote_link}} in a fixed message; drafted messages include it themselves). journey_id is the journey whose quote form opens; blank turns the link off. prefill maps spreadsheet column headers to the journey's question keys, so matching answers are filled in. The link only greets them from their row: it never signs them in or links the chat to their record.
Arguments
| Field | Type | Description |
|---|---|---|
| id required | string | |
| journey_id | string | |
| prefill | object | |
| org | string | Organisation slug: required when this authorization covers more than one organisation (see list_orgs) |
set_outreach_columns
Write Set how an outreach stream may use each column
For every AI-written message to people on the stream (drafted intros, and the chat greeting when they open their quote link): columns maps a column header to { use, note }. use "mention" (fine to say, the default), "background" (shapes the message but is never said, e.g. premium or cover amount) or "never" (not given to the AI at all, e.g. health notes). note says what the column means. Replaces the stream's rules as a whole.
Arguments
| Field | Type | Description |
|---|---|---|
| id required | string | |
| columns required | object | |
| org | string | Organisation slug: required when this authorization covers more than one organisation (see list_orgs) |
add_outreach_people
Write Add people to an outreach stream
Adds people by hand (each needs a name, email or phone; notes feed their draft). On a service stream, or a first-party marketing stream where the org accepts a soft opt-in, consent_attested must be true: the user confirms these are the org's EXISTING customers, which is what makes contacting them lawful, and it is recorded against them. Ask the user to confirm that explicitly. Otherwise (third-party marketing, or no soft opt-ins) nothing can be attested: only people with consent on record are messaged, the rest are skipped. If the stream auto-sends, their drafts go out without review. Spreadsheet uploads happen on the stream page.
Arguments
| Field | Type | Description |
|---|---|---|
| stream_id required | string | |
| consent_attested | boolean | |
| people required | array of object | |
| people[].name | string | |
| people[].email | string | |
| people[].phone | string | |
| people[].notes | string | |
| people[].date | string | On a reminder stream: the date its messages are placed around, e.g. 2027-03-12. |
| org | string | Organisation slug: required when this authorization covers more than one organisation (see list_orgs) |
approve_outreach_drafts
Write Approve outreach drafts
SENDS TO REAL CUSTOMERS. Approves the held drafts of the given people (line_number from list_outreach_people; every channel row of each) and sends them now. Show the user the drafts and get their go-ahead first. Already-handled lines are skipped, never sent twice.
Arguments
| Field | Type | Description |
|---|---|---|
| stream_id required | string | |
| line_numbers required | array of integer | |
| org | string | Organisation slug: required when this authorization covers more than one organisation (see list_orgs) |
release_outreach_draft
Write Approve and send one outreach draft
SENDS TO A REAL CUSTOMER. Approves one held draft (one channel row) and sends it now. Show the user the draft and get their go-ahead first.
Arguments
| Field | Type | Description |
|---|---|---|
| stream_id required | string | |
| row_id required | string | |
| org | string | Organisation slug: required when this authorization covers more than one organisation (see list_orgs) |
edit_outreach_draft
Write Edit an outreach draft
Rewrites one held draft (a row in status ready) before it is approved. draft_subject and email_template apply to email rows; a step sent as a reply keeps its thread's "Re:" subject, so needs none. Hand-edited drafts are never rewritten by the AI.
Arguments
| Field | Type | Description |
|---|---|---|
| stream_id required | string | |
| row_id required | string | |
| draft_message required | string | |
| draft_subject | string | |
| email_template | string | |
| org | string | Organisation slug: required when this authorization covers more than one organisation (see list_orgs) |
redraft_outreach_draft
Write Redraft an outreach draft
Has the AI rewrite a person's held drafts (rows in status ready) on an AI-drafted stream, the way the stream drafts everyone, with optional instructions for this person (e.g. "mention their renewal is next month, keep it under 60 words"). row_id is any of the person's rows: every one of their drafts still waiting, on every channel, is rewritten; their sent, approved or failed rows are left alone, as is a draft already redrafted 10 times (listed in capped_row_ids). The stream's brief still governs; the instructions are added for this person only and can't override a channel's length limit or the drafting rules. They're kept on each row, so later redrafts use them too: omit instructions to keep the ones stored on row_id, pass "" to clear them. The new drafts are written in the background (status pending_analysis until each is ready).
Arguments
| Field | Type | Description |
|---|---|---|
| stream_id required | string | |
| row_id required | string | |
| instructions | string | |
| org | string | Organisation slug: required when this authorization covers more than one organisation (see list_orgs) |
retry_outreach_analysis
Write Retry a failed outreach draft
Drafts a person again whose outreach draft failed to be written (rows in status analysis_failed, with the reason in error_message): a model timeout, a context block that has since refreshed, a message since fixed. row_id is any of the person's rows: every one of their failed rows, on every channel, goes back through drafting as it stands (status pending_analysis until each is ready), then the stream's approval or auto-send like any new draft. If the person's details are what's wrong, correct them with correct_outreach_person_data instead, which re-drafts the row too.
Arguments
| Field | Type | Description |
|---|---|---|
| stream_id required | string | |
| row_id required | string | |
| org | string | Organisation slug: required when this authorization covers more than one organisation (see list_orgs) |
correct_outreach_person_data
Write Correct a person's outreach data
Fixes the data a person's drafts are written from (e.g. a mistyped phone number on a skipped row): data maps the row's existing column names to new values. The person is re-analysed and redrafted, then goes through the stream's approval gate again. Rows already sent keep their original data.
Arguments
| Field | Type | Description |
|---|---|---|
| stream_id required | string | |
| row_id required | string | |
| data required | object | |
| org | string | Organisation slug: required when this authorization covers more than one organisation (see list_orgs) |
exclude_outreach_row
Write Exclude an outreach row
Parks one channel row so it is never sent, at any stage before it sends (restore_outreach_row undoes it). remove_outreach_people removes whole people.
Arguments
| Field | Type | Description |
|---|---|---|
| stream_id required | string | |
| row_id required | string | |
| org | string | Organisation slug: required when this authorization covers more than one organisation (see list_orgs) |
remove_outreach_people
Write Remove people from an outreach stream
Takes the given people (line_number from list_outreach_people; every channel row of each) off a stream's list before anything is sent to them, at any stage from waiting for a draft to queued to send. Anything already sending or sent is left alone. restore_outreach_row puts a row back.
Arguments
| Field | Type | Description |
|---|---|---|
| stream_id required | string | |
| line_numbers required | array of integer | |
| org | string | Organisation slug: required when this authorization covers more than one organisation (see list_orgs) |
restore_outreach_row
Write Restore an excluded outreach row
Brings an excluded channel row back into the stream.
Arguments
| Field | Type | Description |
|---|---|---|
| stream_id required | string | |
| row_id required | string | |
| org | string | Organisation slug: required when this authorization covers more than one organisation (see list_orgs) |
send_outreach_follow_up
Write Send an outreach follow-up now
SENDS TO A REAL CUSTOMER. Fires a sent row's one follow-up nudge now instead of on schedule. Refused in quiet hours, after a reply, or if it already had its follow-up. Confirm with the user first.
Arguments
| Field | Type | Description |
|---|---|---|
| stream_id required | string | |
| row_id required | string | |
| org | string | Organisation slug: required when this authorization covers more than one organisation (see list_orgs) |
stop_outreach_person
Write Stop an outreach sequence for one person
No later step of a sequence, reminder or survey goes to this person (row_id: any of their rows, from list_outreach_people or get_outreach_person). A step already written for them and not yet sent is taken off the list. Their replies still reach the agent.
Arguments
| Field | Type | Description |
|---|---|---|
| stream_id required | string | |
| row_id required | string | |
| org | string | Organisation slug: required when this authorization covers more than one organisation (see list_orgs) |
preview_outreach_step
Write Preview an AI step not yet written for one person
The AI writes a preview of a later step of a sequence, reminder or survey for one person (row_id: any of their rows, from list_outreach_people or get_outreach_person), before the step is due. Nothing is saved or sent: when the step comes due the AI writes it again. Only an AI-written step still to come for them; it costs one draft against the stream's cost ceiling. channel: one their sequence goes on (default: the first).
Arguments
| Field | Type | Description |
|---|---|---|
| stream_id required | string | |
| row_id required | string | |
| position required | integer | The step's number: 1 is the first message |
| channel | string |
One of: "whatsapp", "sms", "email"
|
| org | string | Organisation slug: required when this authorization covers more than one organisation (see list_orgs) |
list_outreach_members
Read List a newsletter's members
The people on a newsletter stream's list, newest first, 50 per page: status "subscribed" (default), "left" (with why: unsubscribed, no_consent, blocked or removed) or "all"; query searches name, email and phone. Each has the line_number remove_outreach_people takes, the channels issues go to them on and the last issue they were sent.
Arguments
| Field | Type | Description |
|---|---|---|
| stream_id required | string | |
| status | string |
One of: "subscribed", "left", "all"
|
| query | string | |
| page | integer | |
| org | string | Organisation slug: required when this authorization covers more than one organisation (see list_orgs) |
send_outreach_issue_now
Write Send a newsletter issue now
A newsletter stream's next issue goes now, outside its schedule, to everyone subscribed, whether or not its context blocks changed (scheduled issues carry on as planned). Its drafts go through the stream's gate: on an auto_send stream they reach REAL CUSTOMERS without review, so confirm with the user first.
Arguments
| Field | Type | Description |
|---|---|---|
| stream_id required | string | |
| org | string | Organisation slug: required when this authorization covers more than one organisation (see list_orgs) |
skip_outreach_issue
Write Skip a newsletter's next issue
A newsletter stream's next scheduled issue doesn't go (it's kept on its record as skipped by hand) and the one after becomes next. Call again to skip that one too.
Arguments
| Field | Type | Description |
|---|---|---|
| stream_id required | string | |
| org | string | Organisation slug: required when this authorization covers more than one organisation (see list_orgs) |
close_outreach_stream
Write Close an outreach stream
Stops new people joining; people already on it carry on. Reopen with reopen_outreach_stream. Manager or owner.
Arguments
| Field | Type | Description |
|---|---|---|
| id required | string | |
| org | string | Organisation slug: required when this authorization covers more than one organisation (see list_orgs) |
reopen_outreach_stream
Write Reopen an outreach stream
Lets people join a closed stream again. Manager or owner.
Arguments
| Field | Type | Description |
|---|---|---|
| id required | string | |
| org | string | Organisation slug: required when this authorization covers more than one organisation (see list_orgs) |
archive_outreach_stream
Write Archive an outreach stream
Takes a closed stream off the streams list (list_outreach_streams leaves it out unless include_archived). Nothing else changes: anything still in progress on it finishes (cancel_outreach_pending stops that). Close it first. Unarchive with unarchive_outreach_stream. Manager or owner.
Arguments
| Field | Type | Description |
|---|---|---|
| id required | string | |
| org | string | Organisation slug: required when this authorization covers more than one organisation (see list_orgs) |
unarchive_outreach_stream
Write Unarchive an outreach stream
Puts an archived stream back on the streams list, as it was (a closed one stays closed: reopen_outreach_stream reopens it, and unarchives it too). Manager or owner.
Arguments
| Field | Type | Description |
|---|---|---|
| id required | string | |
| org | string | Organisation slug: required when this authorization covers more than one organisation (see list_orgs) |
cancel_outreach_pending
Write Cancel what's in progress on an outreach stream
Stops everything on the stream that hasn't gone out: drafts being written or waiting, queued sends, reminders waiting for their date, and later steps and follow-ups due. A message already sending still goes. The stream itself carries on (an active one keeps taking people, who start fresh). Can't be undone: tell the user what will stop and confirm first. Manager or owner.
Arguments
| Field | Type | Description |
|---|---|---|
| id required | string | |
| org | string | Organisation slug: required when this authorization covers more than one organisation (see list_orgs) |
list_iress_quotes
Read List IRESS quotes
Protection quotes advisers ran on IRESS from the platform, newest first: the client, the cover, the cheapest price and whether a Nurture with AI follow-up has started. An adviser sees their own; owners and managers see the organisation's.
Arguments
| Field | Type | Description |
|---|---|---|
| limit | integer | |
| org | string | Organisation slug: required when this authorization covers more than one organisation (see list_orgs) |
get_iress_quote
Read Get an IRESS quote
One IRESS quote: its status (pricing: ask again shortly), each insurer's monthly price, cheapest first, and those that couldn't quote.
Arguments
| Field | Type | Description |
|---|---|---|
| quote_id required | string | |
| org | string | Organisation slug: required when this authorization covers more than one organisation (see list_orgs) |
request_iress_quote
Write Run an IRESS quote
Asks IRESS to price level term life cover (single life, monthly) for a client, as the calling adviser with their saved IRESS login (IRESS's test environment needs none). The client becomes a lead and the quote an application. Pricing runs in the background: poll get_iress_quote. Nothing is sent to the client. The organisation needs its FCA reference number set.
Arguments
| Field | Type | Description |
|---|---|---|
| first_name required | string | |
| last_name required | string | |
| string | The client's email: this or phone is required | |
| phone | string | |
| date_of_birth required | string | YYYY-MM-DD |
| sex required | string |
One of: "male", "female"
|
| smoker required | boolean | Used nicotine in the last 12 months |
| ever_smoked | boolean | If not a smoker: ever used nicotine |
| date_last_smoked | string | If they used to: the month they stopped, YYYY-MM |
| occupation required | string | Origo occupation label or code (e.g. Gardener) |
| height_cm | number | |
| weight_kg | number | |
| cover_amount required | number | Life cover in pounds |
| term_years required | integer | |
| org | string | Organisation slug: required when this authorization covers more than one organisation (see list_orgs) |
start_nurture_from_iress_quote
Write Follow up an IRESS quote with Nurture with AI
Starts a Nurture with AI follow-up from an IRESS quote the calling adviser ran, and returns the follow-up page where they choose the prices to send, check the AI's draft and send it (nothing reaches the client from here). The first time, it sets Nurture with AI up for the organisation.
Arguments
| Field | Type | Description |
|---|---|---|
| quote_id required | string | |
| org | string | Organisation slug: required when this authorization covers more than one organisation (see list_orgs) |