REST endpoints for calls in ServFlo: 11 operations with parameters, request and response fields, permissions and curl examples.
Base URL: https://app.servflo.ai/api. Every call needs Authorization: Bearer sfk_… (Authentication); {organizationId} ($ORGANIZATION_ID in the examples) is your business's id.
Calls newest first, with the tracked source, the customer matched by caller ID, who answered, talk time, recording and summary status, the follow-up and what the call led to. Filters: direction, outcome (ANSWERED, MISSED incl. voicemails, VOICEMAIL, LIVE), followUp OPEN for missed calls to return, ai for only the calls the AI receptionist answered, customer, number, source (or UNTRACKED), from/to days in the business's calendar. openFollowUps counts missed calls still to return. Transcripts are not listed. Read-only.
One of RINGING, IN_PROGRESS, COMPLETED, MISSED, VOICEMAIL, FAILED.
items[].fake
boolean
A simulated call (SERVFLO_VOICE=fake).
items[].fromNumber
string
items[].toNumber
string
items[].otherNumber
string
The customer's side of the call.
items[].phoneNumber
object or null
items[].phoneNumber.id
string
items[].phoneNumber.label
string
items[].phoneNumber.e164
string
items[].source
enum or null
The tracked source of the number called (PERSONAL: someone's own line); null = untracked. One of MAIN, WEBSITE, GOOGLE_BUSINESS, CAMPAIGN, QR_CODE, BUSINESS_UNIT, PRINT, OTHER, PERSONAL.
items[].campaign
object or null
items[].campaign.id
string
items[].campaign.name
string
items[].businessUnit
object or null
items[].businessUnit.id
string
items[].businessUnit.name
string
items[].customer
object or null
items[].customer.id
string
items[].customer.name
string
items[].matchedCustomerCount
integer
items[].user
object or null
Who answered (inbound) or placed it (outbound).
items[].user.id
string
items[].user.name
string
items[].bridgeNumber
string or null
items[].ivrDigit
string or null
items[].afterHours
boolean
items[].startedAt
string (date-time)
items[].answeredAt
string (date-time) or null
items[].endedAt
string (date-time) or null
items[].durationSeconds
integer or null
Talk time.
items[].billedMinutes
integer or null
items[].voicemail
boolean
items[].recording
object
items[].recording.status
enum
One of NONE, PENDING, DONE, FAILED, SKIPPED.
items[].recording.announced
boolean
items[].recording.durationSeconds
integer or null
items[].recording.available
boolean
items[].recording.deletedAt
string (date-time) or null
items[].recording.error
string or null
items[].transcriptStatus
enum
One of NONE, PENDING, DONE, FAILED, SKIPPED.
items[].transcript
string or null
Only for callers holding phone.recordings, on GET /phone/calls/{callId}.
items[].summaryStatus
enum
One of NONE, PENDING, DONE, FAILED, SKIPPED.
items[].summary
string or null
The AI call summary (Claude, from the transcript).
items[].summaryError
string or null
items[].followUp
object
items[].followUp.status
enum
One of NONE, OPEN, DONE.
items[].followUp.assignee
object or null
items[].followUp.doneAt
string (date-time) or null
items[].textBack
object or null
items[].textBack.status
string
items[].textBack.messageId
string or null
items[].job
object or null
items[].job.id
string
items[].job.identifier
string
items[].request
object or null
items[].request.id
string
items[].request.identifier
string
items[].notes
string or null
items[].ai
object or null
Set when the call was routed to the AI receptionist.
items[].ai.startedAt
string (date-time) or null
items[].ai.endedAt
string (date-time) or null
items[].ai.outcome
string or null
What the AI receptionist did: BOOKED, RESCHEDULED, REQUEST, MESSAGE, TRANSFERRED, ENDED, ABANDONED, FAILED, TIMEOUT, DRAINED; null while live.
items[].ai.callerTurns
integer
items[].ai.voiceSeconds
integer or null
AI voice seconds (metered as ai_voice.minutes).
items[].ai.message
string or null
A message it took for the office.
items[].ai.turns
array of object or null
The conversation; only for callers holding phone.recordings, on GET /phone/calls/{callId}.
Customer-visible: calls a customer (or any number) showing the business's number (phoneNumberId, default the main line). via BROWSER: the answer's connect.params go to the browser phone (Twilio Voice SDK Device.connect). via PHONE: Twilio rings bridgeNumber (your own phone) first, then the customer. jobId / requestId record what the call was about. Fake mode: the customer answers at once; end it with POST …/hangup.
One of RINGING, IN_PROGRESS, COMPLETED, MISSED, VOICEMAIL, FAILED.
call.fake
boolean
A simulated call (SERVFLO_VOICE=fake).
call.fromNumber
string
call.toNumber
string
call.otherNumber
string
The customer's side of the call.
call.phoneNumber
object or null
call.phoneNumber.id
string
call.phoneNumber.label
string
call.phoneNumber.e164
string
call.source
enum or null
The tracked source of the number called (PERSONAL: someone's own line); null = untracked. One of MAIN, WEBSITE, GOOGLE_BUSINESS, CAMPAIGN, QR_CODE, BUSINESS_UNIT, PRINT, OTHER, PERSONAL.
call.campaign
object or null
call.campaign.id
string
call.campaign.name
string
call.businessUnit
object or null
call.businessUnit.id
string
call.businessUnit.name
string
call.customer
object or null
call.customer.id
string
call.customer.name
string
call.matchedCustomerCount
integer
call.user
object or null
Who answered (inbound) or placed it (outbound).
call.user.id
string
call.user.name
string
call.bridgeNumber
string or null
call.ivrDigit
string or null
call.afterHours
boolean
call.startedAt
string (date-time)
call.answeredAt
string (date-time) or null
call.endedAt
string (date-time) or null
call.durationSeconds
integer or null
Talk time.
call.billedMinutes
integer or null
call.voicemail
boolean
call.recording
object
call.recording.status
enum
One of NONE, PENDING, DONE, FAILED, SKIPPED.
call.recording.announced
boolean
call.recording.durationSeconds
integer or null
call.recording.available
boolean
call.recording.deletedAt
string (date-time) or null
call.recording.error
string or null
call.transcriptStatus
enum
One of NONE, PENDING, DONE, FAILED, SKIPPED.
call.transcript
string or null
Only for callers holding phone.recordings, on GET /phone/calls/{callId}.
call.summaryStatus
enum
One of NONE, PENDING, DONE, FAILED, SKIPPED.
call.summary
string or null
The AI call summary (Claude, from the transcript).
call.summaryError
string or null
call.followUp
object
call.followUp.status
enum
One of NONE, OPEN, DONE.
call.followUp.assignee
object or null
call.followUp.doneAt
string (date-time) or null
call.textBack
object or null
call.textBack.status
string
call.textBack.messageId
string or null
call.job
object or null
call.job.id
string
call.job.identifier
string
call.request
object or null
call.request.id
string
call.request.identifier
string
call.notes
string or null
call.ai
object or null
Set when the call was routed to the AI receptionist.
call.ai.startedAt
string (date-time) or null
call.ai.endedAt
string (date-time) or null
call.ai.outcome
string or null
What the AI receptionist did: BOOKED, RESCHEDULED, REQUEST, MESSAGE, TRANSFERRED, ENDED, ABANDONED, FAILED, TIMEOUT, DRAINED; null while live.
call.ai.callerTurns
integer
call.ai.voiceSeconds
integer or null
AI voice seconds (metered as ai_voice.minutes).
call.ai.message
string or null
A message it took for the office.
call.ai.turns
array of object or null
The conversation; only for callers holding phone.recordings, on GET /phone/calls/{callId}.
One of RINGING, IN_PROGRESS, COMPLETED, MISSED, VOICEMAIL, FAILED.
fake
boolean
A simulated call (SERVFLO_VOICE=fake).
fromNumber
string
toNumber
string
otherNumber
string
The customer's side of the call.
phoneNumber
object or null
phoneNumber.id
string
phoneNumber.label
string
phoneNumber.e164
string
source
enum or null
The tracked source of the number called (PERSONAL: someone's own line); null = untracked. One of MAIN, WEBSITE, GOOGLE_BUSINESS, CAMPAIGN, QR_CODE, BUSINESS_UNIT, PRINT, OTHER, PERSONAL.
campaign
object or null
campaign.id
string
campaign.name
string
businessUnit
object or null
businessUnit.id
string
businessUnit.name
string
customer
object or null
customer.id
string
customer.name
string
matchedCustomerCount
integer
user
object or null
Who answered (inbound) or placed it (outbound).
user.id
string
user.name
string
bridgeNumber
string or null
ivrDigit
string or null
afterHours
boolean
startedAt
string (date-time)
answeredAt
string (date-time) or null
endedAt
string (date-time) or null
durationSeconds
integer or null
Talk time.
billedMinutes
integer or null
voicemail
boolean
recording
object
recording.status
enum
One of NONE, PENDING, DONE, FAILED, SKIPPED.
recording.announced
boolean
recording.durationSeconds
integer or null
recording.available
boolean
recording.deletedAt
string (date-time) or null
recording.error
string or null
transcriptStatus
enum
One of NONE, PENDING, DONE, FAILED, SKIPPED.
transcript
string or null
Only for callers holding phone.recordings, on GET /phone/calls/{callId}.
summaryStatus
enum
One of NONE, PENDING, DONE, FAILED, SKIPPED.
summary
string or null
The AI call summary (Claude, from the transcript).
summaryError
string or null
followUp
object
followUp.status
enum
One of NONE, OPEN, DONE.
followUp.assignee
object or null
followUp.assignee.id
string
followUp.assignee.name
string
followUp.doneAt
string (date-time) or null
textBack
object or null
textBack.status
string
textBack.messageId
string or null
job
object or null
job.id
string
job.identifier
string
request
object or null
request.id
string
request.identifier
string
notes
string or null
ai
object or null
Set when the call was routed to the AI receptionist.
ai.startedAt
string (date-time) or null
ai.endedAt
string (date-time) or null
ai.outcome
string or null
What the AI receptionist did: BOOKED, RESCHEDULED, REQUEST, MESSAGE, TRANSFERRED, ENDED, ABANDONED, FAILED, TIMEOUT, DRAINED; null while live.
ai.callerTurns
integer
ai.voiceSeconds
integer or null
AI voice seconds (metered as ai_voice.minutes).
ai.message
string or null
A message it took for the office.
ai.turns
array of object or null
The conversation; only for callers holding phone.recordings, on GET /phone/calls/{callId}.
Add notes, set the customer the call was with (when caller ID matched none or several), and work the missed-call follow-up: assign it, mark it DONE (or reopen it).
One of RINGING, IN_PROGRESS, COMPLETED, MISSED, VOICEMAIL, FAILED.
fake
boolean
A simulated call (SERVFLO_VOICE=fake).
fromNumber
string
toNumber
string
otherNumber
string
The customer's side of the call.
phoneNumber
object or null
phoneNumber.id
string
phoneNumber.label
string
phoneNumber.e164
string
source
enum or null
The tracked source of the number called (PERSONAL: someone's own line); null = untracked. One of MAIN, WEBSITE, GOOGLE_BUSINESS, CAMPAIGN, QR_CODE, BUSINESS_UNIT, PRINT, OTHER, PERSONAL.
campaign
object or null
campaign.id
string
campaign.name
string
businessUnit
object or null
businessUnit.id
string
businessUnit.name
string
customer
object or null
customer.id
string
customer.name
string
matchedCustomerCount
integer
user
object or null
Who answered (inbound) or placed it (outbound).
user.id
string
user.name
string
bridgeNumber
string or null
ivrDigit
string or null
afterHours
boolean
startedAt
string (date-time)
answeredAt
string (date-time) or null
endedAt
string (date-time) or null
durationSeconds
integer or null
Talk time.
billedMinutes
integer or null
voicemail
boolean
recording
object
recording.status
enum
One of NONE, PENDING, DONE, FAILED, SKIPPED.
recording.announced
boolean
recording.durationSeconds
integer or null
recording.available
boolean
recording.deletedAt
string (date-time) or null
recording.error
string or null
transcriptStatus
enum
One of NONE, PENDING, DONE, FAILED, SKIPPED.
transcript
string or null
Only for callers holding phone.recordings, on GET /phone/calls/{callId}.
summaryStatus
enum
One of NONE, PENDING, DONE, FAILED, SKIPPED.
summary
string or null
The AI call summary (Claude, from the transcript).
summaryError
string or null
followUp
object
followUp.status
enum
One of NONE, OPEN, DONE.
followUp.assignee
object or null
followUp.assignee.id
string
followUp.assignee.name
string
followUp.doneAt
string (date-time) or null
textBack
object or null
textBack.status
string
textBack.messageId
string or null
job
object or null
job.id
string
job.identifier
string
request
object or null
request.id
string
request.identifier
string
notes
string or null
ai
object or null
Set when the call was routed to the AI receptionist.
ai.startedAt
string (date-time) or null
ai.endedAt
string (date-time) or null
ai.outcome
string or null
What the AI receptionist did: BOOKED, RESCHEDULED, REQUEST, MESSAGE, TRANSFERRED, ENDED, ABANDONED, FAILED, TIMEOUT, DRAINED; null while live.
ai.callerTurns
integer
ai.voiceSeconds
integer or null
AI voice seconds (metered as ai_voice.minutes).
ai.message
string or null
A message it took for the office.
ai.turns
array of object or null
The conversation; only for callers holding phone.recordings, on GET /phone/calls/{callId}.
GET /organizations/{organizationId}/phone/calls/{callId}/context
Who is calling: every customer whose contact has the caller's number (the first is chosen, or the one staff linked), and that customer's Customer 360 summary (health, membership, last / next visit, a few lines), open jobs and balance. Book the job from here with the CSR screen, then POST …/link. Read-only.
One of RINGING, IN_PROGRESS, COMPLETED, MISSED, VOICEMAIL, FAILED.
call.fake
boolean
A simulated call (SERVFLO_VOICE=fake).
call.fromNumber
string
call.toNumber
string
call.otherNumber
string
The customer's side of the call.
call.phoneNumber
object or null
call.phoneNumber.id
string
call.phoneNumber.label
string
call.phoneNumber.e164
string
call.source
enum or null
The tracked source of the number called (PERSONAL: someone's own line); null = untracked. One of MAIN, WEBSITE, GOOGLE_BUSINESS, CAMPAIGN, QR_CODE, BUSINESS_UNIT, PRINT, OTHER, PERSONAL.
call.campaign
object or null
call.campaign.id
string
call.campaign.name
string
call.businessUnit
object or null
call.businessUnit.id
string
call.businessUnit.name
string
call.customer
object or null
call.customer.id
string
call.customer.name
string
call.matchedCustomerCount
integer
call.user
object or null
Who answered (inbound) or placed it (outbound).
call.user.id
string
call.user.name
string
call.bridgeNumber
string or null
call.ivrDigit
string or null
call.afterHours
boolean
call.startedAt
string (date-time)
call.answeredAt
string (date-time) or null
call.endedAt
string (date-time) or null
call.durationSeconds
integer or null
Talk time.
call.billedMinutes
integer or null
call.voicemail
boolean
call.recording
object
call.recording.status
enum
One of NONE, PENDING, DONE, FAILED, SKIPPED.
call.recording.announced
boolean
call.recording.durationSeconds
integer or null
call.recording.available
boolean
call.recording.deletedAt
string (date-time) or null
call.recording.error
string or null
call.transcriptStatus
enum
One of NONE, PENDING, DONE, FAILED, SKIPPED.
call.transcript
string or null
Only for callers holding phone.recordings, on GET /phone/calls/{callId}.
call.summaryStatus
enum
One of NONE, PENDING, DONE, FAILED, SKIPPED.
call.summary
string or null
The AI call summary (Claude, from the transcript).
call.summaryError
string or null
call.followUp
object
call.followUp.status
enum
One of NONE, OPEN, DONE.
call.followUp.assignee
object or null
call.followUp.doneAt
string (date-time) or null
call.textBack
object or null
call.textBack.status
string
call.textBack.messageId
string or null
call.job
object or null
call.job.id
string
call.job.identifier
string
call.request
object or null
call.request.id
string
call.request.identifier
string
call.notes
string or null
call.ai
object or null
Set when the call was routed to the AI receptionist.
call.ai.startedAt
string (date-time) or null
call.ai.endedAt
string (date-time) or null
call.ai.outcome
string or null
What the AI receptionist did: BOOKED, RESCHEDULED, REQUEST, MESSAGE, TRANSFERRED, ENDED, ABANDONED, FAILED, TIMEOUT, DRAINED; null while live.
call.ai.callerTurns
integer
call.ai.voiceSeconds
integer or null
AI voice seconds (metered as ai_voice.minutes).
call.ai.message
string or null
A message it took for the office.
call.ai.turns
array of object or null
The conversation; only for callers holding phone.recordings, on GET /phone/calls/{callId}.
One of RINGING, IN_PROGRESS, COMPLETED, MISSED, VOICEMAIL, FAILED.
fake
boolean
A simulated call (SERVFLO_VOICE=fake).
fromNumber
string
toNumber
string
otherNumber
string
The customer's side of the call.
phoneNumber
object or null
phoneNumber.id
string
phoneNumber.label
string
phoneNumber.e164
string
source
enum or null
The tracked source of the number called (PERSONAL: someone's own line); null = untracked. One of MAIN, WEBSITE, GOOGLE_BUSINESS, CAMPAIGN, QR_CODE, BUSINESS_UNIT, PRINT, OTHER, PERSONAL.
campaign
object or null
campaign.id
string
campaign.name
string
businessUnit
object or null
businessUnit.id
string
businessUnit.name
string
customer
object or null
customer.id
string
customer.name
string
matchedCustomerCount
integer
user
object or null
Who answered (inbound) or placed it (outbound).
user.id
string
user.name
string
bridgeNumber
string or null
ivrDigit
string or null
afterHours
boolean
startedAt
string (date-time)
answeredAt
string (date-time) or null
endedAt
string (date-time) or null
durationSeconds
integer or null
Talk time.
billedMinutes
integer or null
voicemail
boolean
recording
object
recording.status
enum
One of NONE, PENDING, DONE, FAILED, SKIPPED.
recording.announced
boolean
recording.durationSeconds
integer or null
recording.available
boolean
recording.deletedAt
string (date-time) or null
recording.error
string or null
transcriptStatus
enum
One of NONE, PENDING, DONE, FAILED, SKIPPED.
transcript
string or null
Only for callers holding phone.recordings, on GET /phone/calls/{callId}.
summaryStatus
enum
One of NONE, PENDING, DONE, FAILED, SKIPPED.
summary
string or null
The AI call summary (Claude, from the transcript).
summaryError
string or null
followUp
object
followUp.status
enum
One of NONE, OPEN, DONE.
followUp.assignee
object or null
followUp.assignee.id
string
followUp.assignee.name
string
followUp.doneAt
string (date-time) or null
textBack
object or null
textBack.status
string
textBack.messageId
string or null
job
object or null
job.id
string
job.identifier
string
request
object or null
request.id
string
request.identifier
string
notes
string or null
ai
object or null
Set when the call was routed to the AI receptionist.
ai.startedAt
string (date-time) or null
ai.endedAt
string (date-time) or null
ai.outcome
string or null
What the AI receptionist did: BOOKED, RESCHEDULED, REQUEST, MESSAGE, TRANSFERRED, ENDED, ABANDONED, FAILED, TIMEOUT, DRAINED; null while live.
ai.callerTurns
integer
ai.voiceSeconds
integer or null
AI voice seconds (metered as ai_voice.minutes).
ai.message
string or null
A message it took for the office.
ai.turns
array of object or null
The conversation; only for callers holding phone.recordings, on GET /phone/calls/{callId}.
One of RINGING, IN_PROGRESS, COMPLETED, MISSED, VOICEMAIL, FAILED.
fake
boolean
A simulated call (SERVFLO_VOICE=fake).
fromNumber
string
toNumber
string
otherNumber
string
The customer's side of the call.
phoneNumber
object or null
phoneNumber.id
string
phoneNumber.label
string
phoneNumber.e164
string
source
enum or null
The tracked source of the number called (PERSONAL: someone's own line); null = untracked. One of MAIN, WEBSITE, GOOGLE_BUSINESS, CAMPAIGN, QR_CODE, BUSINESS_UNIT, PRINT, OTHER, PERSONAL.
campaign
object or null
campaign.id
string
campaign.name
string
businessUnit
object or null
businessUnit.id
string
businessUnit.name
string
customer
object or null
customer.id
string
customer.name
string
matchedCustomerCount
integer
user
object or null
Who answered (inbound) or placed it (outbound).
user.id
string
user.name
string
bridgeNumber
string or null
ivrDigit
string or null
afterHours
boolean
startedAt
string (date-time)
answeredAt
string (date-time) or null
endedAt
string (date-time) or null
durationSeconds
integer or null
Talk time.
billedMinutes
integer or null
voicemail
boolean
recording
object
recording.status
enum
One of NONE, PENDING, DONE, FAILED, SKIPPED.
recording.announced
boolean
recording.durationSeconds
integer or null
recording.available
boolean
recording.deletedAt
string (date-time) or null
recording.error
string or null
transcriptStatus
enum
One of NONE, PENDING, DONE, FAILED, SKIPPED.
transcript
string or null
Only for callers holding phone.recordings, on GET /phone/calls/{callId}.
summaryStatus
enum
One of NONE, PENDING, DONE, FAILED, SKIPPED.
summary
string or null
The AI call summary (Claude, from the transcript).
summaryError
string or null
followUp
object
followUp.status
enum
One of NONE, OPEN, DONE.
followUp.assignee
object or null
followUp.assignee.id
string
followUp.assignee.name
string
followUp.doneAt
string (date-time) or null
textBack
object or null
textBack.status
string
textBack.messageId
string or null
job
object or null
job.id
string
job.identifier
string
request
object or null
request.id
string
request.identifier
string
notes
string or null
ai
object or null
Set when the call was routed to the AI receptionist.
ai.startedAt
string (date-time) or null
ai.endedAt
string (date-time) or null
ai.outcome
string or null
What the AI receptionist did: BOOKED, RESCHEDULED, REQUEST, MESSAGE, TRANSFERRED, ENDED, ABANDONED, FAILED, TIMEOUT, DRAINED; null while live.
ai.callerTurns
integer
ai.voiceSeconds
integer or null
AI voice seconds (metered as ai_voice.minutes).
ai.message
string or null
A message it took for the office.
ai.turns
array of object or null
The conversation; only for callers holding phone.recordings, on GET /phone/calls/{callId}.
POST /organizations/{organizationId}/phone/calls/{callId}/link
Record what the call led to: the job booked from the screen pop (counts as booked in the call tracking report, and closes an open follow-up) or a request.
One of RINGING, IN_PROGRESS, COMPLETED, MISSED, VOICEMAIL, FAILED.
fake
boolean
A simulated call (SERVFLO_VOICE=fake).
fromNumber
string
toNumber
string
otherNumber
string
The customer's side of the call.
phoneNumber
object or null
phoneNumber.id
string
phoneNumber.label
string
phoneNumber.e164
string
source
enum or null
The tracked source of the number called (PERSONAL: someone's own line); null = untracked. One of MAIN, WEBSITE, GOOGLE_BUSINESS, CAMPAIGN, QR_CODE, BUSINESS_UNIT, PRINT, OTHER, PERSONAL.
campaign
object or null
campaign.id
string
campaign.name
string
businessUnit
object or null
businessUnit.id
string
businessUnit.name
string
customer
object or null
customer.id
string
customer.name
string
matchedCustomerCount
integer
user
object or null
Who answered (inbound) or placed it (outbound).
user.id
string
user.name
string
bridgeNumber
string or null
ivrDigit
string or null
afterHours
boolean
startedAt
string (date-time)
answeredAt
string (date-time) or null
endedAt
string (date-time) or null
durationSeconds
integer or null
Talk time.
billedMinutes
integer or null
voicemail
boolean
recording
object
recording.status
enum
One of NONE, PENDING, DONE, FAILED, SKIPPED.
recording.announced
boolean
recording.durationSeconds
integer or null
recording.available
boolean
recording.deletedAt
string (date-time) or null
recording.error
string or null
transcriptStatus
enum
One of NONE, PENDING, DONE, FAILED, SKIPPED.
transcript
string or null
Only for callers holding phone.recordings, on GET /phone/calls/{callId}.
summaryStatus
enum
One of NONE, PENDING, DONE, FAILED, SKIPPED.
summary
string or null
The AI call summary (Claude, from the transcript).
summaryError
string or null
followUp
object
followUp.status
enum
One of NONE, OPEN, DONE.
followUp.assignee
object or null
followUp.assignee.id
string
followUp.assignee.name
string
followUp.doneAt
string (date-time) or null
textBack
object or null
textBack.status
string
textBack.messageId
string or null
job
object or null
job.id
string
job.identifier
string
request
object or null
request.id
string
request.identifier
string
notes
string or null
ai
object or null
Set when the call was routed to the AI receptionist.
ai.startedAt
string (date-time) or null
ai.endedAt
string (date-time) or null
ai.outcome
string or null
What the AI receptionist did: BOOKED, RESCHEDULED, REQUEST, MESSAGE, TRANSFERRED, ENDED, ABANDONED, FAILED, TIMEOUT, DRAINED; null while live.
ai.callerTurns
integer
ai.voiceSeconds
integer or null
AI voice seconds (metered as ai_voice.minutes).
ai.message
string or null
A message it took for the office.
ai.turns
array of object or null
The conversation; only for callers holding phone.recordings, on GET /phone/calls/{callId}.
One of RINGING, IN_PROGRESS, COMPLETED, MISSED, VOICEMAIL, FAILED.
fake
boolean
A simulated call (SERVFLO_VOICE=fake).
fromNumber
string
toNumber
string
otherNumber
string
The customer's side of the call.
phoneNumber
object or null
phoneNumber.id
string
phoneNumber.label
string
phoneNumber.e164
string
source
enum or null
The tracked source of the number called (PERSONAL: someone's own line); null = untracked. One of MAIN, WEBSITE, GOOGLE_BUSINESS, CAMPAIGN, QR_CODE, BUSINESS_UNIT, PRINT, OTHER, PERSONAL.
campaign
object or null
campaign.id
string
campaign.name
string
businessUnit
object or null
businessUnit.id
string
businessUnit.name
string
customer
object or null
customer.id
string
customer.name
string
matchedCustomerCount
integer
user
object or null
Who answered (inbound) or placed it (outbound).
user.id
string
user.name
string
bridgeNumber
string or null
ivrDigit
string or null
afterHours
boolean
startedAt
string (date-time)
answeredAt
string (date-time) or null
endedAt
string (date-time) or null
durationSeconds
integer or null
Talk time.
billedMinutes
integer or null
voicemail
boolean
recording
object
recording.status
enum
One of NONE, PENDING, DONE, FAILED, SKIPPED.
recording.announced
boolean
recording.durationSeconds
integer or null
recording.available
boolean
recording.deletedAt
string (date-time) or null
recording.error
string or null
transcriptStatus
enum
One of NONE, PENDING, DONE, FAILED, SKIPPED.
transcript
string or null
Only for callers holding phone.recordings, on GET /phone/calls/{callId}.
summaryStatus
enum
One of NONE, PENDING, DONE, FAILED, SKIPPED.
summary
string or null
The AI call summary (Claude, from the transcript).
summaryError
string or null
followUp
object
followUp.status
enum
One of NONE, OPEN, DONE.
followUp.assignee
object or null
followUp.assignee.id
string
followUp.assignee.name
string
followUp.doneAt
string (date-time) or null
textBack
object or null
textBack.status
string
textBack.messageId
string or null
job
object or null
job.id
string
job.identifier
string
request
object or null
request.id
string
request.identifier
string
notes
string or null
ai
object or null
Set when the call was routed to the AI receptionist.
ai.startedAt
string (date-time) or null
ai.endedAt
string (date-time) or null
ai.outcome
string or null
What the AI receptionist did: BOOKED, RESCHEDULED, REQUEST, MESSAGE, TRANSFERRED, ENDED, ABANDONED, FAILED, TIMEOUT, DRAINED; null while live.
ai.callerTurns
integer
ai.voiceSeconds
integer or null
AI voice seconds (metered as ai_voice.minutes).
ai.message
string or null
A message it took for the office.
ai.turns
array of object or null
The conversation; only for callers holding phone.recordings, on GET /phone/calls/{callId}.
One of RINGING, IN_PROGRESS, COMPLETED, MISSED, VOICEMAIL, FAILED.
fake
boolean
A simulated call (SERVFLO_VOICE=fake).
fromNumber
string
toNumber
string
otherNumber
string
The customer's side of the call.
phoneNumber
object or null
phoneNumber.id
string
phoneNumber.label
string
phoneNumber.e164
string
source
enum or null
The tracked source of the number called (PERSONAL: someone's own line); null = untracked. One of MAIN, WEBSITE, GOOGLE_BUSINESS, CAMPAIGN, QR_CODE, BUSINESS_UNIT, PRINT, OTHER, PERSONAL.
campaign
object or null
campaign.id
string
campaign.name
string
businessUnit
object or null
businessUnit.id
string
businessUnit.name
string
customer
object or null
customer.id
string
customer.name
string
matchedCustomerCount
integer
user
object or null
Who answered (inbound) or placed it (outbound).
user.id
string
user.name
string
bridgeNumber
string or null
ivrDigit
string or null
afterHours
boolean
startedAt
string (date-time)
answeredAt
string (date-time) or null
endedAt
string (date-time) or null
durationSeconds
integer or null
Talk time.
billedMinutes
integer or null
voicemail
boolean
recording
object
recording.status
enum
One of NONE, PENDING, DONE, FAILED, SKIPPED.
recording.announced
boolean
recording.durationSeconds
integer or null
recording.available
boolean
recording.deletedAt
string (date-time) or null
recording.error
string or null
transcriptStatus
enum
One of NONE, PENDING, DONE, FAILED, SKIPPED.
transcript
string or null
Only for callers holding phone.recordings, on GET /phone/calls/{callId}.
summaryStatus
enum
One of NONE, PENDING, DONE, FAILED, SKIPPED.
summary
string or null
The AI call summary (Claude, from the transcript).
summaryError
string or null
followUp
object
followUp.status
enum
One of NONE, OPEN, DONE.
followUp.assignee
object or null
followUp.assignee.id
string
followUp.assignee.name
string
followUp.doneAt
string (date-time) or null
textBack
object or null
textBack.status
string
textBack.messageId
string or null
job
object or null
job.id
string
job.identifier
string
request
object or null
request.id
string
request.identifier
string
notes
string or null
ai
object or null
Set when the call was routed to the AI receptionist.
ai.startedAt
string (date-time) or null
ai.endedAt
string (date-time) or null
ai.outcome
string or null
What the AI receptionist did: BOOKED, RESCHEDULED, REQUEST, MESSAGE, TRANSFERRED, ENDED, ABANDONED, FAILED, TIMEOUT, DRAINED; null while live.
ai.callerTurns
integer
ai.voiceSeconds
integer or null
AI voice seconds (metered as ai_voice.minutes).
ai.message
string or null
A message it took for the office.
ai.turns
array of object or null
The conversation; only for callers holding phone.recordings, on GET /phone/calls/{callId}.