POST

Criar Transação

Cria uma transação de pagamento. Suporta PIX, BOLETO e CREDIT_CARD. Valores monetários são sempre em centavos (inteiros).

Endpoint

POST /api/v1/transactions/create

Headers

Content-Typeapplication/jsonObrigatório
Acceptapplication/jsonObrigatório
X-Client-Id<client_id>Obrigatório
X-API-Key<api_key>Obrigatório
Idempotency-Keytx_<unique>Recomendado

Nota: O header Idempotency-Key é recomendado para evitar duplicidade de transações.

Request Body (PIX)

Importante: Todos os valores monetários (amount, unitPrice, fee) devem ser informados em centavos (inteiros).

{
  "amount": 500,
  "currency": "BRL",
  "paymentMethod": "PIX",
  "installments": 1,
  "customer": {
    "id": "CUST-1729131560000",
    "name": "João Teste",
    "email": "joao.teste+1729131560000@exemplo.com",
    "document": { "number": "24577481600", "type": "CPF" },
    "phone": "11987654321",
    "externalRef": "LEAD-1234"
  },
  "shipping": {
    "fee": 0,
    "address": {
      "street": "Rua dos Testes",
      "streetNumber": "123",
      "complement": "Sala 2",
      "zipCode": "01001000",
      "neighborhood": "Centro",
      "city": "São Paulo",
      "state": "SP",
      "country": "BR"
    }
  },
  "items": [
    {
      "title": "Produto X",
      "unitPrice": 500,
      "quantity": 1,
      "tangible": true,
      "externalRef": "SKU-001"
    }
  ],
  "pix": { "expiresInDays": 1 },
  "postbackUrl": "",
  "metadata": "{\"origem\":\"n8n\",\"ambiente\":\"homologacao\"}",
  "traceable": true,
  "ip": "177.123.45.67"
}

Response 200 (PIX)

Exemplo Mínimo

Retorno básico já observado em produção:

{
  "data": {
    "id": "ebe485c6-cdf4-4736-aa3e-464044c4d4eb",
    "externalRef": "686725",
    "amount": 500,
    "refundedAmount": 0,
    "providerCompanyId": "b6877393-8a98-4e4e-8a20-e086aacf3d8c",
    "companyId": null,
    "installments": 1,
    "paymentMethod": "PIX",
    "status": "WAITING_PAYMENT",
    "postbackUrl": "",
    "metadata": null,
    "traceable": true,
    "secureId": null,
    "secureUrl": null
  },
  "status": 200,
  "message": "Transação criada com sucesso."
}

Exemplo Completo

Quando o provedor retorna campos adicionais:

{
  "data": {
    "id": "43836dbe-be02-47bc-965b-c51487b83b06",
    "externalRef": "686671",
    "amount": 500,
    "refundedAmount": 0,
    "providerCompanyId": "b6877393-8a98-4e4e-8a20-e086aacf3d8c",
    "installments": 1,
    "paymentMethod": "PIX",
    "status": "WAITING_PAYMENT",
    "postbackUrl": "",
    "metadata": null,
    "traceable": true,
    "createdAt": "2025-10-17T01:38:51.943Z",
    "updatedAt": "2025-10-17T01:38:51.943Z",
    "paidAt": "2025-10-17T01:38:58.193Z",
    "ip": "146.190.148.63",
    "endToEndId": null,
    "externalNsu": null,
    "currency": "BRL",
    "pix": {
      "qrcode": "0002010102122682...6304",
      "url": null,
      "expirationDate": "2025-10-18T01:38:51.943Z"
    }
  },
  "status": 200,
  "message": "Transação criada com sucesso."
}

📌 Observações Importantes

  • amount, unitPrice, fee estão em centavos
  • providerCompanyId é o GUID do provedor (diferente do companyId interno)
  • Em PIX, se pix.url vier null, use o qrcode como BR Code
  • Datas podem não vir em todos os cenários; quando presentes, são ISO-8601 UTC
  • Guarde o data.id como providerTxId para consultas posteriores e reconciliação

Erros

Todos os erros seguem o formato RFC 7807 Problem Details:

{
  "type": "https://httpstatuses.com/400",
  "title": "Bad Request",
  "status": 400,
  "detail": "Campo 'amount' é obrigatório",
  "errors": { "amount": ["O valor precisa ser inteiro em centavos."] },
  "traceId": "00-3a2b...-01"
}

400 Bad Request: Dados inválidos ou campos obrigatórios ausentes

401 Unauthorized: Credenciais inválidas ou ausentes

403 Forbidden: Acesso negado ao recurso

404 Not Found: Recurso não encontrado

409 Conflict: Conflito de estado (ex: transação duplicada)

422 Unprocessable Entity: Validação de negócio falhou

500 Internal Server Error: Erro interno do servidor

Exemplo cURL

curl -X POST https://dfpay.app/api/v1/transactions/create \
  -H "Content-Type: application/json" \
  -H "Accept: application/json" \
  -H "X-Client-Id: <CLIENT_ID>" \
  -H "X-API-Key: <API_KEY>" \
  -H "Idempotency-Key: tx_$(date +%s)_$RANDOM" \
  -d '{
    "amount": 500,
    "currency": "BRL",
    "paymentMethod": "PIX",
    "installments": 1,
    "customer": {
      "id": "CUST-123",
      "name": "João",
      "email": "joao@ex.com",
      "document": {"number": "24577481600", "type": "CPF"},
      "phone": "11987654321"
    },
    "items": [{
      "title": "Produto X",
      "unitPrice": 500,
      "quantity": 1,
      "tangible": true
    }],
    "pix": { "expiresInDays": 1 },
    "postbackUrl": "",
    "traceable": true,
    "ip": "177.123.45.67"
  }'

Exemplo JavaScript (fetch)

const response = await fetch("https://dfpay.app/api/v1/transactions/create", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "Accept": "application/json",
    "X-Client-Id": "<CLIENT_ID>",
    "X-API-Key": "<API_KEY>",
    "Idempotency-Key": `tx_${Date.now()}_${Math.floor(Math.random()*1e6)}`
  },
  body: JSON.stringify({
    amount: 500,
    currency: "BRL",
    paymentMethod: "PIX",
    installments: 1,
    customer: {
      id: "CUST-123",
      name: "João",
      email: "joao@ex.com",
      document: { number: "24577481600", type: "CPF" },
      phone: "11987654321"
    },
    items: [{
      title: "Produto X",
      unitPrice: 500,
      quantity: 1,
      tangible: true
    }],
    pix: { expiresInDays: 1 },
    postbackUrl: "",
    traceable: true,
    ip: "177.123.45.67"
  })
});

const data = await response.json();
console.log(data);

Notas Finais

Salve o id retornado como providerTxId para consultas posteriores e reconciliação.

🔔 Atualizações de status também chegam via webhook configurado no postbackUrl.

🔍 O polling com GET /api/checkout/status/{id} é opcional, mas útil para verificar o status atual da transação.