Documentação completa da API de pagamentos PIX
Bem-vindo à API do Porto Payments! Nossa API permite que você integre pagamentos PIX de forma simples e segura em seu sistema.
https://api.portopag.com/api/v1/
Todas as requisições à API devem incluir sua chave de API no header Authorization usando o esquema Bearer.
As chaves de API seguem o formato: ppay_xxxxxxxxx_yyyyyyy
Authorization: Bearer ppay_abc123def_45678xyz Content-Type: application/json
Cria um novo pagamento PIX e retorna o código QR e código Pix Copia e Cola.
| Campo | Tipo | Status | Descrição |
|---|---|---|---|
amount |
integer | obrigatório | Valor em centavos (ex: 15000 = R$ 150,00) |
customer |
object | obrigatório | Dados do cliente (name, email, cpf, phone) |
customer.name |
string | obrigatório | Nome completo do cliente |
customer.email |
string | obrigatório | Email do cliente |
customer.cpf |
string | obrigatório | CPF com 11 dígitos (apenas números) |
customer.phone |
string | obrigatório | Telefone 11 dígitos (formato: 11999999999) |
paymentMethod |
string | obrigatório | Deve ser "pix" |
items |
array | obrigatório | Lista de items do pagamento |
items[].unitPrice |
integer | obrigatório | Preço unitário em centavos |
items[].title |
string | obrigatório | Nome/título do item |
items[].quantity |
integer | obrigatório | Quantidade do item |
items[].tangible |
boolean | opcional | Se é produto físico (padrão: false) |
utmQuery |
string | opcional | Parâmetros UTM para rastreamento |
checkoutUrl |
string | opcional | URL do checkout |
postbackUrl |
string | opcional | URL para receber notificações (específica desta transação) |
externalId |
string | opcional | ID externo do seu sistema |
referrerUrl |
string | opcional | URL de origem da compra |
shipping |
object | opcional | Endereço de entrega (para produtos físicos) |
fingerPrints |
array | opcional | Array de fingerprints (provider, value) para rastrear dispositivo/IP |
amount deve ser igual à soma de items[].unitPrice * items[].quantity.
{
"success": true,
"data": {
"transaction_id": "PPAY1731356789abc12345",
"pix_code": "00020126580014br.gov.bcb.pix...",
"qr_code_image": "data:image/png;base64,iVBORw0KGgo...",
"amount": 150.00,
"status": "pending",
"expires_at": "2024-11-11T05:00:00Z",
"created_at": "2024-11-11T04:00:00Z"
},
"timestamp": "2024-11-11T04:00:00Z",
"request_id": "req_1699678912345_a1b2c3"
}
Consulta o status de um pagamento específico pelo transaction ID.
| Parâmetro | Descrição |
|---|---|
transaction_id |
ID da transação (formato: PPAY...) |
{
"success": true,
"data": {
"transaction_id": "PPAY1731356789abc12345",
"status": "paid",
"amount": 150.00,
"customer_name": "João Silva",
"customer_cpf": "12345678900",
"paid_at": "2024-11-11T04:30:00Z",
"created_at": "2024-11-11T04:00:00Z"
},
"timestamp": "2024-11-11T04:35:00Z"
}
Retorna uma lista de todos os pagamentos da sua conta.
| Parâmetro | Tipo | Descrição |
|---|---|---|
status |
string | Filtrar por status (pending, paid, expired, cancelled) |
limit |
number | Quantidade de resultados (padrão: 50, máximo: 100) |
offset |
number | Paginação - quantidade de registros a pular |
{
"success": true,
"data": {
"payments": [
{
"transaction_id": "PPAY1731356789abc12345",
"status": "paid",
"amount": 150.00,
"customer_name": "João Silva",
"created_at": "2024-11-11T04:00:00Z",
"paid_at": "2024-11-11T04:30:00Z"
},
{
"transaction_id": "PPAY1731356790xyz67890",
"status": "pending",
"amount": 75.50,
"customer_name": "Maria Santos",
"created_at": "2024-11-11T03:45:00Z",
"paid_at": null
}
],
"total": 2,
"limit": 50,
"offset": 0
},
"timestamp": "2024-11-11T04:35:00Z"
}
Retorna o saldo disponível, em processamento e informações da conta.
{
"success": true,
"data": {
"balance": {
"available": 1500.00,
"pending": 350.00,
"total_fees": 45.50
},
"account": {
"user_id": 123,
"username": "empresa@exemplo.com",
"created_at": "2024-01-15T10:00:00Z"
},
"statistics": {
"total_transactions": 25,
"total_paid": 20,
"total_pending": 3,
"total_expired": 2
}
},
"timestamp": "2024-11-11T04:35:00Z"
}
Consulta o status de um pagamento sem necessidade de autenticação. Ideal para páginas de checkout públicas.
| Parâmetro | Descrição |
|---|---|
transaction_id |
ID da transação (formato: PPAY...) |
{
"success": true,
"data": {
"transaction_id": "PPAY1731356789abc12345",
"status": "paid",
"amount": 150.00,
"paid_at": "2024-11-11T04:30:00Z"
},
"timestamp": "2024-11-11T04:35:00Z"
}
Webhooks permitem que você receba notificações em tempo real sobre mudanças de status nos pagamentos.
O endpoint de webhook é configurado pelo usuário diretamente no painel de controle:
https://seu-sistema.com/webhook| Evento | Descrição |
|---|---|
payment.paid |
Pagamento aprovado e confirmado |
payment.pending |
Novo pagamento criado aguardando confirmação |
payment.failed |
Pagamento falhou ou foi cancelado |
payment.expired |
Pagamento expirou sem confirmação |
Os eventos enviados incluem o transaction ID no formato PPAY seguido de timestamp e caracteres aleatórios:
{
"event": "payment.paid",
"transaction_id": "PPAY1731356789abc12345",
"amount": 150.00,
"customer_name": "João Silva",
"customer_cpf": "12345678900",
"customer_email": "joao@email.com",
"paid_at": "2024-11-11T04:30:00Z",
"created_at": "2024-11-11T04:00:00Z",
"external_id": "seu-id-externo",
"timestamp": "2024-11-11T04:30:05Z"
}
200 OK para confirmar o recebimento do webhook. Se não responder em até 5 segundos, faremos até 3 tentativas de reenvio.
// Node.js/Express exemplo
app.post('/webhook', (req, res) => {
const { event, transaction_id, amount, paid_at } = req.body;
if (event === 'payment.paid') {
console.log(`Pagamento ${transaction_id} confirmado!`);
console.log(`Valor: R$ ${amount}`);
// Processar o pagamento no seu sistema
}
// IMPORTANTE: Sempre retornar 200 OK
res.status(200).json({ received: true });
});
| Código HTTP | Código de Erro | Descrição | Solução |
|---|---|---|---|
400 |
VALIDATION_ERROR | Dados de entrada inválidos | Verifique os parâmetros enviados |
401 |
UNAUTHORIZED | API Key inválida ou ausente | Verifique se o header Authorization está correto |
404 |
NOT_FOUND | Pagamento não encontrado | Verifique se o transaction_id está correto |
429 |
RATE_LIMIT_EXCEEDED | Limite de requisições excedido | Aguarde antes de fazer novas requisições |
500 |
INTERNAL_ERROR | Erro interno do servidor | Tente novamente em alguns minutos |
{
"error": {
"code": "VALIDATION_ERROR",
"message": "Dados de entrada inválidos",
"details": "amount: Valor deve ser maior que R$ 0,01"
},
"timestamp": "2024-11-11T04:35:00Z",
"request_id": "req_1699678912345_a1b2c3"
}
curl -X POST https://api.portopag.com/api/v1/payments \
-H "Content-Type: application/json" \
-H "Authorization: Bearer ppay_abc123def_45678xyz" \
-d '{
"amount": 15000,
"customer": {
"name": "João Silva",
"email": "joao@email.com",
"cpf": "12345678900",
"phone": "11999999999"
},
"paymentMethod": "pix",
"items": [
{
"unitPrice": 15000,
"title": "Produto Premium",
"quantity": 1,
"tangible": false
}
],
"utmQuery": "utm_source=google&utm_medium=cpc",
"checkoutUrl": "https://checkout.portopag.com/abc123",
"externalId": "pedido_12345"
}'
const response = await fetch('https://api.portopag.com/api/v1/payments', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer ppay_abc123def_45678xyz'
},
body: JSON.stringify({
amount: 15000, // R$ 150,00 em centavos
customer: {
name: "João Silva",
email: "joao@email.com",
cpf: "12345678900",
phone: "11999999999"
},
paymentMethod: "pix",
items: [
{
unitPrice: 15000,
title: "Produto Premium",
quantity: 1,
tangible: false
}
],
utmQuery: "utm_source=google&utm_medium=cpc",
checkoutUrl: "https://checkout.portopag.com/abc123",
externalId: "pedido_12345"
})
});
const result = await response.json();
console.log('Transaction ID:', result.data.transaction_id);
console.log('PIX Code:', result.data.pix_code);
console.log('QR Code:', result.data.pix_qr_code);
import requests
url = "https://api.portopag.com/api/v1/payments"
headers = {
"Content-Type": "application/json",
"Authorization": "Bearer ppay_abc123def_45678xyz"
}
data = {
"amount": 15000, # R$ 150,00 em centavos
"customer": {
"name": "João Silva",
"email": "joao@email.com",
"cpf": "12345678900",
"phone": "11999999999"
},
"paymentMethod": "pix",
"items": [
{
"unitPrice": 15000,
"title": "Produto Premium",
"quantity": 1,
"tangible": False
}
],
"utmQuery": "utm_source=google&utm_medium=cpc",
"checkoutUrl": "https://checkout.portopag.com/abc123",
"externalId": "pedido_12345"
}
response = requests.post(url, json=data, headers=headers)
result = response.json()
print(f"Transaction ID: {result['data']['transaction_id']}")
print(f"PIX Code: {result['data']['pix_code']}")
print(f"QR Code: {result['data']['pix_qr_code']}")
<?php
$url = "https://api.portopag.com/api/v1/payments";
$data = [
"amount" => 15000, // R$ 150,00 em centavos
"customer" => [
"name" => "João Silva",
"email" => "joao@email.com",
"cpf" => "12345678900",
"phone" => "11999999999"
],
"paymentMethod" => "pix",
"items" => [
[
"unitPrice" => 15000,
"title" => "Produto Premium",
"quantity" => 1,
"tangible" => false
]
],
"utmQuery" => "utm_source=google&utm_medium=cpc",
"checkoutUrl" => "https://checkout.portopag.com/abc123",
"externalId" => "pedido_12345"
];
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
curl_setopt($ch, CURLOPT_HTTPHEADER, [
"Content-Type: application/json",
"Authorization: Bearer ppay_abc123def_45678xyz"
]);
$response = curl_exec($ch);
$result = json_decode($response, true);
echo "Transaction ID: " . $result['data']['transaction_id'] . "\n";
echo "PIX Code: " . $result['data']['pix_code'] . "\n";
echo "QR Code: " . $result['data']['pix_qr_code'] . "\n";
?>
// JavaScript exemplo - consulta autenticada
const transactionId = "PPAY1731356789abc12345";
const response = await fetch(
`https://api.portopag.com/api/v1/payments/${transactionId}`,
{
headers: {
'Authorization': 'Bearer ppay_abc123def_45678xyz'
}
}
);
const payment = await response.json();
console.log('Status:', payment.data.status);
// JavaScript exemplo - consulta pública (sem autenticação)
const publicResponse = await fetch(
`https://api.portopag.com/api/v1/public/status/${transactionId}`
);
const publicPayment = await publicResponse.json();
console.log('Status público:', publicPayment.data.status);