API Standard
O seu ERP envia as doações de excedente para a Optima por REST. Cada doação entra no mural das ONGs da região e segue o mesmo caminho de uma doação feita na tela: pedido da ONG, coleta e recibo assinado eletronicamente pelas duas partes. Disponível a partir do plano Pro.
Endereço base: https://edmunmfpzvbjzcocncdf.supabase.co/functions/v1/erp-standard-api/api/v1
Autenticação
Gere a chave em Conta › Integrações. Ela aparece uma vez só. Envie a chave em todo pedido no cabeçalho X-Optima-Key. Também aceitamos Authorization: Bearer com a mesma chave.
A chave fica no servidor do ERP. Nunca coloque a chave no navegador nem em aplicativo de celular. O plano da empresa é conferido em toda chamada: se a conta sair do Pro, a chave para de funcionar até a empresa voltar.
Enviar uma doação
POST /doacoes. O cabeçalho Idempotency-Key é obrigatório, com 8 caracteres ou mais: se a rede cair e você enviar de novo com a mesma chave e o mesmo conteúdo, a doação não duplica e a resposta devolve a doação já criada.
cURL
curl -X POST "https://edmunmfpzvbjzcocncdf.supabase.co/functions/v1/erp-standard-api/api/v1/doacoes" \
-H "X-Optima-Key: SUA_CHAVE" \
-H "Idempotency-Key: ERP-TRX-0001" \
-H "Content-Type: application/json" \
-d '{"external_id":"ERP-TRX-0001","product_name":"Arroz 5kg","tipo_embalagem":"embalado","product_expiration_date":"2027-01-14","expiration_date":"2026-10-30","quantity":100,"unit_weight":5,"unit_type":"kg","estimated_value":2500}'Resposta 201
{
"ok": true,
"donation_id": "d6b2c1e0-0000-4000-8000-0000000041f0",
"status": "available",
"trace_id": "3b1f0c2a-0000-4000-8000-00000000a92c",
"created_at": "2026-10-14T17:32:08Z"
}As datas do exemplo andam com o dia, para o exemplo nunca nascer vencido.
Campos
| Campo | Tipo | Obrigatório | O que significa |
|---|---|---|---|
| external_id | texto | sim | O código da doação no seu sistema. Use um valor único por doação. |
| product_name | texto | sim | Nome do produto como a ONG vai ler. |
| quantity | número inteiro | sim | Quantas unidades. Maior que zero. |
| unit_weight | número | sim | Peso de uma unidade, em kg, com ponto decimal. 500 g = 0.5. |
| tipo_embalagem | texto | não | embalado (padrão), in_natura ou preparado. |
| product_expiration_date | data AAAA-MM-DD | uma das duas datas | Validade impressa na embalagem. Produto embalado precisa de validade; sem este campo, vale expiration_date. |
| expiration_date | data AAAA-MM-DD | uma das duas datas | Validade do produto ou data limite para a ONG recolher. Sem este campo, vale a validade impressa. |
| estimated_value | número | não | Valor estimado da doação, em reais. Sem o campo, fica zero. |
| unit_type | texto | não | Unidade do peso. Padrão kg. |
| sku | texto | não | Código interno do produto (também aceita product_code). |
| erp_batch_id | texto | não | Lote no seu ERP. |
| logistics | objeto | não | Endereço de retirada (cep, street, city, state) e will_deliver: true quando a empresa entrega. |
Respostas
Toda resposta é JSON com ok. No envio aceito, 201 com o id da doação, a situação (available, disponível no mural) e um código de rastreio. Quando a doação não passa nas regras, 400 com a lista erros: cada item diz o campo, o problema e como corrigir.
Resposta 400
{
"ok": false,
"error": "product_expiration_date (validade impressa) é obrigatória para produto embalado.",
"erros": [
{
"campo": "product_expiration_date",
"mensagem": "product_expiration_date (validade impressa) é obrigatória para produto embalado.",
"como_corrigir": "Envie a validade impressa na embalagem no formato AAAA-MM-DD. Se o produto não for embalado, informe tipo_embalagem in_natura ou preparado."
}
]
}Erros e como corrigir
| Código | Mensagem da API | Como corrigir |
|---|---|---|
| 401 | Chave ausente: envie X-Optima-Key ou Authorization: Bearer. | Envie a chave no cabeçalho X-Optima-Key. |
| 401 | Chave de integração inválida ou desativada. | A chave foi trocada ou desativada. Gere outra em Conta › Integrações. |
| 403 | O plano atual da empresa não inclui a API Standard | A API faz parte do plano Pro. A mesma chave volta a funcionar quando a empresa voltar ao Pro. |
| 403 | A conta da empresa está em modo de registro apenas | Nesse modo a conta não tem integração. Fale com a Optima pelo painel. |
| 403 | Acesso negado: IP de origem não autorizado para esta chave de integração. | A chave aceita só os IPs cadastrados para ela. Envie de um deles. |
| 400 | Idempotency-Key obrigatória, com pelo menos 8 caracteres. | Envie o cabeçalho Idempotency-Key com 8 caracteres ou mais. Pode ser o external_id. |
| 400 | product_expiration_date (validade impressa) é obrigatória para produto embalado. | Envie a validade impressa ou informe tipo_embalagem in_natura ou preparado. A lista "erros" da resposta diz o que corrigir em cada campo. |
| 409 | Idempotency-Key já usada com outro conteúdo. | Para uma doação nova, use uma chave de idempotência nova. |
| 429 | Limite de chamadas excedido. Aguarde um minuto e tente de novo. | São 120 chamadas por minuto por chave. Espere um minuto e envie de novo. |
| 404 | Rota não encontrada nesta versão da API. | Confira o método e o caminho. Todo caminho começa em /api/v1. |
Limites e teste
Até 120 chamadas por minuto por chave, contando todas as rotas. Para testar sem publicar no mural, envie para POST /doacoes/teste: a API confere tudo com as mesmas regras e responde 200 quando a doação passaria, ou 400 com a lista de erros, sem criar a doação. No painel, o botão "Enviar doação de teste" em Conta › Integrações faz o mesmo sem colar a chave.
Teste sem gravar
curl -X POST "https://edmunmfpzvbjzcocncdf.supabase.co/functions/v1/erp-standard-api/api/v1/doacoes/teste" \
-H "X-Optima-Key: SUA_CHAVE" \
-H "Idempotency-Key: ERP-TRX-0001" \
-H "Content-Type: application/json" \
-d '{"external_id":"ERP-TRX-0001","product_name":"Arroz 5kg","tipo_embalagem":"embalado","product_expiration_date":"2027-01-14","expiration_date":"2026-10-30","quantity":100,"unit_weight":5,"unit_type":"kg","estimated_value":2500}'Todas as rotas
POST /doacoesEnvia uma doação. Ela entra no mural das ONGs da região como qualquer doação feita na tela.POST /doacoes/testeConfere a doação com as mesmas regras do envio e não grava nada.GET /doacoes/{donation_id}Situação de uma doação enviada pela API. Também aceita /doacoes/?external_id=SEU_ID.
Situação da doação: available, requested, confirmed, received ou cancelled. A consulta só encontra doações da empresa dona da chave.
Não conseguiu integrar? Quem já é cliente fala com a Optima em Conta › Integrações, depois do teste. Respondemos em até 2 dias úteis.