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 -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"
}'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);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)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.
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.