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

# Atualizar agendamento

> Atualiza só os campos enviados: remarcar (`start_at`/`end_at`), trocar profissional, procedimento, sala ou tecnologia, ou mudar o status (`scheduled`, `confirmed`, `completed`, `cancelled`, `no_show`).

Mudar o status atualiza a sessão e o retorno (recall) ligados ao agendamento. Todo id informado precisa ser da clínica da chave (senão `422`).

🔴 Na clínica com o **Pix antecipado** ligado, `confirmed` significa "pagou": mudar para `confirmed` um agendamento que exige Pix e não pagou devolve `409`. Sessão de pacote já vendido, procedimento de valor zero e agendamento criado antes de a opção ser ligada não exigem Pix.

Escopo: `scheduling:write`.



## OpenAPI

````yaml https://api.controleclinic.com.br/v1/openapi.json patch /v1/scheduling/appointments/{id}
openapi: 3.0.0
info:
  title: Controle Clinic API
  version: v1
  description: >-
    API de automações e integrações externas do Controle Clinic. Conecte n8n,
    CRMs, ERPs e chatbots à sua clínica.


    ## Comece aqui

    1. Crie a chave em **Configurações → Clínica → Integrações → Tokens de
    API**. Marque só os escopos de que precisa e defina uma validade.

    2. Envie a chave no cabeçalho `X-API-Key` em toda chamada. Para testar por
    aqui, cole a chave no cartão **Sua chave**.

    3. Limite: **60 chamadas por minuto** por chave (plano pro). Os cabeçalhos
    `X-RateLimit-Limit`, `X-RateLimit-Remaining` e `X-RateLimit-Reset` mostram o
    saldo; acima do limite a resposta é `429`.

    4. Toda chamada fica registrada em **Logs de Auditoria**, na mesma tela dos
    tokens.


    ## Integração contínua × migração

    Esta API serve para um sistema externo criar e atualizar pacientes e
    agendamentos **daqui para a frente**.

    Para trazer o **histórico** de outro sistema (pacientes, prontuário, agenda
    passada, financeiro), use a **Central de Migração**, com o time de
    implantação: ela tem prévia, de-para e desfazer, que a API não tem.


    ## Erros comuns a todas as rotas

    - `400` corpo ou parâmetro inválido (o corpo diz qual campo)

    - `401` chave ausente, inválida, revogada ou vencida

    - `403` escopo insuficiente ou clínica com acesso suspenso

    - `429` limite de chamadas

    - `500` erro interno — tente de novo mais tarde; se repetir, abra chamado
    informando o horário


    ⚠️ As rotas `POST`, `PATCH` e `DELETE` gravam **de verdade** na clínica dona
    da chave, inclusive pelo botão de teste desta página.
servers:
  - url: https://api.controleclinic.com.br
    description: Produção
security: []
tags:
  - name: Agendamentos
    description: >-
      **Para agendar um paciente:**

      1. `GET /v1/scheduling/professionals`, `/procedures`, `/rooms` e
      `/technologies` — pegue os `id` (eles não mudam; guarde no seu sistema).

      2. `POST /v1/scheduling/patients` com nome, CPF e telefone. Se voltar
      `409`, o paciente já existe: use `existing.id`.

      3. `POST /v1/scheduling/appointments` com `patient_id`, `professional_id`,
      `start_at` e `end_at`.

      4. Para confirmar, cancelar ou remarcar: `PATCH
      /v1/scheduling/appointments/{id}`.


      Datas em ISO 8601 **com fuso**: `2026-11-10T14:00:00-03:00`. Sem fuso, o
      horário é lido como UTC e aparece 3 horas adiantado na agenda.
  - name: Lookup
    description: >-
      Cadastros da clínica que um agendamento referencia: profissionais,
      procedimentos, salas e tecnologias. Só leitura; traz apenas os ativos.
  - name: Sistema
    description: >-
      Conferência da conexão (`/health`, sem chave) e da chave em uso (`/me`:
      escopos, validade e clínica).
  - name: Pacientes
    description: >-
      Cadastro de pacientes da clínica da chave. A API não apaga paciente. Sem
      `sensitive:read`, CPF, telefone, e-mail e nascimento saem mascarados.
  - name: Financeiro
    description: >-
      Leitura do financeiro da clínica dona da chave (escopo `financial:read`).
      **Nenhuma rota escreve.**


      Toda resposta traz `regime` (`competencia`, `caixa`, `vencimento` ou
      `saldo`): somar números de regimes diferentes dá um total sem sentido
      (ex.: entradas de caixa não são faturamento).


      Nome, CPF, `patient_id` e descrições só existem na resposta com o escopo
      `sensitive:read` (sem ele, o campo não vem, nem como `null`). O nome do
      fornecedor das despesas sai com `sensitive:read` ou `financial:suppliers`.


      Não há rotas de escrita no financeiro. Para trazer receitas e despesas de
      outro sistema, use a **Central de Migração** ou o importador de receitas,
      com o time de implantação.
