API reference
The path, response fields and errors of every released API endpoint.
The reference is built from the server schemas. Every build checks the responses of a running server and the examples on this page against them.
Common to all endpoints
- Base URL:
https://api.plutera.io. - Sign-in with an API key: Authentication.
- Error shape and common errors: Errors.
- Rate limit and the no-caching rule: Limits.
Check the key
GET/api/v1/mesince 2026-11-12
Returns the merchant, the environment and the public part of the key that signed the request. Changes nothing. Start your integration with this request: it shows that the key is accepted and which environment it belongs to.
- The key secret is never returned in the response.
- The labels an administrator gave the key in the console are not in the response.
Request
curl -sS https://api.plutera.io/api/v1/me \
-H "Authorization: Bearer $PLUTERA_API_KEY"No query parameters. A parameter with an unknown name is rejected.
The request has no body.
Response 200
| Field | Type | Present | Description |
|---|---|---|---|
merchant | object | always | The merchant the key was issued to. |
merchant.code | string | always | Merchant code. Set when the merchant is created and never changes. |
merchant.name | string | always | Merchant name as registered with us. |
environment | stringLIVE TEST | always | The key's environment. Every request made with this key runs in this environment. |
key | object | always | The key that signed the request. |
key.keyId | string | always | The public part of the key. Not a secret: use it to refer to the key when talking to support. |
key.expiresAt | string, ISO 8601 timestampor null | always | When the key stops being accepted, in UTC. null: no expiry is set. |
{
"merchant": {
"code": "example-shop",
"name": "Example Shop"
},
"environment": "TEST",
"key": {
"keyId": "ak_test_examplekey000001",
"expiresAt": "2027-02-10T00:00:00.000Z"
}
}Errors
The endpoint has no errors of its own, only the errors common to all endpoints.
List services
GET/api/v1/servicessince 2026-11-12
Returns the services the merchant can accept a payment with in the key's environment: payment method, currency, amount limits, payer fields and fee. Changes nothing.
- The list contains only services that are fully ready to work. A service that is missing something on our side is absent from the response, not flagged.
- The list depends on the key's environment: a test key and a live key of the same merchant may get different lists.
- Amounts come as strings in minor units of the service currency. To show an amount to a person, divide it by
minorUnit. - The list changes when an administrator enables or disables a service. Do not keep it for longer than a few minutes.
Request
curl -sS https://api.plutera.io/api/v1/services \
-H "Authorization: Bearer $PLUTERA_API_KEY"No query parameters. A parameter with an unknown name is rejected.
The request has no body.
Response 200
| Field | Type | Present | Description |
|---|---|---|---|
environment | stringLIVE TEST | always | The key's environment. The list is built for it. |
items | array of objects | always | Services the merchant can accept a payment with right now. May be empty. |
items[].code | string | always | Service code. Use it to name the service when creating a payment. |
items[].direction | stringPAYIN PAYOUT | always | Direction of money: PAYIN payment acceptance, PAYOUT payout. |
items[].method | object | always | Payment method. |
items[].method.code | string | always | Payment method code. |
items[].method.name | string | always | Payment method name to show to people. |
items[].currency | string | always | Service currency: the payment amount, the limits and a fixed fee are set in it. |
items[].network | stringor null | always | Network, if the currency has several (cryptocurrencies). null: no network. |
items[].flow | stringDIRECT REDIRECT REQUISITE HOSTED_FIELDS | always | How the payment goes: DIRECT the merchant's server sends the payer's data, REDIRECT the payer goes to the provider's page, REQUISITE the payer gets payment details (QR, code, account), HOSTED_FIELDS the payer fills in the provider's ready-made form. |
items[].minorUnit | integer | always | How many minor units are in one unit of the currency: 100 for BRL, 1 for JPY. |
items[].amount | object | always | Amount limits. |
items[].amount.minMinor | stringor null | always | The smallest payment amount in minor units. null: no lower limit. |
items[].amount.maxMinor | stringor null | always | The largest payment amount in minor units. null: no upper limit. |
items[].fields | array of objects | always | Payer fields the service accepts, in the same order as on the payment form. |
items[].fields[].key | string | always | Field name. The field is sent under this name when creating a payment. |
items[].fields[].kind | stringTEXT DIGITS EMAIL PHONE DATE COUNTRY | always | Value kind: TEXT string, DIGITS digits only, EMAIL email address, PHONE phone number in E.164 format, DATE date as YYYY-MM-DD, COUNTRY two-letter ISO 3166-1 country code. |
items[].fields[].required | boolean | always | Whether the field is required for this service. |
items[].fields[].pattern | stringor null | always | Regular expression the whole value must match. null: no pattern check. |
items[].fields[].maxLength | integer | always | Maximum value length in characters. |
items[].fee | object | always | The merchant's fee for a payment with this service. |
items[].fee.type | stringPERCENT FIXED | always | Fee kind: PERCENT a percentage of the amount, FIXED a fixed amount. |
items[].fee.percent | stringor null | always | Percentage as a string with four decimal places, such as "1.9000". Set for PERCENT, otherwise null. |
items[].fee.amountMinor | stringor null | always | Fixed amount in minor units of the service currency. Set for FIXED, otherwise null. |
{
"environment": "TEST",
"items": [
{
"code": "pix_brl_requisite",
"direction": "PAYIN",
"method": {
"code": "PIX",
"name": "Pix"
},
"currency": "BRL",
"network": null,
"flow": "REQUISITE",
"minorUnit": 100,
"amount": {
"minMinor": "100",
"maxMinor": "10000000"
},
"fields": [
{
"key": "payer.tax_id",
"kind": "DIGITS",
"required": true,
"pattern": "^(\\d{11}|\\d{14})$",
"maxLength": 14
},
{
"key": "payer.name",
"kind": "TEXT",
"required": false,
"pattern": null,
"maxLength": 128
}
],
"fee": {
"type": "PERCENT",
"percent": "1.9000",
"amountMinor": null
}
},
{
"code": "boleto_brl_requisite",
"direction": "PAYIN",
"method": {
"code": "BOLETO",
"name": "Boleto bancário"
},
"currency": "BRL",
"network": null,
"flow": "REQUISITE",
"minorUnit": 100,
"amount": {
"minMinor": "500",
"maxMinor": "1000000"
},
"fields": [
{
"key": "payer.tax_id",
"kind": "DIGITS",
"required": true,
"pattern": "^(\\d{11}|\\d{14})$",
"maxLength": 14
},
{
"key": "payer.name",
"kind": "TEXT",
"required": true,
"pattern": null,
"maxLength": 128
},
{
"key": "payer.email",
"kind": "EMAIL",
"required": false,
"pattern": null,
"maxLength": 254
}
],
"fee": {
"type": "FIXED",
"percent": null,
"amountMinor": "250"
}
}
]
}Errors
The endpoint has no errors of its own, only the errors common to all endpoints.
Reserved paths
These paths are reserved for endpoints that have not been released yet. The server answers them with a 501 error, with or without a key. You can use a path from the day it appears above and in the changelog: until then its behaviour may change without notice.
| Method | Path | Current response |
|---|---|---|
| POST | /api/v1/payments | 501 |
| GET | /api/v1/payments/:id | 501 |
| GET | /api/v1/payments | 501 |