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
userEmailis 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.
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"
}'curl -X POST https://api.everycallhandled.com/api/v1/apps/$APP_ID/publish \
-H 'Authorization: Bearer YOUR_TOKEN' \
-d '{ "subdomain": "harbour-hotel" }'{
"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 }.
curl -X POST 'https://api.everycallhandled.com/api/v1/apps/{appId}/unpublish' \
-H 'Authorization: Bearer YOUR_TOKEN'{ "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.
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"}'curl -X DELETE 'https://api.everycallhandled.com/api/v1/apps/{appId}/phone-number' \
-H 'Authorization: Bearer YOUR_TOKEN'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.
curl 'https://api.everycallhandled.com/api/v1/apps/{appId}/sip' \
-H 'Authorization: Bearer YOUR_TOKEN'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.
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"}'Requires edit_settings. Tears down the app's
inbound-calling route; optionally releases the platform-managed number.
Idempotent.
curl -X POST 'https://api.everycallhandled.com/api/v1/apps/{appId}/sip/disable' \
-H 'Authorization: Bearer YOUR_TOKEN'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://..." }
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"}'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.
curl 'https://api.everycallhandled.com/api/v1/apps/{appId}/embed-code' \
-H 'Authorization: Bearer YOUR_TOKEN'{
"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"]
}
}