Call2Me Calls API

Place outbound phone calls and inspect call history. `POST /v1/calls` starts an outbound call given an `agent_id`, a `from_number` and a `to_number`; the platform handles dialing, the AI conversation, recording and transcription. Use `GET /v1/calls/{id}` to retrieve the transcript, recording URL, status and post-call analysis.

Operations 10

POST /v1/calls Place an outbound call #
GET /v1/calls List calls #
GET /v1/calls/quality/report Get Quality Report #
GET /v1/calls/{call_id} Get call details #
DELETE /v1/calls/{call_id} Delete a call record #
POST /v1/calls/{call_id}/end End an active call #
GET /v1/calls/{call_id}/recording Get a signed URL for the call recording #
GET /v1/calls/{call_id}/vcon Export the call as a vCon container #
GET /v1/calls/{call_id}/live Live transcript of an ongoing call #
POST /v1/calls/{call_id}/instruct Send a live instruction to an ongoing call #

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/call2me-app:call2me-app-calls-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

call2me-app-calls-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: Call2Me Calls API
  description: '# Call2Me Voice AI Platform API


    Programmatic interface to build, deploy and operate voice AI agents that can place

    and receive phone calls in real time. Designed to be consumed by humans **and** by

    AI agent frameworks (function-calling LLMs, MCP servers, automation platforms like

    Composio, Pipedream, Zapier, n8n).


    ## What you can do


    - **Place outbound calls** — give an agent a phone number to dial; the AI handles

    the conversation end-to-end and returns a transcript + recording.

    - **Manage AI agents** — create personalities, attach voices, system prompts,

    knowledge bases and post-call actions.

    - **Schedule calls** — one-shot or recurring (cron-like) outbound calls.

    - **Knowledge base (RAG)** — upload documents/URLs so the agent answers from your

    data with reduced hallucination.

    - **Inbound** — provision phone numbers that route to your agents.


    ## Common LLM tool-calling use cases


    | Goal | Endpoint |

    |------|----------|

    | "Call this person and read them this script" | `POST /v1/calls` |

    | "Schedule a follow-up tomorrow at 14:00" | `POST /v1/schedules` |

    | "Get the transcript of last call" | `GET /v1/calls/{id}` |

    | "Add this PDF to the agent''s brain" | `POST /v1/knowledge-base/{id}/sources` |


    ## Authentication


    Every request requires a Bearer token issued from the dashboard:


    ```

    Authorization: Bearer c2m_sk_xxxxxxxxxxxxxxxx

    ```


    Get your API key from the API Keys page.

    Keys are scoped per-workspace and can be rotated/revoked any time.


    ## Rate Limits


    | Plan | Requests/min | Concurrent Calls |

    |------|-------------|------------------|

    | Free | 60 | 1 |

    | Pro | 600 | 10 |

    | Enterprise | Unlimited | Unlimited |


    ## SDKs & Integrations


    - Python SDK

    - Node.js SDK

    - OpenAPI 3.1 spec: `/openapi.json` (use it to generate clients or register the

    service with AI tool platforms)


    ## Support


    - Email: support@call2me.app

    - Docs: https://docs.call2me.app

    - Discord: https://discord.gg/call2me'
  version: 1.0.0
  x-logo:
    url: https://call2me.app/logo.png
    altText: Call2Me Logo
  contact:
    name: Call2Me Support
    url: https://call2me.app/support
    email: support@call2me.app
  license:
    name: Commercial — see Terms of Service
    url: https://call2me.app/terms
  termsOfService: https://call2me.app/terms
servers:
- url: https://api.call2me.app
  description: Production
- url: http://localhost:8000
  description: Local Development
security:
- BearerAuth: []
tags:
- name: Calls
  description: Place outbound phone calls and inspect call history. `POST /v1/calls` starts an outbound call given an `agent_id`, a `from_number` and a `to_number`; the platform handles dialing, the AI conversation, recording and transcription. Use `GET /v1/calls/{id}` to retrieve the transcript, recording URL, status and post-call analysis.
  externalDocs:
    description: Learn more about calls
    url: https://docs.call2me.app/calls
