---
title: "Gateway capabilities"
description: "Built-in capability matrix generated from gateway manifests in @paykernel/core. Cells are claims, not marketing."
---

> Documentation Index
> Fetch the complete documentation index at: https://paykernel-docs.abshahin.workers.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# Gateway capabilities

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:

```bash
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](/gateways/tap), [MyFatoorah](/gateways/myfatoorah), [Hesabe](/gateways/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

```ts
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](/reference/errors).

Capability claims are **not** a fulfillment signal. Fulfill from [outcomes](/guides/outcomes) (`isPaidOutcome`) and claimed webhooks ([events](/reference/events)), never from `✓` in this table.

Source: https://paykernel-docs.abshahin.workers.dev/reference/capabilities/index.mdx
