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

# Call a web-found business to book

> Has Cal's voice assistant call a business on the user's behalf to book the service, the way Cal.ai does once the user approves. Only a business that `GET /v2/discover/listings/search` returned in `webBusinesses` to this same user in the last 24 hours can be called, with its URL exactly as returned; a Discover listing is never called, because it is booked from its `bookingUrl`. Every check runs before the call: the account may place calls, the business's page offers a US or Canadian appointment phone, the name and service are plain words, the business was not called too recently, and the user's plan covers it. The call is placed by Cal's AI voice assistant, so a user in an organization that opted out of AI cannot place calls. A call that is not placed answers `placed: false` with the `reason`. A refusal spends neither daily limit, except a refusal for calling hours found after Cal set up the call, which keeps that business's count for the day. If dialling fails after the call was started, the user's call is given back when the provider refused the dial, but that business's count for the day is not; a dial whose outcome is unknown counts against both, since the business may have been rung. A placed call answers with `callUrl`, the call's page, where the user follows the call and its outcome. Calls are limited to 5 a day per user, shared across all of the user's API keys and access tokens, and to 10 a day per business across all users. If accessed using an OAuth access token, the `PROFILE_WRITE` scope is required.



## OpenAPI

````yaml /api-reference/v2/openapi.json post /v2/discover/business-calls
openapi: 3.0.0
info:
  title: Cal.com API v2
  description: ''
  version: 1.0.0
  contact: {}
servers: []
security: []
tags: []
paths:
  /v2/discover/business-calls:
    post:
      tags:
        - Discover
      summary: Call a web-found business to book
      description: >-
        Has Cal's voice assistant call a business on the user's behalf to book
        the service, the way Cal.ai does once the user approves. Only a business
        that `GET /v2/discover/listings/search` returned in `webBusinesses` to
        this same user in the last 24 hours can be called, with its URL exactly
        as returned; a Discover listing is never called, because it is booked
        from its `bookingUrl`. Every check runs before the call: the account may
        place calls, the business's page offers a US or Canadian appointment
        phone, the name and service are plain words, the business was not called
        too recently, and the user's plan covers it. The call is placed by Cal's
        AI voice assistant, so a user in an organization that opted out of AI
        cannot place calls. A call that is not placed answers `placed: false`
        with the `reason`. A refusal spends neither daily limit, except a
        refusal for calling hours found after Cal set up the call, which keeps
        that business's count for the day. If dialling fails after the call was
        started, the user's call is given back when the provider refused the
        dial, but that business's count for the day is not; a dial whose outcome
        is unknown counts against both, since the business may have been rung. A
        placed call answers with `callUrl`, the call's page, where the user
        follows the call and its outcome. Calls are limited to 5 a day per user,
        shared across all of the user's API keys and access tokens, and to 10 a
        day per business across all users. If accessed using an OAuth access
        token, the `PROFILE_WRITE` scope is required.
      operationId: DiscoverBusinessCallsController_callBusiness
      parameters:
        - name: Authorization
          in: header
          description: >-
            value must be `Bearer <token>` where `<token>` is api key prefixed
            with cal_, managed user access token, or OAuth access token
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CallDiscoverBusinessInput'
      responses:
        '201':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CallDiscoverBusinessOutputResponseDto'
        '400':
          description: The body is not one the call accepts
        '401':
          description: Unauthenticated
        '403':
          description: Insufficient permissions
        '429':
          description: >-
            Too many calls with this credential, or more than 5 calls today for
            this user across all of their credentials. Retry later.