paths:
  /v1/calls:
    post:
      tags:
      - Calls
      summary: Place an outbound call
      description: 'Initiate an outbound phone call. The platform will dial `to_number` from `from_number` (a phone number you own on this workspace), connect the configured AI agent, and begin a real-time voice conversation. The call is placed asynchronously — this endpoint returns immediately with `call_id` and `status=''queued''`; poll `GET /v1/calls/{id}` or subscribe to webhooks to track progress.


        **Required**: an active agent (`agent_id`) and a phone number assigned to your workspace (`from_number`). If `from_number` is omitted, the agent''s assigned phone number is used automatically.


        **Cost**: deducted from your wallet per minute of talk time. The request fails with `402` if balance is insufficient.'
      operationId: create_call_v1_calls_post
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/call2me_core__models__call__CreateCallRequest'
      responses:
        '201':
          description: Call queued for dialing.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Call'
        '400':
          description: No phone number assigned, demo number used for outbound, or other validation error.
        '402':
          description: Insufficient wallet balance.
        '404':
          description: Agent not found.
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
    get:
      tags:
      - Calls
      summary: List calls
      description: List calls in this workspace, newest first. Supports filtering by `agent_id`, `status` (queued/active/completed/failed/canceled) and `direction` (outbound/inbound). Use `limit` and `offset` for pagination. To retrieve full call details (transcript, recording), call `GET /v1/calls/{id}` for a specific call.
      operationId: list_calls_v1_calls_get
      parameters:
      - name: agent_id
        in: query
        required: false
        schema:
          anyOf:
          - type: string
          - type: 'null'
          description: Filter by agent.
          title: Agent Id
        description: Filter by agent.
      - name: status
        in: query
        required: false
        schema:
          anyOf:
          - type: string
          - type: 'null'
          description: 'Filter by status: queued, active, completed, failed, canceled.'
          title: Status
        description: 'Filter by status: queued, active, completed, failed, canceled.'
      - name: direction
        in: query
        required: false
        schema:
          anyOf:
          - type: string
          - type: 'null'
          description: 'Filter by direction: outbound or inbound.'
          title: Direction
        description: 'Filter by direction: outbound or inbound.'
      - name: limit
        in: query
        required: false
        schema:
          type: integer
          maximum: 1000
          minimum: 1
          description: Page size.
          default: 100
          title: Limit
        description: Page size.
      - name: offset
        in: query
        required: false
        schema:
          type: integer
          minimum: 0
          description: Pagination offset.
          default: 0
          title: Offset
        description: Pagination offset.
      responses:
        '200':
          description: Paginated list of calls with summary fields.
          content:
            application/json:
              schema: {}
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /v1/calls/quality/report:
    get:
      tags:
      - Calls
      summary: Get Quality Report
      description: Get call quality report with aggregated metrics.
      operationId: get_quality_report_v1_calls_quality_report_get
      parameters:
      - name: days
        in: query
        required: false
        schema:
          type: integer
          maximum: 90
          minimum: 1
          default: 30
          title: Days
      - name: agent_id
        in: query
        required: false
        schema:
          anyOf:
          - type: string
          - type: 'null'
          title: Agent Id
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /v1/calls/{call_id}:
    get:
      tags:
      - Calls
      summary: Get call details
      description: Retrieve a single call by ID. Returns the conversation transcript (speaker-attributed), recording URL (signed for download), call duration, disconnect reason, and any post-call analysis (sentiment, summary, function-call results). Use this endpoint after a call completes to feed transcript/summary back into your downstream workflow (CRM update, ticket creation, follow-up trigger).
      operationId: get_call_v1_calls__call_id__get
      parameters:
      - name: call_id
        in: path
        required: true
        schema:
          type: string
          title: Call Id
      responses:
        '200':
          description: Full call object including transcript, recording URL, status and post-call analysis.
          content:
            application/json:
              schema: {}
        '404':
          description: Call not found in this workspace.
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
    delete:
      tags:
      - Calls
      summary: Delete a call record
      description: 'Permanently removes the call record (transcript, metadata, analysis) from this workspace. Note: the underlying recording file in object storage is **not** deleted automatically — request a separate recording purge if you need full erasure (e.g. GDPR right-to-be-forgotten requests).'
      operationId: delete_call_v1_calls__call_id__delete
      parameters:
      - name: call_id
        in: path
        required: true
        schema:
          type: string
          title: Call Id
      responses:
        '200':
          description: Confirmation message.
          content:
            application/json:
              schema: {}
        '404':
          description: Call not found.
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /v1/calls/{call_id}/end:
    post:
      tags:
      - Calls
      summary: End an active call
      description: Forcefully terminate an ongoing call (e.g. when an automation decides the conversation should stop early). The call is marked `disconnection_reason='agent_hangup'`. Calls that are not currently `ongoing` cannot be ended this way.
      operationId: end_call_v1_calls__call_id__end_post
      parameters:
      - name: call_id
        in: path
        required: true
        schema:
          type: string
          title: Call Id
      responses:
        '200':
          description: The updated call object with `call_status='ended'`.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Call'
        '400':
          description: Call is not in an ongoing state.
        '404':
          description: Call not found.
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /v1/calls/{call_id}/recording:
    get:
      tags:
      - Calls
      summary: Get a signed URL for the call recording
      description: Generate a short-lived signed URL (1 hour) for the call's audio recording. Use this to download/stream the recording directly from object storage without exposing long-lived credentials. Suitable for embedding in QA dashboards, sentiment analysis pipelines, or compliance archival.
      operationId: get_recording_v1_calls__call_id__recording_get
      parameters:
      - name: call_id
        in: path
        required: true
        schema:
          type: string
          title: Call Id
      responses:
        '200':
          description: A temporary signed URL pointing to the audio recording (valid for 1 hour).
          content:
            application/json:
              schema: {}
        '404':
          description: Call or recording not found.
        '501':
          description: Object storage backend is not configured on this deployment.
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /v1/calls/{call_id}/vcon:
    get:
      tags:
      - Calls
      summary: Export the call as a vCon container
      description: 'Export a completed call in the vCon standard format — a portable, self-contained record of the conversation holding the participants, the turn-by-turn dialog, the recording reference and the post-call analysis (summary, sentiment, custom extractions). Use it to hand conversation data to downstream systems without a proprietary shape. Opt-in per agent: enable `enable_vcon_export` on the agent first.'
      operationId: get_call_vcon_v1_calls__call_id__vcon_get
      parameters:
      - name: call_id
        in: path
        required: true
        schema:
          type: string
          title: Call Id
      responses:
        '200':
          description: 'The conversation as an IETF vCon JSON container (draft-ietf-vcon-vcon-container): parties, dialog and analysis.'
          content:
            application/json:
              schema: {}
        '404':
          description: Call not found, or vCon export is not enabled for its agent.
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /v1/calls/{call_id}/live:
    get:
      tags:
      - Calls
      summary: Live transcript of an ongoing call
      description: Returns what has been said so far in a call — one item per completed caller/assistant turn — plus live events (instruction delivered, transfer, call ending), and the call's live status (`ringing`, `in_progress`, `ended`). Poll with `since` set to the previous response's `next_since` to get only new items. Turns appear when they are complete (not word by word). After the call ends the stored transcript is returned.
      operationId: get_live_transcript_v1_calls__call_id__live_get
      parameters:
      - name: call_id
        in: path
        required: true
        schema:
          type: string
          title: Call Id
      - name: since
        in: query
        required: false
        schema:
          type: integer
          minimum: 0
          description: Return only items with seq greater than this.
          default: 0
          title: Since
        description: Return only items with seq greater than this.
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
        '404':
          description: Call not found in this workspace.
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /v1/calls/{call_id}/instruct:
    post:
      tags:
      - Calls
      summary: Send a live instruction to an ongoing call
      description: 'Steers a call that is in progress. **This affects the live conversation.** `note` adds guidance for the assistant (not spoken), `ask` makes it ask the caller something at the next pause, `say` makes it say a sentence (max 300 chars), `end` makes it say goodbye and hang up, `transfer` transfers to one of the assistant''s configured transfer targets (by name; free phone numbers are not accepted). Delivery is asynchronous: watch `GET /v1/calls/{call_id}/live` for the `instruction_applied` / `instruction_rejected` event. Max 10 instructions per call per minute.'
      operationId: instruct_call_v1_calls__call_id__instruct_post
      parameters:
      - name: call_id
        in: path
        required: true
        schema:
          type: string
          title: Call Id
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/InstructRequest'
      responses:
        '202':
          description: Successful Response
          content:
            application/json:
              schema: {}
        '404':
          description: Call not found in this workspace.
        '409':
          description: The call is not in progress (or the assistant has left the room).
        '422':
          description: Invalid instruction (missing text, too long, unknown transfer target).
        '429':
          description: Too many instructions for this call.
