Desenvolvedores

Uma API que você consegue ler de ponta a ponta.

OpenAPI com contrato primeiro, escritas idempotentes, webhooks assinados e processamento custodial via Bitcart. Tudo abaixo usa chaves de exemplo — as chaves live são criadas no painel após a aprovação e exibidas uma única vez.

Guia rápido

Crie sua primeira intenção de pagamento.

Cada exemplo cria a mesma intenção de pagamento e redireciona para o checkout hospedado. Eles funcionam depois que os pagamentos reais forem ativados para a sua organização.

curl
curl -X POST https://api.feitpay.com/v1/payment-intents \
  -H "Authorization: Bearer gp_live_YOUR_KEY" \
  -H "Idempotency-Key: order-123" \
  -H "Content-Type: application/json" \
  -d '{
    "store_id": "store_YOUR_STORE_ID",
    "amount": "59.90",
    "currency": "EUR",
    "allowed_methods": ["crypto"],
    "merchant_order_id": "order-123",
    "return_url": "https://merchant.example/thank-you"
  }'
TypeScript · @gryphem-pay/sdk
import { Gryphem } from '@gryphem-pay/sdk';

const gp = new Gryphem({ apiKey: process.env.GRYPHEM_API_KEY!, baseUrl: 'https://api.feitpay.com' }); // gp_live_…

const intent = await gp.paymentIntents.create(
  {
    store_id: 'store_YOUR_STORE_ID',
    amount: '59.90',
    currency: 'EUR',
    merchant_order_id: 'order-123',
  },
  { idempotencyKey: 'order-123' },
);

redirect(intent.checkout_url);
Go · gryphem-pay-go
client, err := gryphempay.New(os.Getenv("GRYPHEM_API_KEY"), gryphempay.WithBaseURL("https://api.feitpay.com"))
if err != nil {
    return err
}
intent, err := client.PaymentIntents.Create(ctx, &gryphempay.PaymentIntentCreateParams{
    StoreID:         "store_YOUR_STORE_ID",
    Amount:          "59.90",
    Currency:        "EUR",
    MerchantOrderID: "order-123",
    IdempotencyKey:  "order-123",
})
if err != nil {
    return err
}
http.Redirect(w, r, *intent.CheckoutURL, http.StatusSeeOther)
Python · gryphem-pay-python
from gryphem_pay import Gryphem

gp = Gryphem(api_key=os.environ["GRYPHEM_API_KEY"], base_url="https://api.feitpay.com")  # gp_live_…

intent = gp.payment_intents.create(
    store_id="store_YOUR_STORE_ID",
    amount="59.90",
    currency="EUR",
    merchant_order_id="order-123",
    idempotency_key="order-123",
)
return redirect(intent["checkout_url"])

A disponibilidade e as versões dos SDKs estão listadas na documentação dos SDKs. O caminho do módulo Go é apenas ilustrativo até que o SDK seja publicado.

Webhooks

Verifique, deduplique e só então aja.

As assinaturas são HMAC-SHA256 sobre o timestamp e o corpo bruto. Os IDs de evento são estáveis entre novas tentativas.

Express · @gryphem-pay/webhooks
import { verifyWebhook, WebhookVerificationError } from '@gryphem-pay/webhooks';

app.post('/webhooks/gryphem', express.raw({ type: 'application/json' }), async (req, res) => {
  try {
    const event = await verifyWebhook({
      payload: req.body, // raw Buffer — never re-serialised JSON
      header: req.get('Gryphem-Signature') ?? '',
      secrets: [process.env.GRYPHEM_WEBHOOK_SECRET!], // add the previous secret during rotation
    });
    if (await seen(event.event_id)) return res.sendStatus(200); // idempotent
    if (event.event_type === 'payment.confirmed') await markOrderPaid(event.object.id);
    res.sendStatus(200);
  } catch (err) {
    if (err instanceof WebhookVerificationError) return res.sendStatus(400);
    throw err;
  }
});

Convenções

Previsível por design.

Idempotência
Envie um Idempotency-Key em toda criação. Repetições retornam a resposta original; uma chave reutilizada com outro corpo é rejeitada.
Erros tipados
Os erros trazem type, code, message, param e request_id. Repita apenas rate_limit_error e api_error, com backoff.
Paginação por cursor
As listas aceitam limit e starting_after e retornam has_more e next_cursor — estáveis mesmo com escritas concorrentes.
Dinheiro como string
Os valores são strings decimais; valores em cripto também vêm em unidades-base inteiras. Nunca os converta em float.
IDs de requisição
Toda resposta tem um cabeçalho Request-Id. Informe-o nos pedidos de suporte; ele leva ao log da requisição no painel.
Versionamento
A API é versionada sob /v1. Os payloads de webhook trazem api_version para que os receptores migrem de forma deliberada.

Entrar em produção

Pronto antes do primeiro pagamento.

Crie sua conta e envie a verificação da empresa agora. Antes do seu primeiro pagamento real, garanta que sua integração trate todos os estados: underpaid, overpaid, expired e manual review chegam a uma pessoa, e você só entrega o pedido quando o pagamento permite.