Criar webhook
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.
Escopo do app: webhooks:write. Só a chave do app; pelo OAuth, 403.
curl --request POST \
--url https://api.westhetics.io/v1/webhooks \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"url": "https://crm.exemplo.com.br/webhooks/westhetics"
}
'const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({url: 'https://crm.exemplo.com.br/webhooks/westhetics'})
};
fetch('https://api.westhetics.io/v1/webhooks', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.westhetics.io/v1/webhooks"
payload = { "url": "https://crm.exemplo.com.br/webhooks/westhetics" }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"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="
}
}{
"error": {
"code": "bad_request",
"message": "<string>",
"requestId": "<string>",
"fields": {}
}
}{
"error": {
"code": "bad_request",
"message": "<string>",
"requestId": "<string>",
"fields": {}
}
}{
"error": {
"code": "bad_request",
"message": "<string>",
"requestId": "<string>",
"fields": {}
}
}{
"error": {
"code": "bad_request",
"message": "<string>",
"requestId": "<string>",
"fields": {}
}
}{
"error": {
"code": "bad_request",
"message": "<string>",
"requestId": "<string>",
"fields": {}
}
}{
"error": {
"code": "bad_request",
"message": "<string>",
"requestId": "<string>",
"fields": {}
}
}{
"error": {
"code": "bad_request",
"message": "<string>",
"requestId": "<string>",
"fields": {}
}
}Autorizações
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.)
Cabeçalhos
Corpo
curl --request POST \
--url https://api.westhetics.io/v1/webhooks \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"url": "https://crm.exemplo.com.br/webhooks/westhetics"
}
'const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({url: 'https://crm.exemplo.com.br/webhooks/westhetics'})
};
fetch('https://api.westhetics.io/v1/webhooks', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.westhetics.io/v1/webhooks"
payload = { "url": "https://crm.exemplo.com.br/webhooks/westhetics" }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"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="
}
}{
"error": {
"code": "bad_request",
"message": "<string>",
"requestId": "<string>",
"fields": {}
}
}{
"error": {
"code": "bad_request",
"message": "<string>",
"requestId": "<string>",
"fields": {}
}
}{
"error": {
"code": "bad_request",
"message": "<string>",
"requestId": "<string>",
"fields": {}
}
}{
"error": {
"code": "bad_request",
"message": "<string>",
"requestId": "<string>",
"fields": {}
}
}{
"error": {
"code": "bad_request",
"message": "<string>",
"requestId": "<string>",
"fields": {}
}
}{
"error": {
"code": "bad_request",
"message": "<string>",
"requestId": "<string>",
"fields": {}
}
}{
"error": {
"code": "bad_request",
"message": "<string>",
"requestId": "<string>",
"fields": {}
}
}