Inbound FaceTime calls
If you are building your own CRM or softphone, you can receive inbound FaceTime Audio calls on your lines, show a ring screen, and answer or decline from your own UI. Answering returns Agora credentials, so the same join code as outbound calls applies.
On this page
FACETIME_NOT_ENABLED — that means the feature isn't active on your account, not that the API is down. Interested in FaceTime Audio? Contact sales@tryprojectblue.com or reach out to support to upgrade.How it fits together
- A
facetime.inbound.ringingwebhook arrives when a call rings on one of your lines. - Your UI shows a ring screen keyed on
call_uuid. - You answer or decline via the API.
- On answer you join Agora with the returned credentials.
facetime.inbound.answeredandfacetime.inbound.endedwebhooks keep your UI in sync.- You hang up with
/end-facetime-call-api.
1. Turn on call events for a webhook
In the Project Blue app go to Settings > API Webhooks, click Add Webhook, tick Inbound FaceTime calls, then Test & Save. Existing webhooks cannot be edited, so create a new one or a second one to the same URL. The calls box is off by default, so existing message automations are not affected.
2. Handle the ringing event
When an inbound FaceTime Audio call starts ringing on one of your lines, Project Blue POSTs facetime.inbound.ringing. Key your UI on call_uuid. A repeated ringing signal from the Mac produces one ringing webhook per call.
event"facetime.inbound.ringing"Requiredcall_uuidstringRequireddirection"inbound"RequiredfromstringRequiredpb_line_idstring (UUID)RequiredlinePhoneNumberstringRequiredringingAtstring (ISO 8601)RequiredreceivedAtstring (ISO 8601)RequiredRequest body
call_uuidstringRequiredResponse
successbooleanRequiredcall_uuidstringRequiredagoraobject | nullRequiredappIdstringRequiredchannelNamestringRequiredtokenstringRequireduidnumberRequired200 means the call was answered, not that you can hear it. agora comes from the Mac at answer time; if the Mac returns none, the service falls back to the credentials it stored when the call started ringing. It can still be null on a 200. Check for it before touching the SDK.Request body
call_uuidstringRequiredIf the caller already hung up between the webhook and the decline, the service treats already disconnected from the Mac as success.
3. Keep your UI in sync
facetime.inbound.answered means someone else picked up. Dismiss the ring UI if you were not the one that answered.
event"facetime.inbound.answered"Requiredcall_uuidstringRequiredfromstringRequiredpb_line_idstring (UUID)RequiredlinePhoneNumberstringRequiredansweredAtstring (ISO 8601)RequiredreceivedAtstring (ISO 8601)Requiredfacetime.inbound.ended means the call is over. Tear down the ring UI and leave the Agora channel.
event"facetime.inbound.ended"Requiredcall_uuidstringRequiredstatus"ended" | "declined" | "no_answer" | "voicemail" | "busy" | "failed"RequiredfromstringRequiredpb_line_idstring (UUID)RequiredlinePhoneNumberstringRequiredansweredAtstring (ISO 8601) | nullRequiredendedAtstring (ISO 8601)RequiredreceivedAtstring (ISO 8601)RequiredEvents
facetime.inbound.ringingfacetime.inbound.answeredfacetime.inbound.ended/get-facetime-call-status-api for any call_uuid you learn about later. A call is answerable only while call_status is ringing.Status codes
- 200
- Call answered / declined
- 400
- Invalid or missing call_uuid
- 401
- Missing or invalid API key
- 403
- FACETIME_NOT_ENABLED
- 404
- Call not found
- 409
- Call is not an inbound call that is currently ringing
- 429
- Rate limit exceeded
- 502
- Device error
- 503
- Device unreachable
- 500
- Internal server error