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

# Get a recording link

> A fresh link to the call recording.

The link is valid for about an hour; call this again whenever you need a
new one. Returns `404` until a recording exists, which is shortly after the
call ends.



## OpenAPI

````yaml api-reference/openapi.json GET /v1/calls/{call_id}/recording
openapi: 3.1.0
info:
  description: >-
    Programmatic access to Contour from your own backend: place outbound calls,
    read their results, and manage the webhook endpoints that receive signed
    `call.started`, `call.ended` and `call.analyzed` events.
  title: Contour API
  version: '1.0'
servers:
  - url: https://api.contourvoice.com
security:
  - HTTPBearer: []
tags:
  - description: Place outbound calls and read their state and recordings.
    name: Calls
  - description: >-
      Register URLs to receive signed events, send test events, and inspect or
      retry deliveries.
    name: Webhook Endpoints
paths:
  /v1/calls/{call_id}/recording:
    get:
      tags:
        - Calls
      summary: Get a recording link
      description: >-
        A fresh link to the call recording.


        The link is valid for about an hour; call this again whenever you need a

        new one. Returns `404` until a recording exists, which is shortly after
        the

        call ends.
      operationId: get_call_recording
      parameters:
        - in: path
          name: call_id
          required: true
          schema:
            title: Call Id
            type: string
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RecordingResponse'
          description: Successful Response
        '401':
          content:
            application/json:
              example:
                detail: Invalid or expired API key
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          description: Missing or invalid API key.
        '404':
          content:
            application/json:
              example:
                detail: No recording is available for this call.
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          description: No call with this id, or no recording exists for it yet.
        '422':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
          description: Validation Error
      security:
        - HTTPBearer: []
components:
  schemas:
    RecordingResponse:
      examples:
        - expires_at: '2026-09-10T15:04:35Z'
          url: >-
            https://storage.googleapis.com/.../recording.mp3?X-Goog-Signature=...
      properties:
        expires_at:
          description: When `url` stops working.
          format: date-time
          title: Expires At
          type: string
        url:
          description: >-
            A fresh presigned link to the recording. Fetch it promptly; it
            expires after about an hour.
          title: Url
          type: string
      required:
        - url
        - expires_at
      title: RecordingResponse
      type: object
    ErrorResponse:
      description: |-
        Every error is wrapped in a `detail` key. Validation and dispatch
        failures carry an object; auth and not-found errors carry a string.
      properties:
        detail:
          anyOf:
            - $ref: '#/components/schemas/ErrorDetail'
            - type: string
          description: An `ErrorDetail` object, or a plain message.
          title: Detail
      required:
        - detail
      title: ErrorResponse
      type: object
    HTTPValidationError:
      properties:
        detail:
          items:
            $ref: '#/components/schemas/ValidationError'
          title: Detail
          type: array
      title: HTTPValidationError
      type: object
    ErrorDetail:
      description: |-
        Structured error body for validation and dispatch failures on
        `POST /v1/calls`.
      properties:
        call_id:
          anyOf:
            - type: string
            - type: 'null'
          description: >-
            With dispatch failures: the id of the call record that was created
            and marked `failed`.
          title: Call Id
        error:
          description: Human-readable explanation.
          title: Error
          type: string
        error_code:
          description: >-
            Machine-readable code: `agent_not_found`, `agent_not_outbound`,
            `agent_inactive`, `missing_variables`, `from_number_mismatch`,
            `dnc_blocked`, `number_blocked`, `dispatch_error`,
            `dispatch_failed`.
          title: Error Code
          type: string
        expected_from_number:
          anyOf:
            - type: string
            - type: 'null'
          description: 'With `from_number_mismatch`: the caller ID to send.'
          title: Expected From Number
        missing_variables:
          anyOf:
            - items:
                type: string
              type: array
            - type: 'null'
          description: 'With `missing_variables`: the variable keys to add.'
          title: Missing Variables
      required:
        - error
        - error_code
      title: ErrorDetail
      type: object
    ValidationError:
      properties:
        ctx:
          title: Context
          type: object
        input:
          title: Input
        loc:
          items:
            anyOf:
              - type: string
              - type: integer
          title: Location
          type: array
        msg:
          title: Message
          type: string
        type:
          title: Error Type
          type: string
      required:
        - loc
        - msg
        - type
      title: ValidationError
      type: object
  securitySchemes:
    HTTPBearer:
      description: >-
        Your organization's API key (`sk_cont_...`), sent as `Authorization:
        Bearer sk_cont_...`. Keep it server-side.
      scheme: bearer
      type: http

````