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

# Create a booking

> 
Book a call on one of your organization's schedulers. Runs the same
booking pipeline as the public booking page and the Aura dashboard:

- The calendar event is created on the assigned host's calendar and the guest
  receives the standard invite + confirmation email
- The lead is created or updated (matched by organization + guest email)
- Guest reminders, meeting recording, and configured workflows are scheduled
- The `call.booked` webhook fires to all subscribers (single emitter — do
  not expect a second event from this endpoint)

**Host assignment:** by default the booking link's normal host assignment
(round-robin / first-free) applies. Pass `closer_email` to prefer a specific
host — it is resolved server-side against your organization's roster.

**Form answers:** `answers` are validated against the custom fields
`GET /v1/booking-links/{id}/fields` lists for the link — required enabled
fields must be answered, a field listed as `enabled: false` cannot be
answered, and unknown field ids are rejected with 400. Use each field's
`key` as `field_id`. Disqualification rules configured on the link are NOT
evaluated for API-created bookings (matching dashboard host-initiated booking
semantics) — the API caller vouches for the guest.

**Slot validation:** `start_time` must respect link hours and minimum notice.
Aura reserves host capacity and verifies selected conflict calendars plus the
destination immediately before mutation. Personal and unidentified busy events
block the write. Calendar providers do not atomically enforce this check, so an
external calendar edit can still race with the provider mutation.

**Recovery and retries:** send an `Idempotency-Key` header and retain the
returned attempt reference. A confirmed retry returns the committed call. A
request still in flight or an uncertain provider outcome must be investigated
before another create. An error may follow a successful provider write;
persistence failure does not automatically delete that event. An organization
administrator or authorized support can investigate the attempt through the
restricted recovery lookup. Recovery does not automatically backfill bookings.

**Rate limit:** this endpoint is limited to 20 requests/minute per API key,
in addition to the global limits.

**Upstream failures:** if the calendar provider rejects the booking the
request fails with 422 `EXTERNAL_API_ERROR`; if the provider or scheduling
service is degraded it fails with 502 `EXTERNAL_API_ERROR`.

**After the call.** The response here describes a freshly booked call, so its
`has_analysis` is false and `ai_summary` is null. Once the call happens and the
AI review completes, the full review — scores, objection handling, key moments,
call journey and coaching — is available at `GET /v1/calls/{id}/analysis`, and
the `call.analysis_completed` webhook fires with the headline scores.
	

Book a call on one of your organization's schedulers. Runs the same
booking pipeline as the public booking page and the Aura dashboard:

* The calendar event is created on the assigned host's calendar and the guest
  receives the standard invite + confirmation email
* The lead is created or updated (matched by organization + guest email)
* Guest reminders, meeting recording, and configured workflows are scheduled
* The `call.booked` webhook fires to all subscribers (single emitter — do
  not expect a second event from this endpoint)

**Host assignment:** by default the booking link's normal host assignment
(round-robin / first-free) applies. Pass `closer_email` to prefer a specific
host — it is resolved server-side against your organization's roster.

**Form answers:** `answers` are validated against the custom fields
`GET /v1/booking-links/{id}/fields` lists for the link — required enabled
fields must be answered, a field listed as `enabled: false` cannot be
answered, and unknown field ids are rejected with 400. Use each field's
`key` as `field_id`. Disqualification rules configured on the link are NOT
evaluated for API-created bookings (matching dashboard host-initiated booking
semantics) — the API caller vouches for the guest.

**Slot validation:** `start_time` must respect link hours and minimum notice.
Aura reserves host capacity and verifies selected conflict calendars plus the
destination immediately before mutation. Personal and unidentified busy events
block the write. Calendar providers do not atomically enforce this check, so an
external calendar edit can still race with the provider mutation.

**Recovery and retries:** send an `Idempotency-Key` header and retain the
returned attempt reference. A confirmed retry returns the committed call. A
request still in flight or an uncertain provider outcome must be investigated
before another create. An error may follow a successful provider write;
persistence failure does not automatically delete that event. An organization
administrator or authorized support can investigate the attempt through the
restricted recovery lookup. Recovery does not automatically backfill bookings.

