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

# Créer un rendez-vous

> Crée un nouveau rendez-vous pour un patient.
Utilisez d'abord `/appointments/available-slots` pour vérifier la disponibilité.

**Permission requise :** `APPOINTMENT_CREATE`




## OpenAPI

````yaml openapi.yaml post /appointments
openapi: 3.1.0
info:
  title: Veto Public API
  description: >
    API publique de la plateforme vétérinaire Veto, destinée aux intégrations
    partenaires.


    ## Authentification


    Toutes les requêtes doivent inclure une clé API via le header `X-API-Key`.

    Les clés sont créées et configurées par l'administrateur de la clinique.


    ```

    X-API-Key: vk_votre_cle_ici

    ```


    ## Niveaux d'accès


    Chaque clé API est configurée avec un niveau d'accès qui détermine la
    visibilité des champs dans les réponses :


    | Niveau | Description |

    |--------|-------------|

    | **BASIC** | Identifiants et informations minimales (noms, espèces,
    statuts) |

    | **STANDARD** | Informations métier courantes (contacts, dates, montants) |

    | **FULL** | Toutes les informations disponibles |


    Le niveau peut être défini globalement ou par ressource. Par exemple, une
    clé peut avoir un accès FULL sur les patients mais BASIC sur les clients.


    ## Rate Limiting


    Chaque clé est soumise à une limite de requêtes par heure (par défaut :
    1000).

    En cas de dépassement, l'API retourne `429 Too Many Requests` avec un header
    `Retry-After`.


    ## Permissions


    La clé API détermine quels endpoints sont accessibles. Les permissions
    disponibles sont :


    | Permission | Accès |

    |------------|-------|

    | `PATIENT_READ` | Lecture des patients |

    | `CLIENT_READ` | Lecture des clients |

    | `APPOINTMENT_READ` | Lecture des rendez-vous, créneaux, types |

    | `APPOINTMENT_CREATE` | Création de rendez-vous |

    | `CONSULTATION_READ` | Lecture des consultations |

    | `INVOICE_READ` | Lecture des factures |

    | `STOCK_READ` | Lecture du stock |
  version: 1.0.0
  contact:
    name: Support API Veto
servers:
  - url: https://api.treats.vet/api/v1
    description: Production
security:
  - apiKeyAuth: []
tags:
  - name: Patients
    description: Animaux enregistrés dans la clinique
  - name: Clients
    description: Propriétaires des animaux
  - name: Rendez-vous
    description: Prise et consultation de rendez-vous
  - name: Consultations
    description: Comptes-rendus de consultations vétérinaires
  - name: Factures
    description: Factures et suivi financier
  - name: Stock
    description: Inventaire et niveaux de stock
paths:
  /appointments:
    post:
      tags:
        - Rendez-vous
      summary: Créer un rendez-vous
      description: >
        Crée un nouveau rendez-vous pour un patient.

        Utilisez d'abord `/appointments/available-slots` pour vérifier la
        disponibilité.


        **Permission requise :** `APPOINTMENT_CREATE`
      operationId: createAppointment
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateAppointmentRequest'
            example:
              clientId: 550e8400-e29b-41d4-a716-446655440000
              patientId: 6ba7b810-9dad-11d1-80b4-00c04fd430c8
              vetId: 7c9e6679-7425-40de-944b-e07fc1f90ae7
              appointmentTypeId: a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11
              scheduledAt: '2026-02-15T10:00:00Z'
              reason: Vaccination annuelle
      responses:
        '201':
          description: Rendez-vous créé
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Appointment'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '409':
          description: Conflit - créneau déjà occupé
        '429':
          $ref: '#/components/responses/RateLimited'
components:
  schemas:
    CreateAppointmentRequest:
      type: object
      required:
        - clientId
        - patientId
        - vetId
        - scheduledAt
      properties:
        clientId:
          type: string
          format: uuid
          description: Identifiant du propriétaire
        patientId:
          type: string
          format: uuid
          description: Identifiant de l'animal
        appointmentTypeId:
          type: string
          format: uuid
          description: Type de rendez-vous (obtenu via `/appointments/types`)
        vetId:
          type: string
          format: uuid
          description: Vétérinaire souhaité
        scheduledAt:
          type: string
          format: date-time
          description: >-
            Date et heure souhaitées (vérifier via
            `/appointments/available-slots`)
        reason:
          type: string
          description: Motif de la visite
        isUrgent:
          type: boolean
          default: false
          description: Rendez-vous urgent
    Appointment:
      type: object
      description: Rendez-vous à la clinique
      properties:
        id:
          type: string
          format: uuid
        clientId:
          type: string
          format: uuid
          description: Propriétaire
        patientId:
          type: string
          format: uuid
          description: Animal concerné
        appointmentTypeId:
          type: string
          format: uuid
          description: Type de rendez-vous
        vetId:
          type: string
          format: uuid
          description: Vétérinaire assigné
        scheduledAt:
          type: string
          format: date-time
          description: Date et heure prévues
        endTime:
          type: string
          format: date-time
          description: Heure de fin prévue
        reason:
          type: string
          description: Motif du rendez-vous
        isUrgent:
          type: boolean
        status:
          type: string
          description: Statut actuel du rendez-vous
        displayStatus:
          type: string
          description: Statut affiché (libellé)
        createdAt:
          type: string
          format: date-time
  responses:
    Unauthorized:
      description: Clé API manquante, invalide ou expirée
      content:
        application/json:
          schema:
            type: object
            properties:
              message:
                type: string
                example: Invalid or expired API key
    RateLimited:
      description: Limite de requêtes dépassée
      headers:
        Retry-After:
          schema:
            type: integer
          description: Secondes avant réinitialisation de la limite
        X-RateLimit-Limit:
          schema:
            type: integer
          description: Nombre maximum de requêtes par heure
        X-RateLimit-Remaining:
          schema:
            type: integer
          description: Requêtes restantes dans la fenêtre courante
      content:
        application/json:
          schema:
            type: object
            properties:
              message:
                type: string
                example: Rate limit exceeded. Please try again later.
              retryAfter:
                type: integer
  securitySchemes:
    apiKeyAuth:
      type: apiKey
      in: header
      name: X-API-Key
      description: |
        Clé API fournie par l'administrateur de la clinique.
        Format : `vk_...`

````