Outbound API
Start outbound calls via HTTP, from n8n, Make, Zapier or your server. Endpoint, authentication, request, response, idempotency and limits.
With the Outbound API, you start a call from your agent with a single HTTP request. You pass the destination number, sender number and context data, bhomy sends the agent off, and it holds the conversation with the values from your context.
At a glance
| Item | Value |
|---|---|
| Endpoint | POST https://app.bhomy.ai/api/v1/outbound |
| Authentication | Authorization: Bearer bhomy_live_sk_… |
| Format | JSON, Content-Type: application/json |
| Response on success | 202 Accepted |
| Limit | 60 requests in 60 seconds, per key and per IP address |
| Requirement | verified identity, sender number with an agent |
Creating an API key
- In the dashboard, open API Key and click New Key.
- Enter a name, such as "Make.com appointment reminder".
- Copy the key and store it securely. It's only shown this one time.
The request
| Field | Required | Content |
|---|---|---|
toNumber | yes | destination number in E.164 format with a plus sign, such as +491701234567 |
fromNumber | yes | your sender number, imported or connected via SIP, with an assigned agent |
context | no | object with values for the greeting and prompt |
The sender number determines the agent. You don't specify an agent ID.
curl -X POST https://app.bhomy.ai/api/v1/outbound \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: 4f9c2b1e-7a3d-4c55-9a0e-2d6f8b1c3e77" \
-d '{
"toNumber": "+491701234567",
"fromNumber": "+494012345678",
"context": {
"customer_name": "Anna Berger",
"appointment": "15 January"
}
}'
Spaces, hyphens and brackets in numbers are allowed, as is a (0) after the country code. The API rejects a number without a plus sign instead of guessing a country.
Using context in the conversation
Every field in context is available as a variable. In the prompt or greeting, you write it in double curly brackets:
Hello {{customer_name}}, this is the assistant at Sommer Ltd. I'm calling about
your appointment on {{appointment}}.
If a field is missing from context, bhomy removes it from the text. Keep the values flat and the way people say them.
The response
On success, the API responds with 202. The agent then dials. The result of the conversation later appears in the call history and is sent to your automations.
{
"success": true,
"callId": "call_8f2a1c",
"roomName": "outbound_call_8f2a1c",
"status": "queued",
"dispatchId": "AD_x7Kp2",
"message": "Calling +491701234567"
}
In case of an error, error contains a fixed code your integration can respond to, and message contains an explanation. All codes with solutions: API error codes.
Idempotency: every call exactly once
Automation tools repeat requests when no response arrives. To make sure no one gets called twice, send an Idempotency-Key header with a new value per call, such as a UUID or the ID of the row in your spreadsheet.
| Situation | Response |
|---|---|
| Same key, same request | the response to the first request, with the header Idempotent-Replayed: true. Nothing is dialled again |
| Same key, different request | 422 with idempotency_key_reused |
| The first request is still running | 409 with idempotency_request_in_progress and Retry-After |
| Invalid key: empty, longer than 255 characters or not ASCII | 400 with invalid_idempotency_key |
Without the header, every request starts a new call.
Limits
| Limit | Response when reached |
|---|---|
| 60 requests in 60 seconds, per key and per IP address | 429 with rate_limit_exceeded and Retry-After |
| concurrent calls of your plan | 429 with concurrent_limit_reached and Retry-After |
| Destinations of an imported number: German landline and mobile numbers | 422 with imported_number_destination |
With 429, wait the number of seconds given in Retry-After before you try again.
Examples for automation tools
| Tool | Module | Guide |
|---|---|---|
| n8n | HTTP Request | n8n |
| Make | HTTP › Make a request | Make |
| Zapier | Webhooks by Zapier › Custom Request | Zapier |
Getting results back
The API only reports whether the request was accepted. You get the outcome of the conversation after the call via the CRM Ticket on the Tools › Automation tab: with callId, summary, transcript and captured data. Use the callId to match the result to your request.
Was this page helpful?