API REST para sistemas externos consultarem, usarem, criarem e cancelarem vouchers no Donara — recurso avulso, contratável em Recursos Extras independente do seu plano.
https://donara.com.br/api/v1
Conteúdo
A API do Donara permite que sistemas externos (ERPs, apps de parceiros, integrações de recepção etc.) consultem o status de um voucher, marquem um voucher como usado, criem novos vouchers e cancelem vouchers — sem precisar de login nem de sessão de navegador. Toda a comunicação é feita via HTTPS, com corpo e resposta em JSON.
Todos os endpoints ficam sob o prefixo de versão v1:
https://donara.com.br/api/v1/...
A URL não depende do subdomínio da sua clínica — o tenant é identificado automaticamente pela
própria API key usada na requisição, então qualquer chamada usa sempre donara.com.br.
A v1 cobre o fluxo essencial: consultar, usar, criar e cancelar vouchers comerciais/campanha. Vouchers do tipo provisório não são suportados pela API (não possuem código de validação e não são localizáveis pelos demais endpoints). Edição, exclusão, conversão de tipo, listagem/busca avançada e imagem/QR code do voucher não fazem parte desta versão.
A API é um addon avulso, independente do seu plano — contratável em Recursos Extras. Para começar:
dnr_live_...) é exibida uma única vez no momento da criação — copie e guarde em local seguro (variável de ambiente, cofre de segredos). Se perdê-la, revogue-a na mesma tela e gere uma nova.Authorization em todas as chamadas (veja a seção de Autenticação).Toda requisição precisa do header Authorization no formato Bearer <chave>:
Authorization: Bearer dnr_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Não existe sessão, cookie ou CSRF token — a API é totalmente stateless. Cada requisição é autenticada de forma independente pela chave enviada.
401 MISSING_TOKEN401 INVALID_TOKEN403 TENANT_SUSPENDED403 TRIAL_EXPIRED403 API_ADDON_REQUIRED403 SCOPE_NOT_ALLOWED429 RATE_LIMITEDToda resposta é um JSON com o mesmo envelope, em sucesso ou erro:
// sucesso
{
"ok": true,
"data": { /* ... */ },
"error": null
}
// erro
{
"ok": false,
"data": null,
"error": {
"code": "VOUCHER_NOT_FOUND",
"message": "Voucher não encontrado.",
"details": null
}
}
Trate a resposta pelo campo ok e pelo error.code
(estável, para tratamento programático) — não dependa apenas do HTTP status ou do texto de
error.message (pode mudar de redação).
| Status | Significado |
|---|---|
200 | Sucesso (consulta, uso, cancelamento) |
201 | Criado com sucesso (novo(s) voucher(s)) |
401 | Falha de autenticação (chave ausente/inválida) |
403 | Autenticado, mas sem permissão (escopo, plano, conta suspensa, cota) |
404 | Recurso não encontrado (voucher ou rota) |
409 | Conflito de estado do voucher (já usado, cancelado, expirado) |
422 | Corpo da requisição inválido |
429 | Limite de requisições excedido |
503 | Indisponibilidade momentânea do banco do tenant |
Cada chave de API tem uma ou mais permissões (escopos) definidas no momento da criação.
Uma chamada a um endpoint que exige um escopo que a chave não possui retorna
403 SCOPE_NOT_ALLOWED.
| Escopo | Permite |
|---|---|
| read | GET /vouchers/{codigo} — consultar status e informações |
| use | POST /vouchers/{codigo}/usar — marcar como usado |
| create | POST /vouchers — criar novo(s) voucher(s) |
| cancel | POST /vouchers/{codigo}/cancelar — cancelar |
GET /ping não exige nenhum escopo específico — qualquer chave válida pode chamá-lo.
Cada chave de API tem um limite de 60 requisições por minuto, avaliado em janelas
fixas. Ao exceder o limite, a resposta é 429 RATE_LIMITED. Reduza a
frequência de chamadas ou implemente backoff/retry no seu lado antes de tentar novamente.
Formato retornado em data pelos endpoints de consulta, busca, uso e
cancelamento (dentro de vouchers, no caso da busca). Não inclui dados
pessoais do comprador (nome, e-mail, CPF, celular) — apenas o necessário para validar e exibir o voucher.
| Campo | Tipo | Descrição |
|---|---|---|
oid | integer | Identificador numérico interno, estável — útil como chave alternativa ao codigo |
codigo | string | Código de validação (8 caracteres, minúsculo) |
status | string | disponivel · usado · cancelado · expirado |
tipo | string | comercial · campanha |
valor | number | Valor do voucher (interpretação depende de modalidade_desconto) |
modalidade_desconto | string | fixo (valor em R$) · percentual (valor em %) |
data_validade | string | Data no formato YYYY-MM-DD |
descricao | string | Descrição/campanha do voucher |
regras | string | Texto livre com as regras de uso |
data_uso | string|null | Data/hora em que foi marcado como usado, ou null |
nome_paciente | string|null | Nome informado no momento do uso, ou null |
Health-check de autenticação — confirma que a chave é válida e identifica a conta associada. Não exige escopo específico.
Exemplo
curl https://donara.com.br/api/v1/ping \
-H "Authorization: Bearer dnr_live_..."
Resposta 200
{
"ok": true,
"data": {
"pong": true,
"tenant": "suaclinica",
"scopes": ["read", "use"]
},
"error": null
}
Busca vouchers com filtros combináveis, passados como query string, com paginação real. Assim como os demais endpoints, nunca retorna vouchers provisórios.
Parâmetros de busca (todos opcionais e combináveis)
| Parâmetro | Tipo | Descrição |
|---|---|---|
nome_comprador | string | Busca parcial, sem diferenciar maiúsculas/minúsculas |
email_comprador | string | Busca parcial |
cpf_comprador | string | Busca parcial — apenas os dígitos são considerados |
celular_comprador | string | Busca parcial — apenas os dígitos são considerados |
descricao | string | Busca parcial na descrição/campanha |
nome_paciente | string | Busca parcial (nome de quem usou o voucher) |
usuario | string | Busca parcial em quem criou o voucher (login ou api:<id> para vouchers criados pela própria API) |
codigo | string | Busca parcial no código de validação |
observacao | string | Busca parcial |
oid_min / oid_max | integer | Intervalo de oid |
valor_min / valor_max | number | Intervalo de valor |
data_compra_min / _max | string | Intervalo de data de emissão, formato YYYY-MM-DD |
data_validade_min / _max | string | Intervalo de validade, formato YYYY-MM-DD |
data_uso_min / _max | string | Intervalo de data de uso, formato YYYY-MM-DD |
tipo | string | comercial e/ou campanha, separados por vírgula |
modalidade_desconto | string | fixo e/ou percentual, separados por vírgula |
status | string | disponivel, usado, cancelado e/ou expirado, separados por vírgula |
page | integer | Padrão 1 |
per_page | integer | Padrão 20, máximo 100 |
Todos os filtros são combinados com E (AND) entre si; valores separados por vírgula dentro de um mesmo parâmetro são combinados com OU (OR).
Exemplo
curl -G https://donara.com.br/api/v1/vouchers \
-H "Authorization: Bearer dnr_live_..." \
--data-urlencode "status=disponivel" \
--data-urlencode "tipo=campanha" \
--data-urlencode "data_validade_min=2026-01-01" \
--data-urlencode "per_page=20" \
--data-urlencode "page=1"
Resposta 200
{
"ok": true,
"data": {
"vouchers": [
{ "oid": 491, "codigo": "i1gkayo4", "status": "disponivel", /* ...demais campos do Objeto Voucher */ }
],
"meta": {
"page": 1,
"per_page": 20,
"total": 37,
"total_pages": 2
}
},
"error": null
}
Erros específicos
| HTTP | code | Quando |
|---|---|---|
| 422 | VALIDATION_ERROR | Data fora do formato YYYY-MM-DD, ou valor inválido em tipo/modalidade_desconto/status |
Retorna status e informações de um voucher pelo código de validação. Vouchers do tipo
provisório e códigos inexistentes retornam igualmente 404 — a API
não distingue os dois casos, para não revelar a existência de vouchers provisórios.
Exemplo
curl https://donara.com.br/api/v1/vouchers/a1b2c3d4 \
-H "Authorization: Bearer dnr_live_..."
Resposta 200
{
"ok": true,
"data": {
"oid": 491,
"codigo": "a1b2c3d4",
"status": "disponivel",
"tipo": "campanha",
"valor": 100,
"modalidade_desconto": "percentual",
"data_validade": "2026-12-31",
"descricao": "Vale uma consulta",
"regras": "Válido apenas para...",
"data_uso": null,
"nome_paciente": null
},
"error": null
}
Repare que status pode vir como usado,
cancelado ou expirado com HTTP
200 — isso não é um erro, é um estado válido do voucher.
Erros específicos
| HTTP | code | Quando |
|---|---|---|
| 404 | VOUCHER_NOT_FOUND | Código inexistente ou de um voucher provisório |
Marca um voucher disponível como usado, registrando quem o utilizou.
Corpo da requisição
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
nome_paciente | string | Sim | Nome de quem está usando o voucher |
cpf_paciente | string | Sim | CPF (com ou sem máscara — apenas os dígitos são considerados) |
Exemplo
curl -X POST https://donara.com.br/api/v1/vouchers/a1b2c3d4/usar \
-H "Authorization: Bearer dnr_live_..." \
-H "Content-Type: application/json" \
-d '{
"nome_paciente": "Maria Souza",
"cpf_paciente": "123.456.789-00"
}'
Resposta 200: o objeto do voucher atualizado (status: "usado",
data_uso e nome_paciente preenchidos) — mesmo formato do endpoint de consulta.
Ordem de validação e erros específicos
As checagens abaixo são feitas nesta ordem — a primeira que falhar interrompe a requisição:
| # | HTTP | code | Quando |
|---|---|---|---|
| 1 | 404 | VOUCHER_NOT_FOUND | Código inexistente ou de um voucher provisório |
| 2 | 409 | VOUCHER_ALREADY_USED | Voucher já foi usado |
| 2 | 409 | VOUCHER_CANCELLED | Voucher está cancelado |
| 3 | 409 | VOUCHER_EXPIRED | Data de validade já passou |
| 4 | 422 | VALIDATION_ERROR | nome_paciente ou cpf_paciente vazios |
| 5 | 422 | CPF_MISMATCH | O voucher tem um CPF de comprador vinculado e o CPF informado não confere (checagem antifraude) — o uso não é registrado |
Cancela um voucher disponível. Não tem corpo de requisição.
Exemplo
curl -X POST https://donara.com.br/api/v1/vouchers/a1b2c3d4/cancelar \
-H "Authorization: Bearer dnr_live_..."
Resposta 200: o objeto do voucher atualizado (status: "cancelado") — mesmo formato do endpoint de consulta.
Ordem de validação e erros específicos
| # | HTTP | code | Quando |
|---|---|---|---|
| 1 | 404 | VOUCHER_NOT_FOUND | Código inexistente ou de um voucher provisório |
| 2 | 409 | VOUCHER_EXPIRED | Voucher expirado não pode ser cancelado (regra antiabuso, evita estender-depois-cancelar) |
| 3 | 409 | VOUCHER_ALREADY_USED | Voucher já foi usado |
| 4 | 409 | VOUCHER_ALREADY_CANCELLED | Voucher já está cancelado |
Cria um ou mais vouchers do tipo comercial ou
campanha. Vouchers provisórios não são suportados — não
têm código de validação e não seriam localizáveis pelos demais endpoints.
Corpo da requisição
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
tipo | string | Sim | comercial ou campanha |
modalidade_desconto | string | Sim | fixo ou percentual |
nome_comprador | string | Sim | Nome do comprador/parceiro |
valor | number | Sim | Maior que zero — R$ se fixo, % se percentual |
descricao | string | Sim | Descrição/campanha do voucher |
data_validade | string | Sim | Formato YYYY-MM-DD |
quantidade | integer | Não (padrão 1) | Entre 1 e 100 — cria vouchers idênticos em lote, cada um com código próprio |
email_comprador | string | Não | — |
cpf_comprador | string | Não | Se enviado, vincula o voucher a esse CPF — o endpoint de uso passará a exigir o mesmo CPF do paciente (checagem antifraude) |
celular_comprador | string | Não | — |
observacao | string | Não | Anotação interna |
regras | string | Não | Texto de regras exibido na consulta do voucher |
Exemplo
curl -X POST https://donara.com.br/api/v1/vouchers \
-H "Authorization: Bearer dnr_live_..." \
-H "Content-Type: application/json" \
-d '{
"tipo": "campanha",
"modalidade_desconto": "percentual",
"nome_comprador": "Parceiro XPTO",
"valor": 15,
"descricao": "Promoção de aniversário",
"data_validade": "2026-12-31",
"quantidade": 1
}'
Resposta 201
{
"ok": true,
"data": {
"vouchers": [
{ "codigo": "n7ta6w8v", "oid": 496 }
]
},
"error": null
}
Com quantidade > 1, o array vouchers traz um item por voucher criado, cada um com seu próprio código.
Erros específicos
| HTTP | code | Quando |
|---|---|---|
| 422 | TIPO_NOT_ALLOWED | tipo enviado como provisorio |
| 422 | VALIDATION_ERROR | Campo obrigatório ausente/inválido, data_validade fora do formato, ou quantidade fora de 1–100 |
| 403 | QUOTA_EXCEEDED |
A quantidade solicitada estouraria o limite de vouchers ativos do plano contratado.
error.details traz { "tmax": limite_do_plano, "tcur": quantidade_atual }.
|
Lista completa de error.code possíveis em qualquer endpoint da API:
| HTTP | code | Descrição |
|---|---|---|
| 401 | MISSING_TOKEN | Header Authorization ausente ou fora do formato Bearer <chave> |
| 401 | INVALID_TOKEN | Chave inválida ou revogada |
| 403 | TENANT_SUSPENDED | Conta suspensa ou cancelada |
| 403 | TRIAL_EXPIRED | Período de teste terminou sem assinatura de um plano |
| 403 | API_ADDON_REQUIRED | Conta não tem o addon de API contratado (Recursos Extras) |
| 403 | SCOPE_NOT_ALLOWED | A chave não tem o escopo exigido por este endpoint |
| 403 | QUOTA_EXCEEDED | Cota de vouchers do plano seria excedida (endpoint de criação) |
| 404 | VOUCHER_NOT_FOUND | Código inexistente ou de um voucher provisório |
| 404 | NOT_FOUND | Rota/endpoint inexistente |
| 409 | VOUCHER_ALREADY_USED | Voucher já foi usado |
| 409 | VOUCHER_CANCELLED | Voucher está cancelado (retornado pelo endpoint de uso) |
| 409 | VOUCHER_ALREADY_CANCELLED | Voucher já está cancelado (retornado pelo endpoint de cancelamento) |
| 409 | VOUCHER_EXPIRED | Data de validade já passou |
| 422 | VALIDATION_ERROR | Corpo da requisição com campos ausentes/inválidos |
| 422 | TIPO_NOT_ALLOWED | Tentativa de criar voucher do tipo provisório |
| 422 | CPF_MISMATCH | CPF informado no uso não confere com o CPF vinculado ao voucher |
| 422 | INVALID_JSON | Corpo da requisição não é um JSON válido |
| 429 | RATE_LIMITED | Limite de requisições por minuto excedido |
| 503 | DB_UNAVAILABLE | Banco de dados do tenant momentaneamente indisponível |
Dúvidas sobre a API ou problemas de integração: entre em contato em suporte@donara.com.br.