Checking your session…

Go Live — Phone Numbers & Web Chat

Your assistant exists as a draft until you take it live. Going live is the moment it becomes real: it gets a web address, can take a phone number, and starts answering. This chapter covers the full go-live surface — taking an assistant live and offline, buying and wiring a phone number, and putting the chat widget on your own website.

Requires publish.

To apply later changes, the app already has a subdomain; reuse it (only subdomain is required):

Response (200):

What going live does:

  • First time — takes the app live: gives it its web address, applies your configuration (prompt, tools, voice, billing, calling setup), wires phone routing, and sends a welcome email if userEmail is provided.
  • Afterwards — applies your draft changes to the live assistant. The subdomain and web address stay the same, and running balances and usage history are never touched — this changes behaviour, not billing state.

Going live completes within a few seconds. Until you take the assistant live, edits made via PATCH /apps/{appId} have no effect on what callers experience; GET /apps/{appId} tells you whether changes are waiting via hasPendingPublish.

POST/api/v1/apps/{appId}/publishpublish
curl -X POST https://api.everycallhandled.com/api/v1/apps/$APP_ID/publish \
  -H 'Authorization: Bearer YOUR_TOKEN' \
  -H 'Content-Type: application/json' \
  -d '{
    "subdomain": "harbour-hotel",
    "userEmail": "owner@harbourhotel.co.uk",
    "userPhone": "+447700900000"
  }'
Sign in to run this against your account.
curl -X POST https://api.everycallhandled.com/api/v1/apps/$APP_ID/publish \
  -H 'Authorization: Bearer YOUR_TOKEN' \
  -d '{ "subdomain": "harbour-hotel" }'
Sign in to run this against your account.
JSON
{
  "appId": "...",
  "subdomain": "harbour-hotel",
  "deploymentUrl": "https://harbour-hotel.app.everycallhandled.com",
  "embedCode": "<script ...></script>",
  "status": "published",
  "publishedAt": "2026-05-10T10:30:00Z"
}

Requires publish. Takes the live site offline immediately without deleting anything: the app, its knowledge, its conversation history and any phone number are all kept, and the subdomain is reserved so it can go live again on the same address. Conversations captured while live are hidden from listings until the app goes live again.

Response (200):

Calling it on an app that is not live returns { "success": true, "alreadyUnpublished": true }.

POST/api/v1/apps/{appId}/unpublishpublish
curl -X POST 'https://api.everycallhandled.com/api/v1/apps/{appId}/unpublish' \
  -H 'Authorization: Bearer YOUR_TOKEN'
Sign in to run this against your account.
JSON
{ "success": true, "unpublished": true, "siteRemoved": true, "subdomainKept": "harbour-hotel" }

The fastest route to a phone-answering assistant: one call buys a number and wires it to the app.

Requires edit_settings.

POST searches and purchases a phone number for the requested country (GB regulatory requirements handled for you) and wires inbound calling in one call — one app, one number. A wiring failure automatically releases the just-purchased number and clears the app, so a paid number can never leak. DELETE unwires calling, releases the number (released numbers cannot be recovered), and clears it off the app.

POST/api/v1/apps/{appId}/phone-number# buy a number + wire calls: { country?: 'GB' }edit_settings
DELETE/api/v1/apps/{appId}/phone-number# unwire + release the number (permanent)edit_settings
curl -X POST 'https://api.everycallhandled.com/api/v1/apps/{appId}/phone-number' \
  -H 'Authorization: Bearer YOUR_TOKEN' \
  -H 'Content-Type: application/json' \
  -d '{"country":"GB"}'
Sign in to run this against your account.
curl -X DELETE 'https://api.everycallhandled.com/api/v1/apps/{appId}/phone-number' \
  -H 'Authorization: Bearer YOUR_TOKEN'
Copy-only. DELETE is destructive — run it from your own terminal with the sample above, not from the docs.

Available to any signed-in member of the account that owns the app. Returns the app's current inbound-calling setup — whether calling is enabled, which number is wired, and the state of the underlying telephony resources.

GET/api/v1/apps/{appId}/sip
curl 'https://api.everycallhandled.com/api/v1/apps/{appId}/sip' \
  -H 'Authorization: Bearer YOUR_TOKEN'
Sign in to run this against your account.

If you manage your own numbers (for example, bringing an existing number or your own Twilio account — see Credentials), the SIP endpoints give you direct control of the wiring that the phone-number endpoint above automates.

Requires edit_settings. Provisions the app's inbound-calling route; if twilioManaged="true", also provisions a platform-managed number. Idempotent.

POST/api/v1/apps/{appId}/sip/enableedit_settings
curl -X POST 'https://api.everycallhandled.com/api/v1/apps/{appId}/sip/enable' \
  -H 'Authorization: Bearer YOUR_TOKEN' \
  -H 'Content-Type: application/json' \
  -d '{"twilioManaged":"true"}'
Sign in to run this against your account.

Requires edit_settings. Tears down the app's inbound-calling route; optionally releases the platform-managed number. Idempotent.

POST/api/v1/apps/{appId}/sip/disableedit_settings
curl -X POST 'https://api.everycallhandled.com/api/v1/apps/{appId}/sip/disable' \
  -H 'Authorization: Bearer YOUR_TOKEN'
Sign in to run this against your account.

Requires edit_settings. Sets (or clears) the Voice URL on the app's existing Twilio number, so an incoming call routes to this assistant — for when you keep the number in your own Twilio account. The app must already have a twilioPhoneNumber configured (otherwise 400).

Body: { "voiceUrl": "https://..." } — pass null to clear.

Response (200): { "success": true, "phoneNumber": "+44...", "voiceUrl": "https://..." }

POST/api/v1/apps/{appId}/voice/twilio-urledit_settings
curl -X POST 'https://api.everycallhandled.com/api/v1/apps/{appId}/voice/twilio-url' \
  -H 'Authorization: Bearer YOUR_TOKEN' \
  -H 'Content-Type: application/json' \
  -d '{"voiceUrl":"https://example.com/your-twilio-webhook"}'
Sign in to run this against your account.

Available to any signed-in member of the account that owns the app. Returns ready-to-paste iframe + <script> snippets for embedding the assistant on your own website. The app must be published first (otherwise 400).

Response (200):

The snippets themselves are intentionally shareable. Per-page embed options (start language, opening intent) are covered under Web-chat conversation config.


GET/api/v1/apps/{appId}/embed-code
curl 'https://api.everycallhandled.com/api/v1/apps/{appId}/embed-code' \
  -H 'Authorization: Bearer YOUR_TOKEN'
Sign in to run this against your account.
JSON
{
  "appId": "...",
  "appName": "...",
  "isPublished": true,
  "publishedUrl": "https://...",
  "embedCode": {
    "scriptTag": "<script src=\"https://...\"></script>",
    "iframe": "<iframe src=\"https://...\" ...></iframe>"
  },
  "urls": { "embedScript": "...", "widget": "...", "documentation": "..." },
  "configuration": {
    "position": ["bottom-right", "bottom-left"],
    "theme": ["auto", "light", "dark"],
    "mode": ["fab", "embedded"]
  }
}