List capabilities
GET /api/v1/partner/customers/{customerId}/capabilities
Required scope:
customers:read(global tier). Capabilities are a sub-resource of the customer, so no separate scope is needed.
Reports, per capability, two independent facts:
enabled— the grant: whether your partner integration is permitted to use this capability on this customer. See How grants are set below.available— merchant-side truth, which can flip on its own (e.g. KYB expiring, a chargeback threshold landing) with nobody touching the partner’s configuration.
Reporting both lets you explain a disabled action in your own words (“payments
unavailable — verification pending”) instead of guessing from a 409.
Request
curl -X GET https://www.niftipay.com/api/v1/partner/customers/pc-1/capabilities \
-H "Authorization: Bearer <partner_api_key>"
No request body.
Response 200
{
"request_id": "req-1",
"api_version": "2026-08-01",
"data": {
"capabilities": [
{
"capability": "payments.crypto",
"enabled": false,
"available": true,
"reason": null
},
{
"capability": "payments.fiat_card",
"enabled": true,
"available": false,
"reason": "chargeback_threshold"
},
{
"capability": "payouts",
"enabled": false,
"available": true,
"reason": null
},
{
"capability": "payout_wallets",
"enabled": false,
"available": true,
"reason": null
},
{
"capability": "refunds",
"enabled": false,
"available": true,
"reason": null
},
{
"capability": "wallets",
"enabled": false,
"available": true,
"reason": null
},
{
"capability": "withdrawals",
"enabled": false,
"available": true,
"reason": null
}
]
}
}| Capability | Gates |
|---|---|
payments.crypto |
Crypto order creation (payments.crypto scope). |
payments.fiat_card |
Fiat card payments. |
payouts |
Payouts. |
payout_wallets |
Managing the customer’s fiat payout wallets. |
refunds |
Refunding a fiat order (refunds:write scope). A missing grant answers 404 there, not 403. |
wallets |
Wallet operations. |
withdrawals |
Withdrawals. |
All seven capabilities are always returned. When a
capability’s availability check itself fails, the entry degrades to
{ "available": true, "reason": "availability_unknown" } — distinguishable from a
healthy resolve — so you can render the uncertainty rather than assert a state you
have no basis for. The internal error is logged, never returned.
How grants are set
Two arrangements exist, and which one applies to you is a property of your partner integration rather than of any individual customer.
Auto-granted. A customer you create starts with the same capability set a merchant signing up directly receives:
| Capability | On creation | Notes |
|---|---|---|
payments.crypto |
granted | |
payouts |
granted | |
refunds |
granted | |
wallets |
granted | |
payments.fiat_card |
held | Granted when KYB is approved. |
withdrawals |
held | Granted when KYB is approved. |
payout_wallets |
never | Only Niftipay staff grant it, per customer. |
The two held capabilities are the money-out and card rails. They are granted automatically the moment the customer’s verification is approved, and withdrawn again if it is later rejected — you do not need to ask anyone.
Manually granted. Every capability starts at false and is turned on by
Niftipay staff per customer.
Either way, the check below is the same, and it is the one to build against:
read enabled and available rather than assuming a starting state.
enabled and available are two separate gates
Turning a grant on does not make a capability usable. Calling a rail you have
been granted but whose merchant is not eligible returns 409 capability_unavailable, not a 403 — the two failures need different handling:
enabled |
available |
Calling the rail gives | What to do |
|---|---|---|---|
false |
any | 403 capability_not_enabled |
Ask Niftipay, or complete KYB. |
true |
false |
409 capability_unavailable |
Wait, or act on reason. |
true |
true |
The rail runs | — |
Errors
| Status | code | Meaning |
|---|---|---|
| 403 | insufficient_scope | Token was not minted with customers:read. |
| 404 | resource_not_found | Customer is not yours / relationship missing. |