EYTdocs

发起 PIX 付款(Cash-Out)

POST /api/pix/cash-out

POST https://api.gateway.eyt.com.br/api/pix/cash-out

需要在 Authorization 头中提供 Bearer token。请参阅 生成令牌 获取。

向目标 PIX 密钥发送 PIX 付款。交易创建后状态为 PENDING,最终结果将通过 webhook 通知,或可通过轮询查询。

认证

需要在 Authorization 请求头中提供 Bearer 令牌。

在沙盒中测试? 添加 X-Sandbox-Scenario 请求头以模拟错误场景,例如余额不足、无效 PIX 密钥和证件号码不匹配。请参阅沙盒测试指南。

请求体

字段类型必填描述
valuenumber是金额(巴西雷亚尔,最多 2 位小数)。最小值:0.01
externalIdstring是每个账户的唯一外部标识符
descriptionstring否交易描述(最多 140 个字符)
detailsobject是目标 PIX 密钥信息
details.keystring是目标 PIX 密钥(格式见下表)
details.keyTypestring是密钥类型:DOCUMENT、EMAIL、PHONE、RANDOM。必填,因为 API 不会查询 DICT
details.namestring是收款人姓名(仅供参考,最多 100 个字符)
details.documentstring是密钥持有人的 CPF(11 位数字)或 CNPJ(14 位数字)。API 仅校验格式;与密钥真实持有人的比对取决于账户的清算机构 — 参见按清算机构划分的持有人核验

details.key 的格式要求

keyType格式示例
DOCUMENTCPF:11 位数字 / CNPJ:14 位数字(仅数字)12345678901、12345678000195
EMAIL有效的电子邮件地址usuario@exemplo.com
PHONE区号 + 号码(10-11 位数字,不含国际区号 +55)11999999999
RANDOMUUID(可带或不带连字符)a1b2c3d4-e5f6-4890-abcd-ef1234567890

付款始终按 PIX 密钥(details.key)寻址。 details.document 字段对于所有密钥类型均为必填,包括 EMAIL、PHONE 和 RANDOM,并会转发给您账户的清算机构 — 但只有部分清算机构会将其与密钥真实持有人比对。EYT API 在发送前不会将 details.document 与 details.key 比对,也不会查询 DICT。当账户的清算机构不执行该核验时,不一致的 details.document 不会拦截付款:资金将进入密钥持有人账户。参见按清算机构划分的持有人核验。


请求示例

通过 CPF 付款 -- 最常见的场景。details.key 和 details.document 必须相同(都是 CPF)。API 不会核验二者是否相同:请在发送前在您这一侧确保一致。

{
  "value": 150.00,
  "externalId": "PAG-2024-0001",
  "description": "Pagamento freelancer - Janeiro/2024",
  "details": {
    "key": "12345678901",
    "keyType": "DOCUMENT",
    "name": "Ana Costa",
    "document": "12345678901"
  }
}

通过 CNPJ 付款 -- 常见于 B2B 支付(供应商、发票)。

{
  "value": 4500.00,
  "externalId": "NF-2024-0089",
  "description": "NF 0089/2024 - Serviços de hospedagem",
  "details": {
    "key": "11222333000144",
    "keyType": "DOCUMENT",
    "name": "Cloud Provider Ltda",
    "document": "11222333000144"
  }
}

通过电子邮件密钥付款。请注意,details.document 必须是密钥持有人的 CPF/CNPJ(无法通过电子邮件推断)。如果您账户的清算机构不核验持有人,错误的证件号不会阻止付款。

{
  "value": 89.90,
  "externalId": "COMM-2024-0456",
  "description": "Comissão venda #456",
  "details": {
    "key": "vendedor@loja.com.br",
    "keyType": "EMAIL",
    "name": "Roberto Vendas",
    "document": "98765432100"
  }
}

通过手机号码密钥付款。格式为区号 + 号码(10 或 11 位数字),不含国际区号 +55。

{
  "value": 25.00,
  "externalId": "REEMB-2024-0012",
  "description": "Reembolso uber colaborador",
  "details": {
    "key": "11987654321",
    "keyType": "PHONE",
    "name": "Pedro Almeida",
    "document": "11122233344"
  }
}

通过随机密钥(EVP/UUID)付款。由巴西中央银行生成,不包含个人信息。

{
  "value": 1250.00,
  "externalId": "RENT-2024-JAN",
  "description": "Aluguel janeiro/2024",
  "details": {
    "key": "a1b2c3d4-e5f6-4890-abcd-ef1234567890",
    "keyType": "RANDOM",
    "name": "Imobiliária Central",
    "document": "55666777000199"
  }
}

按清算机构划分的持有人核验

EYT API 仅校验 details.document 的格式(11 或 14 位数字及校验位),并按 keyType 校验 details.key 的格式。API 不会将 details.document 与 details.key 进行比对,不会查询 DICT,两者不一致时也不会拦截操作。 付款始终按 PIX 密钥寻址。证件号与密钥真实持有人的比对(如果存在)由您账户配置的清算机构执行:

