Ir para o conteúdo principal
API DE PAGAMENTO

Uma API de pagamento projetada para código de agente de IA.

Uma pequena API REST. Webhooks assinados. SDKs oficiais em cinco idiomas. Construído para que seu agente possa enviar e liquidar USDC e verificar pagamentos em algumas linhas de código.

Visão de transações: pagamentos USDC recebidos confirmados na Base

A API Blockchain0x é deliberadamente pequena. Não queremos que você leia a documentação por uma hora para fazer seu primeiro pagamento. Queremos que você copie um trecho, cole sua chave de API e execute.

OS ENDPOINTS CENTRAIS

Uma pequena superfície, construída para código de agente.

As rotas de pagamento estão abaixo. Webhooks, chaves de API e permissões de gasto somente leitura completam a superfície; o SDK envolve tudo isso.

POST/v1/paymentsEnvie um pagamento USDC de uma carteira de agente
GET/v1/transactions/{id}Busque o status e hash de uma transação
POST/v1/payment-requests/{id}/settleLiquidar uma fatura com prova on-chain
GET/v1/agents/{id}Busque uma carteira de agente
POST/v1/agentsCriar uma carteira de agente
OS EVENTOS DE WEBHOOK ENVIADOS

Todos assinados com HMAC-SHA256.

Assinatura em X-Blockchain0x-Signature cabeçalho. Janela de repetição de 5 minutos. Chaves de idempotência em cada POST.

payment.received

USDC chegou em uma das suas carteiras de agente

payment.sent

um pagamento de saída do seu agente foi liquidado na cadeia

wallet.deployed

a carteira inteligente de um agente foi implantada

webhook.test

uma entrega de teste que você acionou a partir do painel

ALGUNS TRECHOS

Envie USDC da carteira do seu agente.

PYTHON
from blockchain0x import Client

client = Client(api_key="sk_test_...")  # sk_test_ testnet, sk_live_ mainnet
tx = client.payments.create(body={
    "agentId": "agt_123",
    "to": "0xRecipient",
    "amountWei": "10000",  # USDC base units (6 decimals): 0.01 USDC
})
print(tx)  # may return 503 until the chain adapter is wired for your network
SDKs OFICIAIS

Clientes tipados para TypeScript e Python.

TIPOSCRIPT
npm install @blockchain0x/node

Funciona com Node 18+. Tipos nativos de TypeScript.

PYTHON
pip install blockchain0x

Python 3.9+. Clientes síncronos e assíncronos.

ESQUEMAS COMPLETOS DE ENDPOINTS

Os corpos de solicitação que o SDK envolve.

Esses são os inputs verificados para cada rota. As respostas são mostradas de forma resumida aqui; as formas tipadas completas estão no SDK e na referência da API. Os valores são unidades base de USDC (6 casas decimais).

POST/v1/payments

Envie um pagamento USDC (payments.create). amountWei são unidades base de USDC (6 casas decimais). Pode retornar 503 até que o adaptador de cadeia esteja conectado.

SOLICITAÇÃO
{
  "agentId": "agt_123",
  "to": "0xRecipient",
  "amountWei": "10000",
  "metadata": { "reason": "Research report" }
}
RESPOSTA
{
  "txHash": "0xff5...e12"
}
POST/v1/payment-requests/{id}/settle

Liquidar um pedido de pagamento (fatura) criado no painel, com prova on-chain (paymentRequests.settle). Não há rota de criação - apenas liquidar.

SOLICITAÇÃO
{
  "txHash": "0xff5...e12",
  "payerAddress": "0xBuyer...",
  "amountUsdcVerified": "0.10"
}
RESPOSTA
{
  "txHash": "0xff5...e12"
}
GET/v1/transactions/{id}

Busque uma única transação por id (transactions.get).

SOLICITAÇÃO
(no body)
RESPOSTA
{
  "id": "tx_01J9...",
  "txHash": "0xff5...e12"
}
GET/v1/agents/{id}

Busque uma carteira de agente (agents.get). Sua página pública está em wallet.blockchain0x.com/a/{slug}.

SOLICITAÇÃO
(no body)
RESPOSTA
{
  "id": "agt_01J9QKE...",
  "name": "research-bot",
  "public_url": "https://wallet.blockchain0x.com/a/research-bot"
}
GET/v1/agents/{id}/spend-permissions

Leia as permissões de gasto de um agente. APENAS LEITURA via a API - criação e alterações são apenas no painel.

SOLICITAÇÃO
(no body)
RESPOSTA
{
  "allowance_wei": "5000000",
  "per_tx_wei": "1000000",
  "period_seconds": 86400,
  "start_at": "2026-05-15T00:00:00Z",
  "revoked_at": null
}
VERIFICAÇÃO DE ASSINATURA DE WEBHOOK

Sempre verifique a assinatura antes de confiar no payload.

Qualquer um pode POST para sua URL de callback. A assinatura é o que prova que o evento realmente veio de nós.

