Payments API
Introdução
Esta API foi desenvolvida seguindo padrões REST. Todas as respostas são fornecidas no formato JSON.
Autenticação
Para acessar a API, autentique-se utilizando sua chave secreta no padrão Basic Auth.
- Envie o header
Authorizationno formato:Authorization: Basic <base64("x:{SECRET_KEY}")>
Exemplos (Basic Auth)
Substitua:
{BASE_URL}: URL do seu ambiente (ex.:http://localhost:3000){SECRET_KEY}: sua chave secreta
cURL
curl -X GET "{BASE_URL}/v1/company" \
-H "Authorization: Basic $(printf 'x:{SECRET_KEY}' | base64)"
Node.js (axios)
import axios from "axios";
const baseURL = "{BASE_URL}";
const secretKey = "{SECRET_KEY}";
const auth = Buffer.from(`x:${secretKey}`).toString("base64");
const api = axios.create({
baseURL,
headers: { Authorization: `Basic ${auth}` },
});
const { data } = await api.get("/v1/company");
console.log(data);
Python (requests)
import base64
import requests
base_url = "{BASE_URL}"
secret_key = "{SECRET_KEY}"
auth = base64.b64encode(f"x:{secret_key}".encode("utf-8")).decode("utf-8")
headers = { "Authorization": f"Basic {auth}" }
r = requests.get(f"{base_url}/v1/company", headers=headers, timeout=20)
print(r.status_code, r.text)
Webhooks (postbacks para o gateway)
Ao criar uma transação (POST /v1/transactions), você informa postbackUrl (ou callbackUrl). Sempre que o status mudar, a Subadquirente envia um POST para essa URL com o padrão oficial Paynux Sub — o mesmo para qualquer adquirente integrada.
Documentação completa: WEBHOOK-GATEWAY.md
Resumo do corpo JSON:
{
"data": {
"id": "<mesmo id retornado na criação da transação>",
"status": "paid",
"e2e": "<opcional: ID E2E do PIX quando disponível>"
}
}
id: use para localizar a transação no seu sistema (é o campoidda resposta de criação).status: status em minúsculas.e2e: só vem quando a adquirente informar; caso contrário o campo não é enviado.
Status possíveis (exemplos)
pending: em processamentopaid: pagamento efetivadorefused: pagamento negadorefunded: valor devolvidocancelled: operação encerradachargeback: estorno / contestação
(Os valores exatos dependem da adquirente e das configurações da sub.)
Endpoints
Dados da empresa
GET /v1/company
Retorna os dados da empresa vinculada à chave.
Exemplos
curl -X GET "{BASE_URL}/v1/company" \
-H "Authorization: Basic $(printf 'x:{SECRET_KEY}' | base64)"
Saldo disponível
GET /v1/balance/available
Retorna o saldo disponível.
Exemplos
curl -X GET "{BASE_URL}/v1/balance/available" \
-H "Authorization: Basic $(printf 'x:{SECRET_KEY}' | base64)"
Criar venda (PIX)
POST /v1/transactions
Cria uma transação de pagamento via PIX.
Body (JSON)
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
paymentMethod |
string | Sim | Meio de pagamento. Valor: pix |
amount |
integer | Sim | Valor total em centavos (ex.: 100 = R$ 1,00) |
customer |
object | Sim | Dados do cliente |
items |
array | Sim | Itens vendidos (mín. 1 item) |
shipping |
object | Condicional | Obrigatório caso algum item seja físico |
isInfoProducts |
boolean | Não | true = produto físico, false = digital |
postbackUrl |
string | Não | URL para receber atualizações desta transação |
idSeller |
string | Não | Campo customizado |
nameSeller |
string | Não | Campo customizado |
emailSeller |
string | Não | Campo customizado |
items[] (campos obrigatórios)
Além dos campos comuns, a validação exige:
title(string)description(string)unitPrice(integer, em centavos)quantity(integer)tangible(boolean)
Exemplo de request
{
"paymentMethod": "pix",
"amount": 2000,
"customer": {
"name": "Cliente Exemplo",
"email": "cliente@exemplo.com",
"phone": "11999999999",
"document": { "type": "cpf", "number": "00000000000" },
"address": {
"street": "Rua Exemplo",
"streetNumber": "100",
"complement": "Apto 101",
"zipCode": "12345678",
"neighborhood": "Centro",
"city": "São Paulo",
"state": "SP",
"country": "Brasil"
}
},
"items": [
{
"title": "Produto Teste",
"description": "Descrição do produto",
"unitPrice": 2000,
"quantity": 1,
"tangible": false
}
],
"postbackUrl": "https://exemplo.com/webhook"
}
Exemplos (cURL / Node / Python)
cURL
curl -X POST "{BASE_URL}/v1/transactions" \
-H "Content-Type: application/json" \
-H "Authorization: Basic $(printf 'x:{SECRET_KEY}' | base64)" \
--data '{
"paymentMethod": "pix",
"amount": 2000,
"customer": {
"name": "Cliente Exemplo",
"email": "cliente@exemplo.com",
"phone": "11999999999",
"document": { "type": "cpf", "number": "00000000000" },
"address": {
"street": "Rua Exemplo",
"streetNumber": "100",
"complement": "Apto 101",
"zipCode": "12345678",
"neighborhood": "Centro",
"city": "São Paulo",
"state": "SP",
"country": "Brasil"
}
},
"items": [
{
"title": "Produto Teste",
"description": "Descrição do produto",
"unitPrice": 2000,
"quantity": 1,
"tangible": false
}
],
"postbackUrl": "https://exemplo.com/webhook"
}'
Node.js (axios)
import axios from "axios";
const baseURL = "{BASE_URL}";
const secretKey = "{SECRET_KEY}";
const auth = Buffer.from(`x:${secretKey}`).toString("base64");
const api = axios.create({
baseURL,
headers: {
"Content-Type": "application/json",
Authorization: `Basic ${auth}`,
},
});
const payload = {
paymentMethod: "pix",
amount: 2000,
customer: {
name: "Cliente Exemplo",
email: "cliente@exemplo.com",
phone: "11999999999",
document: { type: "cpf", number: "00000000000" },
address: {
street: "Rua Exemplo",
streetNumber: "100",
complement: "Apto 101",
zipCode: "12345678",
neighborhood: "Centro",
city: "São Paulo",
state: "SP",
country: "Brasil",
},
},
items: [
{
title: "Produto Teste",
description: "Descrição do produto",
unitPrice: 2000,
quantity: 1,
tangible: false,
},
],
postbackUrl: "https://exemplo.com/webhook",
};
const { data } = await api.post("/v1/transactions", payload);
console.log(data);
Python (requests)
import base64
import requests
base_url = "{BASE_URL}"
secret_key = "{SECRET_KEY}"
auth = base64.b64encode(f"x:{secret_key}".encode("utf-8")).decode("utf-8")
headers = {
"Content-Type": "application/json",
"Authorization": f"Basic {auth}"
}
payload = {
"paymentMethod": "pix",
"amount": 2000,
"customer": {
"name": "Cliente Exemplo",
"email": "cliente@exemplo.com",
"phone": "11999999999",
"document": { "type": "cpf", "number": "00000000000" },
"address": {
"street": "Rua Exemplo",
"streetNumber": "100",
"complement": "Apto 101",
"zipCode": "12345678",
"neighborhood": "Centro",
"city": "São Paulo",
"state": "SP",
"country": "Brasil"
}
},
"items": [
{
"title": "Produto Teste",
"description": "Descrição do produto",
"unitPrice": 2000,
"quantity": 1,
"tangible": False
}
],
"postbackUrl": "https://exemplo.com/webhook"
}
r = requests.post(f"{base_url}/v1/transactions", json=payload, headers=headers, timeout=20)
print(r.status_code, r.text)
Response 200 (exemplo)
{
"message": "Successfully registered sale",
"insertId": 999,
"transaction": {
"id": "11111111-2222-3333-4444-555555555555",
"amount": 2000,
"paymentMethod": "PIX",
"status": "waiting_payment",
"createdAt": "2025-05-22T10:44:04-03:00",
"updatedAt": "2025-05-22T10:44:04-03:00",
"customer": { },
"pix": {
"qrcode": "00020101021226...",
"expirationDate": "2025-05-24T00:00:00-03:00",
"end2EndId": null,
"receiptUrl": null
},
"items": [ ]
}
}
Listar vendas
GET /v1/all/transactions
Query params
page(integer, default 1)pageSize(integer, default 20, máximo 50)
Exemplos
curl -X GET "{BASE_URL}/v1/all/transactions?page=1&pageSize=20" \
-H "Authorization: Basic $(printf 'x:{SECRET_KEY}' | base64)"
Listar infrações
GET /v1/infringement
Query params
page(integer, default 1)pageSize(integer, default 20, máximo 50)
Exemplos
curl -X GET "{BASE_URL}/v1/infringement?page=1&pageSize=20" \
-H "Authorization: Basic $(printf 'x:{SECRET_KEY}' | base64)"
Observação (modelo de negócio)
A precificação (por exemplo, repassar uma taxa diferente ao gateway) deve ser tratada por configuração/contrato e não altera o formato do PIX gerado. O webhook e os dados de transação permanecem rastreáveis pelo status, valores e timestamps.