Capability requests API
Open, correct, and track a capability request over the API — the endpoints, what to send per product, how to attach documents, and what a parent platform can do for its fully managed children.
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), 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
- Authenticate with the account's secret key using HTTP Basic auth
(Authorization: Basic base64(sk_xxx:)). A parent acting on a child uses its own secret key
plus theAccount-IDheader — see Requests on linked accounts.- Activate the account. Payment method, tax document and account update requests are rejected
with400until the account has completed activation.- Register a webhook endpoint if you want to be told when review finishes — see
Setup & Management.- Use the same mode (
sk_test_…/sk_live_…) as the webhook you registered. The key used on
POST /v1/requestsfixes thelivemodeof every event that request goes on to emit.
Base URL: https://api.paymongo.com.
Endpoints
| Call | Body | New status | Event emitted |
|---|---|---|---|
POST /v1/requests | required | submitted (see below) | none — see Creating a request |
PATCH /v1/requests/{id} | partial | unchanged | none |
POST /v1/requests/{id}/resubmit | none | under_review, or submitted | capability_request.under_review / .submitted |
POST /v1/requests/{id}/cancel | none | cancelled | capability_request.cancelled |
GET /v1/requests | — | — | none |
GET /v1/requests/{id} | — | — | none |
GET /v1/requests/eligibility/{product_code} | — | — | none |
under_review, 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}).
Full request and response schemas, with a kyb_data example per product, are in the API
reference: Create capability request.
Status lifecycle
flowchart LR A([POST /v1/requests]) --> B[submitted] B -->|PayMongo picks it up| C[under_review] C -->|needs info| D[pending_clarification] D -->|PATCH, then resubmit| C C -->|approved| E[processing] E --> F[completed] C -->|rejected| G[declined]
Entry point. Every request you create starts in submitted. Nothing is needed from you to get
it reviewed.
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 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": "onboarding",
"product_code": "prd_svc_paymongo_ewallet_maya",
"requester_id": "org_xxxxxxxxxxxx",
"kyb_data": {}
}'| Field | Required | Description |
|---|---|---|
request_type | yes | account_update for prd_svc_paymongo_account_update, onboarding for every other product. |
product_code | yes | The capability being requested. See Product codes. |
requester_id | yes | Who is opening the request — your organization ID (org_…). A parent opening a request for a child sends the parent's organization ID. Recorded for PayMongo's review; not returned. |
kyb_data | no | Application data. Its shape depends on product_code — see kyb_data by product. |
Which account. The request is created for the account whose secret key made the call, or —
for a parent — for the child named in the Account-ID header. See
Requests on linked accounts.
One open request per product code. A second create while one is still submitted,
under_review or pending_clarification is rejected as a duplicate. account_update is checked
per field: a second request is rejected only if it touches a field or document already being
changed by an open request.
Status it is created in. submitted, with two exceptions decided on the spot:
- a
prd_svc_paymongo_account_updatethat only changesbusiness_sizeand/orbusiness_ageis
auto-approved and createdcompleted; - a request whose registered business website is on PayMongo's prohibited list is created and
immediatelydeclined.
Creation does not emit an eventA create is not a status change, so no
capability_request.*event is published for it —
includingcapability_request.submitted. The response body already tells you the resulting
status; use that, not a webhook. The first event you will normally see is
capability_request.under_review.The two on-the-spot outcomes above are the exception: the auto-approved account update emits
capability_request.completed, and the auto-declined request emits
capability_request.declined.
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:{
"data": {
"product_code": "prd_svc_paymongo_ewallet_maya",
"eligible": false,
"missing": [
{ "type": "field", "key": "business_website", "label": "Business website is required" },
{ "type": "document", "key": "dti_registration", "label": "DTI registration is required" }
]
}
}missing lists what the account still has to supply — the same set enforced when creating the
request. Each entry's type is one of:
type | What to do |
|---|---|
field | Send the field in kyb_data, under key. |
document | Attach the document as a files_<key> part — dti_registration above is sent as files_dti_registration. See Attaching documents. |
business_type | The account's business type is missing, or not one this payment method accepts. Set it with an account update first. |
account_activation | The account has not completed activation yet. Nothing else can be requested until it has. |
kyb_data by product
kyb_data is a JSON object. The keys below are the ones the API understands; what is actually
required is checked per product when the request is created, and an unmet requirement returns
400 naming the missing fields.
Documents appear in kyb_data as files_<purpose> keys holding the ID of an uploaded file, or an
array of them. You do not upload files separately — send them with the request, as described in
Attaching documents, and the IDs are filled in for you.
E-wallets and card
prd_svc_paymongo_ewallet_gcash, prd_svc_paymongo_ewallet_grabpay,
prd_svc_paymongo_ewallet_maya, prd_svc_paymongo_ewallet_shopeepay and
prd_svc_paymongo_card_visa_mastercard.
The account is the source of truth, so kyb_data is normally {} or omitted — nothing already
on the account needs re-sending. Call eligibility first. If it reports
something missing, include it in this request: a missing field (for example business_website) in
kyb_data, a missing document as a files_<purpose> part. What you send fills the gap for the
eligibility check and is written to the account when the request is approved.
{
"request_type": "onboarding",
"product_code": "prd_svc_paymongo_ewallet_gcash",
"requester_id": "org_xxxxxxxxxxxx",
"kyb_data": {}
}Account update
prd_svc_paymongo_account_update changes the business profile. kyb_data is a partial
payload: only the fields being changed, never the whole profile. You do not need to send the old
values — PayMongo records what each changed field held before.
{
"request_type": "account_update",
"product_code": "prd_svc_paymongo_account_update",
"requester_id": "org_xxxxxxxxxxxx",
"kyb_data": {
"business_trade_name": "Acme Home",
"change_reason": "Rebranding"
}
}Rules, all checked when the request is created:
change_reasonis required, unless the payload only changesbusiness_sizeand/or
business_age— those are auto-approved.- A trade-name, legal-name or business-type change requires a passed liveness check.
- A trade-name change requires an enabled wallet, and carries the signed request letter as
files_signed_request_letter. - A legal-name change requires a registered business type. The type the request moves the
account to counts, sobusiness_typeandbusiness_legal_namecan be sent together. business_typecan be changed only while the account is stillindividual. It is refused once
the account holds a registered type. The request carries the documents the new type
requires — see Business documents by business type.tax_gross_remittances: "do_not_exceed_500k"requiresack_sd_requirement: truein the same
payload.
| Field | Values / format |
|---|---|
change_reason | Free text. |
business_trade_name | Free text. |
business_legal_name | Free text. |
business_type | sole_proprietor, partnership, corporation. |
is_one_person_corporation | true with business_type: corporation for a One Person Corporation. |
business_description | Free text. |
business_industry | Merchant Category Code — see Merchant Category Codes. |
business_size | less_than_10, between_10_and_50, between_51_and_250, greater_than_250. |
business_age | less_than_1_year, between_1_and_2_years, between_2_and_5_years, greater_than_5_years. |
business_estimated_monthly_volume | less_than_100K, between_100K_and_300K, between_300K_and_500K, between_500K_and_1M, between_1M_and_3M, greater_than_3M. |
business_website | URL. |
business_tin | For example 123-456-789-000. |
business_has_physical_stores | Boolean. |
business_address | Object: line1, line2, city, state, postal_code, country (ISO 3166-1 alpha-2). |
customer_service_number | Phone number, for example +639171234567. |
support_email | Email address. |
plugin | Boolean. |
tax_gross_remittances | do_not_exceed_500k, exceed_500k. |
ack_sd_requirement | Boolean. |
Tax document
prd_svc_paymongo_tax_document takes documents only: files_bir_2303, files_tax_exemption and
files_tax_sworn_declaration, attached as parts of a multipart/form-data body. kyb_data can be
{}.
Attaching documents
Send the request as multipart/form-data instead of JSON:
- one part named
payload, withContent-Type: application/json, carrying exactly the JSON body
you would otherwise send; - one part per document, named
files_<purpose>. Repeat a part name to attach several documents
of the same purpose.
curl -X POST https://api.paymongo.com/v1/requests \
-u sk_live_xxxxxxxxxxxx: \
-F 'payload={"request_type":"onboarding","product_code":"prd_svc_paymongo_tax_document","requester_id":"org_xxxxxxxxxxxx","kyb_data":{}};type=application/json' \
-F '[email protected]'The uploaded files are added to kyb_data under their part name before anything is validated, so
the request is checked exactly as if the documents had been there all along. A request with no
documents can be sent as plain application/json.
The same format works on PATCH /v1/requests/{id}. There, uploads are added to whatever that
key already holds — attaching a second document does not drop the first.
Uploaded documents are held with the request and only added to the account when PayMongo approves
it. Cancelling the request deletes them, and so does a create or update that fails validation.
| Limit | Value |
|---|---|
| Per file | 10 MB |
| Per request | 20 files, 50 MB in total |
| File types | pdf, jpg, jpeg, png, doc, docx, heic, heif |
Anything outside these limits is rejected with 400 before anything is stored.
Business documents by business type
What a business must provide depends on its type. This applies whenever documents are asked for:
a business_type change on an account update carries the documents for the new type, and a
payment method request fills in whichever ones eligibility reports missing.
| Business type | Required | Optional |
|---|---|---|
individual | none | files_bir_certificate_of_registration, files_sworn_declaration |
sole_proprietor | files_bir_certificate_of_registration, files_dti_registration (DTI Business Name Registration) | files_sworn_declaration |
partnership | files_bir_certificate_of_registration, files_sec_registration (SEC Certificate of Partnership), files_articles_of_partnerships, files_partnership_resolution (notarized) | files_sworn_declaration |
corporation | files_bir_certificate_of_registration, files_sec_registration (SEC Certificate of Incorporation), files_articles_of_incorporation, files_by_laws (notarized), files_latest_gis (latest General Information Sheet), files_sec_certificate (notarized Secretary's Certificate) | files_sworn_declaration |
One Person Corporation (business_type: corporation + is_one_person_corporation: true) | files_bir_certificate_of_registration, files_sec_registration (SEC Certificate of Incorporation), files_articles_of_incorporation, files_appointment_of_officers (OPC Form of Appointment of Officers), files_sec_certificate (notarized Secretary's Certificate) | files_sworn_declaration |
For a payment method, eligibility is the authoritative list of what the
account is still missing. A reviewer may ask for more through pending_clarification.
Document purposes
Any files_<purpose> name is accepted, and new purposes are added over time without a new API
version. files_draft is reserved and rejected. The purposes in use today:
Business documents
| Part name | Document |
|---|---|
files_bir_certificate_of_registration | BIR Certificate of Registration |
files_sworn_declaration | Notarized Sworn Declaration |
files_sec_registration | SEC Certificate of Incorporation / Partnership |
files_by_laws | Notarized By-Laws |
files_articles_of_incorporation | Articles of Incorporation |
files_latest_gis | Latest General Information Sheet (GIS) |
files_sec_certificate | Notarized Secretary's Certificate |
files_appointment_of_officers | Form of Appointment of Officers (OPC) |
files_articles_of_partnerships | Articles of Partnership |
files_partnership_resolution | Notarized Partnership Resolution |
files_dti_registration | DTI Business Name Registration certificate |
Enhanced due diligence
| Part name | Document |
|---|---|
files_amlc_questionnaire | AMLC Questionnaire |
files_amlc_certificate_of_registration | AMLC Certificate of Registration |
files_mtpp | MTPP |
files_bsp_certificate_of_registration | BSP Certificate of Registration |
files_pagcor_license | PAGCOR License |
files_ic_license | IC License (Insurance Commission) |
files_gcash_pcnc | (GCash) PCNC |
files_gcash_kyc_form | (GCash) KYC Form |
files_gcash_due_diligence_form | (GCash) Due Diligence Form |
files_paymongo_edd_form | PayMongo EDD Form |
files_rco_endorsement | RCO Endorsement |
files_enhance_due_diligence | Enhanced Due Diligence |
Tax — tax document requests only
| Part name | Document |
|---|---|
files_bir_2303 | BIR Form 2303 (Certificate of Registration) |
files_tax_exemption | Tax exemption certificate |
files_tax_sworn_declaration | Tax sworn declaration |
Others
| Part name | Document |
|---|---|
files_signed_request_letter | Signed request letter (trade-name change) |
files_alien_cert_registration | Alien Certificate of Registration (ACR) |
files_fda_cert_registration | FDA Certificate of Registration |
files_kyc_transaction_proof | Transaction screenshots |
files_latest_mayor_permit | Latest Mayor's Permit |
files_partnership_agreements | Partnership / supplier agreements |
files_board_resolution | Board Resolution |
files_signed_dsa | Signed DSA |
files_special_power_of_atty | Special Power of Attorney (SPA) |
files_others | Others |
files_certificate_of_registration_from_dhsud_hoa | Certificate of Registration from DHSUD – HOA |
files_dot_accreditation_or_proof_of_membership | DOT Accreditation or Proof of Membership |
files_screenshots | Screenshots |
files_termsheet | Term sheet |
files_internal_approvals | Internal Approvals |
files_signed_moa | Signed MOA |
files_loan_deposits | Loan Deposits |
files_person_file_record | Person File Record |
Correcting a request
When PayMongo needs more, the request moves to pending_clarification and you receive a
capability_request.pending_clarification event. data.merchant_note says what is needed. Answering
takes two calls:
PATCH /v1/requests/{id}with the correctedkyb_dataand any requested documents. The patch
shallow-merges into the storedkyb_data— top-level keys you send replace or add, every other
key is left alone — and is validated the same way as a create. It never changes the status.POST /v1/requests/{id}/resubmit, with no body, to hand the request back for review. It
returns tounder_review, or tosubmittedif it has to wait to be picked up again.
curl -X PATCH https://api.paymongo.com/v1/requests/req_xxxxxxxxxxxx \
-u sk_live_xxxxxxxxxxxx: \
-H 'Content-Type: application/json' \
-d '{ "kyb_data": { "business_trade_name": "Acme Home" } }'
curl -X POST https://api.paymongo.com/v1/requests/req_xxxxxxxxxxxx/resubmit \
-u sk_live_xxxxxxxxxxxx:
PATCH alone leaves the request waitingA request in
pending_clarificationstays there, corrections stored, until you callresubmit.
Nobody reviews it in the meantime.
To withdraw a request, POST /v1/requests/{id}/cancel (no body). Uploaded documents PayMongo has
not approved yet are deleted with it.
Product codes
| Product code | Capability | request_type |
|---|---|---|
prd_svc_paymongo_ewallet_gcash | GCash payment method | onboarding |
prd_svc_paymongo_ewallet_maya | Maya payment method | onboarding |
prd_svc_paymongo_ewallet_grabpay | GrabPay payment method | onboarding |
prd_svc_paymongo_ewallet_shopeepay | ShopeePay payment method | onboarding |
prd_svc_paymongo_card_visa_mastercard | Visa / Mastercard card acceptance | onboarding |
prd_svc_paymongo_tax_document | Tax document filing | onboarding |
prd_svc_paymongo_account_update | Business profile update | account_update |
Account activation (prd_svc_paymongo_account_activation) and the standard wallet
(prd_svc_paymongo_std_wallet) also appear as capability requests on an account, but PayMongo
opens them as part of activating the account — you do not request them over this API.
For parent platforms
A parent uses these endpoints for its own capabilities and for its
fully managed children's. Without an Account-ID
header, a request is scoped to the parent's own account. With one, it is scoped to the child named
in the header.
What a parent can do
| Goal | How |
|---|---|
| Activate a payment method on the parent account | POST /v1/requests with the parent's secret key, as above. |
| Update the parent's business profile | POST /v1/requests with product_code: prd_svc_paymongo_account_update. |
| Give a child its default capabilities | Activate the child — see Quick start. Defaults are provisioned at activation. |
| Apply the same defaults to every new child | Auto-configuration. |
| Request an extra capability or a profile change on a fully managed child | POST /v1/requests with the parent's secret key and Account-ID: org_{child_id} — see Requests on linked accounts. |
| Transact on an activated child | Account-ID header — see Linked transactions. |
Requests on linked accounts
Fully managed children onlyA parent can open capability requests only on a child it fully manages — see
Fully managed accounts. On any other linked child,
the call returns403withaccountid_operation_not_granted; that child requests its own
capabilities.
To open, read, correct, or cancel a request on a child, authenticate with the parent's secret
key and name the child in the Account-ID header — the same pattern as
Linked transactions. Every endpoint in
Endpoints accepts it. Send the parent's organization ID as requester_id.
curl -X POST https://api.paymongo.com/v1/requests \
-u sk_live_parentxxxxxxxx: \
-H 'Account-ID: org_childxxxxxxxx' \
-H 'Content-Type: application/json' \
-d '{
"request_type": "account_update",
"product_code": "prd_svc_paymongo_account_update",
"requester_id": "org_parentxxxxxxxx",
"kyb_data": {
"business_trade_name": "Acme Home",
"change_reason": "Rebranding"
}
}'- The request belongs to the child. Its
account_idis the child's, and the rules on this
page — eligibility,kyb_data, documents, one open request per product code — are checked
against the child's account. - Events go to the child's webhook, not the parent's. Every
capability_request.*event for
the request is delivered to the webhook registered on the child. Register one on each child with
the sameAccount-IDheader — see
Linked transactions and
Capability request webhooks.
Recommended parent flow
- Check eligibility —
GET /v1/requests/eligibility/{product_code}before you show the
capability as available in your own UI. - Create the request —
POST /v1/requests. Store the returnedreq_ID against your own
record, and read the returnedstatus: it comes backsubmitted(or alreadycompleted/
declinedfor the on-the-spot outcomes). - Listen, do not poll — subscribe to
capability_request.*on the webhook of the account the
request belongs to (the child's, for a request on a child), and key your handler on
data.attributes.data.id. See
Capability request webhooks. - Handle
pending_clarification— readmerchant_note.note,merchant_note.requested_fields
andmerchant_note.requested_files, collect what is asked for,PATCHthe request, then
POST .../resubmit. See Correcting a request. - Settle on
completedordeclined— both are terminal. A declined request can only be
reopened by PayMongo, which re-emitscapability_request.submitted.
Related pages
- Create capability request — API reference, with a
kyb_dataexample per product. - Capability request webhooks — every event, payload sample, and resource field.
- Account capabilities — what a child gets at activation.
- Troubleshooting — stuck, parked, and declined requests.
- Account capabilities (catalog) — the canonical capability catalog and requirements.
- Quick start — create, verify, update, activate a child account.
- Linked transactions — the
Account-IDheader and child webhooks.
Updated 3 days ago
