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

# Get Call

> Returns one call in full, including its transcript. Accepts the call_id or the notification_id.



## OpenAPI

````yaml api-reference/openapi-generated.json GET /v1/calls/{call_id}
openapi: 3.0.3
info:
  title: Periskope API
  version: 1.0.0
  description: >-
    Periskope external API.


    Responses use a flat, unwrapped shape: most endpoints return the resource at
    the top level, and list endpoints return a wrapper object with pagination
    inline (e.g. `{ from, to, count, chats: [...] }`). The documented response
    schemas describe these shapes directly.
servers:
  - url: https://api.periskope.app
security:
  - bearerAuth: []
paths:
  /v1/calls/{call_id}:
    get:
      tags:
        - Calls
      summary: Get a call
      description: >-
        Returns one call in full, including its transcript. Accepts the call_id
        or the notification_id.
      operationId: getCall
      parameters:
        - schema:
            type: string
            minLength: 1
            description: >-
              The call's call_id, or its notification_id from the notifications
              list or a chat.notification.created webhook event.
            example: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
          required: true
          description: >-
            The call's call_id, or its notification_id from the notifications
            list or a chat.notification.created webhook event.
          name: call_id
          in: path
        - schema:
            type: string
            example: '919876543210'
            description: >-
              Optional. Scope results to a single phone: country code + number
              without symbols or spaces (e.g. 911111111111), or a phone_id
              (phone-xxxxxxxxxxxx). Omit to return data across all phones the
              API token can access.
          required: false
          description: >-
            Optional. Scope results to a single phone: country code + number
            without symbols or spaces (e.g. 911111111111), or a phone_id
            (phone-xxxxxxxxxxxx). Omit to return data across all phones the API
            token can access.
          name: x-phone
          in: header
      responses:
        '200':
          description: The call in full, with its transcript
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Call'
              examples:
                default:
                  summary: Response body
                  value:
                    call_id: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
                    notification_id: >-
                      false_919999999999@c.us_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA_919999999999@c.us
                    org_id: 00000000-0000-0000-0000-000000000000
                    org_phone: 911111111111@c.us
                    chat_id: 919999999999@c.us
                    chat_name: John Doe
                    caller: 919999999999@c.us
                    direction: incoming
                    result: connected
                    handled_via: periskope
                    timestamp: '2026-01-15T09:30:00.000Z'
                    duration_seconds: 184
                    answered_by: agent@example.com
                    transcript:
                      status: done
                      utterances:
                        - start_seconds: 12.4
                          speaker: John Doe
                          text: Hi, I wanted to check on my order.
                    summary:
                      text: >-
                        The customer asked about a delayed order. The agent
                        confirmed it ships tomorrow and shared the tracking
                        link.
                    answered_by_name: Asha Rao
                    started_at: '2026-01-15T09:30:00.000Z'
                    answered_at: '2026-01-15T09:30:05.000Z'
                    ended_at: '2026-01-15T09:33:09.000Z'
                    end_reason: remote_end
                    participants:
                      - email: agent@example.com
                        name: Asha Rao
                        role: host
                    recording:
                      url: >-
                        https://api.periskope.app/app/media/periskope-call-attachments/00000000-0000-0000-0000-000000000000/phone-aaaaaaaaaaaaaaaa/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.wav?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
                      url_expires_at: '2026-01-15T10:30:00.000Z'
                      duration_seconds: 184
                      channels:
                        left: customer
                        right: agents
                      agent_tracks:
                        - email: agent@example.com
                          name: Asha Rao
                          url: >-
                            https://api.periskope.app/app/media/periskope-call-attachments/00000000-0000-0000-0000-000000000000/phone-aaaaaaaaaaaaaaaa/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.agent-0.wav?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
                      recorded_at: '2026-01-15T09:33:10.000Z'
                      truncated: false
        '401':
          description: Invalid, expired or missing API token
          content:
            application/json:
              examples:
                error:
                  summary: Invalid, expired or missing API token
                  value:
                    code: UNAUTHORIZED_ERROR
                    message: Invalid bearer auth token
                    status: 401
              schema:
                type: object
                properties:
                  code:
                    type: string
                    example: UNAUTHORIZED_ERROR
                  message:
                    type: string
                    example: Invalid bearer auth token
                  status:
                    type: integer
                    example: 401
                example:
                  code: UNAUTHORIZED_ERROR
                  message: Invalid bearer auth token
                  status: 401
        '404':
          description: No call matches call_id
          content:
            application/json:
              examples:
                error:
                  summary: No call matches call_id
                  value:
                    code: NOT_FOUND_ERROR
                    message: No call matches call_id
                    status: 404
              schema:
                type: object
                properties:
                  code:
                    type: string
                    example: NOT_FOUND_ERROR
                  message:
                    type: string
                    example: No call matches call_id
                  status:
                    type: integer
                    example: 404
                example:
                  code: NOT_FOUND_ERROR
                  message: No call matches call_id
                  status: 404
        '422':
          description: Request validation failed
          content:
            application/json:
              examples:
                error:
                  summary: Request validation failed
                  value:
                    code: VALIDATION_ERROR
                    message: Request validation failed
                    status: 422
                    fields:
                      body.chat_id:
                        message: chat_id is required
              schema:
                type: object
                properties:
                  code:
                    type: string
                    example: VALIDATION_ERROR
                  message:
                    type: string
                    example: Request validation failed
                  status:
                    type: integer
                    example: 422
                  fields:
                    type: object
                    additionalProperties:
                      type: object
                      properties:
                        message:
                          type: string
                        value: {}
                    example:
                      body.chat_id:
                        message: chat_id is required
                example:
                  code: VALIDATION_ERROR
                  message: Request validation failed
                  status: 422
                  fields:
                    body.chat_id:
                      message: chat_id is required
        '429':
          description: Rate limit exceeded
          content:
            application/json:
              examples:
                error:
                  summary: Rate limit exceeded
                  value:
                    code: RATE_LIMIT_ERROR
                    message: You can only make 100 requests per second
                    status: 429
              schema:
                type: object
                properties:
                  code:
                    type: string
                    example: RATE_LIMIT_ERROR
                  message:
                    type: string
                    example: You can only make 100 requests per second
                  status:
                    type: integer
                    example: 429
                example:
                  code: RATE_LIMIT_ERROR
                  message: You can only make 100 requests per second
                  status: 429
        '500':
          description: Internal server error
          content:
            application/json:
              examples:
                error:
                  summary: Internal server error
                  value:
                    code: UNKNOWN_ERROR
                    message: Internal server error
                    status: 500
              schema:
                type: object
                properties:
                  code:
                    type: string
                    example: UNKNOWN_ERROR
                  message:
                    type: string
                    example: Internal server error
                  status:
                    type: integer
                    example: 500
                example:
                  code: UNKNOWN_ERROR
                  message: Internal server error
                  status: 500
      security:
        - bearerAuth: []
      x-codeSamples:
        - lang: typescript
          label: TypeScript
          source: |-
            import { PeriskopeApi } from '@periskope/periskope-client';

            const client = new PeriskopeApi({
              authToken: 'YOUR_API_KEY',
              phone: '919876543210', // the phone to act with (x-phone)
            });

            async function main() {
              const response = await client.calls.getCall({
                call_id: 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA',
              });
              console.log(response);
            }

            main();
        - lang: bash
          label: cURL
          source: >-
            curl -X GET
            'https://api.periskope.app/v1/calls/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'
            \
              -H 'Authorization: Bearer YOUR_API_KEY' \
              -H 'x-phone: 919876543210'
