openapi: 3.1.0 info: title: Anam AI Avatars Meetings API version: '1.0' servers: - url: https://api.anam.ai description: Anam API security: - BearerAuth: [] tags: - name: Meetings paths: /v1/meetings/invites: get: summary: List meeting invites description: 'List meeting invites for the authenticated organization, most recent first. Filter by `status` to find invites in a particular lifecycle state — for example `pending` invites that have not joined yet, or `active` invites currently in a call. ' parameters: - in: query name: page schema: type: integer minimum: 1 default: 1 description: Page number for pagination - in: query name: perPage schema: type: integer minimum: 1 maximum: 100 default: 10 description: Number of items per page (max 100) - in: query name: status schema: type: string enum: - pending - active - cancelled - ended - failed description: Filter invites by status responses: '200': description: Successfully retrieved meeting invites content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/MeetingInvite' meta: $ref: '#/components/schemas/Pagination' '400': description: Bad request - invalid query parameters. content: application/json: schema: $ref: '#/components/schemas/MeetingInviteValidationError' '401': description: Unauthorized - missing or invalid API key. content: application/json: schema: $ref: '#/components/schemas/MeetingInviteError' examples: missingKey: value: error: Missing or invalid API key invalidKey: value: error: Invalid API key '403': description: Forbidden - API key lacks the required permission. content: application/json: schema: $ref: '#/components/schemas/MeetingInviteError' examples: forbidden: value: error: Forbidden '500': description: Server error. content: application/json: schema: $ref: '#/components/schemas/MeetingInviteError' examples: serverError: value: error: Failed to process meeting invite tags: - Meetings operationId: listMeetingInvites x-mint: metadata: title: list meeting invites mcp: enabled: true name: list-meeting-invites description: 'List meeting invites for the authenticated organization, most recent first. Filter by `status` to find invites in a particular lifecycle state — for example `pending` invites that have not joined yet, or `active` invites currently in a call. ' post: summary: Create meeting invite description: 'Invite a persona to join a Google Meet, Zoom, or Microsoft Teams meeting. Provide exactly one of `personaId` for a saved persona, or `personaConfig` for a runtime persona configuration. The runtime persona configuration is used to start the meeting session but is not stored on the meeting invite. The invite is created in `pending` status. `displayName` is normalized to include an AI disclosure suffix before the persona joins the meeting. By default the persona joins immediately. Provide `joinAt` to schedule the join for a future time; scheduling at least 10 minutes ahead reserves the persona a guaranteed place on the call, which is the most reliable way to join meetings that are planned in advance. ' requestBody: description: Meeting URL and persona selection for the invite. required: true content: application/json: examples: savedPersona: $ref: '#/components/examples/MeetingInviteCreateWithPersonaId' runtimePersona: $ref: '#/components/examples/MeetingInviteCreateWithPersonaConfig' scheduledJoin: $ref: '#/components/examples/MeetingInviteCreateScheduled' schema: $ref: '#/components/schemas/CreateMeetingInviteRequest' responses: '201': description: Successfully created meeting invite headers: RateLimit-Limit: description: Maximum create requests allowed per requester per minute. schema: type: string example: '10' RateLimit-Remaining: description: Remaining create requests in the most constrained active window after this request. schema: type: string example: '9' RateLimit-Reset: description: Seconds until the per-minute requester window resets. schema: type: string example: '42' X-RateLimit-Org-Hour-Limit: description: Maximum create requests allowed per organization per hour. schema: type: string example: '30' X-RateLimit-Org-Hour-Remaining: description: Remaining create requests for the organization in the current hour after this request. schema: type: string example: '29' X-RateLimit-Org-Hour-Reset: description: Seconds until the per-hour organization window resets. schema: type: string example: '1800' content: application/json: schema: $ref: '#/components/schemas/MeetingInvite' examples: default: $ref: '#/components/examples/MeetingInviteResponse' '400': description: Bad request - invalid JSON, request validation failed, or an unsupported meeting URL. content: application/json: schema: oneOf: - $ref: '#/components/schemas/MeetingInviteError' - $ref: '#/components/schemas/MeetingInviteValidationError' examples: invalidBody: value: error: Invalid request body unsupportedMeetingUrl: value: error: Only Google Meet, Zoom, and Microsoft Teams URLs are supported invalidJoinAt: value: error: joinAt must be in the future validationError: value: error: Validation error details: - path: personaId message: Provide exactly one of personaId or personaConfig code: custom summary: 'personaId: Provide exactly one of personaId or personaConfig' '401': description: Unauthorized - missing or invalid API key. content: application/json: schema: $ref: '#/components/schemas/MeetingInviteError' examples: missingKey: value: error: Missing or invalid API key invalidKey: value: error: Invalid API key '403': description: Forbidden - API key lacks the required permission, or the saved persona is not available to the authenticated organization. content: application/json: schema: $ref: '#/components/schemas/MeetingInviteError' examples: forbidden: value: error: Forbidden '422': description: Unprocessable Entity - the meeting service rejected the invite (customer-correctable). content: application/json: schema: $ref: '#/components/schemas/MeetingInviteError' examples: providerRejected: value: error: Meeting request was rejected '429': description: Too Many Requests - create invite rate limit exceeded. headers: RateLimit-Limit: description: Maximum create requests allowed per requester per minute. schema: type: string example: '10' RateLimit-Remaining: description: Remaining create requests in the most constrained active window. schema: type: string example: '0' RateLimit-Reset: description: Seconds until the per-minute requester window resets. schema: type: string example: '42' X-RateLimit-Org-Hour-Limit: description: Maximum create requests allowed per organization per hour. schema: type: string example: '30' X-RateLimit-Org-Hour-Remaining: description: Remaining create requests for the organization in the current hour. schema: type: string example: '0' X-RateLimit-Org-Hour-Reset: description: Seconds until the per-hour organization window resets. schema: type: string example: '1800' content: application/json: schema: $ref: '#/components/schemas/MeetingInviteError' examples: rateLimited: value: error: Too many requests '500': description: Server error. content: application/json: schema: $ref: '#/components/schemas/MeetingInviteError' examples: serverError: value: error: Failed to process meeting invite '502': description: Bad Gateway - meeting service is unavailable. content: application/json: schema: $ref: '#/components/schemas/MeetingInviteError' examples: unavailable: value: error: Meeting service is unavailable '503': description: Service Unavailable - meeting invites are disabled, not configured, or temporarily at capacity. Capacity responses include a Retry-After header. headers: Retry-After: description: Seconds to wait before retrying. Only present on capacity responses. schema: type: string example: '30' content: application/json: schema: $ref: '#/components/schemas/MeetingInviteError' examples: disabled: value: error: Meeting invites are not enabled for this organization atCapacity: value: error: Meeting service is at capacity, please try again shortly tags: - Meetings operationId: createMeetingInvite x-mint: metadata: title: create meeting invite mcp: enabled: true name: create-meeting-invite description: 'Invite a persona to join a Google Meet, Zoom, or Microsoft Teams meeting. Provide exactly one of `personaId` for a saved persona, or `personaConfig` for a runtime persona configuration. The runtime persona configuration is used to start the meeting session but is not stored on the meeting invite. The invite is created in `pending` status. `displayName` is normalized to include an AI disclosure suffix before the persona joins the meeting. By default the persona joins immediately. Provide `joinAt` to schedule the join for a future time; scheduling at least 10 minutes ahead reserves the persona a guaranteed place on the call, which is the most reliable way to join meetings that are planned in advance. ' /v1/meetings/invites/{id}: get: summary: Get meeting invite description: Get a meeting invite by ID for the authenticated organization. parameters: - in: path name: id required: true description: Meeting invite ID. schema: type: string format: uuid responses: '200': description: Successfully retrieved meeting invite content: application/json: schema: $ref: '#/components/schemas/MeetingInvite' examples: default: $ref: '#/components/examples/MeetingInviteResponse' '401': description: Unauthorized - missing or invalid API key. content: application/json: schema: $ref: '#/components/schemas/MeetingInviteError' examples: missingKey: value: error: Missing or invalid API key invalidKey: value: error: Invalid API key '403': description: Forbidden - API key lacks the required permission. content: application/json: schema: $ref: '#/components/schemas/MeetingInviteError' examples: forbidden: value: error: Forbidden '404': description: Not Found - meeting invite was not found in the organization. content: application/json: schema: $ref: '#/components/schemas/MeetingInviteError' examples: notFound: value: error: Not found '500': description: Server error. content: application/json: schema: $ref: '#/components/schemas/MeetingInviteError' examples: serverError: value: error: Failed to process meeting invite tags: - Meetings operationId: getMeetingInvite x-mint: metadata: title: get meeting invite mcp: enabled: true name: get-meeting-invite description: Get a meeting invite by ID for the authenticated organization. delete: summary: Cancel meeting invite operationId: cancelMeetingInvite description: 'Cancel a pending meeting invite by ID for the authenticated organization. Cancellation is idempotent for invites that are already `cancelled`, `ended`, or `failed`. A successful cancellation returns no response body. ' parameters: - in: path name: id required: true description: Meeting invite ID. schema: type: string format: uuid responses: '204': description: Successfully cancelled meeting invite. No response body is returned. '401': description: Unauthorized - missing or invalid API key. content: application/json: schema: $ref: '#/components/schemas/MeetingInviteError' examples: missingKey: value: error: Missing or invalid API key invalidKey: value: error: Invalid API key '403': description: Forbidden - API key lacks the required permission. content: application/json: schema: $ref: '#/components/schemas/MeetingInviteError' examples: forbidden: value: error: Forbidden '404': description: Not Found - meeting invite was not found in the organization. content: application/json: schema: $ref: '#/components/schemas/MeetingInviteError' examples: notFound: value: error: Not found '500': description: Server error. content: application/json: schema: $ref: '#/components/schemas/MeetingInviteError' examples: serverError: value: error: Failed to process meeting invite '502': description: Bad Gateway - meeting service is unavailable. content: application/json: schema: $ref: '#/components/schemas/MeetingInviteError' examples: unavailable: value: error: Meeting service is unavailable tags: - Meetings x-mint: metadata: title: cancel meeting invite mcp: enabled: true name: cancel-meeting-invite description: 'Cancel a pending meeting invite by ID for the authenticated organization. Cancellation is idempotent for invites that are already `cancelled`, `ended`, or `failed`. A successful cancellation returns no response body. . Use with caution as this action cannot be undone.' components: schemas: MeetingInviteSessionOptions: type: object description: Optional session-level configuration for the meeting session. properties: sessionReplay: type: object properties: enableSessionReplay: type: boolean example: true ElevenLabsV1VoiceGenerationOptions: title: ElevenLabs V1 type: object description: Voice generation options for ElevenLabs V1 models. properties: stability: type: number description: Controls how stable the generated voice is between each generation, between 0 (more varied/higher emotional range) and 1 (more stable/less emotional range). example: 0.5 minimum: 0 maximum: 1 similarityBoost: type: number description: Controls how close the generated voice is to the original speaker, between 0 (more varied) and 1 (more similar). example: 0 minimum: 0 maximum: 1 speed: type: number description: Controls the speed of the spoken voice as a multiplier, between 0.7 (slower) and 1.2 (faster). example: 1 minimum: 0.7 maximum: 1.2 MeetingInvitePersonaConfig: type: object description: Runtime persona configuration. Include `voiceId` plus `llmId` for a conversational persona. This object cannot include `personaId`. minProperties: 1 not: required: - personaId additionalProperties: true properties: name: type: string example: Cara personaPreset: type: string description: Optional preset used by the session persona. avatarId: type: string format: uuid example: 071b0286-4cce-4808-bee2-e642f1062de3 avatarModel: type: string enum: - cara-2 - cara-3 - cara-4-latest description: Public avatar model version. example: cara-3 voiceId: type: string format: uuid example: de23e340-1416-4dd8-977d-065a7ca11697 voiceSpeed: type: number description: Voice speed multiplier. example: 1 llmId: type: string format: uuid example: a7cf662c-2ace-4de1-a21e-ef0fbf144bb7 systemPrompt: type: string example: You are a helpful assistant. personality: type: string description: Optional personality instructions. maxSessionLengthSeconds: type: number minimum: 1 description: Maximum session duration in seconds. languageCode: type: string description: ISO 639-1 language code override for transcription. example: en metadata: type: object additionalProperties: true description: Developer-defined metadata attached to the session persona. skipGreeting: type: boolean example: false uninterruptibleGreeting: type: boolean description: When true, the greeting message cannot be interrupted by the user. example: false initialMessage: type: - string - 'null' description: Custom first message the persona speaks to open the conversation. zeroDataRetention: type: boolean description: Requests zero data retention where supported by the configured voice and LLM resources. tools: type: array description: Runtime tool definitions available to the persona. For client and webhook tools, the `parameters` (and webhook `queryParameters`) JSON Schema object the LLM fills at call time must serialize to 10,000 bytes or less (UTF-8), otherwise the request is rejected. Use `toolIds` to reference tools pre-created via `/v1/tools`, which are not subject to this inline size limit. items: type: object additionalProperties: true toolIds: type: array description: IDs of pre-created tools available to the persona. items: type: string format: uuid voiceDetectionOptions: $ref: '#/components/schemas/VoiceDetectionOptions' voiceGenerationOptions: description: Configuration options for voice generation. oneOf: - $ref: '#/components/schemas/ElevenLabsV1VoiceGenerationOptions' - $ref: '#/components/schemas/ElevenLabsV2VoiceGenerationOptions' - $ref: '#/components/schemas/CartesiaSonic3VoiceGenerationOptions' VoiceDetectionOptions: type: object description: Options for voice activity detection during user speech input. properties: endOfSpeechSensitivity: type: number description: Sensitivity for detecting end of speech, between 0 (least sensitive) and 1 (most sensitive). example: 0.5 minimum: 0 maximum: 1 silenceBeforeSkipTurnSeconds: type: number description: Duration of silence (in seconds) before the current user turn is skipped. example: 5 minimum: 0 maximum: 900 silenceBeforeSessionEndSeconds: type: number description: Duration of silence (in seconds) before the session is automatically ended. example: 60 minimum: 0 maximum: 7200 silenceBeforeAutoEndTurnSeconds: type: number description: Duration of silence (in seconds) before the user turn is automatically ended. example: 5 minimum: 0.5 maximum: 10 speechEnhancementLevel: type: number description: Level of speech enhancement to apply, 0 (no speech enhancement) 1 (max speech enhancement) example: 0.8 minimum: 0 maximum: 1 CreateMeetingInviteRequest: type: object description: Request body for inviting a persona to a meeting. required: - meetingUrl oneOf: - required: - personaId - required: - personaConfig properties: meetingUrl: type: string description: Google Meet, Zoom, or Microsoft Teams URL to join. URLs without a scheme are normalized to `https://`. example: https://meet.google.com/abc-defg-hij displayName: type: string maxLength: 100 description: Optional display name for the meeting participant. The API appends an AI disclosure suffix when one is not already present. example: Cara region: type: string enum: - eu - us-east - us-west description: Region the persona joins the call from. Pick the region closest to the meeting's participants. When omitted, a region is selected automatically from the requester's location. example: eu regionPolicy: type: string enum: - preferred - strict default: preferred description: How strictly to honor the selected region. `preferred` may serve the invite from another region when the selected region has no capacity or is not currently offered; `strict` never leaves the selected region and returns a capacity error instead. `strict` requires an explicit `region`. example: preferred joinAt: type: string format: date-time description: When the persona should join the meeting (ISO 8601 with timezone). Must be in the future and no more than 7 days ahead. Scheduling at least 10 minutes ahead reserves the persona a guaranteed place on the call; shorter lead times join on time but use on-demand capacity and can be rejected at busy moments. When omitted, the persona joins immediately. example: '2026-07-04T15:00:00Z' groupCall: type: boolean default: true description: Group-call turn-taking. When true (the default) the persona joins silently and only responds when addressed by its display name. Set to false for 1:1 conversations over the meeting infrastructure — the persona then greets on join and responds to everything it hears, like a regular session. example: true personaId: type: string format: uuid description: Saved persona ID to use for the meeting invite. Mutually exclusive with `personaConfig`. example: 00000000-0000-0000-0000-000000000000 personaConfig: allOf: - $ref: '#/components/schemas/MeetingInvitePersonaConfig' description: Runtime persona configuration to use for this invite. Mutually exclusive with `personaId`; it must not include `personaId`. sessionOptions: $ref: '#/components/schemas/MeetingInviteSessionOptions' clientLabel: type: string maxLength: 128 description: Optional label attached to the created session for analytics and debugging. example: calendar-integration Pagination: type: object description: Pagination metadata returned alongside the `data` array of every list endpoint. properties: total: type: integer description: Total number of items across all pages. lastPage: type: integer description: Number of the last page. currentPage: type: integer description: Number of the current page. perPage: type: integer description: Number of items per page. prev: type: - integer - 'null' description: Number of the previous page, or null if on the first page. next: type: - integer - 'null' description: Number of the next page, or null if on the last page. CartesiaSonic3VoiceGenerationOptions: title: Cartesia Sonic-3 type: object description: Voice generation options for Cartesia Sonic-3 models. properties: volume: type: number description: Controls the volume level of the generated voice as a multiplier, between 0.5 (quieter) and 2.0 (louder). example: 1 minimum: 0.5 maximum: 2 speed: type: number description: Controls the speed of the spoken voice as a multiplier, between 0.6 (slower) and 1.5 (faster). example: 1 minimum: 0.6 maximum: 1.5 emotion: type: string description: 'Sets the emotional tone of the generated voice. Supported emotions are: neutral, calm, angry, content, sad, scared.' example: neutral oneOf: - type: string enum: - neutral - calm - angry - content - sad - scared ElevenLabsV2VoiceGenerationOptions: title: ElevenLabs V2 type: object description: Voice generation options for ElevenLabs V2 models. properties: stability: type: number description: Controls how stable the generated voice is between each generation, between 0 (more varied/higher emotional range) and 1 (more stable/less emotional range). example: 0.5 minimum: 0 maximum: 1 similarityBoost: type: number description: Controls how close the generated voice is to the original speaker, between 0 (more varied) and 1 (more similar). example: 0.75 minimum: 0 maximum: 1 style: type: number description: Amplifies the style of the original speaker, between 0 and 1, it is recommended to keep this value low (0) to reduce latency. example: 0 minimum: 0 maximum: 1 useSpeakerBoost: type: boolean description: Whether to use speaker boost for the generated voice, enhancing the similarity to the original speaker. example: true speed: type: number description: Controls the speed of the spoken voice as a multiplier, between 0.7 (slower) and 1.2 (faster). example: 1 minimum: 0.7 maximum: 1.2 model: type: string description: The ElevenLabs model ID to use for voice generation. MeetingInviteError: type: object required: - error properties: error: type: string description: Human-readable error message. MeetingInviteValidationError: type: object required: - error - details - summary properties: error: type: string example: Validation error details: type: array items: type: object required: - path - message - code properties: path: type: string example: personaId message: type: string example: Provide exactly one of personaId or personaConfig code: type: string example: custom summary: type: string example: 'personaId: Provide exactly one of personaId or personaConfig' MeetingInvite: type: object description: A meeting invite created for a persona. required: - id - provider - meetingUrl - displayName - status - createdAt - joinAt - groupCall - sessionId - region - joinState - statusReason properties: id: type: string format: uuid description: Unique identifier for the meeting invite. provider: type: string enum: - google_meet - zoom - microsoft_teams description: Meeting provider inferred from the meeting URL. meetingUrl: type: string format: uri description: Normalized meeting URL. displayName: type: string description: Display name used in the meeting. status: type: string enum: - pending - active - cancelled - ended - failed description: Current invite status. createdAt: type: string format: date-time description: Time the invite was created. joinAt: type: - string - 'null' format: date-time description: Scheduled time the persona joins the meeting, or null when the persona was asked to join immediately. groupCall: type: boolean description: Whether group-call turn-taking is enabled for this invite (respond only when addressed by name; silent join). sessionId: type: - string - 'null' description: Engine session ID once the meeting session has started, otherwise null. region: type: - string - 'null' enum: - eu - us-east - us-west - null description: Region the persona joined the call from. May differ from the requested region when the invite was served by another region for availability. Additional region values may be introduced over time; treat unrecognized values as informational rather than an error. joinState: type: - string - 'null' enum: - joining - waiting_room - in_call - media_denied - media_granted - media_active - left - done - error - null description: Latest observed call-participation detail for the persona, updated asynchronously as the persona connects, waits for admission, joins, and leaves. Null until the first update arrives. Values may be added over time; treat unrecognized values as informational. statusReason: type: - string - 'null' description: Reason attached to a terminal participation state — for example `removed_by_host`, `meeting_ended`, `not_admitted`, `join_denied`, `meeting_link_invalid`, `meeting_not_started`, `idle_timeout`, `left_call`, or `provider_error`. Null while the invite is in progress. Values may be added over time; treat unrecognized values as informational. examples: MeetingInviteCreateWithPersonaId: summary: Invite a saved persona to a Google Meet value: meetingUrl: https://meet.google.com/abc-defg-hij displayName: Cara personaId: 00000000-0000-0000-0000-000000000000 region: eu MeetingInviteResponse: summary: A meeting invite resource value: id: 00000000-0000-0000-0000-000000000000 provider: google_meet meetingUrl: https://meet.google.com/abc-defg-hij displayName: Cara (AI) status: pending createdAt: '2026-04-20T10:00:00.000Z' joinAt: null groupCall: true sessionId: null region: eu joinState: null statusReason: null MeetingInviteCreateWithPersonaConfig: summary: Invite a runtime-configured persona to Zoom value: meetingUrl: https://company.zoom.us/j/123456789?pwd=example displayName: Cara personaConfig: name: Cara avatarId: 071b0286-4cce-4808-bee2-e642f1062de3 voiceId: de23e340-1416-4dd8-977d-065a7ca11697 llmId: a7cf662c-2ace-4de1-a21e-ef0fbf144bb7 systemPrompt: You are a helpful assistant. MeetingInviteCreateScheduled: summary: Schedule a saved persona to join a Google Meet later value: meetingUrl: https://meet.google.com/abc-defg-hij displayName: Cara personaId: 00000000-0000-0000-0000-000000000000 joinAt: '2026-04-20T15:00:00Z' securitySchemes: BearerAuth: type: http scheme: bearer x-mint: mcp: enabled: true