companyId via x-api-key.PIX, CREDIT_CARD e BOLETO.x-end-user-ip, que deve conter o IP do usuário final. Esse campo é opcional, mas é extremamente recomendado que ele seja enviado para transações com cartão de crédito.paymentMethoditemscustomerpaymentMethod: Método de pagamento (PIX, CREDIT_CARD ou BOLETO).finalAmountInCents: Valor final da transação em centavos (ex: R$ 10,00 = 1000), pode ser usado para aplicar descontos (quando enviado, sobrescreve o somatório da unidade dos itens como valor final da transação)items: Lista de produtos ou serviços (veja detalhes abaixo).customer: Objeto contendo os dados do pagador.metadata: Metadados do pagamento (string).postbackUrl: URL de callback para notificações assíncronas.address: Objeto contendo os dados do endereço do pagador.creditCard: Objeto contendo os dados do cartão de crédito.creditCardToken: Objeto contendo a referência a um cartão previamente tokenizado (veja Tokenização de cartão de crédito).address):productType = COMMON.DIGITAL.creditCard ou creditCardToken):paymentMethod = CREDIT_CARD.creditCard (cartão digitado) ou creditCardToken (cartão salvo). Nunca ambos.customer)name: Nome completo.email: E-mail.phone: Telefone com código do país (ex: 5511999999999).cpfOrCnpj: CPF ou CNPJ.-, /, +).creditCardToken está presente, o campo customer não deve ser enviado — o comprador é automaticamente o dono do cartão tokenizado.items)productTitle: Nome do produto.description: Breve descrição do produto.quantity: Quantidade comprada.priceCents: Valor em centavos de cada unidade (ex: R$ 10,00 = 1000).productType: Tipo do produto (DIGITAL ou COMMON).address)postalCode: CEP no formato brasileiro.neighborhood: Bairro.city: Cidade.state: Sigla do estado (2 caracteres).streetAddress: Logradouro (rua/avenida).streetNumber: Número do imóvel.complement: Complemento (opcional, máx. 100 caracteres).number: Número do cartão (sem espaços).verificationValue: Código de verificação (CVV).firstName: Primeiro nome do titular.lastName: Sobrenome do titular.month: Mês de vencimento (ex: 04).year: Ano de vencimento (ex: 2035).numberOfInstallments: Número de parcelas (de 1 a 12, default 1).tdsServerTransId: Identificador da autenticação 3DS (UUID), obtido no navegador do comprador.numberOfInstallments utiliza 1 como valor padrão, portanto não precisa ser enviado em caso de pagamento à vista.customerId — ao criar qualquer transação (POST /payment com Pix, boleto ou cartão), a resposta devolve um customerId que identifica o comprador dentro da sua empresa. Guarde esse valor.POST /payment/credit-card-token informando o customerId e os dados do cartão (mesma forma do campo creditCard de POST /payment). A rota cria o cartão na adquirente e devolve um cardId.POST /payment com paymentMethod: CREDIT_CARD e o objeto creditCardToken contendo customerId e cardId, sem enviar customer e sem enviar creditCard. O comprador e o endereço são obtidos automaticamente do cliente dono do cartão.cardId pode ser usado em quantas cobranças forem necessárias.creditCardToken, os campos customer e creditCard não devem estar presentes no body.creditCardToken:customerId (obrigatório): Id do cliente dono do cartão.cardId (obrigatório): Id do cartão tokenizado.numberOfInstallments (opcional): Quantidade de parcelas (1 a 12, padrão: 1).address junto com creditCardToken. O endereço será usado nesta cobrança e atualizará o cadastro do cliente.tdsServerTransId não se aplica a creditCardToken.cardId pode ser reutilizado em múltiplas cobranças sem restrição de quantidade.tdsServerTransId simplesmente não precisa ser enviado.tdsServerTransId é recusado com 400 e o código COMPANY_E028.creditCardToken (cartão tokenizado) não passam por 3DS, independentemente da configuração da empresa.POST /payment:GET /payment/tds-token, autenticando com o mesmo header x-api-key. A resposta é { "tdsToken": "<JWT>" }. O token expira em cerca de 20 segundos — gere um por tentativa de pagamento, imediatamente antes de iniciar a autenticação. Nunca reaproveite nem armazene.https://3ds-nx-js.stone.com.br/test/v2/3ds2.min.jstrans_status e um tds_server_trans_id.trans_status antes de criar o pagamento:| trans_status | Significado | O que fazer |
|---|---|---|
| Y / A | Autenticada / tentativa registrada | Chamar POST /payment com creditCard.tdsServerTransId |
| U | Autenticação indisponível no emissor | Chamar POST /payment sem o campo — a venda não é perdida |
| N / R / I | Negada / rejeitada / informativa | Não enviar o pagamento; peça outro meio de pagamento ao comprador |
tds_server_trans_id no campo creditCard.tdsServerTransId. A Bestfy repassa a autenticação à adquirente, que valida o identificador contra o próprio servidor 3DS — um valor inventado, já usado ou de outro cartão faz a transação falhar sem cobrança.tdsServerTransId pode ser aceita mesmo com o 3DS habilitado — o comportamento é intencional e não requer nenhuma ação da sua parte.PENDING: a cobrança foi emitida e aguarda o pagamento. O mesmo status vai no webhook de criação.financialTransactionId. A transação fica PROCESSING até o meio de pagamento confirmar, e o desfecho (PAID ou REJECTED) chega por webhook. Quando o emissor recusa o cartão na hora, a resposta é 400 com o código FINANCIAL_TRANSACTION_E025 e nenhum webhook é enviado.paymentMethod, o comprador (cpfOrCnpj e email), os itens (productTitle, quantity e priceCents, na mesma ordem) e o valor final. Os dados do cartão e o número de parcelas não contam: trocar de cartão não torna a compra diferente.FINANCIAL_TRANSACTION_E002 e nenhuma cobrança nova é criada. A resposta não devolve a cobrança existente.FINANCIAL_TRANSACTION_E002, a cobrança da primeira tentativa já existe: aguarde o webhook dela, que traz o transactionId, em vez de insistir no reenvio.| Código | Motivo |
|---|---|
| 400 | Requisição inválida (ex: endereço ausente quando obrigatório) |
| 400 | COMPANY_E028 — autenticação 3DS obrigatória para esta transação (veja Autenticação 3DS) |
| 400 | tdsServerTransId fora do formato UUID |
| 400 | FINANCIAL_TRANSACTION_E038 — creditCard e creditCardToken enviados juntos |
| 400 | FINANCIAL_TRANSACTION_E039 — customer e creditCardToken enviados juntos |
| 400 | FINANCIAL_TRANSACTION_E002: cobrança idêntica criada há menos de 10 segundos (veja Cobrança duplicada) |
| 400 | FINANCIAL_TRANSACTION_E025: cartão recusado pelo emissor |
| 404 | Recurso não encontrado |
| 404 | CUSTOMER_E001 — customerId não pertence à empresa da API key |
| 404 | CUSTOMER_CREDIT_CARD_TOKEN_E003 — cardId não pertence ao customerId informado |
| 500 | Erro interno — tente novamente após alguns segundos |
| 500 | Erro ao criar pagamento com cartão — dados inválidos |
GET /payment/tds-token responde 400 com o código COMPANY_E027 ("3DS não habilitado para esta empresa") quando a autenticação não está ativa para a sua empresa. Trate esse retorno como "siga o pagamento sem 3DS", não como falha.curl --location 'https://api.bestfy.io/payment' \
--header 'User-Agent: <nome-do-projeto>' \
--header 'x-api-key: <api-key>' \
--header 'x-end-user-ip: <ip-do-usuário>' \
--header 'Content-Type: application/json' \
--data-raw '{
"paymentMethod": "PIX",
"items": [
{
"productTitle": "Produto XYZ",
"description": "Descrição do produto XYZ",
"quantity": 1,
"priceCents": 1000,
"productType": "COMMON"
}
],
"customer": {
"name": "John Doe",
"email": "johndoe@email.com",
"phone": "11999999999",
"cpfOrCnpj": "89415463000128"
},
"metadata": "{\"key\": \"value\"}",
"address": {
"postalCode": "59127-490",
"neighborhood": "Potengi",
"city": "Natal",
"state": "RN",
"streetAddress": "Rua Serra da Esperança",
"streetNumber": "123"
},
"creditCardToken": {
"customerId": "01912ce8-b6ee-79b7-bd6a-297f1fef14f6",
"cardId": "01912ce8-b6ee-79b7-bd6a-297f1fef14f7",
"numberOfInstallments": 1
},
"postbackUrl": "https://example.com/postback"
}'{
"financialTransactionId": "019c009b-ae07-2c60-cf14-abc48d02ca1d",
"qrCode": "https://faturas.iugu.com/qr_code/7d531bed-3d3f-4088-a4be-c82e5f08ed5e-7fbd",
"qrCodeText": "00020101021226890014br.gov.bcb.pix2567qr.iugu.com/public/payload/v2/cobv/7D531BED3D3F4088A4BEC82E5F08ED5E520400005303986540510.005802BR5919JOAO PEDRO PRODUCER6012PORTO ALEGRE62070503***6304D647"
}