components:
  schemas:
    ValidationError:
      properties:
        loc:
          items:
            anyOf:
            - type: string
            - type: integer
          type: array
          title: Location
        msg:
          type: string
          title: Message
        type:
          type: string
          title: Error Type
        input:
          title: Input
        ctx:
          type: object
          title: Context
      type: object
      required:
      - loc
      - msg
      - type
      title: ValidationError
    Call:
      properties:
        call_id:
          type: string
          pattern: ^(call|demo|test|interp|bridge)_[a-f0-9]{8,24}$
          title: Call Id
          description: Unique call identifier
        agent_id:
          anyOf:
          - type: string
          - type: 'null'
          title: Agent Id
          description: Agent used for this call (tercüman/köprü aramalarında yok)
        call_status:
          type: string
          enum:
          - pending
          - ringing
          - in_progress
          - completed
          - failed
          - no_answer
          - busy
          - transferred
          - ended
          title: Call Status
          description: Current call status
        call_type:
          type: string
          enum:
          - inbound
          - outbound
          - sip_call
          - web_call
          - interpreter
          - phone_call
          - phone
          title: Call Type
          description: Call direction type
        direction:
          type: string
          enum:
          - inbound
          - outbound
          - web
          - web_bridge
          title: Direction
          description: Call direction
        from_number:
          anyOf:
          - type: string
          - type: 'null'
          title: From Number
          description: Caller phone number
        to_number:
          anyOf:
          - type: string
          - type: 'null'
          title: To Number
          description: Callee phone number
        start_timestamp:
          anyOf:
          - type: integer
          - type: 'null'
          title: Start Timestamp
          description: Unix timestamp in milliseconds when call started
        end_timestamp:
          anyOf:
          - type: integer
          - type: 'null'
          title: End Timestamp
          description: Unix timestamp in milliseconds when call ended
        duration_ms:
          anyOf:
          - type: integer
          - type: 'null'
          title: Duration Ms
          description: Call duration in milliseconds
        transcript:
          anyOf:
          - type: string
          - type: 'null'
          title: Transcript
          description: Full transcript as text
        transcript_object:
          anyOf:
          - items:
              $ref: '#/components/schemas/TranscriptTurn'
            type: array
          - type: 'null'
          title: Transcript Object
          description: Structured transcript
        recording_url:
          anyOf:
          - type: string
          - type: 'null'
          title: Recording Url
          description: URL to call recording
        disconnection_reason:
          anyOf:
          - type: string
            maxLength: 500
          - type: 'null'
          title: Disconnection Reason
          description: Reason the call ended (sabit kod ya da ajanın açıklaması)
        call_analysis:
          anyOf:
          - $ref: '#/components/schemas/CallAnalysis'
          - type: 'null'
          description: Post-call analysis
        metadata:
          anyOf:
          - additionalProperties: true
            type: object
          - type: 'null'
          title: Metadata
          description: Custom metadata
        created_at:
          type: string
          format: date-time
          title: Created At
          description: Record creation time
        updated_at:
          type: string
          format: date-time
          title: Updated At
          description: Last update time
      type: object
      required:
      - call_id
      - call_status
      - call_type
      - direction
      title: Call
      description: Complete call record.
    CallAnalysis:
      properties:
        call_successful:
          type: boolean
          title: Call Successful
          description: Whether the call achieved its goal
        call_summary:
          type: string
          title: Call Summary
          description: AI-generated summary of the call
        user_sentiment:
          anyOf:
          - type: string
            enum:
            - positive
            - neutral
            - negative
          - type: 'null'
          title: User Sentiment
          description: Overall user sentiment
        custom_analysis_data:
          anyOf:
          - additionalProperties: true
            type: object
          - type: 'null'
          title: Custom Analysis Data
          description: Custom analysis results
      type: object
      required:
      - call_successful
      - call_summary
      title: CallAnalysis
      description: Post-call analysis results.
    InstructRequest:
      properties:
        type:
          type: string
          enum:
          - say
          - ask
          - note
          - end
          - transfer
          title: Type
          description: '`note`: guidance added to the assistant''s context (not spoken). `ask`: the assistant asks the caller this at the next natural pause. `say`: the assistant says this text (max 300 chars). `end`: the assistant says its farewell and hangs up. `transfer`: transfer to one of the assistant''s transfer targets.'
        text:
          anyOf:
          - type: string
            maxLength: 2000
          - type: 'null'
          title: Text
          description: Required for say/ask/note.
        transfer_to:
          anyOf:
          - type: string
            maxLength: 200
          - type: 'null'
          title: Transfer To
          description: 'For transfer: the NAME of one of the assistant''s transfer targets. Arbitrary phone numbers are not accepted.'
      type: object
      required:
      - type
      title: InstructRequest
    HTTPValidationError:
      properties:
        detail:
          items:
            $ref: '#/components/schemas/ValidationError'
          type: array
          title: Detail
      type: object
      title: HTTPValidationError
    call2me_core__models__call__CreateCallRequest:
      properties:
        agent_id:
          type: string
          title: Agent Id
          description: Agent to use for this call
        to_number:
          type: string
          pattern: ^\+[1-9]\d{1,14}$
          title: To Number
          description: E.164 format phone number to call
        from_number:
          anyOf:
          - type: string
            pattern: ^\+[1-9]\d{1,14}$
          - type: 'null'
          title: From Number
          description: Caller ID (must be owned by account)
        topic:
          anyOf:
          - type: string
            maxLength: 500
          - type: 'null'
          title: Topic
          description: Why this call is being placed. Reaches the agent as `call_purpose` and is woven into both the opening line and the system prompt, so the agent states its reason instead of a generic greeting.
        metadata:
          anyOf:
          - additionalProperties: true
            type: object
          - type: 'null'
          title: Metadata
          description: Custom metadata for the call
        dynamic_variables:
          anyOf:
          - additionalProperties: true
            type: object
          - type: 'null'
          title: Dynamic Variables
          description: Per-call values substituted into the agent's `{{placeholders}}` (system prompt, opening line, closing line). Up to 50 keys matching `^[A-Za-z_][A-Za-z0-9_]{0,63}$`; values are strings up to 1000 characters (numbers and booleans are converted to strings). Placeholders without a value are removed, never read aloud. The stored agent is not changed.
        begin_message:
          anyOf:
          - type: string
            maxLength: 500
          - type: 'null'
          title: Begin Message
          description: Exact opening sentence for THIS call (variables are substituted). Without it, outbound calls generate a direction-aware opening.
      type: object
      required:
      - agent_id
      - to_number
      title: CreateCallRequest
      description: Request to create an outbound call.
    TranscriptTurn:
      properties:
        role:
          type: string
          enum:
          - agent
          - user
          title: Role
          description: Speaker role
        text:
          type: string
          title: Text
          description: Spoken text (canlı veride `text` anahtarı)
        timestamp:
          anyOf:
          - type: string
          - type: 'null'
          title: Timestamp
          description: ISO 8601 timestamp
      type: object
      required:
      - role
      - text
      title: TranscriptTurn
      description: 'Single turn in a conversation transcript.


        CANLI VERİ `text` ANAHTARI KULLANIYOR (ölçüldü 2 Eki 2026: incelenen 400

        transkript turunun 400''ünde `role` + `text`, `content` HİÇ YOK). Model

        `content` bekliyordu, dolayısıyla transkripti olan HİÇBİR arama

        `CallRepository.get()` ile okunamıyordu.'
  securitySchemes:
    BearerAuth:
      type: http
      scheme: bearer
      bearerFormat: API Key
      description: Enter your API key
externalDocs:
  description: Full developer documentation
  url: https://docs.call2me.app