Pangeia Labs Pangeia PAY
Ir para Home

API Doc

Documentação completa para integrar sua plataforma com Pangeia PAY.

Versão da documentação: 1.0.4

1) Fluxo de integração

  1. Registre uma cobrança em POST /registrar.
  2. Redirecione o cliente para /pagar/<unique_id> ou use /pixqrcode/<unique_id>.
  3. Acompanhe o resultado por polling em GET /status/<unique_id> e/ou receba IPN no seu backend.

Base URL produção: https://pay.pangeialabs.com

2) Endpoints principais

Método Endpoint Auth Uso
POST/registrarAPI keyCria cobrança PIX/BTC/OUTRA.
GET/pixqrcode/<unique_id>PúblicaRetorna payload e QRCode (PIX/cripto).
GET/status/<unique_id>PúblicaStatus da cobrança + campos cripto.
POST/authAPI key + secretValida credenciais de integração.
POSTIPN (callback para seu endpoint)IPN Secret no payloadPangeia PAY envia atualizações de status para sua ipn_url.

Documentação full: OpenAPI YAML.

3) Exemplo cURL - criar cobrança

O request não envia payment_method; a API usa os métodos ativos na conta (pix_enabled, bitcoin_enabled, outracoin_enabled).

curl -X POST "https://pay.pangeialabs.com/registrar" \
  -H "Content-Type: application/json" \
  -d '{
    "buyer_name": "Joao da Silva",
    "buyer_taxid": "12345678901",
    "order_amount": 149.90,
    "order_id": "PED-10001",
    "api_key": "SUA_API_KEY",
    "redirect_url": "https://seusite.com/retorno"
  }'

4) Exemplo JavaScript (Node/fetch)

const BASE_URL = "https://pay.pangeialabs.com";

async function criarCobranca() {
  const res = await fetch(`${BASE_URL}/registrar`, {
    method: "POST",
    headers: { "Content-Type": "application/json" },
    body: JSON.stringify({
      buyer_name: "Joao da Silva",
      buyer_taxid: "12345678901",
      order_amount: 149.90,
      order_id: "PED-10001",
      api_key: process.env.PANGEIA_API_KEY
    })
  });

  if (!res.ok) {
    const err = await res.json();
    throw new Error(err.error || `HTTP ${res.status}`);
  }

  const charge = await res.json();
  console.log("unique_id:", charge.unique_id);
  console.log("checkout_url:", charge.url);
  return charge;
}

async function esperarPagamento(uniqueId, timeoutMs = 10 * 60 * 1000) {
  const startedAt = Date.now();
  while ((Date.now() - startedAt) < timeoutMs) {
    const res = await fetch(`${BASE_URL}/status/${uniqueId}`);
    const st = await res.json();
    if (st.status === "paid") return st;
    if (st.status === "canceled" || st.status === "expired") throw new Error(`Status final: ${st.status}`);
    await new Promise(r => setTimeout(r, 3000));
  }
  throw new Error("Timeout aguardando pagamento");
}

5) Exemplo Python (requests)

import time
import requests

BASE_URL = "https://pay.pangeialabs.com"

def criar_cobranca(api_key: str):
    payload = {
        "buyer_name": "Joao da Silva",
        "buyer_taxid": "12345678901",
        "order_amount": 149.90,
        "order_id": "PED-10001",
        "api_key": api_key,
    }
    r = requests.post(f"{BASE_URL}/registrar", json=payload, timeout=20)
    r.raise_for_status()
    return r.json()

def esperar_status_pago(unique_id: str, max_wait_sec: int = 600):
    t0 = time.time()
    while time.time() - t0 < max_wait_sec:
        r = requests.get(f"{BASE_URL}/status/{unique_id}", timeout=15)
        r.raise_for_status()
        data = r.json()
        if data.get("status") == "paid":
            return data
        if data.get("status") in ("canceled", "expired"):
            raise RuntimeError(f"Status final: {data.get('status')}")
        time.sleep(3)
    raise TimeoutError("Tempo limite aguardando pagamento")

# uso:
# charge = criar_cobranca("SUA_API_KEY")
# print(charge["url"])
# pago = esperar_status_pago(charge["unique_id"])

6) Exemplo cURL - validar credenciais

curl -X POST "https://pay.pangeialabs.com/auth" \
  -H "Content-Type: application/json" \
  -d '{
    "api_key": "SUA_API_KEY",
    "api_secret": "SEU_API_SECRET"
  }'

7) Payload de IPN (callback)

{
  "order_id": "PIXIA-1772489488-3468fc7e",
  "order_status": "paid",
  "order_amount": 10.0,
  "unique_amount": 10.0,
  "ipn_secret": "SEU_IPN_SECRET_DA_CONTA",
  "paid_on": "2026-03-02T22:23:51.160000",
  "paid_with": "pix",
  "redirect_url": "https://seusite.com/retorno",
  "description": "Pedido XYZ"
}

Valide a autenticidade comparando o ipn_secret recebido com o secret salvo na sua integração.

Status possíveis em order_status: pending, confirming, paid, canceled, processing, shipped, delivered.

Importante: seu endpoint deve aceitar qualquer transição de status a qualquer momento (sem máquina de estados restritiva), incluindo paid -> canceled e canceled -> paid.

Cenário Comportamento esperado na integração
Qualquer order_statusAceitar e processar normalmente.
Mudança invertida (ex.: paid -> canceled)Tratar como atualização válida de estado.
Reenvio/duplicidadeAplicar processamento idempotente no seu backend.