Save the call's outcome, once
const url = 'https://api.vocapable.com/v1/workspace/calls/example/wrap-up';const options = { method: 'POST', headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'}, body: '{"expected_revision":1,"outcome":"conversation","notes":"example","next_step":"example","callback_at":"2026-04-15T12:00:00Z","next_task_owner_user_id":"example","next_task_due_at":"2026-04-15T12:00:00Z","links":{"task_id":"example","opportunity_id":"example","case_id":"example","callback_id":"example","voicemail_id":"example"},"deal":{"expected_revision":1,"stage":"new","lost_reason":"example","deferred_until":"2026-04-15T12:00:00Z","accepted_scope":"example","scope_accepted":true,"reason":"example","handoff":{"recipient_user_id":"example","fallback_user_id":"example","target_start":"2026-04-15T12:00:00Z","first_milestone":"example","respond_by":"2026-04-15T12:00:00Z","prerequisites":["example"]}},"tags":["quote_requested"]}'};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request POST \ --url https://api.vocapable.com/v1/workspace/calls/example/wrap-up \ --header 'Authorization: Bearer <token>' \ --header 'Content-Type: application/json' \ --data '{ "expected_revision": 1, "outcome": "conversation", "notes": "example", "next_step": "example", "callback_at": "2026-04-15T12:00:00Z", "next_task_owner_user_id": "example", "next_task_due_at": "2026-04-15T12:00:00Z", "links": { "task_id": "example", "opportunity_id": "example", "case_id": "example", "callback_id": "example", "voicemail_id": "example" }, "deal": { "expected_revision": 1, "stage": "new", "lost_reason": "example", "deferred_until": "2026-04-15T12:00:00Z", "accepted_scope": "example", "scope_accepted": true, "reason": "example", "handoff": { "recipient_user_id": "example", "fallback_user_id": "example", "target_start": "2026-04-15T12:00:00Z", "first_milestone": "example", "respond_by": "2026-04-15T12:00:00Z", "prerequisites": [ "example" ] } }, "tags": [ "quote_requested" ] }'One save updates the call, the customer’s story, the next task, the opportunity’s next step and - for a stop request - the company’s suppression, together. A repeat of the same save returns the saved call; a different one after it is refused.
The work the call carries (linkage) is settled in the same transaction: the linked
task completed and the requested callback closed when the customer was reached, the
linked case given the outcome as an internal comment, and the linked deal moved only
through the pipeline’s lifecycle rules (a refusal there refuses the whole save). The
handler’s private in-call notes are discarded: they became this outcome.
Authorizations
Section titled “Authorizations”Parameters
Section titled “Parameters”Path Parameters
Section titled “Path Parameters”Request Bodyrequired
Section titled “Request Bodyrequired”object
The confirmed linkage of a wrap-up. Every field is the final value (null = none).
Move the linked deal as part of the wrap-up (PRD E10-R4). The pipeline’s own lifecycle rules apply unchanged: won needs accepted scope and a delivery plan, lost a reason, deferred a future return date. A refusal refuses the whole wrap-up, so the outcome is never saved with a deal change that did not happen.
object
Who delivers a sale and how it starts (J2). Sent with the change that records it.
Responses
Section titled “Responses”Successful Response
object
A teammate named on a record: the id the server holds and the name to show.
object
object
A teammate named on a record: the id the server holds and the name to show.
object
A teammate named on a record: the id the server holds and the name to show.
object
A number the owner allow-listed for external transfers and three-way calls (E5-R3).
object
The work a call was placed from, carried to its wrap-up (PRD E10-R1/R2).
Each link is null when there is none, and also when the record has since been deleted or is no longer one the handler may see.
object
One piece of work a call is linked to, as the handler may see it.
object
One piece of work a call is linked to, as the handler may see it.
object
One piece of work a call is linked to, as the handler may see it.
object
One piece of work a call is linked to, as the handler may see it.
object
One piece of work a call is linked to, as the handler may see it.
object
One piece of work a call is linked to, as the handler may see it.
object
The business line a call came from (E12-R1): the company’s own number, named.
object
An extra leg of a live call (E5-R4 three-way, E5-R7 the handler’s own phone).
object
A teammate named on a record: the id the server holds and the name to show.
object
What a person is told about a call’s transcript (PRD E7-R6, E6-R8).
label is the exact sentence the clients show (“Transcribing”, “Not recorded - made
from a personal phone”, …) so the web console and the app use the same words.
object
The persistent recording indicator and its controls (Apple 2.5.14).
object
A UI hint about the far party’s location; NEVER suppresses the announcement.
A manager or owner listening to, whispering to or joined to a live call.
Shown to the REP on their own call (notice: “Priya is listening”) - supervision is
never silent. ringing = the supervisor’s leg is connecting; joined = the carrier
confirmed it is in the call.
object
A teammate named on a record: the id the server holds and the name to show.
object
How an inbound caller reached the person who answered (PRD E3-R2, E3-R11).
queue: they answered the caller from the shared-phone queue (app, browser or
verified phone) - ticket_id is the queue’s record of the caller. ai_handoff:
they took the AI receptionist’s direct handoff - handoff_request_id is the live
handoff (its brief is /call-handoffs/{id}/brief). ai_call_id is the AI
receptionist’s call the caller had first, when there was one.
A due scheduled callback the server rang the person’s app for (PRD E2-R7).
label is what the ring shows once the app has read the call (“Callback: Dana,
Lakeside”); the VoIP push itself carries identifiers only. The customer is dialled only
after the person answers that ring.
object
Example
{ "direction": "outbound", "phase": "requested", "recording": "off", "outcome": "conversation", "transfer": { "state": "requested", "kind": "warm", "destination": { "payment_line": false } }, "channel": "app", "participants": [ { "kind": "teammate", "state": "requested" } ], "transcription": { "status": "off", "untranscribed_reason": "personal_phone", "label": "Not transcribed" }, "wrap_up_provenance": { "additionalProperty": "ai_drafted" }, "recording_status": { "state": "off", "line_mode": "off", "consent_hint": { "kind": "all_party_state" }, "refusal_source": "rep" }, "supervision": { "mode": "listen", "channel": "app", "state": "requested" }, "answered_from": { "kind": "queue" }}Validation Error
object
object
object
Examplegenerated
{ "detail": [ { "loc": [ "example" ], "msg": "example", "type": "example", "input": "example", "ctx": {} } ]}