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

# Create Call

> Creates a call inside Reddy platform

<Tip>
  Check out our [Send Calls to Reddy guide](/guides/send-calls-to-reddy) for examples of using this endpoint.
</Tip>

This endpoint is used to add a call to Reddy and perform the QA grading process on it. QA grading can be triggered by either uploading an audio file or providing a transcript.

<Warning>
  Calls are added to a processing queue and may not show up in the dashboard immediately. Processing times vary based on current queue load.
</Warning>

Once the process is completed, the insights will be visible on the dashboard.

The `filename` parameter is optional. If provided, the response will include a signed Google Cloud Storage URL for uploading the audio file. If omitted, a simple success response is returned. Audio files must be under **250 MB**.

<Note>
  Redaction is not applied to the audio if the transcript is provided. If you have sensitive information in the audio that you want to silence, make sure you do that using word-level timestamps in your transcription before sending to Reddy.
</Note>

## Speaker Separation

Control how speakers are separated in the call using the `speaker` object:

* **speaker.separation**: 'diarize' (default) or 'channels'
* **speaker.channel\_map** (optional, when separation="channels"): \["agent", "customer"] or \["customer", "agent"]. If omitted, roles are identified automatically.

[Learn more about speaker separation](/guides/send-calls-to-reddy#speaker-separation)

<RequestExample>
  ```bash cURL with transcript theme={null}
  curl -X POST 'https://app.reddy.io/api/v1/call/create' \
    -H 'Authorization: Bearer YOUR_API_TOKEN' \
    -H 'Content-Type: application/json' \
    -d '{
      "agent_email": "agent@company.com",
      "product_id": 123,
      "transcript": [
        {
          "role": "agent",
          "text": "Hello, how can I help you today?",
          "start": 5,
          "stop": 36
        },
        {
          "role": "customer",
          "text": "I need help with my recent order",
          "start": 54,
          "stop": 67
        }
      ]
    }'
  ```

  ```bash cURL with audio (default diarization) theme={null}
  curl -X POST 'https://app.reddy.io/api/v1/call/create' \
    -H 'Authorization: Bearer YOUR_API_TOKEN' \
    -H 'Content-Type: application/json' \
    -d '{
      "filename": "call_recording.wav",
      "agent_email": "agent@company.com",
      "product_id": 123
    }'
  ```

  ```bash cURL with stereo audio (labeled channels) theme={null}
  curl -X POST 'https://app.reddy.io/api/v1/call/create' \
    -H 'Authorization: Bearer YOUR_API_TOKEN' \
    -H 'Content-Type: application/json' \
    -d '{
      "filename": "stereo_call.wav",
      "agent_email": "agent@company.com",
      "product_id": 123,
      "speaker": {
        "separation": "channels",
        "channel_map": ["agent", "customer"]
      }
    }'
  ```

  ```bash cURL with stereo audio (AI detection) theme={null}
  curl -X POST 'https://app.reddy.io/api/v1/call/create' \
    -H 'Authorization: Bearer YOUR_API_TOKEN' \
    -H 'Content-Type: application/json' \
    -d '{
      "filename": "stereo_call_unknown.wav",
      "agent_email": "agent@company.com",
      "product_id": 123,
      "speaker": {
        "separation": "channels"
      }
    }'
  ```
</RequestExample>

<ResponseExample>
  ```json Response (with audio) theme={null}
  {
    "upload_id": 12345,
    "conversation_id": "conv_123",
    "upload_url": "https://storage.googleapis.com/...",
    "expires_in": 3600
  }
  ```

  ```json Response (with transcript) theme={null}
  {
    "success": true
  }
  ```
</ResponseExample>


## OpenAPI

````yaml api-reference/openapi.json POST /api/v1/call/create
openapi: 3.1.0
info:
  title: Reddy API
  version: 1.0.0
  description: ''
servers: []
security: []
paths:
  /api/v1/call/create:
    post:
      tags:
        - Call
      summary: Call Create
      description: >-
        Triggers the call addition process. If a transcript is provided, the QA
        process will be done on that transcript.

        Otherwise, it will wait for the audio file to be uploaded.


        When a filename is provided, the response includes a signed Google Cloud
        Storage URL. Upload the raw audio bytes directly to that URL with the
        correct Content-Type header.


        The upload URL expires after 1 hour.
      operationId: api_standard_api_call_events_call_create
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CallCreateData'
        required: true
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                anyOf:
                  - $ref: '#/components/schemas/UploadURLResponse'
                  - $ref: '#/components/schemas/CallCreateSuccess'
                title: Response
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ValidationError'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UserNotFound'
        '422':
          description: Unprocessable Entity
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProductNotFound'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CreationError'
      security:
        - AuthBearer: []
components:
  schemas:
    CallCreateData:
      properties:
        filename:
          anyOf:
            - type: string
            - type: 'null'
          description: >-
            Name of the audio file to be uploaded. Optional - if not provided,
            no upload URL will be returned.
          title: Filename
        agent_email:
          description: Email address of the agent handling the call
          title: Agent Email
          type: string
        product_id:
          description: Product id associated with the call
          title: Product Id
          type: integer
        channels:
          anyOf:
            - items:
                type: string
              type: array
            - type: 'null'
          description: >-
            **DEPRECATED**: Use speaker.separation and speaker.channel_map
            instead. Mapping of the channels in the audio file to the customer
            and agent. If nothing is specified, speakers will be identified
            automatically with a speaker diarization model.


            For example: ['customer', 'agent'] means the left channel contains
            the customer's audio and right channel contains the agent's audio.
          title: Channels
        speaker:
          anyOf:
            - $ref: '#/components/schemas/Speaker'
            - type: 'null'
          description: >-
            Configuration for speaker separation and channel mapping. If not
            provided, defaults to diarization.
        transcript:
          anyOf:
            - items:
                $ref: '#/components/schemas/TranscriptLine'
              type: array
            - type: 'null'
          description: Transcript of the call
          title: Transcript
        tags:
          anyOf:
            - items:
                $ref: '#/components/schemas/Tag'
              type: array
            - type: 'null'
          default: []
          description: Array of tag objects containing key, value, and type
          title: Tags
        timestamp:
          anyOf:
            - type: number
            - type: 'null'
          description: >-
            Timestamp of the call start time in seconds since epoch format. If
            not set, defaults to the current time.
          title: Timestamp
        conversation_id:
          anyOf:
            - type: string
            - type: 'null'
          description: Unique identifier for the conversation
          title: Conversation Id
      required:
        - agent_email
        - product_id
      title: CallCreateData
      type: object
    UploadURLResponse:
      properties:
        upload_id:
          description: Unique identifier for the upload
          title: Upload Id
          type: integer
        conversation_id:
          description: Unique identifier for the conversation
          title: Conversation Id
          type: string
        upload_url:
          description: >-
            Signed Google Cloud Storage URL to upload the audio file. Send raw
            bytes with the correct Content-Type header.
          title: Upload Url
          type: string
        expires_in:
          description: Time in seconds for which the upload URL is valid
          title: Expires In
          type: integer
      required:
        - upload_id
        - conversation_id
        - upload_url
        - expires_in
      title: UploadURLResponse
      type: object
    CallCreateSuccess:
      properties:
        success:
          title: Success
          type: boolean
      required:
        - success
      title: CallCreateSuccess
      type: object
    ValidationError:
      properties:
        conversation_id:
          description: Unique identifier for the conversation
          title: Conversation Id
          type: string
        error:
          description: Validation error message
          title: Error
          type: string
      required:
        - conversation_id
        - error
      title: ValidationError
      type: object
    UserNotFound:
      properties:
        conversation_id:
          anyOf:
            - type: string
            - type: 'null'
          title: Conversation Id
        error:
          title: Error
          type: string
      required:
        - error
      title: UserNotFound
      type: object
    ProductNotFound:
      properties:
        conversation_id:
          anyOf:
            - type: string
            - type: 'null'
          title: Conversation Id
        error:
          title: Error
          type: string
      required:
        - error
      title: ProductNotFound
      type: object
    CreationError:
      properties:
        conversation_id:
          description: Unique identifier for the conversation
          title: Conversation Id
          type: string
        error:
          description: Error message
          title: Error
          type: string
      required:
        - conversation_id
        - error
      title: CreationError
      type: object
    Speaker:
      properties:
        separation:
          anyOf:
            - type: string
            - type: 'null'
          default: diarize
          description: >-
            Control how to separate the speakers in the call. Options: 'diarize'
            (default) - diarize the audio to separate transcripts by speakers
            and then identify roles; 'channels' - use pre-separated audio
            channels (stereo/multichannel). See channel_map parameter.
          title: Separation
        channel_map:
          anyOf:
            - items:
                type: string
              type: array
            - type: 'null'
          description: >-
            Mapping of audio channels to speaker roles. Only valid when
            separation='channels'. If provided, must be exactly 2 elements
            containing 'agent' and 'customer' (e.g., ['agent', 'customer'] or
            ['customer', 'agent']). If omitted when separation='channels', AI
            will automatically identify which channel contains which role.
          title: Channel Map
      title: Speaker
      type: object
    TranscriptLine:
      properties:
        text:
          description: Text of the transcript
          title: Text
          type: string
        role:
          description: Role of the speaker
          enum:
            - customer
            - agent
          title: Role
          type: string
        metadata:
          anyOf:
            - additionalProperties: true
              type: object
            - type: 'null'
          default: {}
          description: Additional metadata associated with the transcript
          title: Metadata
        timestamp:
          anyOf:
            - type: number
            - type: 'null'
          description: Timestamp of the transcript in seconds since epoch format
          title: Timestamp
        start:
          anyOf:
            - type: number
            - type: 'null'
          description: >-
            Starting time of the transcript in seconds since the beginning of
            the call. If not provided, it will be calculated based on the
            timestamp relative to the first utterance.
          title: Start
        stop:
          anyOf:
            - type: number
            - type: 'null'
          description: >-
            Ending time of the transcript in seconds since the beginning of the
            call. If not provided, it will be calculated based on the timestamp
            relative to the first utterance.
          title: Stop
      required:
        - text
        - role
      title: TranscriptLine
      type: object
    Tag:
      description: |-
        Schema representing a tag with a key and value.
        The value can be a single value of various types.
      properties:
        key:
          title: Key
          type: string
        value:
          anyOf:
            - type: string
            - type: integer
            - type: boolean
          title: Value
        type:
          enum:
            - string
            - integer
            - boolean
          title: Type
          type: string
      required:
        - key
        - value
        - type
      title: Tag
      type: object
  securitySchemes:
    AuthBearer:
      type: http
      scheme: bearer

````