paths:
  /v1/scheduling/appointments/{id}:
    patch:
      tags:
        - Agendamentos
      summary: Atualizar agendamento
      description: >-
        Atualiza só os campos enviados: remarcar (`start_at`/`end_at`), trocar
        profissional, procedimento, sala ou tecnologia, ou mudar o status
        (`scheduled`, `confirmed`, `completed`, `cancelled`, `no_show`).


        Mudar o status atualiza a sessão e o retorno (recall) ligados ao
        agendamento. Todo id informado precisa ser da clínica da chave (senão
        `422`).


        🔴 Na clínica com o **Pix antecipado** ligado, `confirmed` significa
        "pagou": mudar para `confirmed` um agendamento que exige Pix e não pagou
        devolve `409`. Sessão de pacote já vendido, procedimento de valor zero e
        agendamento criado antes de a opção ser ligada não exigem Pix.


        Escopo: `scheduling:write`.
      parameters:
        - schema:
            type: string
            format: uuid
          required: true
          name: id
          in: path
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                status:
                  type: string
                  enum:
                    - scheduled
                    - confirmed
                    - completed
                    - cancelled
                    - no_show
                notes:
                  type: string
                professional_id:
                  type: string
                  format: uuid
                procedure_id:
                  type: string
                  format: uuid
                start_at:
                  type: string
                end_at:
                  type: string
                room_id:
                  type: string
                  format: uuid
                technology_id:
                  type: string
                  format: uuid
              example:
                status: confirmed
      responses:
        '200':
          description: Agendamento atualizado
          content:
            application/json:
              schema:
                type: object
                properties:
                  id:
                    type: string
                    format: uuid
                  clinic_id:
                    type: string
                    format: uuid
                  patient_id:
                    type: string
                    format: uuid
                  professional_id:
                    type: string
                    nullable: true
                    format: uuid
                  procedure_id:
                    type: string
                    nullable: true
                    format: uuid
                  start_at:
                    type: string
                  end_at:
                    type: string
                  status:
                    type: string
                    enum:
                      - scheduled
                      - confirmed
                      - completed
                      - cancelled
                      - no_show
                  notes:
                    type: string
                    nullable: true
                  room_id:
                    type: string
                    nullable: true
                    format: uuid
                  technology_id:
                    type: string
                    nullable: true
                    format: uuid
                  session_id:
                    type: string
                    nullable: true
                    format: uuid
                  origem:
                    type: string
                    nullable: true
                    enum:
                      - importacao
                  created_at:
                    type: string
                  updated_at:
                    type: string
                required:
                  - id
                  - clinic_id
                  - patient_id
                  - professional_id
                  - procedure_id
                  - start_at
                  - end_at
                  - status
                  - notes
                  - room_id
                  - technology_id
                  - session_id
                  - origem
                  - created_at
                  - updated_at
        '400':
          description: Corpo ou parâmetro inválido (o corpo diz qual campo)
          content:
            application/json:
              schema:
                type: object
                properties:
                  success:
                    type: boolean
                    enum:
                      - false
                  error:
                    nullable: true
                required:
                  - success
        '401':
          description: Chave ausente, inválida, revogada ou vencida
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
                required:
                  - error
        '403':
          description: Escopo insuficiente
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
                    enum:
                      - Insufficient scope
                required:
                  - error
        '404':
          description: Não encontrado
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
                    enum:
                      - Not found
                required:
                  - error
        '409':
          description: Conflito de horário, ou `confirmed` recusado pelo Pix antecipado
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
                  message:
                    type: string
                required:
                  - error
                  - message
        '422':
          description: Algum id informado não existe nesta clínica (`field` diz qual)
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
                    enum:
                      - Invalid reference
                  field:
                    type: string
                  message:
                    type: string
                required:
                  - error
                  - field
                  - message
        '429':
          description: >-
            Limite de chamadas excedido (60/min por chave no plano pro) — veja
            os cabeçalhos X-RateLimit-*
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
                required:
                  - error
        '500':
          description: Erro interno
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
                required:
                  - error
      security:
        - ApiKeyAuth: []
components:
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: X-API-Key
      description: >-
        Token de API no formato cc_live_<64 chars hex>. Obtido em Minha Clínica
        → Integrações.

````

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