An outreach stream contacts a list of people for your firm, by WhatsApp, SMS or email, with a message written for each person (or one fixed message), and has the conversation with whoever replies. Streams are set up in the dashboard under Outreach. This guide covers following a stream's progress from your own systems.
You need a server-only application (see Access tokens).
Outreach streams must be switched on for your organisation. If they aren't,
every stream answers 404.
Get a stream's progress#
Find the stream's id in the dashboard (it's in the stream's address), then:
curl https://subcontext.com/api/v1/outreach/streams/0199a3c2-8900-7ebb-9b3c-b02132435465 \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN"
{
"data": {
"id": "0199a3c2-8900-7ebb-9b3c-b02132435465",
"name": "Mortgage renewals, October",
"status": "active",
"goal": "bookings",
"channels": ["whatsapp", "email"],
"all_channels": false,
"follow_up_after_days": 3,
"auto_send": true,
"pace_per_hour": 40,
"message_mode": "drafted",
"awaiting_approval_count": 0,
"rows_count": 420,
"analysed_count": 418,
"skipped_count": 12,
"sent_count": 396,
"errored_count": 2,
"outcomes": { "replied": 88, "booked": 31, "applications": 9, "bound": 4 },
"total_cost_pence": 1454,
"cost_ceiling_pence": 3950,
"budget_exceeded": false,
"created_at": "2026-10-01T09:00:00+01:00"
}
}
What the numbers mean:
| Field | What it counts |
|---|---|
rows_count |
People in the stream. |
analysed_count |
People whose message has been prepared. |
skipped_count |
People left out because there's no way to reach them on the stream's channels, or no consent to. |
sent_count |
People messaged. |
errored_count |
Messages that couldn't be prepared or sent. |
awaiting_approval_count |
Messages waiting for someone at your firm to approve them (when auto_send is false). |
outcomes |
People who replied, booked an appointment, started an application, and bought (bound). |
The stream's settings:
status:active,closed(no new people; those in it carry on) orcancelled(stopped for good).goal: what the stream is for (bookings,sales,engagement,other).channels: in order of preference. Each person is messaged on the first one that reaches them, or on all of them whenall_channelsistrue.follow_up_after_days: a follow-up to people who haven't replied (0 for none).pace_per_hour: the most messages sent an hour.total_cost_penceandcost_ceiling_pence: what the stream's AI work has cost so far, and its limit, in whole pence. They're metered in US dollars, so they're converted at the day's exchange rate and rounded to the nearest penny. When the limit is reached,budget_exceededistrueand the stream stops preparing messages.
A stream's numbers change as it runs. Polling every few minutes is enough.
Getting people into a stream#
There's no request that adds people to a stream directly. People reach a stream as leads, where their consent to be contacted is recorded with them:
- Send each person as a lead to one of your firm's
campaigns, with the
consentthey gave. - A workflow on the campaign (set up in the dashboard, with the action Add to an outreach stream) puts them in the stream.
Then follow what happens to each person with the lead's progress and events, and the stream as a whole with the request above.