components:
  schemas:
    CallDiscoverBusinessInput:
      type: object
      properties:
        businessUrl:
          type: string
          maxLength: 2048
          description: >-
            The business's URL, exactly as a `search_listings` web business gave
            it in `webBusinesses[].url`. Only a business found by your own
            search in the last 24 hours can be called.
          example: https://barbers.example/book
        service:
          type: string
          minLength: 1
          maxLength: 120
          description: >-
            What to book, in plain words, such as `upright piano full tuning and
            pitch raise`. Put when the user can come in `timing`, the staff
            member they asked for in `staff` and their booking details in
            `notes`. Never put contact details (phone, email, address) in it.
          example: upright piano full tuning and pitch raise
        timing:
          type: string
          minLength: 1
          maxLength: 120
          description: >-
            When the user can come, in their words, such as `Thursday after 5 or
            Friday morning`. Leave it out when they named no window. Never put
            contact details in it.
          example: Thursday after 5 or Friday morning
        staff:
          type: string
          minLength: 1
          maxLength: 80
          description: >-
            The staff member the user asked for, in their words, such as `Sam`.
            Leave it out when they named none; never take one from the
            business's page.
          example: Sam
        notes:
          type: string
          minLength: 1
          maxLength: 200
          description: >-
            Booking details the user gave for this booking, such as `allergic to
            lavender`. Only what they said, never contact details. Leave it out
            when they gave none.
          example: allergic to lavender
        daysFromToday:
          type: number
          minimum: 0
          maximum: 60
          description: >-
            The day the user asked for, in days from today in their saved time
            zone: 0 today, 1 tomorrow. Cal asks the business for that date.
            Leave it out when the user named no day.
          example: 1
        callerName:
          type: string
          minLength: 1
          maxLength: 80
          description: >-
            The name the user gave for themselves, which Cal gives on the call.
            Leave it out to use the account name; never a name from a search
            result.
          example: Jamie Rivera
      required:
        - businessUrl
        - service
    CallDiscoverBusinessOutputResponseDto:
      type: object
      properties:
        status:
          enum:
            - success
            - error
          type: string
          example: success
        data:
          $ref: '#/components/schemas/CallDiscoverBusinessData'
      required:
        - status
        - data
    CallDiscoverBusinessData:
      type: object
      properties:
        placed:
          type: boolean
          example: true
          description: >-
            Whether Cal is calling the business now. When false, `reason` says
            why.
        callId:
          type: string
          example: call_8f2c1d
          description: The call's id; set when `placed` is true.
        callUrl:
          type: string
          example: https://app.cal.com/discover/call/call_8f2c1d
          description: >-
            The call's page, with its live transcript and outcome, for the user
            to follow; set when `placed` is true.
        reason:
          type: string
          example: The assistant cannot call businesses for this account.
          description: >-
            Why no call was placed, in words to pass on to the user; set when
            `placed` is false. It may name the business's public appointment
            phone for the user to call themselves, never the user's own details.
        signInRequired:
          type: boolean
          enum:
            - true
          description: Set when the user must sign in before Cal can call.
        paymentRequired:
          type: boolean
          enum:
            - true
          description: >-
            Set when the user must pick a Discover plan first; `planUrl` is
            where they pick it.
        planUrl:
          type: string
          example: https://app.cal.com/settings/discover/preferences
          description: Where the user picks a Discover plan; set with `paymentRequired`.
        businessClosed:
          description: >-
            Set when Cal did not call because it is outside the business's
            calling hours. Cal does not schedule calls: tell the user when Cal
            can call, and call again then if they ask.
          allOf:
            - $ref: '#/components/schemas/CallDiscoverBusinessClosedOutput'
      required:
        - placed
    CallDiscoverBusinessClosedOutput:
      type: object
      properties:
        nextCallAt:
          type: string
          nullable: true
          example: '2026-11-13T09:00:00-08:00'
          description: >-
            When Cal can next call the business, in its time zone; null when its
            page lists no time Cal can call in the coming week.
        timeZone:
          type: string
          example: America/Los_Angeles
          description: The time zone the business's hours are read in.
        hoursAssumed:
          type: boolean
          example: false
          description: >-
            True when the business's page publishes no opening hours and Cal
            used its default weekday hours instead.
      required:
        - nextCallAt
        - timeZone
        - hoursAssumed

````

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