Call2Me Extensions API

The Extensions API from Call2Me — 17 operation(s) for extensions.

Operations 17

GET /v1/ext/config Ext Config #
POST /v1/ext/session/start Ext Start #
POST /v1/ext/session/heartbeat Ext Heartbeat #
POST /v1/ext/session/end Ext End #
POST /v1/ext/link/request Ext Link Request #
POST /v1/ext/link/status Ext Link Status #
POST /v1/ext/link/confirm Ext Link Confirm #
POST /v1/ext/link/attach Ext Link Attach #
POST /v1/ext/link/detach Ext Link Detach #
GET /v1/ext/usage Ext Usage #
GET /v1/ext/assistant/config Asst Config #
POST /v1/ext/assistant/session/start Asst Session Start #
POST /v1/ext/assistant/taste/start Asst Taste Start #
POST /v1/ext/assistant/session/end Asst Session End #
POST /v1/ext/assistant/taste/end Asst Taste End #
POST /v1/ext/assistant/ask Asst Ask #
POST /v1/ext/assistant/summarize Asst Summarize #

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-extensions-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-extensions-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: Call2Me Extensions 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: Extensions
paths:
  /v1/ext/config:
    get:
      tags:
      - Extensions
      summary: Ext Config
      description: 'Uzantının çalışması için gereken her şey: şalter, diller, kota, havuz.


        `device_id` verilirse KİŞİNİN kalan dakikası da döner. UX denetimi

        (26 Eyl) şunu yakaladı: popup havuzun kalanını gösteriyordu (ör. 187 dk)

        ama kullanıcı 5 dakikada kesiliyordu — vaat ile gerçek arasındaki bu fark

        "kandırıldım" hissi yaratıp kullanıcıyı ödeme sayfasına değil kaldırma

        düğmesine götürür.'
      operationId: ext_config_v1_ext_config_get
      parameters:
      - name: device_id
        in: query
        required: false
        schema:
          anyOf:
          - type: string
          - type: 'null'
          title: Device Id
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                type: object
                additionalProperties: true
                title: Response Ext Config V1 Ext Config Get
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /v1/ext/session/start:
    post:
      tags:
      - Extensions
      summary: Ext Start
      description: 'Oturum aç: kotayı ölç, oda yarat, ajanı çağır, token dön.'
      operationId: ext_start_v1_ext_session_start_post
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/src__routers__v1__extensions__StartRequest'
        required: true
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                additionalProperties: true
                type: object
                title: Response Ext Start V1 Ext Session Start Post
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /v1/ext/session/heartbeat:
    post:
      tags:
      - Extensions
      summary: Ext Heartbeat
      operationId: ext_heartbeat_v1_ext_session_heartbeat_post
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/HeartbeatRequest'
        required: true
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                additionalProperties: true
                type: object
                title: Response Ext Heartbeat V1 Ext Session Heartbeat Post
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /v1/ext/session/end:
    post:
      tags:
      - Extensions
      summary: Ext End
      operationId: ext_end_v1_ext_session_end_post
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/EndRequest'
        required: true
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                additionalProperties: true
                type: object
                title: Response Ext End V1 Ext Session End Post
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /v1/ext/link/request:
    post:
      tags:
      - Extensions
      summary: Ext Link Request
      description: E-posta ile bağlama bağlantısı gönder. Hesap yoksa açar.
      operationId: ext_link_request_v1_ext_link_request_post
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/LinkRequest'
        required: true
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                additionalProperties: true
                type: object
                title: Response Ext Link Request V1 Ext Link Request Post
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /v1/ext/link/status:
    post:
      tags:
      - Extensions
      summary: Ext Link Status
      description: Uzantı "bağlandım mı" diye sorar (postayı bekleyip yoklar).
      operationId: ext_link_status_v1_ext_link_status_post
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/LinkStatusRequest'
        required: true
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                additionalProperties: true
                type: object
                title: Response Ext Link Status V1 Ext Link Status Post
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /v1/ext/link/confirm:
    post:
      tags:
      - Extensions
      summary: Ext Link Confirm
      description: 'Postadaki bağlantı TARAYICIDA açıldığında site burayı çağırır.


        Tek kullanımlık: `consumed_at` atomik olarak işaretlenir, aynı bağlantı

        ikinci kez çalışmaz (posta iletilse/loglansa bile).'
      operationId: ext_link_confirm_v1_ext_link_confirm_post
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/LinkConfirmRequest'
        required: true
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                additionalProperties: true
                type: object
                title: Response Ext Link Confirm V1 Ext Link Confirm Post
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /v1/ext/link/attach:
    post:
      tags:
      - Extensions
      summary: Ext Link Attach
      description: 'Uzantı içinden giriş yapan kullanıcının cihazını hesabına bağlar.


        NEDEN AYRI UÇ: `/link/request` + `/link/confirm` postadan geçen yol için

        var — kullanıcının parolası yoksa ya da uzantıya parola yazmak

        istemiyorsa. Uzantı artık kendi içinde giriş yapabiliyor (e-posta+şifre

        ya da Google) ve o durumda posta turuna gerek yok: kimlik zaten JWT ile

        kanıtlanmış.


        BU UÇ OLMADAN uzantıdan giriş yapan kullanıcının cihazı "kimliksiz"

        kalıyordu: çeviri oturumları `device_id` ile açılıyor ve kota o kimlikten

        okunuyor, dolayısıyla 60 dakikalık hakkını göremeyip 5 dakikada

        takılıyordu.


        E-POSTA DOĞRULAMASI ARANMAZ, bilerek: kullanıcı zaten giriş yapabildiyse

        hesabı var demektir. `/link/confirm` doğrulamayı postaya tıklayarak

        kanıtlıyordu; burada kanıt JWT''nin kendisi.'
      operationId: ext_link_attach_v1_ext_link_attach_post
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/LinkAttachRequest'
        required: true
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                additionalProperties: true
                type: object
                title: Response Ext Link Attach V1 Ext Link Attach Post
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /v1/ext/link/detach:
    post:
      tags:
      - Extensions
      summary: Ext Link Detach
      description: 'Çıkış yaparken cihazın hesap bağını koparır.


        NEDEN GEREKLİ: `/config` kimliksiz bir uçtur (device_id ile çağrılır) ve

        bağlı cihazda hesabın E-POSTASINI döndürür — arayüz "kim giriş yapmış"ı

        göstersin diye. Uzantıdan çıkış yapmak yalnız token''ı siliyordu, bağ

        yerinde kalıyordu; ortak bir makinede çıkış yapan kullanıcının e-posta

        adresi bir sonraki kişiye görünüyordu.


        CİHAZ KİMLİĞİ SİLİNMEZ, yalnız bağ düşer: kimliği silmek kimliksiz

        kotayı sıfırlar ve "çıkış yap → 5 dakika daha" açığı açardı.


        Yalnız KENDİ cihazını çözebilirsin — `WHERE user_id` şartı, başkasının

        cihazını koparıp onu kimliksiz kotaya düşürmeyi engeller.'
      operationId: ext_link_detach_v1_ext_link_detach_post
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/LinkAttachRequest'
        required: true
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                additionalProperties: true
                type: object
                title: Response Ext Link Detach V1 Ext Link Detach Post
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /v1/ext/usage:
    get:
      tags:
      - Extensions
      summary: Ext Usage
      description: 'Panelin uzantı bölümü: kullanım özeti + son oturumlar.'
      operationId: ext_usage_v1_ext_usage_get
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                additionalProperties: true
                type: object
                title: Response Ext Usage V1 Ext Usage Get
  /v1/ext/assistant/config:
    get:
      tags:
      - Extensions
      summary: Asst Config
      operationId: asst_config_v1_ext_assistant_config_get
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                additionalProperties: true
                type: object
                title: Response Asst Config V1 Ext Assistant Config Get
  /v1/ext/assistant/session/start:
    post:
      tags:
      - Extensions
      summary: Asst Session Start
      operationId: asst_session_start_v1_ext_assistant_session_start_post
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SessionStartRequest'
        required: true
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                additionalProperties: true
                type: object
                title: Response Asst Session Start V1 Ext Assistant Session Start Post
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /v1/ext/assistant/taste/start:
    post:
      tags:
      - Extensions
      summary: Asst Taste Start
      operationId: asst_taste_start_v1_ext_assistant_taste_start_post
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/TasteStartRequest'
        required: true
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                additionalProperties: true
                type: object
                title: Response Asst Taste Start V1 Ext Assistant Taste Start Post
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /v1/ext/assistant/session/end:
    post:
      tags:
      - Extensions
      summary: Asst Session End
      operationId: asst_session_end_v1_ext_assistant_session_end_post
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SessionEndRequest'
        required: true
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                additionalProperties: true
                type: object
                title: Response Asst Session End V1 Ext Assistant Session End Post
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /v1/ext/assistant/taste/end:
    post:
      tags:
      - Extensions
      summary: Asst Taste End
      operationId: asst_taste_end_v1_ext_assistant_taste_end_post
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/TasteEndRequest'
        required: true
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                additionalProperties: true
                type: object
                title: Response Asst Taste End V1 Ext Assistant Taste End Post
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /v1/ext/assistant/ask:
    post:
      tags:
      - Extensions
      summary: Asst Ask
      operationId: asst_ask_v1_ext_assistant_ask_post
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/AskRequest'
        required: true
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                additionalProperties: true
                type: object
                title: Response Asst Ask V1 Ext Assistant Ask Post
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
  /v1/ext/assistant/summarize:
    post:
      tags:
      - Extensions
      summary: Asst Summarize
      operationId: asst_summarize_v1_ext_assistant_summarize_post
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SummarizeRequest'
        required: true
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                additionalProperties: true
                type: object
                title: Response Asst Summarize V1 Ext Assistant Summarize Post
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
components:
  schemas:
    SessionEndRequest:
      properties:
        session_id:
          type: string
          maxLength: 64
          title: Session Id
      type: object
      required:
      - session_id
      title: SessionEndRequest
    SessionStartRequest:
      properties:
        device_id:
          type: string
          maxLength: 64
          title: Device Id
        lang:
          type: string
          maxLength: 8
          title: Lang
          default: en
        page_url:
          anyOf:
          - type: string
            maxLength: 2048
          - type: 'null'
          title: Page Url
        caps:
          items:
            type: string
            maxLength: 32
          type: array
          maxItems: 8
          title: Caps
      type: object
      required:
      - device_id
      title: SessionStartRequest
    LinkStatusRequest:
      properties:
        device_id:
          type: string
          title: Device Id
      type: object
      required:
      - device_id
      title: LinkStatusRequest
    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
    AskRequest:
      properties:
        question:
          type: string
          maxLength: 4000
          minLength: 1
          title: Question
        page:
          anyOf:
          - $ref: '#/components/schemas/PageIn'
          - type: 'null'
        lang:
          type: string
          maxLength: 8
          title: Lang
          default: en
      type: object
      required:
      - question
      title: AskRequest
    EndRequest:
      properties:
        device_id:
          type: string
          title: Device Id
        session_id:
          anyOf:
          - type: string
          - type: 'null'
          title: Session Id
        reason:
          anyOf:
          - type: string
          - type: 'null'
          title: Reason
      type: object
      required:
      - device_id
      title: EndRequest
    TasteEndRequest:
      properties:
        device_id:
          type: string
          maxLength: 64
          title: Device Id
        session_id:
          type: string
          maxLength: 64
          title: Session Id
      type: object
      required:
      - device_id
      - session_id
      title: TasteEndRequest
    SummarizeRequest:
      properties:
        kind:
          type: string
          enum:
          - article
          - video
          title: Kind
        url:
          type: string
          maxLength: 2048
          title: Url
          default: ''
        title:
          type: string
          maxLength: 512
          title: Title
          default: ''
        text:
          type: string
          maxLength: 500000
          minLength: 1
          title: Text
        video_seconds:
          anyOf:
          - type: number
            maximum: 86400.0
            minimum: 0.0
          - type: 'null'
          title: Video Seconds
        lang:
          type: string
          maxLength: 8
          title: Lang
          default: en
      type: object
      required:
      - kind
      - text
      title: SummarizeRequest
    HeartbeatRequest:
      properties:
        device_id:
          type: string
          title: Device Id
        session_id:
          type: string
          title: Session Id
        elapsed_seconds:
          type: integer
          maximum: 3600.0
          minimum: 0.0
          title: Elapsed Seconds
          description: İstemcinin bildirdiği geçen süre; sunucu kendi saatiyle sınırlar.
      type: object
      required:
      - device_id
      - session_id
      - elapsed_seconds
      title: HeartbeatRequest
    PageIn:
      properties:
        url:
          type: string
          maxLength: 2048
          title: Url
          default: ''
        title:
          type: string
          maxLength: 512
          title: Title
          default: ''
        text:
          type: string
          maxLength: 500000
          title: Text
          default: ''
      type: object
      title: PageIn
    LinkAttachRequest:
      properties:
        device_id:
          type: string
          title: Device Id
      type: object
      required:
      - device_id
      title: LinkAttachRequest
    TasteStartRequest:
      properties:
        device_id:
          type: string
          maxLength: 64
          title: Device Id
        lang:
          type: string
          maxLength: 8
          title: Lang
          default: en
      type: object
      required:
      - device_id
      title: TasteStartRequest
    LinkConfirmRequest:
      properties:
        token:
          type: string
          maxLength: 64
          title: Token
      type: object
      required:
      - token
      title: LinkConfirmRequest
    LinkRequest:
      properties:
        device_id:
          type: string
          title: Device Id
        email:
          type: string
          maxLength: 255
          title: Email
      type: object
      required:
      - device_id
      - email
      title: LinkRequest
    HTTPValidationError:
      properties:
        detail:
          items:
            $ref: '#/components/schemas/ValidationError'
          type: array
          title: Detail
      type: object
      title: HTTPValidationError
    src__routers__v1__extensions__StartRequest:
      properties:
        device_id:
          type: string
          title: Device Id
          description: İstemcinin ürettiği kalıcı cihaz kimliği
        speak:
          type: string
          title: Speak
          description: Yakalanan sesin dili (ISO-639-1)
        hear:
          type: string
          title: Hear
          description: Çevirinin duyulacağı dil (ISO-639-1)
        detect_language:
          type: boolean
          title: Detect Language
          description: 'Seçilen dil sese uymuyorsa uyar ve bir öneri yayınla. VARSAYILAN KAPALI: yanlış pozitif (ağır aksan, gürültülü yayın) doğru seçim yapmış kullanıcıyı şüpheye düşürür. Kendi başına dil DEĞİŞTİRMEZ, yalnız öneri üretir.'
          default: false
        accept_paid:
          type: boolean
          title: Accept Paid
          description: Kullanıcı bakiyeden ($/dk) devama AÇIKÇA onay verdi. Gelmezse ücretli oturum ASLA açılmaz — eski uzantı bu alanı bilmez, ücretsiz hakkı bitince bugünkü gibi 429 alır.
          default: false
      type: object
      required:
      - device_id
      - speak
      - hear
      title: StartRequest
  securitySchemes:
    BearerAuth:
      type: http
      scheme: bearer
      bearerFormat: API Key
      description: Enter your API key
externalDocs:
  description: Full developer documentation
  url: https://docs.call2me.app