Cada entrega carrega um X-Blockchain0x-Signature cabeçalho (t=<unix>,v1=<hex>) - um HMAC-SHA256 sobre a string `${t}.${rawBody}` com seu segredo de webhook, dentro de uma janela de replay de 5 minutos. No Node, webhooks.verify de @blockchain0x/node faz isso e retorna uma união discriminada na qual você ramifica. Em outras linguagens, calcule o mesmo HMAC e compare em tempo constante. Leia o corpo RAW, não uma cópia analisada - re-serializar quebra a assinatura.

TIPOSCRIPT (NODE + EXPRESS)
import express from "express";
import { webhooks } from "@blockchain0x/node";

const app = express();
// Capture the RAW body. The HMAC is over the exact bytes on the wire.
app.use(express.raw({ type: "application/json" }));

app.post("/webhooks/payment", (req, res) => {
  const result = webhooks.verify({
    headers: req.headers,
    rawBody: req.body, // Buffer, raw bytes
    secret: process.env.BLOCKCHAIN0X_WEBHOOK_SECRET!,
  });
  if (!result.ok) return res.status(400).json({ code: result.code });
  // result.eventType is "payment.received" | "payment.sent" | ...
  handleEvent(result);
  res.status(200).send("ok");
});
PYTHON (FLASK)
import hmac, hashlib, os, time
from flask import Flask, request, abort

app = Flask(__name__)
SECRET = os.environ["BLOCKCHAIN0X_WEBHOOK_SECRET"].encode()

@app.post("/webhooks/payment")
def receive():
    raw = request.get_data()  # RAW bytes - do not parse first
    sig = request.headers.get("X-Blockchain0x-Signature", "")
    ts = request.headers.get("X-Blockchain0x-Timestamp", "")
    # Header is "t=<unix>,v1=<hex>"; some proxies send bare hex + the ts header.
    parts = dict(p.split("=", 1) for p in sig.split(",") if "=" in p)
    t, v1 = parts.get("t", ts), parts.get("v1", sig)
    want = hmac.new(SECRET, t.encode() + b"." + raw, hashlib.sha256).hexdigest()
    if not hmac.compare_digest(want, v1) or abs(time.time() - int(t)) > 300:
        abort(401)
    handle_event(request.headers.get("X-Blockchain0x-Event-Type"), request.get_json())
    return "ok", 200

O webhook secret é retornado uma única vez quando você cria ou rotaciona o webhook (webhooks.rotateSecret), e é de BLOCKCHAIN0X_WEBHOOK_SECRET que seu handler o lê. Rotacionar invalida o segredo antigo, então coordene o rollout: defina o novo segredo no env do seu servidor, faça o deploy e depois rotacione. Os eventos disponibilizados são payment.received, payment.sent, wallet.deployed e webhook.test - faça branch pelo tipo de evento e ignore o restante.

IDEMPOTÊNCIA

Tente novamente com segurança. A API não pagará duas vezes.

Tentativas de código do agente. Redes perdem conexões. LLMs decidem chamar a ferramenta duas vezes. Para tornar isso seguro, envie um Idempotency-Key cabeçalho no POST. payments.create no SDK auto-minta um estável para você, então uma chamada reexecutada se colapsa em uma única submissão on-chain em vez de pagar duas vezes. Substitua-o pela sua própria chave quando quiser deduplicar a mesma operação lógica entre processos.

BASH
curl -X POST https://api.blockchain0x.com/v1/payments \
  -H "Authorization: Bearer $BLOCKCHAIN0X_API_KEY" \
  -H "Idempotency-Key: 8e2c3a40-pay-vendor-once" \
  -H "Content-Type: application/json" \
  -d '{ "agentId": "agt_123", "to": "0xRecipient", "amountWei": "10000" }'
  • Primeira chamada: submete o pagamento, retorna a transação.
  • Tente novamente com a mesma chave: colapsa para uma única submissão on-chain em vez de pagar duas vezes.
  • O SDK cuida disso: payments.create cria automaticamente uma Idempotency-Key estável, então uma chamada reprocessada é segura desde o início.
  • Substitua-o: passe sua própria chave quando quiser deduplicar a mesma operação lógica entre processos.

O padrão recomendado é gerar um UUID por operação lógica no seu código de agente (por exemplo, um UUID por "pagar o fornecedor X pelo pedido Y") e reutilizá-lo em tentativas até que a operação seja bem-sucedida. Os SDKs oficiais geram automaticamente um para payments.create se você não especificá-lo.

LIMITES DE TAXA

Leia seu limite da resposta, não de uma tabela.

Os limites escalam com seu plano. Em vez de codificar números que mudam, cada resposta informa onde você está e os SDKs lidam com o retrocesso para você.

Cabeçalhos em cada resposta de sucesso

  • X-RateLimit-Limit: a taxa fixa do seu plano
  • X-RateLimit-Remaining: quantas chamadas restam nesta janela
  • X-RateLimit-Reset: segundos unix quando a janela é redefinida

