EYT / Integração

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.

GET https://api.eyt.com.br/v1/health produção
GET https://sandbox.eyt.com.br/v1/health sandbox

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
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" } }'
Não exponha a chave. Não coloque em código de front-end, repositórios públicos ou logs. Use variáveis de ambiente e rotacione se desconfiar de vazamento.

Erros de autenticação

StatusCódigoO que fazer
401unauthorizedHeader ausente ou chave inválida.
403forbiddenChave sem permissão pra esse recurso.
429rate_limitedExcedeu 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.

POST /v1/charges cria uma cobrança

Corpo da requisição

CampoTipoObrigatórioDescrição
amountinteger (centavos)simValor em centavos. Mínimo 100.
customer.namestringsimNome do pagador.
customer.documentstringsimCPF ou CNPJ, com pontuação.
customer.emailstringnãoEnviado no recibo.
expires_ininteger (segundos)nãoPadrão 3600. Máximo 86400.
metadataobjectnãoAté 10 chaves, devolvido no webhook.
idempotency_keystringnãoEvita cobrança duplicada se você reenviar.

Exemplo: Node.js

fetch (Node 18+)
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 8+ · curl
<?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

200 OK
{
  "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 #

GET /v1/charges/{id} status atual

Útil pra polling de fallback quando o webhook atrasa. Recomenda-se consultar no máximo 1 vez por minuto.

Estornar #

POST /v1/charges/{id}/refund estorno total ou parcial
cURL · parcial
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" }'
Estorno parcial: só é permitido dentro de 24h após o pagamento. Passou disso, o sistema rejeita com 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

EventoQuando dispara
charge.paidPagamento confirmado.
charge.expiredQR expirou sem pagamento.
charge.refundedEstorno (total ou parcial) concluído.
charge.failedFalha no processamento do PSP.

Exemplo de payload

POST · charge.paid
{
  "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.

Node.js
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));
}
Responda rápido: devolva 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árioComo disparar
Pagamento confirmadoCPF do pagador terminado em 00.
RecusaCPF terminado em 99.
TimeoutCrie a cobrança e não pague. Expira em 60s na sandbox.
Estorno parcialPague 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.

402 · pagamento rejeitado
{
  "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_id de uma chamada recente — agiliza muito.
EYT — Documentação de integração · 2026 eyt.com.br