Listing Methods
GET /payments/methods returns the payment methods open on your account: each method's providers, who chooses the provider, the fields asked from the buyer, amount limits, currencies and the actions the buyer may need to take. Read this response before you start a payment with POST /payments/direct/payment. The Checkout Form uses the same list.
The list only contains methods that are enabled in your Checkout Form settings (panel: Payments → Form Settings) and have at least one connected provider. Methods and providers come in the order you set in Form Settings; see Order.
Flow
List the methods
Call GET /payments/methods. To read a single method's row, add ?paymentMethod=<CODE>; see Filter.
Determine the provider
providerSelectionMode on the method row tells you who chooses the provider; see Provider selection.
BUYER: when more than one provider is connected, show theproviders[]list to the buyer and send theproviderCodeof the provider they choose.PLATFORM:providerCodeis optional. You can show the providers to the buyer and send the code of the one they choose; if you omit it, the platform picks one of the connected providers.
Fill in the fields
Collect the fields in the provider's inputFields definition from the buyer, or let prefill fill them from buyer data; see Method fields.
Start the payment
Send paymentMethod and the method's block (e.g. mobileBilling) with POST /payments/direct/payment. In the block, fields use the definition's key names, plus providerCode when needed → Payment.
Request
GET https://api-gateway.lunixi.com/api/v1/payments/methodsThe endpoint requires Step-Up authentication (Bearer token and Ed25519 signature headers); it has no body, so no Digest header is sent. How to build the signature is described on Authentication. The endpoint requires the Payment Gateway product to be active on your account.
Filter (?paymentMethod=)
GET https://api-gateway.lunixi.com/api/v1/payments/methods?paymentMethod=MOBILE_BILLING| Parameter | Type | Required | Description |
|---|---|---|---|
paymentMethod | string | No | Method code in upper case (e.g. MOBILE_BILLING, WALLET, CARD). QR is read as QR_CODE |
- Without the parameter, all open methods are returned.
- With the parameter, the response is still the
methodslist and carries only that method's row. The row is identical to the row in the unfiltered list. - If the method is disabled in your form settings or has no connected provider, the response is
200with{ "methods": [] }; no error is returned. - An unknown code, a lower-case code (
mobile_billing), an empty value (?paymentMethod=) and a repeated parameter get400payment.method.unknown. The valid codes are in thedetails.allowedlist; see Errors. - Other query parameters are ignored.
Response
{
"status": "success",
"code": "SUCCESS",
"message": "…",
"data": {
"methods": [
{
"paymentMethod": "CARD",
"category": "CARD",
"blockName": "card",
"displayName": "Card",
"providerSelection": "ROUTED",
"providerSelectionMode": "PLATFORM",
"actionTypes": ["REDIRECT"],
"currencies": ["TRY"],
"minAmount": null,
"maxAmount": null,
"preauth": true,
"providers": [],
"splitEligible": true,
"splitBehavior": "HOLD_CAPTURE"
},
{
"paymentMethod": "MOBILE_BILLING",
"category": "TELCO",
"blockName": "mobileBilling",
"displayName": "Mobile billing",
"providerSelection": "OPTIONAL",
"providerSelectionMode": "PLATFORM",
"actionTypes": ["OTP"],
"currencies": ["TRY"],
"minAmount": 100,
"maxAmount": 50000,
"preauth": false,
"providers": [
{
"providerCode": "<providerCode>",
"displayName": "<provider display name>",
"logoUrl": "https://…",
"actionTypes": ["OTP"],
"currencies": ["TRY"],
"minAmount": 100,
"maxAmount": 50000,
"preauth": false,
"inputFields": [
{
"key": "gsmNumber",
"type": "PHONE",
"required": true,
"label": { "tr": "Faturasına yansıtılacak hat", "en": "Mobile line to be billed" },
"prefill": "buyer.gsmNumber",
"pii": true,
"pattern": null,
"minLength": null,
"maxLength": null,
"options": [],
"url": null
}
],
"splitEligible": true,
"splitBehavior": "CAPTURE_IRREVERSIBLE"
}
],
"splitEligible": true,
"splitBehavior": "CAPTURE_IRREVERSIBLE"
}
]
},
"statusCode": 200,
"requestId": "…"
}<providerCode> in the examples is a placeholder. Read the codes of your connected providers from this response; do not hard-code them in your application. Amount limits and currencies also vary by provider.
Method row
| Field | Type | Description |
|---|---|---|
paymentMethod | string | Method code; the paymentMethod of the request |
category | string | Method category |
blockName | string | Name of the block in the request body (card, wallet, mobileBilling, promissoryNote) |
displayName | string | null | The label you set in your form settings; null if none |
providerSelection | string | Whether you must send providerCode: ROUTED, OPTIONAL or REQUIRED. See Provider selection |
providerSelectionMode | string | Who chooses the provider when more than one is connected: BUYER or PLATFORM. See Provider selection |
actionTypes | string[] | Action types this method can return in the response; see Payment — Actions |
currencies | string[] | Currencies accepted by at least one provider |
minAmount, maxAmount | integer | null | Lowest minimum and highest maximum across providers, minor units; null when there is no limit |
preauth | boolean | true when at least one provider accepts preauth: true; see Pre-authorization |
providers | array | Providers, in your Form Settings order; empty for card |
splitEligible | boolean | Whether the method can be used in a split payment. Always true for card; for a non-card method true when at least one of its providers is eligible. See Split payment fields |
splitBehavior | string | null | How the method behaves in a split payment; null when the eligible providers behave differently. See Split payment fields |
Provider row (providers[])
| Field | Type | Description |
|---|---|---|
providerCode | string | Provider code; sent in the request as <block>.providerCode |
displayName | string | Name you can show the buyer |
logoUrl | string | null | HTTPS logo URL; null if none |
actionTypes | string[] | Action types this provider can return |
currencies | string[] | The provider's currencies; empty when not declared |
minAmount, maxAmount | integer | null | Amount limits, minor units; null when there is no limit |
preauth | boolean | Whether preauth: true is accepted with this provider |
inputFields | array | Fields the provider asks the buyer for; see Method fields. Empty means no fields |
splitEligible | boolean | Whether a split payment leg can be opened with this provider |
splitBehavior | string | null | How the provider behaves in a split payment; null when the provider does not support split payments |
Order
You order the methods, and the providers within each method, in the panel on Payments → Form Settings. This endpoint, the Checkout Form and the panel use the same order.
- Methods come in your order. If you have not set one, the default order is:
CARD,BNPL,SHOPPING_LOAN,PROMISSORY_NOTE,MEAL_CARD,GIFT_CARD,CASH,CASH_ON_DELIVERY,WALLET,BANK_TRANSFER,OPEN_BANKING,MOBILE_BILLING,QR_CODE,CRYPTO,OTHER. The list contains only the methods open on your account. - Providers (
providers[]) come in your order within the method. If you have not set one, they are sorted by provider code. - A provider you connect later is added to the end of its method's order. A provider whose connection you turn off drops out of the list.
- The order is the same in the test and live environments.
A provider you turned off only for the form in Form Settings stays in this list and can be used with POST /payments/direct/payment; it is not shown in the Checkout Form. To turn a provider off everywhere, turn off its provider connection → Checkout Form — Payment › Order and providers shown in the form.
Split payment fields
splitEligible and splitBehavior on a row tell you whether the method and provider can be used in a split payment and how they are charged there.
- On a provider row,
splitEligibleistruewhen the provider supports split payments and you enabled the method for split payments in Form Settings. splitBehavioris a property of the provider: it is shown even if you have not enabled the method for split payments.- For a non-card leg of a split payment, use only providers with
splitEligible: true.
splitBehavior | Meaning | Place in a split payment |
|---|---|---|
APPROVE_THEN_DISBURSE | Approval first; the amount is charged at the end (credit, BNPL) | Always the first step |
HOLD_CAPTURE | The amount is held and captured at the end (card) | After approval |
CAPTURE_REVERSIBLE | The amount is charged; refunded if needed | After the cards |
CAPTURE_IRREVERSIBLE | The amount is charged and cannot be reversed | Last; at most one per payment |
Order details: Multiple Payment Methods › Order of the steps.
Provider selection
More than one provider may be connected to a method on your account. providerSelectionMode on the method row tells you what happens when you do not send providerCode:
providerSelectionMode | Meaning | <block>.providerCode |
|---|---|---|
BUYER | The buyer chooses the brand; for example, with a wallet the buyer picks their own wallet | May be omitted when one provider is connected. Required when more than one is connected; without it you get 400 payment.provider.required and the connected codes are in details.boundProviderCodes |
PLATFORM | If you do not send a provider, the platform chooses | Optional. If you send it, that provider is used. If you omit it, the platform picks one of the connected providers before any money moves and pins it to the payment. If none of them can take this payment, you get 422 payment.provider.none_eligible |
Modes of the methods available today:
| Method | providerSelectionMode | Page |
|---|---|---|
Card (CARD) | PLATFORM: routing chooses the provider; the card block has no providerCode | Credit/Debit Card |
Wallet (WALLET) | BUYER | Pay with Wallet › Choosing the provider |
Mobile billing (MOBILE_BILLING) | PLATFORM | Mobile Billing › Choosing the provider |
Relation to providerSelection
providerSelection tells you directly whether you must send providerCode; its value is derived from the mode and the number of connected providers:
| Case | providerSelection | providerCode |
|---|---|---|
| Card | ROUTED | Not sent; routing chooses the provider |
Non-card, PLATFORM (any number of providers) | OPTIONAL | May be omitted |
Non-card, BUYER, one provider | OPTIONAL | May be omitted |
Non-card, BUYER, more than one provider | REQUIRED | Required |
An integration that sends providerCode whenever providerSelection is REQUIRED works correctly. Whether you show the buyer a list of providers is up to you: for a PLATFORM method you can also show the list and send the code the buyer chooses.
providerSelectionMode applies only to this endpoint and the Direct API. In the Checkout Form the buyer chooses the provider for every non-card method, mobile billing included, and the form always sends the chosen code → Checkout Form — Payment › Provider choice.
How the platform chooses
For a PLATFORM method, when you omit providerCode and more than one provider is connected, the platform tries the providers in turn and picks the first one that can take this payment:
- The amount and currency must be within the provider's limits.
- If you sent
preauth: true, the provider must support pre-authorization. - The fields in the method block must match the provider's
inputFieldsdefinition. - If the provider supports checking the buyer's eligibility (e.g. whether the line is open to this method), the check must come back positive. This check does not move money.
After the choice:
- The chosen provider is pinned to the payment. If something fails, the payment does not move to another provider, another method or a card.
- The provider that runs the payment is in the
providerCodefield of the response and the webhook. - A request repeated with the same
Idempotency-Keydoes not choose again; the provider chosen on the first request is used.
Two cases during platform selection return the same code as a single-provider method:
- If every provider was ruled out only because it does not support pre-authorization:
422payment.preauth.unsupported_for_method. - If the method block matches no provider's field definition:
400payment.method.block_invalid.
Method fields (inputFields)
Each provider may ask the buyer for different data: a phone number, a Turkish ID number, a date of birth and so on. The provider's inputFields definition tells you which fields are needed; you send the values in the method block under the definition's key:
"mobileBilling": { "providerCode": "<providerCode>", "gsmNumber": "+905321234567" }| Field | Type | Description |
|---|---|---|
key | string | Field name in the block |
type | string | Value type; see the table below |
required | boolean | Whether the field is required |
label | object | Label to show the buyer: { "tr": "…", "en": "…" } |
prefill | string | null | Buyer data used when the field is omitted: buyer.gsmNumber, buyer.email, buyer.identityNumber, buyer.name, buyer.surname. A prefilled value is still validated |
pii | boolean | Personal data: the value is not logged, not written to the payment's metadata and not returned in responses |
pattern | string | null | Regular expression the value must match |
minLength, maxLength | integer | null | Length limits |
options | array | SELECT options: { "value": "…", "label": { "tr": "…", "en": "…" } }; empty for other types |
url | string | null | For a CONSENT field, the HTTPS address of the agreement |
requiredWhen | object | null | Conditional requirement: { "field": "…", "equals": "…" }. When the sibling field field (a SELECT) has the value equals, the field is required; otherwise the field must not be sent. null when there is no condition |
itemFields | array | For a GROUP field, the fields of each item; same shape as this table (no nested GROUP). Empty for other types |
minItems, maxItems | integer | null | For a GROUP field, the limits on the number of items; null when there is no limit. A list holds at most 10 items |
| Type | Expected value |
|---|---|
PHONE | Optional + and 10–15 digits. Example: +905321234567 |
TCKN | 11-digit Turkish ID number; validated with its checksum |
VKN | 10-digit Turkish tax number; validated with its checksum |
EMAIL | E-mail address |
DATE | An existing calendar date, YYYY-MM-DD. Example: 1990-01-31 |
TEXT | Text |
NUMBER | Digits with an optional decimal part; may be sent as a string or a number |
SELECT | One of the options[].value values |
CONSENT | true; the buyer accepted the agreement at url |
ADDRESS | Object: { "provinceCode", "districtCode", "neighborhoodCode", "line" }; all four required, as strings. provinceCode is "01"–"81", the district and neighbourhood codes are digits, line (street address) is at most 250 characters. The codes come from the address dictionary |
GROUP | List of objects; each item is validated against itemFields. The number of items is within minItems and maxItems |
How the fields are validated in the request and the error details: Payment — Method fields.
Errors
| Case | Response | What to do |
|---|---|---|
The code in the paymentMethod filter is unknown, lower-case, empty or repeated | 400 payment.method.unknown | Send a code from the details.allowed list |
| The method is disabled or has no provider | 200, { "methods": [] } | Enable the method in the panel and connect its provider |
| Authentication, signature or product entitlement error | 401, 403, 503 | See Error Handling |
{
"status": "failure",
"code": "payment.method.unknown",
"message": "Unknown payment method — send a valid method code in `paymentMethod`.",
"statusCode": 400,
"timestamp": "2026-10-12T09:00:00.000Z",
"service": "api-gateway",
"systemTime": 1791795600000,
"requestId": "…",
"details": {
"field": "paymentMethod",
"allowed": ["CARD", "BNPL", "SHOPPING_LOAN", "PROMISSORY_NOTE", "MEAL_CARD", "GIFT_CARD", "CASH", "CASH_ON_DELIVERY", "WALLET", "BANK_TRANSFER", "OPEN_BANKING", "MOBILE_BILLING", "QR_CODE", "CRYPTO", "OTHER"]
}
}details.allowed carries every recognized method code. Read whether a method is usable on your account from the unfiltered list.
Next steps
- Payment — the
POST /payments/direct/paymentrequest, actions and error codes - Credit/Debit Card · Pay with Wallet · Mobile Billing — method-specific requests
- Checkout Form — Payment — the same methods in the form