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

# Connect Attendee

> Store the Attendee account your agents join meetings through: `https://app.attendee.dev` with a key from your project there, or your own Attendee install. The key is checked against Attendee first and stored encrypted; it is never returned. Calling this again replaces what is stored.

Attendee bills you directly for bot hours. Wixzel never runs Attendee for you and adds nothing to that bill. For Zoom meetings your Attendee project also needs Zoom credentials (a Zoom Meeting SDK app). Requires `calls:write`.



## OpenAPI

````yaml /openapi.json post /v1/meetings/integration
openapi: 3.1.0
info:
  title: Wixzel Voice API
  version: '2026-09-01'
  description: >-
    APIs for agentic telephony. One API key, one balance, every voice engine.


    ## Authentication

    Send your key as `Authorization: Bearer wv_live_...`. Keys are scoped: grant
    only what an integration needs. There is no admin scope.


    ## Versioning

    The `/v1` prefix covers additive changes. Behavioural changes ship behind a
    dated `Wixzel-Version` header, and existing keys keep the behaviour they
    were created with.


    ## Money

    Amounts are integer **micro-USD** (1,000,000 = $1.00). Voice usage is billed
    per second, per token and per character, so a float dollar figure cannot
    represent it without disagreeing with the ledger.


    ## Errors

    Every error carries a stable `code` and a `request_id`. Match on `code`; the
    `message` is for humans and may change.
  contact:
    name: Wixzel Voice
    url: https://voice.wixzel.com
servers:
  - url: https://api.voice.wixzel.com
    description: Production
security: []
tags:
  - name: Calls
    description: Place calls and read what happened on them.
  - name: Realtime
    description: Talk to an agent from a browser or app, with no phone line.
  - name: Agents
    description: >-
      The prompt, voice and behaviour of a caller, and its mascot: the animated
      face people see on your share link, your website and in your apps.
  - name: Leads
    description: People to call, and data to merge into prompts.
  - name: Campaigns
    description: Call a list of leads with one agent.
  - name: Knowledge bases
    description: Facts an agent can draw on mid-call.
  - name: Phone numbers
    description: Numbers on your SIP trunks.
  - name: SIP trunks
    description: Your carrier connections.
  - name: Appointments
    description: Bookings, including ones agents make on calls.
  - name: Usage
    description: Itemised billing lines.
  - name: Billing
    description: Balance, ledger and top-ups.
  - name: API keys
    description: Create, scope and rotate keys.
  - name: Engines
    description: What the platform can serve, and what it costs.
  - name: Voices
    description: Cloned voices, made from your own recordings, for your agents to speak in.
  - name: Callers
    description: Who called your agents, where from and on what, and the blocklist.
  - name: Webhooks
    description: Where events are sent, and what happened when they got there.
  - name: MCP servers
    description: Other apps’ tools, for agents to use while they are on a call.
  - name: Tools
    description: >-
      Your own tools, for agents to use while they are on a call: a webhook to
      your server, or an action in the caller’s app.
  - name: WhatsApp
    description: >-
      WhatsApp business numbers, the agents that answer their chats, and
      messages agents send.
  - name: Meetings
    description: >-
      Agents in Zoom, Google Meet and Teams meetings, through your own Attendee
      account.
paths:
  /v1/meetings/integration:
    post:
      tags:
        - Meetings
      summary: Connect Attendee
      description: >-
        Store the Attendee account your agents join meetings through:
        `https://app.attendee.dev` with a key from your project there, or your
        own Attendee install. The key is checked against Attendee first and
        stored encrypted; it is never returned. Calling this again replaces what
        is stored.


        Attendee bills you directly for bot hours. Wixzel never runs Attendee
        for you and adds nothing to that bill. For Zoom meetings your Attendee
        project also needs Zoom credentials (a Zoom Meeting SDK app). Requires
        `calls:write`.
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ConnectMeetingIntegration'
      responses:
        '200':
          description: The connected integration
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MeetingIntegration'
        '400':
          description: Invalid request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '401':
          description: Missing or invalid API key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '403':
          description: Key lacks the required scope
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '429':
          description: Rate limited. Retry after the interval in `Retry-After`.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      security:
        - bearerAuth: []