账户的清算机构是否将 details.document 与密钥持有人比对?不一致时
ONZ 及基于 ONZ 运营的清算机构(FyHub、Nixfin、OnlyUp、Treeal)是,只要发送了该字段被清算机构拒绝:交易状态 ERROR,不扣款,webhook 携带清算机构的消息(例如 "CPF/CNPJ informado não confere com o CPF/CNPJ do destinatário")
Magen默认不比对付款完成,资金进入密钥持有人账户
a55、AvivPay IP(与 a55 相同的 API)否。 字段会转发给清算机构,但不会被核验付款完成,资金进入密钥持有人账户
GolPix、Hyperwallet字段会转发给清算机构;EYT 不保证核验取决于清算机构
BRZip、Woovi、AvivPay否。字段不会发送给清算机构付款完成,资金进入密钥持有人账户

既然如此,为什么仍要发送 details.document? 在 ONZ 账户(以及 FyHub、Nixfin、OnlyUp、Treeal)上,它是唯一存在的持有人核验:省略该字段会关闭核验,且转账将进入清算机构的普通优先级队列。在其他清算机构上,该字段会被接受,但不会改变付款结果。

如何知道我的账户使用哪家清算机构? 该配置按账户设置,在账户创建时确定。如有疑问,请咨询您的集成经理。如果您的业务要求证件号不一致时必须拦截付款,请在确定账户清算机构时将其作为需求提出,并在发送前在您这一侧核验持有人:对于 keyType: DOCUMENT,请确保 details.document 与 details.key 相同。


代码示例

cURL
curl -X POST "https://api.gateway.eyt.com.br/api/pix/cash-out" \
  -H "Authorization: Bearer $EYT_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "value": 150.00,
  "externalId": "PAG-2024-0001",
  "description": "Pagamento freelancer - Janeiro/2024",
  "details": {
    "key": "12345678901",
    "keyType": "DOCUMENT",
    "name": "Ana Costa",
    "document": "12345678901"
  }
}'
const axios = require('axios');

const response = await axios.post('https://api.gateway.eyt.com.br/api/pix/cash-out',
  {
  "value": 150.00,
  "externalId": "PAG-2024-0001",
  "description": "Pagamento freelancer - Janeiro/2024",
  "details": {
    "key": "12345678901",
    "keyType": "DOCUMENT",
    "name": "Ana Costa",
    "document": "12345678901"
  }
},
  {
    headers: {
      'Authorization': `Bearer ${process.env.EYT_TOKEN}`,
      'Content-Type': 'application/json',
    },
  }
);
console.log(response.data);
import os, requests

response = requests.post(
    'https://api.gateway.eyt.com.br/api/pix/cash-out',
    headers={
        'Authorization': f'Bearer {os.environ["EYT_TOKEN"]}',
        'Content-Type': 'application/json',
    },
    json={
  "value": 150.00,
  "externalId": "PAG-2024-0001",
  "description": "Pagamento freelancer - Janeiro/2024",
  "details": {
    "key": "12345678901",
    "keyType": "DOCUMENT",
    "name": "Ana Costa",
    "document": "12345678901"
  }
},
)
print(response.json())
$ch = curl_init('https://api.gateway.eyt.com.br/api/pix/cash-out');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST => true,
    CURLOPT_HTTPHEADER => [
        'Authorization: Bearer ' . getenv('EYT_TOKEN'),
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS => '{
  "value": 150.00,
  "externalId": "PAG-2024-0001",
  "description": "Pagamento freelancer - Janeiro/2024",
  "details": {
    "key": "12345678901",
    "keyType": "DOCUMENT",
    "name": "Ana Costa",
    "document": "12345678901"
  }
}',
]);
$response = curl_exec($ch);
curl_close($ch);
echo $response;
String body = """
    {
      "value": 150.00,
      "externalId": "PAG-2024-0001",
      "description": "Pagamento freelancer - Janeiro/2024",
      "details": {
        "key": "12345678901",
        "keyType": "DOCUMENT",
        "name": "Ana Costa",
        "document": "12345678901"
      }
    }
    """;
HttpRequest request = HttpRequest.newBuilder()
    .uri(URI.create("https://api.gateway.eyt.com.br/api/pix/cash-out"))
    .header("Authorization", "Bearer " + System.getenv("EYT_TOKEN"))
    .header("Content-Type", "application/json")
    .POST(HttpRequest.BodyPublishers.ofString(body))
    .build();
HttpResponse<String> response = HttpClient.newHttpClient()
    .send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());

响应 (201 Created)

字段类型描述
transactionIdstring生成的交易内部标识符(UUID)
externalIdstring请求中提供的外部标识符
statusstring初始状态:PENDING。通过 webhook 确认:CONFIRMED 或 ERROR
generateTimestring交易生成日期/时间(ISO 8601 UTC)
{
  "transactionId": "8b3b85ac-394c-4144-9bcb-c5d12de3fa56",
  "externalId": "PAG-2024-0001",
  "status": "PENDING",
  "generateTime": "2024-01-15T10:30:00.000Z"
}

错误

当请求体未通过验证时返回。message 字段是一个数组,包含每个无效字段的错误消息。

