Skip to main content

Capabilities

GET /v1/capabilities returns the effective capability matrix for the authenticated merchant: which payment-intent operations are supported, which settlement currencies are available, and the payment-intent rate limit. The matrix is processor-agnostic — it never identifies which underlying provider supplies a capability, so you branch on the capability, not on a processor name.

Read it once at integrator startup and cache it for the process lifetime. Branch on it before invoking optional operations (separate capture, partial refund, void-after-capture) so you fail early in your own code instead of round-tripping to a 501 from the API.

Authentication: any valid API key — both publishable (vp_pk_*) and secret (vp_sk_*) keys are accepted, since the matrix is read-only metadata. Available in SDK 0.5.0+.

Request

curl https://checkout.vonpay.com/v1/capabilities \
-H "Authorization: Bearer vp_sk_test_YOUR_KEY"
const caps = await client.capabilities.get();

Response

{
"supported_operations": {
"auth_capture_separation": true,
"partial_capture": true,
"partial_refund": true,
"unreferenced_refund": false,
"void_after_capture": "rerouted_to_refund",
"mit": true,
"network_tokens": true,
"three_d_secure_2": false,
"ach": false,
"payouts_api": false
},
"settlement_currencies": ["USD", "EUR", "GBP", "CAD", "AUD"],
"rate_limits": {
"payment_intents_per_minute": 100
}
}

In the Node SDK the keys are camelCase (caps.supportedOperations.partialCapture); on the wire they are snake_case as shown above.

supported_operations

FlagTypeMeaning
auth_capture_separationbooleanAuthorize and capture can be separate steps (capture_method: "manual" on the payment intent, then POST /v1/payment_intents/:id/capture).
partial_capturebooleanCapture less than the authorized amount.
partial_refundbooleanRefund less than the captured amount via POST /v1/refunds with an amount.
unreferenced_refundbooleanIssue a refund that does not reference an original charge.
void_after_capturestring enumsupported — voiding a captured intent works. not_supported — it does not. rerouted_to_refund — a void on a captured intent is transparently handled through the refund pathway. See branching below.
mitbooleanMerchant-initiated transactions (e.g. recurring, unscheduled).
network_tokensbooleanNetwork tokenization is available for the merchant's processor.
three_d_secure_2boolean3-D Secure 2 is available.
achbooleanACH bank-transfer payments.
payouts_apibooleanPayouts API.

settlement_currencies

Array of ISO 4217 currency codes the merchant can settle in.

rate_limits

FieldTypeMeaning
payment_intents_per_minuteintegerPer-minute ceiling for POST /v1/payment_intents.

Branching on the matrix

Check the matrix before an optional operation instead of catching a 501:

const caps = await client.capabilities.get();

if (caps.supportedOperations.voidAfterCapture === "rerouted_to_refund") {
// Voiding a captured intent goes through the refund pathway — call refunds.create.
await client.refunds.create({ paymentIntent: pi.id });
} else if (caps.supportedOperations.voidAfterCapture === "supported") {
await client.paymentIntents.void(pi.id);
}

An operation the active binder does not support returns 501 endpoint_not_implemented. An operation that is supported but invalid for the intent's current state returns 409 invalid_transition.

  • Payment Intents — the operations gated by this matrix
  • Refunds — partial-refund and void-after-capture behavior
  • Error Codesendpoint_not_implemented, invalid_transition