components:
  schemas:
    ConnectMeetingIntegration:
      type: object
      properties:
        provider:
          type: string
          enum:
            - attendee
          default: attendee
          description: The meeting-bot service. Only Attendee today.
        base_url:
          type: string
          maxLength: 500
          format: uri
          default: https://app.attendee.dev
          description: >-
            Your Attendee: `https://app.attendee.dev` for the hosted app, or the
            address of your own install.
          example: https://app.attendee.dev
        api_key:
          type: string
          minLength: 8
          maxLength: 500
          description: >-
            An API key from your Attendee project. Checked against Attendee
            before it is saved; never returned. Required the first time and
            whenever `base_url` changes; omit it to keep the stored key.
        webhook_secret:
          type:
            - string
            - 'null'
          minLength: 8
          maxLength: 500
          description: >-
            Optional: your Attendee project's webhook secret (Settings →
            Webhooks there). When set, every bot state webhook is checked
            against its X-Webhook-Signature as well as the per-meeting token in
            its URL. Pass null to remove it; omit it to keep what is stored.
        signed_in_bots:
          allOf:
            - $ref: '#/components/schemas/SignedInBots'
            - description: >-
                Sign bots into an account before they join, so Google Meet and
                Teams show a named participant instead of an anonymous guest
                (which Meet labels "appears to be a bot"). Set up bot logins in
                your Attendee first (Settings → Bot Logins). Omit to keep what
                is stored. Not available for Zoom.
    MeetingIntegration:
      type: object
      properties:
        object:
          type: string
          enum:
            - meeting_integration
        provider:
          type: string
          enum:
            - attendee
        base_url:
          type: string
        api_key_last4:
          type: string
          description: The end of the stored key, to tell keys apart.
        webhook_secret_set:
          type: boolean
        signed_in_bots:
          $ref: '#/components/schemas/SignedInBots'
        status:
          type: string
          enum:
            - connected
            - error
        last_error:
          type:
            - string
            - 'null'
        verified_at:
          type:
            - string
            - 'null'
          format: date-time
          description: ISO 8601, always UTC.
          example: '2026-09-01T12:00:00.000Z'
        created_at:
          type: string
          format: date-time
          description: ISO 8601, always UTC.
          example: '2026-09-01T12:00:00.000Z'
        updated_at:
          type: string
          format: date-time
          description: ISO 8601, always UTC.
          example: '2026-09-01T12:00:00.000Z'
      required:
        - object
        - provider
        - base_url
        - api_key_last4
        - webhook_secret_set
        - signed_in_bots
        - status
        - last_error
        - verified_at
        - created_at
        - updated_at
    Error:
      type: object
      properties:
        error:
          type: object
          properties:
            type:
              type: string
              enum:
                - invalid_request_error
                - authentication_error
                - permission_error
                - rate_limit_error
                - insufficient_credits
                - not_found_error
                - conflict_error
                - api_error
            code:
              type: string
              description: Stable machine-readable code.
              example: agent_not_found
            message:
              type: string
              description: >-
                Human-readable explanation. Do not match on this — match on
                code.
            param:
              type: string
              description: Which field caused the failure, when applicable.
            doc_url:
              type: string
            request_id:
              type: string
              description: Quote this when asking for help.
              example: req_01HXYZ...
          required:
            - type
            - code
            - message
            - request_id
      required:
        - error
    SignedInBots:
      type: object
      properties:
        google_meet:
          type: boolean
          default: false
          description: >-
            Sign in before joining Google Meet. Needs a Google Workspace bot
            login in your Attendee.
        teams:
          type: boolean
          default: false
          description: >-
            Sign in before joining Teams. Needs a Microsoft 365 bot login in
            your Attendee.
        login_group:
          type:
            - string
            - 'null'
          minLength: 1
          maxLength: 100
          default: null
          description: >-
            The Attendee bot login group to use. Null uses the oldest group for
            the platform.
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: >-
        Your Wixzel Voice API key: `Authorization: Bearer wv_live_...`. Keys are
        scoped; grant only what the integration needs.

````

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