docs

Referência da API

API REST v1 da Zhex — convenções, headers, autenticação, recursos, paginação, errors e rate limits.

A API da Zhex é organizada por recursos REST, retorna sempre JSON UTF-8, usa HTTP status codes previsíveis e segue versionação dupla:

  • Major na URL: /v1/... muda só em quebras radicais (raro).
  • Minor por data via header: Zhex-Version: 2026-04-25 — pinada por chave de API. Mudanças não-breaking saem em datas novas.

Base URL: https://prometheus.zhex.io

Autenticação

Use a chave secreta como Bearer token:

Authorization: Bearer zsk_live_xxx

Ou Basic Auth equivalente (compatibilidade com clientes HTTP antigos):

Authorization: Basic base64(zsk_live_xxx:)
TipoEndpoints permitidosObservação
zk_* (publishable)POST /v1/tokensApenas no front, com origin verificado
zsk_* (secret)TodosApenas no servidor
zrk_* (restricted)Conforme scopesUse sempre que o escopo for parcial

Veja Segurança → Chaves.

Headers

HeaderQuandoNotas
AuthorizationSempreBearer zsk_*
Idempotency-KeyPOSTs financeirosUUIDv4. Janela 24h.
Zhex-VersionRecomendado2026-04-25 (formato data ISO)
Zhex-Parent-OriginIframe js.zhex.ioAsserção do origin pai pinado pelo iframe (uso interno)
Content-TypePOSTapplication/json

Headers de resposta úteis:

HeaderSignificado
Request-IdID único da requisição (cite em suporte).
Zhex-Should-Retrytrue quando você pode retentar com mesma Idempotency-Key.
Idempotent-Replayedtrue quando a Zhex devolveu cache da chave (operação só executou 1×).
Ratelimit-RemainingQuantas req restam na janela atual.
Ratelimit-ResetUnix timestamp do reset.

Test mode vs Live mode

Cada par de chaves opera em espaço isolado:

  • *_test_*MockAcquirerAdapter. Cartões de teste documentados (4242 4242 4242 4242 = success, 4000 0000 0000 0002 = decline, 4000 0000 0000 3220 = 3DS).
  • *_live_* → adquirentes reais. Movem dinheiro.

Recursos criados em test mode são marcados com livemode: false e não aparecem em listagens live. Não é possível misturar — chamar /v1/payment_intents/:id com zsk_live_* num ID criado em test retorna 404.

Veja Test mode para a lista completa de cartões e o uso de /v1/test_helpers/... para forçar transições.

Recursos

Tokenização

RecursoEndpoints
TokenPOST /v1/tokens (aceita zk_* com Origin allowlistada, zsk_*, zrk_*) — single-use, expira em 15min

Pagamentos

RecursoEndpoints
PaymentIntentPOST /v1/payment_intents · GET /v1/payment_intents/:id · GET /v1/payment_intents · POST /v1/payment_intents/:id/confirm · POST /v1/payment_intents/:id/cancel
PaymentMethodPOST /v1/payment_methods (a partir de tok_*) · GET /v1/payment_methods?customer=cus_… (customer obrigatório) · GET /v1/payment_methods/:id · POST /v1/payment_methods/:id/detach
RefundPOST /v1/refunds · GET /v1/refunds/:id · GET /v1/refunds?payment_intent=pi_*

Test helpers (test mode only)

RecursoEndpoints
Simulação de PaymentIntentPOST /v1/test_helpers/payment_intents/:id/succeed · POST /v1/test_helpers/payment_intents/:id/fail · POST /v1/test_helpers/payment_intents/:id/expire

Live keys nesses endpoints retornam 403 com code: test_mode_only.

RecursoEndpoints
CustomerPOST /v1/customers · GET /v1/customers/:id · POST /v1/customers/:id · GET /v1/customers?email=…
ProductPOST /v1/products · GET /v1/products/:id · POST /v1/products/:id · GET /v1/products?status=ACTIVE
ProductPriceGET /v1/products/:productId/price · POST /v1/products/:productId/price
CustomerSubscriptionGET /v1/customer_subscriptions/:id · GET /v1/customer_subscriptions · POST /v1/customer_subscriptions/:id/cancel

A CustomerSubscription é a instância ativa de uma assinatura — criada como side-effect de uma PaymentIntent confirmada num produto recorrente. O template do plano (intervalo, ciclo, trial) vive no recurso interno Subscription e é gerenciado pelo dashboard.

Eventos e webhooks

