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

ItemValue
EndpointPOST https://app.bhomy.ai/api/v1/outbound
AuthenticationAuthorization: Bearer bhomy_live_sk_…
FormatJSON, Content-Type: application/json
Response on success202 Accepted
Limit60 requests in 60 seconds, per key and per IP address
Requirementverified identity, sender number with an agent

Creating an API key

  1. In the dashboard, open API Key and click New Key.
  2. Enter a name, such as "Make.com appointment reminder".
  3. Copy the key and store it securely. It's only shown this one time.

The request

FieldRequiredContent
toNumberyesdestination number in E.164 format with a plus sign, such as +491701234567
fromNumberyesyour sender number, imported or connected via SIP, with an assigned agent
contextnoobject 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.

SituationResponse
Same key, same requestthe response to the first request, with the header Idempotent-Replayed: true. Nothing is dialled again
Same key, different request422 with idempotency_key_reused
The first request is still running409 with idempotency_request_in_progress and Retry-After
Invalid key: empty, longer than 255 characters or not ASCII400 with invalid_idempotency_key

Without the header, every request starts a new call.

Limits

LimitResponse when reached
60 requests in 60 seconds, per key and per IP address429 with rate_limit_exceeded and Retry-After
concurrent calls of your plan429 with concurrent_limit_reached and Retry-After
Destinations of an imported number: German landline and mobile numbers422 with imported_number_destination

With 429, wait the number of seconds given in Retry-After before you try again.

Examples for automation tools

ToolModuleGuide
n8nHTTP Requestn8n
MakeHTTP › Make a requestMake
ZapierWebhooks by Zapier › Custom RequestZapier

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.