Documentação da API

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

Nenhum resultado para "".
Visão Geral
O que é esta API

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.

URL base e versionamento

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.

O que já existe / o que vem a seguir

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.

Como obter acesso

A API é um addon avulso, independente do seu plano — contratável em Recursos Extras. Para começar:

  1. Contrate o addon de API em Recursos Extras (menu, visível para usuários Master).
  2. Acesse Configurações → Integrações (visível para usuários Administrador e Master), defina um label para identificar a integração e os escopos necessários (consultar, usar, criar e/ou cancelar), e clique em "Gerar chave".
  3. A chave (formato 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.
  4. Use a chave no header Authorization em todas as chamadas (veja a seção de Autenticação).
Uma chave dá acesso aos dados de vouchers da sua conta. Trate-a como uma senha: nunca a exponha em código-fonte público, apps client-side ou logs. Revogue imediatamente qualquer chave suspeita de vazamento — cada chave pode ser revogada individualmente sem afetar as demais.
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.

O que pode fazer uma requisição ser rejeitada antes de chegar no endpoint
  • Chave ausente ou mal formatada401 MISSING_TOKEN
  • Chave inválida ou revogada401 INVALID_TOKEN
  • Conta suspensa/cancelada403 TENANT_SUSPENDED
  • Período de teste vencido sem assinatura403 TRIAL_EXPIRED
  • Addon de API não contratado403 API_ADDON_REQUIRED
  • Chave sem o escopo necessário para aquele endpoint → 403 SCOPE_NOT_ALLOWED
  • Limite de requisições excedido429 RATE_LIMITED
Formato de resposta

Toda 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).

HTTP status usados
StatusSignificado
200Sucesso (consulta, uso, cancelamento)
201Criado com sucesso (novo(s) voucher(s))
401Falha de autenticação (chave ausente/inválida)
403Autenticado, mas sem permissão (escopo, plano, conta suspensa, cota)
404Recurso não encontrado (voucher ou rota)
409Conflito de estado do voucher (já usado, cancelado, expirado)
422Corpo da requisição inválido
429Limite de requisições excedido
503Indisponibilidade momentânea do banco do tenant
Escopos

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.

EscopoPermite
readGET /vouchers/{codigo} — consultar status e informações
usePOST /vouchers/{codigo}/usar — marcar como usado
createPOST /vouchers — criar novo(s) voucher(s)
cancelPOST /vouchers/{codigo}/cancelar — cancelar

GET /ping não exige nenhum escopo específico — qualquer chave válida pode chamá-lo.

Rate limit

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.

Objeto Voucher

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.

CampoTipoDescrição
oidintegerIdentificador numérico interno, estável — útil como chave alternativa ao codigo
codigostringCódigo de validação (8 caracteres, minúsculo)
statusstringdisponivel · usado · cancelado · expirado
tipostringcomercial · campanha
valornumberValor do voucher (interpretação depende de modalidade_desconto)
modalidade_descontostringfixo (valor em R$) · percentual (valor em %)
data_validadestringData no formato YYYY-MM-DD
descricaostringDescrição/campanha do voucher
regrasstringTexto livre com as regras de uso
data_usostring|nullData/hora em que foi marcado como usado, ou null
nome_pacientestring|nullNome informado no momento do uso, ou null

Endpoints

GET /ping

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
}
GET /vouchers escopo: read

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âmetroTipoDescrição
nome_compradorstringBusca parcial, sem diferenciar maiúsculas/minúsculas
email_compradorstringBusca parcial
cpf_compradorstringBusca parcial — apenas os dígitos são considerados
celular_compradorstringBusca parcial — apenas os dígitos são considerados
descricaostringBusca parcial na descrição/campanha
nome_pacientestringBusca parcial (nome de quem usou o voucher)
usuariostringBusca parcial em quem criou o voucher (login ou api:<id> para vouchers criados pela própria API)
codigostringBusca parcial no código de validação
observacaostringBusca parcial
oid_min / oid_maxintegerIntervalo de oid
valor_min / valor_maxnumberIntervalo de valor
data_compra_min / _maxstringIntervalo de data de emissão, formato YYYY-MM-DD
data_validade_min / _maxstringIntervalo de validade, formato YYYY-MM-DD
data_uso_min / _maxstringIntervalo de data de uso, formato YYYY-MM-DD
tipostringcomercial e/ou campanha, separados por vírgula
modalidade_descontostringfixo e/ou percentual, separados por vírgula
statusstringdisponivel, usado, cancelado e/ou expirado, separados por vírgula
pageintegerPadrão 1
per_pageintegerPadrã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

