Integração EYT
Tudo que o seu time precisa pra começar a integrar hoje: autenticação, os endpoints de Pix, webhooks, sandbox e exemplos prontos em curl, Node e PHP.
🔑 Autenticação
API key por lojista no header Authorization. Rotação a qualquer momento sem mudar o resto do código.
💸 Pix imediato
Cobrança com QR dinâmico, expiração, devolução parcial e consulta de status — tudo em POST /v1/charges.
📩 Webhooks
Notificações de pagamento confirmado, expirado e estorno. Assinatura por header, idempotência por event_id.
🧪 Sandbox
Ambiente separado em https://sandbox.eyt.com.br/v1. Simula pagamento, recusa, timeout e estorno.
URL base #
Tudo está sob /v1. Use a base de produção na maioria das chamadas e a sandbox pra testar.
Autenticação #
Toda requisição leva uma API key no header Authorization, prefixada com Bearer. A chave é gerada uma única vez pra cada lojista — guarde em local seguro. Ela não pode ser recuperada depois, só rotacionada.
curl https://api.eyt.com.br/v1/charges \
-H "Authorization: Bearer SUA_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "amount": 1990, "customer": { "name": "Maria", "document": "123.456.789-09" } }'
Erros de autenticação
| Status | Código | O que fazer |
|---|---|---|
401 | unauthorized | Header ausente ou chave inválida. |
403 | forbidden | Chave sem permissão pra esse recurso. |
429 | rate_limited | Excedeu o limite. Volte a tentar após o header Retry-After. |
Criar cobrança Pix #
Endpoint principal. Gera um QR dinâmico, devolve o txid e o QR em base64 pronto pra renderizar.
Corpo da requisição
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
amount | integer (centavos) | sim | Valor em centavos. Mínimo 100. |
customer.name | string | sim | Nome do pagador. |
customer.document | string | sim | CPF ou CNPJ, com pontuação. |
customer.email | string | não | Enviado no recibo. |
expires_in | integer (segundos) | não | Padrão 3600. Máximo 86400. |
metadata | object | não | Até 10 chaves, devolvido no webhook. |
idempotency_key | string | não | Evita cobrança duplicada se você reenviar. |
Exemplo: Node.js
const res = await fetch("https://api.eyt.com.br/v1/charges", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.EYT_API_KEY}`,
"Content-Type": "application/json",
"Idempotency-Key": "pedido-12345"
},
body: JSON.stringify({
amount: 1990,
customer: { name: "Maria Souza", document: "123.456.789-09", email: "maria@exemplo.com" },
expires_in: 1800,
metadata: { pedido_id: "12345" }
})
});
const data = await res.json();
console.log(data.txid, data.qr_code_base64);
Exemplo: PHP
<?php
$ch = curl_init("https://api.eyt.com.br/v1/charges");
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => [
"Authorization: Bearer " . getenv("EYT_API_KEY"),
"Content-Type: application/json",
"Idempotency-Key: pedido-12345"
],
CURLOPT_POSTFIELDS => json_encode([
"amount" => 1990,
"customer" => ["name" => "Maria Souza", "document" => "123.456.789-09"],
"metadata" => ["pedido_id" => "12345"]
])
]);
$res = json_decode(curl_exec($ch), true);
curl_close($ch);
Resposta
{
"id": "ch_8H3aQ1x",
"txid": "8H3aQ1xR2m...",
"status": "pending",
"amount": 1990,
"expires_at": "2026-08-20T18:30:00Z",
"qr_code": "00020126...",
"qr_code_base64": "iVBORw0KGgoAAA...",
"br_code": "00020126..."
}
Consultar cobrança #
Útil pra polling de fallback quando o webhook atrasa. Recomenda-se consultar no máximo 1 vez por minuto.
Estornar #
curl -X POST https://api.eyt.com.br/v1/charges/ch_8H3aQ1x/refund \
-H "Authorization: Bearer SUA_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "amount": 500, "reason": "Desconto acordado" }'
422.Webhooks #
Cadastre a URL no painel do lojista e a EYT chama seu endpoint sempre que algo acontece. Cada chamada tem um event_id único — use pra descartar duplicatas.
Eventos disponíveis
| Evento | Quando dispara |
|---|---|
charge.paid | Pagamento confirmado. |
charge.expired | QR expirou sem pagamento. |
charge.refunded | Estorno (total ou parcial) concluído. |
charge.failed | Falha no processamento do PSP. |
Exemplo de payload
{
"event_id": "evt_01HXY...",
"event": "charge.paid",
"created_at": "2026-08-20T17:42:11Z",
"data": {
"id": "ch_8H3aQ1x",
"txid": "8H3aQ1xR2m...",
"amount": 1990,
"paid_at": "2026-08-20T17:42:09Z",
"customer": { "name": "Maria Souza", "document": "123.456.789-09" },
"metadata": { "pedido_id": "12345" }
}
}
Validação da assinatura
Cada webhook vem com X-EYT-Signature (HMAC-SHA256 do corpo usando seu webhook secret). Valide antes de processar.
import crypto from "node:crypto";
export function verify(req, secret) {
const sig = req.headers["x-eyt-signature"];
const mac = crypto.createHmac("sha256", secret).update(req.rawBody).digest("hex");
return crypto.timingSafeEqual(Buffer.from(sig), Buffer.from(mac));
}
200 em até 5 segundos. Se precisar processar algo pesado, enfileire e responda ok — a EYT reenvia se você demorar mais que isso.Sandbox #
O ambiente sandbox roda em https://sandbox.eyt.com.br/v1, tem as mesmas rotas, e as chaves começam com sk_test_. Nenhum pagamento é de verdade — você testa à vontade.
| Cenário | Como disparar |
|---|---|
| Pagamento confirmado | CPF do pagador terminado em 00. |
| Recusa | CPF terminado em 99. |
| Timeout | Crie a cobrança e não pague. Expira em 60s na sandbox. |
| Estorno parcial | Pague e dispare POST /v1/charges/{id}/refund com amount. |
Erros e retentativas #
Toda resposta de erro segue o mesmo formato: type, message e request_id pra citar no suporte.
{
"type": "payment_rejected",
"message": "PSP recusou a transação.",
"request_id": "req_01HXY...",
"charge_id": "ch_8H3aQ1x"
}
- 4xx — erro do seu lado. Não adianta reenviar igual.
- 5xx — erro da EYT/PSP. Espere e reenvie com backoff exponencial (1s, 2s, 4s, 8s, máx 30s).
- 429 — respeite o
Retry-After.
Suporte #
- E-mail: suporte@eyt.com.br
- Ao escrever, inclua o
request_idde uma chamada recente — agiliza muito.