Examples use fictional data. Every company, person, address and count in them is invented, and their domains use the reserved .example TLD.
Autopilot
Inbox
Replies arrive classified. Every thread carries an intent, a sentiment and a flag for the ones a human should really see before the agent answers.
6 endpoints
/v1/threadsList threads
Conversations newest first, each with its lead and a one-line preview of the latest message.
Query parameters
| Field | Type | Description |
|---|---|---|
| status | string | open, snoozed or closed. |
| intent | string | interested, question, not_now, not_interested, unsubscribe, out_of_office, referral, auto_reply or other. |
| q | string | Free-text match on subject, body and lead name. |
| limit | number | Rows to return. Default 25, maximum 100. |
| offset | number | Rows to skip. |
curl "https://beamro.com/api/v1/threads?status=open&intent=interested&limit=25" \
-H "x-api-key: $SALVO_API_KEY"{
"rows": [
{
"id": "thr_2b7n4k9x1v6m0q3t8w",
"org_id": "org_4k1p8w2ne6ts0ybc7j",
"lead_id": "led_9f21c7ab4d0e",
"campaign_id": "cmp_1t7k4v9m2q0b6x3n8w",
"subject": "autumn install windows at Harlow Meadow",
"last_message_at": "2026-08-28T08:41:55.000Z",
"message_count": 3,
"intent": "interested",
"status": "open",
"assignee_id": null,
"lead": {
"id": "led_9f21c7ab4d0e",
"org_id": "org_7t2m9v",
"campaign_id": "cmp_1t7k4v9m2q0b6x3n8w",
"person_id": "per_2k7n4v9x1m6q0b3t8c",
"company_id": "cmp_3h8q1w6x0m4v9k2t7b",
"full_name": "Priya Whitcombe",
"title": "Founder & Creative Director",
"email": "priya.whitcombe@harlowmeadow.example",
"email_status": "valid",
"company_name": "Harlow Meadow Events",
"company_domain": "harlowmeadow.example",
"country": "US",
"linkedin_url": "https://www.linkedin.example/in/priya-whitcombe-4c",
"fit_score": 88,
"status": "replied",
"research": {
"hooks": [
"Posted three November barn weddings in the last month",
"Hiring a second install crew"
],
"summary": "Small studio scaling install capacity for the autumn season; buys stems by the case.",
"signals": [
"hiring",
"seasonal_peak"
]
},
"last_contacted_at": "2026-08-27T13:02:10.000Z",
"replied_at": "2026-08-28T08:41:55.000Z",
"created_at": "2026-08-19T10:00:00.000Z"
},
"preview": "Send the sheet — we are locking November now."
}
],
"total": 34,
"limit": 25,
"offset": 0
}/v1/threads/{thread_id}Retrieve a thread
The whole conversation in order, with the classification the agent assigned to each inbound message.
Path parameters
| Field | Type | Description |
|---|---|---|
| thread_idreq | string | Thread identifier. |
curl "https://beamro.com/api/v1/threads/thr_2b7n4k9x1v6m0q3t8w" \
-H "x-api-key: $SALVO_API_KEY"{
"thread": {
"id": "thr_2b7n4k9x1v6m0q3t8w",
"org_id": "org_4k1p8w2ne6ts0ybc7j",
"lead_id": "led_9f21c7ab4d0e",
"campaign_id": "cmp_1t7k4v9m2q0b6x3n8w",
"subject": "autumn install windows at Harlow Meadow",
"last_message_at": "2026-08-28T08:41:55.000Z",
"message_count": 3,
"intent": "interested",
"status": "open",
"assignee_id": null
},
"messages": [
{
"id": "msg_7n3k0v8m1q4b6x2t9w",
"org_id": "org_4k1p8w2ne6ts0ybc7j",
"thread_id": "thr_2b7n4k9x1v6m0q3t8w",
"lead_id": "led_9f21c7ab4d0e",
"campaign_id": "cmp_1t7k4v9m2q0b6x3n8w",
"direction": "inbound",
"step": null,
"mailbox_id": "mbx_5k2v8n1q4x7m0b3t6w",
"from_email": "priya.whitcombe@harlowmeadow.example",
"to_email": "devon@outreach-harlowmeadow.example",
"subject": "Re: autumn install windows at Harlow Meadow",
"body_text": "Send the sheet — we are locking November now. Tuesday or Thursday works for a call.",
"body_html": null,
"status": "received",
"provider_message_id": "01K40BQ2X7N4V8M1",
"scheduled_at": null,
"sent_at": null,
"received_at": "2026-08-28T08:41:55.000Z",
"opened_at": null,
"clicked_at": null,
"intent": "interested",
"sentiment": 0.72,
"needs_human": false,
"created_at": "2026-08-28T08:41:55.000Z"
}
],
"lead": {
"id": "led_9f21c7ab4d0e",
"org_id": "org_7t2m9v",
"campaign_id": "cmp_1t7k4v9m2q0b6x3n8w",
"person_id": "per_2k7n4v9x1m6q0b3t8c",
"company_id": "cmp_3h8q1w6x0m4v9k2t7b",
"full_name": "Priya Whitcombe",
"title": "Founder & Creative Director",
"email": "priya.whitcombe@harlowmeadow.example",
"email_status": "valid",
"company_name": "Harlow Meadow Events",
"company_domain": "harlowmeadow.example",
"country": "US",
"linkedin_url": "https://www.linkedin.example/in/priya-whitcombe-4c",
"fit_score": 88,
"status": "replied",
"research": {
"hooks": [
"Posted three November barn weddings in the last month",
"Hiring a second install crew"
],
"summary": "Small studio scaling install capacity for the autumn season; buys stems by the case.",
"signals": [
"hiring",
"seasonal_peak"
]
},
"last_contacted_at": "2026-08-27T13:02:10.000Z",
"replied_at": "2026-08-28T08:41:55.000Z",
"created_at": "2026-08-19T10:00:00.000Z"
}
}meta with two keys at most: reason — the refusal code on a failed message (the same codes as Send a reply), or mailer_no_answer on a queued one whose delivery is unconfirmed — and capacity (no_eligible_mailbox or daily_limit_reached) with no_capacity. For example meta: { reason: "no_capacity", capacity: "daily_limit_reached" }. Other messages have no meta./v1/threads/{thread_id}/draftDraft a reply
Asks the inbox agent what it would say, without sending. Useful for a human-in-the-loop review queue.
Path parameters
| Field | Type | Description |
|---|---|---|
| thread_idreq | string | Thread identifier. |
curl -X POST "https://beamro.com/api/v1/threads/thr_2b7n4k9x1v6m0q3t8w/draft" \
-H "x-api-key: $SALVO_API_KEY"{
"body": "Sheet attached — the November windows are the two on page one.\n\nThursday at 10 or 2 both work on our side. Send whichever suits and I will put it in.\n\n— Devon"
}/v1/threads/{thread_id}/replySend a reply
Sends from the same mailbox that owns the thread, so the conversation stays in one place. Schedule it if the local hour is wrong.
Path parameters
| Field | Type | Description |
|---|---|---|
| thread_idreq | string | Thread identifier. |
Body parameters
| Field | Type | Description |
|---|---|---|
| bodyreq | string | Plain-text body. Quoted history is appended for you. |
| schedule_at | string | ISO-8601 time to send instead of sending now. |
curl -X POST "https://beamro.com/api/v1/threads/thr_2b7n4k9x1v6m0q3t8w/reply" \
-H "x-api-key: $SALVO_API_KEY" \
-H "content-type: application/json" \
-d '{
"body": "Sheet attached — Thursday at 10 works on our side.",
"schedule_at": "2026-08-28T13:00:00.000Z"
}'{
"id": "msg_0q4b7t2n9k1v6m3x8w",
"org_id": "org_4k1p8w2ne6ts0ybc7j",
"thread_id": "thr_2b7n4k9x1v6m0q3t8w",
"lead_id": "led_9f21c7ab4d0e",
"campaign_id": "cmp_1t7k4v9m2q0b6x3n8w",
"direction": "outbound",
"step": null,
"mailbox_id": "mbx_5k2v8n1q4x7m0b3t6w",
"from_email": "devon@outreach-harlowmeadow.example",
"to_email": "priya.whitcombe@harlowmeadow.example",
"subject": "Re: autumn install windows at Harlow Meadow",
"body_text": "Sheet attached — Thursday at 10 works on our side.",
"body_html": null,
"status": "queued",
"provider_message_id": null,
"scheduled_at": "2026-08-28T13:00:00.000Z",
"sent_at": null,
"received_at": null,
"opened_at": null,
"clicked_at": null,
"intent": null,
"sentiment": null,
"needs_human": false,
"created_at": "2026-08-28T09:02:41.000Z"
}A reply the mail service turns down is an error, never a 2xx. Every refusal from the mail service carries details.message_id: the failed attempt stays on the thread with status: "failed" and its reason in meta, so Retrieve a thread shows it. A 400 for an empty body or a bad schedule_at is refused before anything is stored, so it has no message_id.
| Code | HTTP | When you see it |
|---|---|---|
bad_request | 400 | The body is empty, schedule_at is not a timestamp, or the mail service refused the message as invalid. |
payment_required | 402 | The sending wallet is empty. Top it up and send again. |
mailbox_not_configured | 409 | The mailbox that would send it has no SMTP login. Add one with Update a mailbox. |
no_capacity | 409 | No mailbox can send it right now. details.capacity says why: no_eligible_mailbox or daily_limit_reached. |
suppressed | 409 | The recipient is on the suppression list. Final for that address. |
geo_blocked | 409 | The campaign’s geo policy does not allow this recipient. Final for that address. |
reply_not_sent | 409 / 502 | The mail service did not send it for any other reason. 502 when the fault is on our side. |
relay_refused | 502 | The mailbox’s own mail server refused the message. Its last_error on List mailboxes says why. |
suppression_unavailable | 503 | The suppression list could not be checked, so nothing was sent. Retry shortly. |
A 200 is not always "sent". queued with a scheduled_at is parked until that time. queued without one carries meta: { reason: "mailer_no_answer" }: the mail service did not answer, so delivery is unconfirmed — the reply may or may not have left, and nothing sends it later. Check the thread and the mailbox before sending the same text again. A failed status is never sent, and a draft means the thread has no address to reply to.
/v1/threads/{thread_id}/closeClose a thread
Takes the conversation out of the queue. A new inbound message reopens it automatically.
Path parameters
| Field | Type | Description |
|---|---|---|
| thread_idreq | string | Thread identifier. |
curl -X POST "https://beamro.com/api/v1/threads/thr_2b7n4k9x1v6m0q3t8w/close" \
-H "x-api-key: $SALVO_API_KEY"{
"id": "thr_2b7n4k9x1v6m0q3t8w",
"org_id": "org_4k1p8w2ne6ts0ybc7j",
"lead_id": "led_9f21c7ab4d0e",
"campaign_id": "cmp_1t7k4v9m2q0b6x3n8w",
"subject": "autumn install windows at Harlow Meadow",
"last_message_at": "2026-08-28T08:41:55.000Z",
"message_count": 3,
"intent": "interested",
"status": "closed",
"assignee_id": null
}/v1/meetingsList meetings
Everything the agents booked or proposed, with the lead attached. The number the whole product is judged on.
curl "https://beamro.com/api/v1/meetings" \
-H "x-api-key: $SALVO_API_KEY"{
"rows": [
{
"id": "mtg_6m1x4k9v2q7b0n3t8w",
"org_id": "org_4k1p8w2ne6ts0ybc7j",
"lead_id": "led_9f21c7ab4d0e",
"thread_id": "thr_2b7n4k9x1v6m0q3t8w",
"scheduled_at": "2026-09-03T14:00:00.000Z",
"duration_min": 30,
"booking_url": "https://cal.example/devon/30min",
"status": "booked",
"calendar_event_id": "evt_cal_7729",
"created_at": "2026-08-28T09:11:02.000Z",
"lead": {
"id": "led_9f21c7ab4d0e",
"org_id": "org_7t2m9v",
"campaign_id": "cmp_1t7k4v9m2q0b6x3n8w",
"person_id": "per_2k7n4v9x1m6q0b3t8c",
"company_id": "cmp_3h8q1w6x0m4v9k2t7b",
"full_name": "Priya Whitcombe",
"title": "Founder & Creative Director",
"email": "priya.whitcombe@harlowmeadow.example",
"email_status": "valid",
"company_name": "Harlow Meadow Events",
"company_domain": "harlowmeadow.example",
"country": "US",
"linkedin_url": "https://www.linkedin.example/in/priya-whitcombe-4c",
"fit_score": 88,
"status": "replied",
"research": {
"hooks": [
"Posted three November barn weddings in the last month",
"Hiring a second install crew"
],
"summary": "Small studio scaling install capacity for the autumn season; buys stems by the case.",
"signals": [
"hiring",
"seasonal_peak"
]
},
"last_contacted_at": "2026-08-27T13:02:10.000Z",
"replied_at": "2026-08-28T08:41:55.000Z",
"created_at": "2026-08-19T10:00:00.000Z"
}
}
]
}