Skip to content

Gateway capabilities

Built-in capability matrix generated from gateway manifests in @paykernel/core. Cells are claims, not marketing.

Updated View as Markdown

This matrix is generated from code (built-in capability claims on gateway manifests). Do not invent cells. Upstream source: packages/core/docs/gateway-capabilities.md, regenerated with:

bun run docs:capabilities

Source of truth: packages/core/src/gateways/builtin-capabilities.ts via generateGatewayCapabilitiesMarkdown + BUILTIN_GATEWAY_MANIFESTS.

Generated from published sources (core 1.0.0). All gateway capabilities are from code.

Built-ins only: Stripe, Moyasar, PayPal, Paymob. Tap, MyFatoorah, and Hesabe are extra packages (Tap, MyFatoorah, Hesabe) and are not in this table — do not copy cells onto them.

Cells are when the adapter claims the capability on its GatewayManifest.capabilities / instance snapshot, otherwise . Claims are conservative: method presence alone does not imply true.

Providers

  • Stripe (stripe) 1.0.0 (built-in)
  • Moyasar (moyasar) 1.0.0 (built-in)
  • PayPal (paypal) 1.0.0 (built-in)
  • Paymob (paymob) 1.0.0 (built-in)

Capability matrix

Capability Stripe Moyasar PayPal Paymob
payments
immediateCapture
authorization
partialCapture
refunds
partialRefunds
voids
hostedCheckout
tokenization
customers
paymentMethods
marketplaceSplits
disputes
paymentLinks
providerRecurring

Keys match GATEWAY_CAPABILITY_KEYS in @paykernel/core.

Key notes (from the generated file)

  • partialCapture / partialRefunds: optional amount on capturePayment / refundPayment. Omitting amount is a full capture/refund and does not require the partial flag.
  • PayPal partialCapture: claimed true because authorization captures accept amount when paypalCaptureType: "authorization". PayPal order captures reject amount; callers must use paypalCaptureType: "authorization" (authorize-then-capture).
  • hostedCheckout: first-class createCheckoutSession (Stripe Checkout Session product), not every provider redirect URL.
  • marketplaceSplits: create-time split / transfer surface (e.g. Moyasar splits).
  • providerRecurring: extension-only; default false. Checkout subscription mode alone does not force true.
  • customers / paymentMethods: Stripe implements first-class Customer create/get and PaymentMethod attach/list/detach. Other built-ins stay false until they expose the same surface.
  • disputes: Stripe implements get/list/submit evidence. Other built-ins stay false (PayPal Customer Dispute webhooks still dual-write).
  • paymentLinks: Stripe Payment Links product only. Not Checkout Sessions and not PayPal Pay Links.
  • tokenization: claimed only when the adapter exposes first-class setup / save-payment-method APIs. Stripe tok_… on attach is paymentMethods, not this key (built-ins stay false).

Inspecting support at runtime

import { createPaymentClient, stripeGateway } from "@paykernel/core";

const client = createPaymentClient({
  gateways: { stripe: stripeGateway({ /* closed-over credentials */ }) },
  defaultGateway: "stripe",
});

const gateway = client.gateway("stripe");
if (gateway.supports("partialRefunds")) {
  // partial amount is a viable path on this adapter
} else {
  // do not pass a partial amount — OperationNotSupportedError
}

Missing optional method, or supports(capability) === false, throws OperationNotSupportedError (code: "OPERATION_NOT_SUPPORTED"). See errors.

Capability claims are not a fulfillment signal. Fulfill from outcomes (isPaidOutcome) and claimed webhooks (events), never from in this table.

Navigation

Type to search…

↑↓ navigate↵ selectEsc close