**Rate limit:** this endpoint is limited to 20 requests/minute per API key,
in addition to the global limits.

**Upstream failures:** if the calendar provider rejects the booking the
request fails with 422 `EXTERNAL_API_ERROR`; if the provider or scheduling
service is degraded it fails with 502 `EXTERNAL_API_ERROR`.

**After the call.** The response here describes a freshly booked call, so its
`has_analysis` is false and `ai_summary` is null. Once the call happens and the
AI review completes, the full review — scores, objection handling, key moments,
call journey and coaching — is available at `GET /v1/calls/{id}/analysis`, and
the `call.analysis_completed` webhook fires with the headline scores.


## OpenAPI

````yaml openapi.json POST /v1/calls
openapi: 3.1.0
info:
  contact:
    email: support@aura-app.ai
    name: Aura Support
  description: >-
    # Aura Partner Integrations API


    > **Alpha Release** - This API is under active development. Endpoints,
    request/response schemas, and behaviors may change without prior notice. We
    recommend pinning to specific response fields you need and handling unknown
    fields gracefully.


    Enterprise REST API for external partner integrations including

    commission platforms, external mobile apps, and client booking widgets.


    ## MCP Connector


    Aura also exposes a **Model Context Protocol** server at `/mcp` so AI

    assistants (Claude, ChatGPT) can answer questions about a user's own sales
    data.

    If you are building an assistant integration rather than a server-to-server
    one,

    that is almost certainly the surface you want — it is task-shaped ("prep me
    for

    my next call") rather than resource-shaped, and it handles auth per-user.


    Read-only. OAuth 2.1 + PKCE, with Clerk as the authorization server;
    discover it

    from `/.well-known/oauth-protected-resource`. Setup guide:

    https://docs.api.aura-app.ai/mcp-connector


    ## Authentication


    Authenticated endpoints support two authentication methods:


    **1. API Key (for partners and integrations):**

    ```

    Authorization: Bearer aura_pk_live_xxxxxxxxxxxxxxxx

    ```

    Get your API key from the Aura dashboard at Settings > API Keys.


    **2. Clerk JWT (for mobile and web apps):**

    ```

    Authorization: Bearer <clerk_jwt_token>

    ```

    Use Clerk's authentication SDK to obtain a JWT token with org claims.


    ## Rate Limiting


    - **Per API Key:** 100 requests/minute

    - **Per Organization:** 1000 requests/minute


    Rate limit headers are included in all responses:

    - `X-RateLimit-Limit`: Maximum requests allowed

    - `X-RateLimit-Remaining`: Remaining requests in current window

    - `X-RateLimit-Reset`: Unix timestamp when limit resets


    These counters are held per serving instance, so under concurrency the

    effective ceiling is higher than the number above and the headers describe
    one

    instance's view rather than a global total. Treat a 429 as backpressure to
    obey

    and pace your client to the documented rate — but do not rely on us to
    reject

    your 101st request, and do not derive a global remaining-quota figure from
    the

    headers. The limit may become globally enforced without notice, so a client

    that stays within it will not be affected when that happens.


    ## Pagination


    List endpoints support cursor-based pagination:

    - `limit`: Number of results per page (default: 50, max: 100)

    - `cursor`: Opaque cursor for next page


    ## Error Handling


    All errors follow a standard format:


    ```json

    {
      "success": false,
      "error": "Error message",
      "code": "ERROR_CODE"
    }

    ```


    Common HTTP status codes:

    - **400** Bad Request - Invalid input (`VALIDATION_ERROR`)

    - **401** Unauthorized - Missing or invalid API key (`AUTHENTICATION_ERROR`)

    - **402** Payment Required - The key is valid, but the organization's
    subscription is not active (`PAYMENT_REQUIRED`). Every authenticated
    endpoint can return this. Retrying will not help until the account's payment
    method is updated in Aura; surface it to the account owner rather than
    treating it as an auth failure.

    - **403** Forbidden - Insufficient permissions (`AUTHORIZATION_ERROR`)

    - **404** Not Found - Resource not found (`NOT_FOUND`)

    - **409** Conflict - Resource state prevents the operation (`CONFLICT`)

    - **413** Payload Too Large - Request body exceeds 256KB
    (`PAYLOAD_TOO_LARGE`)

    - **429** Too Many Requests - Rate limit exceeded (`RATE_LIMIT_EXCEEDED`)

    - **500** Internal Server Error - Server error (`INTERNAL_ERROR`)


    ## Webhooks


    Subscribe to real-time events using the Webhooks API. All webhook payloads

    are signed with HMAC-SHA256 for security verification.


    Delivery is at-least-once. Every payload carries an `idempotency_key` that

    is stable across retries of the same event, so you can enforce exactly-once

    with a `(subscription_id, idempotency_key)` unique constraint on your side.


    For full documentation, visit
    [docs.aura-app.ai/api](https://docs.aura-app.ai/api)
  license:
    name: Proprietary
  title: Aura Partner Integrations API
  version: 1.0.0-alpha
servers:
  - description: Production
    url: https://api.aura-app.ai
  - description: Staging
    url: https://staging-api.aura-app.ai
  - description: Local Development
    url: http://localhost:3001
security:
  - bearerAuth: []
tags:
  - description: Lead management operations
    name: Leads
  - description: Call booking and management
    name: Calls
  - description: Booking link configuration (read-only)
    name: Booking Links
  - description: Product catalog (read-only)
    name: Products
  - description: Payment tracking (read-only)
    name: Payments
  - description: Public booking creation
    name: Bookings
  - description: Real-time event subscriptions and webhook management
    name: Webhooks
  - description: >-
      Team member information for commission attribution. **Alpha** - schema may
      change without notice.
    name: Team (Alpha)
  - description: >-
      Dashboard analytics, lead source attribution, and objection analysis.
      **Alpha** - schema may change without notice.
    name: Analytics (Alpha)
  - description: System endpoints (health checks)
    name: System
paths:
  /v1/calls:
    post:
      tags:
        - Calls
      summary: Create a booking
      description: "\nBook a call on one of your organization's schedulers. Runs the same\nbooking pipeline as the public booking page and the Aura dashboard:\n\n- The calendar event is created on the assigned host's calendar and the guest\n  receives the standard invite + confirmation email\n- The lead is created or updated (matched by organization + guest email)\n- Guest reminders, meeting recording, and configured workflows are scheduled\n- The `call.booked` webhook fires to all subscribers (single emitter — do\n  not expect a second event from this endpoint)\n\n**Host assignment:** by default the booking link's normal host assignment\n(round-robin / first-free) applies. Pass `closer_email` to prefer a specific\nhost — it is resolved server-side against your organization's roster.\n\n**Form answers:** `answers` are validated against the custom fields\n`GET /v1/booking-links/{id}/fields` lists for the link — required enabled\nfields must be answered, a field listed as `enabled: false` cannot be\nanswered, and unknown field ids are rejected with 400. Use each field's\n`key` as `field_id`. Disqualification rules configured on the link are NOT\nevaluated for API-created bookings (matching dashboard host-initiated booking\nsemantics) — the API caller vouches for the guest.\n\n**Slot validation:** `start_time` must respect link hours and minimum notice.\nAura reserves host capacity and verifies selected conflict calendars plus the\ndestination immediately before mutation. Personal and unidentified busy events\nblock the write. Calendar providers do not atomically enforce this check, so an\nexternal calendar edit can still race with the provider mutation.\n\n**Recovery and retries:** send an `Idempotency-Key` header and retain the\nreturned attempt reference. A confirmed retry returns the committed call. A\nrequest still in flight or an uncertain provider outcome must be investigated\nbefore another create. An error may follow a successful provider write;\npersistence failure does not automatically delete that event. An organization\nadministrator or authorized support can investigate the attempt through the\nrestricted recovery lookup. Recovery does not automatically backfill bookings.\n\n**Rate limit:** this endpoint is limited to 20 requests/minute per API key,\nin addition to the global limits.\n\n**Upstream failures:** if the calendar provider rejects the booking the\nrequest fails with 422 `EXTERNAL_API_ERROR`; if the provider or scheduling\nservice is degraded it fails with 502 `EXTERNAL_API_ERROR`.\n\n**After the call.** The response here describes a freshly booked call, so its\n`has_analysis` is false and `ai_summary` is null. Once the call happens and the\nAI review completes, the full review — scores, objection handling, key moments,\ncall journey and coaching — is available at `GET /v1/calls/{id}/analysis`, and\nthe `call.analysis_completed` webhook fires with the headline scores.\n\t"
      parameters:
        - description: >-
            Optional retry key scoped to your organization. Reuse the same key
            and request body when retrying one create. Use a new key for a
            different create. A completed request returns the existing resource;
            a request still in progress returns 409.
          in: header
          name: Idempotency-Key
          required: false
          schema:
            description: >-
              Optional retry key scoped to your organization. Reuse the same key
              and request body when retrying one create. Use a new key for a
              different create. A completed request returns the existing
              resource; a request still in progress returns 409.
            example: 8f3a1c2e-3b9d-4f5a-9c7e-1a2b3c4d5e6f
            type: string
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateCallBody'
        required: true
      responses:
        '201':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CallCreatedResponse'
          description: >-
            Booking created (or idempotent replay of a prior create). When its
            details could not be read back, `data` carries `details_pending:
            true` and the id to read them from.
        '400':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          description: >-
            Validation failed (past start_time, invalid timezone, unknown or
            missing form answers)
        '401':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          description: Invalid or missing API key
        '402':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MiddlewareErrorResponse'
          description: The organization's subscription is not active
          headers:
            X-Request-Id:
              description: Request identifier for support
              schema:
                type: string
        '403':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MiddlewareErrorResponse'
          description: The API key does not have the required scope
          headers:
            X-Request-Id:
              description: Request identifier for support
              schema:
                type: string
        '404':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          description: Booking link not found (or inactive)
        '408':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MiddlewareErrorResponse'
          description: >-
            The request exceeded its processing time limit. Check the outcome
            before retrying a write
          headers:
            X-Request-Id:
              description: Request identifier for support
              schema:
                type: string
        '409':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          description: >-
            Slot unavailable (SLOT_UNAVAILABLE) or Idempotency-Key still in
            flight (CONFLICT)
        '413':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MiddlewareErrorResponse'
          description: The request body exceeds 256KB
          headers:
            X-Request-Id:
              description: Request identifier for support
              schema:
                type: string
        '422':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          description: Upstream calendar provider rejected the booking request
        '429':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          description: Rate limit exceeded (20 requests/minute per API key)
        '500':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MiddlewareErrorResponse'
          description: >-
            Unexpected server failure. Include the request identifier when
            contacting support
          headers:
            X-Request-Id:
              description: Request identifier for support
              schema:
                type: string
        '502':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          description: Upstream calendar service temporarily unavailable
      security:
        - bearerAuth: []
components:
  schemas:
    CreateCallBody:
      properties:
        answers:
          description: >-
            Answers to the scheduler's custom form fields. Required fields must
            be answered; unknown field ids are rejected with 400.
            Disqualification rules configured on the link are NOT evaluated for
            API-created bookings (matching dashboard host-initiated booking
            semantics).
          items:
            properties:
              field_id:
                description: The key of a custom field on GET /v1/booking-links/:id/fields
                example: budget
                minLength: 1
                type: string
              value:
                description: Answer value
                example: 10k-50k
                type: string
            required:
              - field_id
              - value
            type: object
          type: array
        booking_link_id:
          description: Scheduler to book against (must be active)
          example: 850e8400-e29b-41d4-a716-446655440003
          type: string
        closer_email:
          description: >-
            Preferred host, by email. Resolved server-side against the
            organization's roster (no internal user IDs needed). When omitted,
            the scheduler's normal host assignment (round-robin / first-free)
            applies.
          example: closer@acme.com
          format: email
          type: string
        end_time:
          description: >-
            Slot end. When omitted, derived from the scheduler's configured
            duration.
          example: '2026-08-01T15:30:00Z'
          format: date-time
          type: string
        guest:
          description: The prospect being booked
          properties:
            email:
              description: Guest email. The lead is upserted by (organization, email).
              example: ada@example.com
              format: email
              type: string
            name:
              description: Guest full name
              example: Ada Lovelace
              maxLength: 255
              minLength: 1
              type: string
            phone:
              description: Guest phone number
              example: +49 151 23456789
              maxLength: 50
              type: string
          required:
            - name
            - email
          type: object
        start_time:
          description: >-
            Slot start as an ISO-8601 datetime (UTC or with offset). Must be in
            the future and respect the scheduler's minimum notice.
          example: '2026-08-01T15:00:00Z'
          format: date-time
          type: string
        timezone:
          description: >-
            IANA timezone for the guest (e.g. Europe/Berlin). Defaults to the
            scheduler's timezone.
          example: Europe/Berlin
          type: string
        utm_campaign:
          maxLength: 255
          type: string
        utm_content:
          maxLength: 255
          type: string
        utm_medium:
          maxLength: 255
          type: string
        utm_source:
          description: 'Attribution: UTM source recorded on the call and lead'
          maxLength: 255
          type: string
        utm_term:
          maxLength: 255
          type: string
      required:
        - booking_link_id
        - start_time
        - guest
      type: object
    CallCreatedResponse:
      properties:
        data:
          anyOf:
            - $ref: '#/components/schemas/Call'
            - $ref: '#/components/schemas/CallDetailsPending'
        success:
          enum:
            - true
          type: boolean
      required:
        - success
        - data
      type: object
    ErrorResponse:
      properties:
        code:
          description: Error code for programmatic handling
          example: NOT_FOUND
          type: string
        error:
          description: Human-readable error message
          example: Lead not found
          type: string
        requestId:
          description: Request ID for support debugging
          example: req_abc123
          type: string
        success:
          enum:
            - false
          type: boolean
      required:
        - success
        - error
        - code
      type: object
    MiddlewareErrorResponse:
      properties:
        code:
          type: string
        error:
          type: string
        requestId:
          type: string
        success:
          enum:
            - false
          type: boolean
      required:
        - success
        - error
        - code
      type: object
    Call:
      properties:
        action_items:
          description: >-
            Action items extracted from the call by the AI analysis pipeline,
            one sentence per item (e.g. "Send the proposal by Friday"). Null
            when analysis hasn't run.
          example:
            - Send proposal with detailed timeline
            - Book the technical demo
          items:
            type: string
          nullable: true
          type: array
        ai_summary:
          description: >-
            AI-generated summary of the call, from its AI review: the same text
            Zapier and the funnel `call.ai_review_complete` webhook send. The
            `call.analysis_completed` webhook does not carry it, so read it here
            once that fires. Null until the review completes. A call imported
            with a summary of its own returns that until it is reviewed.
            Responses to writes made with an API key that lacks the `read` scope
            leave the review out.
          nullable: true
          type: string
        attribution:
          $ref: '#/components/schemas/PublicAttribution'
        booking_link_id:
          description: Scheduler used for this call
          example: 850e8400-e29b-41d4-a716-446655440003
          nullable: true
          type: string
        calendar_attempt_id:
          description: Recovery reference for this calendar mutation
          format: uuid
          type: string
        calendar_outcome:
          enum:
            - committed
            - uncertain
          type: string
        call_kind:
          description: >-
            Type of call record: 'booking' for scheduled calls, 'intent' for
            pre-booking visitor tracking
          enum:
            - booking
            - intent
          example: booking
          type: string
        call_stage:
          description: >-
            Stage relative to the lead's meeting history: 'first' until the lead
            has attended a meeting (rebooks after a no-show stay 'first'),
            'follow_up' once an earlier call of the lead counts as a show.
            Re-derived when sibling call statuses change.
          enum:
            - first
            - follow_up
          example: first
          type: string
        closer_id:
          description: Assigned closer/sales rep ID (Clerk user ID)
          example: user_2abc123xyz
          nullable: true
          pattern: ^user_[A-Za-z0-9]+$
          type: string
        conferencing_link:
          description: Video conferencing URL
          example: https://zoom.us/j/123456789
          nullable: true
          type: string
        created_at:
          description: When the call was created
          example: '2026-01-17T08:00:00Z'
          format: date-time
          type: string
        duration_minutes:
          description: Call duration in minutes
          example: 45
          nullable: true
          type: number
        ended_at:
          description: When the call ended
          format: date-time
          nullable: true
          type: string
        expected_deal_value:
          description: >-
            Expected deal value in DOLLARS, with up to two decimal places.
            Backed by a numeric(12,2) column — the same unit as payment amounts
            and the /v1/analytics/* revenue figures.
          example: 5000
          nullable: true
          type: number
        form_answers:
          description: >-
            Normalized custom-question answers, with booking-link labels. Empty
            array when no custom answers exist.
          items:
            $ref: '#/components/schemas/CallAnswer'
          type: array
        form_data:
          $ref: '#/components/schemas/CallFormData'
        guest_rsvp_confirmed_at:
          description: >-
            Timestamp when the guest first confirmed attendance (RSVP changed to
            'yes'). Null if never confirmed.
          format: date-time
          nullable: true
          type: string
        guest_rsvp_status:
          description: >-
            Guest's calendar RSVP status (yes, no, maybe, noreply). Indicates
            whether the guest confirmed attendance via their calendar provider.
          example: 'yes'
          nullable: true
          type: string
        has_analysis:
          description: >-
            Whether the AI review has finished for this call. When true, `GET
            /v1/calls/{id}/analysis` returns the full review — scores, detected
            objections with handling feedback, key moments, the stage-by-stage
            call journey, and coaching. When false that endpoint returns 404;
            subscribe to the `call.analysis_completed` webhook to be told the
            moment it becomes available, rather than polling. Always false on
            responses to writes made with an API key that lacks the `read`
            scope.
          type: boolean
        has_recording:
          description: Whether a recording is available for this call
          type: boolean
        id:
          description: Unique identifier for the call
          example: 550e8400-e29b-41d4-a716-446655440000
          type: string
        lead_id:
          description: Associated lead ID
          example: 650e8400-e29b-41d4-a716-446655440001
          type: string
        linked_payment_id:
          description: Payment linked to this call
          nullable: true
          type: string
        notes:
          description: Notes from the call
          nullable: true
          type: string
        old_event_left_on_calendar:
          description: >-
            Present and true when a reschedule moved the call but the calendar
            provider kept the old event. Delete it from the host's calendar.
          type: boolean
        product_id:
          description: Product associated with this call
          example: 950e8400-e29b-41d4-a716-446655440004
          nullable: true
          type: string
        recording_url:
          description: URL to the call recording (if available)
          nullable: true
          type: string
        referral:
          description: >-
            Referral/affiliate identifier (e.g., partner_abc). Separate from
            utm_source for dedicated affiliate/partner tracking.
          nullable: true
          type: string
        scheduled_at:
          description: >-
            Scheduled date/time of the booked call. For intent calls this is a
            tracking placeholder, not a meeting time
          example: '2026-01-20T15:00:00Z'
          format: date-time
          type: string
        setter_id:
          description: Assigned setter/appointment setter ID (Clerk user ID)
          example: user_2def456uvw
          nullable: true
          pattern: ^user_[A-Za-z0-9]+$
          type: string
        started_at:
          description: When the call actually started
          format: date-time
          nullable: true
          type: string
        status:
          description: >-
            Call status (shown, no_show, cancelled, rescheduled, closed, lost,
            follow_up, declined)
          example: closed
          nullable: true
          type: string
        transcript_data:
          $ref: '#/components/schemas/TranscriptData'
        updated_at:
          description: When the call was last updated
          example: '2026-01-17T09:30:00Z'
          format: date-time
          type: string
        utm_campaign:
          description: >-
            UTM campaign parameter — identifies the specific marketing campaign
            or initiative
          example: summer_promo
          nullable: true
          type: string
        utm_content:
          description: >-
            UTM content parameter — differentiates ad creatives or A/B test
            variants within the same campaign
          nullable: true
          type: string
        utm_medium:
          description: >-
            UTM medium parameter — identifies the marketing channel type (e.g.,
            cpc, email, social, organic)
          example: cpc
          nullable: true
          type: string
        utm_source:
          description: >-
            UTM source parameter — identifies the traffic platform (e.g.,
            google, facebook, twitter). Captured from the booking page URL.
          example: google
          nullable: true
          type: string
        utm_term:
          description: >-
            UTM term parameter — paid search keywords or targeting criteria for
            granular attribution
          nullable: true
          type: string
      required:
        - id
        - call_kind
        - call_stage
        - lead_id
        - closer_id
        - setter_id
        - booking_link_id
        - product_id
        - scheduled_at
        - started_at
        - ended_at
        - duration_minutes
        - status
        - conferencing_link
        - expected_deal_value
        - linked_payment_id
        - ai_summary
        - action_items
        - form_answers
        - form_data
        - notes
        - recording_url
        - has_recording
        - has_analysis
        - utm_source
        - utm_medium
        - utm_campaign
        - utm_term
        - utm_content
        - referral
        - attribution
        - guest_rsvp_status
        - guest_rsvp_confirmed_at
        - transcript_data
        - created_at
        - updated_at
      type: object
    CallDetailsPending:
      properties:
        calendar_attempt_id:
          format: uuid
          type: string
        calendar_outcome:
          enum:
            - committed
          type: string
        details_pending:
          description: >-
            The booking was made, but its details could not be read in this
            request. Read them with GET /v1/calls/{id}. Do not book it again.
          enum:
            - true
          type: boolean
        id:
          type: string
      required:
        - id
        - calendar_outcome
        - details_pending
      type: object
    PublicAttribution:
      additionalProperties:
        maxLength: 500
        minLength: 1
        type: string
      description: >-
        Flat map of every attribution parameter the record carried, returned
        under its own name. Known and provider-specific keys share one object.
        New keys may appear without a contract version change.
      example:
        am_wuid: wuid_4o251b0b130v3z6d5q0n
        fbclid: IwAR_sample_fbclid
        utm_source: facebook
      nullable: true
      properties:
        attribution_platform:
          maxLength: 500
          minLength: 1
          type: string
        city:
          maxLength: 500
          minLength: 1
          type: string
        country:
          maxLength: 500
          minLength: 1
          type: string
        country_code:
          maxLength: 500
          minLength: 1
          type: string
        epik:
          maxLength: 500
          minLength: 1
          type: string
        fbc:
          maxLength: 500
          minLength: 1
          type: string
        fbclid:
          maxLength: 500
          minLength: 1
          type: string
        fbp:
          maxLength: 500
          minLength: 1
          type: string
        gbraid:
          maxLength: 500
          minLength: 1
          type: string
        gclid:
          maxLength: 500
          minLength: 1
          type: string
        hyclid:
          maxLength: 500
          minLength: 1
          type: string
        landing_page:
          maxLength: 500
          minLength: 1
          type: string
        li_fat_id:
          maxLength: 500
          minLength: 1
          type: string
        msclkid:
          maxLength: 500
          minLength: 1
          type: string
        rdt_cid:
          maxLength: 500
          minLength: 1
          type: string
        referrer:
          maxLength: 500
          minLength: 1
          type: string
        region:
          maxLength: 500
          minLength: 1
          type: string
        sc_cid:
          maxLength: 500
          minLength: 1
          type: string
        ttclid:
          maxLength: 500
          minLength: 1
          type: string
        twclid:
          maxLength: 500
          minLength: 1
          type: string
        utm_campaign:
          maxLength: 500
          minLength: 1
          type: string
        utm_content:
          maxLength: 500
          minLength: 1
          type: string
        utm_id:
          maxLength: 500
          minLength: 1
          type: string
        utm_medium:
          maxLength: 500
          minLength: 1
          type: string
        utm_source:
          maxLength: 500
          minLength: 1
          type: string
        utm_term:
          maxLength: 500
          minLength: 1
          type: string
        wbraid:
          maxLength: 500
          minLength: 1
          type: string
      type: object
    CallAnswer:
      properties:
        field_id:
          description: >-
            Field identifier, matches the key of a field on GET
            /v1/booking-links/:id/fields when the call was booked through a
            link.
          example: field_1718000000000
          type: string
        label:
          description: >-
            Question text, enriched from the scheduler's field schema when
            available.
          example: What is your monthly revenue?
          type: string
        type:
          description: >-
            Input type of the answered field (text, select, checkbox, number)
            when recorded. Omitted for legacy v1.0 flat form data.
          example: select
          type: string
        value:
          anyOf:
            - type: string
            - items:
                type: string
              type: array
            - type: boolean
          description: >-
            The booker's answer. Multi-select answers are string arrays;
            checkboxes are booleans; everything else is stringified.
          example: $10k-$50k
      required:
        - field_id
        - label
        - value
      type: object
    CallFormData:
      anyOf:
        - $ref: '#/components/schemas/FormDataArray'
        - additionalProperties:
            nullable: true
          type: object
        - nullable: true
      description: >-
        Form data submitted during booking (prequalification answers). Ordered
        array of FormDataField entries with field_id, label, and value. Internal
        fields prefixed with `__` (such as the `__disqualification` record) are
        not included; why a lead was disqualified is on the lead's
        `disqualification_data`.
    TranscriptData:
      additionalProperties:
        nullable: true
      description: >-
        Full AI transcript with time-coded segments + detected language + total
        duration. See the TranscriptData schema for the full shape. Null when
        the call has not been transcribed.
      nullable: true
      properties:
        duration_seconds:
          description: Total transcribed duration.
          nullable: true
          type: number
        language:
          description: >-
            Detected language code (BCP-47, e.g. 'en'). Null if not yet
            inferred.
          nullable: true
          type: string
        segments:
          description: Time-coded utterances.
          items:
            $ref: '#/components/schemas/TranscriptSegment'
          type: array
      required:
        - segments
      type: object
    FormDataArray:
      description: Ordered array of form fields captured during the booking flow.
      items:
        $ref: '#/components/schemas/FormDataField'
      type: array
    TranscriptSegment:
      additionalProperties:
        nullable: true
      properties:
        end_seconds:
          description: End offset in seconds from the call start.
          nullable: true
          type: number
        speaker:
          description: >-
            Speaker label (e.g. 'closer', 'lead', or a name). Null when speaker
            diarization is unavailable.
          nullable: true
          type: string
        start_seconds:
          description: Start offset in seconds from the call start.
          nullable: true
          type: number
        text:
          description: Utterance text.
          type: string
      required:
        - text
      type: object
    FormDataField:
      additionalProperties:
        nullable: true
      properties:
        field_id:
          description: >-
            The key of the question on the scheduler. Internal fields prefixed
            with `__` (e.g. `__disqualification`) are not partner-visible.
          example: budget
          type: string
        label:
          description: Human-readable label as shown to the lead at capture time.
          example: What is your budget?
          type: string
        value:
          description: >-
            The value the lead entered. String / number / boolean / object
            depending on the field type.
          nullable: true
      required:
        - field_id
        - label
      type: object

````

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