Quando você atinge o limite (HTTP 429)

  • A resposta inclui Retry-After em segundos
  • Os SDKs oficiais tentam novamente em 429 e 5xx com backoff exponencial, respeitando Retry-After
  • A maioria do código nunca lida com 429 manualmente porque o SDK já faz isso.
COMPATIBILIDADE X402

Fala x402 fluentemente. Funciona sem isso também.

x402 é o protocolo aberto para pagamentos nativos de HTTP. A premissa: qualquer API que retorna 402 Payment Required pode anunciar requisitos de pagamento na resposta, e qualquer cliente que entende a especificação pode pagar e tentar novamente - sem cadastro, sem chave de API, sem negociação fora de banda. Blockchain0x fornece pacotes x402 reais: um cliente do lado do pagamento e adaptadores de servidor do lado do recebimento. O único esquema hoje é exact-usdc, na Base.

O 402 QUE UM SERVIDOR RETORNA QUANDO UM CHAMADOR NÃO PAGOU
HTTP/1.1 402 Payment Required
Content-Type: application/json

{
  "version": 1,
  "resource": "https://api.example.com/paid-endpoint",
  "accepts": [
    { "scheme": "exact-usdc", "network": "eip155:8453" }
  ]
}

O que o chamador do agente faz

  1. Lê o corpo do 402: versão 1, o recurso e um accepts[] não vazio de requisitos de pagamento (scheme exact-usdc, network eip155:8453 para Base).
  2. Cria um pagamento e reenvia a requisição com um cabeçalho X-Payment: exact-usdc:<base64(json)>.
  3. No lado de pagamento, createX402Client({ sdk }) de @blockchain0x/x402 faz isso por você - ele responde a 402s automaticamente.
  4. Seu servidor verifica o cabeçalho X-Payment e atende à solicitação original.

Ambos os lados, pacotes reais

Do lado do pagamento, createX402Client({ sdk }) de @blockchain0x/x402 envolve fetch e responde 402s automaticamente. No lado de recebimento, createX402Plugin (Fastify) e createX402Middleware (Express) crie seus próprios endpoints. Ou pule o x402 e use a API REST diretamente - os dois se compõem, então você pode adicionar o x402 quando estiver pronto.

PERGUNTAS FREQUENTES

Cinco perguntas de API que os desenvolvedores fazem primeiro.

Posso usar a API sem o SDK?

Sim. Os SDKs são finos wrappers em torno de JSON padrão sobre HTTPS com autenticação de token bearer. Qualquer coisa que possa falar HTTP e HMAC-SHA256 pode usar a API diretamente. Os SDKs existem para digitação ergonômica, tentativas e geração de chave de idempotência; eles são convenientes, não obrigatórios. Enviamos clientes para Node, Python, Ruby, Go e JVM; em qualquer outra linguagem, chame a API bruta.

O que acontece se meu endpoint de webhook estiver fora do ar quando um evento ocorrer?

As entregas tentam novamente com backoff e cada tentativa é registrada no painel com seu código de resposta HTTP. Se você perder um evento, pode reconciliar pela API - busque a transação pelo id com GET /v1/transactions/{id} - em vez de confiar apenas no webhook. Verifique cada entrega com webhooks.verify (ou o HMAC documentado) antes de confiar, e responda 2xx rapidamente para que um manipulador lento não pareça uma falha.

Como evito pagamentos duplicados se meu agente tentar novamente em erros de rede?

Envie um cabeçalho Idempotency-Key no POST. payments.create no SDK gera automaticamente um estável para você, então uma chamada reprocessada se colapsa em uma única submissão on-chain em vez de pagar duas vezes. Substitua-o pela sua própria chave quando quiser deduplicar a mesma operação lógica entre processos. A chave é a rede de segurança para exatamente o caso em que seu agente ou a rede tenta novamente durante o voo.

Há um limite de taxa?

Sim, e isso escala com seu plano. Em vez de codificar números que mudam, leia-os da resposta: cada chamada retorna X-RateLimit-Limit, X-RateLimit-Remaining e X-RateLimit-Reset, e um 429 inclui Retry-After em segundos. Os SDKs oficiais já tentam novamente em 429 e 5xx com retrocesso exponencial e respeitam Retry-After, então a maioria do código nunca precisa lidar com isso manualmente.

Isso é compatível com x402?

Sim. Os pacotes x402 são reais: createX402Client({ sdk }) de @blockchain0x/x402 responde a desafios 402 do lado do pagamento, e createX402Plugin (Fastify) / createX402Middleware (Express) filtram seus próprios endpoints do lado do recebimento. O único esquema hoje é exact-usdc, e o formato de wire é um X-Payment: exact-usdc:<base64(json)> cabeçalho de solicitação contra um 402 cujo corpo anuncia a versão 1 e uma lista de accepts[]. Você também pode ignorar x402 e usar a API REST diretamente.

Envie seu primeiro pagamento.

Gratuito para começar. Algumas linhas da chave de API até sua primeira transferência USDC no Base.