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

# List bookable services

> Every service an appointment can be booked into, with the professionals
on it and the appointment types it offers.

Discovery for the booking endpoint: it returns exactly the ids and names
*Book an appointment* accepts, so you never have to guess a spelling.



## OpenAPI

````yaml GET /api/v2/public/calendar/services
openapi: 3.1.0
info:
  title: Dialtu Public API
  version: '2.0'
  description: >-
    Programmatic access to your Dialtu account: schedule AI voice calls, create
    contacts, push leads into Salesflow pipelines, book calendar appointments
    and read WhatsApp conversation history.


    Every request is authenticated with an API key created in the dashboard
    under **Settings → API Keys**, sent as `Authorization: Bearer pk_...`.
servers:
  - url: https://api.dialtu.com
    description: Production
  - url: https://api.stg.dialtu.com
    description: Staging
security:
  - ApiKeyBearer: []
tags:
  - name: Calls
    description: Schedule outbound AI voice calls.
  - name: Clients
    description: Create contacts in your account.
  - name: Salesflow
    description: Push leads into a pipeline through an API input node.
  - name: Salesflow pipelines
    description: Read a pipeline's stages and add, move or remove clients.
  - name: Calendar
    description: Check bookable capacity, book appointments and manage waiting lists.
  - name: WhatsApp
    description: Read-only conversation history and transcripts.
paths:
  /api/v2/public/calendar/services:
    get:
      tags:
        - Calendar
      summary: List bookable services
      description: |-
        Every service an appointment can be booked into, with the professionals
        on it and the appointment types it offers.

        Discovery for the booking endpoint: it returns exactly the ids and names
        *Book an appointment* accepts, so you never have to guess a spelling.
      operationId: listCalendarServices
      parameters: []
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PublicCalendarServiceListResponse'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PublicCalendarErrorResponse'
        '401':
          description: Missing, malformed or revoked API key.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DetailErrorResponse'
              examples:
                missing_header:
                  summary: No Authorization header
                  value:
                    detail: Unauthorized
                invalid_key:
                  summary: Unknown or revoked key
                  value:
                    detail: Invalid or expired API key. Please check your credentials.
        '409':
          description: Conflict
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PublicCalendarErrorResponse'
        '422':
          description: >-
            Unprocessable Content — or the request did not match the documented
            schema.
          content:
            application/json:
              schema:
                oneOf:
                  - $ref: '#/components/schemas/PublicCalendarErrorResponse'
                  - $ref: '#/components/schemas/RequestValidationError'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PublicCalendarErrorResponse'
      security:
        - ApiKeyBearer: []
components:
  schemas:
    PublicCalendarServiceListResponse:
      description: Response of *List bookable services*.
      properties:
        status:
          default: success
          description: Always `success`.
          title: Status
          type: string
        data:
          description: Bookable services.
          items:
            $ref: '#/components/schemas/PublicCalendarServiceSchema'
          title: Data
          type: array
      required:
        - data
      title: PublicCalendarServiceListResponse
      type: object
    PublicCalendarErrorResponse:
      description: Error envelope shared by every public calendar endpoint.
      properties:
        status:
          const: error
          default: error
          description: Always `error`.
          title: Status
          type: string
        error_code:
          description: Machine-readable error code; branch on this, never on `message`.
          title: Error Code
          type: string
        message:
          description: Human-readable explanation.
          title: Message
          type: string
        details:
          anyOf:
            - {}
            - type: 'null'
          description: Extra context, e.g. `valid_service_names` or the offending `field`.
          title: Details
      required:
        - error_code
        - message
      title: PublicCalendarErrorResponse
      type: object
    DetailErrorResponse:
      description: 'Plain error body: `{"detail": "..."}`. No `error_code` is included.'
      properties:
        detail:
          description: Human-readable reason for the failure.
          title: Detail
          type: string
      required:
        - detail
      title: DetailErrorResponse
      type: object
    RequestValidationError:
      title: RequestValidationError
      type: object
      description: >-
        Returned when the request body, query string or path could not be parsed
        against the documented schema. Fix the listed fields and retry.
      properties:
        detail:
          type: array
          title: Detail
          description: One entry per invalid field.
          items:
            $ref: '#/components/schemas/RequestValidationErrorItem'
      required:
        - detail
    PublicCalendarServiceSchema:
      description: A bookable service with the people and appointment types it offers.
      properties:
        id:
          description: Service ID (use as `service_id`).
          title: Id
          type: integer
        name:
          description: Service name (use as `service_name`).
          title: Name
          type: string
        default_duration_minutes:
          description: Default appointment length in minutes.
          title: Default Duration Minutes
          type: integer
        professionals:
          description: Active professionals on the service.
          items:
            $ref: '#/components/schemas/PublicCalendarProfessionalSchema'
          title: Professionals
          type: array
        event_types:
          description: Appointment types the service offers.
          items:
            $ref: '#/components/schemas/PublicCalendarEventTypeSchema'
          title: Event Types
          type: array
      required:
        - id
        - name
        - default_duration_minutes
        - professionals
        - event_types
      title: PublicCalendarServiceSchema
      type: object
    RequestValidationErrorItem:
      title: RequestValidationErrorItem
      type: object
      properties:
        loc:
          type: array
          title: Loc
          description: >-
            Where the problem is: the first element is `body`, `query` or
            `path`, followed by the field path.
          items:
            anyOf:
              - type: string
              - type: integer
        msg:
          type: string
          title: Msg
          description: What is wrong with the value.
        type:
          type: string
          title: Type
          description: >-
            Machine-readable validation error type, e.g. `missing` or
            `int_parsing`.
      required:
        - loc
        - msg
        - type
    PublicCalendarProfessionalSchema:
      description: A professional who can be booked on a service.
      properties:
        id:
          description: Professional ID (use as `professional_id`).
          title: Id
          type: integer
        name:
          description: Full name (use as `professional_name`).
          title: Name
          type: string
      required:
        - id
        - name
      title: PublicCalendarProfessionalSchema
      type: object
    PublicCalendarEventTypeSchema:
      description: An appointment format offered by a service.
      properties:
        id:
          description: Appointment type ID (use as `event_type_id`).
          title: Id
          type: integer
        name:
          description: Name, e.g. `In-Person` (use as `event_type_name`).
          title: Name
          type: string
      required:
        - id
        - name
      title: PublicCalendarEventTypeSchema
      type: object
  securitySchemes:
    ApiKeyBearer:
      type: http
      scheme: bearer
      bearerFormat: pk_...
      description: >-
        API key created in the dashboard under **Settings → API Keys**. Send it
        as `Authorization: Bearer pk_...`.

````