Capability requests API

Open, move, and track a capability request over the API — the endpoints, the product codes, and what a parent platform can do today.

Who this section is for

Developers who open capability requests over the API instead of the merchant dashboard —
activating a payment method (GCash, Maya, GrabPay, ShopeePay, cards), requesting account
activation or a standard wallet, filing a tax document, or changing the business profile.

A capability request is an application to turn something on for an account. PayMongo reviews
it, and the request moves through a fixed set of statuses. Every status change is also pushed as
a webhook event — those payloads live in
Capability request webhooks.

Before you begin

🚧

Prerequisites

  1. Authenticate with the account's secret key using HTTP Basic auth
    (Authorization: Basic base64(sk_xxx:)).
  2. Register a webhook endpoint if you want to be told when review finishes — see
    Setup & Management.
  3. Use the same mode (sk_test_… / sk_live_…) as the webhook you registered. The key used on
    POST /v1/requests fixes the livemode of every event that request goes on to emit.

Base URL: https://api.paymongo.com.

Endpoints

CallBodyNew statusEvent emitted
POST /v1/requestsrequireddraft or submittednone — see Creating a request
POST /v1/requests/{id}/submitnonesubmittedcapability_request.submitted
POST /v1/requests/{id}/reviewnoneunder_reviewcapability_request.under_review
POST /v1/requests/{id}/review/finishnoneprocessingcapability_request.processing
POST /v1/requests/{id}/resubmitnoneunder_reviewcapability_request.under_review
POST /v1/requests/{id}/cancelnonecancelledcapability_request.cancelled
PATCH /v1/requests/{id}partialunchanged, or under_reviewcapability_request.under_review only when the patch moves the status
GET /v1/requestsnone
GET /v1/requests/{id}none
GET /v1/requests/eligibility/{product_code}none

pending_clarification, processing, completed and declined are set by PayMongo during
review. There is no merchant-facing API call for them — you observe them through the webhook (or
by polling GET /v1/requests/{id}).

Status lifecycle

flowchart LR
  A[draft] -->|submit| B[submitted]
  B -->|review| C[under_review]
  C -->|needs info| D[pending_clarification]
  D -->|resubmit| C
  C -->|approved| E[processing]
  E --> F[completed]
  C -->|rejected| G[declined]

Entry points. Most requests start in draft and move on submit, but payment method,
account activation and tax document requests are created directly in submitted.

Terminal statuses. completed, declined and cancelled. A declined request can only be
reopened by PayMongo, which re-emits capability_request.submitted on the same request ID.

Cancelling. Allowed from draft, submitted, under_review and pending_clarification
these paths are left off the diagram to keep it readable. Cancel is rejected from processing,
because the capability is already being provisioned, and from all three terminal statuses.

Creating a request

curl -X POST https://api.paymongo.com/v1/requests \
  -u sk_live_xxxxxxxxxxxx: \
  -H 'Content-Type: application/json' \
  -d '{
    "request_type": "product_request",
    "product_code": "prd_svc_paymongo_ewallet_maya",
    "requester_id": "usr_xxxxxxxxxxxx",
    "kyb_data": {}
  }'
FieldRequiredDescription
request_typeyesonboarding, product_request, config_update, or account_update.
product_codeyesThe capability being requested. See Product codes.
requester_idyesThe user opening the request. Prefixed usr_.
kyb_datanoApplication data. Send {} for payment method activation — the account is the source of truth.
⚠️

Creation does not emit an event

A create is not a status change, so no capability_request.* event is published for it. The
response body already tells you the resulting status — use that, not a webhook.

Payment method, account activation and tax document requests are created directly in
submitted; they never pass through draft, so capability_request.submitted does not fire
for them either. The first event you will see is capability_request.under_review.

Two creates are decided immediately and the outcome event does fire:
a prd_svc_paymongo_account_update that only changes business_size and/or business_age is
auto-approved and emits capability_request.completed; a request whose registered business
website is on PayMongo's prohibited list is auto-declined and emits
capability_request.declined.

Only one open request per product code is allowed. A second create while one is still in
draft, submitted, under_review or pending_clarification is rejected. For
account_update the check is per field: a second request is rejected only if it touches a field
or document already being changed by an open request.

Check eligibility first

For payment methods, check first so you fail fast:

curl https://api.paymongo.com/v1/requests/eligibility/prd_svc_paymongo_ewallet_maya \
  -u sk_live_xxxxxxxxxxxx:
{ "eligible": false, "missing": ["business_type", "files_valid_id"] }

missing lists the business type, documents and fields the account still has to supply. Fix
those on the account first — the same set is enforced when creating the request.

Moving a request

Transitions take no request body:

curl -X POST https://api.paymongo.com/v1/requests/req_xxxxxxxxxxxx/review \
  -u sk_live_xxxxxxxxxxxx:

Use resubmit after a capability_request.pending_clarification event, once you have supplied
what data.merchant_note asked for. To correct kyb_data first, PATCH the request — the patch
shallow-merges into the stored kyb_data, replacing top-level keys you send and leaving the rest
alone — then call resubmit.

Product codes

Product codeCapability
prd_svc_paymongo_ewallet_gcashGCash payment method
prd_svc_paymongo_ewallet_mayaMaya payment method
prd_svc_paymongo_ewallet_grabpayGrabPay payment method
prd_svc_paymongo_ewallet_shopeepayShopeePay payment method
prd_svc_paymongo_card_visa_mastercardVisa / Mastercard card acceptance
prd_svc_paymongo_account_activationAccount activation
prd_svc_paymongo_std_walletStandard wallet
prd_svc_paymongo_tax_documentTax document filing
prd_svc_paymongo_account_updateBusiness profile update

For parent platforms

A capability request is always scoped to the account whose secret key made the call. There is
no Account-Id header on this API, and the account_id field on POST /v1/requests is ignored
for merchant keys — merchant authentication is locked to its own account. So a parent uses these
endpoints for its own capabilities, not a child's.

What a parent can do today

GoalHow
Activate a payment method on the parent accountPOST /v1/requests with the parent's secret key, as above.
Update the parent's business profilePOST /v1/requests with product_code: prd_svc_paymongo_account_update.
Give a child its default capabilitiesActivate the child — see Quick start. Defaults are provisioned at activation.
Apply the same defaults to every new childAuto-configuration.
Get an extra capability onto a childThe child's authorized representative requests it from the Dashboard, if dashboard access is enabled. Otherwise contact [email protected].
Transact on an activated childAccount-Id header — see Linked transactions.
🚀

Coming soon — parent-initiated capability requests

Requesting, viewing and reviewing capabilities per child over this API is on the roadmap.
Until it ships, a parent cannot open a capability request against a child account. See
Account capabilities for the current state.

Recommended parent flow

  1. Check eligibilityGET /v1/requests/eligibility/{product_code} before you show the
    capability as available in your own UI.
  2. Create the requestPOST /v1/requests. Store the returned req_ ID against your own
    record, and read the returned status: payment method and activation requests come back
    already submitted.
  3. Listen, do not poll — subscribe to capability_request.* and key your handler on
    data.attributes.data.id. See
    Capability request webhooks.
  4. Handle pending_clarification — read merchant_note.note, merchant_note.requested_fields
    and merchant_note.requested_files, collect what is asked for, PATCH the request, then
    POST .../resubmit.
  5. Settle on completed or declined — both are terminal. A declined request can only be
    reopened by PayMongo, which re-emits capability_request.submitted.

Related pages


Did this page help you?