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

> ## Agent Instructions
> Documentazione di dentalspace. Il testo completo, incluso il riferimento API, è in /llms-full.txt. Per endpoint, campi e codici di errore la fonte di verità è openapi.json: non usare endpoint o campi non documentati.

# Specifica OpenAPI 3.1

> Non richiede chiave.

Senza chiave. Generata dagli stessi schemi che validano le richieste.



## OpenAPI

````yaml /openapi.json get /openapi.json
openapi: 3.1.0
info:
  title: DentalSpace API
  version: 1.0.0
  description: >-
    API pubblica di DentalSpace. Ogni richiesta porta `Authorization: Bearer
    <chiave>`

    (`dsk_live_…`, o `dsk_test_…` per una clinica di prova: nessun messaggio
    parte verso l'esterno).

    La chiave vede solo la sua clinica (e le sue sedi, se limitata): una risorsa
    di altri e' sempre 404.


    Errori: `{ "error": { "code", "message", "details", "requestId" } }`; `code`
    e' stabile, `message` no.

    Limiti: 100 richieste ogni 10 secondi e 20.000 al giorno (UTC) per clinica,
    60 e 12.000 per chiave;

    header `X-RateLimit-*` su ogni risposta, `Retry-After` sul 429 (che non
    consuma).

    Elenchi a cursore: `limit` 1-200, `cursor` = il `nextCursor` precedente,
    `updatedSince` per sincronizzare.

    `Idempotency-Key` sulle creazioni: la stessa chiave entro 24 ore ripete la
    prima risposta.
servers:
  - url: https://api.dentalspace.ai/v1
security:
  - bearerAuth: []
tags:
  - name: Meta
  - name: Studio
  - name: Pazienti
  - name: Agenda
  - name: Preventivi
  - name: Fatture e pagamenti
  - name: Documenti
  - name: Attività
  - name: Contatti commerciali
  - name: Messaggi WhatsApp
  - name: Telefonate
  - name: Agente vocale
  - name: Webhook ed eventi
paths:
  /openapi.json:
    get:
      tags:
        - Meta
      summary: Specifica OpenAPI 3.1
      description: |-
        Non richiede chiave.

        Senza chiave. Generata dagli stessi schemi che validano le richieste.
      operationId: getOpenApi
      parameters: []
      responses:
        '200':
          description: La specifica.
          headers:
            X-Request-Id:
              $ref: '#/components/headers/X-Request-Id'
          content:
            application/json:
              schema:
                type: object
                propertyNames:
                  type: string
                additionalProperties: {}
        '500':
          description: 'Codici: `internal_error`.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '503':
          description: 'Codici: `unavailable`.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      security: []
components:
  headers:
    X-Request-Id:
      description: Identificativo della richiesta, da citare all'assistenza.
      schema:
        type: string
  schemas:
    Error:
      type: object
      properties:
        error:
          type: object
          properties:
            code:
              description: Codice stabile, da usare nel codice del client.
              type: string
              enum:
                - invalid_request
                - unauthenticated
                - api_key_invalid
                - api_key_revoked
                - forbidden
                - insufficient_scope
                - organization_suspended
                - plan_required
                - not_found
                - no_availability
                - conflict
                - idempotency_in_progress
                - idempotency_key_reused
                - rate_limited
                - internal_error
                - unavailable
            message:
              description: >-
                Spiegazione per una persona (in italiano). Non confrontarla nel
                codice.
              type: string
            details:
              anyOf:
                - type: object
                  propertyNames:
                    type: string
                  additionalProperties: {}
                - type: 'null'
            requestId:
              description: >-
                Lo stesso valore dell'header X-Request-Id: citalo
                all'assistenza.
              type: string
          required:
            - code
            - message
            - details
            - requestId
          additionalProperties: false
      required:
        - error
      additionalProperties: false
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      bearerFormat: dsk_live_… / dsk_test_…

````

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