{
  "statusCode": 400,
  "timestamp": "2026-04-10T15:30:34.560Z",
  "path": "/public/pix/cash-out",
  "method": "POST",
  "code": "HTTP_ERROR",
  "message": [
    "value must be at least 0.01",
    "details.keyType must be one of: EMAIL, PHONE, DOCUMENT, RANDOM"
  ],
  "userMessage": "Requisição inválida. Verifique os dados enviados.",
  "errorId": "a1b2c3d4e5f6789012345678abcdef01",
  "error": "Bad Request"
}

常见原因:

  • value 小于 0.01 或超过 2 位小数
  • details.keyType 值无效
  • details.key 与 keyType 的格式不匹配
  • details.document 为空或格式错误

可用余额小于交易金额 + 手续费。

{
  "statusCode": 400,
  "timestamp": "2026-04-10T15:30:34.560Z",
  "path": "/public/pix/cash-out",
  "method": "POST",
  "code": "PIX_INSUFFICIENT_BALANCE",
  "message": "Saldo insuficiente para realizar esta operação.",
  "userMessage": "Requisição inválida. Verifique os dados enviados.",
  "errorId": "b2c3d4e5f6a7890123456789abcdef02",
  "errorCode": "PIX_INSUFFICIENT_BALANCE"
}

同类别的其他业务错误:

错误码描述
PIX_INSUFFICIENT_BALANCE余额不足(金额 + 手续费)
PIX_TRANSACTION_LIMIT_EXCEEDED金额超过单笔交易限额
PIX_DAILY_LIMIT_EXCEEDED当日累计金额超过每日限额
PIX_NIGHT_LIMIT_EXCEEDED夜间交易超过降低后的限额(20:00-06:00)
PIX_INVALID_AMOUNT金额小于 0.01 或超过 2 位小数
PIX_INVALID_PIX_KEY密钥格式与所提供的 keyType 不匹配

该 externalId 已在此账户中使用过。请使用新的标识符。返回状态码 400(非 409),details 中包含已有交易的 ID。

{
  "statusCode": 400,
  "timestamp": "2026-04-10T15:30:34.560Z",
  "path": "/public/pix/cash-out",
  "method": "POST",
  "code": "PIX_DUPLICATE_EXTERNAL_ID",
  "message": "Esta transação já existe no sistema.",
  "userMessage": "Requisição inválida. Verifique os dados enviados.",
  "errorId": "c57c14ee10aabd82e40dae9b940706e0",
  "errorCode": "PIX_DUPLICATE_EXTERNAL_ID",
  "details": {
    "externalId": "external-teste-002",
    "existingTransactionId": 466208
  }
}

externalId 用作幂等键。如果您使用相同的 externalId 发送两次相同的请求,第二次调用将返回错误 -- 确保付款不会重复。details.existingTransactionId 字段可用于查找原始交易。

当清算银行在交易创建之后拒绝了操作时,状态会变为 ERROR,并且 errorCode/errorMessage 字段将通过 Cash-Out webhook 发送:

errorCode描述可重试?
TAX_ID_MISMATCHdetails.document 与 PIX 密钥持有人不匹配。由 Magen 清算机构在启用持有人核验时发出;在 ONZ/FyHub/Nixfin/OnlyUp/Treeal 账户上,不一致会以清算机构自身的消息返回(参见按清算机构划分的持有人核验)否 -- 请修正 CPF/CNPJ
INVALID_TAX_IDCPF/CNPJ 算法校验无效(Magen 清算机构)否 -- 请修正证件号码
BLOCKED_ACCOUNT目标账户被司法冻结否
ACCOUNT_CLOSED目标账户已注销否
ORDER_REJECTED目标银行拒绝了该操作否
PAYMENT_EXPIRED交易在处理前已过期是 -- 请重新发送
SETTLEMENT_TIMEOUT目标银行未及时响应是 -- 请重新发送

包含错误的 webhook 载荷示例:

{
  "event": "CashOut",
  "status": "ERROR",
  "transactionType": "PIX",
  "movementType": "DEBIT",
  "transactionId": "466208",
  "externalId": "PAG-2024-0001",
  "endToEndId": "E17758345EYNKPHCJKMS",
  "pixKey": "12345678901",
  "feeAmount": 0.07,
  "originalAmount": 1,
  "finalAmount": 1.07,
  "processingDate": "2026-04-10T15:22:49.970Z",
  "errorCode": "TAX_ID_MISMATCH",
  "errorMessage": "O documento informado não corresponde ao titular da chave PIX",
  "counterpart": {
    "name": "João Silva",
    "document": "12345678901",
    "bank": {
      "bankISPB": "13140088",
      "bankName": "ACESSO SOLUÇÕES DE PAGAMENTO S.A.",
      "bankCode": "332",
      "accountBranch": null,
      "accountNumber": null
    }
  },
  "metadata": {}
}

当 status 为 CONFIRMED 时,errorCode 和 errorMessage 字段为 null。当 status 为 ERROR 时,它们表示拒绝的原因。

请参阅 PIX Cash-Out 集成指南,获取代码示例、密钥本地验证和最佳实践。

本页目录