Payment Orchestrator
Listing Methods

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 the providers[] list to the buyer and send the providerCode of the provider they choose.
  • PLATFORM: providerCode is 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/methods

The 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
ParameterTypeRequiredDescription
paymentMethodstringNoMethod 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 methods list 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 200 with { "methods": [] }; no error is returned.
  • An unknown code, a lower-case code (mobile_billing), an empty value (?paymentMethod=) and a repeated parameter get 400 payment.method.unknown. The valid codes are in the details.allowed list; 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

FieldTypeDescription
paymentMethodstringMethod code; the paymentMethod of the request
categorystringMethod category
blockNamestringName of the block in the request body (card, wallet, mobileBilling, promissoryNote)
displayNamestring | nullThe label you set in your form settings; null if none
providerSelectionstringWhether you must send providerCode: ROUTED, OPTIONAL or REQUIRED. See Provider selection
providerSelectionModestringWho chooses the provider when more than one is connected: BUYER or PLATFORM. See Provider selection
actionTypesstring[]Action types this method can return in the response; see Payment — Actions
currenciesstring[]Currencies accepted by at least one provider
minAmount, maxAmountinteger | nullLowest minimum and highest maximum across providers, minor units; null when there is no limit
preauthbooleantrue when at least one provider accepts preauth: true; see Pre-authorization
providersarrayProviders, in your Form Settings order; empty for card
splitEligiblebooleanWhether 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
splitBehaviorstring | nullHow the method behaves in a split payment; null when the eligible providers behave differently. See Split payment fields

Provider row (providers[])

FieldTypeDescription
providerCodestringProvider code; sent in the request as <block>.providerCode
displayNamestringName you can show the buyer
logoUrlstring | nullHTTPS logo URL; null if none
actionTypesstring[]Action types this provider can return
currenciesstring[]The provider's currencies; empty when not declared
minAmount, maxAmountinteger | nullAmount limits, minor units; null when there is no limit
preauthbooleanWhether preauth: true is accepted with this provider
inputFieldsarrayFields the provider asks the buyer for; see Method fields. Empty means no fields
splitEligiblebooleanWhether a split payment leg can be opened with this provider
splitBehaviorstring | nullHow 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, splitEligible is true when the provider supports split payments and you enabled the method for split payments in Form Settings.
  • splitBehavior is 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.
splitBehaviorMeaningPlace in a split payment
APPROVE_THEN_DISBURSEApproval first; the amount is charged at the end (credit, BNPL)Always the first step
HOLD_CAPTUREThe amount is held and captured at the end (card)After approval
CAPTURE_REVERSIBLEThe amount is charged; refunded if neededAfter the cards
CAPTURE_IRREVERSIBLEThe amount is charged and cannot be reversedLast; 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:

providerSelectionModeMeaning<block>.providerCode
BUYERThe buyer chooses the brand; for example, with a wallet the buyer picks their own walletMay 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
PLATFORMIf you do not send a provider, the platform choosesOptional. 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:

MethodproviderSelectionModePage
Card (CARD)PLATFORM: routing chooses the provider; the card block has no providerCodeCredit/Debit Card
Wallet (WALLET)BUYERPay with Wallet › Choosing the provider
Mobile billing (MOBILE_BILLING)PLATFORMMobile 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:

CaseproviderSelectionproviderCode
CardROUTEDNot sent; routing chooses the provider
Non-card, PLATFORM (any number of providers)OPTIONALMay be omitted
Non-card, BUYER, one providerOPTIONALMay be omitted
Non-card, BUYER, more than one providerREQUIREDRequired

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 inputFields definition.
  • 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 providerCode field of the response and the webhook.
  • A request repeated with the same Idempotency-Key does 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:

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" }
FieldTypeDescription
keystringField name in the block
typestringValue type; see the table below
requiredbooleanWhether the field is required
labelobjectLabel to show the buyer: { "tr": "…", "en": "…" }
prefillstring | nullBuyer data used when the field is omitted: buyer.gsmNumber, buyer.email, buyer.identityNumber, buyer.name, buyer.surname. A prefilled value is still validated
piibooleanPersonal data: the value is not logged, not written to the payment's metadata and not returned in responses
patternstring | nullRegular expression the value must match
minLength, maxLengthinteger | nullLength limits
optionsarraySELECT options: { "value": "…", "label": { "tr": "…", "en": "…" } }; empty for other types
urlstring | nullFor a CONSENT field, the HTTPS address of the agreement
requiredWhenobject | nullConditional 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
itemFieldsarrayFor a GROUP field, the fields of each item; same shape as this table (no nested GROUP). Empty for other types
minItems, maxItemsinteger | nullFor a GROUP field, the limits on the number of items; null when there is no limit. A list holds at most 10 items
TypeExpected value
PHONEOptional + and 10–15 digits. Example: +905321234567
TCKN11-digit Turkish ID number; validated with its checksum
VKN10-digit Turkish tax number; validated with its checksum
EMAILE-mail address
DATEAn existing calendar date, YYYY-MM-DD. Example: 1990-01-31
TEXTText
NUMBERDigits with an optional decimal part; may be sent as a string or a number
SELECTOne of the options[].value values
CONSENTtrue; the buyer accepted the agreement at url
ADDRESSObject: { "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
GROUPList 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

CaseResponseWhat to do
The code in the paymentMethod filter is unknown, lower-case, empty or repeated400 payment.method.unknownSend a code from the details.allowed list
The method is disabled or has no provider200, { "methods": [] }Enable the method in the panel and connect its provider
Authentication, signature or product entitlement error401, 403, 503See 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