{"openapi":"3.1.0","info":{"title":"API da Westhetics","version":"1.0.0","description":"A API pública da Westhetics: pacientes, anamneses, contratos e assinaturas da clínica, com eventos por webhook. Autentique com a chave do app (`Authorization: Bearer wx_…`), criada pela gestora em Integrações, ou com o token OAuth da pessoa. Respostas em JSON, mensagens em pt-BR. Guias em https://docs.westhetics.io.","contact":{"name":"Westhetics","url":"https://docs.westhetics.io","email":"suporte@westhetics.com.br"}},"servers":[{"url":"https://api.westhetics.io","description":"Produção"}],"security":[{"apiKey":[]},{"oauth2":[]}],"tags":[{"name":"Conta","description":"Quem chama e a clínica."},{"name":"Pacientes","description":"O cadastro da paciente."},{"name":"Anamneses","description":"Enviar, acompanhar e ler a anamnese."},{"name":"Catálogo","description":"Procedimentos, prestadores e modelos."},{"name":"Contratos e assinaturas","description":"Gerar o contrato e os termos e enviar para assinatura."},{"name":"Eventos","description":"O que aconteceu na clínica, por consulta ou por webhook."},{"name":"Webhooks","description":"Os endereços que recebem os eventos do app."}],"paths":{"/v1/me":{"get":{"operationId":"getMe","x-mint":{"href":"/api-reference/conta/quem-esta-chamando"},"tags":["Conta"],"summary":"Quem está chamando","description":"Devolve o app (com os escopos) ou a pessoa conectada pelo OAuth, e a clínica. Use para testar a chave.\n\n**Escopo:** qualquer app; pelo OAuth, o perfil da pessoa.","parameters":[],"responses":{"200":{"description":"Sucesso.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Me"}},"required":["data"]},"example":{"data":{"type":"integration","integration":{"id":"8d3e2f1a-0b9c-4d7e-a6f5-4e3d2c1b0a99","name":"CRM da clínica","description":"Cadastro e funil de vendas","scopes":["patients:write","anamneses:write","documents:write","catalog:read","webhooks:write"],"keyPrefix":"1c0a58f5","createdAt":"2026-10-15T14:30:00Z"},"user":null,"role":null,"clinic":{"id":"2b7f0a3c-5d1e-4c8a-9f60-1a2b3c4d5e6f","name":"Clínica Aurora","legalName":"Aurora Estética Ltda.","timezone":"America/Sao_Paulo"}}}}}},"401":{"description":"Sem chave, chave que não confere, revogada ou token vencido.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"O app não tem o escopo, ou a pessoa não pode pelo perfil.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Passou de 100 chamadas por minuto; veja `Retry-After`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/patients":{"get":{"operationId":"listPatients","x-mint":{"href":"/api-reference/pacientes/listar-pacientes"},"tags":["Pacientes"],"summary":"Listar pacientes","description":"As fichas da clínica em ordem de atualização. Com `updatedSince`, só o que mudou depois do instante: o jeito de sincronizar. `search` busca por nome, e-mail, CPF, RG ou WhatsApp.\n\n**Escopo do app:** `patients:read`. Pelo OAuth, vale o perfil da pessoa.","parameters":[{"name":"limit","in":"query","required":false,"schema":{"default":25,"description":"Itens por página, de 1 a 100.","type":"integer","minimum":1,"maximum":100},"description":"Itens por página, de 1 a 100."},{"name":"cursor","in":"query","required":false,"schema":{"type":"string","minLength":1,"maxLength":400,"description":"O `nextCursor` da página anterior."},"description":"O `nextCursor` da página anterior."},{"name":"search","in":"query","required":false,"schema":{"type":"string","minLength":1,"maxLength":120}},{"name":"status","in":"query","required":false,"schema":{"type":"string","enum":["active","archived","merged"]}},{"name":"updatedSince","in":"query","required":false,"schema":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$","description":"Só o que mudou a partir deste instante (ISO 8601): o jeito de sincronizar."},"description":"Só o que mudou a partir deste instante (ISO 8601): o jeito de sincronizar."}],"responses":{"200":{"description":"Sucesso.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Patient"}},"meta":{"$ref":"#/components/schemas/PageMeta"}},"required":["data","meta"]},"example":{"data":[{"id":"f47ac10b-58cc-4372-a567-0e02b2c3d479","audience":"patient","status":"active","name":"Amanda Ribeiro Costa","birthDate":"1992-04-18","isMinor":false,"docType":"cpf","docNumber":"44595830890","foreignDocument":null,"rg":null,"gender":"female","maritalStatus":"married","occupation":"Arquiteta","email":"amanda@email.com","whatsapp":"+5511987654321","address":{"postalCode":"01310100","street":"Avenida Paulista","number":"1000","complement":"apto 52","district":"Bela Vista","city":"São Paulo","state":"SP","country":"BR"},"guardian":null,"imageConsent":"yes","instagram":"amanda.ribeiro","referralSource":{"channel":"instagram","detail":null},"notes":null,"patientSince":"2026-10-15","selfRegisteredAt":null,"mergedIntoId":null,"createdAt":"2026-10-15T14:30:00Z","updatedAt":"2026-10-15T14:30:00Z","archivedAt":null}],"meta":{"limit":25,"nextCursor":null}}}}},"400":{"description":"O corpo não é JSON, ou falta o que a rota precisa.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Sem chave, chave que não confere, revogada ou token vencido.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"O app não tem o escopo, ou a pessoa não pode pelo perfil.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Dado que não passa na regra; `fields` traz a mensagem de cada campo.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Passou de 100 chamadas por minuto; veja `Retry-After`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"createPatient","x-mint":{"href":"/api-reference/pacientes/criar-paciente"},"tags":["Pacientes"],"summary":"Criar paciente","description":"Cria a ficha com as regras do cadastro da clínica: nome, WhatsApp e e-mail são obrigatórios; quem tem menos de 18 anos vem com o responsável legal; CPF com dígito; documento estrangeiro para quem não tem CPF. CPF repetido é 409 com o id da ficha que já existe.\n\n**Escopo do app:** `patients:write`. Pelo OAuth, vale o perfil da pessoa.","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Um uuid. A mesma chave nas 24 horas devolve a mesma resposta, sem repetir o efeito; com outro corpo, ou enquanto a primeira chamada ainda roda, 409. A resposta repetida não traz o segredo do webhook.","schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1},"whatsapp":{"type":"string","minLength":1},"dialCode":{"type":"string","pattern":"^\\+[0-9]{1,3}$"},"audience":{"anyOf":[{"type":"string","enum":["patient","student","employee","third_party"]},{"type":"null"}]},"email":{"type":"string","minLength":1},"birthDate":{"anyOf":[{"type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"},{"type":"null"}]},"docNumber":{"type":["string","null"]},"docType":{"anyOf":[{"type":"string","enum":["cnpj","cpf"]},{"type":"null"}]},"foreignDocument":{"anyOf":[{"type":"object","properties":{"type":{"type":"string","enum":["passport","rne","crnm","other"]},"number":{"type":"string","minLength":1,"pattern":"^[A-Z0-9]{4,20}$"},"country":{"type":"string","pattern":"^[A-Z]{2}$"}},"required":["type","number","country"]},{"type":"null"}]},"rg":{"type":["string","null"]},"gender":{"anyOf":[{"type":"string","enum":["female","male","other","not_provided"]},{"type":"null"}]},"maritalStatus":{"anyOf":[{"type":"string","enum":["single","married","domestic_partnership","separated","divorced","widowed"]},{"type":"null"}]},"occupation":{"type":["string","null"]},"address":{"anyOf":[{"type":"object","properties":{"postalCode":{"type":"string"},"street":{"type":"string","minLength":2,"maxLength":120},"number":{"type":"string","minLength":1,"maxLength":10},"complement":{"type":["string","null"]},"district":{"type":"string","minLength":2,"maxLength":80},"city":{"type":"string","minLength":2,"maxLength":80},"state":{"type":"string"},"country":{"default":"BR","type":"string","pattern":"^[A-Z]{2}$"}},"required":["postalCode","street","number","district","city","state"]},{"type":"null"}]},"guardian":{"anyOf":[{"type":"object","properties":{"name":{"type":"string","minLength":2,"maxLength":120},"docType":{"anyOf":[{"type":"string","const":"cpf"},{"type":"null"}]},"docNumber":{"type":"string"},"whatsapp":{"type":"string"}},"required":["name","docNumber","whatsapp"]},{"type":"null"}]},"imageConsent":{"anyOf":[{"type":"string","enum":["yes","no","not_provided"]},{"type":"null"}]},"instagram":{"anyOf":[{"type":"string","pattern":"^[A-Za-z0-9._]{1,30}$"},{"type":"null"}]},"notes":{"type":["string","null"]},"referralSource":{"anyOf":[{"type":"object","properties":{"channel":{"type":"string","enum":["referral","social_media","instagram","google","ad","website","storefront","event","other"]},"detail":{"type":["string","null"]}},"required":["channel"]},{"type":"null"}]},"identity":{"anyOf":[{"type":"object","properties":{"prefillId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"emailGrantId":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]}},"required":["prefillId"]},{"type":"null"}]}},"required":["name","whatsapp","email"]},"example":{"name":"Amanda Ribeiro Costa","whatsapp":"11987654321","email":"amanda@email.com","birthDate":"1992-04-18","docNumber":"44595830890"}}}},"responses":{"201":{"description":"Criado.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Patient"}},"required":["data"]},"example":{"data":{"id":"f47ac10b-58cc-4372-a567-0e02b2c3d479","audience":"patient","status":"active","name":"Amanda Ribeiro Costa","birthDate":"1992-04-18","isMinor":false,"docType":"cpf","docNumber":"44595830890","foreignDocument":null,"rg":null,"gender":"female","maritalStatus":"married","occupation":"Arquiteta","email":"amanda@email.com","whatsapp":"+5511987654321","address":{"postalCode":"01310100","street":"Avenida Paulista","number":"1000","complement":"apto 52","district":"Bela Vista","city":"São Paulo","state":"SP","country":"BR"},"guardian":null,"imageConsent":"yes","instagram":"amanda.ribeiro","referralSource":{"channel":"instagram","detail":null},"notes":null,"patientSince":"2026-10-15","selfRegisteredAt":null,"mergedIntoId":null,"createdAt":"2026-10-15T14:30:00Z","updatedAt":"2026-10-15T14:30:00Z","archivedAt":null}}}}},"400":{"description":"O corpo não é JSON, ou falta o que a rota precisa.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Sem chave, chave que não confere, revogada ou token vencido.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"O app não tem o escopo, ou a pessoa não pode pelo perfil.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Não existe nesta clínica.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Conflito com o estado atual (já existe, já enviado, outra alteração chegou antes, ou a mesma Idempotency-Key ainda em andamento).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Dado que não passa na regra; `fields` traz a mensagem de cada campo.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Passou de 100 chamadas por minuto; veja `Retry-After`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/patients/{id}":{"get":{"operationId":"getPatient","x-mint":{"href":"/api-reference/pacientes/ler-paciente"},"tags":["Pacientes"],"summary":"Ler paciente","description":"O cadastro inteiro da paciente nesta clínica.\n\n**Escopo do app:** `patients:read`. Pelo OAuth, vale o perfil da pessoa.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Sucesso.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Patient"}},"required":["data"]},"example":{"data":{"id":"f47ac10b-58cc-4372-a567-0e02b2c3d479","audience":"patient","status":"active","name":"Amanda Ribeiro Costa","birthDate":"1992-04-18","isMinor":false,"docType":"cpf","docNumber":"44595830890","foreignDocument":null,"rg":null,"gender":"female","maritalStatus":"married","occupation":"Arquiteta","email":"amanda@email.com","whatsapp":"+5511987654321","address":{"postalCode":"01310100","street":"Avenida Paulista","number":"1000","complement":"apto 52","district":"Bela Vista","city":"São Paulo","state":"SP","country":"BR"},"guardian":null,"imageConsent":"yes","instagram":"amanda.ribeiro","referralSource":{"channel":"instagram","detail":null},"notes":null,"patientSince":"2026-10-15","selfRegisteredAt":null,"mergedIntoId":null,"createdAt":"2026-10-15T14:30:00Z","updatedAt":"2026-10-15T14:30:00Z","archivedAt":null}}}}},"401":{"description":"Sem chave, chave que não confere, revogada ou token vencido.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"O app não tem o escopo, ou a pessoa não pode pelo perfil.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Não existe nesta clínica.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Passou de 100 chamadas por minuto; veja `Retry-After`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"patch":{"operationId":"updatePatient","x-mint":{"href":"/api-reference/pacientes/editar-paciente"},"tags":["Pacientes"],"summary":"Editar paciente","description":"Muda só os campos enviados. Campo ausente fica como está; `null` limpa.\n\n**Escopo do app:** `patients:write`. Pelo OAuth, vale o perfil da pessoa.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1},"whatsapp":{"type":"string","minLength":1},"dialCode":{"type":"string","pattern":"^\\+[0-9]{1,3}$"},"audience":{"anyOf":[{"type":"string","enum":["patient","student","employee","third_party"]},{"type":"null"}]},"email":{"type":"string","minLength":1},"birthDate":{"anyOf":[{"type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"},{"type":"null"}]},"docNumber":{"type":["string","null"]},"docType":{"anyOf":[{"type":"string","enum":["cnpj","cpf"]},{"type":"null"}]},"foreignDocument":{"anyOf":[{"type":"object","properties":{"type":{"type":"string","enum":["passport","rne","crnm","other"]},"number":{"type":"string","minLength":1,"pattern":"^[A-Z0-9]{4,20}$"},"country":{"type":"string","pattern":"^[A-Z]{2}$"}},"required":["type","number","country"]},{"type":"null"}]},"rg":{"type":["string","null"]},"gender":{"anyOf":[{"type":"string","enum":["female","male","other","not_provided"]},{"type":"null"}]},"maritalStatus":{"anyOf":[{"type":"string","enum":["single","married","domestic_partnership","separated","divorced","widowed"]},{"type":"null"}]},"occupation":{"type":["string","null"]},"address":{"anyOf":[{"type":"object","properties":{"postalCode":{"type":"string"},"street":{"type":"string","minLength":2,"maxLength":120},"number":{"type":"string","minLength":1,"maxLength":10},"complement":{"type":["string","null"]},"district":{"type":"string","minLength":2,"maxLength":80},"city":{"type":"string","minLength":2,"maxLength":80},"state":{"type":"string"},"country":{"default":"BR","type":"string","pattern":"^[A-Z]{2}$"}},"required":["postalCode","street","number","district","city","state"]},{"type":"null"}]},"guardian":{"anyOf":[{"type":"object","properties":{"name":{"type":"string","minLength":2,"maxLength":120},"docType":{"anyOf":[{"type":"string","const":"cpf"},{"type":"null"}]},"docNumber":{"type":"string"},"whatsapp":{"type":"string"}},"required":["name","docNumber","whatsapp"]},{"type":"null"}]},"imageConsent":{"anyOf":[{"type":"string","enum":["yes","no","not_provided"]},{"type":"null"}]},"instagram":{"anyOf":[{"type":"string","pattern":"^[A-Za-z0-9._]{1,30}$"},{"type":"null"}]},"notes":{"type":["string","null"]},"referralSource":{"anyOf":[{"type":"object","properties":{"channel":{"type":"string","enum":["referral","social_media","instagram","google","ad","website","storefront","event","other"]},"detail":{"type":["string","null"]}},"required":["channel"]},{"type":"null"}]}}},"example":{"email":"amanda.costa@email.com","occupation":"Arquiteta"}}}},"responses":{"200":{"description":"Sucesso.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Patient"}},"required":["data"]},"example":{"data":{"id":"f47ac10b-58cc-4372-a567-0e02b2c3d479","audience":"patient","status":"active","name":"Amanda Ribeiro Costa","birthDate":"1992-04-18","isMinor":false,"docType":"cpf","docNumber":"44595830890","foreignDocument":null,"rg":null,"gender":"female","maritalStatus":"married","occupation":"Arquiteta","email":"amanda@email.com","whatsapp":"+5511987654321","address":{"postalCode":"01310100","street":"Avenida Paulista","number":"1000","complement":"apto 52","district":"Bela Vista","city":"São Paulo","state":"SP","country":"BR"},"guardian":null,"imageConsent":"yes","instagram":"amanda.ribeiro","referralSource":{"channel":"instagram","detail":null},"notes":null,"patientSince":"2026-10-15","selfRegisteredAt":null,"mergedIntoId":null,"createdAt":"2026-10-15T14:30:00Z","updatedAt":"2026-10-15T14:30:00Z","archivedAt":null}}}}},"400":{"description":"O corpo não é JSON, ou falta o que a rota precisa.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Sem chave, chave que não confere, revogada ou token vencido.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"O app não tem o escopo, ou a pessoa não pode pelo perfil.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Não existe nesta clínica.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Conflito com o estado atual (já existe, já enviado, outra alteração chegou antes, ou a mesma Idempotency-Key ainda em andamento).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Dado que não passa na regra; `fields` traz a mensagem de cada campo.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Passou de 100 chamadas por minuto; veja `Retry-After`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/anamneses":{"get":{"operationId":"listAnamneses","x-mint":{"href":"/api-reference/anamneses/listar-anamneses"},"tags":["Anamneses"],"summary":"Listar anamneses","description":"As anamneses enviadas, sem as respostas, em ordem de atualização.\n\n**Escopo do app:** `anamneses:read`. Pelo OAuth, vale o perfil da pessoa.","parameters":[{"name":"limit","in":"query","required":false,"schema":{"default":25,"description":"Itens por página, de 1 a 100.","type":"integer","minimum":1,"maximum":100},"description":"Itens por página, de 1 a 100."},{"name":"cursor","in":"query","required":false,"schema":{"type":"string","minLength":1,"maxLength":400,"description":"O `nextCursor` da página anterior."},"description":"O `nextCursor` da página anterior."},{"name":"patientId","in":"query","required":false,"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},{"name":"status","in":"query","required":false,"schema":{"type":"string","enum":["issued","in_progress","completed","canceled","expired"]}},{"name":"updatedSince","in":"query","required":false,"schema":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$","description":"Só o que mudou a partir deste instante (ISO 8601): o jeito de sincronizar."},"description":"Só o que mudou a partir deste instante (ISO 8601): o jeito de sincronizar."}],"responses":{"200":{"description":"Sucesso.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Anamnesis"}},"meta":{"$ref":"#/components/schemas/PageMeta"}},"required":["data","meta"]},"example":{"data":[{"id":"5e1d2c3b-4a59-4687-b6a5-948372615049","patientId":"f47ac10b-58cc-4372-a567-0e02b2c3d479","status":"issued","channel":"link","procedure":{"id":"b8e2c4d6-1f3a-4b5c-8d7e-9f0a1b2c3d4e","name":"Preenchimento labial"},"practitioner":{"id":"7c1d9e2f-3a4b-4c5d-8e6f-7a8b9c0d1e2f","name":"Ana Oliveira"},"link":{"issuedAt":"2026-10-15T14:30:00Z","expiresAt":"2026-10-22T14:30:00Z","resendCount":0},"startedAt":null,"completedAt":null,"protocolNumber":null,"contentHash":null,"canceledAt":null,"cancellationReason":null,"isImported":false,"createdAt":"2026-10-15T14:30:00Z","updatedAt":"2026-10-15T14:30:00Z"}],"meta":{"limit":25,"nextCursor":null}}}}},"400":{"description":"O corpo não é JSON, ou falta o que a rota precisa.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Sem chave, chave que não confere, revogada ou token vencido.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"O app não tem o escopo, ou a pessoa não pode pelo perfil.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Dado que não passa na regra; `fields` traz a mensagem de cada campo.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Passou de 100 chamadas por minuto; veja `Retry-After`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"sendAnamnesis","x-mint":{"href":"/api-reference/anamneses/enviar-anamnese"},"tags":["Anamneses"],"summary":"Enviar anamnese","description":"Envia a anamnese à paciente por WhatsApp, e-mail, os dois, ou só gera o link (`link`) para o seu sistema mandar. A resposta traz a URL do link, válido por 7 dias. Uma anamnese aberta por paciente: a segunda é 409.\n\n**Escopo do app:** `anamneses:write`. Pelo OAuth, vale o perfil da pessoa.","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Um uuid. A mesma chave nas 24 horas devolve a mesma resposta, sem repetir o efeito; com outro corpo, ou enquanto a primeira chamada ainda roda, 409. A resposta repetida não traz o segredo do webhook.","schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"patientId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"channel":{"type":"string","enum":["whatsapp","email","both","link"]},"procedureId":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"practitionerId":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]}},"required":["patientId","channel"]},"example":{"patientId":"f47ac10b-58cc-4372-a567-0e02b2c3d479","channel":"link","procedureId":"b8e2c4d6-1f3a-4b5c-8d7e-9f0a1b2c3d4e"}}}},"responses":{"201":{"description":"Criado.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/SentAnamnesis"}},"required":["data"]},"example":{"data":{"id":"5e1d2c3b-4a59-4687-b6a5-948372615049","patientId":"f47ac10b-58cc-4372-a567-0e02b2c3d479","status":"issued","channel":"link","procedure":{"id":"b8e2c4d6-1f3a-4b5c-8d7e-9f0a1b2c3d4e","name":"Preenchimento labial"},"practitioner":{"id":"7c1d9e2f-3a4b-4c5d-8e6f-7a8b9c0d1e2f","name":"Ana Oliveira"},"link":{"url":"https://app.westhetics.io/anamnesis?t=eyJraW5kIjoiYW5hbW5lc2lzIn0.c2lnbmF0dXJl","issuedAt":"2026-10-15T14:30:00Z","expiresAt":"2026-10-22T14:30:00Z","resendCount":0},"startedAt":null,"completedAt":null,"protocolNumber":null,"contentHash":null,"canceledAt":null,"cancellationReason":null,"isImported":false,"createdAt":"2026-10-15T14:30:00Z","updatedAt":"2026-10-15T14:30:00Z","delivery":[],"message":"Link da anamnese de Amanda Ribeiro Costa pronto para enviar."}}}}},"400":{"description":"O corpo não é JSON, ou falta o que a rota precisa.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Sem chave, chave que não confere, revogada ou token vencido.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"O app não tem o escopo, ou a pessoa não pode pelo perfil.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Não existe nesta clínica.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Conflito com o estado atual (já existe, já enviado, outra alteração chegou antes, ou a mesma Idempotency-Key ainda em andamento).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Dado que não passa na regra; `fields` traz a mensagem de cada campo.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Passou de 100 chamadas por minuto; veja `Retry-After`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Um provedor (e-mail, PDF, assinatura) está fora; nada foi perdido, tente de novo.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/anamneses/{id}":{"get":{"operationId":"getAnamnesis","x-mint":{"href":"/api-reference/anamneses/ler-anamnese"},"tags":["Anamneses"],"summary":"Ler anamnese","description":"O status, o link (sem a URL), o protocolo e o hash quando respondida.\n\n**Escopo do app:** `anamneses:read`. Pelo OAuth, vale o perfil da pessoa.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Sucesso.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Anamnesis"}},"required":["data"]},"example":{"data":{"id":"5e1d2c3b-4a59-4687-b6a5-948372615049","patientId":"f47ac10b-58cc-4372-a567-0e02b2c3d479","status":"issued","channel":"link","procedure":{"id":"b8e2c4d6-1f3a-4b5c-8d7e-9f0a1b2c3d4e","name":"Preenchimento labial"},"practitioner":{"id":"7c1d9e2f-3a4b-4c5d-8e6f-7a8b9c0d1e2f","name":"Ana Oliveira"},"link":{"issuedAt":"2026-10-15T14:30:00Z","expiresAt":"2026-10-22T14:30:00Z","resendCount":0},"startedAt":null,"completedAt":null,"protocolNumber":null,"contentHash":null,"canceledAt":null,"cancellationReason":null,"isImported":false,"createdAt":"2026-10-15T14:30:00Z","updatedAt":"2026-10-15T14:30:00Z"}}}}},"401":{"description":"Sem chave, chave que não confere, revogada ou token vencido.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"O app não tem o escopo, ou a pessoa não pode pelo perfil.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Não existe nesta clínica.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Passou de 100 chamadas por minuto; veja `Retry-After`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/anamneses/{id}/resend":{"post":{"operationId":"resendAnamnesis","x-mint":{"href":"/api-reference/anamneses/reenviar-anamnese"},"tags":["Anamneses"],"summary":"Reenviar anamnese","description":"Gera link novo (o anterior deixa de valer) e manda pelo canal escolhido; o rascunho da paciente fica.\n\n**Escopo do app:** `anamneses:write`. Pelo OAuth, vale o perfil da pessoa.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"Idempotency-Key","in":"header","required":false,"description":"Um uuid. A mesma chave nas 24 horas devolve a mesma resposta, sem repetir o efeito; com outro corpo, ou enquanto a primeira chamada ainda roda, 409. A resposta repetida não traz o segredo do webhook.","schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"channel":{"anyOf":[{"type":"string","enum":["whatsapp","email","both","link"]},{"type":"null"}]}}},"example":{"channel":"whatsapp"}}}},"responses":{"200":{"description":"Sucesso.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/SentAnamnesis"}},"required":["data"]},"example":{"data":{"id":"5e1d2c3b-4a59-4687-b6a5-948372615049","patientId":"f47ac10b-58cc-4372-a567-0e02b2c3d479","status":"issued","channel":"link","procedure":{"id":"b8e2c4d6-1f3a-4b5c-8d7e-9f0a1b2c3d4e","name":"Preenchimento labial"},"practitioner":{"id":"7c1d9e2f-3a4b-4c5d-8e6f-7a8b9c0d1e2f","name":"Ana Oliveira"},"link":{"url":"https://app.westhetics.io/anamnesis?t=eyJraW5kIjoiYW5hbW5lc2lzIn0.c2lnbmF0dXJl","issuedAt":"2026-10-15T14:30:00Z","expiresAt":"2026-10-22T14:30:00Z","resendCount":0},"startedAt":null,"completedAt":null,"protocolNumber":null,"contentHash":null,"canceledAt":null,"cancellationReason":null,"isImported":false,"createdAt":"2026-10-15T14:30:00Z","updatedAt":"2026-10-15T14:30:00Z","delivery":[],"message":"Link da anamnese de Amanda Ribeiro Costa pronto para enviar."}}}}},"400":{"description":"O corpo não é JSON, ou falta o que a rota precisa.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Sem chave, chave que não confere, revogada ou token vencido.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"O app não tem o escopo, ou a pessoa não pode pelo perfil.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Não existe nesta clínica.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Conflito com o estado atual (já existe, já enviado, outra alteração chegou antes, ou a mesma Idempotency-Key ainda em andamento).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Dado que não passa na regra; `fields` traz a mensagem de cada campo.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Passou de 100 chamadas por minuto; veja `Retry-After`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Um provedor (e-mail, PDF, assinatura) está fora; nada foi perdido, tente de novo.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/anamneses/{id}/cancel":{"post":{"operationId":"cancelAnamnesis","x-mint":{"href":"/api-reference/anamneses/cancelar-anamnese"},"tags":["Anamneses"],"summary":"Cancelar anamnese","description":"Cancela antes de a paciente responder; o motivo é opcional. A respondida não se cancela.\n\n**Escopo do app:** `anamneses:write`. Pelo OAuth, vale o perfil da pessoa.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"reason":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}]}}},"example":{"reason":"Procedimento remarcado."}}}},"responses":{"200":{"description":"Sucesso.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Anamnesis"}},"required":["data"]},"example":{"data":{"id":"5e1d2c3b-4a59-4687-b6a5-948372615049","patientId":"f47ac10b-58cc-4372-a567-0e02b2c3d479","status":"canceled","channel":"link","procedure":{"id":"b8e2c4d6-1f3a-4b5c-8d7e-9f0a1b2c3d4e","name":"Preenchimento labial"},"practitioner":{"id":"7c1d9e2f-3a4b-4c5d-8e6f-7a8b9c0d1e2f","name":"Ana Oliveira"},"link":{"issuedAt":"2026-10-15T14:30:00Z","expiresAt":"2026-10-22T14:30:00Z","resendCount":0},"startedAt":null,"completedAt":null,"protocolNumber":null,"contentHash":null,"canceledAt":null,"cancellationReason":null,"isImported":false,"createdAt":"2026-10-15T14:30:00Z","updatedAt":"2026-10-15T14:30:00Z"}}}}},"400":{"description":"O corpo não é JSON, ou falta o que a rota precisa.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Sem chave, chave que não confere, revogada ou token vencido.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"O app não tem o escopo, ou a pessoa não pode pelo perfil.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Não existe nesta clínica.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Conflito com o estado atual (já existe, já enviado, outra alteração chegou antes, ou a mesma Idempotency-Key ainda em andamento).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Dado que não passa na regra; `fields` traz a mensagem de cada campo.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Passou de 100 chamadas por minuto; veja `Retry-After`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/anamneses/{id}/answers":{"get":{"operationId":"getAnamnesisAnswers","x-mint":{"href":"/api-reference/anamneses/ler-as-respostas"},"tags":["Anamneses"],"summary":"Ler as respostas","description":"As respostas da anamnese preenchida, com as perguntas em pt-BR e o que pede atenção. É dado de saúde: pede o escopo próprio `anamneses:answers`.\n\n**Escopo do app:** `anamneses:answers`. Pelo OAuth, vale o perfil da pessoa.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Sucesso.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/AnamnesisAnswers"}},"required":["data"]}}}},"401":{"description":"Sem chave, chave que não confere, revogada ou token vencido.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"O app não tem o escopo, ou a pessoa não pode pelo perfil.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Não existe nesta clínica.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Conflito com o estado atual (já existe, já enviado, outra alteração chegou antes, ou a mesma Idempotency-Key ainda em andamento).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Passou de 100 chamadas por minuto; veja `Retry-After`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/procedures":{"get":{"operationId":"listProcedures","x-mint":{"href":"/api-reference/catalogo/listar-procedimentos"},"tags":["Catálogo"],"summary":"Listar procedimentos","description":"Os procedimentos ativos da clínica, com valor e condição de pagamento.\n\n**Escopo do app:** `catalog:read`. Pelo OAuth, vale o perfil da pessoa.","parameters":[{"name":"search","in":"query","required":false,"schema":{"type":"string","minLength":1,"maxLength":120}}],"responses":{"200":{"description":"Sucesso.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Procedure"}},"meta":{"$ref":"#/components/schemas/PageMeta"}},"required":["data","meta"]},"example":{"data":[{"id":"b8e2c4d6-1f3a-4b5c-8d7e-9f0a1b2c3d4e","name":"Preenchimento labial","description":"Ácido hialurônico nos lábios, uma seringa.","type":"single","amountCents":190000,"validityMonths":null,"paymentTerms":"PIX, débito ou crédito em até 10× sem juros."}],"meta":{"limit":25,"nextCursor":null}}}}},"401":{"description":"Sem chave, chave que não confere, revogada ou token vencido.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"O app não tem o escopo, ou a pessoa não pode pelo perfil.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Dado que não passa na regra; `fields` traz a mensagem de cada campo.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Passou de 100 chamadas por minuto; veja `Retry-After`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/practitioners":{"get":{"operationId":"listPractitioners","x-mint":{"href":"/api-reference/catalogo/listar-prestadores"},"tags":["Catálogo"],"summary":"Listar prestadores","description":"Os prestadores ativos, com conselho e registro.\n\n**Escopo do app:** `catalog:read`. Pelo OAuth, vale o perfil da pessoa.","parameters":[],"responses":{"200":{"description":"Sucesso.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Practitioner"}},"meta":{"$ref":"#/components/schemas/PageMeta"}},"required":["data","meta"]},"example":{"data":[{"id":"7c1d9e2f-3a4b-4c5d-8e6f-7a8b9c0d1e2f","name":"Ana Oliveira","councilCode":"CRM","profession":"Médica","specialty":"Dermatologia","registrationNumber":"123456-SP"}],"meta":{"limit":25,"nextCursor":null}}}}},"401":{"description":"Sem chave, chave que não confere, revogada ou token vencido.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"O app não tem o escopo, ou a pessoa não pode pelo perfil.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Passou de 100 chamadas por minuto; veja `Retry-After`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/templates":{"get":{"operationId":"listTemplates","x-mint":{"href":"/api-reference/catalogo/listar-modelos-de-documento"},"tags":["Catálogo"],"summary":"Listar modelos de documento","description":"Os modelos que a geração aceita na clínica: os inclusos (anamnese e contrato) e os termos, com os procedimentos ligados a cada um.\n\n**Escopo do app:** `catalog:read`. Pelo OAuth, vale o perfil da pessoa.","parameters":[{"name":"flow","in":"query","required":false,"schema":{"default":"procedure","type":"string","enum":["procedure","standalone"]}}],"responses":{"200":{"description":"Sucesso.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Template"}},"meta":{"$ref":"#/components/schemas/PageMeta"}},"required":["data","meta"]},"example":{"data":[{"id":"a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d","name":"Termo de consentimento · preenchimento com ácido hialurônico","category":"informed_consent","audience":"patient","isIncluded":false,"versionLabel":"3","linkedProcedures":[{"id":"b8e2c4d6-1f3a-4b5c-8d7e-9f0a1b2c3d4e","name":"Preenchimento labial"}]}],"meta":{"limit":25,"nextCursor":null}}}}},"401":{"description":"Sem chave, chave que não confere, revogada ou token vencido.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"O app não tem o escopo, ou a pessoa não pode pelo perfil.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Dado que não passa na regra; `fields` traz a mensagem de cada campo.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Passou de 100 chamadas por minuto; veja `Retry-After`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/appointments":{"get":{"operationId":"listAppointments","x-mint":{"href":"/api-reference/contratos-e-assinaturas/listar-atendimentos"},"tags":["Contratos e assinaturas"],"summary":"Listar atendimentos","description":"Os atendimentos com documentos gerados, com o status da assinatura, em ordem de atualização.\n\n**Escopo do app:** `documents:read`. Pelo OAuth, vale o perfil da pessoa.","parameters":[{"name":"limit","in":"query","required":false,"schema":{"default":25,"description":"Itens por página, de 1 a 100.","type":"integer","minimum":1,"maximum":100},"description":"Itens por página, de 1 a 100."},{"name":"cursor","in":"query","required":false,"schema":{"type":"string","minLength":1,"maxLength":400,"description":"O `nextCursor` da página anterior."},"description":"O `nextCursor` da página anterior."},{"name":"patientId","in":"query","required":false,"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},{"name":"state","in":"query","required":false,"schema":{"type":"string","enum":["generated","sent","canceled"]}},{"name":"updatedSince","in":"query","required":false,"schema":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$","description":"Só o que mudou a partir deste instante (ISO 8601): o jeito de sincronizar."},"description":"Só o que mudou a partir deste instante (ISO 8601): o jeito de sincronizar."}],"responses":{"200":{"description":"Sucesso.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Appointment"}},"meta":{"$ref":"#/components/schemas/PageMeta"}},"required":["data","meta"]},"example":{"data":[{"id":"3c9d1e2f-4a5b-4c7d-8e9f-0a1b2c3d4e5f","parentAppointmentId":null,"type":"procedure","state":"sent","patientId":"f47ac10b-58cc-4372-a567-0e02b2c3d479","anamnesisId":"5e1d2c3b-4a59-4687-b6a5-948372615049","practitioner":{"id":"7c1d9e2f-3a4b-4c5d-8e6f-7a8b9c0d1e2f","name":"Ana Oliveira"},"procedures":[{"id":"b8e2c4d6-1f3a-4b5c-8d7e-9f0a1b2c3d4e","name":"Preenchimento labial","type":"single","amountCents":190000}],"totalAmountCents":190000,"paymentTerms":"PIX, débito ou crédito em até 10× sem juros.","imageConsent":"yes","isModelPatient":false,"procedureDate":"2026-10-20","procedureTime":"14:30","generation":1,"generatedAt":"2026-10-15T14:30:00Z","documents":[{"id":"d4e5f6a7-b8c9-4123-8ef4-567890123456","appointmentId":"3c9d1e2f-4a5b-4c7d-8e9f-0a1b2c3d4e5f","patientId":"f47ac10b-58cc-4372-a567-0e02b2c3d479","templateId":"a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d","name":"Contrato de prestação de serviços","category":"service_contract","versionLabel":"5","status":"awaiting_patient","contentHash":"a3f9c1e7d2b84f6a9e0c1d2b3a4f5e6d7c8b9a0f1e2d3c4b5a6978877665544","pageCount":4,"hasFile":true,"isRestricted":false,"signedFileHash":null,"generatedAt":"2026-10-15T14:30:00Z","patientSignedAt":null,"signedAt":null,"expiredAt":null,"canceledAt":null,"updatedAt":"2026-10-15T14:30:00Z"}],"signature":{"status":"awaiting_patient","request":{"id":"6f7e8d9c-0b1a-4f2e-9d3c-4b5a69788796","protocolNumber":"WX-4472-BM","channels":"whatsapp","provider":"autentique","sentAt":"2026-10-15T14:30:00Z","linkExpiresAt":"2026-10-22T14:30:00Z","linkOpenedAt":null,"resendCount":0,"canceledAt":null,"cancellationReason":null}},"createdAt":"2026-10-15T14:30:00Z","updatedAt":"2026-10-15T14:30:00Z"}],"meta":{"limit":25,"nextCursor":null}}}}},"400":{"description":"O corpo não é JSON, ou falta o que a rota precisa.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Sem chave, chave que não confere, revogada ou token vencido.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"O app não tem o escopo, ou a pessoa não pode pelo perfil.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Dado que não passa na regra; `fields` traz a mensagem de cada campo.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Passou de 100 chamadas por minuto; veja `Retry-After`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"createAppointment","x-mint":{"href":"/api-reference/contratos-e-assinaturas/gerar-contrato-e-termos"},"tags":["Contratos e assinaturas"],"summary":"Gerar contrato e termos","description":"Cria o atendimento e gera os documentos numa chamada: o contrato certo, a anamnese respondida e os termos ligados aos procedimentos (ou os de `templateIds`). Faltou dado, 422 com cada pendência; rascunho aberto no app para a mesma paciente, 409.\n\n**Escopo do app:** `documents:write`. Pelo OAuth, vale o perfil da pessoa.","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Um uuid. A mesma chave nas 24 horas devolve a mesma resposta, sem repetir o efeito; com outro corpo, ou enquanto a primeira chamada ainda roda, 409. A resposta repetida não traz o segredo do webhook.","schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"patientId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"parentAppointmentId":{"description":"Para acrescentar termos a um atendimento já enviado: o id dele. Paciente, procedimentos, prestador e valor vêm dele; o adicional tem envio, protocolo e link próprios.","type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"type":{"default":"procedure","type":"string","enum":["procedure","standalone"]},"procedureIds":{"maxItems":20,"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"practitionerId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"templateIds":{"maxItems":12,"type":"array","items":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"imageConsent":{"description":"Se a paciente autoriza o uso de imagem por esta clínica. Ao gerar, atualiza o cadastro dela nesta clínica.","type":"string","enum":["yes","no"]},"totalAmountCents":{"type":"integer","minimum":0,"maximum":10000000000},"procedureDate":{"type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"},"procedureTime":{"type":"string","pattern":"^([01]\\d|2[0-3]):[0-5]\\d$"},"freeText":{"type":"string","maxLength":2000},"anamnesisId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"isModelPatient":{"type":"boolean"}}},"example":{"patientId":"f47ac10b-58cc-4372-a567-0e02b2c3d479","procedureIds":["b8e2c4d6-1f3a-4b5c-8d7e-9f0a1b2c3d4e"],"practitionerId":"7c1d9e2f-3a4b-4c5d-8e6f-7a8b9c0d1e2f","imageConsent":"yes","procedureDate":"2026-10-20","procedureTime":"14:30"}}}},"responses":{"201":{"description":"Criado.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Appointment"}},"required":["data"]},"example":{"data":{"id":"3c9d1e2f-4a5b-4c7d-8e9f-0a1b2c3d4e5f","parentAppointmentId":null,"type":"procedure","state":"generated","patientId":"f47ac10b-58cc-4372-a567-0e02b2c3d479","anamnesisId":"5e1d2c3b-4a59-4687-b6a5-948372615049","practitioner":{"id":"7c1d9e2f-3a4b-4c5d-8e6f-7a8b9c0d1e2f","name":"Ana Oliveira"},"procedures":[{"id":"b8e2c4d6-1f3a-4b5c-8d7e-9f0a1b2c3d4e","name":"Preenchimento labial","type":"single","amountCents":190000}],"totalAmountCents":190000,"paymentTerms":"PIX, débito ou crédito em até 10× sem juros.","imageConsent":"yes","isModelPatient":false,"procedureDate":"2026-10-20","procedureTime":"14:30","generation":1,"generatedAt":"2026-10-15T14:30:00Z","documents":[{"id":"d4e5f6a7-b8c9-4123-8ef4-567890123456","appointmentId":"3c9d1e2f-4a5b-4c7d-8e9f-0a1b2c3d4e5f","patientId":"f47ac10b-58cc-4372-a567-0e02b2c3d479","templateId":"a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d","name":"Contrato de prestação de serviços","category":"service_contract","versionLabel":"5","status":"awaiting_patient","contentHash":"a3f9c1e7d2b84f6a9e0c1d2b3a4f5e6d7c8b9a0f1e2d3c4b5a6978877665544","pageCount":4,"hasFile":true,"isRestricted":false,"signedFileHash":null,"generatedAt":"2026-10-15T14:30:00Z","patientSignedAt":null,"signedAt":null,"expiredAt":null,"canceledAt":null,"updatedAt":"2026-10-15T14:30:00Z"}],"signature":{"status":"generated","request":null},"createdAt":"2026-10-15T14:30:00Z","updatedAt":"2026-10-15T14:30:00Z"}}}}},"400":{"description":"O corpo não é JSON, ou falta o que a rota precisa.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Sem chave, chave que não confere, revogada ou token vencido.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"O app não tem o escopo, ou a pessoa não pode pelo perfil.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Não existe nesta clínica.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Conflito com o estado atual (já existe, já enviado, outra alteração chegou antes, ou a mesma Idempotency-Key ainda em andamento).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Dado que não passa na regra; `fields` traz a mensagem de cada campo.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Passou de 100 chamadas por minuto; veja `Retry-After`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Um provedor (e-mail, PDF, assinatura) está fora; nada foi perdido, tente de novo.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/appointments/{id}":{"get":{"operationId":"getAppointment","x-mint":{"href":"/api-reference/contratos-e-assinaturas/ler-atendimento"},"tags":["Contratos e assinaturas"],"summary":"Ler atendimento","description":"Os procedimentos, o valor, os documentos e o status da assinatura.\n\n**Escopo do app:** `documents:read`. Pelo OAuth, vale o perfil da pessoa.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Sucesso.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Appointment"}},"required":["data"]},"example":{"data":{"id":"3c9d1e2f-4a5b-4c7d-8e9f-0a1b2c3d4e5f","parentAppointmentId":null,"type":"procedure","state":"sent","patientId":"f47ac10b-58cc-4372-a567-0e02b2c3d479","anamnesisId":"5e1d2c3b-4a59-4687-b6a5-948372615049","practitioner":{"id":"7c1d9e2f-3a4b-4c5d-8e6f-7a8b9c0d1e2f","name":"Ana Oliveira"},"procedures":[{"id":"b8e2c4d6-1f3a-4b5c-8d7e-9f0a1b2c3d4e","name":"Preenchimento labial","type":"single","amountCents":190000}],"totalAmountCents":190000,"paymentTerms":"PIX, débito ou crédito em até 10× sem juros.","imageConsent":"yes","isModelPatient":false,"procedureDate":"2026-10-20","procedureTime":"14:30","generation":1,"generatedAt":"2026-10-15T14:30:00Z","documents":[{"id":"d4e5f6a7-b8c9-4123-8ef4-567890123456","appointmentId":"3c9d1e2f-4a5b-4c7d-8e9f-0a1b2c3d4e5f","patientId":"f47ac10b-58cc-4372-a567-0e02b2c3d479","templateId":"a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d","name":"Contrato de prestação de serviços","category":"service_contract","versionLabel":"5","status":"awaiting_patient","contentHash":"a3f9c1e7d2b84f6a9e0c1d2b3a4f5e6d7c8b9a0f1e2d3c4b5a6978877665544","pageCount":4,"hasFile":true,"isRestricted":false,"signedFileHash":null,"generatedAt":"2026-10-15T14:30:00Z","patientSignedAt":null,"signedAt":null,"expiredAt":null,"canceledAt":null,"updatedAt":"2026-10-15T14:30:00Z"}],"signature":{"status":"awaiting_patient","request":{"id":"6f7e8d9c-0b1a-4f2e-9d3c-4b5a69788796","protocolNumber":"WX-4472-BM","channels":"whatsapp","provider":"autentique","sentAt":"2026-10-15T14:30:00Z","linkExpiresAt":"2026-10-22T14:30:00Z","linkOpenedAt":null,"resendCount":0,"canceledAt":null,"cancellationReason":null}},"createdAt":"2026-10-15T14:30:00Z","updatedAt":"2026-10-15T14:30:00Z"}}}}},"401":{"description":"Sem chave, chave que não confere, revogada ou token vencido.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"O app não tem o escopo, ou a pessoa não pode pelo perfil.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Não existe nesta clínica.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Passou de 100 chamadas por minuto; veja `Retry-After`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/appointments/{id}/signature-request":{"post":{"operationId":"sendForSignature","x-mint":{"href":"/api-reference/contratos-e-assinaturas/enviar-para-assinatura"},"tags":["Contratos e assinaturas"],"summary":"Enviar para assinatura","description":"Envia os documentos gerados para a paciente assinar (a responsável, se menor). Sai depois da janela de 10 segundos (`sendsAt`); o status volta pelos eventos `signature_request.*`.\n\n**Escopo do app:** `documents:write`. Pelo OAuth, vale o perfil da pessoa.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"Idempotency-Key","in":"header","required":false,"description":"Um uuid. A mesma chave nas 24 horas devolve a mesma resposta, sem repetir o efeito; com outro corpo, ou enquanto a primeira chamada ainda roda, 409. A resposta repetida não traz o segredo do webhook.","schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"channels":{"type":"string","enum":["whatsapp","email","both"]}},"required":["channels"]},"example":{"channels":"whatsapp"}}}},"responses":{"201":{"description":"Criado.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/SignatureRequestResult"}},"required":["data"]},"example":{"data":{"id":"3c9d1e2f-4a5b-4c7d-8e9f-0a1b2c3d4e5f","parentAppointmentId":null,"type":"procedure","state":"sent","patientId":"f47ac10b-58cc-4372-a567-0e02b2c3d479","anamnesisId":"5e1d2c3b-4a59-4687-b6a5-948372615049","practitioner":{"id":"7c1d9e2f-3a4b-4c5d-8e6f-7a8b9c0d1e2f","name":"Ana Oliveira"},"procedures":[{"id":"b8e2c4d6-1f3a-4b5c-8d7e-9f0a1b2c3d4e","name":"Preenchimento labial","type":"single","amountCents":190000}],"totalAmountCents":190000,"paymentTerms":"PIX, débito ou crédito em até 10× sem juros.","imageConsent":"yes","isModelPatient":false,"procedureDate":"2026-10-20","procedureTime":"14:30","generation":1,"generatedAt":"2026-10-15T14:30:00Z","documents":[{"id":"d4e5f6a7-b8c9-4123-8ef4-567890123456","appointmentId":"3c9d1e2f-4a5b-4c7d-8e9f-0a1b2c3d4e5f","patientId":"f47ac10b-58cc-4372-a567-0e02b2c3d479","templateId":"a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d","name":"Contrato de prestação de serviços","category":"service_contract","versionLabel":"5","status":"awaiting_patient","contentHash":"a3f9c1e7d2b84f6a9e0c1d2b3a4f5e6d7c8b9a0f1e2d3c4b5a6978877665544","pageCount":4,"hasFile":true,"isRestricted":false,"signedFileHash":null,"generatedAt":"2026-10-15T14:30:00Z","patientSignedAt":null,"signedAt":null,"expiredAt":null,"canceledAt":null,"updatedAt":"2026-10-15T14:30:00Z"}],"signature":{"status":"awaiting_patient","request":{"id":"6f7e8d9c-0b1a-4f2e-9d3c-4b5a69788796","protocolNumber":"WX-4472-BM","channels":"whatsapp","provider":"autentique","sentAt":"2026-10-15T14:30:00Z","linkExpiresAt":"2026-10-22T14:30:00Z","linkOpenedAt":null,"resendCount":0,"canceledAt":null,"cancellationReason":null}},"createdAt":"2026-10-15T14:30:00Z","updatedAt":"2026-10-15T14:30:00Z","sendsAt":"2026-10-15T14:30:10Z"}}}}},"400":{"description":"O corpo não é JSON, ou falta o que a rota precisa.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Sem chave, chave que não confere, revogada ou token vencido.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"O app não tem o escopo, ou a pessoa não pode pelo perfil.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Não existe nesta clínica.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Conflito com o estado atual (já existe, já enviado, outra alteração chegou antes, ou a mesma Idempotency-Key ainda em andamento).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Dado que não passa na regra; `fields` traz a mensagem de cada campo.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Passou de 100 chamadas por minuto; veja `Retry-After`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Um provedor (e-mail, PDF, assinatura) está fora; nada foi perdido, tente de novo.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/appointments/{id}/signature-request/resend":{"post":{"operationId":"resendSignature","x-mint":{"href":"/api-reference/contratos-e-assinaturas/reenviar-o-link-de-assinatura"},"tags":["Contratos e assinaturas"],"summary":"Reenviar o link de assinatura","description":"Reenvia o link; sem `channels`, pelos canais do envio. Também sai depois da janela de 10 segundos (`sendsAt`).\n\n**Escopo do app:** `documents:write`. Pelo OAuth, vale o perfil da pessoa.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"Idempotency-Key","in":"header","required":false,"description":"Um uuid. A mesma chave nas 24 horas devolve a mesma resposta, sem repetir o efeito; com outro corpo, ou enquanto a primeira chamada ainda roda, 409. A resposta repetida não traz o segredo do webhook.","schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"channels":{"type":"string","enum":["whatsapp","email","both"]}}},"example":{}}}},"responses":{"200":{"description":"Sucesso.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/SignatureRequestResult"}},"required":["data"]},"example":{"data":{"id":"3c9d1e2f-4a5b-4c7d-8e9f-0a1b2c3d4e5f","parentAppointmentId":null,"type":"procedure","state":"sent","patientId":"f47ac10b-58cc-4372-a567-0e02b2c3d479","anamnesisId":"5e1d2c3b-4a59-4687-b6a5-948372615049","practitioner":{"id":"7c1d9e2f-3a4b-4c5d-8e6f-7a8b9c0d1e2f","name":"Ana Oliveira"},"procedures":[{"id":"b8e2c4d6-1f3a-4b5c-8d7e-9f0a1b2c3d4e","name":"Preenchimento labial","type":"single","amountCents":190000}],"totalAmountCents":190000,"paymentTerms":"PIX, débito ou crédito em até 10× sem juros.","imageConsent":"yes","isModelPatient":false,"procedureDate":"2026-10-20","procedureTime":"14:30","generation":1,"generatedAt":"2026-10-15T14:30:00Z","documents":[{"id":"d4e5f6a7-b8c9-4123-8ef4-567890123456","appointmentId":"3c9d1e2f-4a5b-4c7d-8e9f-0a1b2c3d4e5f","patientId":"f47ac10b-58cc-4372-a567-0e02b2c3d479","templateId":"a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d","name":"Contrato de prestação de serviços","category":"service_contract","versionLabel":"5","status":"awaiting_patient","contentHash":"a3f9c1e7d2b84f6a9e0c1d2b3a4f5e6d7c8b9a0f1e2d3c4b5a6978877665544","pageCount":4,"hasFile":true,"isRestricted":false,"signedFileHash":null,"generatedAt":"2026-10-15T14:30:00Z","patientSignedAt":null,"signedAt":null,"expiredAt":null,"canceledAt":null,"updatedAt":"2026-10-15T14:30:00Z"}],"signature":{"status":"awaiting_patient","request":{"id":"6f7e8d9c-0b1a-4f2e-9d3c-4b5a69788796","protocolNumber":"WX-4472-BM","channels":"whatsapp","provider":"autentique","sentAt":"2026-10-15T14:30:00Z","linkExpiresAt":"2026-10-22T14:30:00Z","linkOpenedAt":null,"resendCount":0,"canceledAt":null,"cancellationReason":null}},"createdAt":"2026-10-15T14:30:00Z","updatedAt":"2026-10-15T14:30:00Z","sendsAt":"2026-10-15T14:30:10Z"}}}}},"400":{"description":"O corpo não é JSON, ou falta o que a rota precisa.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Sem chave, chave que não confere, revogada ou token vencido.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"O app não tem o escopo, ou a pessoa não pode pelo perfil.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Não existe nesta clínica.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Conflito com o estado atual (já existe, já enviado, outra alteração chegou antes, ou a mesma Idempotency-Key ainda em andamento).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Dado que não passa na regra; `fields` traz a mensagem de cada campo.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Passou de 100 chamadas por minuto; veja `Retry-After`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Um provedor (e-mail, PDF, assinatura) está fora; nada foi perdido, tente de novo.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/appointments/{id}/signature-request/cancel":{"post":{"operationId":"cancelSignature","x-mint":{"href":"/api-reference/contratos-e-assinaturas/cancelar-o-envio"},"tags":["Contratos e assinaturas"],"summary":"Cancelar o envio","description":"Cancela o envio, com o motivo; o link deixa de valer e o cancelamento vale depois da janela de 10 segundos (`effectiveAt`). Depois que a paciente assinou, só a gestora e a Westhetics cancelam (pelo OAuth, com o perfil delas; o app recebe 403), e a paciente recebe o aviso por e-mail.\n\n**Escopo do app:** `documents:write`. Pelo OAuth, vale o perfil da pessoa.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"reason":{"type":"string","minLength":10,"maxLength":500}},"required":["reason"]},"example":{"reason":"A paciente desistiu do procedimento."}}}},"responses":{"200":{"description":"Sucesso.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/SignatureCancelResult"}},"required":["data"]},"example":{"data":{"id":"3c9d1e2f-4a5b-4c7d-8e9f-0a1b2c3d4e5f","parentAppointmentId":null,"type":"procedure","state":"sent","patientId":"f47ac10b-58cc-4372-a567-0e02b2c3d479","anamnesisId":"5e1d2c3b-4a59-4687-b6a5-948372615049","practitioner":{"id":"7c1d9e2f-3a4b-4c5d-8e6f-7a8b9c0d1e2f","name":"Ana Oliveira"},"procedures":[{"id":"b8e2c4d6-1f3a-4b5c-8d7e-9f0a1b2c3d4e","name":"Preenchimento labial","type":"single","amountCents":190000}],"totalAmountCents":190000,"paymentTerms":"PIX, débito ou crédito em até 10× sem juros.","imageConsent":"yes","isModelPatient":false,"procedureDate":"2026-10-20","procedureTime":"14:30","generation":1,"generatedAt":"2026-10-15T14:30:00Z","documents":[{"id":"d4e5f6a7-b8c9-4123-8ef4-567890123456","appointmentId":"3c9d1e2f-4a5b-4c7d-8e9f-0a1b2c3d4e5f","patientId":"f47ac10b-58cc-4372-a567-0e02b2c3d479","templateId":"a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d","name":"Contrato de prestação de serviços","category":"service_contract","versionLabel":"5","status":"awaiting_patient","contentHash":"a3f9c1e7d2b84f6a9e0c1d2b3a4f5e6d7c8b9a0f1e2d3c4b5a6978877665544","pageCount":4,"hasFile":true,"isRestricted":false,"signedFileHash":null,"generatedAt":"2026-10-15T14:30:00Z","patientSignedAt":null,"signedAt":null,"expiredAt":null,"canceledAt":null,"updatedAt":"2026-10-15T14:30:00Z"}],"signature":{"status":"awaiting_patient","request":{"id":"6f7e8d9c-0b1a-4f2e-9d3c-4b5a69788796","protocolNumber":"WX-4472-BM","channels":"whatsapp","provider":"autentique","sentAt":"2026-10-15T14:30:00Z","linkExpiresAt":"2026-10-22T14:30:00Z","linkOpenedAt":null,"resendCount":0,"canceledAt":null,"cancellationReason":null}},"createdAt":"2026-10-15T14:30:00Z","updatedAt":"2026-10-15T14:30:00Z","effectiveAt":"2026-10-15T14:30:10Z"}}}}},"400":{"description":"O corpo não é JSON, ou falta o que a rota precisa.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Sem chave, chave que não confere, revogada ou token vencido.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"O app não tem o escopo, ou a pessoa não pode pelo perfil.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Não existe nesta clínica.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Conflito com o estado atual (já existe, já enviado, outra alteração chegou antes, ou a mesma Idempotency-Key ainda em andamento).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Dado que não passa na regra; `fields` traz a mensagem de cada campo.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Passou de 100 chamadas por minuto; veja `Retry-After`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/documents/{id}":{"get":{"operationId":"getDocument","x-mint":{"href":"/api-reference/contratos-e-assinaturas/ler-documento"},"tags":["Contratos e assinaturas"],"summary":"Ler documento","description":"O status, o hash e as datas de um documento. `isRestricted` marca o documento da anamnese que quem chama não lê (o app, sem `anamneses:answers`): os dados saem, o arquivo não.\n\n**Escopo do app:** `documents:read`. Pelo OAuth, vale o perfil da pessoa.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Sucesso.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Document"}},"required":["data"]},"example":{"data":{"id":"d4e5f6a7-b8c9-4123-8ef4-567890123456","appointmentId":"3c9d1e2f-4a5b-4c7d-8e9f-0a1b2c3d4e5f","patientId":"f47ac10b-58cc-4372-a567-0e02b2c3d479","templateId":"a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d","name":"Contrato de prestação de serviços","category":"service_contract","versionLabel":"5","status":"awaiting_patient","contentHash":"a3f9c1e7d2b84f6a9e0c1d2b3a4f5e6d7c8b9a0f1e2d3c4b5a6978877665544","pageCount":4,"hasFile":true,"isRestricted":false,"signedFileHash":null,"generatedAt":"2026-10-15T14:30:00Z","patientSignedAt":null,"signedAt":null,"expiredAt":null,"canceledAt":null,"updatedAt":"2026-10-15T14:30:00Z"}}}}},"401":{"description":"Sem chave, chave que não confere, revogada ou token vencido.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"O app não tem o escopo, ou a pessoa não pode pelo perfil.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Não existe nesta clínica.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Passou de 100 chamadas por minuto; veja `Retry-After`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/documents/{id}/file":{"get":{"operationId":"getDocumentFile","x-mint":{"href":"/api-reference/contratos-e-assinaturas/baixar-o-pdf"},"tags":["Contratos e assinaturas"],"summary":"Baixar o PDF","description":"Um endereço de 5 minutos para o PDF protegido; assinado o documento, o PDF assinado (montado na hora, quando ainda não estava guardado). O documento da anamnese traz as respostas: o app precisa de `anamneses:answers`, e a pessoa, do perfil que lê a anamnese (403). Assinado na Autentique, o arquivo dela chega em alguns minutos: até lá, 409.\n\n**Escopo do app:** `documents:read`. Pelo OAuth, vale o perfil da pessoa.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Sucesso.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/DocumentFile"}},"required":["data"]},"example":{"data":{"url":"https://zosqwpksgewzphikvgfz.supabase.co/storage/v1/object/sign/documents/…","expiresAt":"2026-10-15T14:35:00Z","isSigned":true,"hash":"a3f9c1e7d2b84f6a9e0c1d2b3a4f5e6d7c8b9a0f1e2d3c4b5a6978877665544"}}}}},"401":{"description":"Sem chave, chave que não confere, revogada ou token vencido.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"O app não tem o escopo, ou a pessoa não pode pelo perfil.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Não existe nesta clínica.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Conflito com o estado atual (já existe, já enviado, outra alteração chegou antes, ou a mesma Idempotency-Key ainda em andamento).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Passou de 100 chamadas por minuto; veja `Retry-After`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/events":{"get":{"operationId":"listEvents","x-mint":{"href":"/api-reference/eventos/listar-eventos"},"tags":["Eventos"],"summary":"Listar eventos","description":"Os eventos dos últimos 30 dias que o app vê, em ordem (`asc`, padrão, para consumir) ou dos mais recentes (`desc`). A alternativa ao webhook para quem prefere consultar. Em `asc`, o evento aparece quando nenhuma gravação mais antiga ainda está em andamento: o cursor nunca pula evento, e um evento pode levar alguns segundos a mais para aparecer. Entrega pelo menos uma vez: ignore o `id` repetido. `webhook.test` nunca aparece aqui.\n\n**Escopo:** qualquer app; pelo OAuth, o perfil da pessoa.","parameters":[{"name":"limit","in":"query","required":false,"schema":{"default":25,"description":"Itens por página, de 1 a 100.","type":"integer","minimum":1,"maximum":100},"description":"Itens por página, de 1 a 100."},{"name":"cursor","in":"query","required":false,"schema":{"type":"string","minLength":1,"maxLength":400,"description":"O `nextCursor` da página anterior."},"description":"O `nextCursor` da página anterior."},{"name":"types","in":"query","required":false,"schema":{"type":"string"}},{"name":"patientId","in":"query","required":false,"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},{"name":"resourceId","in":"query","required":false,"schema":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},{"name":"order","in":"query","required":false,"schema":{"default":"asc","type":"string","enum":["asc","desc"]}}],"responses":{"200":{"description":"Sucesso.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Event"}},"meta":{"$ref":"#/components/schemas/PageMeta"}},"required":["data","meta"]},"example":{"data":[{"id":"0e9d8c7b-6a5f-4e3d-9c2b-1a0f9e8d7c6b","type":"signature_request.completed","createdAt":"2026-10-15T14:30:00Z","clinicId":"2b7f0a3c-5d1e-4c8a-9f60-1a2b3c4d5e6f","actor":{"type":"system","id":null},"data":{"signatureRequestId":"6f7e8d9c-0b1a-4f2e-9d3c-4b5a69788796","appointmentId":"3c9d1e2f-4a5b-4c7d-8e9f-0a1b2c3d4e5f","patientId":"f47ac10b-58cc-4372-a567-0e02b2c3d479","protocolNumber":"WX-4472-BM","documentIds":["d4e5f6a7-b8c9-4123-8ef4-567890123456"]}}],"meta":{"limit":25,"nextCursor":null}}}}},"400":{"description":"O corpo não é JSON, ou falta o que a rota precisa.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Sem chave, chave que não confere, revogada ou token vencido.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"O app não tem o escopo, ou a pessoa não pode pelo perfil.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Dado que não passa na regra; `fields` traz a mensagem de cada campo.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Passou de 100 chamadas por minuto; veja `Retry-After`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/events/{id}":{"get":{"operationId":"getEvent","x-mint":{"href":"/api-reference/eventos/ler-evento"},"tags":["Eventos"],"summary":"Ler evento","description":"Um evento pelo id (o `webhook-id` da entrega).\n\n**Escopo:** qualquer app; pelo OAuth, o perfil da pessoa.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Sucesso.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Event"}},"required":["data"]},"example":{"data":{"id":"0e9d8c7b-6a5f-4e3d-9c2b-1a0f9e8d7c6b","type":"signature_request.completed","createdAt":"2026-10-15T14:30:00Z","clinicId":"2b7f0a3c-5d1e-4c8a-9f60-1a2b3c4d5e6f","actor":{"type":"system","id":null},"data":{"signatureRequestId":"6f7e8d9c-0b1a-4f2e-9d3c-4b5a69788796","appointmentId":"3c9d1e2f-4a5b-4c7d-8e9f-0a1b2c3d4e5f","patientId":"f47ac10b-58cc-4372-a567-0e02b2c3d479","protocolNumber":"WX-4472-BM","documentIds":["d4e5f6a7-b8c9-4123-8ef4-567890123456"]}}}}}},"401":{"description":"Sem chave, chave que não confere, revogada ou token vencido.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"O app não tem o escopo, ou a pessoa não pode pelo perfil.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Não existe nesta clínica.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Passou de 100 chamadas por minuto; veja `Retry-After`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/webhooks":{"get":{"operationId":"listWebhooks","x-mint":{"href":"/api-reference/webhooks/listar-webhooks"},"tags":["Webhooks"],"summary":"Listar webhooks","description":"Os webhooks do app, sem o segredo.\n\n**Escopo do app:** `webhooks:write`. Só a chave do app; pelo OAuth, 403.","parameters":[],"responses":{"200":{"description":"Sucesso.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Webhook"}},"meta":{"$ref":"#/components/schemas/PageMeta"}},"required":["data","meta"]},"example":{"data":[{"id":"9a8b7c6d-5e4f-4a3b-8c2d-1e0f9a8b7c6d","integrationId":"8d3e2f1a-0b9c-4d7e-a6f5-4e3d2c1b0a99","url":"https://crm.exemplo.com.br/webhooks/westhetics","description":"CRM da clínica","events":["anamnesis.completed","signature_request.completed"],"status":"active","disabledReason":null,"disabledAt":null,"failingSince":null,"lastDeliveryAt":"2026-10-15T14:30:00Z","lastSuccessAt":"2026-10-15T14:30:00Z","hasPreviousSecret":false,"previousSecretValidUntil":null,"deliveries":{"pending":0,"failed":0},"createdAt":"2026-10-15T14:30:00Z","updatedAt":"2026-10-15T14:30:00Z"}],"meta":{"limit":25,"nextCursor":null}}}}},"401":{"description":"Sem chave, chave que não confere, revogada ou token vencido.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"O app não tem o escopo, ou a pessoa não pode pelo perfil.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Passou de 100 chamadas por minuto; veja `Retry-After`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"createWebhook","x-mint":{"href":"/api-reference/webhooks/criar-webhook"},"tags":["Webhooks"],"summary":"Criar webhook","description":"Até 5 por app. O endereço é https na porta 443, com domínio público. A resposta traz o segredo `whsec_…` que assina as entregas.\n\n**Escopo do app:** `webhooks:write`. Só a chave do app; pelo OAuth, 403.","parameters":[{"name":"Idempotency-Key","in":"header","required":false,"description":"Um uuid. A mesma chave nas 24 horas devolve a mesma resposta, sem repetir o efeito; com outro corpo, ou enquanto a primeira chamada ainda roda, 409. A resposta repetida não traz o segredo do webhook.","schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string"},"description":{"type":"string","maxLength":200},"events":{"maxItems":40,"type":"array","items":{"type":"string"}}},"required":["url"]},"example":{"url":"https://crm.exemplo.com.br/webhooks/westhetics","description":"CRM da clínica","events":["anamnesis.completed","signature_request.completed"]}}}},"responses":{"201":{"description":"Criado.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/WebhookWithSecret"}},"required":["data"]},"example":{"data":{"id":"9a8b7c6d-5e4f-4a3b-8c2d-1e0f9a8b7c6d","integrationId":"8d3e2f1a-0b9c-4d7e-a6f5-4e3d2c1b0a99","url":"https://crm.exemplo.com.br/webhooks/westhetics","description":"CRM da clínica","events":["anamnesis.completed","signature_request.completed"],"status":"active","disabledReason":null,"disabledAt":null,"failingSince":null,"lastDeliveryAt":"2026-10-15T14:30:00Z","lastSuccessAt":"2026-10-15T14:30:00Z","hasPreviousSecret":false,"previousSecretValidUntil":null,"deliveries":{"pending":0,"failed":0},"createdAt":"2026-10-15T14:30:00Z","updatedAt":"2026-10-15T14:30:00Z","secret":"whsec_ZXhlbXBsby1kZS1zZWdyZWRvLW5hby11c2UtMTIzNDU="}}}}},"400":{"description":"O corpo não é JSON, ou falta o que a rota precisa.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Sem chave, chave que não confere, revogada ou token vencido.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"O app não tem o escopo, ou a pessoa não pode pelo perfil.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Não existe nesta clínica.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Conflito com o estado atual (já existe, já enviado, outra alteração chegou antes, ou a mesma Idempotency-Key ainda em andamento).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Dado que não passa na regra; `fields` traz a mensagem de cada campo.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Passou de 100 chamadas por minuto; veja `Retry-After`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/webhooks/{id}":{"get":{"operationId":"getWebhook","x-mint":{"href":"/api-reference/webhooks/ler-webhook"},"tags":["Webhooks"],"summary":"Ler webhook","description":"O webhook, com as contagens de entregas pendentes e com falha.\n\n**Escopo do app:** `webhooks:write`. Só a chave do app; pelo OAuth, 403.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Sucesso.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Webhook"}},"required":["data"]},"example":{"data":{"id":"9a8b7c6d-5e4f-4a3b-8c2d-1e0f9a8b7c6d","integrationId":"8d3e2f1a-0b9c-4d7e-a6f5-4e3d2c1b0a99","url":"https://crm.exemplo.com.br/webhooks/westhetics","description":"CRM da clínica","events":["anamnesis.completed","signature_request.completed"],"status":"active","disabledReason":null,"disabledAt":null,"failingSince":null,"lastDeliveryAt":"2026-10-15T14:30:00Z","lastSuccessAt":"2026-10-15T14:30:00Z","hasPreviousSecret":false,"previousSecretValidUntil":null,"deliveries":{"pending":0,"failed":0},"createdAt":"2026-10-15T14:30:00Z","updatedAt":"2026-10-15T14:30:00Z"}}}}},"401":{"description":"Sem chave, chave que não confere, revogada ou token vencido.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"O app não tem o escopo, ou a pessoa não pode pelo perfil.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Não existe nesta clínica.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Passou de 100 chamadas por minuto; veja `Retry-After`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"patch":{"operationId":"updateWebhook","x-mint":{"href":"/api-reference/webhooks/alterar-webhook"},"tags":["Webhooks"],"summary":"Alterar webhook","description":"Muda endereço, descrição, eventos ou status (`active` · `disabled`). Reativar zera a falha.\n\n**Escopo do app:** `webhooks:write`. Só a chave do app; pelo OAuth, 403.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string"},"description":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}]},"events":{"maxItems":40,"type":"array","items":{"type":"string"}},"status":{"type":"string","enum":["active","disabled"]}}},"example":{"status":"active"}}}},"responses":{"200":{"description":"Sucesso.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Webhook"}},"required":["data"]},"example":{"data":{"id":"9a8b7c6d-5e4f-4a3b-8c2d-1e0f9a8b7c6d","integrationId":"8d3e2f1a-0b9c-4d7e-a6f5-4e3d2c1b0a99","url":"https://crm.exemplo.com.br/webhooks/westhetics","description":"CRM da clínica","events":["anamnesis.completed","signature_request.completed"],"status":"active","disabledReason":null,"disabledAt":null,"failingSince":null,"lastDeliveryAt":"2026-10-15T14:30:00Z","lastSuccessAt":"2026-10-15T14:30:00Z","hasPreviousSecret":false,"previousSecretValidUntil":null,"deliveries":{"pending":0,"failed":0},"createdAt":"2026-10-15T14:30:00Z","updatedAt":"2026-10-15T14:30:00Z"}}}}},"400":{"description":"O corpo não é JSON, ou falta o que a rota precisa.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Sem chave, chave que não confere, revogada ou token vencido.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"O app não tem o escopo, ou a pessoa não pode pelo perfil.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Não existe nesta clínica.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Conflito com o estado atual (já existe, já enviado, outra alteração chegou antes, ou a mesma Idempotency-Key ainda em andamento).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Dado que não passa na regra; `fields` traz a mensagem de cada campo.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Passou de 100 chamadas por minuto; veja `Retry-After`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"delete":{"operationId":"deleteWebhook","x-mint":{"href":"/api-reference/webhooks/remover-webhook"},"tags":["Webhooks"],"summary":"Remover webhook","description":"Para de entregar; as entregas na fila ficam como falhou.\n\n**Escopo do app:** `webhooks:write`. Só a chave do app; pelo OAuth, 403.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"204":{"description":"Feito, sem corpo."},"401":{"description":"Sem chave, chave que não confere, revogada ou token vencido.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"O app não tem o escopo, ou a pessoa não pode pelo perfil.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Não existe nesta clínica.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Passou de 100 chamadas por minuto; veja `Retry-After`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/webhooks/{id}/secret":{"get":{"operationId":"getWebhookSecret","x-mint":{"href":"/api-reference/webhooks/revelar-o-segredo"},"tags":["Webhooks"],"summary":"Revelar o segredo","description":"O segredo atual e, nas 24 horas depois de trocar, o anterior. Fica na trilha.\n\n**Escopo do app:** `webhooks:write`. Só a chave do app; pelo OAuth, 403.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Sucesso.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/WebhookSecret"}},"required":["data"]}}}},"401":{"description":"Sem chave, chave que não confere, revogada ou token vencido.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"O app não tem o escopo, ou a pessoa não pode pelo perfil.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Não existe nesta clínica.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Passou de 100 chamadas por minuto; veja `Retry-After`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/webhooks/{id}/rotate-secret":{"post":{"operationId":"rotateWebhookSecret","x-mint":{"href":"/api-reference/webhooks/trocar-o-segredo"},"tags":["Webhooks"],"summary":"Trocar o segredo","description":"Gera outro segredo; o anterior vale por 24 horas e cada entrega leva as duas assinaturas.\n\n**Escopo do app:** `webhooks:write`. Só a chave do app; pelo OAuth, 403.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Sucesso.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/WebhookWithSecret"}},"required":["data"]}}}},"401":{"description":"Sem chave, chave que não confere, revogada ou token vencido.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"O app não tem o escopo, ou a pessoa não pode pelo perfil.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Não existe nesta clínica.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Passou de 100 chamadas por minuto; veja `Retry-After`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/webhooks/{id}/test":{"post":{"operationId":"testWebhook","x-mint":{"href":"/api-reference/webhooks/enviar-teste"},"tags":["Webhooks"],"summary":"Enviar teste","description":"Põe o evento `webhook.test` na fila só deste webhook; ele sai no próximo minuto. Um teste por vez: o anterior ainda na fila é 409.\n\n**Escopo do app:** `webhooks:write`. Só a chave do app; pelo OAuth, 403.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"201":{"description":"Criado.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Delivery"}},"required":["data"]},"example":{"data":{"id":"1f2e3d4c-5b6a-4978-8695-a4b3c2d1e0f9","webhookId":"9a8b7c6d-5e4f-4a3b-8c2d-1e0f9a8b7c6d","eventId":"0e9d8c7b-6a5f-4e3d-9c2b-1a0f9e8d7c6b","eventType":"webhook.test","status":"pending","attempts":0,"nextAttemptAt":null,"lastAttemptAt":"2026-10-15T14:30:00Z","responseStatus":200,"durationMs":184,"error":null,"createdAt":"2026-10-15T14:30:00Z"}}}}},"401":{"description":"Sem chave, chave que não confere, revogada ou token vencido.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"O app não tem o escopo, ou a pessoa não pode pelo perfil.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Não existe nesta clínica.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Conflito com o estado atual (já existe, já enviado, outra alteração chegou antes, ou a mesma Idempotency-Key ainda em andamento).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Passou de 100 chamadas por minuto; veja `Retry-After`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/webhooks/{id}/deliveries":{"get":{"operationId":"listWebhookDeliveries","x-mint":{"href":"/api-reference/webhooks/listar-entregas"},"tags":["Webhooks"],"summary":"Listar entregas","description":"As entregas deste webhook, das mais novas para as mais antigas.\n\n**Escopo do app:** `webhooks:write`. Só a chave do app; pelo OAuth, 403.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"limit","in":"query","required":false,"schema":{"default":25,"description":"Itens por página, de 1 a 100.","type":"integer","minimum":1,"maximum":100},"description":"Itens por página, de 1 a 100."},{"name":"cursor","in":"query","required":false,"schema":{"type":"string","minLength":1,"maxLength":400,"description":"O `nextCursor` da página anterior."},"description":"O `nextCursor` da página anterior."},{"name":"status","in":"query","required":false,"schema":{"type":"string","enum":["pending","succeeded","failed"]}}],"responses":{"200":{"description":"Sucesso.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Delivery"}},"meta":{"$ref":"#/components/schemas/PageMeta"}},"required":["data","meta"]},"example":{"data":[{"id":"1f2e3d4c-5b6a-4978-8695-a4b3c2d1e0f9","webhookId":"9a8b7c6d-5e4f-4a3b-8c2d-1e0f9a8b7c6d","eventId":"0e9d8c7b-6a5f-4e3d-9c2b-1a0f9e8d7c6b","eventType":"signature_request.completed","status":"succeeded","attempts":1,"nextAttemptAt":null,"lastAttemptAt":"2026-10-15T14:30:00Z","responseStatus":200,"durationMs":184,"error":null,"createdAt":"2026-10-15T14:30:00Z"}],"meta":{"limit":25,"nextCursor":null}}}}},"400":{"description":"O corpo não é JSON, ou falta o que a rota precisa.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Sem chave, chave que não confere, revogada ou token vencido.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"O app não tem o escopo, ou a pessoa não pode pelo perfil.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Não existe nesta clínica.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"422":{"description":"Dado que não passa na regra; `fields` traz a mensagem de cada campo.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Passou de 100 chamadas por minuto; veja `Retry-After`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/webhooks/{id}/deliveries/{deliveryId}/retry":{"post":{"operationId":"retryWebhookDelivery","x-mint":{"href":"/api-reference/webhooks/reenviar-entrega"},"tags":["Webhooks"],"summary":"Reenviar entrega","description":"Põe a entrega na fila de novo; sai no próximo minuto.\n\n**Escopo do app:** `webhooks:write`. Só a chave do app; pelo OAuth, 403.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"deliveryId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Sucesso.","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Delivery"}},"required":["data"]},"example":{"data":{"id":"1f2e3d4c-5b6a-4978-8695-a4b3c2d1e0f9","webhookId":"9a8b7c6d-5e4f-4a3b-8c2d-1e0f9a8b7c6d","eventId":"0e9d8c7b-6a5f-4e3d-9c2b-1a0f9e8d7c6b","eventType":"signature_request.completed","status":"pending","attempts":1,"nextAttemptAt":null,"lastAttemptAt":"2026-10-15T14:30:00Z","responseStatus":200,"durationMs":184,"error":null,"createdAt":"2026-10-15T14:30:00Z"}}}}},"401":{"description":"Sem chave, chave que não confere, revogada ou token vencido.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"O app não tem o escopo, ou a pessoa não pode pelo perfil.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Não existe nesta clínica.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Conflito com o estado atual (já existe, já enviado, outra alteração chegou antes, ou a mesma Idempotency-Key ainda em andamento).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Passou de 100 chamadas por minuto; veja `Retry-After`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/openapi.json":{"get":{"operationId":"getOpenApi","x-mint":{"href":"/api-reference/conta/este-documento"},"tags":["Conta"],"summary":"Este documento","description":"O OpenAPI 3.1 desta API, sem autenticação.","security":[],"responses":{"200":{"description":"O documento.","content":{"application/json":{"schema":{"type":"object"}}}}}}}},"webhooks":{"patient.created":{"post":{"operationId":"webhook_patient_created","x-mint":{"href":"/api-reference/eventos/patient-created"},"tags":["Eventos"],"summary":"patient.created","description":"Uma ficha de paciente foi criada: pelo app, pelo link de cadastro da clínica ou pela API.\n\n`data`: `patientId`.","parameters":[{"name":"webhook-id","in":"header","required":true,"schema":{"type":"string"},"description":"O id do evento."},{"name":"webhook-timestamp","in":"header","required":true,"schema":{"type":"string"},"description":"Segundos desde a época."},{"name":"webhook-signature","in":"header","required":true,"schema":{"type":"string"},"description":"`v1,<base64>`; mais de uma, separadas por espaço, na troca do segredo."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Event"},"example":{"id":"0e9d8c7b-6a5f-4e3d-9c2b-1a0f9e8d7c6b","type":"patient.created","createdAt":"2026-10-15T14:30:00Z","clinicId":"2b7f0a3c-5d1e-4c8a-9f60-1a2b3c4d5e6f","actor":{"type":"system","id":null},"data":{"signatureRequestId":"6f7e8d9c-0b1a-4f2e-9d3c-4b5a69788796","appointmentId":"3c9d1e2f-4a5b-4c7d-8e9f-0a1b2c3d4e5f","patientId":"f47ac10b-58cc-4372-a567-0e02b2c3d479","protocolNumber":"WX-4472-BM","documentIds":["d4e5f6a7-b8c9-4123-8ef4-567890123456"]}}}}},"responses":{"200":{"description":"Qualquer 2xx em até 10 segundos é entregue."}}}},"patient.updated":{"post":{"operationId":"webhook_patient_updated","x-mint":{"href":"/api-reference/eventos/patient-updated"},"tags":["Eventos"],"summary":"patient.updated","description":"O cadastro da paciente mudou; `changedFields` diz quais campos, quando a mudança veio do cadastro.\n\n`data`: `patientId`, `changedFields`.","parameters":[{"name":"webhook-id","in":"header","required":true,"schema":{"type":"string"},"description":"O id do evento."},{"name":"webhook-timestamp","in":"header","required":true,"schema":{"type":"string"},"description":"Segundos desde a época."},{"name":"webhook-signature","in":"header","required":true,"schema":{"type":"string"},"description":"`v1,<base64>`; mais de uma, separadas por espaço, na troca do segredo."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Event"},"example":{"id":"0e9d8c7b-6a5f-4e3d-9c2b-1a0f9e8d7c6b","type":"patient.updated","createdAt":"2026-10-15T14:30:00Z","clinicId":"2b7f0a3c-5d1e-4c8a-9f60-1a2b3c4d5e6f","actor":{"type":"system","id":null},"data":{"signatureRequestId":"6f7e8d9c-0b1a-4f2e-9d3c-4b5a69788796","appointmentId":"3c9d1e2f-4a5b-4c7d-8e9f-0a1b2c3d4e5f","patientId":"f47ac10b-58cc-4372-a567-0e02b2c3d479","protocolNumber":"WX-4472-BM","documentIds":["d4e5f6a7-b8c9-4123-8ef4-567890123456"]}}}}},"responses":{"200":{"description":"Qualquer 2xx em até 10 segundos é entregue."}}}},"patient.archived":{"post":{"operationId":"webhook_patient_archived","x-mint":{"href":"/api-reference/eventos/patient-archived"},"tags":["Eventos"],"summary":"patient.archived","description":"A ficha foi arquivada pela gestora.\n\n`data`: `patientId`.","parameters":[{"name":"webhook-id","in":"header","required":true,"schema":{"type":"string"},"description":"O id do evento."},{"name":"webhook-timestamp","in":"header","required":true,"schema":{"type":"string"},"description":"Segundos desde a época."},{"name":"webhook-signature","in":"header","required":true,"schema":{"type":"string"},"description":"`v1,<base64>`; mais de uma, separadas por espaço, na troca do segredo."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Event"},"example":{"id":"0e9d8c7b-6a5f-4e3d-9c2b-1a0f9e8d7c6b","type":"patient.archived","createdAt":"2026-10-15T14:30:00Z","clinicId":"2b7f0a3c-5d1e-4c8a-9f60-1a2b3c4d5e6f","actor":{"type":"system","id":null},"data":{"signatureRequestId":"6f7e8d9c-0b1a-4f2e-9d3c-4b5a69788796","appointmentId":"3c9d1e2f-4a5b-4c7d-8e9f-0a1b2c3d4e5f","patientId":"f47ac10b-58cc-4372-a567-0e02b2c3d479","protocolNumber":"WX-4472-BM","documentIds":["d4e5f6a7-b8c9-4123-8ef4-567890123456"]}}}}},"responses":{"200":{"description":"Qualquer 2xx em até 10 segundos é entregue."}}}},"patient.restored":{"post":{"operationId":"webhook_patient_restored","x-mint":{"href":"/api-reference/eventos/patient-restored"},"tags":["Eventos"],"summary":"patient.restored","description":"A ficha arquivada voltou a ativa.\n\n`data`: `patientId`.","parameters":[{"name":"webhook-id","in":"header","required":true,"schema":{"type":"string"},"description":"O id do evento."},{"name":"webhook-timestamp","in":"header","required":true,"schema":{"type":"string"},"description":"Segundos desde a época."},{"name":"webhook-signature","in":"header","required":true,"schema":{"type":"string"},"description":"`v1,<base64>`; mais de uma, separadas por espaço, na troca do segredo."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Event"},"example":{"id":"0e9d8c7b-6a5f-4e3d-9c2b-1a0f9e8d7c6b","type":"patient.restored","createdAt":"2026-10-15T14:30:00Z","clinicId":"2b7f0a3c-5d1e-4c8a-9f60-1a2b3c4d5e6f","actor":{"type":"system","id":null},"data":{"signatureRequestId":"6f7e8d9c-0b1a-4f2e-9d3c-4b5a69788796","appointmentId":"3c9d1e2f-4a5b-4c7d-8e9f-0a1b2c3d4e5f","patientId":"f47ac10b-58cc-4372-a567-0e02b2c3d479","protocolNumber":"WX-4472-BM","documentIds":["d4e5f6a7-b8c9-4123-8ef4-567890123456"]}}}}},"responses":{"200":{"description":"Qualquer 2xx em até 10 segundos é entregue."}}}},"patient.merged":{"post":{"operationId":"webhook_patient_merged","x-mint":{"href":"/api-reference/eventos/patient-merged"},"tags":["Eventos"],"summary":"patient.merged","description":"Duas fichas da mesma pessoa foram unificadas.\n\n`data`: `patientId`.","parameters":[{"name":"webhook-id","in":"header","required":true,"schema":{"type":"string"},"description":"O id do evento."},{"name":"webhook-timestamp","in":"header","required":true,"schema":{"type":"string"},"description":"Segundos desde a época."},{"name":"webhook-signature","in":"header","required":true,"schema":{"type":"string"},"description":"`v1,<base64>`; mais de uma, separadas por espaço, na troca do segredo."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Event"},"example":{"id":"0e9d8c7b-6a5f-4e3d-9c2b-1a0f9e8d7c6b","type":"patient.merged","createdAt":"2026-10-15T14:30:00Z","clinicId":"2b7f0a3c-5d1e-4c8a-9f60-1a2b3c4d5e6f","actor":{"type":"system","id":null},"data":{"signatureRequestId":"6f7e8d9c-0b1a-4f2e-9d3c-4b5a69788796","appointmentId":"3c9d1e2f-4a5b-4c7d-8e9f-0a1b2c3d4e5f","patientId":"f47ac10b-58cc-4372-a567-0e02b2c3d479","protocolNumber":"WX-4472-BM","documentIds":["d4e5f6a7-b8c9-4123-8ef4-567890123456"]}}}}},"responses":{"200":{"description":"Qualquer 2xx em até 10 segundos é entregue."}}}},"anamnesis.sent":{"post":{"operationId":"webhook_anamnesis_sent","x-mint":{"href":"/api-reference/eventos/anamnesis-sent"},"tags":["Eventos"],"summary":"anamnesis.sent","description":"A anamnese foi enviada à paciente (ou o link foi gerado).\n\n`data`: `anamnesisId`, `patientId`.","parameters":[{"name":"webhook-id","in":"header","required":true,"schema":{"type":"string"},"description":"O id do evento."},{"name":"webhook-timestamp","in":"header","required":true,"schema":{"type":"string"},"description":"Segundos desde a época."},{"name":"webhook-signature","in":"header","required":true,"schema":{"type":"string"},"description":"`v1,<base64>`; mais de uma, separadas por espaço, na troca do segredo."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Event"},"example":{"id":"0e9d8c7b-6a5f-4e3d-9c2b-1a0f9e8d7c6b","type":"anamnesis.sent","createdAt":"2026-10-15T14:30:00Z","clinicId":"2b7f0a3c-5d1e-4c8a-9f60-1a2b3c4d5e6f","actor":{"type":"system","id":null},"data":{"signatureRequestId":"6f7e8d9c-0b1a-4f2e-9d3c-4b5a69788796","appointmentId":"3c9d1e2f-4a5b-4c7d-8e9f-0a1b2c3d4e5f","patientId":"f47ac10b-58cc-4372-a567-0e02b2c3d479","protocolNumber":"WX-4472-BM","documentIds":["d4e5f6a7-b8c9-4123-8ef4-567890123456"]}}}}},"responses":{"200":{"description":"Qualquer 2xx em até 10 segundos é entregue."}}}},"anamnesis.resent":{"post":{"operationId":"webhook_anamnesis_resent","x-mint":{"href":"/api-reference/eventos/anamnesis-resent"},"tags":["Eventos"],"summary":"anamnesis.resent","description":"O link da anamnese foi reenviado; o anterior deixou de valer.\n\n`data`: `anamnesisId`, `patientId`.","parameters":[{"name":"webhook-id","in":"header","required":true,"schema":{"type":"string"},"description":"O id do evento."},{"name":"webhook-timestamp","in":"header","required":true,"schema":{"type":"string"},"description":"Segundos desde a época."},{"name":"webhook-signature","in":"header","required":true,"schema":{"type":"string"},"description":"`v1,<base64>`; mais de uma, separadas por espaço, na troca do segredo."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Event"},"example":{"id":"0e9d8c7b-6a5f-4e3d-9c2b-1a0f9e8d7c6b","type":"anamnesis.resent","createdAt":"2026-10-15T14:30:00Z","clinicId":"2b7f0a3c-5d1e-4c8a-9f60-1a2b3c4d5e6f","actor":{"type":"system","id":null},"data":{"signatureRequestId":"6f7e8d9c-0b1a-4f2e-9d3c-4b5a69788796","appointmentId":"3c9d1e2f-4a5b-4c7d-8e9f-0a1b2c3d4e5f","patientId":"f47ac10b-58cc-4372-a567-0e02b2c3d479","protocolNumber":"WX-4472-BM","documentIds":["d4e5f6a7-b8c9-4123-8ef4-567890123456"]}}}}},"responses":{"200":{"description":"Qualquer 2xx em até 10 segundos é entregue."}}}},"anamnesis.completed":{"post":{"operationId":"webhook_anamnesis_completed","x-mint":{"href":"/api-reference/eventos/anamnesis-completed"},"tags":["Eventos"],"summary":"anamnesis.completed","description":"A paciente respondeu e enviou a anamnese; traz o protocolo.\n\n`data`: `anamnesisId`, `patientId`, `protocolNumber`.","parameters":[{"name":"webhook-id","in":"header","required":true,"schema":{"type":"string"},"description":"O id do evento."},{"name":"webhook-timestamp","in":"header","required":true,"schema":{"type":"string"},"description":"Segundos desde a época."},{"name":"webhook-signature","in":"header","required":true,"schema":{"type":"string"},"description":"`v1,<base64>`; mais de uma, separadas por espaço, na troca do segredo."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Event"},"example":{"id":"0e9d8c7b-6a5f-4e3d-9c2b-1a0f9e8d7c6b","type":"anamnesis.completed","createdAt":"2026-10-15T14:30:00Z","clinicId":"2b7f0a3c-5d1e-4c8a-9f60-1a2b3c4d5e6f","actor":{"type":"system","id":null},"data":{"signatureRequestId":"6f7e8d9c-0b1a-4f2e-9d3c-4b5a69788796","appointmentId":"3c9d1e2f-4a5b-4c7d-8e9f-0a1b2c3d4e5f","patientId":"f47ac10b-58cc-4372-a567-0e02b2c3d479","protocolNumber":"WX-4472-BM","documentIds":["d4e5f6a7-b8c9-4123-8ef4-567890123456"]}}}}},"responses":{"200":{"description":"Qualquer 2xx em até 10 segundos é entregue."}}}},"anamnesis.canceled":{"post":{"operationId":"webhook_anamnesis_canceled","x-mint":{"href":"/api-reference/eventos/anamnesis-canceled"},"tags":["Eventos"],"summary":"anamnesis.canceled","description":"A anamnese foi cancelada antes de ser respondida.\n\n`data`: `anamnesisId`, `patientId`.","parameters":[{"name":"webhook-id","in":"header","required":true,"schema":{"type":"string"},"description":"O id do evento."},{"name":"webhook-timestamp","in":"header","required":true,"schema":{"type":"string"},"description":"Segundos desde a época."},{"name":"webhook-signature","in":"header","required":true,"schema":{"type":"string"},"description":"`v1,<base64>`; mais de uma, separadas por espaço, na troca do segredo."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Event"},"example":{"id":"0e9d8c7b-6a5f-4e3d-9c2b-1a0f9e8d7c6b","type":"anamnesis.canceled","createdAt":"2026-10-15T14:30:00Z","clinicId":"2b7f0a3c-5d1e-4c8a-9f60-1a2b3c4d5e6f","actor":{"type":"system","id":null},"data":{"signatureRequestId":"6f7e8d9c-0b1a-4f2e-9d3c-4b5a69788796","appointmentId":"3c9d1e2f-4a5b-4c7d-8e9f-0a1b2c3d4e5f","patientId":"f47ac10b-58cc-4372-a567-0e02b2c3d479","protocolNumber":"WX-4472-BM","documentIds":["d4e5f6a7-b8c9-4123-8ef4-567890123456"]}}}}},"responses":{"200":{"description":"Qualquer 2xx em até 10 segundos é entregue."}}}},"appointment.documents_generated":{"post":{"operationId":"webhook_appointment_documents_generated","x-mint":{"href":"/api-reference/eventos/appointment-documents-generated"},"tags":["Eventos"],"summary":"appointment.documents_generated","description":"O contrato e os termos do atendimento foram gerados (ou gerados de novo); traz a geração.\n\n`data`: `appointmentId`, `patientId`, `generation`.","parameters":[{"name":"webhook-id","in":"header","required":true,"schema":{"type":"string"},"description":"O id do evento."},{"name":"webhook-timestamp","in":"header","required":true,"schema":{"type":"string"},"description":"Segundos desde a época."},{"name":"webhook-signature","in":"header","required":true,"schema":{"type":"string"},"description":"`v1,<base64>`; mais de uma, separadas por espaço, na troca do segredo."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Event"},"example":{"id":"0e9d8c7b-6a5f-4e3d-9c2b-1a0f9e8d7c6b","type":"appointment.documents_generated","createdAt":"2026-10-15T14:30:00Z","clinicId":"2b7f0a3c-5d1e-4c8a-9f60-1a2b3c4d5e6f","actor":{"type":"system","id":null},"data":{"signatureRequestId":"6f7e8d9c-0b1a-4f2e-9d3c-4b5a69788796","appointmentId":"3c9d1e2f-4a5b-4c7d-8e9f-0a1b2c3d4e5f","patientId":"f47ac10b-58cc-4372-a567-0e02b2c3d479","protocolNumber":"WX-4472-BM","documentIds":["d4e5f6a7-b8c9-4123-8ef4-567890123456"]}}}}},"responses":{"200":{"description":"Qualquer 2xx em até 10 segundos é entregue."}}}},"appointment.canceled":{"post":{"operationId":"webhook_appointment_canceled","x-mint":{"href":"/api-reference/eventos/appointment-canceled"},"tags":["Eventos"],"summary":"appointment.canceled","description":"Os documentos do atendimento foram cancelados.\n\n`data`: `appointmentId`, `patientId`.","parameters":[{"name":"webhook-id","in":"header","required":true,"schema":{"type":"string"},"description":"O id do evento."},{"name":"webhook-timestamp","in":"header","required":true,"schema":{"type":"string"},"description":"Segundos desde a época."},{"name":"webhook-signature","in":"header","required":true,"schema":{"type":"string"},"description":"`v1,<base64>`; mais de uma, separadas por espaço, na troca do segredo."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Event"},"example":{"id":"0e9d8c7b-6a5f-4e3d-9c2b-1a0f9e8d7c6b","type":"appointment.canceled","createdAt":"2026-10-15T14:30:00Z","clinicId":"2b7f0a3c-5d1e-4c8a-9f60-1a2b3c4d5e6f","actor":{"type":"system","id":null},"data":{"signatureRequestId":"6f7e8d9c-0b1a-4f2e-9d3c-4b5a69788796","appointmentId":"3c9d1e2f-4a5b-4c7d-8e9f-0a1b2c3d4e5f","patientId":"f47ac10b-58cc-4372-a567-0e02b2c3d479","protocolNumber":"WX-4472-BM","documentIds":["d4e5f6a7-b8c9-4123-8ef4-567890123456"]}}}}},"responses":{"200":{"description":"Qualquer 2xx em até 10 segundos é entregue."}}}},"signature_request.sent":{"post":{"operationId":"webhook_signature_request_sent","x-mint":{"href":"/api-reference/eventos/signature-request-sent"},"tags":["Eventos"],"summary":"signature_request.sent","description":"Os documentos saíram para a paciente assinar, depois da janela de 10 segundos.\n\n`data`: `signatureRequestId`, `appointmentId`, `patientId`, `protocolNumber`.","parameters":[{"name":"webhook-id","in":"header","required":true,"schema":{"type":"string"},"description":"O id do evento."},{"name":"webhook-timestamp","in":"header","required":true,"schema":{"type":"string"},"description":"Segundos desde a época."},{"name":"webhook-signature","in":"header","required":true,"schema":{"type":"string"},"description":"`v1,<base64>`; mais de uma, separadas por espaço, na troca do segredo."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Event"},"example":{"id":"0e9d8c7b-6a5f-4e3d-9c2b-1a0f9e8d7c6b","type":"signature_request.sent","createdAt":"2026-10-15T14:30:00Z","clinicId":"2b7f0a3c-5d1e-4c8a-9f60-1a2b3c4d5e6f","actor":{"type":"system","id":null},"data":{"signatureRequestId":"6f7e8d9c-0b1a-4f2e-9d3c-4b5a69788796","appointmentId":"3c9d1e2f-4a5b-4c7d-8e9f-0a1b2c3d4e5f","patientId":"f47ac10b-58cc-4372-a567-0e02b2c3d479","protocolNumber":"WX-4472-BM","documentIds":["d4e5f6a7-b8c9-4123-8ef4-567890123456"]}}}}},"responses":{"200":{"description":"Qualquer 2xx em até 10 segundos é entregue."}}}},"signature_request.resent":{"post":{"operationId":"webhook_signature_request_resent","x-mint":{"href":"/api-reference/eventos/signature-request-resent"},"tags":["Eventos"],"summary":"signature_request.resent","description":"O link de assinatura foi reenviado.\n\n`data`: `signatureRequestId`, `appointmentId`, `patientId`, `protocolNumber`.","parameters":[{"name":"webhook-id","in":"header","required":true,"schema":{"type":"string"},"description":"O id do evento."},{"name":"webhook-timestamp","in":"header","required":true,"schema":{"type":"string"},"description":"Segundos desde a época."},{"name":"webhook-signature","in":"header","required":true,"schema":{"type":"string"},"description":"`v1,<base64>`; mais de uma, separadas por espaço, na troca do segredo."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Event"},"example":{"id":"0e9d8c7b-6a5f-4e3d-9c2b-1a0f9e8d7c6b","type":"signature_request.resent","createdAt":"2026-10-15T14:30:00Z","clinicId":"2b7f0a3c-5d1e-4c8a-9f60-1a2b3c4d5e6f","actor":{"type":"system","id":null},"data":{"signatureRequestId":"6f7e8d9c-0b1a-4f2e-9d3c-4b5a69788796","appointmentId":"3c9d1e2f-4a5b-4c7d-8e9f-0a1b2c3d4e5f","patientId":"f47ac10b-58cc-4372-a567-0e02b2c3d479","protocolNumber":"WX-4472-BM","documentIds":["d4e5f6a7-b8c9-4123-8ef4-567890123456"]}}}}},"responses":{"200":{"description":"Qualquer 2xx em até 10 segundos é entregue."}}}},"signature_request.viewed":{"post":{"operationId":"webhook_signature_request_viewed","x-mint":{"href":"/api-reference/eventos/signature-request-viewed"},"tags":["Eventos"],"summary":"signature_request.viewed","description":"A paciente abriu o link de assinatura.\n\n`data`: `signatureRequestId`, `appointmentId`, `patientId`, `protocolNumber`.","parameters":[{"name":"webhook-id","in":"header","required":true,"schema":{"type":"string"},"description":"O id do evento."},{"name":"webhook-timestamp","in":"header","required":true,"schema":{"type":"string"},"description":"Segundos desde a época."},{"name":"webhook-signature","in":"header","required":true,"schema":{"type":"string"},"description":"`v1,<base64>`; mais de uma, separadas por espaço, na troca do segredo."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Event"},"example":{"id":"0e9d8c7b-6a5f-4e3d-9c2b-1a0f9e8d7c6b","type":"signature_request.viewed","createdAt":"2026-10-15T14:30:00Z","clinicId":"2b7f0a3c-5d1e-4c8a-9f60-1a2b3c4d5e6f","actor":{"type":"system","id":null},"data":{"signatureRequestId":"6f7e8d9c-0b1a-4f2e-9d3c-4b5a69788796","appointmentId":"3c9d1e2f-4a5b-4c7d-8e9f-0a1b2c3d4e5f","patientId":"f47ac10b-58cc-4372-a567-0e02b2c3d479","protocolNumber":"WX-4472-BM","documentIds":["d4e5f6a7-b8c9-4123-8ef4-567890123456"]}}}}},"responses":{"200":{"description":"Qualquer 2xx em até 10 segundos é entregue."}}}},"signature_request.signed":{"post":{"operationId":"webhook_signature_request_signed","x-mint":{"href":"/api-reference/eventos/signature-request-signed"},"tags":["Eventos"],"summary":"signature_request.signed","description":"Alguém assinou: `signer` é `patient`, `guardian` ou `clinic`.\n\n`data`: `signatureRequestId`, `appointmentId`, `patientId`, `protocolNumber`, `signer`.","parameters":[{"name":"webhook-id","in":"header","required":true,"schema":{"type":"string"},"description":"O id do evento."},{"name":"webhook-timestamp","in":"header","required":true,"schema":{"type":"string"},"description":"Segundos desde a época."},{"name":"webhook-signature","in":"header","required":true,"schema":{"type":"string"},"description":"`v1,<base64>`; mais de uma, separadas por espaço, na troca do segredo."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Event"},"example":{"id":"0e9d8c7b-6a5f-4e3d-9c2b-1a0f9e8d7c6b","type":"signature_request.signed","createdAt":"2026-10-15T14:30:00Z","clinicId":"2b7f0a3c-5d1e-4c8a-9f60-1a2b3c4d5e6f","actor":{"type":"system","id":null},"data":{"signatureRequestId":"6f7e8d9c-0b1a-4f2e-9d3c-4b5a69788796","appointmentId":"3c9d1e2f-4a5b-4c7d-8e9f-0a1b2c3d4e5f","patientId":"f47ac10b-58cc-4372-a567-0e02b2c3d479","protocolNumber":"WX-4472-BM","documentIds":["d4e5f6a7-b8c9-4123-8ef4-567890123456"]}}}}},"responses":{"200":{"description":"Qualquer 2xx em até 10 segundos é entregue."}}}},"signature_request.completed":{"post":{"operationId":"webhook_signature_request_completed","x-mint":{"href":"/api-reference/eventos/signature-request-completed"},"tags":["Eventos"],"summary":"signature_request.completed","description":"Todos assinaram todos os documentos do envio. É o evento para marcar a venda.\n\n`data`: `signatureRequestId`, `appointmentId`, `patientId`, `protocolNumber`, `documentIds`.","parameters":[{"name":"webhook-id","in":"header","required":true,"schema":{"type":"string"},"description":"O id do evento."},{"name":"webhook-timestamp","in":"header","required":true,"schema":{"type":"string"},"description":"Segundos desde a época."},{"name":"webhook-signature","in":"header","required":true,"schema":{"type":"string"},"description":"`v1,<base64>`; mais de uma, separadas por espaço, na troca do segredo."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Event"},"example":{"id":"0e9d8c7b-6a5f-4e3d-9c2b-1a0f9e8d7c6b","type":"signature_request.completed","createdAt":"2026-10-15T14:30:00Z","clinicId":"2b7f0a3c-5d1e-4c8a-9f60-1a2b3c4d5e6f","actor":{"type":"system","id":null},"data":{"signatureRequestId":"6f7e8d9c-0b1a-4f2e-9d3c-4b5a69788796","appointmentId":"3c9d1e2f-4a5b-4c7d-8e9f-0a1b2c3d4e5f","patientId":"f47ac10b-58cc-4372-a567-0e02b2c3d479","protocolNumber":"WX-4472-BM","documentIds":["d4e5f6a7-b8c9-4123-8ef4-567890123456"]}}}}},"responses":{"200":{"description":"Qualquer 2xx em até 10 segundos é entregue."}}}},"signature_request.declined":{"post":{"operationId":"webhook_signature_request_declined","x-mint":{"href":"/api-reference/eventos/signature-request-declined"},"tags":["Eventos"],"summary":"signature_request.declined","description":"A paciente recusou assinar.\n\n`data`: `signatureRequestId`, `appointmentId`, `patientId`, `protocolNumber`.","parameters":[{"name":"webhook-id","in":"header","required":true,"schema":{"type":"string"},"description":"O id do evento."},{"name":"webhook-timestamp","in":"header","required":true,"schema":{"type":"string"},"description":"Segundos desde a época."},{"name":"webhook-signature","in":"header","required":true,"schema":{"type":"string"},"description":"`v1,<base64>`; mais de uma, separadas por espaço, na troca do segredo."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Event"},"example":{"id":"0e9d8c7b-6a5f-4e3d-9c2b-1a0f9e8d7c6b","type":"signature_request.declined","createdAt":"2026-10-15T14:30:00Z","clinicId":"2b7f0a3c-5d1e-4c8a-9f60-1a2b3c4d5e6f","actor":{"type":"system","id":null},"data":{"signatureRequestId":"6f7e8d9c-0b1a-4f2e-9d3c-4b5a69788796","appointmentId":"3c9d1e2f-4a5b-4c7d-8e9f-0a1b2c3d4e5f","patientId":"f47ac10b-58cc-4372-a567-0e02b2c3d479","protocolNumber":"WX-4472-BM","documentIds":["d4e5f6a7-b8c9-4123-8ef4-567890123456"]}}}}},"responses":{"200":{"description":"Qualquer 2xx em até 10 segundos é entregue."}}}},"signature_request.expired":{"post":{"operationId":"webhook_signature_request_expired","x-mint":{"href":"/api-reference/eventos/signature-request-expired"},"tags":["Eventos"],"summary":"signature_request.expired","description":"O link de assinatura venceu sem todas as assinaturas.\n\n`data`: `signatureRequestId`, `appointmentId`, `patientId`, `protocolNumber`.","parameters":[{"name":"webhook-id","in":"header","required":true,"schema":{"type":"string"},"description":"O id do evento."},{"name":"webhook-timestamp","in":"header","required":true,"schema":{"type":"string"},"description":"Segundos desde a época."},{"name":"webhook-signature","in":"header","required":true,"schema":{"type":"string"},"description":"`v1,<base64>`; mais de uma, separadas por espaço, na troca do segredo."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Event"},"example":{"id":"0e9d8c7b-6a5f-4e3d-9c2b-1a0f9e8d7c6b","type":"signature_request.expired","createdAt":"2026-10-15T14:30:00Z","clinicId":"2b7f0a3c-5d1e-4c8a-9f60-1a2b3c4d5e6f","actor":{"type":"system","id":null},"data":{"signatureRequestId":"6f7e8d9c-0b1a-4f2e-9d3c-4b5a69788796","appointmentId":"3c9d1e2f-4a5b-4c7d-8e9f-0a1b2c3d4e5f","patientId":"f47ac10b-58cc-4372-a567-0e02b2c3d479","protocolNumber":"WX-4472-BM","documentIds":["d4e5f6a7-b8c9-4123-8ef4-567890123456"]}}}}},"responses":{"200":{"description":"Qualquer 2xx em até 10 segundos é entregue."}}}},"signature_request.canceled":{"post":{"operationId":"webhook_signature_request_canceled","x-mint":{"href":"/api-reference/eventos/signature-request-canceled"},"tags":["Eventos"],"summary":"signature_request.canceled","description":"O envio foi cancelado pela clínica.\n\n`data`: `signatureRequestId`, `appointmentId`, `patientId`, `protocolNumber`.","parameters":[{"name":"webhook-id","in":"header","required":true,"schema":{"type":"string"},"description":"O id do evento."},{"name":"webhook-timestamp","in":"header","required":true,"schema":{"type":"string"},"description":"Segundos desde a época."},{"name":"webhook-signature","in":"header","required":true,"schema":{"type":"string"},"description":"`v1,<base64>`; mais de uma, separadas por espaço, na troca do segredo."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Event"},"example":{"id":"0e9d8c7b-6a5f-4e3d-9c2b-1a0f9e8d7c6b","type":"signature_request.canceled","createdAt":"2026-10-15T14:30:00Z","clinicId":"2b7f0a3c-5d1e-4c8a-9f60-1a2b3c4d5e6f","actor":{"type":"system","id":null},"data":{"signatureRequestId":"6f7e8d9c-0b1a-4f2e-9d3c-4b5a69788796","appointmentId":"3c9d1e2f-4a5b-4c7d-8e9f-0a1b2c3d4e5f","patientId":"f47ac10b-58cc-4372-a567-0e02b2c3d479","protocolNumber":"WX-4472-BM","documentIds":["d4e5f6a7-b8c9-4123-8ef4-567890123456"]}}}}},"responses":{"200":{"description":"Qualquer 2xx em até 10 segundos é entregue."}}}},"signature_request.delivery_failed":{"post":{"operationId":"webhook_signature_request_delivery_failed","x-mint":{"href":"/api-reference/eventos/signature-request-delivery-failed"},"tags":["Eventos"],"summary":"signature_request.delivery_failed","description":"A mensagem com o link não chegou por um canal; traz `channel`.\n\n`data`: `signatureRequestId`, `appointmentId`, `patientId`, `protocolNumber`, `channel`.","parameters":[{"name":"webhook-id","in":"header","required":true,"schema":{"type":"string"},"description":"O id do evento."},{"name":"webhook-timestamp","in":"header","required":true,"schema":{"type":"string"},"description":"Segundos desde a época."},{"name":"webhook-signature","in":"header","required":true,"schema":{"type":"string"},"description":"`v1,<base64>`; mais de uma, separadas por espaço, na troca do segredo."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Event"},"example":{"id":"0e9d8c7b-6a5f-4e3d-9c2b-1a0f9e8d7c6b","type":"signature_request.delivery_failed","createdAt":"2026-10-15T14:30:00Z","clinicId":"2b7f0a3c-5d1e-4c8a-9f60-1a2b3c4d5e6f","actor":{"type":"system","id":null},"data":{"signatureRequestId":"6f7e8d9c-0b1a-4f2e-9d3c-4b5a69788796","appointmentId":"3c9d1e2f-4a5b-4c7d-8e9f-0a1b2c3d4e5f","patientId":"f47ac10b-58cc-4372-a567-0e02b2c3d479","protocolNumber":"WX-4472-BM","documentIds":["d4e5f6a7-b8c9-4123-8ef4-567890123456"]}}}}},"responses":{"200":{"description":"Qualquer 2xx em até 10 segundos é entregue."}}}}},"components":{"schemas":{"Me":{"type":"object","properties":{"type":{"type":"string","enum":["integration","user"],"description":"Quem chama: um app de integração (chave) ou uma pessoa (OAuth)."},"integration":{"anyOf":[{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"description":{"type":["string","null"]},"scopes":{"type":"array","items":{"type":"string","enum":["patients:read","patients:write","anamneses:read","anamneses:write","anamneses:answers","documents:read","documents:write","catalog:read","webhooks:write"]}},"keyPrefix":{"type":"string"},"createdAt":{"type":"string","description":"Data e hora ISO 8601, em UTC."}},"required":["id","name","description","scopes","keyPrefix","createdAt"],"additionalProperties":false},{"type":"null"}]},"user":{"anyOf":[{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"email":{"type":"string"}},"required":["id","name","email"],"additionalProperties":false},{"type":"null"}]},"role":{"anyOf":[{"type":"string","enum":["receptionist","practitioner","manager","root"]},{"type":"null"}]},"clinic":{"anyOf":[{"$ref":"#/components/schemas/Clinic"},{"type":"null"}]}},"required":["type","integration","user","role","clinic"],"additionalProperties":false,"description":"Quem está chamando e em que clínica."},"Clinic":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string","description":"O nome fantasia, ou a razão social."},"legalName":{"type":"string"},"timezone":{"type":"string"}},"required":["id","name","legalName","timezone"],"additionalProperties":false,"description":"A clínica do app ou da conexão."},"Patient":{"type":"object","properties":{"id":{"type":"string"},"audience":{"type":"string","enum":["patient","student","employee","third_party"],"description":"O público da pessoa (RN-PAC-36)."},"status":{"type":"string","enum":["active","archived","merged"]},"name":{"type":"string"},"birthDate":{"anyOf":[{"type":"string","description":"Data no formato aaaa-mm-dd."},{"type":"null"}]},"isMinor":{"type":"boolean","description":"Menos de 18 anos no fuso da clínica."},"docType":{"anyOf":[{"type":"string","enum":["cpf","cnpj"]},{"type":"null"}]},"docNumber":{"description":"Só dígitos.","type":["string","null"]},"foreignDocument":{"anyOf":[{"type":"object","properties":{"type":{"type":"string"},"number":{"type":"string"},"country":{"type":"string"}},"required":["type","number","country"],"additionalProperties":false},{"type":"null"}]},"rg":{"type":["string","null"]},"gender":{"type":"string"},"maritalStatus":{"type":["string","null"]},"occupation":{"type":["string","null"]},"email":{"type":["string","null"]},"whatsapp":{"description":"E.164, como +5511987654321.","type":["string","null"]},"address":{"anyOf":[{"type":"object","properties":{"postalCode":{"type":["string","null"]},"street":{"type":["string","null"]},"number":{"type":["string","null"]},"complement":{"type":["string","null"]},"district":{"type":["string","null"]},"city":{"type":["string","null"]},"state":{"type":["string","null"]},"country":{"type":["string","null"]}},"required":["postalCode","street","number","complement","district","city","state","country"],"additionalProperties":false},{"type":"null"}]},"guardian":{"anyOf":[{"type":"object","properties":{"name":{"type":"string"},"docType":{"anyOf":[{"type":"string","enum":["cpf","cnpj"]},{"type":"null"}]},"docNumber":{"type":["string","null"]},"whatsapp":{"type":["string","null"]}},"required":["name","docType","docNumber","whatsapp"],"additionalProperties":false},{"type":"null"}]},"imageConsent":{"type":"string","enum":["yes","no","not_provided"],"description":"O uso de imagem autorizado a esta clínica; vale só para ela."},"instagram":{"type":["string","null"]},"referralSource":{"anyOf":[{"type":"object","properties":{"channel":{"type":"string"},"detail":{"type":["string","null"]}},"required":["channel","detail"],"additionalProperties":false},{"type":"null"}]},"notes":{"type":["string","null"]},"patientSince":{"type":"string","description":"Data no formato aaaa-mm-dd."},"selfRegisteredAt":{"anyOf":[{"type":"string","description":"Data e hora ISO 8601, em UTC."},{"type":"null"}]},"mergedIntoId":{"type":["string","null"]},"createdAt":{"type":"string","description":"Data e hora ISO 8601, em UTC."},"updatedAt":{"type":"string","description":"Data e hora ISO 8601, em UTC."},"archivedAt":{"anyOf":[{"type":"string","description":"Data e hora ISO 8601, em UTC."},{"type":"null"}]}},"required":["id","audience","status","name","birthDate","isMinor","docType","docNumber","foreignDocument","rg","gender","maritalStatus","occupation","email","whatsapp","address","guardian","imageConsent","instagram","referralSource","notes","patientSince","selfRegisteredAt","mergedIntoId","createdAt","updatedAt","archivedAt"],"additionalProperties":false,"description":"O cadastro da paciente na clínica."},"Anamnesis":{"type":"object","properties":{"id":{"type":"string"},"patientId":{"type":"string"},"status":{"type":"string","enum":["issued","in_progress","completed","canceled","expired"]},"channel":{"anyOf":[{"type":"string","enum":["whatsapp","email","both","link"]},{"type":"null"}]},"procedure":{"anyOf":[{"type":"object","properties":{"id":{"type":["string","null"]},"name":{"type":["string","null"]}},"required":["id","name"],"additionalProperties":false},{"type":"null"}]},"practitioner":{"anyOf":[{"type":"object","properties":{"id":{"type":["string","null"]},"name":{"type":["string","null"]}},"required":["id","name"],"additionalProperties":false},{"type":"null"}]},"link":{"type":"object","properties":{"issuedAt":{"type":"string","description":"Data e hora ISO 8601, em UTC."},"expiresAt":{"type":"string","description":"Data e hora ISO 8601, em UTC."},"resendCount":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["issuedAt","expiresAt","resendCount"],"additionalProperties":false},"startedAt":{"anyOf":[{"type":"string","description":"Data e hora ISO 8601, em UTC."},{"type":"null"}]},"completedAt":{"anyOf":[{"type":"string","description":"Data e hora ISO 8601, em UTC."},{"type":"null"}]},"protocolNumber":{"type":["string","null"]},"contentHash":{"type":["string","null"]},"canceledAt":{"anyOf":[{"type":"string","description":"Data e hora ISO 8601, em UTC."},{"type":"null"}]},"cancellationReason":{"type":["string","null"]},"isImported":{"type":"boolean"},"createdAt":{"type":"string","description":"Data e hora ISO 8601, em UTC."},"updatedAt":{"type":"string","description":"Data e hora ISO 8601, em UTC."}},"required":["id","patientId","status","channel","procedure","practitioner","link","startedAt","completedAt","protocolNumber","contentHash","canceledAt","cancellationReason","isImported","createdAt","updatedAt"],"additionalProperties":false,"description":"A anamnese enviada à paciente, sem as respostas."},"SentAnamnesis":{"type":"object","properties":{"id":{"type":"string"},"patientId":{"type":"string"},"status":{"type":"string","enum":["issued","in_progress","completed","canceled","expired"]},"channel":{"anyOf":[{"type":"string","enum":["whatsapp","email","both","link"]},{"type":"null"}]},"procedure":{"anyOf":[{"type":"object","properties":{"id":{"type":["string","null"]},"name":{"type":["string","null"]}},"required":["id","name"],"additionalProperties":false},{"type":"null"}]},"practitioner":{"anyOf":[{"type":"object","properties":{"id":{"type":["string","null"]},"name":{"type":["string","null"]}},"required":["id","name"],"additionalProperties":false},{"type":"null"}]},"link":{"type":"object","properties":{"url":{"type":"string"},"issuedAt":{"type":"string","description":"Data e hora ISO 8601, em UTC."},"expiresAt":{"type":"string","description":"Data e hora ISO 8601, em UTC."},"resendCount":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["url","issuedAt","expiresAt","resendCount"],"additionalProperties":false},"startedAt":{"anyOf":[{"type":"string","description":"Data e hora ISO 8601, em UTC."},{"type":"null"}]},"completedAt":{"anyOf":[{"type":"string","description":"Data e hora ISO 8601, em UTC."},{"type":"null"}]},"protocolNumber":{"type":["string","null"]},"contentHash":{"type":["string","null"]},"canceledAt":{"anyOf":[{"type":"string","description":"Data e hora ISO 8601, em UTC."},{"type":"null"}]},"cancellationReason":{"type":["string","null"]},"isImported":{"type":"boolean"},"createdAt":{"type":"string","description":"Data e hora ISO 8601, em UTC."},"updatedAt":{"type":"string","description":"Data e hora ISO 8601, em UTC."},"delivery":{"type":"array","items":{"type":"object","properties":{"channel":{"type":"string","enum":["whatsapp","email"]},"event":{"type":"string","enum":["sent","failed"]},"at":{"type":"string","description":"Data e hora ISO 8601, em UTC."},"detail":{"type":"string"}},"required":["channel","event","at"],"additionalProperties":false}},"message":{"type":"string","description":"A frase pronta do que aconteceu, em pt-BR."}},"required":["id","patientId","status","channel","procedure","practitioner","link","startedAt","completedAt","protocolNumber","contentHash","canceledAt","cancellationReason","isImported","createdAt","updatedAt","delivery","message"],"additionalProperties":false,"description":"A anamnese enviada, com a URL do link (só nesta resposta) e o resultado de cada canal."},"AnamnesisAnswers":{"type":"object","properties":{"anamnesisId":{"type":"string"},"protocolNumber":{"type":["string","null"]},"completedAt":{"anyOf":[{"type":"string","description":"Data e hora ISO 8601, em UTC."},{"type":"null"}]},"contentHash":{"type":["string","null"]},"attention":{"type":"array","items":{"type":"object","properties":{"questionKey":{"type":"string"},"label":{"type":"string"}},"required":["questionKey","label"],"additionalProperties":false}},"sections":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string"},"name":{"type":"string"},"questions":{"type":"array","items":{"type":"object","properties":{"questionId":{"type":"string"},"key":{"type":"string"},"label":{"type":"string"},"answer":{"type":"string"},"isFlagged":{"type":"boolean"}},"required":["label","answer","isFlagged"],"additionalProperties":false}}},"required":["key","name","questions"],"additionalProperties":false}},"answers":{"type":"array","items":{"type":"object","properties":{"questionId":{"type":"string"},"key":{"type":"string"},"value":{},"followUp":{},"isSkipped":{"type":"boolean"},"isNotApplicable":{"type":"boolean"}},"required":["questionId","key","isSkipped","isNotApplicable"],"additionalProperties":false}}},"required":["anamnesisId","protocolNumber","completedAt","contentHash","attention","sections","answers"],"additionalProperties":false,"description":"As respostas da anamnese preenchida (dado de saúde)."},"Procedure":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"description":{"type":["string","null"]},"type":{"type":"string","enum":["single","club_or_package"]},"amountCents":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"validityMonths":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"paymentTerms":{"description":"A frase da condição de pagamento que vai no contrato.","type":["string","null"]}},"required":["id","name","description","type","amountCents","validityMonths","paymentTerms"],"additionalProperties":false,"description":"Um procedimento oferecido pela clínica."},"Practitioner":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"councilCode":{"type":"string"},"profession":{"type":["string","null"]},"specialty":{"type":["string","null"]},"registrationNumber":{"type":["string","null"]}},"required":["id","name","councilCode","profession","specialty","registrationNumber"],"additionalProperties":false,"description":"Um prestador da clínica, com o conselho."},"Template":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"category":{"type":"string"},"audience":{"type":"string"},"isIncluded":{"type":"boolean","description":"Entra sozinho (a anamnese e o contrato certo)."},"versionLabel":{"type":"string"},"linkedProcedures":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"}},"required":["id","name"],"additionalProperties":false},"description":"Os procedimentos da clínica ligados a este termo."}},"required":["id","name","category","audience","isIncluded","versionLabel","linkedProcedures"],"additionalProperties":false,"description":"Um modelo de documento disponível na clínica."},"Appointment":{"type":"object","properties":{"id":{"type":"string"},"parentAppointmentId":{"description":"O atendimento original quando este é um adicional: os documentos acrescentados depois do envio, com envio próprio.","type":["string","null"]},"type":{"type":"string","enum":["procedure","standalone"]},"state":{"type":"string","enum":["generated","sent","canceled"]},"patientId":{"type":"string"},"anamnesisId":{"type":["string","null"]},"practitioner":{"anyOf":[{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"}},"required":["id","name"],"additionalProperties":false},{"type":"null"}]},"procedures":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"type":{"type":"string"},"amountCents":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]}},"required":["id","name","type","amountCents"],"additionalProperties":false}},"totalAmountCents":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"paymentTerms":{"type":["string","null"]},"imageConsent":{"anyOf":[{"type":"string","enum":["yes","no"]},{"type":"null"}]},"isModelPatient":{"type":"boolean"},"procedureDate":{"anyOf":[{"type":"string","description":"Data no formato aaaa-mm-dd."},{"type":"null"}]},"procedureTime":{"type":["string","null"]},"generation":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"generatedAt":{"anyOf":[{"type":"string","description":"Data e hora ISO 8601, em UTC."},{"type":"null"}]},"documents":{"type":"array","items":{"$ref":"#/components/schemas/Document"}},"signature":{"anyOf":[{"$ref":"#/components/schemas/Signature"},{"type":"null"}]},"createdAt":{"type":"string","description":"Data e hora ISO 8601, em UTC."},"updatedAt":{"type":"string","description":"Data e hora ISO 8601, em UTC."}},"required":["id","parentAppointmentId","type","state","patientId","anamnesisId","practitioner","procedures","totalAmountCents","paymentTerms","imageConsent","isModelPatient","procedureDate","procedureTime","generation","generatedAt","documents","signature","createdAt","updatedAt"],"additionalProperties":false,"description":"O atendimento: os procedimentos, o valor, os documentos e a assinatura."},"SignatureRequestResult":{"type":"object","properties":{"id":{"type":"string"},"parentAppointmentId":{"description":"O atendimento original quando este é um adicional: os documentos acrescentados depois do envio, com envio próprio.","type":["string","null"]},"type":{"type":"string","enum":["procedure","standalone"]},"state":{"type":"string","enum":["generated","sent","canceled"]},"patientId":{"type":"string"},"anamnesisId":{"type":["string","null"]},"practitioner":{"anyOf":[{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"}},"required":["id","name"],"additionalProperties":false},{"type":"null"}]},"procedures":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"type":{"type":"string"},"amountCents":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]}},"required":["id","name","type","amountCents"],"additionalProperties":false}},"totalAmountCents":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"paymentTerms":{"type":["string","null"]},"imageConsent":{"anyOf":[{"type":"string","enum":["yes","no"]},{"type":"null"}]},"isModelPatient":{"type":"boolean"},"procedureDate":{"anyOf":[{"type":"string","description":"Data no formato aaaa-mm-dd."},{"type":"null"}]},"procedureTime":{"type":["string","null"]},"generation":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"generatedAt":{"anyOf":[{"type":"string","description":"Data e hora ISO 8601, em UTC."},{"type":"null"}]},"documents":{"type":"array","items":{"$ref":"#/components/schemas/Document"}},"signature":{"anyOf":[{"$ref":"#/components/schemas/Signature"},{"type":"null"}]},"createdAt":{"type":"string","description":"Data e hora ISO 8601, em UTC."},"updatedAt":{"type":"string","description":"Data e hora ISO 8601, em UTC."},"sendsAt":{"type":"string","description":"Quando a mensagem sai: depois da janela de 10 segundos do envio."}},"required":["id","parentAppointmentId","type","state","patientId","anamnesisId","practitioner","procedures","totalAmountCents","paymentTerms","imageConsent","isModelPatient","procedureDate","procedureTime","generation","generatedAt","documents","signature","createdAt","updatedAt","sendsAt"],"additionalProperties":false,"description":"O atendimento depois do envio ou do reenvio, com a hora em que a mensagem sai."},"SignatureCancelResult":{"type":"object","properties":{"id":{"type":"string"},"parentAppointmentId":{"description":"O atendimento original quando este é um adicional: os documentos acrescentados depois do envio, com envio próprio.","type":["string","null"]},"type":{"type":"string","enum":["procedure","standalone"]},"state":{"type":"string","enum":["generated","sent","canceled"]},"patientId":{"type":"string"},"anamnesisId":{"type":["string","null"]},"practitioner":{"anyOf":[{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"}},"required":["id","name"],"additionalProperties":false},{"type":"null"}]},"procedures":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"type":{"type":"string"},"amountCents":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]}},"required":["id","name","type","amountCents"],"additionalProperties":false}},"totalAmountCents":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"paymentTerms":{"type":["string","null"]},"imageConsent":{"anyOf":[{"type":"string","enum":["yes","no"]},{"type":"null"}]},"isModelPatient":{"type":"boolean"},"procedureDate":{"anyOf":[{"type":"string","description":"Data no formato aaaa-mm-dd."},{"type":"null"}]},"procedureTime":{"type":["string","null"]},"generation":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"generatedAt":{"anyOf":[{"type":"string","description":"Data e hora ISO 8601, em UTC."},{"type":"null"}]},"documents":{"type":"array","items":{"$ref":"#/components/schemas/Document"}},"signature":{"anyOf":[{"$ref":"#/components/schemas/Signature"},{"type":"null"}]},"createdAt":{"type":"string","description":"Data e hora ISO 8601, em UTC."},"updatedAt":{"type":"string","description":"Data e hora ISO 8601, em UTC."},"effectiveAt":{"type":"string","description":"Quando o cancelamento vale: depois da janela de 10 segundos."}},"required":["id","parentAppointmentId","type","state","patientId","anamnesisId","practitioner","procedures","totalAmountCents","paymentTerms","imageConsent","isModelPatient","procedureDate","procedureTime","generation","generatedAt","documents","signature","createdAt","updatedAt","effectiveAt"],"additionalProperties":false,"description":"O atendimento depois do pedido de cancelamento, com a hora em que ele vale."},"Document":{"type":"object","properties":{"id":{"type":"string"},"appointmentId":{"type":"string"},"patientId":{"type":"string"},"templateId":{"type":"string"},"name":{"type":"string"},"category":{"type":"string"},"versionLabel":{"type":"string"},"status":{"type":"string","enum":["generated","awaiting_patient","awaiting_clinic_signature","signed","not_signed","expired","canceled"]},"contentHash":{"type":["string","null"]},"pageCount":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"hasFile":{"type":"boolean"},"isRestricted":{"type":"boolean","description":"O documento da anamnese traz as respostas: só quem lê a anamnese baixa (o app, com `anamneses:answers`)."},"signedFileHash":{"type":["string","null"]},"generatedAt":{"anyOf":[{"type":"string","description":"Data e hora ISO 8601, em UTC."},{"type":"null"}]},"patientSignedAt":{"anyOf":[{"type":"string","description":"Data e hora ISO 8601, em UTC."},{"type":"null"}]},"signedAt":{"anyOf":[{"type":"string","description":"Data e hora ISO 8601, em UTC."},{"type":"null"}]},"expiredAt":{"anyOf":[{"type":"string","description":"Data e hora ISO 8601, em UTC."},{"type":"null"}]},"canceledAt":{"anyOf":[{"type":"string","description":"Data e hora ISO 8601, em UTC."},{"type":"null"}]},"updatedAt":{"type":"string","description":"Data e hora ISO 8601, em UTC."}},"required":["id","appointmentId","patientId","templateId","name","category","versionLabel","status","contentHash","pageCount","hasFile","isRestricted","signedFileHash","generatedAt","patientSignedAt","signedAt","expiredAt","canceledAt","updatedAt"],"additionalProperties":false,"description":"Um documento gerado (contrato, termo, anamnese)."},"Signature":{"type":"object","properties":{"status":{"type":"string","enum":["generated","awaiting_patient","awaiting_clinic_signature","signed","not_signed","expired","canceled"]},"request":{"anyOf":[{"type":"object","properties":{"id":{"type":"string"},"protocolNumber":{"type":"string"},"channels":{"type":"string","enum":["whatsapp","email","both"]},"provider":{"type":"string","enum":["autentique","westhetics"]},"sentAt":{"type":"string","description":"Data e hora ISO 8601, em UTC."},"linkExpiresAt":{"type":"string","description":"Data e hora ISO 8601, em UTC."},"linkOpenedAt":{"anyOf":[{"type":"string","description":"Data e hora ISO 8601, em UTC."},{"type":"null"}]},"resendCount":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"canceledAt":{"anyOf":[{"type":"string","description":"Data e hora ISO 8601, em UTC."},{"type":"null"}]},"cancellationReason":{"type":["string","null"]}},"required":["id","protocolNumber","channels","provider","sentAt","linkExpiresAt","linkOpenedAt","resendCount","canceledAt","cancellationReason"],"additionalProperties":false},{"type":"null"}]}},"required":["status","request"],"additionalProperties":false,"description":"O status da assinatura do atendimento e o último envio."},"DocumentFile":{"type":"object","properties":{"url":{"type":"string","description":"Endereço assinado do PDF protegido, válido por 5 minutos."},"expiresAt":{"type":"string","description":"Data e hora ISO 8601, em UTC."},"isSigned":{"type":"boolean"},"hash":{"type":["string","null"]}},"required":["url","expiresAt","isSigned","hash"],"additionalProperties":false,"description":"O endereço temporário do PDF."},"Event":{"type":"object","properties":{"id":{"type":"string","description":"O id do evento; é o `webhook-id` da entrega."},"type":{"type":"string","enum":["webhook.test","patient.created","patient.updated","patient.archived","patient.restored","patient.merged","anamnesis.sent","anamnesis.resent","anamnesis.completed","anamnesis.canceled","appointment.documents_generated","appointment.canceled","signature_request.sent","signature_request.resent","signature_request.viewed","signature_request.signed","signature_request.completed","signature_request.declined","signature_request.expired","signature_request.canceled","signature_request.delivery_failed"],"description":"`webhook.test` só chega no webhook, pelo \"Enviar teste\"; nunca aparece em `GET /v1/events`."},"createdAt":{"type":"string","description":"Data e hora ISO 8601, em UTC."},"clinicId":{"type":"string"},"actor":{"type":"object","properties":{"type":{"type":"string","enum":["user","integration","patient","provider","system"]},"id":{"type":["string","null"]}},"required":["type","id"],"additionalProperties":false},"data":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{},"description":"Os ids do recurso e o essencial; o resto se lê pela API."}},"required":["id","type","createdAt","clinicId","actor","data"],"additionalProperties":false,"description":"Um evento da clínica (RN-INT-15)."},"Webhook":{"type":"object","properties":{"id":{"type":"string"},"integrationId":{"type":"string"},"url":{"type":"string"},"description":{"type":["string","null"]},"events":{"type":"array","items":{"type":"string"},"description":"`[\"*\"]` = todos os eventos que o app vê."},"status":{"type":"string","enum":["active","disabled"]},"disabledReason":{"anyOf":[{"type":"string","enum":["manual","failing"]},{"type":"null"}]},"disabledAt":{"anyOf":[{"type":"string","description":"Data e hora ISO 8601, em UTC."},{"type":"null"}]},"failingSince":{"anyOf":[{"type":"string","description":"Data e hora ISO 8601, em UTC."},{"type":"null"}]},"lastDeliveryAt":{"anyOf":[{"type":"string","description":"Data e hora ISO 8601, em UTC."},{"type":"null"}]},"lastSuccessAt":{"anyOf":[{"type":"string","description":"Data e hora ISO 8601, em UTC."},{"type":"null"}]},"hasPreviousSecret":{"type":"boolean"},"previousSecretValidUntil":{"anyOf":[{"type":"string","description":"Data e hora ISO 8601, em UTC."},{"type":"null"}]},"deliveries":{"type":"object","properties":{"pending":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"failed":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["pending","failed"],"additionalProperties":false},"createdAt":{"type":"string","description":"Data e hora ISO 8601, em UTC."},"updatedAt":{"type":"string","description":"Data e hora ISO 8601, em UTC."}},"required":["id","integrationId","url","description","events","status","disabledReason","disabledAt","failingSince","lastDeliveryAt","lastSuccessAt","hasPreviousSecret","previousSecretValidUntil","deliveries","createdAt","updatedAt"],"additionalProperties":false,"description":"Um endereço que recebe os eventos do app."},"WebhookWithSecret":{"type":"object","properties":{"id":{"type":"string"},"integrationId":{"type":"string"},"url":{"type":"string"},"description":{"type":["string","null"]},"events":{"type":"array","items":{"type":"string"},"description":"`[\"*\"]` = todos os eventos que o app vê."},"status":{"type":"string","enum":["active","disabled"]},"disabledReason":{"anyOf":[{"type":"string","enum":["manual","failing"]},{"type":"null"}]},"disabledAt":{"anyOf":[{"type":"string","description":"Data e hora ISO 8601, em UTC."},{"type":"null"}]},"failingSince":{"anyOf":[{"type":"string","description":"Data e hora ISO 8601, em UTC."},{"type":"null"}]},"lastDeliveryAt":{"anyOf":[{"type":"string","description":"Data e hora ISO 8601, em UTC."},{"type":"null"}]},"lastSuccessAt":{"anyOf":[{"type":"string","description":"Data e hora ISO 8601, em UTC."},{"type":"null"}]},"hasPreviousSecret":{"type":"boolean"},"previousSecretValidUntil":{"anyOf":[{"type":"string","description":"Data e hora ISO 8601, em UTC."},{"type":"null"}]},"deliveries":{"type":"object","properties":{"pending":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"failed":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["pending","failed"],"additionalProperties":false},"createdAt":{"type":"string","description":"Data e hora ISO 8601, em UTC."},"updatedAt":{"type":"string","description":"Data e hora ISO 8601, em UTC."},"secret":{"type":"string","description":"O segredo `whsec_…` que assina as entregas."}},"required":["id","integrationId","url","description","events","status","disabledReason","disabledAt","failingSince","lastDeliveryAt","lastSuccessAt","hasPreviousSecret","previousSecretValidUntil","deliveries","createdAt","updatedAt","secret"],"additionalProperties":false,"description":"O webhook com o segredo, na resposta de criar e de trocar o segredo."},"WebhookSecret":{"type":"object","properties":{"webhookId":{"type":"string"},"secret":{"type":"string"},"previousSecret":{"type":["string","null"]},"previousSecretValidUntil":{"anyOf":[{"type":"string","description":"Data e hora ISO 8601, em UTC."},{"type":"null"}]}},"required":["webhookId","secret","previousSecret","previousSecretValidUntil"],"additionalProperties":false,"description":"O segredo atual e, nas 24 horas da troca, o anterior."},"Delivery":{"type":"object","properties":{"id":{"type":"string"},"webhookId":{"type":"string"},"eventId":{"type":"string"},"eventType":{"type":"string"},"status":{"type":"string","enum":["pending","succeeded","failed"]},"attempts":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"nextAttemptAt":{"anyOf":[{"type":"string","description":"Data e hora ISO 8601, em UTC."},{"type":"null"}]},"lastAttemptAt":{"anyOf":[{"type":"string","description":"Data e hora ISO 8601, em UTC."},{"type":"null"}]},"responseStatus":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"durationMs":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"error":{"type":["string","null"]},"createdAt":{"type":"string","description":"Data e hora ISO 8601, em UTC."}},"required":["id","webhookId","eventId","eventType","status","attempts","nextAttemptAt","lastAttemptAt","responseStatus","durationMs","error","createdAt"],"additionalProperties":false,"description":"Uma entrega de evento para um webhook."},"PageMeta":{"type":"object","properties":{"limit":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"nextCursor":{"description":"Passe em `cursor` para a próxima página; nulo no fim.","type":["string","null"]}},"required":["limit","nextCursor"],"additionalProperties":false,"description":"A página de uma lista por cursor."},"Error":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","enum":["bad_request","unauthenticated","forbidden","not_found","conflict","validation_failed","rate_limited","unavailable","internal_error"]},"message":{"type":"string","description":"A causa e o caminho, em pt-BR."},"fields":{"description":"No 422: a mensagem de cada campo.","type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}},"requestId":{"type":"string"}},"required":["code","message","requestId"],"additionalProperties":false}},"required":["error"],"additionalProperties":false,"description":"O envelope de erro."}},"securitySchemes":{"apiKey":{"type":"http","scheme":"bearer","bearerFormat":"wx_<64 hex>","description":"A chave do app de integração, criada em Integrações. Escopos: `patients:read` (Listar, buscar e ler pacientes; os eventos patient.*.); `patients:write` (Criar e editar pacientes. Inclui ler.); `anamneses:read` (Listar e ler anamneses, sem as respostas; os eventos anamnesis.*.); `anamneses:write` (Enviar, reenviar e cancelar anamnese. Inclui ler.); `anamneses:answers` (Ler as respostas da anamnese preenchida. É dado de saúde.); `documents:read` (Atendimentos, documentos, status da assinatura e o PDF; os eventos appointment.* e signature_request.*.); `documents:write` (Gerar contrato e termos e enviar para assinatura, reenviar e cancelar. Inclui ler.); `catalog:read` (Procedimentos, prestadores e modelos de documento da clínica.); `webhooks:write` (Criar, alterar e remover os webhooks do próprio app pela API.)"},"oauth2":{"type":"oauth2","description":"Token OAuth 2.1 da pessoa (código com PKCE), emitido a um aplicativo conectado. Vale o perfil da pessoa na clínica da conexão, por 12 horas.","flows":{"authorizationCode":{"authorizationUrl":"https://zosqwpksgewzphikvgfz.supabase.co/auth/v1/oauth/authorize","tokenUrl":"https://zosqwpksgewzphikvgfz.supabase.co/auth/v1/oauth/token","refreshUrl":"https://zosqwpksgewzphikvgfz.supabase.co/auth/v1/oauth/token","scopes":{"openid":"Identidade.","email":"O e-mail.","profile":"O nome."}}}}}}}