Outreach API
Read a brand's outreach pipeline and act on it: approve or reject drafts, draft AI reply suggestions, send replies, and set the send mode. These endpoints mirror the campaign My Outreach panel into the API instance and proxy module-a's aggregate of module-H contacts and the module-J outreach pipeline. All routes are served under /v1/outreach.
Reads and workflow actions are free; only the AI/sending steps are metered.
Authentication
Every request must carry a tenant API key as a Bearer token:
Authorization: Bearer ai92_live_<key> # production
Authorization: Bearer ai92_test_<key> # sandboxOAuth 2.0 access tokens (Authorization: Bearer eyJ…) are also accepted. All routes are brand-scoped: brand_id is required (query or body) and is verified against your account. Mutating requests support the Idempotency-Key header.
Credit costs at a glance
| Endpoint | Cost |
|---|---|
GET /v1/outreach/data | Free |
POST /v1/outreach/decision/{lead_id} | Free |
POST /v1/outreach/reply/suggest/{conversation_id} | 2 cr |
POST /v1/outreach/reply/send/{conversation_id} | 1 cr |
PATCH /v1/outreach/send-mode | Free |
GET /v1/outreach/data
Cost: Free
The brand's My-Outreach payload: contacts (merged module-H + module-J), the funnel, message variants, and feature flags, in a single read.
Auth: Bearer (tenant key or OAuth token)
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
brand_id | query | string | Yes | The brand to read. Verified against the account. |
Request
curl "https://api.ai92.ai/v1/outreach/data?brand_id=b1f0…" \
-H "Authorization: Bearer ai92_test_51a9c0de…"Response 200 OK
{
"brand_id": "b1f0…",
"send_mode": "REQUIRES_APPROVAL",
"funnel": { "queued": 12, "sent": 184, "replied": 21, "bounced": 3 },
"contacts": [
{
"lead_id": "lead_8f21",
"conversation_id": "conv_3a90",
"full_name": "Jordan Vega",
"email": "[email protected]",
"stage": "awaiting_approval",
"last_message_at": "2026-06-21T08:40:00Z"
}
],
"variants": [{ "id": "var_a", "label": "Direct" }],
"feature_flags": { "auto_send_enabled": false }
}Errors
| Status | Code | When |
|---|---|---|
404 | BRAND_NOT_FOUND | Brand not owned by the account. |
POST /v1/outreach/decision/{lead_id}
Cost: Free
Approve or reject an outreach draft (the workflow approve/reject step).
Auth: Bearer
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
lead_id | path | string | Yes | The lead whose draft to decide. |
brand_id | body | string | Yes | The brand. Verified against the account. |
decision | body | string | Yes | approve or reject. |
reason | body | string / null | No | Optional reason recorded with the decision. |
Request
curl -X POST https://api.ai92.ai/v1/outreach/decision/lead_8f21 \
-H "Authorization: Bearer ai92_test_51a9c0de…" \
-H "Content-Type: application/json" \
-d '{"brand_id": "b1f0…", "decision": "approve"}'Response 200 OK
{ "lead_id": "lead_8f21", "decision": "approve", "status": "approved" }Errors
| Status | Code | When |
|---|---|---|
404 | BRAND_NOT_FOUND | Brand not owned by the account. |
POST /v1/outreach/reply/suggest/{conversation_id}
Cost: 2 credits
Generate a brand-grounded AI reply draft for a conversation. Credits are charged only after a successful response.
Auth: Bearer
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
conversation_id | path | string | Yes | The conversation to draft a reply for. |
brand_id | body | string | Yes | The brand. Verified against the account. |
tone | body | string / null | No | Reply tone. Default professional. |
Request
curl -X POST https://api.ai92.ai/v1/outreach/reply/suggest/conv_3a90 \
-H "Authorization: Bearer ai92_test_51a9c0de…" \
-H "Content-Type: application/json" \
-d '{"brand_id": "b1f0…", "tone": "friendly"}'Response 200 OK
{
"conversation_id": "conv_3a90",
"suggestion": {
"subject": "Re: quick question about your rollout",
"body_text": "Hi Jordan — happy to help…",
"body_html": "<p>Hi Jordan — happy to help…</p>"
},
"credits_consumed": 2
}Errors
| Status | Code | When |
|---|---|---|
402 | INSUFFICIENT_CREDITS | Balance below 2 credits. |
404 | BRAND_NOT_FOUND | Brand not owned by the account. |
POST /v1/outreach/reply/send/{conversation_id}
Cost: 1 credit
Send a reply on a conversation (email send). Credits are charged only after a successful send.
Auth: Bearer
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
conversation_id | path | string | Yes | The conversation to reply on. |
brand_id | body | string | Yes | The brand. Verified against the account. |
subject | body | string | Yes | Reply subject. |
body_html | body | string | Yes | Reply body as HTML. |
body_text | body | string / null | No | Plain-text alternative. |
in_reply_to_message_id | body | string / null | No | Message id this reply threads onto. |
Request
curl -X POST https://api.ai92.ai/v1/outreach/reply/send/conv_3a90 \
-H "Authorization: Bearer ai92_test_51a9c0de…" \
-H "Content-Type: application/json" \
-d '{"brand_id": "b1f0…", "subject": "Re: quick question", "body_html": "<p>Hi Jordan — happy to help…</p>"}'Response 200 OK
{
"conversation_id": "conv_3a90",
"message_id": "msg_77a1",
"status": "sent",
"credits_consumed": 1
}Errors
| Status | Code | When |
|---|---|---|
402 | INSUFFICIENT_CREDITS | Balance below 1 credit. |
404 | BRAND_NOT_FOUND | Brand not owned by the account. |
PATCH /v1/outreach/send-mode
Cost: Free
Flip the brand's outreach send mode between automatic sending and human approval.
Auth: Bearer
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
brand_id | body | string | Yes | The brand. Verified against the account. |
send_mode | body | string | Yes | AUTO_SEND or REQUIRES_APPROVAL. |
Request
curl -X PATCH https://api.ai92.ai/v1/outreach/send-mode \
-H "Authorization: Bearer ai92_test_51a9c0de…" \
-H "Content-Type: application/json" \
-d '{"brand_id": "b1f0…", "send_mode": "AUTO_SEND"}'Response 200 OK
{ "brand_id": "b1f0…", "send_mode": "AUTO_SEND" }Errors
| Status | Code | When |
|---|---|---|
404 | BRAND_NOT_FOUND | Brand not owned by the account. |