Upload Call Analysis
POST/v1/open-api/call-history/:uuid/analysis
Attach an analysis (transcript, speakers, scores, insights, recommendations)
produced by an external analysis service to the call record identified by uuid.
The whole payload is validated synchronously — a malformed request never reaches
the queue and the caller gets 400 immediately. Persisting is asynchronous: the
response carries a requestId, poll GET /v1/open-api/request/{requestId} for the
outcome. Because the call record is resolved by the worker, an unknown uuid is
reported as a FAILED request status, not as a 404 here.
Every field of the body is optional except insights[].summary. Sending the endpoint
again for the same uuid replaces the previously stored analysis.
List order is preserved — do not send an orderIndex, the platform assigns it
from the order the items arrive in.
Requires grant PERMISSION_OPEN_API_CALL:SAVE.
Request
Responses
- 200
- 400
- 401
- 403
- 429
Analysis accepted and enqueued. Poll requestId for the result.
Validation error (400). Field-level failures are listed in errors[] and error is
null; a malformed / unparsable JSON body is the inverse — error.messageCode is
3705 and errors[] is empty.
Invalid, revoked or expired token (401) — also returned when the connection was
revoked or the company is blocked.
Produced by the authentication filter, so the body is a reduced envelope: no
error, no requestId, and errors is null rather than []. Every cause yields the
same fixed English message.
The token lacks the required permission:scope grant (403).
Rate limit of 60 requests/minute exceeded (429). Like 401, this comes from the
authentication filter: reduced envelope, fixed English message, no error object and no
Retry-After header.