RecursoEndpoints
EventGET /v1/events/:id · GET /v1/events?type=payment_intent.succeeded
WebhookEndpointPOST /v1/webhook_endpoints · GET · GET /:id · POST /:id (update) · DELETE /:id · POST /:id/rotate_secret · POST /:id/deliveries/:eventId/replay

Saldo

RecursoEndpoints
BalanceGET /v1/balance (singleton — sem :id, sem list)

Outras superfícies

Disputas (chargebacks), payouts e ledger granular de transações de saldo são gerenciados hoje pelo dashboard da Zhex, não pela API pública. Quando expusermos via API, vão entrar como recursos novos sob /v1/....

Paginação

Cursor-based, não offset. Use starting_after (ID do último item recebido), ending_before e limit (1–100, default 10).

curl "https://prometheus.zhex.io/v1/payment_intents?limit=20&starting_after=pi_3MtwBwLkdI" \
  -H "Authorization: Bearer $ZHEX_SECRET_KEY"

Resposta:

{
  "object": "list",
  "data": [...],
  "has_more": true,
  "url": "/v1/payment_intents"
}

Itere até has_more: false. Veja Auto-paginação para o padrão Node (SDK e helper).

Filtros nativos por recurso

Cada list endpoint aceita filtros adicionais além dos cursores:

RecursoFiltros
/v1/customersemail
/v1/payment_intentscustomer
/v1/refundspayment_intent
/v1/payment_methodscustomer (obrigatório), type
/v1/productsstatus
/v1/customer_subscriptionscustomer, status
/v1/eventstype
/v1/webhook_endpoints

Errors

{
  "error": {
    "type": "invalid_request_error",
    "code": "parameter_missing",
    "message": "Missing required param: amount.",
    "request_id": "req_5LJsX2"
  }
}

Tipos

typeHTTPSignificado
invalid_request_error400Payload mal formado, parâmetro faltando/inválido
authentication_error401Chave inválida, expirada ou ausente
permission_error403Chave válida mas sem escopo (restricted), ou test/live mismatch
not_found_error404Recurso não existe nesse modo (test/live)
idempotency_error422Mesma Idempotency-Key com body diferente
rate_limit_error429Capacidade excedida
card_error402Cartão recusado, fundos insuficientes, 3DS falhou
api_error5xxErro do nosso lado. Você pode retentar com mesma Idempotency-Key.

Códigos importantes

codeQuandoAção
card_declinedCartão recusado pelo emissorPedir outro cartão
insufficient_fundsSem saldoPermita trocar de método
expired_cardCartão vencidoPedir atualização
incorrect_cvcCVV erradoRe-prompt
processing_errorErro temporário do adquirenteRetry com mesma idempotency key
payment_intent_not_foundID não existe nesse modoConfirme livemode da chave
customer_not_foundCustomer não existe nesse modoIdem
token_unusableToken expirou, foi consumido ou é de outra partiçãoRe-tokenizar via zhex.js
unsupported_token_typeToken de wallet (Apple/Google Pay) onde só card é aceitoRoadmap
origin_not_allowedzk_* sem origem registrada na allowlistCadastrar via POST /merchant-origins
test_mode_only/v1/test_helpers/... chamado com chave liveUse zsk_test_*
idempotency_key_in_useMesma key, body diferenteUse uma nova chave

Rate limits

EndpointLimite
POST /v1/tokens (com zk_*)60 req/min por API key
Demais endpoints /v1/*500 req/min por API key

Quando atingido, retorna 429 rate_limit_error com Retry-After em segundos. O SDK @zhex/node respeita automaticamente.

Endpoints públicos (POST /v1/tokens com zk_*) também são protegidos por allowlist de origens — sem o domínio registrado, retorna 403 antes mesmo do rate limit ser avaliado.

Convenções

  • IDs são stable strings: pi_*, cus_*, prd_*, ppr_*, pm_*, tok_*, re_*, csub_*, evt_*, we_*, wd_*. Sempre tratáveis como opacas.
  • Timestamps são Unix em segundos (created, expires_at em recursos públicos), exceto no Token (expiresAt/createdAt em ISO 8601 — convenção camelCase do recurso).
  • Valores monetários em centavos (int). Nunca decimal.
  • Booleans são true/false literais, não 0/1.
  • Recursos públicos usam snake_case (exp_month, payment_method, last_payment_error). Único recurso em camelCase é o Token (convenção da camada de tokenização).

OpenAPI Spec

Spec completa em prometheus.zhex.io/v1/openapi.json e Swagger UI navegável em prometheus.zhex.io/v1/docs — importável em Postman, Insomnia, Bruno, ou para gerar client em qualquer linguagem.

Próximos passos

Esta página foi útil?

Atualizado em

Nesta página