Authentication
Merchant API key
Use Authorization: Bearer pix_YOUR_MERCHANT_KEY for merchant endpoints. Account login tokens and dashboard Client ID/Secret credentials are a separate account-management flow.
| Field | Description |
|---|---|
Production | https://api.eyt.com.br |
Sandbox | https://sandbox.eyt.com.br |
Authorization | Bearer pix_... |
Content-Type | application/json |
Idempotency-Key | Required for charge/payout creation. Reuse the same key and identical body when retrying an uncertain request. |
Production requires the issued client mTLS certificate and matching private key. Keep sandbox and production credentials separate. The examples are illustrative and never submit live requests from this page.
Illustrative response
200
{
"balanceMinor": 10000,
"currency": "BRL"
}Pix - Cash In
Create Pix charge
| Field | Description |
|---|---|
amountMinor | Integer BRL cents, at least 1000 (R$ 10.00). Channel limits also apply. |
expiresInSeconds | 60β86400 |
description | Optional, up to 140 characters. |
payer | Required on the production channel: name, document (11 or 14 digits), email and phone (10β15 digits). Use actual payer data, not the placeholders in this example. |
Response status: active, paid or expired. The bank/payment confirmation changes the charge to paid. endToEndId is nullable before settlement.
{
"id": "00000000-0000-0000-0000-000000000123",
"merchantId": "00000000-0000-0000-0000-000000000001",
"amountMinor": 1500,
"status": "active",
"description": "Example",
"expiresAt": "2026-09-22T18:00:00Z",
"brCode": "<brCode returned by API>",
"txid": "<txid returned by API>",
"endToEndId": null,
"createdAt": "2026-09-22T17:00:00Z",
"updatedAt": "2026-09-22T17:00:00Z"
}Sandbox only: POST /v1/sandbox/charges/{id}/pay simulates payment; POST /v1/sandbox/charges/{id}/expire simulates expiry. Both use the sandbox merchant key.
Request body
{
"amountMinor": 1500,
"expiresInSeconds": 3600,
"description": "Example",
"payer": {
"name": "<payer name>",
"document": "<CPF or CNPJ digits>",
"email": "payer@example.com",
"phone": "<phone digits>"
}
}Illustrative response
201
{
"id": "00000000-0000-0000-0000-000000000123",
"merchantId": "00000000-0000-0000-0000-000000000001",
"amountMinor": 1500,
"status": "active",
"description": "Example",
"expiresAt": "2026-09-22T18:00:00Z",
"brCode": "<brCode returned by API>",
"txid": "<txid returned by API>",
"endToEndId": null,
"createdAt": "2026-09-22T17:00:00Z",
"updatedAt": "2026-09-22T17:00:00Z"
}Updated today
Pix - Cash In
Create charge with TXID
Creates a charge with a caller-supplied alphanumeric TXID (26β35 characters). This is a creation/idempotency operation, not a cancellation or arbitrary update. Confirm support for your production channel before using custom TXIDs.
| Field | Description |
|---|---|
amountMinor | Integer BRL cents, at least 1000 (R$ 10.00). Channel limits also apply. |
expiresInSeconds | 60β86400 |
description | Optional, up to 140 characters. |
payer | Required on the production channel: name, document (11 or 14 digits), email and phone (10β15 digits). Use actual payer data, not the placeholders in this example. |
Response status: active, paid or expired. The bank/payment confirmation changes the charge to paid. endToEndId is nullable before settlement.
{
"id": "00000000-0000-0000-0000-000000000123",
"merchantId": "00000000-0000-0000-0000-000000000001",
"amountMinor": 1500,
"status": "active",
"description": "Example",
"expiresAt": "2026-09-22T18:00:00Z",
"brCode": "<brCode returned by API>",
"txid": "<txid returned by API>",
"endToEndId": null,
"createdAt": "2026-09-22T17:00:00Z",
"updatedAt": "2026-09-22T17:00:00Z"
}Sandbox only: POST /v1/sandbox/charges/{id}/pay simulates payment; POST /v1/sandbox/charges/{id}/expire simulates expiry. Both use the sandbox merchant key.
Request body
{
"amountMinor": 1500,
"expiresInSeconds": 3600,
"description": "Example",
"payer": {
"name": "<payer name>",
"document": "<CPF or CNPJ digits>",
"email": "payer@example.com",
"phone": "<phone digits>"
}
}Illustrative response
201
{
"id": "00000000-0000-0000-0000-000000000123",
"merchantId": "00000000-0000-0000-0000-000000000001",
"amountMinor": 1500,
"status": "active",
"description": "Example",
"expiresAt": "2026-09-22T18:00:00Z",
"brCode": "<brCode returned by API>",
"txid": "<txid returned by API>",
"endToEndId": null,
"createdAt": "2026-09-22T17:00:00Z",
"updatedAt": "2026-09-22T17:00:00Z"
}Updated today
Pix - Cash In
Get and list charges
Use the charge UUID returned as id. List with GET /v1/pix/charges?page=1&pageSize=20&status=active. pageSize: 1β100. The list contains items, page, pageSize and total.
{
"id": "00000000-0000-0000-0000-000000000123",
"merchantId": "00000000-0000-0000-0000-000000000001",
"amountMinor": 1500,
"status": "active",
"description": "Example",
"expiresAt": "2026-09-22T18:00:00Z",
"brCode": "<brCode returned by API>",
"txid": "<txid returned by API>",
"endToEndId": null,
"createdAt": "2026-09-22T17:00:00Z",
"updatedAt": "2026-09-22T17:00:00Z"
}Illustrative response
200
{
"id": "00000000-0000-0000-0000-000000000123",
"merchantId": "00000000-0000-0000-0000-000000000001",
"amountMinor": 1500,
"status": "active",
"description": "Example",
"expiresAt": "2026-09-22T18:00:00Z",
"brCode": "<brCode returned by API>",
"txid": "<txid returned by API>",
"endToEndId": null,
"createdAt": "2026-09-22T17:00:00Z",
"updatedAt": "2026-09-22T17:00:00Z"
}Updated today
Pix - Cash In
Configure webhooks and retries
One URL and event subscription per merchant in each environment. This endpoint replaces the configuration and returns a new signing secret on every PUT, including updates. Store the returned secret securely and update your verifier. GET returns secret: null.
{
"url": "https://merchant.example/webhooks",
"events": [
"charge.*",
"payout.*"
]
}| Field | Description |
|---|---|
X-EYT-Timestamp | Unix seconds. |
X-EYT-Signature | hex HMAC-SHA256(secret, timestamp + "." + rawBody) |
X-EYT-Event | charge.paid / payout.settled / payout.failed |
X-EYT-Delivery-Id | Identifier of this attempt; regenerated on retries. Do not use it alone to deduplicate an event. |
Validate the signature using the exact raw request body and a timestamp tolerance of 300 seconds. Compare signatures in constant time. Accepting any HTTP 2xx completes delivery. Respond promptly after durably accepting the event.
Retry policy
| Field | Description |
|---|---|
1 | Initial attempt when due |
2 | 1 min |
3 | 5 min |
4 | 15 min |
5 | 1 h |
6 | 4 h |
Six attempts total: the initial attempt plus five retries. Each delay starts after the preceding failed attempt. Nominal backoff total: 5 hours 21 minutes, plus request durations, queueing and scheduling. This is not a delivery deadline. Sandbox Lambda suspension may delay processing until a later invocation. After attempt 6 fails, automatic retries stop.
{
"id": "<delivery UUID>",
"type": "payout.failed",
"objectId": "<payout UUID>",
"createdAt": "<event timestamp>",
"data": {
"payoutId": "<payout UUID>",
"merchantId": "<merchant UUID>",
"status": "Failed",
"amountMinor": 1500,
"endToEndId": null,
"failureReason": null
}
}The envelope contains id, type, objectId, createdAt and data. Event data uses domain status casing (for example Paid or Failed); GET responses use lowercase. Process idempotently by object and event state, and use GET to reconcile the current status. data.failureReason mirrors the payout field: null when no reason was recorded, otherwise a short explanation string.
Request body
{
"url": "https://merchant.example/webhooks",
"events": [
"charge.*",
"payout.*"
]
}Illustrative response
200
{
"url": "https://merchant.example/webhooks",
"events": [
"charge.*",
"payout.*"
],
"secret": "<save returned secret>",
"active": true
}Updated today
Pix - Cash In
Request refund
Use the charge UUID. Body: amountMinor in cents and a non-empty reason. Idempotency-Key is required. GET on this route lists refunds; PUT is also supported for creation. A recorded refund is not proof of banking settlement.
Request body
{
"amountMinor": 100,
"reason": "Customer request"
}Illustrative response
201
{
"id": "<refund UUID>",
"chargeId": "<charge UUID>",
"amountMinor": 100,
"reason": "Customer request"
}Updated today
Pix - Cash Out
Limits and error handling
Transaction limits are set per merchant at onboarding and may change over time. Use GET /v1/pix/payout-limit for the current daily payout allowance that applies to your account.
The gateway counts the daily payout allowance from 00:00 UTC. When a new payout would exceed the allowance, POST /v1/pix/payouts returns 422 daily_limit_exceeded before anything is sent.
| Field | Description |
|---|---|
422 validation_error | Invalid input, missing Idempotency-Key, or DICT key not found (see details). |
422 daily_limit_exceeded | Daily payout allowance exceeded. |
422 saldo_insuficiente | Insufficient balance before sending. |
503 unavailable | Service unavailable: retry the request (idempotency applies). |
404 not_found | Resource not found in merchant scope. |
These are request errors, not failureReason values. On a failed payout, failureReason carries the reason EYT confirmed for the failure (or null); a timeout with an unknown payment outcome stays processing while reconciliation runs. The 30-minute review threshold is not an automatic failure.
Illustrative response
200
{
"dailyLimitMinor": "<your daily allowance in minor units>"
}Updated today
Pix - Cash Out
Get balance
balanceMinor is the merchant ledger balance in BRL cents. This is not the shared bank account balance.
{
"balanceMinor": 10000,
"currency": "BRL"
}Illustrative response
200
{
"balanceMinor": 10000,
"currency": "BRL"
}Updated today
Pix - Cash Out
Create payout
| Field | Description |
|---|---|
destinationKey | Destination PIX key. |
destinationKeyType | cpf / cnpj / email / phone / random |
amountMinor | Positive integer, BRL cents. |
Idempotency-Key is required. Allowlist enforcement is per merchant. With enforcement disabled, prior key registration is unnecessary. With enforcement enabled, an unregistered recipient is blocked.
The 201 response is the initial snapshot, often approved. GET /v1/pix/payouts/{id} returns the current state: approved, blocked, processing, settled or failed. Do not treat approved as settlement or blindly create another payout after a timeout.
{
"id": "00000000-0000-0000-0000-000000000456",
"merchantId": "00000000-0000-0000-0000-000000000001",
"destinationKey": "recipient@example.com",
"destinationKeyType": "email",
"recipientName": null,
"recipientDocumentMasked": null,
"amountMinor": 1500,
"status": "approved",
"failureReason": null,
"isNewRecipient": false,
"createdBy": "system",
"endToEndId": null,
"createdAt": "2026-09-22T17:00:00Z",
"updatedAt": "2026-09-22T17:00:00Z"
}Request body
{
"destinationKey": "recipient@example.com",
"destinationKeyType": "email",
"amountMinor": 1500
}Illustrative response
201
{
"id": "00000000-0000-0000-0000-000000000456",
"merchantId": "00000000-0000-0000-0000-000000000001",
"destinationKey": "recipient@example.com",
"destinationKeyType": "email",
"recipientName": null,
"recipientDocumentMasked": null,
"amountMinor": 1500,
"status": "approved",
"failureReason": null,
"isNewRecipient": false,
"createdBy": "system",
"endToEndId": null,
"createdAt": "2026-09-22T17:00:00Z",
"updatedAt": "2026-09-22T17:00:00Z"
}Updated today
Pix - Cash Out
Get payout and details
Use the payout UUID (id), not endToEndId. GET /v1/pix/payouts lists items, page, pageSize and total. GET /v1/pix/payouts/{id}/details adds optional pspStatus, a bank-side status that may be null; it is not a failure explanation.
failed payouts expose failureReason (in POST/GET responses, in the payout.failed webhook, and on /details): null when no reason was recorded, otherwise a short explanation string. It is diagnostic text, not an enum β do not branch business logic on specific values; branch on status instead. The failed transition means EYT confirmed nothing was sent, and the principal returns to the balance at that moment; the fee is not refunded. blocked payouts (balance/allowlist) never carry failureReason.
{
"id": "00000000-0000-0000-0000-000000000456",
"merchantId": "00000000-0000-0000-0000-000000000001",
"destinationKey": "recipient@example.com",
"destinationKeyType": "email",
"recipientName": null,
"recipientDocumentMasked": null,
"amountMinor": 1500,
"status": "approved",
"failureReason": null,
"isNewRecipient": false,
"createdBy": "system",
"endToEndId": null,
"createdAt": "2026-09-22T17:00:00Z",
"updatedAt": "2026-09-22T17:00:00Z"
}Illustrative response
200
{
"id": "00000000-0000-0000-0000-000000000456",
"merchantId": "00000000-0000-0000-0000-000000000001",
"destinationKey": "recipient@example.com",
"destinationKeyType": "email",
"recipientName": null,
"recipientDocumentMasked": null,
"amountMinor": 1500,
"status": "approved",
"failureReason": null,
"isNewRecipient": false,
"createdBy": "system",
"endToEndId": null,
"createdAt": "2026-09-22T17:00:00Z",
"updatedAt": "2026-09-22T17:00:00Z"
}Updated today
Pix - Cash Out
Pay a QR code
This route is separate from payouts by key. It takes brCode and optional amountMinor. Channel support must be confirmed before production use.
Request body
{
"brCode": "<BR Code>",
"amountMinor": 1500
}Illustrative response
201
{
"id": "<payment UUID>",
"endToEndId": null,
"amountMinor": 1500
}Updated today
Pix - Cash Out
Read webhook configuration
The same configuration covers incoming and outgoing Pix. Subscribe to payout.* to include all payout state events. Use PUT /v1/pix/webhooks/rotate to rotate the signing secret.
One URL and event subscription per merchant in each environment. This endpoint replaces the configuration and returns a new signing secret on every PUT, including updates. Store the returned secret securely and update your verifier. GET returns secret: null.
{
"url": "https://merchant.example/webhooks",
"events": [
"charge.*",
"payout.*"
]
}| Field | Description |
|---|---|
X-EYT-Timestamp | Unix seconds. |
X-EYT-Signature | hex HMAC-SHA256(secret, timestamp + "." + rawBody) |
X-EYT-Event | charge.paid / payout.settled / payout.failed |
X-EYT-Delivery-Id | Identifier of this attempt; regenerated on retries. Do not use it alone to deduplicate an event. |
Validate the signature using the exact raw request body and a timestamp tolerance of 300 seconds. Compare signatures in constant time. Accepting any HTTP 2xx completes delivery. Respond promptly after durably accepting the event.
Retry policy
| Field | Description |
|---|---|
1 | Initial attempt when due |
2 | 1 min |
3 | 5 min |
4 | 15 min |
5 | 1 h |
6 | 4 h |
Six attempts total: the initial attempt plus five retries. Each delay starts after the preceding failed attempt. Nominal backoff total: 5 hours 21 minutes, plus request durations, queueing and scheduling. This is not a delivery deadline. Sandbox Lambda suspension may delay processing until a later invocation. After attempt 6 fails, automatic retries stop.
{
"id": "<delivery UUID>",
"type": "payout.failed",
"objectId": "<payout UUID>",
"createdAt": "<event timestamp>",
"data": {
"payoutId": "<payout UUID>",
"merchantId": "<merchant UUID>",
"status": "Failed",
"amountMinor": 1500,
"endToEndId": null,
"failureReason": null
}
}The envelope contains id, type, objectId, createdAt and data. Event data uses domain status casing (for example Paid or Failed); GET responses use lowercase. Process idempotently by object and event state, and use GET to reconcile the current status. data.failureReason mirrors the payout field: null when no reason was recorded, otherwise a short explanation string.
Illustrative response
200
{
"url": "https://merchant.example/webhooks",
"events": [
"charge.*",
"payout.*"
],
"secret": null,
"active": true
}Updated today
Compatibility reference for disputes. Availability on this channel must be confirmed with support.
Disputes
List open disputes
Lists all open disputes. Supports pagination via page and limit.
Query params
| Field | Type | Description | |
|---|---|---|---|
page | integer | optional | Page (default: 1). |
limit | integer | optional | Items per page (default: 20, max: 100). |
Responses
200 OK
data | array | List of disputes. |
total | integer | Total open disputes. |
page | integer | Current page. |
Updated today
Compatibility reference for disputes. Availability on this channel must be confirmed with support.
Disputes
Get dispute by ID
Gets details of a specific dispute, including reason, amount, defense deadline and event history.
Path params
| Field | Type | Description | |
|---|---|---|---|
id | string | required | Dispute identifier. |
Responses
200 OK
id | string | Dispute identifier. |
motivo | string | Dispute reason. |
valor | number | Contested amount. |
prazo_defesa | string | Defense submission deadline. |
status | string | ABERTA, EM_ANALISE, GANHA, PERDIDA. |
Updated today
Compatibility reference for disputes. Availability on this channel must be confirmed with support.
Disputes
Submit dispute defense
Submits a defense for an open dispute. Include the justification and, optionally, supporting attachments.
After submission, the dispute enters status EM_ANALISE and cannot be edited.
Path params
| Field | Type | Description | |
|---|---|---|---|
id | string | required | Dispute identifier. |
Body params
| Field | Type | Description | |
|---|---|---|---|
justificativa | string | required | Defense text. |
anexos | array | optional | URLs or IDs of attached documents. |
Responses
200 OK
id | string | Dispute identifier. |
status | string | EM_ANALISE. |
Updated today
Bank Slip
Bank slip proof availability
This route is not currently implemented. It returns HTTP 501 with code not_implemented; it does not provide a working PDF receipt.
Illustrative response
501
{
"code": "not_implemented",
"message": "Bank slip proof endpoint not yet available.",
"details": []
}Updated today