HTTPcodeQuando
422VALIDATION_ERRORData fora do formato YYYY-MM-DD, ou valor inválido em tipo/modalidade_desconto/status
GET /vouchers/{codigo} escopo: read

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

HTTPcodeQuando
404VOUCHER_NOT_FOUNDCódigo inexistente ou de um voucher provisório
POST /vouchers/{codigo}/usar escopo: use

Marca um voucher disponível como usado, registrando quem o utilizou.

Corpo da requisição

CampoTipoObrigatórioDescrição
nome_pacientestringSimNome de quem está usando o voucher
cpf_pacientestringSimCPF (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:

#HTTPcodeQuando
1404VOUCHER_NOT_FOUNDCódigo inexistente ou de um voucher provisório
2409VOUCHER_ALREADY_USEDVoucher já foi usado
2409VOUCHER_CANCELLEDVoucher está cancelado
3409VOUCHER_EXPIREDData de validade já passou
4422VALIDATION_ERRORnome_paciente ou cpf_paciente vazios
5422CPF_MISMATCHO voucher tem um CPF de comprador vinculado e o CPF informado não confere (checagem antifraude) — o uso não é registrado
POST /vouchers/{codigo}/cancelar escopo: cancel

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

#HTTPcodeQuando
1404VOUCHER_NOT_FOUNDCódigo inexistente ou de um voucher provisório
2409VOUCHER_EXPIREDVoucher expirado não pode ser cancelado (regra antiabuso, evita estender-depois-cancelar)
3409VOUCHER_ALREADY_USEDVoucher já foi usado
4409VOUCHER_ALREADY_CANCELLEDVoucher já está cancelado
POST /vouchers escopo: create

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

CampoTipoObrigatórioDescrição
tipostringSimcomercial ou campanha
modalidade_descontostringSimfixo ou percentual
nome_compradorstringSimNome do comprador/parceiro
valornumberSimMaior que zero — R$ se fixo, % se percentual
descricaostringSimDescrição/campanha do voucher
data_validadestringSimFormato YYYY-MM-DD
quantidadeintegerNão (padrão 1)Entre 1 e 100 — cria vouchers idênticos em lote, cada um com código próprio
email_compradorstringNão
cpf_compradorstringNãoSe enviado, vincula o voucher a esse CPF — o endpoint de uso passará a exigir o mesmo CPF do paciente (checagem antifraude)
celular_compradorstringNão
observacaostringNãoAnotação interna
regrasstringNãoTexto 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

HTTPcodeQuando
422TIPO_NOT_ALLOWEDtipo enviado como provisorio
422VALIDATION_ERRORCampo obrigatório ausente/inválido, data_validade fora do formato, ou quantidade fora de 1–100
403QUOTA_EXCEEDED A quantidade solicitada estouraria o limite de vouchers ativos do plano contratado. error.details traz { "tmax": limite_do_plano, "tcur": quantidade_atual }.
Referência de códigos de erro

Lista completa de error.code possíveis em qualquer endpoint da API:

HTTPcodeDescrição
401MISSING_TOKENHeader Authorization ausente ou fora do formato Bearer <chave>
401INVALID_TOKENChave inválida ou revogada
403TENANT_SUSPENDEDConta suspensa ou cancelada
403TRIAL_EXPIREDPeríodo de teste terminou sem assinatura de um plano
403API_ADDON_REQUIREDConta não tem o addon de API contratado (Recursos Extras)
403SCOPE_NOT_ALLOWEDA chave não tem o escopo exigido por este endpoint
403QUOTA_EXCEEDEDCota de vouchers do plano seria excedida (endpoint de criação)
404VOUCHER_NOT_FOUNDCódigo inexistente ou de um voucher provisório
404NOT_FOUNDRota/endpoint inexistente
409VOUCHER_ALREADY_USEDVoucher já foi usado
409VOUCHER_CANCELLEDVoucher está cancelado (retornado pelo endpoint de uso)
409VOUCHER_ALREADY_CANCELLEDVoucher já está cancelado (retornado pelo endpoint de cancelamento)
409VOUCHER_EXPIREDData de validade já passou
422VALIDATION_ERRORCorpo da requisição com campos ausentes/inválidos
422TIPO_NOT_ALLOWEDTentativa de criar voucher do tipo provisório
422CPF_MISMATCHCPF informado no uso não confere com o CPF vinculado ao voucher
422INVALID_JSONCorpo da requisição não é um JSON válido
429RATE_LIMITEDLimite de requisições por minuto excedido
503DB_UNAVAILABLEBanco de dados do tenant momentaneamente indisponível
Precisa de ajuda?

Dúvidas sobre a API ou problemas de integração: entre em contato em suporte@donara.com.br.