> ## Documentation Index
> Fetch the complete documentation index at: https://docs.tracklysms.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Stop Recording

> Stop recording a call.

Stops an in-progress recording. The call's `recordingState` moves to `stopped`; the finished audio is retrievable once the provider finalizes it.

Requires the `voice_calls.write` scope and the **Voice Calls** product entitlement.

## Path Parameters

<ParamField path="callId" type="string" required>
  The id of the call whose recording should stop.
</ParamField>

## Response Fields

<ResponseField name="call" type="object">
  The updated call.

  <Expandable title="Call properties" defaultOpen>
    <ResponseField name="call.id" type="string">The call's unique identifier.</ResponseField>
    <ResponseField name="call.direction" type="string">`inbound` or `outbound`.</ResponseField>
    <ResponseField name="call.state" type="string">Lifecycle state. See [Call states](/api-reference/voice/overview#call-states).</ResponseField>
    <ResponseField name="call.legKind" type="string">`primary`, `bridge`, or `monitor`.</ResponseField>
    <ResponseField name="call.from" type="string">The calling number.</ResponseField>
    <ResponseField name="call.to" type="string">The destination number.</ResponseField>
    <ResponseField name="call.connectTo" type="string | null">The resolved bridge target, if any.</ResponseField>
    <ResponseField name="call.queueId" type="string | null">The queue this call is parked in, if any.</ResponseField>
    <ResponseField name="call.conferenceId" type="string | null">The provider conference id once a bridge or monitor leg is attached.</ResponseField>
    <ResponseField name="call.parentCallId" type="string | null">For a bridge/monitor leg, the primary call it belongs to.</ResponseField>
    <ResponseField name="call.bridgedCallId" type="string | null">For a primary call, the currently bridged agent leg.</ResponseField>
    <ResponseField name="call.monitorRole" type="string | null">`MONITOR` or `ADVISOR` for a monitor leg.</ResponseField>
    <ResponseField name="call.record" type="boolean">Whether recording was requested.</ResponseField>
    <ResponseField name="call.recordingState" type="string | null">`stopped` after this call. Transitions to `ready` once the audio is finalized.</ResponseField>
    <ResponseField name="call.recordingFileIds" type="array">Provider file ids for completed recordings.</ResponseField>
    <ResponseField name="call.customData" type="object">Metadata carried on the call object.</ResponseField>
    <ResponseField name="call.error" type="string | null">A machine-readable reason when the call failed.</ResponseField>
    <ResponseField name="call.startedAt" type="string | null">ISO 8601 timestamp when the call was placed.</ResponseField>
    <ResponseField name="call.answeredAt" type="string | null">ISO 8601 timestamp when the call was answered.</ResponseField>
    <ResponseField name="call.endedAt" type="string | null">ISO 8601 timestamp when the call ended.</ResponseField>
    <ResponseField name="call.createdAt" type="string | null">ISO 8601 timestamp when the record was created.</ResponseField>
  </Expandable>
</ResponseField>

## Examples

<RequestExample>
  ```bash cURL theme={null}
  curl -X POST https://api.tracklysms.com/api/v1/voice/calls/665f1e2a9c4b1a0012ab34cd/recording/stop \
    -H "X-Api-Key: trk_your_api_key_here"
  ```
</RequestExample>

<ResponseExample>
  ```json 200 OK theme={null}
  {
    "call": {
      "id": "665f1e2a9c4b1a0012ab34cd",
      "direction": "outbound",
      "state": "established",
      "legKind": "primary",
      "from": "+18005551234",
      "to": "+14155551234",
      "connectTo": "+14155559876",
      "queueId": null,
      "conferenceId": "665f1e2a9c4b1a0012abc0de",
      "parentCallId": null,
      "bridgedCallId": "665f1e2a9c4b1a0012ab77aa",
      "monitorRole": null,
      "record": true,
      "recordingState": "stopped",
      "recordingFileIds": [],
      "customData": { "caseId": "abc-123" },
      "error": null,
      "startedAt": "2026-08-21T18:00:00.000000Z",
      "answeredAt": "2026-08-21T18:00:12.000000Z",
      "endedAt": null,
      "createdAt": "2026-08-21T18:00:00.000000Z"
    }
  }
  ```
</ResponseExample>

## Error Codes

| Status | Code                 | Meaning                                               |
| ------ | -------------------- | ----------------------------------------------------- |
| 403    | `voice_not_entitled` | Voice calling is not enabled for your account.        |
| 404    | `call_not_found`     | No call with that id exists on your account.          |
| 409    | `call_not_ready`     | The call has not yet been accepted by the provider.   |
| 502    | `provider_error`     | The upstream telephony provider rejected the request. |