components:
  schemas:
    Call:
      type: object
      properties:
        call_id:
          type: string
          description: >-
            WhatsApp's id for the call. Pass it to Get a call. Also the
            unique_id of the call's notification row.
          example: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
        notification_id:
          type: string
          description: >-
            Id of the call's row in the notifications list (type "call") and in
            chat.notification.created webhook events. Get a call also accepts it
            in place of call_id.
          example: >-
            false_919999999999@c.us_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA_919999999999@c.us
        org_id:
          type: string
          format: uuid
          description: Id of the organization the call belongs to.
          example: 00000000-0000-0000-0000-000000000000
        org_phone:
          type: string
          description: >-
            Org phone (WhatsApp account) that made or received the call, as
            country code + number suffixed with @c.us.
          example: 911111111111@c.us
        chat_id:
          type: string
          description: >-
            Chat the call belongs to: the other party for a 1-1 call, the group
            for a group call. A caller WhatsApp could not resolve to a number
            appears as an id ending in @lid.
          example: 919999999999@c.us
        chat_name:
          type: string
          description: >-
            Name of the chat, or the contact's saved name when the chat has
            none. Absent for unknown numbers.
          example: John Doe
        caller:
          type: string
          description: >-
            Who placed the call (<countrycode><number>@c.us): the org phone for
            outgoing calls, the customer for incoming ones.
          example: 919999999999@c.us
        direction:
          type: string
          enum:
            - incoming
            - outgoing
          description: '''incoming'' or ''outgoing'', from the org phone''s point of view.'
          example: incoming
        result:
          type: string
          description: >-
            How the call ended, as reported by WhatsApp. One of: connected,
            missed, rejected, unavailable, cancelled, acceptedelsewhere,
            invalid, upcoming, failed, abandoned, ongoing. Absent for very old
            calls.
          example: connected
        handled_via:
          type: string
          enum:
            - periskope
            - phone
          description: >-
            'periskope' when the call's audio ran through Periskope (answered or
            placed by a member in the app); 'phone' otherwise — answered, placed
            or missed on the WhatsApp phone itself. Only Periskope calls have a
            recording, transcript and summary.
          example: periskope
        timestamp:
          type: string
          description: >-
            When the call was logged, as an ISO 8601 UTC timestamp — the call
            start for most calls. Calls are sorted by this field.
          example: '2026-01-15T09:30:00.000Z'
        duration_seconds:
          type: number
          description: >-
            Talk time in seconds (0 for unanswered calls), when known — from
            WhatsApp, or the recording length otherwise.
          example: 184
        answered_by:
          type: string
          description: >-
            Email of the member who answered (incoming) or placed (outgoing) the
            call in Periskope.
          example: agent@example.com
        transcript:
          $ref: '#/components/schemas/CallTranscript'
        summary:
          type: object
          properties:
            text:
              type: string
              description: Two to three sentence summary of the conversation.
              example: >-
                The customer asked about a delayed order. The agent confirmed it
                ships tomorrow and shared the tracking link.
          description: >-
            AI summary of the call, generated after transcription. Absent until
            then, or when summarizing failed.
        answered_by_name:
          type: string
          description: >-
            Display name of the member in answered_by, when set. Returned by Get
            a call only.
          example: Asha Rao
        started_at:
          type: string
          description: >-
            When the call started, as an ISO 8601 UTC timestamp — WhatsApp's own
            start time when reported, else timestamp. Returned by Get a call
            only.
          example: '2026-01-15T09:30:00.000Z'
        answered_at:
          type: string
          description: >-
            When the call was answered, as an ISO 8601 UTC timestamp. Absent for
            unanswered calls and calls WhatsApp did not time. Returned by Get a
            call only.
          example: '2026-01-15T09:30:05.000Z'
        ended_at:
          type: string
          description: >-
            When the call ended, as an ISO 8601 UTC timestamp, when known.
            Returned by Get a call only.
          example: '2026-01-15T09:33:09.000Z'
        end_reason:
          type: string
          description: >-
            Why the call ended, for calls handled in Periskope: 'local_hangup'
            (a member hung up), 'remote_end' (the customer hung up),
            'disconnect', 'ended', or 'join_failed: <reason>'. Absent for calls
            handled on the phone. Returned by Get a call only.
          example: remote_end
        participants:
          type: array
          items:
            type: object
            properties:
              email:
                type: string
                description: Email of the member.
                example: agent@example.com
              name:
                type: string
                description: The member's display name, when set.
                example: Asha Rao
              role:
                type: string
                description: >-
                  'host' for the member who answered or placed the call,
                  'joined' for members who joined it later.
                example: host
          description: >-
            Periskope members on the call, in the order they joined. Present for
            recorded calls. Returned by Get a call only.
        recording:
          $ref: '#/components/schemas/CallRecording'
      description: >-
        A WhatsApp call on one of the organization's phones: who called whom,
        how it ended and, for calls handled in Periskope, its recording,
        participants, transcript and summary.
    CallTranscript:
      type: object
      properties:
        status:
          type: string
          description: >-
            Transcription progress: 'pending' (queued or running), 'done' or
            'failed'. Transcription starts once the recording is saved and
            usually finishes within a few minutes of the call ending.
          example: done
        utterances:
          type: array
          items:
            $ref: '#/components/schemas/CallUtterance'
          description: The transcript, line by line in spoken order, once status is done.
      description: >-
        Transcription status and, once done, the transcript line by line. Absent
        when the call was not recorded.
    CallRecording:
      type: object
      properties:
        url:
          type: string
          description: >-
            Downloadable link to the call recording, a stereo WAV file. When the
            organization's media privacy is on, the link carries an access
            token, opens without other credentials and stops working 1 hour
            after the response (url_expires_at); fetch the call again for a
            fresh link. When media privacy is off, it is a plain link that opens
            without credentials and does not expire.
          example: >-
            https://api.periskope.app/app/media/periskope-call-attachments/00000000-0000-0000-0000-000000000000/phone-aaaaaaaaaaaaaaaa/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.wav?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
        url_expires_at:
          type: string
          description: >-
            When url (and every agent_tracks url) stops working, as an ISO 8601
            UTC timestamp: 1 hour after the response. Present only when the
            organization's media privacy is on; without it the links do not
            expire.
          example: '2026-01-15T10:30:00.000Z'
        duration_seconds:
          type: integer
          description: Length of the recording in seconds.
          example: 184
        channels:
          type: object
          properties:
            left:
              type: string
            right:
              type: string
          description: >-
            What each stereo channel carries: left is the customer, right is
            every Periskope member on the call mixed together.
          example:
            left: customer
            right: agents
        agent_tracks:
          type: array
          items:
            type: object
            properties:
              email:
                type: string
                description: Email of the member this track belongs to.
                example: agent@example.com
              name:
                type: string
                description: The member's display name, when set.
                example: Asha Rao
              url:
                type: string
                description: >-
                  Downloadable link to this member's own audio, a mono WAV
                  aligned to the stereo recording. When the organization's media
                  privacy is on, the link carries an access token, opens without
                  other credentials and stops working 1 hour after the response
                  (url_expires_at); fetch the call again for a fresh link. When
                  media privacy is off, it is a plain link that opens without
                  credentials and does not expire.
                example: >-
                  https://api.periskope.app/app/media/periskope-call-attachments/00000000-0000-0000-0000-000000000000/phone-aaaaaaaaaaaaaaaa/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.agent-0.wav?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
          description: >-
            One separate recording per member who joined the call, when they
            were captured. Absent for calls recorded before per-member tracks
            existed.
        recorded_at:
          type: string
          description: When the recording was saved, as an ISO 8601 UTC timestamp.
          example: '2026-01-15T09:33:10.000Z'
        truncated:
          type: boolean
          description: >-
            true when the recording hit the size cap and stops before the call
            ended.
          example: false
      description: >-
        The call recording with downloadable links, its channel layout and
        per-member tracks. Absent when the call was not recorded (handled on the
        phone, unanswered, or too short).
    CallUtterance:
      type: object
      properties:
        start_seconds:
          type: number
          description: Offset into the recording where this line starts, in seconds.
          example: 12.4
        speaker:
          type: string
          description: >-
            Who spoke: the customer's name (or number) for the customer side, a
            member's email for the Periskope side.
          example: John Doe
        text:
          type: string
          description: What was said.
          example: Hi, I wanted to check on my order.
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: >-
        Your Periskope API token, sent as `Authorization: Bearer <token>`.
        Generate one from the Periskope dashboard under **Settings → API &
        Webhooks**. API access requires an active Pro or Enterprise plan.

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.