# Error handling URL: /docs/a2a/error-handling Catch and interpret A2A errors and error codes. Every operation either resolves with a typed response or fails with a typed error. On Flutter and React Native the error type is `PPA2AException`; on the native package it is `PlusPayException`. All of them expose an **error code** and a **message**. | | Flutter | React Native | Native | | ------- | ---------------- | ---------------- | -------------------- | | Type | `PPA2AException` | `PPA2AException` | `PlusPayException` | | Code | `errorCode` | `errorCode` | `getError_code()` | | Message | `message` | `message` | `getError_message()` | ## Catching errors Flutter Kotlin Java React Native ```dart try { final result = await _pluspay.startPayment(request); // success } on PPA2AException catch (e) { print(e.errorCode); // e.g. "LAUNCH_INTENT_ERROR" print(e.message); // human-readable message } ``` ```kotlin // Coroutine style try { val result = client.startPayment(request) } catch (e: PlusPayException) { Log.e("A2A", "${e.error_code}: ${e.error_message}") } // Callback style client.startPayment(request, object : PPA2ACallback { override fun onSuccess(result: PPStartPaymentResponseModel) {} override fun onError(e: PlusPayException) { Log.e("A2A", "${e.error_code}: ${e.error_message}") } }) ``` ```java client.startPayment(request, new PPA2ACallback() { @Override public void onSuccess(PPStartPaymentResponseModel result) { } @Override public void onError(PlusPayException e) { Log.e("A2A", e.getError_code() + ": " + e.getError_message()); } }); ``` ```ts try { const result = await client.startPayment(request); // success } catch (e) { if (e instanceof PPA2AException) { console.log(e.errorCode); // e.g. "LAUNCH_INTENT_ERROR" console.log(e.message); // human-readable message } } ``` ## Error codes Branch on `errorCode`, never on the message text. Flutter (0.8.0+) and React Native (0.4.0+) also expose these codes as constants in `PPA2AErrorCodes`. ### Returned by the client package | Code | Meaning | | --------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `LAUNCH_INTENT_ERROR` | POS+ could not be launched (not installed, or the intent could not be resolved). | | `PP-A2A-PARSE` | The response from POS+ could not be parsed. | | `PP_A2A_015` | Another request from your app is still waiting for its result. Flutter 0.8.0+ and React Native 0.4.0+ reject the new request immediately, without launching POS+. | | `NOT_INITIALIZED` | React Native: `initialize()` was not called before the request. | | `TIMEOUT` | Native package: no response from POS+ within the client timeout. | ### Returned by POS+ | Code | Meaning | | ------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `PP-A2A-003` | The intent did not contain a `request` extra. Note the hyphens: this is not `PP_A2A_003`. | | `PP_A2A_001` | The request is empty. | | `PP_A2A_002` | This operation needs a `data` object, but it is missing or is not an object. | | `PP_A2A_003` | The `client_token` in the header is invalid (only checked when a token is sent). | | `PP_A2A_004` | Invalid end-of-day request: `is_all` is `false` but `types` is empty. | | `PP_A2A_005` | Invalid parameter request: `is_all` is `false` but `types` is empty. | | `PP_A2A_006` | Invalid request parameter. | | `PP_A2A_007` | Unexpected error while handling the request. The final state is unknown: query it with [`getTransactionResult` / `getOrderResult`](/docs/a2a/recovery). | | `PP_A2A_008` | The `header` is missing. | | `PP_A2A_009` | `transaction_type` is missing or not a known operation. | | `PP_A2A_010` | A header field required by this operation is missing or empty (for example `order_code` or `transaction_id`). | | `PP_A2A_011` | Nobody has ever logged in to POS+ on this device. Log in to POS+ once, then retry. | | `PP_A2A_012` | The operation failed in POS+ (declined, cancelled by the user, order closed, …). The message describes the cause. | | `PP_A2A_013` | POS+ could not log in automatically. Check the device's internet connection and the POS+ session. | | `PP_A2A_014` | POS+ timed out: it could not get ready within 3 minutes, or the request did not finish within 15 minutes. The final state is unknown: [query it](/docs/a2a/recovery). | | `PP_A2A_015` | POS+ is still processing an earlier request. Wait for that result, then retry. | | `PP_A2A_016` | `TRANSACTION_RESULT`: the order has no transaction with the given `transaction_id`. | `error_message` is always in **Turkish**, even when you set a [`locale`](/docs/a2a/initialization#language). For example: *"İşlem kullanıcı veya sistem tarafından iptal edildi!"* ("The transaction was cancelled by the user or the system."). If you show errors to your users in another language, map `errorCode` to your own text. ## Timeouts and concurrency * **One request at a time.** POS+ handles a single A2A request at a time. A second request that arrives while one is in progress is rejected with `PP_A2A_015`. Wait for the first result before you send the next request. * **POS+ start-up: 3 minutes.** If POS+ is launched by your request and cannot get ready to handle it within 3 minutes, it answers with `PP_A2A_014`. * **Request handling: 15 minutes.** If a request is not finished within 15 minutes, POS+ answers with `PP_A2A_014`. The limit is long on purpose so that a real payment flow (card reading, PIN entry, receipt) is never cut off. * **Client-side timeouts.** The Flutter and React Native packages don't time out on their own. If you add your own timeout, make it **longer than 15 minutes**. Otherwise a payment that completes in POS+ looks failed in your app. * After it sends the result, POS+ brings your app back to the foreground and moves itself to the background. ## Recommended handling * Treat any thrown error as a non-completed transaction. Do **not** assume the payment succeeded. * For `PP_A2A_007` and `PP_A2A_014`, the outcome is unknown. Query it with [`getTransactionResult` / `getOrderResult`](/docs/a2a/recovery) before you retry. * For `LAUNCH_INTENT_ERROR`, verify POS+ is installed and (Flutter) consider providing `fallbackPackageName` / `fallbackActivityName` during [initialization](/docs/a2a/initialization). * For `PP_A2A_011` and `PP_A2A_013`, ask the user to open POS+ and log in. --- # Introduction URL: /docs/a2a App-to-app payment integration with the POS+ application using the PlusPay A2A packages. PlusPay **A2A** (app-to-app) lets your application start payments, cancellations, end-of-day and parameter operations on the **POS+** application that runs on the same Android device, query the state of transactions and orders, and receive a strongly-typed result back. Your app never talks to the card reader or the banking network directly. It hands a request to POS+, POS+ performs the payment on its certified payment stack, and returns the outcome to your app. ## How it works ``` ┌─────────────┐ 1. request (Intent) ┌─────────────┐ │ │ ───────────────────────▶ │ │ │ Your App │ │ POS+ │ │ │ ◀─────────────────────── │ │ └─────────────┘ 2. result (broadcast) └─────────────┘ ``` 1. Your app builds a typed request and calls a method on the A2A client. 2. The client launches POS+ through an Android **Intent**. 3. POS+ runs the transaction (card, cash, wallet, EFT-POS, …). 4. POS+ returns the result; the client parses it into a typed response object, or throws a typed error. Because the integration is Intent + broadcast based, **it is Android only**. There is no iOS support. ## Which package do I use? There are three packages that expose the **same** capabilities. Pick the one that matches your app's technology: A Flutter plugin. Use it from Dart/Flutter apps. Strongly-typed Freezed request/response models. A native Android library (`.aar`). Use it from Kotlin or Java apps. Offers both callback and Kotlin coroutine APIs. A React Native module. Use it from JavaScript/TypeScript apps. Android only. Throughout this documentation every code sample is shown for **Flutter, Kotlin, Java and React Native** in a tabbed block, so the same flow is described once for all of them. ## Supported operations | Operation | Method | Result | | --------------------------------- | ---------------------------- | ---------------------------------------- | | Start a payment | `startPayment` | `PPStartPaymentResponseModel` | | Cancel a payment | `cancelPayment` | `PPStartPaymentResponseModel` | | Start an EFT-POS payment | `startEftPayment` | `PPStartPaymentResponseModel` | | Cancel an EFT-POS payment | `cancelEftPayment` | `PPStartPaymentResponseModel` | | Pay an existing order | `startOrderPayment` | `PPOrderPaymentResponseModel` | | Multi-payment / order | `startMultiPayment` | `PPMultiPaymentResponseModel` | | Create an order without payment ¹ | `createOrder` | `PPOrderCreateResponseModel` | | End-of-day (settlement) | `triggerEod` | `PPEodResponseModel` | | Parameter update | `triggerParameters` | `PPParametersResponseModel` | | Available payment methods ¹ | `getAvailablePaymentMethods` | `PPAvailablePaymentMethodsResponseModel` | | Query a transaction ¹ | `getTransactionResult` | `PPStartPaymentResponseModel` | | Query an order ¹ | `getOrderResult` | `PPOrderPaymentResponseModel` | | Technical cancel ¹ | `technicalCancel` | `PPTechnicalCancelResponseModel` | ¹ Flutter and React Native only. The native Android package does not support these operations yet. The last three need Flutter 0.8.0 / React Native 0.4.0. ## Authentication A2A runs entirely on-device: your app and POS+ exchange data through Android intents, so there is no API key or token to configure. POS+ authenticates the cardholder and settles the transaction with the bank. ## Next steps Add the package to your Flutter, Android or React Native project. Create and manage the A2A client lifecycle. Start, cancel, EFT and order payments. Find out what happened to a transaction and reverse it if needed. Enums and response model fields. --- # Initialization URL: /docs/a2a/initialization Create the A2A client, initialize it and manage its lifecycle. Before calling any operation you must create a client and call `initialize()`. Initialization registers the broadcast receiver that listens for results coming back from POS+. When you are done, call `dispose()` to release it. Always `initialize()` before the first request and `dispose()` when the screen/Activity is destroyed. Skipping `dispose()` leaks the receiver. ## Create and initialize Flutter Kotlin Java React Native ```dart class _CheckoutState extends State { final _pluspay = PPA2AClient(); @override void initState() { super.initState(); _pluspay.initialize(); } @override void dispose() { _pluspay.dispose(); super.dispose(); } } ``` ```kotlin class CheckoutActivity : AppCompatActivity() { private lateinit var client: PPA2AClient override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) client = PPA2AClient(this) client.initialize() } override fun onDestroy() { client.dispose() super.onDestroy() } } ``` ```java public class CheckoutActivity extends AppCompatActivity { private PPA2AClient client; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); client = new PPA2AClient(this); client.initialize(); } @Override protected void onDestroy() { client.dispose(); super.onDestroy(); } } ``` ```tsx function Checkout() { const clientRef = useRef(null); useEffect(() => { const client = new PPA2AClient(); clientRef.current = client; client.initialize(); return () => { client.dispose(); }; }, []); // ... } ``` ## Resolving the POS+ application When launching POS+, the client resolves the target application automatically. On Flutter you can optionally provide a fallback package/activity name in case auto-resolution fails on a particular device: Flutter Kotlin Java React Native ```dart await _pluspay.initialize( fallbackPackageName: 'com.pluspay.pos', fallbackActivityName: 'com.pluspay.pos.MainActivity', ); ``` ```kotlin // The native client resolves POS+ internally. client.initialize() // You can verify state before sending requests: if (client.isInitialized()) { // ready } ``` ```java // The native client resolves POS+ internally. client.initialize(); // You can verify state before sending requests: if (client.isInitialized()) { // ready } ``` ```ts // The client resolves POS+ internally; just initialize once. await client.initialize(); ``` ## Language POS+ can show its screens in a different language while it handles your request. Send the language in the optional `locale` header field. When the response has been delivered, POS+ switches back to the language it had before. * Supported values: `tr`, `en`, `ar`, `de`, `fr`, `it`, `es`, `ru`, `zh`. Region variants such as `en_US` or `en-US` are also accepted. * If `locale` is missing or not supported, POS+ stays in its current language. * Kiosk devices ignore the field. * `error_message` texts are always Turkish, whatever the `locale`. See [Error handling](/docs/a2a/error-handling#error-codes). Set a default for every request in `initialize`, or pass `locale` to a single request's `toRequest`. A per-request value wins over the default. Available from Flutter 0.8.0 and React Native 0.4.0. The supported values are exported as `ppSupportedLocales` (Flutter) and `PPSupportedLocales` (React Native). Flutter Kotlin Java React Native ```dart // Default for every request await _pluspay.initialize(locale: 'en'); // Override for one request await _pluspay.startOrderPayment( PPOrderPaymentRequestModel.toRequest(orderCode: 'ORD001', locale: 'de'), ); ``` ```kotlin // Not available in pluspay_a2a_native yet. ``` ```java // Not available in pluspay_a2a_native yet. ``` ```ts // Default for every request await client.initialize({ locale: 'en' }); // Override for one request await client.startOrderPayment( PPOrderPaymentRequestModel.toRequest({ orderCode: 'ORD001', locale: 'de' }) ); ``` ## Two API styles (native) The native package exposes **every** operation in two equivalent forms: * **Callback** — pass a `PPA2ACallback` with `onSuccess(T)` and `onError(PlusPayException)`. * **Coroutine** — `suspend` functions that return the typed result directly (Kotlin only). The Flutter package exposes a single `Future`-based API. All examples in the following pages show the idiomatic form for each language. Continue to [Payments](/docs/a2a/payments). --- # Installation URL: /docs/a2a/installation Add the PlusPay A2A package to a Flutter, Kotlin, Java or React Native project. The A2A integration requires the **POS+ application** to be installed on the same Android device. Your app and POS+ communicate locally; no network call is made by the A2A package itself. Android only. Minimum supported Android version is **API 24 (Android 7.0)**. ## Add the dependency Flutter Kotlin Java React Native ```bash flutter pub add pluspay_a2a ``` or add it to `pubspec.yaml` manually: ```yaml title="pubspec.yaml" dependencies: pluspay_a2a: ^0.8.0 ``` PlusPay A2A is published on pub.dev. See the available versions and the changelog at [pub.dev/packages/pluspay_a2a](https://pub.dev/packages/pluspay_a2a). Then fetch packages: ```bash flutter pub get ``` Copy `pluspay_a2a-debug.aar` into your module's `libs/` folder and declare it: ```kotlin title="app/build.gradle.kts" dependencies { implementation(files("libs/pluspay_a2a-debug.aar")) } ``` Download the latest `pluspay_a2a-debug.aar` from [github.com/plus-pay-tr/pluspay_a2a_aar/tags](https://github.com/plus-pay-tr/pluspay_a2a_aar/tags). Copy `pluspay_a2a-debug.aar` into your module's `libs/` folder and declare it: ```groovy title="app/build.gradle" dependencies { implementation files('libs/pluspay_a2a-debug.aar') } ``` Download the latest `pluspay_a2a-debug.aar` from [github.com/plus-pay-tr/pluspay_a2a_aar/tags](https://github.com/plus-pay-tr/pluspay_a2a_aar/tags). Install from npm (autolinking handles the rest): ```sh npm install pluspay-a2a-react-native # or: yarn add pluspay-a2a-react-native ``` The latest version is **0.4.0**. See the available versions at [npmjs.com/package/pluspay-a2a-react-native](https://www.npmjs.com/package/pluspay-a2a-react-native). ## Project requirements Flutter Kotlin Java React Native The plugin is Android-only and registers itself automatically — you don't add anything to your `pubspec.yaml` for platform setup. The only requirement is that your app's `minSdkVersion` is **24** or higher: ```groovy title="android/app/build.gradle" android { defaultConfig { minSdkVersion 24 } } ``` ```kotlin title="app/build.gradle.kts" android { defaultConfig { minSdk = 24 } } ``` The `.aar` bundles its own ProGuard rules; no extra keep rules are required. ```groovy title="app/build.gradle" android { defaultConfig { minSdkVersion 24 } } ``` The `.aar` bundles its own ProGuard rules; no extra keep rules are required. The module is Android-only and autolinks. Ensure the host app's `minSdkVersion` is **24** or higher: ```groovy title="android/app/build.gradle" android { defaultConfig { minSdkVersion 24 } } ``` ## Import Flutter Kotlin Java React Native ```dart import 'package:pluspay_a2a/pluspay_a2a.dart'; ``` ```kotlin import com.pluspay.pluspay_a2a.client.PPA2AClient import com.pluspay.pluspay_a2a.callback.PPA2ACallback import com.pluspay.pluspay_a2a.exception.PlusPayException ``` ```java import com.pluspay.pluspay_a2a.client.PPA2AClient; import com.pluspay.pluspay_a2a.callback.PPA2ACallback; import com.pluspay.pluspay_a2a.exception.PlusPayException; ``` ```ts import { PPA2AClient, PPA2AException, PPStartPaymentRequestModel, } from 'pluspay_a2a_react_native'; ``` Continue to [Initialization](/docs/a2a/initialization). --- # Multi-payment URL: /docs/a2a/multi-payment Create a product-based order and pay it with one or more transactions. `startMultiPayment` creates an order from a list of products and settles it with one or more transactions (e.g. part cash, part card). It returns a rich [`PPMultiPaymentResponseModel`](/docs/a2a/reference#ppmultipaymentresponsemodel) with computed totals, taxes, customer and document info. ## Request | Parameter | Type | Required | Description | | --------------------- | ------------------------------------------------------------------ | -------- | --------------------------------------------- | | `changePaymentStatus` | bool | yes | Whether POS+ updates the order payment status | | `orderCode` | String | yes | Your unique order code | | `orderDate` | DateTime | yes | Order date/time | | `products` | List\ | yes | Order line items | | `transactions` | List\ | yes | Payments that settle the order | | `billingInformation` | PPBillingInfo | no | Invoice / billing details | | `groupCode` | String | no | Group code | | `note` | String | no | Free-text note | | `discountAmount` | double | no | Order discount (default `0`) | | `currency` | [`PPCurrencyType`](/docs/a2a/reference#ppcurrencytype) | no | Default `TRY` | | `deliveryType` | [`PPDeliveryTypeEnum`](/docs/a2a/reference#ppdeliverytypeenum) | no | Default `CASH_ORDER` | | `deliveryStatus` | [`PPDeliveryStatusEnum`](/docs/a2a/reference#ppdeliverystatusenum) | no | Delivery status | | `installment` | int | no | Number of installments | ### `ProductModel` `id` (int), `sku` (String), `title` (String), `unit` ([`PPQtyEnums`](/docs/a2a/reference#ppqtyenums)), `price` (double), `quantity` (double), `taxRate` (int), `vatInclude` (bool), `productType` ([`PPProductTypeEnum`](/docs/a2a/reference#ppproducttypeenum)), `discountValue` (double), and optional `description`, `categoryCode`, `categoryName`, `discountType`, `exemptionCode`. ### `TransactionModel` `paymentType` ([`PPPaymentType`](/docs/a2a/reference#pppaymenttype)), `totalAmount` (double), optional `paymentMethod` ([`PPPaymentMethod`](/docs/a2a/reference#pppaymentmethod)). ## Example Flutter Kotlin Java React Native ```dart final result = await _pluspay.startMultiPayment( PPMultiPaymentRequest.toRequest( changePaymentStatus: true, orderCode: 'ORD-001', orderDate: DateTime.now(), products: [ ProductModel( id: 1, sku: 'SKU001', unit: PPQtyEnums.ADET, price: 100.0, title: 'Product 1', quantity: 1, taxRate: 20, vatInclude: true, productType: PPProductTypeEnum.PHYSICALLY, discountValue: 0, ), ], transactions: [ TransactionModel( paymentType: PPPaymentType.BANK_TRANSFER, totalAmount: 100.0, paymentMethod: PPPaymentMethod.NONE, ), ], ), ); print(result.grandTotal); print(result.status); // PPOrderStatusEnum ``` ```kotlin val request = PPMultiPaymentRequest.toRequest( change_payment_status = true, order_code = "ORD-001", order_date = Date(), products = listOf( ProductModel( id = 1, sku = "SKU001", unit = PPQtyEnums.ADET, price = 100.0, title = "Product 1", quantity = 1.0, tax_rate = 20, vat_include = true, product_type = PPProductTypeEnum.PHYSICALLY, discount_value = 0.0, ) ), transactions = listOf( TransactionModel( payment_type = PPPaymentType.BANK_TRANSFER, total_amount = 100.0, payment_method = PPPaymentMethod.NONE, ) ), ) val result = client.startMultiPayment(request) ``` ```java String request = PPMultiPaymentRequest.toRequest( true, // change_payment_status "ORD-001", new Date(), Collections.singletonList( new ProductModel(1, "SKU001", PPQtyEnums.ADET, 100.0, "Product 1", 1.0, 20, true, PPProductTypeEnum.PHYSICALLY, 0.0) ), Collections.singletonList( new TransactionModel(PPPaymentType.BANK_TRANSFER, 100.0, PPPaymentMethod.NONE) ) ); client.startMultiPayment(request, new PPA2ACallback() { @Override public void onSuccess(PPMultiPaymentResponseModel r) {} @Override public void onError(PlusPayException e) {} }); ``` ```ts const result = await client.startMultiPayment( PPMultiPaymentRequest.toRequest({ changePaymentStatus: true, orderCode: 'ORD-001', orderDate: new Date(), products: [ { id: 1, sku: 'SKU001', unit: PPQtyEnums.ADET, price: 100.0, title: 'Product 1', quantity: 1, taxRate: 20, vatInclude: true, productType: PPProductTypeEnum.PHYSICALLY, discountValue: 0, }, ], transactions: [ { paymentType: PPPaymentType.BANK_TRANSFER, totalAmount: 100.0, paymentMethod: PPPaymentMethod.NONE, }, ], }) ); console.log(result.grand_total); console.log(result.status); ``` You don't pass a device serial number or an auth token — POS+ uses its own registered device identity for the order. ## Response highlights `PPMultiPaymentResponseModel` includes `id`, `orderCode`, the computed `grandTotal`, `subTotal`, `taxAmount`, `totalPaid`, `amountDue`, `status` ([`PPOrderStatusEnum`](/docs/a2a/reference#pporderstatusenum)), the resolved `products` and `transactions`, tax breakdown `taxs`, optional `customer`, `document` and `webhook` info. See the full field list in the [Reference](/docs/a2a/reference#ppmultipaymentresponsemodel). ## Create an order without payment `createOrder` (`ORDER_CREATE`) creates the order in POS+ but does not start a payment. Collect it later with [`startOrderPayment`](/docs/a2a/payments#pay-an-existing-order) using the same `orderCode`. If the `orderCode` already exists in POS+, the order is updated instead. The request takes the same fields as `startMultiPayment`, except `transactions`, `changePaymentStatus`, `canTryAgain` and `startTime`. The response, `PPOrderCreateResponseModel`, is the same order detail as [`PPMultiPaymentResponseModel`](/docs/a2a/reference#ppmultipaymentresponsemodel). Available from Flutter 0.7.0 and React Native 0.3.0; not available in the native package. Flutter Kotlin Java React Native ```dart await _pluspay.createOrder( PPOrderCreateRequest.toRequest( orderCode: 'ORD001', orderDate: DateTime.now(), products: [ ProductModel( id: 1, sku: 'SKU-001', title: 'Product 1', price: 100.0, quantity: 1, taxRate: 10, unit: PPQtyEnums.ADET, vatInclude: true, productType: PPProductTypeEnum.PHYSICALLY, discountValue: 0, ), ], ), ); // Collect it later: await _pluspay.startOrderPayment( PPOrderPaymentRequestModel.toRequest(orderCode: 'ORD001'), ); ``` ```kotlin // Not available in pluspay_a2a_native yet. ``` ```java // Not available in pluspay_a2a_native yet. ``` ```ts await client.createOrder( PPOrderCreateRequest.toRequest({ orderCode: 'ORD001', orderDate: new Date(), products: [ { id: 1, sku: 'SKU-001', title: 'Product 1', price: 100, quantity: 1, taxRate: 10, unit: PPQtyEnums.ADET, vatInclude: true, productType: PPProductTypeEnum.PHYSICALLY, discountValue: 0, }, ], }) ); // Collect it later: await client.startOrderPayment( PPOrderPaymentRequestModel.toRequest({ orderCode: 'ORD001' }) ); ``` --- # End-of-day, Parameters & Payment methods URL: /docs/a2a/operations Trigger end-of-day settlement and parameter updates on POS+, and query the available payment methods. Besides payments, the A2A client can trigger two maintenance operations on POS+, **end-of-day** settlement and **parameter** updates, and ask POS+ which **payment methods** are currently available. ## End-of-day (settlement) `triggerEod` runs the end-of-day / settlement (gün sonu) on POS+ for the selected providers. Returns a [`PPEodResponseModel`](/docs/a2a/reference#ppeodresponsemodel) with a per-type result list. ### Parameters | Parameter | Type | Required | Description | | --------- | --------------------------------------------------- | -------- | --------------------------------------- | | `types` | List\<[`PPEodType`](/docs/a2a/reference#ppeodtype)> | no | Providers to settle | | `isAll` | bool | no | Settle every provider (default `false`) | Flutter Kotlin Java React Native ```dart final result = await _pluspay.triggerEod( PPEodRequestModel.toRequest( isAll: false, types: [PPEodType.POS, PPEodType.MULTINET], ), ); for (final item in result.results) { print('${item.eodType} success=${item.success} ${item.errorMessage}'); } ``` ```kotlin val request = PPEodRequestModel.toRequest( is_all = false, types = listOf(PPEodType.POS, PPEodType.MULTINET), ) val result = client.triggerEod(request) ``` ```java String request = PPEodRequestModel.toRequest( Arrays.asList(PPEodType.POS, PPEodType.MULTINET), false // is_all ); client.triggerEod(request, new PPA2ACallback() { @Override public void onSuccess(PPEodResponseModel r) {} @Override public void onError(PlusPayException e) {} }); ``` ```ts const result = await client.triggerEod( PPEodRequestModel.toRequest({ isAll: false, types: [PPEodType.POS, PPEodType.MULTINET], }) ); result.results?.forEach((item) => console.log(item.eod_type, item.success, item.error_message) ); ``` ## Parameter update `triggerParameters` asks POS+ to refresh provider parameters (bank, wallet, …). Returns a [`PPParametersResponseModel`](/docs/a2a/reference#ppparametersresponsemodel). ### Parameters | Parameter | Type | Required | Description | | --------- | ----------------------------------------------------------------- | -------- | ----------------------------------- | | `types` | List\<[`PPParameterTypes`](/docs/a2a/reference#ppparametertypes)> | no | Parameter groups to update | | `isAll` | bool | no | Update everything (default `false`) | Flutter Kotlin Java React Native ```dart final result = await _pluspay.triggerParameters( PPParameterRequestModel.toRequest( isAll: true, ), ); for (final r in result.results) { print('${r.type} completed=${r.completed} ${r.errorMessage}'); } ``` ```kotlin val request = PPParameterRequestModel.toRequest( is_all = true, ) val result = client.triggerParameters(request) ``` ```java String request = PPParameterRequestModel.toRequest( Collections.emptyList(), true // is_all ); client.triggerParameters(request, new PPA2ACallback() { @Override public void onSuccess(PPParametersResponseModel r) {} @Override public void onError(PlusPayException e) {} }); ``` ```ts const result = await client.triggerParameters( PPParameterRequestModel.toRequest({ isAll: true }) ); result.results?.forEach((r) => console.log(r.type, r.completed, r.error_message) ); ``` ## Available payment methods `getAvailablePaymentMethods` returns the payment types and methods that can be used on POS+ right now. The list is already filtered by the logged-in profile and the device: for example `CASH` is missing when the user has no cash permission, and `SWIPE` is added for Multinet / Metropol on physical POS terminals. Use it to show only the options that will actually work. The request has no parameters other than the optional `locale`. Returns a [`PPAvailablePaymentMethodsResponseModel`](/docs/a2a/reference#ppavailablepaymentmethodsresponsemodel). Available from Flutter 0.6.0 and React Native 0.2.0; not available in the native package. Flutter Kotlin Java React Native ```dart final res = await _pluspay.getAvailablePaymentMethods( PPAvailablePaymentMethodsRequestModel.toRequest(), ); for (final type in res.paymentTypes) { print('${type.code} -> ${type.methods}'); } ``` ```kotlin // Not available in pluspay_a2a_native yet. ``` ```java // Not available in pluspay_a2a_native yet. ``` ```ts const res = await client.getAvailablePaymentMethods( PPAvailablePaymentMethodsRequestModel.toRequest() ); res.payment_types?.forEach((t) => console.log(t.code, t.methods)); ``` Continue to [Status queries & recovery](/docs/a2a/recovery). --- # Payments URL: /docs/a2a/payments Start payments, cancel payments, EFT-POS payments and order payments. This page covers the single-transaction payment operations. They all return a [`PPStartPaymentResponseModel`](/docs/a2a/reference#ppstartpaymentresponsemodel) (except order payment, which returns [`PPOrderPaymentResponseModel`](/docs/a2a/reference#pporderpaymentresponsemodel)). Each request is created with a `toRequest(...)` factory. Flutter and React Native use `camelCase` parameter names; the native Android package uses `snake_case`. ## Start a payment Starts a new payment on POS+ for an order. The order must first be created via the API. The `orderCode` you pass must belong to that order; otherwise an **order not found** error is returned. ### Parameters | Parameter | Type | Required | Description | | -------------------- | ------------------------------------------------------------------ | -------- | --------------------------------- | | `orderCode` | String | yes | Your unique order code | | `paymentType` | [`PPPaymentType`](/docs/a2a/reference#pppaymenttype) | yes | e.g. `POS`, `CASH` | | `paymentMethod` | [`PPPaymentMethod`](/docs/a2a/reference#pppaymentmethod) | yes | e.g. `CC`, `QR`, `NFC` | | `totalAmount` | double | yes | Total amount to charge | | `installment` | int | no | Number of installments | | `isPartial` | bool | no | Partial payment (default `false`) | | `partialType` | [`PPPartialPaymentType`](/docs/a2a/reference#pppartialpaymenttype) | no | `AMOUNT` or `PRODUCT` | | `products` | List\ | no | Line items (`id`, `qty`) | | `billingInformation` | PPBillingInfo | no | Invoice / billing details | Flutter Kotlin Java React Native ```dart final result = await _pluspay.startPayment( PPStartPaymentRequestModel.toRequest( orderCode: 'ORD001', totalAmount: 11.9, paymentType: PPPaymentType.POS, paymentMethod: PPPaymentMethod.CC, ), ); print(result.status); // transaction status print(result.id); // POS+ transaction id print(result.payment?.rrn); // bank reference number ``` ```kotlin val request = PPStartPaymentRequestModel.toRequest( order_code = "ORD001", total_amount = 11.9, payment_type = PPPaymentType.POS, payment_method = PPPaymentMethod.CC, ) // Coroutine style val result = client.startPayment(request) // or callback style client.startPayment(request, object : PPA2ACallback { override fun onSuccess(result: PPStartPaymentResponseModel) { // handle success } override fun onError(e: PlusPayException) { // handle error } }) ``` ```java String request = PPStartPaymentRequestModel.toRequest( "ORD001", // order_code 11.9, // total_amount PPPaymentType.POS, // payment_type PPPaymentMethod.CC // payment_method ); client.startPayment(request, new PPA2ACallback() { @Override public void onSuccess(PPStartPaymentResponseModel result) { // handle success } @Override public void onError(PlusPayException e) { // handle error } }); ``` ```ts const result = await client.startPayment( PPStartPaymentRequestModel.toRequest({ orderCode: 'ORD001', totalAmount: 11.9, paymentType: PPPaymentType.POS, paymentMethod: PPPaymentMethod.CC, }) ); console.log(result.status); // transaction status console.log(result.id); // POS+ transaction id console.log(result.rrn); // bank reference number ``` For a partial payment set `isPartial: true` and provide `partialType` (`AMOUNT` or `PRODUCT`). For product-based partial payments also pass `products`. ## Cancel a payment Cancels a previously completed payment by its transaction id. ### Parameters | Parameter | Type | Required | Description | | --------------- | ------ | -------- | ----------------------------------- | | `transactionId` | String | yes | Id returned by the original payment | | `orderCode` | String | yes | The original order code | | `note` | String | no | Free-text cancellation note | Flutter Kotlin Java React Native ```dart await _pluspay.cancelPayment( PPCancelPaymentRequestModel.toRequest( orderCode: 'ORD001', transactionId: '539c5225-0741-4f0e-b460-1fdb842c2c16', note: 'Customer cancelled', ), ); ``` ```kotlin val request = PPCancelPaymentRequestModel.toRequest( order_code = "ORD001", transaction_id = "539c5225-0741-4f0e-b460-1fdb842c2c16", note = "Customer cancelled", ) val result = client.cancelPayment(request) ``` ```java String request = PPCancelPaymentRequestModel.toRequest( "ORD001", "539c5225-0741-4f0e-b460-1fdb842c2c16", "Customer cancelled" ); client.cancelPayment(request, new PPA2ACallback() { @Override public void onSuccess(PPStartPaymentResponseModel r) {} @Override public void onError(PlusPayException e) {} }); ``` ```ts await client.cancelPayment( PPCancelPaymentRequestModel.toRequest({ orderCode: 'ORD001', transactionId: '539c5225-0741-4f0e-b460-1fdb842c2c16', note: 'Customer cancelled', }) ); ``` ## EFT-POS payment Starts a payment directly on the EFT-POS device. Requires a tax rate. ### Parameters | Parameter | Type | Required | Description | | --------------- | -------------------------------------------------------- | -------- | ---------------------- | | `totalAmount` | double | yes | Amount to charge | | `paymentType` | [`PPPaymentType`](/docs/a2a/reference#pppaymenttype) | yes | Payment type | | `paymentMethod` | [`PPPaymentMethod`](/docs/a2a/reference#pppaymentmethod) | yes | Payment method | | `transactionId` | String | yes | Your transaction id | | `taxRate` | int | yes | Applied tax rate (%) | | `installment` | int | no | Number of installments | Flutter Kotlin Java React Native ```dart await _pluspay.startEftPayment( PPEftPaymentRequestModel.toRequest( totalAmount: 3.0, paymentType: PPPaymentType.POS, paymentMethod: PPPaymentMethod.CC, transactionId: '27517a85-cfc3-4eee-b83b-63dc6bcb9fd6', taxRate: 0, ), ); ``` ```kotlin val request = PPEftPaymentRequestModel.toRequest( total_amount = 3.0, payment_type = PPPaymentType.POS, payment_method = PPPaymentMethod.CC, transaction_id = "27517a85-cfc3-4eee-b83b-63dc6bcb9fd6", tax_rate = 0, ) val result = client.startEftPayment(request) ``` ```java String request = PPEftPaymentRequestModel.toRequest( 3.0, PPPaymentType.POS, PPPaymentMethod.CC, "27517a85-cfc3-4eee-b83b-63dc6bcb9fd6", 0 // tax_rate ); client.startEftPayment(request, new PPA2ACallback() { @Override public void onSuccess(PPStartPaymentResponseModel r) {} @Override public void onError(PlusPayException e) {} }); ``` ```ts await client.startEftPayment( PPEftPaymentRequestModel.toRequest({ totalAmount: 3.0, paymentType: PPPaymentType.POS, paymentMethod: PPPaymentMethod.CC, transactionId: '27517a85-cfc3-4eee-b83b-63dc6bcb9fd6', taxRate: 0, }) ); ``` ## Cancel an EFT-POS payment ### Parameters | Parameter | Type | Required | Description | | --------------- | ------ | -------- | ----------------------------- | | `transactionId` | String | yes | The EFT transaction id | | `totalAmount` | double | yes | Amount of the EFT transaction | Flutter Kotlin Java React Native ```dart await _pluspay.cancelEftPayment( PPEftCancelRequestModel.toRequest( transactionId: 'a111ed26-ed2b-4f0b-9d6c-82056e52c96c', totalAmount: 3.0, ), ); ``` ```kotlin val request = PPEftCancelRequestModel.toRequest( transaction_id = "a111ed26-ed2b-4f0b-9d6c-82056e52c96c", total_amount = 3.0, ) val result = client.cancelEftPayment(request) ``` ```java String request = PPEftCancelRequestModel.toRequest( "a111ed26-ed2b-4f0b-9d6c-82056e52c96c", 3.0 ); client.cancelEftPayment(request, new PPA2ACallback() { @Override public void onSuccess(PPStartPaymentResponseModel r) {} @Override public void onError(PlusPayException e) {} }); ``` ```ts await client.cancelEftPayment( PPEftCancelRequestModel.toRequest({ transactionId: 'a111ed26-ed2b-4f0b-9d6c-82056e52c96c', totalAmount: 3.0, }) ); ``` ## Pay an existing order Pays an order that already exists in POS+, addressed only by its order code. Returns a [`PPOrderPaymentResponseModel`](/docs/a2a/reference#pporderpaymentresponsemodel) containing the order totals and the list of transaction results. ### Parameters | Parameter | Type | Required | Description | | ----------- | ------ | -------- | ------------------------------- | | `orderCode` | String | yes | The existing order code in POS+ | Flutter Kotlin Java React Native ```dart final result = await _pluspay.startOrderPayment( PPOrderPaymentRequestModel.toRequest( orderCode: 'ORD001', ), ); print(result.status); // PPOrderStatusEnum print(result.amountDue); for (final r in result.results) { print('${r.completed} ${r.errorMessage}'); } ``` ```kotlin val request = PPOrderPaymentRequestModel.toRequest( order_code = "ORD001", ) val result = client.startOrderPayment(request) ``` ```java String request = PPOrderPaymentRequestModel.toRequest( "ORD001" ); client.startOrderPayment(request, new PPA2ACallback() { @Override public void onSuccess(PPOrderPaymentResponseModel r) {} @Override public void onError(PlusPayException e) {} }); ``` ```ts const result = await client.startOrderPayment( PPOrderPaymentRequestModel.toRequest({ orderCode: 'ORD001' }) ); console.log(result.status); // order status console.log(result.amount_due); result.results?.forEach((r) => console.log(r.completed, r.error_message)); ``` Next: [Multi-payment](/docs/a2a/multi-payment) for product-based orders with multiple transactions. --- # Status queries & recovery URL: /docs/a2a/recovery Query the final state of a transaction or an order and reverse a card transaction with a technical cancel. Sometimes a request ends without a clear answer. POS+ may have been closed mid-transaction, the request may have failed with `PP_A2A_014` (timeout) or `PP_A2A_007` (unexpected error), or your own app may have crashed after the customer paid. POS+ always keeps the authoritative record of the order, so **ask POS+ what happened before you retry**. Retrying a payment blindly can charge the customer twice. | Operation | Method | Header fields | Result | | ----------------------- | ---------------------- | ------------------------------ | -------------------------------------------------------------------------------------- | | `TRANSACTION_RESULT` | `getTransactionResult` | `order_code`, `transaction_id` | [`PPStartPaymentResponseModel`](/docs/a2a/reference#ppstartpaymentresponsemodel) | | `ORDER_RESULT` | `getOrderResult` | `order_code` | [`PPOrderPaymentResponseModel`](/docs/a2a/reference#pporderpaymentresponsemodel) | | `POST_TECHNICAL_CANCEL` | `technicalCancel` | `order_code`, `transaction_id` | [`PPTechnicalCancelResponseModel`](/docs/a2a/reference#pptechnicalcancelresponsemodel) | All three operations carry only a header; there is no `data` block. They are available from **Flutter `pluspay_a2a` 0.8.0** and **React Native `pluspay-a2a-react-native` 0.4.0**. The native Android package (`pluspay_a2a_native`) does not support them yet. ## Query a transaction `getTransactionResult` looks up the order by `orderCode` and returns the transaction with the given `transactionId`, in the same shape as a `startPayment` response. Read `status` to learn the final state (`SUCCESS`, `FAIL`, `CANCEL`, `WAITING`, `NOT_RESPONSE`, `NONE`). POS+ opens no payment screen and charges nothing. `transactionId` is the `id` of the payment response you received earlier. If you never received a response, you don't know the transaction id, so use [`getOrderResult`](#query-an-order) instead. If the order has no transaction with that id, the request fails with `PP_A2A_016`. ### Parameters | Parameter | Type | Required | Description | | --------------- | ------ | -------- | ------------------------------------------------------------------------------- | | `orderCode` | String | yes | Order code of the transaction | | `transactionId` | String | yes | POS+ transaction id (`id` of the payment response) | | `locale` | String | no | UI language for this request, see [Language](/docs/a2a/initialization#language) | Flutter Kotlin Java React Native ```dart final tx = await _pluspay.getTransactionResult( PPTransactionResultRequestModel.toRequest( orderCode: 'ORD001', transactionId: 'TX-123', ), ); print(tx.status); // e.g. "SUCCESS" print(tx.totalPaid); ``` ```kotlin // Not available in pluspay_a2a_native yet. ``` ```java // Not available in pluspay_a2a_native yet. ``` ```ts const tx = await client.getTransactionResult( PPTransactionResultRequestModel.toRequest({ orderCode: 'ORD001', transactionId: 'TX-123', }) ); console.log(tx.status); // e.g. "SUCCESS" ``` ## Query an order `getOrderResult` returns the order totals and **every transaction on the order**, including transactions that were not started by your app (for example payments taken on the web or on another device). Unlike [`startOrderPayment`](/docs/a2a/payments#pay-an-existing-order) it does not open a payment screen. For each item in `results`, `completed` is `true` only when the transaction status is `SUCCESS`, and `data` holds the transaction details. If the order cannot be fetched (for example an unknown order code), the request fails with `PP_A2A_012`. Because the list can contain transactions made outside your app, `paymentType` and `paymentMethod` may hold values your app never sends. Handle them defensively. Since Flutter 0.8.0 unknown values decode as `UNKNOWN` instead of throwing. ### Parameters | Parameter | Type | Required | Description | | ----------- | ------ | -------- | ---------------------------- | | `orderCode` | String | yes | The order code | | `locale` | String | no | UI language for this request | Flutter Kotlin Java React Native ```dart final order = await _pluspay.getOrderResult( PPOrderResultRequestModel.toRequest(orderCode: 'ORD001'), ); print('${order.status} paid=${order.totalPaid} due=${order.amountDue}'); for (final r in order.results) { print('${r.data?.id} completed=${r.completed}'); } ``` ```kotlin // Not available in pluspay_a2a_native yet. ``` ```java // Not available in pluspay_a2a_native yet. ``` ```ts const order = await client.getOrderResult( PPOrderResultRequestModel.toRequest({ orderCode: 'ORD001' }) ); console.log(order.status, order.total_paid, order.amount_due); order.results?.forEach((r) => console.log(r.data?.id, r.completed)); ``` ## Technical cancel `technicalCancel` reverses a card transaction on the payment terminal and reports the outcome to PlusPay. Use it when a card payment went through but your side of the sale could not be completed and the payment must be reversed. For regular, user-initiated cancellations use [`cancelPayment`](/docs/a2a/payments#cancel-a-payment). On success the response is `{ order_code, transaction_id, status: "SUCCESS" }`. If the reversal fails, the request fails with `PP_A2A_012`. Technical cancel is only supported on terminals whose payment SDK offers a reversal (currently PAX and Kozen devices). On other devices the request fails with `PP_A2A_012`. ### Parameters | Parameter | Type | Required | Description | | --------------- | ------ | -------- | ------------------------------ | | `orderCode` | String | yes | Order code of the transaction | | `transactionId` | String | yes | POS+ transaction id to reverse | | `locale` | String | no | UI language for this request | Flutter Kotlin Java React Native ```dart final res = await _pluspay.technicalCancel( PPTechnicalCancelRequestModel.toRequest( orderCode: 'ORD001', transactionId: 'TX-123', ), ); print(res.status); // "SUCCESS" ``` ```kotlin // Not available in pluspay_a2a_native yet. ``` ```java // Not available in pluspay_a2a_native yet. ``` ```ts const res = await client.technicalCancel( PPTechnicalCancelRequestModel.toRequest({ orderCode: 'ORD001', transactionId: 'TX-123', }) ); console.log(res.status); // "SUCCESS" ``` ## Recommended recovery flow 1. A payment request failed with `PP_A2A_014` or `PP_A2A_007`, or your app restarted before it received a result. **Do not retry the payment yet.** 2. If you have the `transactionId`, call `getTransactionResult`. Otherwise call `getOrderResult` with the `orderCode` you generated. 3. If the transaction is `SUCCESS`, treat it as paid. If you cannot complete the sale on your side, reverse it with `technicalCancel` (or `cancelPayment`). 4. If there is no transaction, or it is `FAIL` / `CANCEL`, it is safe to retry the payment. 5. If a request fails with `PP_A2A_015`, POS+ is still processing an earlier request. Wait for that request to finish, then query. Continue to [Error handling](/docs/a2a/error-handling). --- # Reference URL: /docs/a2a/reference Enums and response model fields for the PlusPay A2A packages. This page lists the request header, every enum and the fields of each response model. Enum values are identical across Flutter, Kotlin, Java and React Native. ## Request header Every request carries a `header` object. The `toRequest` factories fill it in for you. | Field | Type | Description | | ------------------ | ----------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | `transaction_type` | [`PPTransactionType`](#pptransactiontype) | Operation to run (required) | | `order_code` | String? | Required by `POST_PAYMENT_START`, `POST_PAYMENT_CANCEL`, `ORDER_PAYMENT`, `POST_TECHNICAL_CANCEL`, `TRANSACTION_RESULT`, `ORDER_RESULT` | | `transaction_id` | String? | Required by `POST_EFTPOS_CANCEL`, `POST_TECHNICAL_CANCEL`, `TRANSACTION_RESULT` | | `locale` | String? | UI language while POS+ handles the request: `tr`, `en`, `ar`, `de`, `fr`, `it`, `es`, `ru`, `zh` (`lang` is accepted as an alias). See [Language](/docs/a2a/initialization#language) | ## Enums ### PPTransactionType `POST_PAYMENT_START`, `POST_PAYMENT_CANCEL`, `POST_EFTPOS`, `POST_EFTPOS_CANCEL`, `ORDER_PAYMENT`, `EOD`, `PARAMETERS`, `ORDER_MULTI_PAYMENT`, `AVAILABLE_PAYMENT_METHODS`, `ORDER_CREATE`, `POST_TECHNICAL_CANCEL`, `TRANSACTION_RESULT`, `ORDER_RESULT` ### PPPaymentType `POS`, `PAYCELL`, `HEPSIPAY`, `ISTANBULCARD`, `CASH`, `ONLINE`, `BANK_TRANSFER`, `GASTROPAY`, `CIO_CARD`, `IWALLET`, `PAYE`, `MULTINET`, `METROPOL`, `FASTPAY`, `TICKET`, `EDENRED`, `SETCARD`, `SODEXO`, `GETIRPAY`, `TOKENFLEX`, `YEMEKMATIK`, `ON_CREDIT`, `VIRTUAL_POS`, `CUZDANPLUS`, `INSTALLMENT` ### PPPaymentMethod `CC`, `CASH`, `QR`, `QR_R`, `NFC`, `QUICKCODE`, `MOBILE`, `SWIPE`, `NONE`, `ONLINE`, `TRENDYOL`, `GETIR`, `YEMEKSEPETI`, `MIGROSYEMEK`, `CHIP`, `LINK`, `NFC_R`, `PAYCELL_LINK`, `PAYCELL_MERCHANT_PAGE` ### PPPartialPaymentType `AMOUNT`, `PRODUCT` ### PPEodType `POS`, `CASH`, `BANK_TRANSFER`, `ONLINE`, `OTHER`, `MULTINET`, `SODEXO`, `SETCARD`, `TICKET`, `METROPOL`, `PAYE`, `TOKENFLEX`, `EDENRED`, `CUZDANPLUS`, `IWALLET` ### PPParameterTypes `bank`, `multinet`, `metropol`, `paye`, `iwallet` ### PPOrderStatusEnum `CANCEL`, `NOT_RESPONSE`, `WAITING`, `SUCCESS` ### PPDeliveryStatusEnum `WAITING`, `PREPREING`, `READY`, `ONWAY`, `COMPLETE`, `CANCEL` ### PPDeliveryTypeEnum `CASH_ORDER`, `PACKAGE_ORDER`, `TABLE_ORDER`, `TAKE_AWAY`, `TAKE_CLOSE` ### PPCurrencyType `TRY`, `USD`, `EUR`, `GBP` ### PPProductTypeEnum `PHYSICALLY`, `VIRTUAL`, `INFO`, `MD`, `DSN`, `QP`, `KFO`, `COMMISSION`, `HGS` ### PPQtyEnums `ADET`, `KG`, `GR`, `LT`, `MT`, `KOLI`, `PAKET`, `PORSIYON` ### PPDiscountTypeEnum `PERCENTAGE`, `FIXED_AMOUNT` ### PPDocumentTypeEnum `EFATURA`, `EARSIV`, `BILGIFISI` ### PPDocumentStatusEnum `SUCCESS`, `CANCEL`, `FAIL`, `WAITING`, `NONE` ### PPTransactionStatusEnum `SUCCESS`, `CANCEL`, `FAIL`, `NONE`, `WAITING`, `NOT_RESPONSE` ### PPTransactionTypeEnum `START`, `SATIS`, `CANCEL`, `REFUND`, `IADE` ### PPOrderSourceEnum `POS`, `WEB`, `KIOSK` ## Response models ### PPStartPaymentResponseModel Returned by `startPayment`, `cancelPayment`, `startEftPayment`, `cancelEftPayment` and `getTransactionResult`. | Field | Type | Notes | | --------------- | --------------------- | ------------------------------------------------------------------------------ | | `paymentType` | PPPaymentType | unknown or missing values decode as `PPPaymentType.UNKNOWN` (Flutter 0.8.0+) | | `paymentMethod` | PPPaymentMethod | unknown or missing values decode as `PPPaymentMethod.UNKNOWN` (Flutter 0.8.0+) | | `isPartial` | bool | default `false` | | `partialType` | PPPartialPaymentType? | | | `id` | String | required — POS+ transaction id | | `orderCode` | String | required | | `totalAmount` | double | required | | `totalPaid` | double? | | | `amountDue` | double? | | | `source` | String? | | | `status` | String? | transaction status, see [`PPTransactionStatusEnum`](#pptransactionstatusenum) | | `actionStatus` | bool? | | | `invoice` | PPInvoiceModel? | | | `payment` | PPPaymentModel? | `rrn`, `cardNumberMasked`, `slip[]` | | `delivery` | PPDeliveryModel? | `type`, `status` | `PPInvoiceModel`: `id` (required), `ettn`, `number`, `type`, `date`, `name`, `identity`, `taxOffice`, `urn`, `url`. ### PPOrderPaymentResponseModel Returned by `startOrderPayment` and `getOrderResult`. For `getOrderResult`, `results` contains every transaction on the order and `completed` is `true` only for `SUCCESS` transactions. | Field | Type | | ------------- | ------------------------------- | | `grandTotal` | double | | `status` | PPOrderStatusEnum | | `orderCode` | String | | `totalAmount` | double | | `totalPaid` | double | | `amountDue` | double | | `results` | List\ | `PPOrderTransactionResult`: `completed` (bool), `errorMessage` (String?), `data` (PPStartPaymentResponseModel?). ### PPEodResponseModel Returned by `triggerEod`. `results`: List\ where each item has `eodType` (PPEodType), `success` (bool), `errorMessage` (String?). ### PPParametersResponseModel Returned by `triggerParameters`. `results`: List\ where each item has `completed` (bool), `type` (PPParameterTypes), `errorMessage` (String?). ### PPAvailablePaymentMethodsResponseModel Returned by `getAvailablePaymentMethods`. `paymentTypes`: List\ where each item has `code` (PPPaymentType), `methods` (List\) and `title` (String?). ### PPTechnicalCancelResponseModel Returned by `technicalCancel`. | Field | Type | Notes | | --------------- | ------ | ----------------------------------------------- | | `orderCode` | String | | | `transactionId` | String | | | `status` | String | always `SUCCESS`; failures are thrown as errors | ### PPMultiPaymentResponseModel Returned by `startMultiPayment`. `createOrder` returns the same structure as `PPOrderCreateResponseModel`. Key fields: | Field | Type | | --------------------------------------------- | --------------------------------- | | `id` / `orderCode` | String | | `products` | List\ | | `transactions` | List\ | | `paymentType` / `paymentMethod` | PPPaymentType / PPPaymentMethod | | `status` | PPOrderStatusEnum | | `totalAmount` / `discountAmount` / `subTotal` | double | | `taxAmount` / `grandTotal` | double | | `taxs` | List\ | | `totalPaid` / `amountDue` | double | | `preTotal` | PPMultiPaymentPreTotal | | `orderDate` / `createdAt` | String | | `customer` | PPMultiPaymentCustomer? | | `currency` | PPCurrencyType? | | `installment` | int? | | `isPartial` | bool? | | `deliveryType` | PPDeliveryTypeEnum | | `deliveryStatus` | PPDeliveryStatusEnum? | | `source` | PPOrderSourceEnum (default `POS`) | | `webhook` | PPMultiPaymentWebhook? | `PPMultiPaymentTransaction` includes `id`, `paymentType`, `paymentMethod`, `totalAmount`, `createdAt`, `status` (PPTransactionStatusEnum), `type` (PPTransactionTypeEnum), `transactionId`, `rrn`, `cardInfo` (PPMultiPaymentCardInfo), `document` (PPMultiPaymentDocument), `installment`. `PPMultiPaymentDocument`: `status` (PPDocumentStatusEnum?), `id`, `type` (PPDocumentTypeEnum?), `ettn`, `number`, `url`. --- # Commands URL: /docs/lan/commands Every LAN transaction_type with its header fields, data and reply. All examples omit `api_key` and `secret_key` for brevity; send them in every header. A successful reply is the bare result object. An error reply always has `error_code` — check for that field first. See [Errors](/docs/lan/errors). ## Overview | `transaction_type` | Header | Data | Reply | | --------------------------------------------------------- | ------------------------------ | --------------------------------------------------------- | -------------------------------------- | | [`POST_EFTPOS`](#post_eftpos) | — | amount, payment type/method, `transaction_id`, `tax_rate` | Transaction | | [`ORDER_CREATE`](#order_create) | — | order with products | Order detail | | [`POST_PAYMENT_START`](#post_payment_start) | `order_code` | payment type/method, amount | Transaction | | [`ORDER_MULTI_PAYMENT`](#order_multi_payment) | — | order with products and transactions | Order detail | | [`ORDER_PAYMENT`](#order_payment) | `order_code` | — | Order | | [`POST_PAYMENT_CANCEL`](#post_payment_cancel) | `order_code` | `transaction_id`, `note?` | Transaction | | [`POST_EFTPOS_CANCEL`](#post_eftpos_cancel) | `transaction_id` | `total_amount` | Transaction | | [`POST_TECHNICAL_CANCEL`](#post_technical_cancel) | `order_code`, `transaction_id` | — | `{order_code, transaction_id, status}` | | [`TRANSACTION_RESULT`](#transaction_result) | `order_code`, `transaction_id` | — | Transaction | | [`ORDER_RESULT`](#order_result) | `order_code` | — | Order | | [`AVAILABLE_PAYMENT_METHODS`](#available_payment_methods) | — | — | `{payment_types}` | | [`EOD`](#eod) | — | `is_all`, `types` | `{results}` | | [`PARAMETERS`](#parameters) | — | `is_all`, `types` | `{results}` | There are no print or device-information commands. ## POST_EFTPOS Charges an amount without products. The device creates the order itself; its `order_code` equals the `transaction_id` you send. ```json title="Request" { "header": { "transaction_type": "POST_EFTPOS" }, "data": { "total_amount": 410, "payment_type": "POS", "payment_method": "CC", "transaction_id": "27517a85-cfc3-4eee-b83b-63dc6bcb9fd6", "tax_rate": 10, "installment": 0 } } ``` `tax_rate` is an integer. The reply is a [Transaction](/docs/lan/reference#transaction). ## ORDER_CREATE Creates an order with products on the device without collecting it. If the `order_code` already exists, the order is updated. ```json title="Request" { "header": { "transaction_type": "ORDER_CREATE" }, "data": { "order_code": "SIP-1042", "order_date": "2026-11-09 12:30", "currency": "TRY", "delivery_type": "CASH_ORDER", "discount_amount": 0, "products": [ { "id": 101, "sku": "BRG-CLS", "title": "Hamburger", "unit": "ADET", "price": 185, "quantity": 2, "tax_rate": 10, "vat_include": true, "product_type": "PHYSICALLY", "discount_value": 0 } ] } } ``` `order_date` uses `yyyy-MM-dd HH:mm`. Product `id` and `tax_rate` are integers. See [Order fields](/docs/lan/reference#order-create) for optional fields (`customer`, `note`, `serial_no`, `order_number`, …). ## POST_PAYMENT_START Starts a payment for an existing order — created with `ORDER_CREATE` or through the Public API. The device generates the transaction id. ```json title="Request" { "header": { "transaction_type": "POST_PAYMENT_START", "order_code": "SIP-1042" }, "data": { "payment_type": "POS", "payment_method": "CC", "total_amount": 410 } } ``` ```json title="Reply" { "payment_type": "POS", "payment_method": "CC", "is_partial": false, "partial_type": null, "id": "f0ece50e-9c49-432a-8d9a-9347be210c8c", "order_code": "SIP-1042", "total_amount": 410, "total_paid": 410, "amount_due": 0, "status": "SUCCESS", "action_status": true, "payment": { "rrn": "531309004217", "card_number_masked": "535576******4721", "slip": [] } } ``` Optional data fields: `installment`, `is_partial`, `partial_type` (`AMOUNT` or `PRODUCT`), `products` (`[{ "id", "qty" }]` for product-based partial payments) and `billing_information`. Store the transaction `id`. You need it for `POST_PAYMENT_CANCEL`, `POST_TECHNICAL_CANCEL` and `TRANSACTION_RESULT`. ## ORDER_MULTI_PAYMENT Creates the order and settles it with one or more transactions in a single call. `data` is the same as [`ORDER_CREATE`](#order_create) plus `transactions`: ```json "transactions": [ { "payment_type": "CASH", "total_amount": 100, "payment_method": "CASH" }, { "payment_type": "POS", "total_amount": 310, "payment_method": "CC" } ] ``` Optional: `change_payment_status`, `can_try_again`, `installment`. ## ORDER_PAYMENT Opens the payment selection on the device for an existing order; the cashier chooses the method. The reply is an [Order](/docs/lan/reference#order). ```json { "header": { "transaction_type": "ORDER_PAYMENT", "order_code": "SIP-1042" } } ``` ## POST_PAYMENT_CANCEL Cancels a completed payment. ```json { "header": { "transaction_type": "POST_PAYMENT_CANCEL", "order_code": "SIP-1042" }, "data": { "transaction_id": "f0ece50e-9c49-432a-8d9a-9347be210c8c", "note": "Customer returned the item" } } ``` ## POST_EFTPOS_CANCEL Cancels a `POST_EFTPOS` payment. ```json { "header": { "transaction_type": "POST_EFTPOS_CANCEL", "transaction_id": "27517a85-cfc3-4eee-b83b-63dc6bcb9fd6" }, "data": { "total_amount": 410 } } ``` ## POST_TECHNICAL_CANCEL Reverses a card transaction whose outcome your system could not record — for example when the result arrived but your software crashed before saving it. ```json { "header": { "transaction_type": "POST_TECHNICAL_CANCEL", "order_code": "SIP-1042", "transaction_id": "f0ece50e-…" } } ``` The reply is `{ "order_code", "transaction_id", "status": "SUCCESS" }`; a failure comes back as an error. ## TRANSACTION_RESULT Returns one transaction of an order. The `source` field is filled in. Unknown `transaction_id` → `PP_A2A_016`. ```json { "header": { "transaction_type": "TRANSACTION_RESULT", "order_code": "SIP-1042", "transaction_id": "f0ece50e-…" } } ``` ## ORDER_RESULT Returns the order totals and every transaction on it. Use it after a dropped connection when you do not have the transaction id. ```json title="Request" { "header": { "transaction_type": "ORDER_RESULT", "order_code": "SIP-1042" } } ``` ```json title="Reply" { "grand_total": 410, "status": "SUCCESS", "order_code": "SIP-1042", "total_amount": 410, "total_paid": 410, "amount_due": 0, "results": [{ "completed": true, "error_message": null, "data": { "id": "f0ece50e-…", "status": "SUCCESS" } }] } ``` `completed` is `true` only for `SUCCESS` transactions. The order is paid when `amount_due` is `0`. ## AVAILABLE_PAYMENT_METHODS Lists the payment types and methods enabled on the device. ```json title="Reply" { "payment_types": [{ "code": "POS", "methods": ["CC", "NFC", "QR"], "title": "Kredi kartı" }] } ``` ## EOD Runs end-of-day. `is_all: true` closes every type; otherwise list them in `types` ([EodType](/docs/lan/reference#enums)). An empty list with `is_all: false` → `PP_A2A_004`. ```json { "header": { "transaction_type": "EOD" }, "data": { "is_all": false, "types": ["POS", "CASH"] } } ``` Reply: `{ "results": [{ "eod_type", "success", "error_message" }] }`. ## PARAMETERS Downloads parameters for `bank`, `multinet`, `metropol`, `paye`, `iwallet` or `sodexo`. Same rules as `EOD`; an empty list → `PP_A2A_005`. Reply: `{ "results": [{ "completed", "type", "error_message" }] }`. --- # Connection URL: /docs/lan/connection Enable local communication on the device, discover it, open a TCP connection and authenticate. ## Enable on the device Local communication is **off by default**. On the POS+ device: 1. Open **Settings → Local communication** (the screen is protected by the settings PIN). 2. Turn on **LAN**. 3. Note the IPv4 address and the TCP port shown on the screen. The default port is `8471`; you can change it to any value between `1024` and `65535` except `8470`. The same screen lists the clients that are connected right now, which is useful while you develop. ## Discovery If you do not know the device address, broadcast a UDP datagram to port `8470`: ```json title="UDP → 255.255.255.255:8470" { "type": "PLUSPAY_DISCOVER" } ``` Every POS+ device with local communication enabled answers to the sender: ```json title="UDP ← 192.168.1.40" { "type": "PLUSPAY_POS", "serial_no": "PBD522C630205", "port": 8471, "name": "Kasa 1" } ``` Connect to the **address the answer came from** and the `port` in it. To find one specific device, add `"serial_no"` to the discovery message; only that device answers. Discovery is optional. In a fixed installation, store the IP address and serial number in your configuration instead. ## Framing * One message is **one line of UTF-8 JSON** followed by `\n` (`\r\n` is also accepted). Do not pretty-print. * The reply comes back on the **same connection**, also as one line. * There is **no correlation id**. Replies arrive in the order of the requests; a connection processes requests one after another. * You may keep the connection open for several requests or open a new one each time. Set `TCP_NODELAY` for snappier small writes. Every message has the same shape: ```json { "header": { "transaction_type": "POST_PAYMENT_START", "order_code": "SIP-1042", "api_key": "…", "secret_key": "…" }, "data": { "payment_type": "POS", "payment_method": "CC", "total_amount": 410 } } ``` | Header field | Required | Description | | ------------------ | ----------- | ----------------------------------------------------------- | | `transaction_type` | yes | The operation. See [Commands](/docs/lan/commands). | | `api_key` | yes | From the Credentials page. | | `secret_key` | yes | From the Credentials page. | | `order_code` | per command | Your order code. | | `transaction_id` | per command | A POS+ transaction id. | | `lang` | no | UI language while POS+ handles the request (`tr`, `en`, …). | ## Authentication Before running a request the device checks, in order: 1. POS+ has finished starting up. Otherwise → `PP_A2A_017`. 2. Someone has logged in to POS+ on the device. Otherwise → `PP_A2A_011`. 3. `header.api_key` and `header.secret_key` are present. Otherwise → `PP_A2A_003`. 4. The keys are valid. The device checks them online with PlusPay; a rejection gives `PP_A2A_003`, an unreachable server gives `PP_A2A_017`. There is no pairing, IP allow-list or signature. Keys are masked in the device logs. Keep `api_key` and `secret_key` out of source control and screenshots. Read them from environment variables or your configuration store. Sandbox keys work only with a sandbox device, production keys only with a production device. ## Timeouts | Phase | Recommended timeout | | ------------------------------------------------------- | ------------------- | | TCP connect | 10 s | | `ORDER_CREATE`, `*_RESULT`, `AVAILABLE_PAYMENT_METHODS` | 30 s | | Payments, cancellations, `EOD`, `PARAMETERS` | **900 s** | The device has no server-side timeout on payments: the reply comes when the cashier is done. If your connection drops in the meantime, the operation still completes on the device — see [Recovery](/docs/lan/errors#recovery). ## USB serial The same framing also works over a USB serial cable: 115200 baud, 8N1, DTR and RTS on. FTDI, CP210x, PL2303 and CH34x adapters are supported. Authentication and commands are identical. --- # Errors URL: /docs/lan/errors Error replies, which results are definite, recovery after a dropped connection, and concurrency. An error reply has a code and a message and nothing else: ```json { "error_code": "PP_A2A_012", "error_message": "İşlem sırasında hata oluştu: Kart reddedildi" } ``` Detect errors by the **presence of `error_code`**. `error_message` is always Turkish and can be shown to the cashier; branch your logic on the code. ## Error codes | Code | Meaning | Result | | ------------ | ----------------------------------------------------------------------------- | ------------ | | `PP_A2A_001` | The request is empty. | Not started | | `PP_A2A_002` | `data` is missing or is not an object. | Not started | | `PP_A2A_003` | `api_key` / `secret_key` missing or invalid. | Not started | | `PP_A2A_004` | Invalid `EOD`: `is_all` is false and `types` is empty. | Not started | | `PP_A2A_005` | Invalid `PARAMETERS`: `is_all` is false and `types` is empty. | Not started | | `PP_A2A_006` | Invalid request parameter. | Not started | | `PP_A2A_007` | Unexpected error while handling the request. | **Unknown** | | `PP_A2A_008` | `header` is missing. | Not started | | `PP_A2A_009` | `transaction_type` is missing or unknown. | Not started | | `PP_A2A_010` | A header field this command needs is missing. | Not started | | `PP_A2A_011` | Nobody is logged in to POS+ on the device. | Not started | | `PP_A2A_012` | The operation failed: declined, cancelled by the user, order closed … | **Definite** | | `PP_A2A_015` | The device is busy with another request. | Not started | | `PP_A2A_016` | `TRANSACTION_RESULT`: no transaction with that id. | Definite | | `PP_A2A_017` | Authentication could not be performed (device offline or server unreachable). | Not started | ## Recovery The device completes an operation even when your connection drops. If you send a payment and do not get a reply — a socket error, a timeout, your software restarted — the customer may already have paid. Never send the payment again just because the reply did not arrive. Query first. Charging twice is the most expensive integration bug. 1. Before sending a payment, persist the `order_code` as *result unknown*. 2. If the reply arrives, record it and clear the flag. 3. Otherwise open a new connection and send [`ORDER_RESULT`](/docs/lan/commands#order_result) with that `order_code` (or [`TRANSACTION_RESULT`](/docs/lan/commands#transaction_result) if you have the transaction id). 4. `amount_due: 0` → paid. Otherwise nothing was collected and you may start a new payment. 5. Do the same at start-up for every order still flagged. The same applies to `PP_A2A_007`. ## Concurrency A POS+ device runs **one operation at a time**, across all clients — another till, another connection or an App2App app on the device itself. A request that arrives while one is running is rejected at once with `PP_A2A_015`. * Do not send requests in parallel, not even on separate connections. * On `PP_A2A_015`, wait and retry; show the cashier that the device is busy. * Within one connection, requests are handled in order, so a queue on your side is only needed when several parts of your software share a device. --- # Introduction URL: /docs/lan Drive a POS+ device from your POS software over the local network with line-delimited JSON over TCP. The **LAN** integration lets software that runs on another machine — a Windows till, a kitchen display, a kiosk backend — send App2App requests to a POS+ device on the same local network. The device performs the payment and answers on the same connection. It is the same request model as [App2App](/docs/a2a): a JSON object with a `header` and a `data` part, the same operations and the same `PP_A2A_*` error codes. Only the transport differs: instead of an Android intent, the message travels as **one line of JSON over TCP**. ## How it works ``` ┌──────────────────┐ 1. {"header":…,"data":…}\n ┌──────────────┐ │ │ ────────────────────────────▶ │ │ │ Your POS │ TCP :8471 │ POS+ device │ │ software │ │ │ │ │ ◀──────────────────────────── │ 2. cashier │ └──────────────────┘ 3. one line of JSON\n │ + card │ └──────────────┘ ``` 1. Your software opens a TCP connection to the device (port `8471` by default) and writes a request as a single line ending with `\n`. 2. POS+ comes to the foreground and runs the operation: the customer taps the card, the cashier confirms cash, and so on. 3. When the receipt screen closes, the device writes the result as a single line on the same connection. Payment calls are **long-running**. The reply arrives only after the cashier finishes, which can take minutes. Use a read timeout of at least 900 seconds and never treat a slow reply as a failure. ## When to use LAN | Situation | Use | | --------------------------------------------------------- | ------------------------------ | | Your app runs on the POS+ device itself | [App2App](/docs/a2a) | | Your server sends orders over the internet | [Public API](/docs/public-api) | | Your software runs on another machine on the same network | **LAN** | LAN needs the internet only to validate your keys. The payment request itself does not leave the local network until POS+ talks to the bank. ## Requirements * A POS+ device on Android (SoftPOS is not supported) with **Local communication** turned on. See [Connection](/docs/lan/connection#enable-on-the-device). * POS+ logged in on the device at least once. * Your `api_key` and `secret_key` from the **Credentials** page of the developer portal. They are sent in every request header. * Network access from your machine to the device on TCP `8471` (and UDP `8470` if you use discovery). ## Next steps * [Connection](/docs/lan/connection) — enabling the device, discovery, framing and authentication * [Commands](/docs/lan/commands) — every `transaction_type` with request and response * [Errors](/docs/lan/errors) — error codes, recovery and concurrency * [Reference](/docs/lan/reference) — models and enums --- # Reference URL: /docs/lan/reference LAN message models and enums. Field names are `snake_case`. Amounts are numbers in the order currency, VAT-inclusive. ## Transaction Returned by `POST_EFTPOS`, `POST_PAYMENT_START`, `POST_PAYMENT_CANCEL`, `POST_EFTPOS_CANCEL` and `TRANSACTION_RESULT`. | Field | Type | Notes | | ---------------- | ----------------------------- | -------------------------------------------------------------------- | | `id` | string | POS+ transaction id | | `order_code` | string | | | `payment_type` | PaymentType | | | `payment_method` | PaymentMethod | | | `is_partial` | bool | | | `partial_type` | `AMOUNT` \| `PRODUCT` \| null | | | `total_amount` | number | | | `total_paid` | number | | | `amount_due` | number | | | `status` | TransactionStatus | | | `action_status` | bool | | | `source` | string \| null | filled by `TRANSACTION_RESULT` | | `invoice` | object \| null | `id, ettn, number, type, date, name, identity, tax_office, urn, url` | | `payment` | object \| null | `rrn, card_number_masked, slip[]` | | `delivery` | object \| null | `type, status` | ## Order Returned by `ORDER_RESULT` and `ORDER_PAYMENT`. | Field | Type | | -------------- | ------------------------------------------------------------------------- | | `order_code` | string | | `status` | OrderStatus | | `grand_total` | number | | `total_amount` | number | | `total_paid` | number | | `amount_due` | number | | `results` | `[{ completed: bool, error_message: string \| null, data: Transaction }]` | ## Order create `data` of `ORDER_CREATE` and `ORDER_MULTI_PAYMENT`. | Field | Required | Type | | ---------------------------------------------------------------------------- | ------------- | ----------------------------------------------------------------------------- | | `order_code` | yes | string | | `order_date` | yes | string, `yyyy-MM-dd HH:mm` | | `currency` | yes | `TRY`, `USD`, `EUR`, `GBP` | | `delivery_type` | yes | DeliveryType | | `discount_amount` | yes | number | | `products` | yes | Product\[] | | `transactions` | multi-payment | `[{ payment_type, total_amount, payment_method? }]` | | `note`, `user_id`, `serial_no`, `group_code`, `order_number`, `special_code` | no | string | | `customer` | no | `{ code, name, phone, email, address, city, district, identity, tax_office }` | | `installment` | no | int | | `delivery_status` | no | string | | `change_payment_status`, `can_try_again` | no | bool | **Product** (all required): `id` (int), `sku`, `title`, `unit` (`ADET`, `KG`, `GR`, `LT`, `MT`, `KOLI`, `PAKET`, `PORSIYON`), `price`, `quantity`, `tax_rate` (int), `vat_include` (bool), `product_type` (`PHYSICALLY`, `VIRTUAL`, …), `discount_value`. The reply is the order detail: `id`, `order_code`, `status`, `products`, `transactions`, `sub_total`, `tax_amount`, `grand_total`, `total_paid`, `amount_due`, … ## Enums **PaymentType** — `POS`, `CASH`, `INSTALLMENT`, `PAYCELL`, `HEPSIPAY`, `ISTANBULCARD`, `ONLINE`, `BANK_TRANSFER`, `GASTROPAY`, `CIO_CARD`, `IWALLET`, `PAYE`, `MULTINET`, `METROPOL`, `FASTPAY`, `TICKET`, `EDENRED`, `SETCARD`, `SODEXO`, `GETIRPAY`, `TOKENFLEX`, `YEMEKMATIK`, `ON_CREDIT`, `VIRTUAL_POS`, `CUZDANPLUS` **PaymentMethod** — `CC`, `NFC`, `QR`, `CASH`, `CHIP`, `SWIPE`, `NFC_R`, `QR_R`, `QUICKCODE`, `MOBILE`, `LINK`, `NONE`, `PAYCELL_LINK`, `PAYCELL_MERCHANT_PAGE`, `ONLINE`, `TRENDYOL`, `GETIR`, `YEMEKSEPETI`, `MIGROSYEMEK` **TransactionStatus** — `SUCCESS`, `CANCEL`, `FAIL`, `NONE`, `WAITING`, `NOT_RESPONSE` **OrderStatus** — `SUCCESS`, `CANCEL`, `WAITING`, `NOT_RESPONSE` **DeliveryType** — `CASH_ORDER`, `PACKAGE_ORDER`, `TABLE_ORDER`, `TAKE_AWAY`, `TAKE_CLOSE` **EodType** — `POS`, `CASH`, `BANK_TRANSFER`, `ONLINE`, `OTHER`, `MULTINET`, `SODEXO`, `SETCARD`, `TICKET`, `METROPOL`, `PAYE`, `TOKENFLEX`, `EDENRED`, `CUZDANPLUS`, `IWALLET` --- # Authentication URL: /docs/public-api/authentication Authentication — PlusPay Public API. ## `POST /v1/auth` **Token alma işlemini başlatır. / Initiates the process of obtaining an auth token.** > Authorization: `Authorization: Bearer ` is required. ### Request body `Content-Type: application/json` | Field | Type | Required | Description | | ------------- | -------- | -------- | ----------- | | `api_key` | `string` | Yes | Api Key | | `secret_key` | `string` | Yes | Secret Key | | `merchant_id` | `string` | Yes | Merchant Id | *Example request* ```json { "api_key": "string", "secret_key": "string", "merchant_id": "string" } ``` ### Responses | Status | Schema | Description | | ------ | --------------------- | ---------------- | | `200` | `AuthPayloadResponse` | OK | | `400` | `BadRequestDto` | BAD_REQUEST | | `401` | `UnauthorizedDto` | UNAUTHORIZED | | `403` | `ForbiddenDto` | FORBIDDEN | | `404` | `NotFoundDto` | NOT_FOUND | | `409` | `DuplicateDto` | DUPLICATE_ERROR | | `422` | `ValidationDto` | Validation Error | *`AuthPayloadResponse`* | Field | Type | Required | Description | | -------------- | -------------------- | -------- | ----------------------------------- | | `token_type` | `string` | Yes | Token Tipi
`e.g. Bearer` | | `access_token` | `string` | Yes | Token
`e.g. 2024-02-18 17:15` | | `expires_in` | `string (date-time)` | Yes | Token bitiş süresi (Unix time) | *** --- # Branches URL: /docs/public-api/branches Branches — PlusPay Public API. ## `GET /v1/branchs` **Şube listesini döndürür.** > Authorization: `Authorization: Bearer ` is required. ### Responses | Status | Schema | Description | | ------ | ----------------- | ------------ | | `200` | — | OK | | `400` | `BadRequestDto` | BAD_REQUEST | | `401` | `UnauthorizedDto` | UNAUTHORIZED | | `403` | `ForbiddenDto` | FORBIDDEN | | `404` | `NotFoundDto` | NOT_FOUND | *** --- # Categories URL: /docs/public-api/categories Categories — PlusPay Public API. ## `GET /v1/category` **Ürün Kategorilerini listeler. / Lists product categories.** > Authorization: `Authorization: Bearer ` is required. ### Responses | Status | Schema | Description | | ------ | ------------------------ | ------------ | | `200` | `CategoryItemResponse[]` | OK | | `400` | `BadRequestDto` | BAD_REQUEST | | `401` | `UnauthorizedDto` | UNAUTHORIZED | | `403` | `ForbiddenDto` | FORBIDDEN | | `404` | `NotFoundDto` | NOT_FOUND | *`CategoryItemResponse`* | Field | Type | Required | Description | | ------------ | --------- | -------- | ------------------------------------------------------------- | | `id` | `string` | Yes | Kategori Id
`e.g. 500b0c7d-acf7-4ada-8b38-3fac86eade9b` | | `code` | `string` | No | Kategori Kodu
`e.g. ABC0001` | | `name` | `string` | Yes | Kategori Adı
`e.g. İçecekler` | | `is_active` | `boolean` | Yes | Durumu
`e.g. True` | | `is_various` | `boolean` | No | Muhtelif Ürün kategorisi mi?
`e.g. True` | *** ## `POST /v1/category` **Yeni Kategori Oluşturur. / Creates a new product category.** > Authorization: `Authorization: Bearer ` is required. ### Request body `Content-Type: application/json` | Field | Type | Required | Description | | ------------ | --------- | -------- | ---------------------------------------------- | | `code` | `string` | No | Kategori Kodu
`e.g. ABC0001` | | `name` | `string` | Yes | Kategori Adı
`e.g. İçecekler` | | `is_active` | `boolean` | Yes | Durumu
`e.g. True` | | `is_various` | `boolean` | No | Muhtelif Ürün kategorisi mi?
`e.g. True` | *Example request* ```json { "code": "ABC0001", "name": "İçecekler", "is_active": true, "is_various": true } ``` ### Responses | Status | Schema | Description | | ------ | ---------------------- | ---------------- | | `200` | `CategoryItemResponse` | OK | | `400` | `BadRequestDto` | BAD_REQUEST | | `401` | `UnauthorizedDto` | UNAUTHORIZED | | `403` | `ForbiddenDto` | FORBIDDEN | | `404` | `NotFoundDto` | NOT_FOUND | | `409` | `DuplicateDto` | DUPLICATE_ERROR | | `422` | `ValidationDto` | Validation Error | *`CategoryItemResponse`* | Field | Type | Required | Description | | ------------ | --------- | -------- | ------------------------------------------------------------- | | `id` | `string` | Yes | Kategori Id
`e.g. 500b0c7d-acf7-4ada-8b38-3fac86eade9b` | | `code` | `string` | No | Kategori Kodu
`e.g. ABC0001` | | `name` | `string` | Yes | Kategori Adı
`e.g. İçecekler` | | `is_active` | `boolean` | Yes | Durumu
`e.g. True` | | `is_various` | `boolean` | No | Muhtelif Ürün kategorisi mi?
`e.g. True` | *** ## `PUT /v1/category/{category_id}` **Kategori Günceller. / Updates the existing category.** > Authorization: `Authorization: Bearer ` is required. ### Parameters | Field | In | Type | Required | Description | | ------------- | ---- | -------- | -------- | ----------- | | `category_id` | path | `string` | Yes | | ### Request body `Content-Type: application/json` | Field | Type | Required | Description | | ------------ | --------- | -------- | ---------------------------------------------- | | `code` | `string` | No | Kategori Kodu
`e.g. ABC0001` | | `name` | `string` | Yes | Kategori Adı
`e.g. İçecekler` | | `is_active` | `boolean` | Yes | Durumu
`e.g. True` | | `is_various` | `boolean` | No | Muhtelif Ürün kategorisi mi?
`e.g. True` | *Example request* ```json { "code": "ABC0001", "name": "İçecekler", "is_active": true, "is_various": true } ``` ### Responses | Status | Schema | Description | | ------ | ----------------- | ---------------- | | `200` | `CompletedDto` | OK | | `400` | `BadRequestDto` | BAD_REQUEST | | `401` | `UnauthorizedDto` | UNAUTHORIZED | | `403` | `ForbiddenDto` | FORBIDDEN | | `404` | `NotFoundDto` | NOT_FOUND | | `422` | `ValidationDto` | Validation Error | *`CompletedDto`* | Field | Type | Required | Description | | ----------- | --------- | -------- | ---------------------------------- | | `completed` | `boolean` | Yes | Islem Durumu
`default: True` | *** ## `DELETE /v1/category/{category_id}` **Kategori Siler. / Deletes the category.** > Authorization: `Authorization: Bearer ` is required. ### Parameters | Field | In | Type | Required | Description | | ------------- | ---- | -------- | -------- | ----------- | | `category_id` | path | `string` | Yes | | ### Responses | Status | Schema | Description | | ------ | ----------------- | ---------------- | | `200` | `CompletedDto` | OK | | `400` | `BadRequestDto` | BAD_REQUEST | | `401` | `UnauthorizedDto` | UNAUTHORIZED | | `403` | `ForbiddenDto` | FORBIDDEN | | `404` | `NotFoundDto` | NOT_FOUND | | `422` | `ValidationDto` | Validation Error | *`CompletedDto`* | Field | Type | Required | Description | | ----------- | --------- | -------- | ---------------------------------- | | `completed` | `boolean` | Yes | Islem Durumu
`default: True` | *** ## `GET /v1/category/{category_id}/products` **Kategori ve kategoriye ait ürünleri getirir. / Retrieves a specific category and its associated products.** > Authorization: `Authorization: Bearer ` is required. ### Parameters | Field | In | Type | Required | Description | | ------------- | ---- | -------- | -------- | ----------- | | `category_id` | path | `string` | Yes | | ### Responses | Status | Schema | Description | | ------ | -------------------------- | ------------ | | `200` | `CategoryItemWithProducts` | OK | | `400` | `BadRequestDto` | BAD_REQUEST | | `401` | `UnauthorizedDto` | UNAUTHORIZED | | `403` | `ForbiddenDto` | FORBIDDEN | | `404` | `NotFoundDto` | NOT_FOUND | *`CategoryItemWithProducts`* | Field | Type | Required | Description | | ------------ | ------------------ | -------- | ------------------------------------------------------------- | | `id` | `string` | Yes | Kategori Id
`e.g. 500b0c7d-acf7-4ada-8b38-3fac86eade9b` | | `code` | `string` | No | Kategori Kodu
`e.g. ABC0001` | | `name` | `string` | Yes | Kategori Adı
`e.g. İçecekler` | | `is_active` | `boolean` | Yes | Durumu
`e.g. True` | | `is_various` | `boolean` | No | Muhtelif Ürün kategorisi mi?
`e.g. True` | | `products` | `ProductItemDto[]` | No | Ürünler | *** --- # Collection via Physical POS URL: /docs/public-api/collection-pos Collection via Physical POS — PlusPay Public API. ## `POST /v1/payment/{order_code}/start` **Tahsilat işlemini başlatır. / Initiates the payment collection process.** > Authorization: `Authorization: Bearer ` is required. ### Parameters | Field | In | Type | Required | Description | | ------------ | ---- | -------- | -------- | ----------- | | `order_code` | path | `string` | Yes | | ### Request body `Content-Type: application/json` | Field | Type | Required | Description | | --------------------- | ----------------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `serial_no` | `string` | Yes | Terminal Seri No
`e.g. PBD522C630205` | | `total_amount` | `number` | No | Ödenecek tutar
`default: 11.9` | | `payment_type` | `string` | Yes | Tahsilat Türü
Allowed values: `POS`, `PAYCELL`, `PAYE`, `MULTINET`, `METROPOL`, `CASH`, `ONLINE`, `BANK_TRANSFER`, `CIO_CARD`, `FASTPAY`, `TICKET`, `SETCARD`, `SODEXO`, `GETIRPAY`, `TOKENFLEX`, `YEMEKMATIK`, `ON_CREDIT`, `CUZDANPLUS`, `ISTANBULCARD`, `HEPSIPAY`, `GASTROPAY`, `EDENRED`, `IWALLET`, `SOFTPOS` | | `payment_method` | `string` | Yes | Tahsilat Yönetimi
Allowed values: `QR`, `QR_R`, `NFC`, `CASH`, `CC`, `FAST`, `NONE`, `MOBILE`, `ONLINE`, `CUZDANPLUS`, `MYOZU`, `DYNAMIC_QR`, `GETIR`, `TRENDYOL`, `YEMEKSEPETI`, `YEMEKSEPEETI`, `MIGROSYEMEK`, `QUICKCODE`, `CHIP`, `SWIPE`, `NFC_R` | | `installment` | `number` | No | Taksit sayısı
`e.g. 0` | | `is_partial` | `boolean` | No | Parçalı ödeme mi?
`e.g. False` | | `partial_type` | `string` | No | Parçalı ödeme aktif ise hangi tipte
Allowed values: `PRODUCT`, `AMOUNT` | | `products` | `PaymentPartialProductItem[]` | Yes | Parçalı ödeme tipi ürün ise hangi ürünler tahsil edilecek | | `invoice_status` | `boolean` | No | Fatura kesilecek mi?
`e.g. False` | | `billing_information` | `OrderCustomerDto` | Yes | Fatura bilgileri | *Example request* ```json { "serial_no": "PBD522C630205", "total_amount": 11.9, "payment_type": "POS", "payment_method": "CC", "installment": 0, "is_partial": false, "partial_type": "PRODUCT", "products": [ { "id": null, "qty": null } ], "invoice_status": false, "billing_information": { "code": null, "name": null, "phone": null, "email": null, "address": null, "city": null, "district": null, "identity": null, "tax_office": null } } ``` ### Responses | Status | Schema | Description | | ------ | ----------------- | ---------------- | | `200` | `PaymentResponse` | OK | | `400` | `BadRequestDto` | BAD_REQUEST | | `401` | `UnauthorizedDto` | UNAUTHORIZED | | `403` | `ForbiddenDto` | FORBIDDEN | | `404` | `NotFoundDto` | NOT_FOUND | | `409` | `DuplicateDto` | DUPLICATE_ERROR | | `422` | `ValidationDto` | Validation Error | *`PaymentResponse`* | Field | Type | Required | Description | | ---------------- | ------------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `payment_type` | `string` | Yes | Tahsilat Türü
Allowed values: `POS`, `PAYCELL`, `PAYE`, `MULTINET`, `METROPOL`, `CASH`, `ONLINE`, `BANK_TRANSFER`, `CIO_CARD`, `FASTPAY`, `TICKET`, `SETCARD`, `SODEXO`, `GETIRPAY`, `TOKENFLEX`, `YEMEKMATIK`, `ON_CREDIT`, `CUZDANPLUS`, `ISTANBULCARD`, `HEPSIPAY`, `GASTROPAY`, `EDENRED`, `IWALLET`, `SOFTPOS` | | `payment_method` | `string` | Yes | Tahsilat Yönetimi
Allowed values: `QR`, `QR_R`, `NFC`, `CASH`, `CC`, `FAST`, `NONE`, `MOBILE`, `ONLINE`, `CUZDANPLUS`, `MYOZU`, `DYNAMIC_QR`, `GETIR`, `TRENDYOL`, `YEMEKSEPETI`, `YEMEKSEPEETI`, `MIGROSYEMEK`, `QUICKCODE`, `CHIP`, `SWIPE`, `NFC_R` | | `is_partial` | `boolean` | No | Parçalı ödeme mi?
`e.g. False` | | `partial_type` | `string` | No | Parçalı ödeme aktif ise hangi tipte
Allowed values: `PRODUCT`, `AMOUNT` | | `id` | `string` | Yes | Islem Id
`e.g. f0ece50e-9c49-432a-8d9a-9347be210c8c` | | `order_code` | `string` | Yes | Sipariş Kodu
`e.g. AAI19112024145102680` | | `total_amount` | `number` | Yes | Toplam Sipariş Tutarı
`e.g. 100.25` | | `total_paid` | `number` | Yes | Ödenecek Tutar
`e.g. 100.25` | | `amount_due` | `number` | Yes | Kalan Tutar
`e.g. 0` | | `source` | `string` | No | Sipariş kaynağı
Allowed values: `POS`, `WEB` | | `status` | `string` | Yes | Tahsilat Islem Durumu
Allowed values: `CANCEL`, `NOT_RESPONSE`, `WAITING`, `SUCCESS`, `FAIL`, `REFUND` | | `action_status` | `boolean` | Yes | Islem Durumu (İşlem sonuçlandı ise true gelir)
`e.g. False` | | `invoice` | `PaymentResponseInvoice` | No | Fatura bilgileri | | `payment` | `PaymentReponsePayment` | No | Tahsilat bilgileri | | `delivery` | `PaymentResponseDelivery` | No | Teslimat bilgileri | *** ## `POST /v1/payment/{order_code}/cancel` **Tahsilatı iptal eder. / Cancels the payment collection.** > Authorization: `Authorization: Bearer ` is required. ### Parameters | Field | In | Type | Required | Description | | ------------ | ---- | -------- | -------- | ----------- | | `order_code` | path | `string` | Yes | | ### Request body `Content-Type: application/json` | Field | Type | Required | Description | | ---------------- | -------- | -------- | ------------------------------------------- | | `transaction_id` | `string` | Yes | Transaction Id | | `note` | `string` | No | İptal Açıklaması | | `serial_no` | `string` | No | Terminal Seri No
`e.g. PBD522C630205` | *Example request* ```json { "transaction_id": "string", "note": "string", "serial_no": "PBD522C630205" } ``` ### Responses | Status | Schema | Description | | ------ | ----------------- | ---------------- | | `200` | `PaymentResponse` | OK | | `400` | `BadRequestDto` | BAD_REQUEST | | `401` | `UnauthorizedDto` | UNAUTHORIZED | | `403` | `ForbiddenDto` | FORBIDDEN | | `404` | `NotFoundDto` | NOT_FOUND | | `409` | `DuplicateDto` | DUPLICATE_ERROR | | `422` | `ValidationDto` | Validation Error | *`PaymentResponse`* | Field | Type | Required | Description | | ---------------- | ------------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `payment_type` | `string` | Yes | Tahsilat Türü
Allowed values: `POS`, `PAYCELL`, `PAYE`, `MULTINET`, `METROPOL`, `CASH`, `ONLINE`, `BANK_TRANSFER`, `CIO_CARD`, `FASTPAY`, `TICKET`, `SETCARD`, `SODEXO`, `GETIRPAY`, `TOKENFLEX`, `YEMEKMATIK`, `ON_CREDIT`, `CUZDANPLUS`, `ISTANBULCARD`, `HEPSIPAY`, `GASTROPAY`, `EDENRED`, `IWALLET`, `SOFTPOS` | | `payment_method` | `string` | Yes | Tahsilat Yönetimi
Allowed values: `QR`, `QR_R`, `NFC`, `CASH`, `CC`, `FAST`, `NONE`, `MOBILE`, `ONLINE`, `CUZDANPLUS`, `MYOZU`, `DYNAMIC_QR`, `GETIR`, `TRENDYOL`, `YEMEKSEPETI`, `YEMEKSEPEETI`, `MIGROSYEMEK`, `QUICKCODE`, `CHIP`, `SWIPE`, `NFC_R` | | `is_partial` | `boolean` | No | Parçalı ödeme mi?
`e.g. False` | | `partial_type` | `string` | No | Parçalı ödeme aktif ise hangi tipte
Allowed values: `PRODUCT`, `AMOUNT` | | `id` | `string` | Yes | Islem Id
`e.g. f0ece50e-9c49-432a-8d9a-9347be210c8c` | | `order_code` | `string` | Yes | Sipariş Kodu
`e.g. AAI19112024145102680` | | `total_amount` | `number` | Yes | Toplam Sipariş Tutarı
`e.g. 100.25` | | `total_paid` | `number` | Yes | Ödenecek Tutar
`e.g. 100.25` | | `amount_due` | `number` | Yes | Kalan Tutar
`e.g. 0` | | `source` | `string` | No | Sipariş kaynağı
Allowed values: `POS`, `WEB` | | `status` | `string` | Yes | Tahsilat Islem Durumu
Allowed values: `CANCEL`, `NOT_RESPONSE`, `WAITING`, `SUCCESS`, `FAIL`, `REFUND` | | `action_status` | `boolean` | Yes | Islem Durumu (İşlem sonuçlandı ise true gelir)
`e.g. False` | | `invoice` | `PaymentResponseInvoice` | No | Fatura bilgileri | | `payment` | `PaymentReponsePayment` | No | Tahsilat bilgileri | | `delivery` | `PaymentResponseDelivery` | No | Teslimat bilgileri | *** ## `GET /v1/payment/{order_code}/result` **Sipariş koduna göre son tahsilat işleminin sonucu getirir. / Retrieves the result of the last payment transaction according to order code.** > Authorization: `Authorization: Bearer ` is required. ### Parameters | Field | In | Type | Required | Description | | ---------------- | ----- | -------- | -------- | -------------- | | `order_code` | path | `string` | Yes | | | `transaction_id` | query | `string` | No | Transaction Id | ### Responses | Status | Schema | Description | | ------ | ----------------- | ------------ | | `200` | `PaymentResponse` | OK | | `400` | `BadRequestDto` | BAD_REQUEST | | `401` | `UnauthorizedDto` | UNAUTHORIZED | | `403` | `ForbiddenDto` | FORBIDDEN | | `404` | `NotFoundDto` | NOT_FOUND | *`PaymentResponse`* | Field | Type | Required | Description | | ---------------- | ------------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `payment_type` | `string` | Yes | Tahsilat Türü
Allowed values: `POS`, `PAYCELL`, `PAYE`, `MULTINET`, `METROPOL`, `CASH`, `ONLINE`, `BANK_TRANSFER`, `CIO_CARD`, `FASTPAY`, `TICKET`, `SETCARD`, `SODEXO`, `GETIRPAY`, `TOKENFLEX`, `YEMEKMATIK`, `ON_CREDIT`, `CUZDANPLUS`, `ISTANBULCARD`, `HEPSIPAY`, `GASTROPAY`, `EDENRED`, `IWALLET`, `SOFTPOS` | | `payment_method` | `string` | Yes | Tahsilat Yönetimi
Allowed values: `QR`, `QR_R`, `NFC`, `CASH`, `CC`, `FAST`, `NONE`, `MOBILE`, `ONLINE`, `CUZDANPLUS`, `MYOZU`, `DYNAMIC_QR`, `GETIR`, `TRENDYOL`, `YEMEKSEPETI`, `YEMEKSEPEETI`, `MIGROSYEMEK`, `QUICKCODE`, `CHIP`, `SWIPE`, `NFC_R` | | `is_partial` | `boolean` | No | Parçalı ödeme mi?
`e.g. False` | | `partial_type` | `string` | No | Parçalı ödeme aktif ise hangi tipte
Allowed values: `PRODUCT`, `AMOUNT` | | `id` | `string` | Yes | Islem Id
`e.g. f0ece50e-9c49-432a-8d9a-9347be210c8c` | | `order_code` | `string` | Yes | Sipariş Kodu
`e.g. AAI19112024145102680` | | `total_amount` | `number` | Yes | Toplam Sipariş Tutarı
`e.g. 100.25` | | `total_paid` | `number` | Yes | Ödenecek Tutar
`e.g. 100.25` | | `amount_due` | `number` | Yes | Kalan Tutar
`e.g. 0` | | `source` | `string` | No | Sipariş kaynağı
Allowed values: `POS`, `WEB` | | `status` | `string` | Yes | Tahsilat Islem Durumu
Allowed values: `CANCEL`, `NOT_RESPONSE`, `WAITING`, `SUCCESS`, `FAIL`, `REFUND` | | `action_status` | `boolean` | Yes | Islem Durumu (İşlem sonuçlandı ise true gelir)
`e.g. False` | | `invoice` | `PaymentResponseInvoice` | No | Fatura bilgileri | | `payment` | `PaymentReponsePayment` | No | Tahsilat bilgileri | | `delivery` | `PaymentResponseDelivery` | No | Teslimat bilgileri | *** ## `GET /v1/payment/{order_code}/result-transactions` **Sipariş koduna göre tüm transactionları getirir. / Retrieves all transactions related to a specific order.** > Authorization: `Authorization: Bearer ` is required. ### Parameters | Field | In | Type | Required | Description | | ------------ | ---- | -------- | -------- | ----------- | | `order_code` | path | `string` | Yes | | ### Responses | Status | Schema | Description | | ------ | ----------------- | ------------ | | `200` | `PaymentResponse` | OK | | `400` | `BadRequestDto` | BAD_REQUEST | | `401` | `UnauthorizedDto` | UNAUTHORIZED | | `403` | `ForbiddenDto` | FORBIDDEN | | `404` | `NotFoundDto` | NOT_FOUND | *`PaymentResponse`* | Field | Type | Required | Description | | ---------------- | ------------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `payment_type` | `string` | Yes | Tahsilat Türü
Allowed values: `POS`, `PAYCELL`, `PAYE`, `MULTINET`, `METROPOL`, `CASH`, `ONLINE`, `BANK_TRANSFER`, `CIO_CARD`, `FASTPAY`, `TICKET`, `SETCARD`, `SODEXO`, `GETIRPAY`, `TOKENFLEX`, `YEMEKMATIK`, `ON_CREDIT`, `CUZDANPLUS`, `ISTANBULCARD`, `HEPSIPAY`, `GASTROPAY`, `EDENRED`, `IWALLET`, `SOFTPOS` | | `payment_method` | `string` | Yes | Tahsilat Yönetimi
Allowed values: `QR`, `QR_R`, `NFC`, `CASH`, `CC`, `FAST`, `NONE`, `MOBILE`, `ONLINE`, `CUZDANPLUS`, `MYOZU`, `DYNAMIC_QR`, `GETIR`, `TRENDYOL`, `YEMEKSEPETI`, `YEMEKSEPEETI`, `MIGROSYEMEK`, `QUICKCODE`, `CHIP`, `SWIPE`, `NFC_R` | | `is_partial` | `boolean` | No | Parçalı ödeme mi?
`e.g. False` | | `partial_type` | `string` | No | Parçalı ödeme aktif ise hangi tipte
Allowed values: `PRODUCT`, `AMOUNT` | | `id` | `string` | Yes | Islem Id
`e.g. f0ece50e-9c49-432a-8d9a-9347be210c8c` | | `order_code` | `string` | Yes | Sipariş Kodu
`e.g. AAI19112024145102680` | | `total_amount` | `number` | Yes | Toplam Sipariş Tutarı
`e.g. 100.25` | | `total_paid` | `number` | Yes | Ödenecek Tutar
`e.g. 100.25` | | `amount_due` | `number` | Yes | Kalan Tutar
`e.g. 0` | | `source` | `string` | No | Sipariş kaynağı
Allowed values: `POS`, `WEB` | | `status` | `string` | Yes | Tahsilat Islem Durumu
Allowed values: `CANCEL`, `NOT_RESPONSE`, `WAITING`, `SUCCESS`, `FAIL`, `REFUND` | | `action_status` | `boolean` | Yes | Islem Durumu (İşlem sonuçlandı ise true gelir)
`e.g. False` | | `invoice` | `PaymentResponseInvoice` | No | Fatura bilgileri | | `payment` | `PaymentReponsePayment` | No | Tahsilat bilgileri | | `delivery` | `PaymentResponseDelivery` | No | Teslimat bilgileri | *** --- # EFT/POS Collection URL: /docs/public-api/eft-pos EFT/POS Collection — PlusPay Public API. ## `POST /v1/eftpos` **Eft Pos modunda işlem başlatır. / It initiates the transaction in EFT POS mode.** > Authorization: `Authorization: Bearer ` is required. ### Request body `Content-Type: application/json` | Field | Type | Required | Description | | ---------------- | -------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `serial_no` | `string` | Yes | Terminal Seri No
`e.g. PBD522C630205` | | `total_amount` | `number` | No | Ödenecek tutar
`default: 11.9` | | `payment_type` | `string` | Yes | Tahsilat Türü
Allowed values: `POS`, `PAYCELL`, `PAYE`, `MULTINET`, `METROPOL`, `CASH`, `ONLINE`, `BANK_TRANSFER`, `CIO_CARD`, `FASTPAY`, `TICKET`, `SETCARD`, `SODEXO`, `GETIRPAY`, `TOKENFLEX`, `YEMEKMATIK`, `ON_CREDIT`, `CUZDANPLUS`, `ISTANBULCARD`, `HEPSIPAY`, `GASTROPAY`, `EDENRED`, `IWALLET`, `SOFTPOS` | | `payment_method` | `string` | Yes | Tahsilat Yönetimi
Allowed values: `QR`, `QR_R`, `NFC`, `CASH`, `CC`, `FAST`, `NONE`, `MOBILE`, `ONLINE`, `CUZDANPLUS`, `MYOZU`, `DYNAMIC_QR`, `GETIR`, `TRENDYOL`, `YEMEKSEPETI`, `YEMEKSEPEETI`, `MIGROSYEMEK`, `QUICKCODE`, `CHIP`, `SWIPE`, `NFC_R` | | `installment` | `number` | No | Taksit sayısı
`e.g. 0` | | `transaction_id` | `string` | Yes | Islem takip numarası (UUID4) - (Unique)
`e.g. 791e30e3-1011-4fd4-b3f6-a7ff6e360533` | | `currency` | `string` | No | Para birimi
Allowed values: `TRY`, `USD`, `EUR`, `GBP` | | `tax_rate` | `number` | Yes | Kdv Oranı
Allowed values: `0`, `1`, `10`, `20` | | `acquirer_id` | `string` | Yes | Acquirer ID | *Example request* ```json { "serial_no": "PBD522C630205", "total_amount": 11.9, "payment_type": "POS", "payment_method": "CC", "installment": 0, "transaction_id": "791e30e3-1011-4fd4-b3f6-a7ff6e360533", "currency": "TRY", "tax_rate": 0, "acquirer_id": "string" } ``` ### Responses | Status | Schema | Description | | ------ | --------------------- | ---------------- | | `200` | `EftPosStartResponse` | OK | | `400` | `BadRequestDto` | BAD_REQUEST | | `401` | `UnauthorizedDto` | UNAUTHORIZED | | `403` | `ForbiddenDto` | FORBIDDEN | | `404` | `NotFoundDto` | NOT_FOUND | | `409` | `DuplicateDto` | DUPLICATE_ERROR | | `422` | `ValidationDto` | Validation Error | *`EftPosStartResponse`* | Field | Type | Required | Description | | ---------------- | -------- | -------- | ----------------------------------------------------------------------------------------- | | `total_amount` | `number` | No | Ödenecek tutar
`default: 11.9` | | `transaction_id` | `string` | Yes | Islem takip numarası (UUID4) - (Unique)
`e.g. 791e30e3-1011-4fd4-b3f6-a7ff6e360533` | *** ## `GET /v1/eftpos/{transaction_id}` **Eft Pos modunda işlem sonucunu döner. / It returns the transaction result in EFT POS mode.** > Authorization: `Authorization: Bearer ` is required. ### Parameters | Field | In | Type | Required | Description | | ---------------- | ---- | -------- | -------- | ----------- | | `transaction_id` | path | `string` | Yes | | ### Responses | Status | Schema | Description | | ------ | ----------------- | ------------ | | `200` | `EftPosResponse` | OK | | `400` | `BadRequestDto` | BAD_REQUEST | | `401` | `UnauthorizedDto` | UNAUTHORIZED | | `403` | `ForbiddenDto` | FORBIDDEN | | `404` | `NotFoundDto` | NOT_FOUND | *`EftPosResponse`* | Field | Type | Required | Description | | ---------------- | ----------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `payment_type` | `string` | Yes | Tahsilat Türü
Allowed values: `POS`, `PAYCELL`, `PAYE`, `MULTINET`, `METROPOL`, `CASH`, `ONLINE`, `BANK_TRANSFER`, `CIO_CARD`, `FASTPAY`, `TICKET`, `SETCARD`, `SODEXO`, `GETIRPAY`, `TOKENFLEX`, `YEMEKMATIK`, `ON_CREDIT`, `CUZDANPLUS`, `ISTANBULCARD`, `HEPSIPAY`, `GASTROPAY`, `EDENRED`, `IWALLET`, `SOFTPOS` | | `payment_method` | `string` | Yes | Tahsilat Yönetimi
Allowed values: `QR`, `QR_R`, `NFC`, `CASH`, `CC`, `FAST`, `NONE`, `MOBILE`, `ONLINE`, `CUZDANPLUS`, `MYOZU`, `DYNAMIC_QR`, `GETIR`, `TRENDYOL`, `YEMEKSEPETI`, `YEMEKSEPEETI`, `MIGROSYEMEK`, `QUICKCODE`, `CHIP`, `SWIPE`, `NFC_R` | | `total_amount` | `number` | Yes | Toplam Sipariş Tutarı
`e.g. 100.25` | | `status` | `string` | Yes | Tahsilat Islem Durumu
Allowed values: `CANCEL`, `NOT_RESPONSE`, `WAITING`, `SUCCESS`, `FAIL`, `REFUND` | | `action_status` | `boolean` | Yes | Islem Durumu (İşlem sonuçlandı ise true gelir)
`e.g. False` | | `payment` | `PaymentReponsePayment` | No | Tahsilat bilgileri | | `transaction_id` | `string` | Yes | Islem takip numarası (UUID4) - (Unique)
`e.g. a8df5467-d5ae-4342-b75b-9b197227f79a` | *** ## `POST /v1/eftpos/{transaction_id}` **Eft Pos modunda iptal/iade süresini başlatır. / It starts the cancellation/refund period in EFT POS mode.** > Authorization: `Authorization: Bearer ` is required. ### Parameters | Field | In | Type | Required | Description | | ---------------- | ---- | -------- | -------- | ----------- | | `transaction_id` | path | `string` | Yes | | ### Request body `Content-Type: application/json` | Field | Type | Required | Description | | -------------- | -------- | -------- | ------------------------------------------- | | `total_amount` | `number` | No | Ödenecek tutar
`default: 11.9` | | `serial_no` | `string` | No | Terminal Seri No
`e.g. PBD522C630205` | *Example request* ```json { "total_amount": 11.9, "serial_no": "PBD522C630205" } ``` ### Responses | Status | Schema | Description | | ------ | ----------------- | ---------------- | | `200` | `CompletedDto` | OK | | `400` | `BadRequestDto` | BAD_REQUEST | | `401` | `UnauthorizedDto` | UNAUTHORIZED | | `403` | `ForbiddenDto` | FORBIDDEN | | `404` | `NotFoundDto` | NOT_FOUND | | `409` | `DuplicateDto` | DUPLICATE_ERROR | | `422` | `ValidationDto` | Validation Error | *`CompletedDto`* | Field | Type | Required | Description | | ----------- | --------- | -------- | ---------------------------------- | | `completed` | `boolean` | Yes | Islem Durumu
`default: True` | *** ## `POST /v1/eftpos/{transaction_id}/void` **Eft Pos modunda teknik iptal/iade süresini başlatır. / It starts the cancellation/refund period in EFT POS mode.** > Authorization: `Authorization: Bearer ` is required. ### Parameters | Field | In | Type | Required | Description | | ---------------- | ---- | -------- | -------- | ----------- | | `transaction_id` | path | `string` | Yes | | ### Request body `Content-Type: application/json` | Field | Type | Required | Description | | -------------- | -------- | -------- | ------------------------------------------- | | `total_amount` | `number` | No | Ödenecek tutar
`default: 11.9` | | `serial_no` | `string` | Yes | Terminal Seri No
`e.g. PBD522C630205` | *Example request* ```json { "total_amount": 11.9, "serial_no": "PBD522C630205" } ``` ### Responses | Status | Schema | Description | | ------ | ----------------- | ---------------- | | `200` | `CompletedDto` | OK | | `400` | `BadRequestDto` | BAD_REQUEST | | `401` | `UnauthorizedDto` | UNAUTHORIZED | | `403` | `ForbiddenDto` | FORBIDDEN | | `404` | `NotFoundDto` | NOT_FOUND | | `409` | `DuplicateDto` | DUPLICATE_ERROR | | `422` | `ValidationDto` | Validation Error | *`CompletedDto`* | Field | Type | Required | Description | | ----------- | --------- | -------- | ---------------------------------- | | `completed` | `boolean` | Yes | Islem Durumu
`default: True` | *** --- # Public API Integration URL: /docs/public-api Order, payment, product and reporting integration with the PlusPay Public API. The PlusPay **Public API** exposes REST endpoints for creating orders, collecting payments via physical POS and EFT/POS, managing products/categories and reporting. All responses are `application/json`. ## Environments | Ortam / Env | Base URL | | ----------- | ----------------------------------------------- | | Production | `https://public-api-live.paymentapi.com.tr/` | | Staging | `https://public-api-staging.paymentapi.com.tr/` | | Development | `https://public-api-dev.paymentapi.com.tr/` | ## Authentication The `api_key`, `secret_key` and `merchant_id` are provided **by the PlusPay team / via the admin panel**. Call `POST /v1/auth` with them and send the returned `access_token` as the `Authorization: Bearer ` header on every subsequent request. The token lifetime is returned in `expires_in`; call `/v1/auth` again when it expires. ## Common conventions All authenticated endpoints optionally accept the `lang` (`tr` / `en`) and `branch_code` (branch code) **headers**. These are not repeated in each endpoint. ## Error body Errors return a standard body: ```json { "error_code": "VALIDATION_ERROR", "message": "..." } ``` | HTTP | `error_code` | | ----- | ------------------ | | `400` | `BAD_REQUEST` | | `401` | `UNAUTHORIZED` | | `403` | `FORBIDDEN` | | `404` | `NOT_FOUND` | | `409` | `DUPLICATE` | | `422` | `VALIDATION_ERROR` | ## Rate limit The `POST /v1/transactions-last-update` endpoint is limited to **max 20 requests per minute**. --- # Orders URL: /docs/public-api/orders Orders — PlusPay Public API. ## `GET /v1/orders` **Sipariş Listesini getirir. / Retrieves a list of orders.** > Authorization: `Authorization: Bearer ` is required. ### Parameters | Field | In | Type | Required | Description | | ---------------- | ----- | -------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `date` | query | `string` | No | Tarih filtresi | | `start_date` | query | `string` | No | Başlangıç tarihi | | `end_date` | query | `string` | No | Bitiş tarihi | | `payment_type` | query | `string` | No | Tahsilat Tipi
Allowed values: `POS`, `PAYCELL`, `PAYE`, `MULTINET`, `METROPOL`, `CASH`, `ONLINE`, `BANK_TRANSFER`, `CIO_CARD`, `FASTPAY`, `TICKET`, `SETCARD`, `SODEXO`, `GETIRPAY`, `TOKENFLEX`, `YEMEKMATIK`, `ON_CREDIT`, `CUZDANPLUS`, `ISTANBULCARD`, `HEPSIPAY`, `GASTROPAY`, `EDENRED`, `IWALLET`, `SOFTPOS` | | `payment_method` | query | `string` | No | Tahsilat Türü
Allowed values: `QR`, `QR_R`, `NFC`, `CASH`, `CC`, `FAST`, `NONE`, `MOBILE`, `ONLINE`, `CUZDANPLUS`, `MYOZU`, `DYNAMIC_QR`, `GETIR`, `TRENDYOL`, `YEMEKSEPETI`, `YEMEKSEPEETI`, `MIGROSYEMEK`, `QUICKCODE`, `CHIP`, `SWIPE`, `NFC_R` | | `status` | query | `string` | No | Sipariş Durumu
Allowed values: `CANCEL`, `NOT_RESPONSE`, `WAITING`, `SUCCESS` | | `serial_no` | query | `string` | No | Cihaz Seri No | | `filter_code` | query | `string` | No | Özel Kod veya Sipariş Numarası | | `source` | query | `string` | No | İşlem Kaynağı
Allowed values: `WEB`, `APP` | ### Responses | Status | Schema | Description | | ------ | --------------------- | ------------ | | `200` | `OrderListResponse[]` | OK | | `400` | `BadRequestDto` | BAD_REQUEST | | `401` | `UnauthorizedDto` | UNAUTHORIZED | | `403` | `ForbiddenDto` | FORBIDDEN | | `404` | `NotFoundDto` | NOT_FOUND | *`OrderListResponse`* | Field | Type | Required | Description | | --------------- | -------- | -------- | ------------------------------------------------------------------------------------------------------- | | `id` | `string` | Yes | Sipariş Id
`e.g. 73de3cfe-3f4b-4adf-9d79-0cfbb105f4fe` | | `order_code` | `string` | Yes | Sipariş Kodu
`e.g. 123456` | | `special_code` | `string` | Yes | Özel Kod | | `group_code` | `string` | No | Özel kategori grup kodu | | `order_date` | `number` | Yes | Sipariş Tarihi
`e.g. 2026-05-06 03:14` | | `total_amount` | `number` | Yes | Sipariş tutarı
`e.g. 11.5` | | `total_paid` | `number` | Yes | Ödenen Tutar
`e.g. 0` | | `payment_type` | `string` | Yes | Tahsilat Tipi
Allowed values: `CC_ONLINE`, `PAYCELL_CASH`, `PAYCELL_CC`, `PAYCELL_QR`, `MULTINET` | | `status` | `string` | Yes | Sipariş Durumu
Allowed values: `CANCEL`, `NOT_RESPONSE`, `WAITING`, `SUCCESS` | | `customer_name` | `string` | Yes | Müşteri Adı
`e.g. Şenol Ş.` | *** ## `POST /v1/orders` **Yeni Sipariş Kaydı. / Creates a new order.** Type ve Enum değerler için Schema kısmını inceleyebilirsiniz. Teslimat Tipi (delivery_type) CASH_ORDER = Kasa TABLE_ORDER = Masa PACKAGE_ORDER = Paket TAKE_AWAY = Gel Al TAKE_CLOSE = Gel Otur Teslimat Durumları: (delivery_status) WAITING = Bekliyor ONWAY = Yolda PREPARING = Hazırlanıyor READY = Hazırlandı COMPLETE = Tamamlandı CANCEL = İptal İptal Durumları: (reason_code) CUSTOMER_CANCELED = Müşteri İptal Etti WRONG_ORDER Hatalı = Sipariş WRONG_ITEMS = Eksik / Hatalı Ürün OUT_OF_DELIVERY_AREA = Teslimat Bölgesi Dışı BUSINESS_CLOSED = İşletme Kapalı BUSINESS_BUSY = İşletme Yoğun CUSTOMER_NOT_FOUND = Müşteri Adreste bulunamadı WRONG_ADDRESS = Hatalı Adres TECHNICAL_PROBLEM = Teknik Problem OTHER = Diğer > Authorization: `Authorization: Bearer ` is required. ### Request body `Content-Type: application/json` | Field | Type | Required | Description | | ----------------- | -------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `order_code` | `string` | Yes | Sipariş Kodu
`e.g. 238868` | | `special_code` | `string` | No | Özel Kod | | `group_code` | `string` | No | Özel kategori grup kodu | | `order_date` | `string (date-time)` | Yes | Sipariş Tarihi
`e.g. 2026-05-06 03:14` | | `discount_amount` | `number` | Yes | Sepet İndirim tutarı
`default: 0` | | `note` | `string` | No | Sipariş Notu
`e.g. Siparişimi kapıya asabilirsiniz.` | | `customer` | `OrderCustomerDto` | No | Müşteri bilgileri | | `payment_type` | `string` | Yes | Tahsilat Tipi
Allowed values: `POS`, `PAYCELL`, `PAYE`, `MULTINET`, `METROPOL`, `CASH`, `ONLINE`, `BANK_TRANSFER`, `CIO_CARD`, `FASTPAY`, `TICKET`, `SETCARD`, `SODEXO`, `GETIRPAY`, `TOKENFLEX`, `YEMEKMATIK`, `ON_CREDIT`, `CUZDANPLUS`, `ISTANBULCARD`, `HEPSIPAY`, `GASTROPAY`, `EDENRED`, `IWALLET`, `SOFTPOS` | | `payment_method` | `string` | No | Tahsilat Türü
Allowed values: `QR`, `QR_R`, `NFC`, `CASH`, `CC`, `FAST`, `NONE`, `MOBILE`, `ONLINE`, `CUZDANPLUS`, `MYOZU`, `DYNAMIC_QR`, `GETIR`, `TRENDYOL`, `YEMEKSEPETI`, `YEMEKSEPEETI`, `MIGROSYEMEK`, `QUICKCODE`, `CHIP`, `SWIPE`, `NFC_R` | | `order_number` | `string` | No | Sipariş Sıra numarası vb.
`e.g. A123` | | `delivery_type` | `string` | No | Teslimat tipi
Allowed values: `CASH_ORDER`, `TABLE_ORDER`, `PACKAGE_ORDER`, `TAKE_AWAY`, `TAKE_CLOSE` | | `delivery_status` | `string` | No | Teslimat Durumu
Allowed values: `WAITING`, `ONWAY`, `PREPARING`, `PREPREING`, `READY`, `COMPLETE`, `CANCEL` | | `currency` | `string` | No | Para birimi
Allowed values: `TRY`, `USD`, `EUR`, `GBP` | | `installment` | `number` | No | Taksit sayısı
`e.g. 0` | | `serial_no` | `string` | No | Terminal Seri No | | `start_payment` | `boolean` | No | Tahsilat işlemi başlatılsın mı? (true gönderilmesi durumunda /start işlemine gerek yoktur.)
`e.g. False` | | `products` | `OrderProductDto[]` | Yes | Sipariş içindeki ürünler | | `user_id` | `string` | No | Kullanıcı Id | *Example request* ```json { "order_code": "238868", "special_code": "string", "group_code": "string", "order_date": "2026-05-06 03:14", "discount_amount": 0, "note": "Siparişimi kapıya asabilirsiniz.", "customer": { "code": null, "name": null, "phone": null, "email": null, "address": null, "city": null, "district": null, "identity": null, "tax_office": null }, "payment_type": "POS", "payment_method": "CC", "order_number": "A123", "delivery_type": "PACKAGE_ORDER", "delivery_status": "ONWAY", "currency": "TRY", "installment": 0, "serial_no": "string", "start_payment": false, "products": [ { "id": null, "sku": null, "title": null, "vat_include": null, "price": null, "quantity": null, "tax_rate": null, "unit": null, "product_type": null, "discount_type": null, "discount_value": null, "description": null, "category_code": null, "category_name": null, "exemption_code": null, "otv_orani": null, "konaklama_orani": null } ], "user_id": "string" } ``` ### Responses | Status | Schema | Description | | ------ | --------------------- | ---------------- | | `200` | `OrderCreateResponse` | OK | | `400` | `BadRequestDto` | BAD_REQUEST | | `401` | `UnauthorizedDto` | UNAUTHORIZED | | `403` | `ForbiddenDto` | FORBIDDEN | | `404` | `NotFoundDto` | NOT_FOUND | | `409` | `DuplicateDto` | DUPLICATE_ERROR | | `422` | `ValidationDto` | Validation Error | *`OrderCreateResponse`* | Field | Type | Required | Description | | -------------- | --------- | -------- | ------------------------------------------------------------ | | `id` | `string` | Yes | Sipariş Id
`e.g. 73de3cfe-3f4b-4adf-9d79-0cfbb105f4fe` | | `order_code` | `string` | Yes | Sipariş Kodu
`e.g. 123456` | | `completed` | `boolean` | Yes | Islem durumu
`e.g. True` | | `total_amount` | `number` | Yes | Sipariş toplam tutarı
`e.g. 11.9` | | `amount_due` | `number` | Yes | Ödenmesi gereken tutar
`e.g. 11.9` | *** ## `GET /v1/orders/{order_code}` **Sipariş Detayını getirir. / Retrieves details of order.** > Authorization: `Authorization: Bearer ` is required. ### Parameters | Field | In | Type | Required | Description | | ------------ | ---- | -------- | -------- | ----------- | | `order_code` | path | `string` | Yes | | ### Responses | Status | Schema | Description | | ------ | --------------------- | ------------ | | `200` | `OrderDetailResponse` | OK | | `400` | `BadRequestDto` | BAD_REQUEST | | `401` | `UnauthorizedDto` | UNAUTHORIZED | | `403` | `ForbiddenDto` | FORBIDDEN | | `404` | `NotFoundDto` | NOT_FOUND | *`OrderDetailResponse`* | Field | Type | Required | Description | | ----------------- | --------------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `order_code` | `string` | Yes | Sipariş Kodu
`e.g. 238868` | | `special_code` | `string` | No | Özel Kod | | `group_code` | `string` | No | Özel kategori grup kodu | | `order_date` | `string (date-time)` | Yes | Sipariş Tarihi
`e.g. 2026-05-06 03:14` | | `discount_amount` | `number` | Yes | Sepet İndirim tutarı
`default: 0` | | `note` | `string` | No | Sipariş Notu
`e.g. Siparişimi kapıya asabilirsiniz.` | | `customer` | `OrderCustomerDto` | No | Müşteri bilgileri | | `payment_type` | `string` | Yes | Tahsilat Tipi
Allowed values: `POS`, `PAYCELL`, `PAYE`, `MULTINET`, `METROPOL`, `CASH`, `ONLINE`, `BANK_TRANSFER`, `CIO_CARD`, `FASTPAY`, `TICKET`, `SETCARD`, `SODEXO`, `GETIRPAY`, `TOKENFLEX`, `YEMEKMATIK`, `ON_CREDIT`, `CUZDANPLUS`, `ISTANBULCARD`, `HEPSIPAY`, `GASTROPAY`, `EDENRED`, `IWALLET`, `SOFTPOS` | | `payment_method` | `string` | No | Tahsilat Türü
Allowed values: `QR`, `QR_R`, `NFC`, `CASH`, `CC`, `FAST`, `NONE`, `MOBILE`, `ONLINE`, `CUZDANPLUS`, `MYOZU`, `DYNAMIC_QR`, `GETIR`, `TRENDYOL`, `YEMEKSEPETI`, `YEMEKSEPEETI`, `MIGROSYEMEK`, `QUICKCODE`, `CHIP`, `SWIPE`, `NFC_R` | | `order_number` | `string` | No | Sipariş Sıra numarası vb.
`e.g. A123` | | `delivery_type` | `string` | No | Teslimat tipi
Allowed values: `CASH_ORDER`, `TABLE_ORDER`, `PACKAGE_ORDER`, `TAKE_AWAY`, `TAKE_CLOSE` | | `delivery_status` | `string` | No | Teslimat Durumu
Allowed values: `WAITING`, `ONWAY`, `PREPARING`, `PREPREING`, `READY`, `COMPLETE`, `CANCEL` | | `currency` | `string` | No | Para birimi
Allowed values: `TRY`, `USD`, `EUR`, `GBP` | | `installment` | `number` | No | Taksit sayısı
`e.g. 0` | | `serial_no` | `string` | No | Terminal Seri No | | `start_payment` | `boolean` | No | Tahsilat işlemi başlatılsın mı? (true gönderilmesi durumunda /start işlemine gerek yoktur.)
`e.g. False` | | `products` | `OrderProductDto[]` | Yes | Sipariş içindeki ürünler | | `user_id` | `string` | No | Kullanıcı Id | | `id` | `string` | Yes | Sipariş Id
`e.g. 73de3cfe-3f4b-4adf-9d79-0cfbb105f4fe` | | `total_paid` | `number` | No | Toplam Tahsil Edilen tutar
`default: 11.9` | | `transactions` | `OrderDetailTransactions[]` | No | Tahsilat işlemleri | *** ## `PUT /v1/orders/{order_code}` **Siparişi günceller. / Updates the order.** > Authorization: `Authorization: Bearer ` is required. ### Parameters | Field | In | Type | Required | Description | | ------------ | ---- | -------- | -------- | ----------- | | `order_code` | path | `string` | Yes | | ### Request body `Content-Type: application/json` | Field | Type | Required | Description | | ----------------- | -------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `special_code` | `string` | No | Özel Kod | | `group_code` | `string` | No | Özel kategori grup kodu | | `order_date` | `string (date-time)` | Yes | Sipariş Tarihi
`e.g. 2026-05-06 03:14` | | `discount_amount` | `number` | Yes | Sepet İndirim tutarı
`default: 0` | | `note` | `string` | No | Sipariş Notu
`e.g. Siparişimi kapıya asabilirsiniz.` | | `customer` | `OrderCustomerDto` | No | Müşteri bilgileri | | `payment_type` | `string` | Yes | Tahsilat Tipi
Allowed values: `POS`, `PAYCELL`, `PAYE`, `MULTINET`, `METROPOL`, `CASH`, `ONLINE`, `BANK_TRANSFER`, `CIO_CARD`, `FASTPAY`, `TICKET`, `SETCARD`, `SODEXO`, `GETIRPAY`, `TOKENFLEX`, `YEMEKMATIK`, `ON_CREDIT`, `CUZDANPLUS`, `ISTANBULCARD`, `HEPSIPAY`, `GASTROPAY`, `EDENRED`, `IWALLET`, `SOFTPOS` | | `payment_method` | `string` | No | Tahsilat Türü
Allowed values: `QR`, `QR_R`, `NFC`, `CASH`, `CC`, `FAST`, `NONE`, `MOBILE`, `ONLINE`, `CUZDANPLUS`, `MYOZU`, `DYNAMIC_QR`, `GETIR`, `TRENDYOL`, `YEMEKSEPETI`, `YEMEKSEPEETI`, `MIGROSYEMEK`, `QUICKCODE`, `CHIP`, `SWIPE`, `NFC_R` | | `order_number` | `string` | No | Sipariş Sıra numarası vb.
`e.g. A123` | | `delivery_type` | `string` | No | Teslimat tipi
Allowed values: `CASH_ORDER`, `TABLE_ORDER`, `PACKAGE_ORDER`, `TAKE_AWAY`, `TAKE_CLOSE` | | `delivery_status` | `string` | No | Teslimat Durumu
Allowed values: `WAITING`, `ONWAY`, `PREPARING`, `PREPREING`, `READY`, `COMPLETE`, `CANCEL` | | `currency` | `string` | No | Para birimi
Allowed values: `TRY`, `USD`, `EUR`, `GBP` | | `installment` | `number` | No | Taksit sayısı
`e.g. 0` | | `serial_no` | `string` | No | Terminal Seri No | | `start_payment` | `boolean` | No | Tahsilat işlemi başlatılsın mı? (true gönderilmesi durumunda /start işlemine gerek yoktur.)
`e.g. False` | | `products` | `OrderProductDto[]` | Yes | Sipariş içindeki ürünler | | `user_id` | `string` | No | Kullanıcı Id | *Example request* ```json { "special_code": "string", "group_code": "string", "order_date": "2026-05-06 03:14", "discount_amount": 0, "note": "Siparişimi kapıya asabilirsiniz.", "customer": { "code": null, "name": null, "phone": null, "email": null, "address": null, "city": null, "district": null, "identity": null, "tax_office": null }, "payment_type": "POS", "payment_method": "CC", "order_number": "A123", "delivery_type": "PACKAGE_ORDER", "delivery_status": "ONWAY", "currency": "TRY", "installment": 0, "serial_no": "string", "start_payment": false, "products": [ { "id": null, "sku": null, "title": null, "vat_include": null, "price": null, "quantity": null, "tax_rate": null, "unit": null, "product_type": null, "discount_type": null, "discount_value": null, "description": null, "category_code": null, "category_name": null, "exemption_code": null, "otv_orani": null, "konaklama_orani": null } ], "user_id": "string" } ``` ### Responses | Status | Schema | Description | | ------ | --------------------- | ---------------- | | `200` | `OrderCreateResponse` | OK | | `400` | `BadRequestDto` | BAD_REQUEST | | `401` | `UnauthorizedDto` | UNAUTHORIZED | | `403` | `ForbiddenDto` | FORBIDDEN | | `404` | `NotFoundDto` | NOT_FOUND | | `422` | `ValidationDto` | Validation Error | *`OrderCreateResponse`* | Field | Type | Required | Description | | -------------- | --------- | -------- | ------------------------------------------------------------ | | `id` | `string` | Yes | Sipariş Id
`e.g. 73de3cfe-3f4b-4adf-9d79-0cfbb105f4fe` | | `order_code` | `string` | Yes | Sipariş Kodu
`e.g. 123456` | | `completed` | `boolean` | Yes | Islem durumu
`e.g. True` | | `total_amount` | `number` | Yes | Sipariş toplam tutarı
`e.g. 11.9` | | `amount_due` | `number` | Yes | Ödenmesi gereken tutar
`e.g. 11.9` | *** ## `DELETE /v1/orders/{order_code}` **Siparişi iptal eder. / Cancel the order.** > Authorization: `Authorization: Bearer ` is required. ### Parameters | Field | In | Type | Required | Description | | ------------ | ---- | -------- | -------- | ----------- | | `order_code` | path | `string` | Yes | | ### Responses | Status | Schema | Description | | ------ | --------------------- | ---------------- | | `200` | `OrderCreateResponse` | OK | | `400` | `BadRequestDto` | BAD_REQUEST | | `401` | `UnauthorizedDto` | UNAUTHORIZED | | `403` | `ForbiddenDto` | FORBIDDEN | | `404` | `NotFoundDto` | NOT_FOUND | | `422` | `ValidationDto` | Validation Error | *`OrderCreateResponse`* | Field | Type | Required | Description | | -------------- | --------- | -------- | ------------------------------------------------------------ | | `id` | `string` | Yes | Sipariş Id
`e.g. 73de3cfe-3f4b-4adf-9d79-0cfbb105f4fe` | | `order_code` | `string` | Yes | Sipariş Kodu
`e.g. 123456` | | `completed` | `boolean` | Yes | Islem durumu
`e.g. True` | | `total_amount` | `number` | Yes | Sipariş toplam tutarı
`e.g. 11.9` | | `amount_due` | `number` | Yes | Ödenmesi gereken tutar
`e.g. 11.9` | *** ## `PATCH /v1/orders/{order_code}/delivery-status` **Sipariş teslimat durumunu günceller.** Teslimat Durumları: (delivery_status) WAITING = Bekliyor ONWAY = Yolda PREPARING = Hazırlanıyor READY = Hazırlandı COMPLETE = Tamamlandı CANCEL = İptal İptal Durumları: (reason_code) CUSTOMER_CANCELED = Müşteri İptal Etti WRONG_ORDER Hatalı = Sipariş WRONG_ITEMS = Eksik / Hatalı Ürün OUT_OF_DELIVERY_AREA = Teslimat Bölgesi Dışı BUSINESS_CLOSED = İşletme Kapalı BUSINESS_BUSY = İşletme Yoğun CUSTOMER_NOT_FOUND = Müşteri Adreste bulunamadı WRONG_ADDRESS = Hatalı Adres TECHNICAL_PROBLEM = Teknik Problem OTHER = Diğer > Authorization: `Authorization: Bearer ` is required. ### Parameters | Field | In | Type | Required | Description | | ------------ | ---- | -------- | -------- | ----------- | | `order_code` | path | `string` | Yes | | ### Request body `Content-Type: application/json` | Field | Type | Required | Description | | ----------------- | -------- | -------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `delivery_status` | `string` | No | Teslimat Durumu
Allowed values: `WAITING`, `ONWAY`, `PREPARING`, `PREPREING`, `READY`, `COMPLETE`, `CANCEL` | | `serial_no` | `string` | No | Terminal Seri No | | `reason_code` | `string` | No | İptal Nedeni
Allowed values: `CUSTOMER_CANCELED`, `WRONG_ORDER`, `WRONG_ITEMS`, `OUT_OF_DELIVERY_AREA`, `BUSINESS_CLOSED`, `BUSINESS_BUSY`, `CUSTOMER_NOT_FOUND`, `WRONG_ADDRESS`, `TECHNICAL_PROBLEM`, `OTHER` | | `user_id` | `string` | No | Kullanıcı Id | *Example request* ```json { "delivery_status": "ONWAY", "serial_no": "string", "reason_code": "WRONG_ADDRESS", "user_id": "string" } ``` ### Responses | Status | Schema | Description | | ------ | --------------------- | ---------------- | | `200` | `OrderCreateResponse` | OK | | `400` | `BadRequestDto` | BAD_REQUEST | | `401` | `UnauthorizedDto` | UNAUTHORIZED | | `403` | `ForbiddenDto` | FORBIDDEN | | `404` | `NotFoundDto` | NOT_FOUND | | `422` | `ValidationDto` | Validation Error | *`OrderCreateResponse`* | Field | Type | Required | Description | | -------------- | --------- | -------- | ------------------------------------------------------------ | | `id` | `string` | Yes | Sipariş Id
`e.g. 73de3cfe-3f4b-4adf-9d79-0cfbb105f4fe` | | `order_code` | `string` | Yes | Sipariş Kodu
`e.g. 123456` | | `completed` | `boolean` | Yes | Islem durumu
`e.g. True` | | `total_amount` | `number` | Yes | Sipariş toplam tutarı
`e.g. 11.9` | | `amount_due` | `number` | Yes | Ödenmesi gereken tutar
`e.g. 11.9` | *** ## `POST /v1/orders/{order_code}/print` **Sipariş için bilgi fişi yazdırır. / Prints an information slip for the order.** > Authorization: `Authorization: Bearer ` is required. ### Parameters | Field | In | Type | Required | Description | | ------------ | ---- | -------- | -------- | ----------- | | `order_code` | path | `string` | Yes | | ### Request body `Content-Type: application/json` | Field | Type | Required | Description | | ----------- | -------- | -------- | ------------- | | `serial_no` | `string` | No | Cihaz Seri No | *Example request* ```json { "serial_no": "string" } ``` ### Responses | Status | Schema | Description | | ------ | --------------------- | ---------------- | | `200` | `OrderDetailResponse` | OK | | `400` | `BadRequestDto` | BAD_REQUEST | | `401` | `UnauthorizedDto` | UNAUTHORIZED | | `403` | `ForbiddenDto` | FORBIDDEN | | `404` | `NotFoundDto` | NOT_FOUND | | `409` | `DuplicateDto` | DUPLICATE_ERROR | | `422` | `ValidationDto` | Validation Error | *`OrderDetailResponse`* | Field | Type | Required | Description | | ----------------- | --------------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `order_code` | `string` | Yes | Sipariş Kodu
`e.g. 238868` | | `special_code` | `string` | No | Özel Kod | | `group_code` | `string` | No | Özel kategori grup kodu | | `order_date` | `string (date-time)` | Yes | Sipariş Tarihi
`e.g. 2026-05-06 03:14` | | `discount_amount` | `number` | Yes | Sepet İndirim tutarı
`default: 0` | | `note` | `string` | No | Sipariş Notu
`e.g. Siparişimi kapıya asabilirsiniz.` | | `customer` | `OrderCustomerDto` | No | Müşteri bilgileri | | `payment_type` | `string` | Yes | Tahsilat Tipi
Allowed values: `POS`, `PAYCELL`, `PAYE`, `MULTINET`, `METROPOL`, `CASH`, `ONLINE`, `BANK_TRANSFER`, `CIO_CARD`, `FASTPAY`, `TICKET`, `SETCARD`, `SODEXO`, `GETIRPAY`, `TOKENFLEX`, `YEMEKMATIK`, `ON_CREDIT`, `CUZDANPLUS`, `ISTANBULCARD`, `HEPSIPAY`, `GASTROPAY`, `EDENRED`, `IWALLET`, `SOFTPOS` | | `payment_method` | `string` | No | Tahsilat Türü
Allowed values: `QR`, `QR_R`, `NFC`, `CASH`, `CC`, `FAST`, `NONE`, `MOBILE`, `ONLINE`, `CUZDANPLUS`, `MYOZU`, `DYNAMIC_QR`, `GETIR`, `TRENDYOL`, `YEMEKSEPETI`, `YEMEKSEPEETI`, `MIGROSYEMEK`, `QUICKCODE`, `CHIP`, `SWIPE`, `NFC_R` | | `order_number` | `string` | No | Sipariş Sıra numarası vb.
`e.g. A123` | | `delivery_type` | `string` | No | Teslimat tipi
Allowed values: `CASH_ORDER`, `TABLE_ORDER`, `PACKAGE_ORDER`, `TAKE_AWAY`, `TAKE_CLOSE` | | `delivery_status` | `string` | No | Teslimat Durumu
Allowed values: `WAITING`, `ONWAY`, `PREPARING`, `PREPREING`, `READY`, `COMPLETE`, `CANCEL` | | `currency` | `string` | No | Para birimi
Allowed values: `TRY`, `USD`, `EUR`, `GBP` | | `installment` | `number` | No | Taksit sayısı
`e.g. 0` | | `serial_no` | `string` | No | Terminal Seri No | | `start_payment` | `boolean` | No | Tahsilat işlemi başlatılsın mı? (true gönderilmesi durumunda /start işlemine gerek yoktur.)
`e.g. False` | | `products` | `OrderProductDto[]` | Yes | Sipariş içindeki ürünler | | `user_id` | `string` | No | Kullanıcı Id | | `id` | `string` | Yes | Sipariş Id
`e.g. 73de3cfe-3f4b-4adf-9d79-0cfbb105f4fe` | | `total_paid` | `number` | No | Toplam Tahsil Edilen tutar
`default: 11.9` | | `transactions` | `OrderDetailTransactions[]` | No | Tahsilat işlemleri | *** ## `POST /v2/orders` **Yeni Sipariş Kaydı. / Creates a new order.** Type ve Enum değerler için Schema kısmını inceleyebilirsiniz. Teslimat Tipi (delivery_type) CASH_ORDER = Kasa TABLE_ORDER = Masa PACKAGE_ORDER = Paket TAKE_AWAY = Gel Al TAKE_CLOSE = Gel Otur Teslimat Durumları: (delivery_status) WAITING = Bekliyor ONWAY = Yolda PREPARING = Hazırlanıyor READY = Hazırlandı COMPLETE = Tamamlandı CANCEL = İptal İptal Durumları: (reason_code) CUSTOMER_CANCELED = Müşteri İptal Etti WRONG_ORDER Hatalı = Sipariş WRONG_ITEMS = Eksik / Hatalı Ürün OUT_OF_DELIVERY_AREA = Teslimat Bölgesi Dışı BUSINESS_CLOSED = İşletme Kapalı BUSINESS_BUSY = İşletme Yoğun CUSTOMER_NOT_FOUND = Müşteri Adreste bulunamadı WRONG_ADDRESS = Hatalı Adres TECHNICAL_PROBLEM = Teknik Problem OTHER = Diğer > Authorization: `Authorization: Bearer ` is required. ### Request body `Content-Type: application/json` | Field | Type | Required | Description | | ----------------------- | ---------------------- | -------- | ----------------------------------------------------------------------------------------------------------------- | | `order_code` | `string` | Yes | Sipariş Kodu
`e.g. 238868` | | `special_code` | `string` | No | Özel Kod | | `group_code` | `string` | No | Özel kategori grup kodu | | `order_date` | `string (date-time)` | Yes | Sipariş Tarihi
`e.g. 2026-05-06 03:14` | | `discount_amount` | `number` | Yes | Sepet İndirim tutarı
`default: 0` | | `note` | `string` | No | Sipariş Notu
`e.g. Siparişimi kapıya asabilirsiniz.` | | `customer` | `OrderCustomerDto` | No | Müşteri bilgileri | | `order_number` | `string` | No | Sipariş Sıra numarası vb.
`e.g. A123` | | `delivery_type` | `string` | No | Teslimat tipi
Allowed values: `CASH_ORDER`, `TABLE_ORDER`, `PACKAGE_ORDER`, `TAKE_AWAY`, `TAKE_CLOSE` | | `delivery_status` | `string` | No | Teslimat Durumu
Allowed values: `WAITING`, `ONWAY`, `PREPARING`, `PREPREING`, `READY`, `COMPLETE`, `CANCEL` | | `currency` | `string` | No | Para birimi
Allowed values: `TRY`, `USD`, `EUR`, `GBP` | | `installment` | `number` | No | Taksit sayısı
`e.g. 0` | | `products` | `OrderProductDto[]` | Yes | Sipariş içindeki ürünler | | `user_id` | `string` | No | Kullanıcı Id | | `serial_no` | `string` | Yes | Terminal Seri No | | `change_payment_status` | `boolean` | No | POS cihazında ödeme tipini değiştirebilsin mi?
`e.g. False` | | `transactions` | `OrderV2PaymentsDto[]` | Yes | Tahsilat edilecek tutarlar | | `can_try_again` | `boolean` | No | "Tekrar Dene" butonu görünsün mü?
`e.g. False` | *Example request* ```json { "order_code": "238868", "special_code": "string", "group_code": "string", "order_date": "2026-05-06 03:14", "discount_amount": 0, "note": "Siparişimi kapıya asabilirsiniz.", "customer": { "code": null, "name": null, "phone": null, "email": null, "address": null, "city": null, "district": null, "identity": null, "tax_office": null }, "order_number": "A123", "delivery_type": "PACKAGE_ORDER", "delivery_status": "ONWAY", "currency": "TRY", "installment": 0, "products": [ { "id": null, "sku": null, "title": null, "vat_include": null, "price": null, "quantity": null, "tax_rate": null, "unit": null, "product_type": null, "discount_type": null, "discount_value": null, "description": null, "category_code": null, "category_name": null, "exemption_code": null, "otv_orani": null, "konaklama_orani": null } ], "user_id": "string", "serial_no": "string", "change_payment_status": false, "transactions": [ { "total_amount": null, "payment_type": null, "payment_method": null } ], "can_try_again": false } ``` ### Responses | Status | Schema | Description | | ------ | ------------------------ | ---------------- | | `200` | `OrderV2BaseDtoResponse` | OK | | `400` | `BadRequestDto` | BAD_REQUEST | | `401` | `UnauthorizedDto` | UNAUTHORIZED | | `403` | `ForbiddenDto` | FORBIDDEN | | `404` | `NotFoundDto` | NOT_FOUND | | `409` | `DuplicateDto` | DUPLICATE_ERROR | | `422` | `ValidationDto` | Validation Error | *`OrderV2BaseDtoResponse`* | Field | Type | Required | Description | | ------------ | -------- | -------- | --------------------------------------------------------------- | | `id` | `string` | Yes | Sipariş ID
`e.g. 1234567890` | | `order_code` | `string` | Yes | Sipariş Kodu
`e.g. 1234567890` | | `status` | `string` | Yes | İşlem Durumu
Allowed values: `WAITING`, `SUCCESS`, `FAIL` | | `message` | `string` | No | İşlem Mesajı
`e.g. Sipariş oluşturuldu` | | `data` | `object` | No | Sipariş Detayları
`e.g. {}` | *** ## `GET /v2/orders/{order_code}` **Sipariş Detayını ve tahsilatları getirir. / Retrieves details of order.** > Authorization: `Authorization: Bearer ` is required. ### Parameters | Field | In | Type | Required | Description | | ------------ | ---- | -------- | -------- | ----------- | | `order_code` | path | `string` | Yes | | ### Responses | Status | Schema | Description | | ------ | --------------------- | ------------ | | `200` | `OrderDetailResponse` | OK | | `400` | `BadRequestDto` | BAD_REQUEST | | `401` | `UnauthorizedDto` | UNAUTHORIZED | | `403` | `ForbiddenDto` | FORBIDDEN | | `404` | `NotFoundDto` | NOT_FOUND | *`OrderDetailResponse`* | Field | Type | Required | Description | | ----------------- | --------------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `order_code` | `string` | Yes | Sipariş Kodu
`e.g. 238868` | | `special_code` | `string` | No | Özel Kod | | `group_code` | `string` | No | Özel kategori grup kodu | | `order_date` | `string (date-time)` | Yes | Sipariş Tarihi
`e.g. 2026-05-06 03:14` | | `discount_amount` | `number` | Yes | Sepet İndirim tutarı
`default: 0` | | `note` | `string` | No | Sipariş Notu
`e.g. Siparişimi kapıya asabilirsiniz.` | | `customer` | `OrderCustomerDto` | No | Müşteri bilgileri | | `payment_type` | `string` | Yes | Tahsilat Tipi
Allowed values: `POS`, `PAYCELL`, `PAYE`, `MULTINET`, `METROPOL`, `CASH`, `ONLINE`, `BANK_TRANSFER`, `CIO_CARD`, `FASTPAY`, `TICKET`, `SETCARD`, `SODEXO`, `GETIRPAY`, `TOKENFLEX`, `YEMEKMATIK`, `ON_CREDIT`, `CUZDANPLUS`, `ISTANBULCARD`, `HEPSIPAY`, `GASTROPAY`, `EDENRED`, `IWALLET`, `SOFTPOS` | | `payment_method` | `string` | No | Tahsilat Türü
Allowed values: `QR`, `QR_R`, `NFC`, `CASH`, `CC`, `FAST`, `NONE`, `MOBILE`, `ONLINE`, `CUZDANPLUS`, `MYOZU`, `DYNAMIC_QR`, `GETIR`, `TRENDYOL`, `YEMEKSEPETI`, `YEMEKSEPEETI`, `MIGROSYEMEK`, `QUICKCODE`, `CHIP`, `SWIPE`, `NFC_R` | | `order_number` | `string` | No | Sipariş Sıra numarası vb.
`e.g. A123` | | `delivery_type` | `string` | No | Teslimat tipi
Allowed values: `CASH_ORDER`, `TABLE_ORDER`, `PACKAGE_ORDER`, `TAKE_AWAY`, `TAKE_CLOSE` | | `delivery_status` | `string` | No | Teslimat Durumu
Allowed values: `WAITING`, `ONWAY`, `PREPARING`, `PREPREING`, `READY`, `COMPLETE`, `CANCEL` | | `currency` | `string` | No | Para birimi
Allowed values: `TRY`, `USD`, `EUR`, `GBP` | | `installment` | `number` | No | Taksit sayısı
`e.g. 0` | | `serial_no` | `string` | No | Terminal Seri No | | `start_payment` | `boolean` | No | Tahsilat işlemi başlatılsın mı? (true gönderilmesi durumunda /start işlemine gerek yoktur.)
`e.g. False` | | `products` | `OrderProductDto[]` | Yes | Sipariş içindeki ürünler | | `user_id` | `string` | No | Kullanıcı Id | | `id` | `string` | Yes | Sipariş Id
`e.g. 73de3cfe-3f4b-4adf-9d79-0cfbb105f4fe` | | `total_paid` | `number` | No | Toplam Tahsil Edilen tutar
`default: 11.9` | | `transactions` | `OrderDetailTransactions[]` | No | Tahsilat işlemleri | *** ## `DELETE /v2/orders/{order_code}` **Siparişi iptal eder. / Cancel the order.** > Authorization: `Authorization: Bearer ` is required. ### Parameters | Field | In | Type | Required | Description | | ------------ | ---- | -------- | -------- | ----------- | | `order_code` | path | `string` | Yes | | ### Responses | Status | Schema | Description | | ------ | --------------------- | ---------------- | | `200` | `OrderCreateResponse` | OK | | `400` | `BadRequestDto` | BAD_REQUEST | | `401` | `UnauthorizedDto` | UNAUTHORIZED | | `403` | `ForbiddenDto` | FORBIDDEN | | `404` | `NotFoundDto` | NOT_FOUND | | `422` | `ValidationDto` | Validation Error | *`OrderCreateResponse`* | Field | Type | Required | Description | | -------------- | --------- | -------- | ------------------------------------------------------------ | | `id` | `string` | Yes | Sipariş Id
`e.g. 73de3cfe-3f4b-4adf-9d79-0cfbb105f4fe` | | `order_code` | `string` | Yes | Sipariş Kodu
`e.g. 123456` | | `completed` | `boolean` | Yes | Islem durumu
`e.g. True` | | `total_amount` | `number` | Yes | Sipariş toplam tutarı
`e.g. 11.9` | | `amount_due` | `number` | Yes | Ödenmesi gereken tutar
`e.g. 11.9` | *** --- # Parameters URL: /docs/public-api/parameters Parameters — PlusPay Public API. ## `GET /v1/parameters/payment-types` **Tahsilat tiplerini listeler. / Lists the payment types.** > Authorization: `Authorization: Bearer ` is required. ### Responses | Status | Schema | Description | | ------ | -------------------------- | ------------ | | `200` | `PaymentTypeResponseDto[]` | OK | | `400` | `BadRequestDto` | BAD_REQUEST | | `401` | `UnauthorizedDto` | UNAUTHORIZED | | `403` | `ForbiddenDto` | FORBIDDEN | | `404` | `NotFoundDto` | NOT_FOUND | *`PaymentTypeResponseDto`* | Field | Type | Required | Description | | -------------- | ---------- | -------- | -------------------------------------------------------------------------------------------------------------------------------- | | `code` | `string` | Yes | Tipi
Allowed values: `CC_ONLINE`, `PAYCELL_CASH`, `PAYCELL_CC`, `PAYCELL_QR`, `MULTINET` | | `title` | `string` | Yes | Başlık
Allowed values: `Online Kredi Kartı`, `Multinet`, `Paycell Nakit`, `Kredi Kartı / Pos`, `Paycell Pos`, `Paycell Qr` | | `methods` | `string[]` | Yes | Tahsilat Methodları
`e.g. ['CC', 'CASH']` | | `image` | `string` | Yes | Logo
`e.g. https://siparisimcdn2.s3.eu-central-1.amazonaws.com/icdn/payment-icon-paycell-logo-0-5370703575130958.png` | | `is_available` | `boolean` | Yes | PlusPay'de tanımlı pos ise true olarak gelir
`e.g. False` | *** ## `GET /v1/parameters/exemption-codes` **Muafiyet kodlarını getirir. / Retrieves exemption codes.** > Authorization: `Authorization: Bearer ` is required. ### Responses | Status | Schema | Description | | ------ | -------------------------- | ------------ | | `200` | `ExemptionCodesResponse[]` | OK | | `400` | `BadRequestDto` | BAD_REQUEST | | `401` | `UnauthorizedDto` | UNAUTHORIZED | | `403` | `ForbiddenDto` | FORBIDDEN | | `404` | `NotFoundDto` | NOT_FOUND | *`ExemptionCodesResponse`* | Field | Type | Required | Description | | ------- | -------- | -------- | ------------------------------------------------------------------------------------ | | `code` | `string` | Yes | Muafiyet Kodu
`e.g. 223` | | `title` | `string` | Yes | Açıklama
`e.g. Geçici 20/1 Teknoloji Geliştirme Bölgelerinde Yapılan İşlemler` | | `tpye` | `string` | Yes | Muafiyet Türü
`e.g. PARTIAL_EXCEPTION` | *** --- # Personnel URL: /docs/public-api/personnel Personnel — PlusPay Public API. ## `GET /v1/personnels` **Kullanıcı listesini döner** > Authorization: `Authorization: Bearer ` is required. ### Responses | Status | Schema | Description | | ------ | ------------------- | ------------ | | `200` | `PersonelListDto[]` | OK | | `400` | `BadRequestDto` | BAD_REQUEST | | `401` | `UnauthorizedDto` | UNAUTHORIZED | | `403` | `ForbiddenDto` | FORBIDDEN | | `404` | `NotFoundDto` | NOT_FOUND | *`PersonelListDto`* | Field | Type | Required | Description | | -------------- | -------- | -------- | ------------------------------------------------------------------------------------------ | | `id` | `string` | Yes | Id
`e.g. beed34fa-2873-4ea6-a6de-64af953b5f1f` | | `name` | `string` | Yes | İsim
`e.g. Asdfgasdasdas` | | `account_code` | `string` | Yes | Hesap kodu (opsiyonel) | | `profile_id` | `string` | Yes | Profil Id
`e.g. 125d1f82-df61-4b45-baf2-1f96b70616c5` | | `role` | `string` | No | Rolü
Allowed values: `AUTHORIZED`, `CASHIER`, `COURIER`, `DRIVER`, `CASHIER_MANAGER` | *** ## `POST /v1/personnels` **Personel oluşturur** > Authorization: `Authorization: Bearer ` is required. ### Request body `Content-Type: application/json` | Field | Type | Required | Description | | -------------- | --------- | -------- | ------------------------------------------------------------------ | | `name` | `string` | Yes | İsim Soyisim
`e.g. Şenol ŞEREF` | | `account_code` | `string` | Yes | Kullanıcı Kodu (Özel Id vb.) | | `phone` | `string` | Yes | Telefon Numarası, Örnek : +905348893565
`e.g. +9053488935..` | | `email` | `string` | No | E-posta adresiniz
`e.g. senol@pluspay.com.tr` | | `is_active` | `boolean` | Yes | Durumu
`e.g. True` | | `profile_id` | `string` | No | Profil Id | | `role` | `string` | No | Rolü
Allowed values: `CASHIER`, `COURIER` | *Example request* ```json { "name": "Şenol ŞEREF", "account_code": "string", "phone": "+9053488935..", "email": "senol@pluspay.com.tr", "is_active": true, "profile_id": "string", "role": "CASHIER" } ``` ### Responses | Status | Schema | Description | | ------ | ----------------- | ---------------- | | `200` | — | OK | | `400` | `BadRequestDto` | BAD_REQUEST | | `401` | `UnauthorizedDto` | UNAUTHORIZED | | `403` | `ForbiddenDto` | FORBIDDEN | | `404` | `NotFoundDto` | NOT_FOUND | | `409` | `DuplicateDto` | DUPLICATE_ERROR | | `422` | `ValidationDto` | Validation Error | *** ## `PUT /v1/personnels/{personnel_id}` **Personel günceller** > Authorization: `Authorization: Bearer ` is required. ### Parameters | Field | In | Type | Required | Description | | -------------- | ---- | -------- | -------- | ----------- | | `personnel_id` | path | `string` | Yes | | ### Request body `Content-Type: application/json` | Field | Type | Required | Description | | -------------- | --------- | -------- | --------------------------------------------------- | | `name` | `string` | Yes | İsim Soyisim
`e.g. Şenol ŞEREF` | | `account_code` | `string` | Yes | Kullanıcı Kodu (Özel Id vb.) | | `email` | `string` | No | E-posta adresiniz
`e.g. senol@pluspay.com.tr` | | `is_active` | `boolean` | Yes | Durumu
`e.g. True` | | `profile_id` | `string` | No | Profil Id | | `role` | `string` | No | Rolü
Allowed values: `CASHIER`, `COURIER` | *Example request* ```json { "name": "Şenol ŞEREF", "account_code": "string", "email": "senol@pluspay.com.tr", "is_active": true, "profile_id": "string", "role": "CASHIER" } ``` ### Responses | Status | Schema | Description | | ------ | ----------------- | ---------------- | | `200` | — | OK | | `400` | `BadRequestDto` | BAD_REQUEST | | `401` | `UnauthorizedDto` | UNAUTHORIZED | | `403` | `ForbiddenDto` | FORBIDDEN | | `404` | `NotFoundDto` | NOT_FOUND | | `422` | `ValidationDto` | Validation Error | *** ## `DELETE /v1/personnels/{personnel_id}` **Personeli siler (Pasif yapar)** > Authorization: `Authorization: Bearer ` is required. ### Parameters | Field | In | Type | Required | Description | | -------------- | ---- | -------- | -------- | ----------- | | `personnel_id` | path | `string` | Yes | | ### Responses | Status | Schema | Description | | ------ | ----------------- | ---------------- | | `200` | `CompletedDto` | OK | | `400` | `BadRequestDto` | BAD_REQUEST | | `401` | `UnauthorizedDto` | UNAUTHORIZED | | `403` | `ForbiddenDto` | FORBIDDEN | | `404` | `NotFoundDto` | NOT_FOUND | | `422` | `ValidationDto` | Validation Error | *`CompletedDto`* | Field | Type | Required | Description | | ----------- | --------- | -------- | ---------------------------------- | | `completed` | `boolean` | Yes | Islem Durumu
`default: True` | *** ## `POST /v1/qr-confirm` **Qr ile personel giriş işlemini tamamlar. / Initiates the process of obtaining an auth token.** > Authorization: `Authorization: Bearer ` is required. ### Request body `Content-Type: application/json` | Field | Type | Required | Description | | --------- | -------- | -------- | -------------------------------------------------------- | | `user_id` | `string` | Yes | UserId
`e.g. beed34fa-2873-4ea6-a6de-64af953b5f1f` | | `qr_data` | `string` | Yes | Qr Değeri | *Example request* ```json { "user_id": "beed34fa-2873-4ea6-a6de-64af953b5f1f", "qr_data": "string" } ``` ### Responses | Status | Schema | Description | | ------ | ----------------- | ---------------- | | `200` | — | OK | | `400` | `BadRequestDto` | BAD_REQUEST | | `401` | `UnauthorizedDto` | UNAUTHORIZED | | `403` | `ForbiddenDto` | FORBIDDEN | | `404` | `NotFoundDto` | NOT_FOUND | | `409` | `DuplicateDto` | DUPLICATE_ERROR | | `422` | `ValidationDto` | Validation Error | *** --- # POS URL: /docs/public-api/pos POS — PlusPay Public API. ## `GET /v1/pos` **POS Listesini getirir. / Retrieves the POS list.** > Authorization: `Authorization: Bearer ` is required. ### Responses | Status | Schema | Description | | ------ | ----------------- | ------------ | | `200` | `PosResponse[]` | OK | | `400` | `BadRequestDto` | BAD_REQUEST | | `401` | `UnauthorizedDto` | UNAUTHORIZED | | `403` | `ForbiddenDto` | FORBIDDEN | | `404` | `NotFoundDto` | NOT_FOUND | *`PosResponse`* | Field | Type | Required | Description | | ------------- | -------- | -------- | ---------------------------------------------------------------------------------------- | | `id` | `string` | Yes | Id
`e.g. 1ac096fe-2425-440e-b69f-0946bf15b9e0` | | `title` | `string` | Yes | Başlık
`e.g. PlusPlay Yeni Sahra` | | `terminal_id` | `string` | Yes | Termainal Numarası
`e.g. TB0002` | | `serial_no` | `string` | No | Seri No
`e.g. PB001` | | `status` | `string` | Yes | Durumu
Allowed values: `ACTIVATION`, `ACTIVE`, `BROKEN`, `PASSIVE`, `CONFIGRATION` | | `branch_id` | `string` | Yes | Şube Id | | `branch_code` | `string` | Yes | Şube Kodu | | `branch_name` | `string` | Yes | Şube Adı | | `created_at` | `string` | Yes | Kayıt Tarihi
`e.g. 2023-02-18T15:13:37` | *** ## `GET /v1/pos/status/{serial_no}` **POS Durumunu getirir. / Retrieves the status of a POS.** > Authorization: `Authorization: Bearer ` is required. ### Parameters | Field | In | Type | Required | Description | | ----------- | ---- | -------- | -------- | ----------- | | `serial_no` | path | `string` | Yes | | ### Responses | Status | Schema | Description | | ------ | ----------------- | ------------ | | `200` | `PosResponse[]` | OK | | `400` | `BadRequestDto` | BAD_REQUEST | | `401` | `UnauthorizedDto` | UNAUTHORIZED | | `403` | `ForbiddenDto` | FORBIDDEN | | `404` | `NotFoundDto` | NOT_FOUND | *`PosResponse`* | Field | Type | Required | Description | | ------------- | -------- | -------- | ---------------------------------------------------------------------------------------- | | `id` | `string` | Yes | Id
`e.g. 1ac096fe-2425-440e-b69f-0946bf15b9e0` | | `title` | `string` | Yes | Başlık
`e.g. PlusPlay Yeni Sahra` | | `terminal_id` | `string` | Yes | Termainal Numarası
`e.g. TB0002` | | `serial_no` | `string` | No | Seri No
`e.g. PB001` | | `status` | `string` | Yes | Durumu
Allowed values: `ACTIVATION`, `ACTIVE`, `BROKEN`, `PASSIVE`, `CONFIGRATION` | | `branch_id` | `string` | Yes | Şube Id | | `branch_code` | `string` | Yes | Şube Kodu | | `branch_name` | `string` | Yes | Şube Adı | | `created_at` | `string` | Yes | Kayıt Tarihi
`e.g. 2023-02-18T15:13:37` | *** ## `GET /v1/pos/{serial_no}/end-of-day` **Pos cihazında gün sonu işlemini başlatır.** > Authorization: `Authorization: Bearer ` is required. ### Parameters | Field | In | Type | Required | Description | | ----------- | ---- | -------- | -------- | ----------- | | `serial_no` | path | `string` | Yes | | ### Responses | Status | Schema | Description | | ------ | ----------------- | ------------ | | `200` | `PosResponse[]` | OK | | `400` | `BadRequestDto` | BAD_REQUEST | | `401` | `UnauthorizedDto` | UNAUTHORIZED | | `403` | `ForbiddenDto` | FORBIDDEN | | `404` | `NotFoundDto` | NOT_FOUND | *`PosResponse`* | Field | Type | Required | Description | | ------------- | -------- | -------- | ---------------------------------------------------------------------------------------- | | `id` | `string` | Yes | Id
`e.g. 1ac096fe-2425-440e-b69f-0946bf15b9e0` | | `title` | `string` | Yes | Başlık
`e.g. PlusPlay Yeni Sahra` | | `terminal_id` | `string` | Yes | Termainal Numarası
`e.g. TB0002` | | `serial_no` | `string` | No | Seri No
`e.g. PB001` | | `status` | `string` | Yes | Durumu
Allowed values: `ACTIVATION`, `ACTIVE`, `BROKEN`, `PASSIVE`, `CONFIGRATION` | | `branch_id` | `string` | Yes | Şube Id | | `branch_code` | `string` | Yes | Şube Kodu | | `branch_name` | `string` | Yes | Şube Adı | | `created_at` | `string` | Yes | Kayıt Tarihi
`e.g. 2023-02-18T15:13:37` | *** --- # Products URL: /docs/public-api/products Products — PlusPay Public API. ## `GET /v1/products` **Ürünleri listeler. / Lists products.** > Authorization: `Authorization: Bearer ` is required. ### Responses | Status | Schema | Description | | ------ | ------------------ | ------------ | | `200` | `ProductItemDto[]` | OK | | `400` | `BadRequestDto` | BAD_REQUEST | | `401` | `UnauthorizedDto` | UNAUTHORIZED | | `403` | `ForbiddenDto` | FORBIDDEN | | `404` | `NotFoundDto` | NOT_FOUND | *`ProductItemDto`* | Field | Type | Required | Description | | -------------- | --------- | -------- | ----------------------------------------------------------------------------------------- | | `id` | `string` | Yes | Urun Id
`e.g. 5a90e3ea-7ca0-48fe-a457-98b1834b18d0` | | `code` | `string` | Yes | Ürün Kodu (Eşletirme için kullanılacaktır.)
`e.g. ABC0001` | | `title` | `string` | Yes | Ürün Adı
`e.g. Kola 33cc` | | `sku` | `string` | No | Ürün Barkodu | | `description` | `string` | No | Ürün açıklaması | | `unit` | `string` | Yes | Ürün Birimi
Allowed values: `ADET`, `KG`, `GR`, `LT`, `MT`, `KOLI`, `PAKET` | | `is_active` | `boolean` | No | Ürün Durumu
`e.g. True` | | `product_type` | `string` | Yes | Ürün Tipi Fiziksel veya Sanal
Allowed values: `PHYSICALLY`, `VIRTUAL`, `INFO`, `MD` | | `tax_rate` | `number` | Yes | Kdv Oranı
Allowed values: `0`, `1`, `10`, `20` | | `price` | `number` | Yes | Ürün Fiyatı (KDV Hariç)
`e.g. 25.1` | | `stock` | `number` | No | Stok sayısı geçersiz
`e.g. 0` | | `is_weighed` | `boolean` | Yes | Tartılı ürün mü?
`e.g. False` | *** ## `POST /v1/products` **Yeni Ürün Oluşturur (Tekli) / Creates a product.** > Authorization: `Authorization: Bearer ` is required. ### Request body `Content-Type: application/json` | Field | Type | Required | Description | | -------------- | ---------- | -------- | --------------------------------------------------------------------------------------------------------- | | `code` | `string` | Yes | Ürün Kodu (Eşletirme için kullanılacaktır.)
`e.g. ABC0001` | | `title` | `string` | Yes | Ürün Adı
`e.g. Kola 33cc` | | `sku` | `string` | No | Ürün Barkodu | | `description` | `string` | No | Ürün açıklaması | | `unit` | `string` | Yes | Ürün Birimi
Allowed values: `ADET`, `KG`, `GR`, `LT`, `MT`, `KOLI`, `PAKET` | | `is_active` | `boolean` | No | Ürün Durumu
`e.g. True` | | `product_type` | `string` | Yes | Ürün Tipi Fiziksel veya Sanal
Allowed values: `PHYSICALLY`, `VIRTUAL`, `INFO`, `MD` | | `tax_rate` | `number` | Yes | Kdv Oranı
Allowed values: `0`, `1`, `10`, `20` | | `price` | `number` | Yes | Ürün Fiyatı (KDV Hariç)
`e.g. 25.1` | | `stock` | `number` | No | Stok sayısı geçersiz
`e.g. 0` | | `is_weighed` | `boolean` | Yes | Tartılı ürün mü?
`e.g. False` | | `categories` | `string[]` | Yes | Kategoriler
`e.g. ['3f22ec94-6601-4a39-a2f4-4fe315dc1113', 'a24f7883-2415-48a5-b96a-640f8166417a']` | *Example request* ```json { "code": "ABC0001", "title": "Kola 33cc", "sku": "string", "description": "string", "unit": "ADET", "is_active": true, "product_type": "PHYSICALLY", "tax_rate": 10, "price": 25.1, "stock": 0, "is_weighed": false, "categories": [ "3f22ec94-6601-4a39-a2f4-4fe315dc1113", "a24f7883-2415-48a5-b96a-640f8166417a" ] } ``` ### Responses | Status | Schema | Description | | ------ | ----------------- | ---------------- | | `200` | `ProductItemDto` | OK | | `400` | `BadRequestDto` | BAD_REQUEST | | `401` | `UnauthorizedDto` | UNAUTHORIZED | | `403` | `ForbiddenDto` | FORBIDDEN | | `404` | `NotFoundDto` | NOT_FOUND | | `409` | `DuplicateDto` | DUPLICATE_ERROR | | `422` | `ValidationDto` | Validation Error | *`ProductItemDto`* | Field | Type | Required | Description | | -------------- | --------- | -------- | ----------------------------------------------------------------------------------------- | | `id` | `string` | Yes | Urun Id
`e.g. 5a90e3ea-7ca0-48fe-a457-98b1834b18d0` | | `code` | `string` | Yes | Ürün Kodu (Eşletirme için kullanılacaktır.)
`e.g. ABC0001` | | `title` | `string` | Yes | Ürün Adı
`e.g. Kola 33cc` | | `sku` | `string` | No | Ürün Barkodu | | `description` | `string` | No | Ürün açıklaması | | `unit` | `string` | Yes | Ürün Birimi
Allowed values: `ADET`, `KG`, `GR`, `LT`, `MT`, `KOLI`, `PAKET` | | `is_active` | `boolean` | No | Ürün Durumu
`e.g. True` | | `product_type` | `string` | Yes | Ürün Tipi Fiziksel veya Sanal
Allowed values: `PHYSICALLY`, `VIRTUAL`, `INFO`, `MD` | | `tax_rate` | `number` | Yes | Kdv Oranı
Allowed values: `0`, `1`, `10`, `20` | | `price` | `number` | Yes | Ürün Fiyatı (KDV Hariç)
`e.g. 25.1` | | `stock` | `number` | No | Stok sayısı geçersiz
`e.g. 0` | | `is_weighed` | `boolean` | Yes | Tartılı ürün mü?
`e.g. False` | *** ## `GET /v1/products/{product_id}` **Ürün detayını getirir. / Retrieves details of the product.** > Authorization: `Authorization: Bearer ` is required. ### Parameters | Field | In | Type | Required | Description | | ------------ | ---- | -------- | -------- | ----------- | | `product_id` | path | `string` | Yes | | ### Responses | Status | Schema | Description | | ------ | ----------------- | ------------ | | `200` | `ProductItemDto` | OK | | `400` | `BadRequestDto` | BAD_REQUEST | | `401` | `UnauthorizedDto` | UNAUTHORIZED | | `403` | `ForbiddenDto` | FORBIDDEN | | `404` | `NotFoundDto` | NOT_FOUND | *`ProductItemDto`* | Field | Type | Required | Description | | -------------- | --------- | -------- | ----------------------------------------------------------------------------------------- | | `id` | `string` | Yes | Urun Id
`e.g. 5a90e3ea-7ca0-48fe-a457-98b1834b18d0` | | `code` | `string` | Yes | Ürün Kodu (Eşletirme için kullanılacaktır.)
`e.g. ABC0001` | | `title` | `string` | Yes | Ürün Adı
`e.g. Kola 33cc` | | `sku` | `string` | No | Ürün Barkodu | | `description` | `string` | No | Ürün açıklaması | | `unit` | `string` | Yes | Ürün Birimi
Allowed values: `ADET`, `KG`, `GR`, `LT`, `MT`, `KOLI`, `PAKET` | | `is_active` | `boolean` | No | Ürün Durumu
`e.g. True` | | `product_type` | `string` | Yes | Ürün Tipi Fiziksel veya Sanal
Allowed values: `PHYSICALLY`, `VIRTUAL`, `INFO`, `MD` | | `tax_rate` | `number` | Yes | Kdv Oranı
Allowed values: `0`, `1`, `10`, `20` | | `price` | `number` | Yes | Ürün Fiyatı (KDV Hariç)
`e.g. 25.1` | | `stock` | `number` | No | Stok sayısı geçersiz
`e.g. 0` | | `is_weighed` | `boolean` | Yes | Tartılı ürün mü?
`e.g. False` | *** ## `DELETE /v1/products/{product_id}` **Ürünü Kaldırır. / Removes the product.** > Authorization: `Authorization: Bearer ` is required. ### Parameters | Field | In | Type | Required | Description | | ------------ | ---- | -------- | -------- | ----------- | | `product_id` | path | `string` | Yes | | ### Responses | Status | Schema | Description | | ------ | ----------------- | ---------------- | | `200` | `CompletedDto` | OK | | `400` | `BadRequestDto` | BAD_REQUEST | | `401` | `UnauthorizedDto` | UNAUTHORIZED | | `403` | `ForbiddenDto` | FORBIDDEN | | `404` | `NotFoundDto` | NOT_FOUND | | `422` | `ValidationDto` | Validation Error | *`CompletedDto`* | Field | Type | Required | Description | | ----------- | --------- | -------- | ---------------------------------- | | `completed` | `boolean` | Yes | Islem Durumu
`default: True` | *** ## `POST /v1/products-multiple` **Yeni Ürün Oluşturur (Çoklu) / Creates multiple products.** > Authorization: `Authorization: Bearer ` is required. ### Request body `Content-Type: application/json` | Field | Type | Required | Description | | ---------- | -------------------- | -------- | ------------ | | `products` | `ProductCreateDto[]` | Yes | Urun Listesi | *Example request* ```json { "products": [ { "code": null, "title": null, "sku": null, "description": null, "unit": null, "is_active": null, "product_type": null, "tax_rate": null, "price": null, "stock": null, "is_weighed": null, "categories": null } ] } ``` ### Responses | Status | Schema | Description | | ------ | ----------------- | ---------------- | | `200` | `ProductItemDto` | OK | | `400` | `BadRequestDto` | BAD_REQUEST | | `401` | `UnauthorizedDto` | UNAUTHORIZED | | `403` | `ForbiddenDto` | FORBIDDEN | | `404` | `NotFoundDto` | NOT_FOUND | | `409` | `DuplicateDto` | DUPLICATE_ERROR | | `422` | `ValidationDto` | Validation Error | *`ProductItemDto`* | Field | Type | Required | Description | | -------------- | --------- | -------- | ----------------------------------------------------------------------------------------- | | `id` | `string` | Yes | Urun Id
`e.g. 5a90e3ea-7ca0-48fe-a457-98b1834b18d0` | | `code` | `string` | Yes | Ürün Kodu (Eşletirme için kullanılacaktır.)
`e.g. ABC0001` | | `title` | `string` | Yes | Ürün Adı
`e.g. Kola 33cc` | | `sku` | `string` | No | Ürün Barkodu | | `description` | `string` | No | Ürün açıklaması | | `unit` | `string` | Yes | Ürün Birimi
Allowed values: `ADET`, `KG`, `GR`, `LT`, `MT`, `KOLI`, `PAKET` | | `is_active` | `boolean` | No | Ürün Durumu
`e.g. True` | | `product_type` | `string` | Yes | Ürün Tipi Fiziksel veya Sanal
Allowed values: `PHYSICALLY`, `VIRTUAL`, `INFO`, `MD` | | `tax_rate` | `number` | Yes | Kdv Oranı
Allowed values: `0`, `1`, `10`, `20` | | `price` | `number` | Yes | Ürün Fiyatı (KDV Hariç)
`e.g. 25.1` | | `stock` | `number` | No | Stok sayısı geçersiz
`e.g. 0` | | `is_weighed` | `boolean` | Yes | Tartılı ürün mü?
`e.g. False` | *** ## `PUT /v1/{product_id}` **Ürünü Günceller. / Updates the product.** > Authorization: `Authorization: Bearer ` is required. ### Parameters | Field | In | Type | Required | Description | | ------------ | ---- | -------- | -------- | ----------- | | `product_id` | path | `string` | Yes | | ### Request body `Content-Type: application/json` | Field | Type | Required | Description | | -------------- | ---------- | -------- | --------------------------------------------------------------------------------------------------------- | | `title` | `string` | Yes | Ürün Adı
`e.g. Kola 33cc` | | `sku` | `string` | No | Ürün Barkodu | | `description` | `string` | No | Ürün açıklaması | | `unit` | `string` | Yes | Ürün Birimi
Allowed values: `ADET`, `KG`, `GR`, `LT`, `MT`, `KOLI`, `PAKET` | | `is_active` | `boolean` | Yes | Ürün Durumu
`e.g. True` | | `product_type` | `string` | Yes | Ürün Tipi Fiziksel veya Sanal
Allowed values: `PHYSICALLY`, `VIRTUAL`, `INFO`, `MD` | | `tax_rate` | `number` | Yes | Kdv Oranı
Allowed values: `0`, `1`, `10`, `20` | | `price` | `number` | Yes | Ürün Fiyatı (KDV Hariç)
`e.g. 25.1` | | `stock` | `number` | No | Stok sayısı geçersiz
`e.g. 0` | | `is_weighed` | `boolean` | Yes | Tartılı ürün mü?
`e.g. False` | | `categories` | `string[]` | Yes | Kategoriler
`e.g. ['3f22ec94-6601-4a39-a2f4-4fe315dc1113', 'a24f7883-2415-48a5-b96a-640f8166417a']` | *Example request* ```json { "title": "Kola 33cc", "sku": "string", "description": "string", "unit": "ADET", "is_active": true, "product_type": "PHYSICALLY", "tax_rate": 10, "price": 25.1, "stock": 0, "is_weighed": false, "categories": [ "3f22ec94-6601-4a39-a2f4-4fe315dc1113", "a24f7883-2415-48a5-b96a-640f8166417a" ] } ``` ### Responses | Status | Schema | Description | | ------ | ----------------- | ---------------- | | `200` | `CompletedDto` | OK | | `400` | `BadRequestDto` | BAD_REQUEST | | `401` | `UnauthorizedDto` | UNAUTHORIZED | | `403` | `ForbiddenDto` | FORBIDDEN | | `404` | `NotFoundDto` | NOT_FOUND | | `422` | `ValidationDto` | Validation Error | *`CompletedDto`* | Field | Type | Required | Description | | ----------- | --------- | -------- | ---------------------------------- | | `completed` | `boolean` | Yes | Islem Durumu
`default: True` | *** ## `POST /v1/stock-update` **Ürün stoklarını günceller (Çoklu) / Updates multiple products stock levels.** > Authorization: `Authorization: Bearer ` is required. ### Request body `Content-Type: application/json` | Field | Type | Required | Description | | ------- | ------------------ | -------- | ------------ | | `items` | `StockUpdateDto[]` | Yes | Urun Listesi | *Example request* ```json { "items": [ { "code": null, "is_active": null, "price": null, "stock": null } ] } ``` ### Responses | Status | Schema | Description | | ------ | ----------------- | ---------------- | | `200` | `ProductItemDto` | OK | | `400` | `BadRequestDto` | BAD_REQUEST | | `401` | `UnauthorizedDto` | UNAUTHORIZED | | `403` | `ForbiddenDto` | FORBIDDEN | | `404` | `NotFoundDto` | NOT_FOUND | | `409` | `DuplicateDto` | DUPLICATE_ERROR | | `422` | `ValidationDto` | Validation Error | *`ProductItemDto`* | Field | Type | Required | Description | | -------------- | --------- | -------- | ----------------------------------------------------------------------------------------- | | `id` | `string` | Yes | Urun Id
`e.g. 5a90e3ea-7ca0-48fe-a457-98b1834b18d0` | | `code` | `string` | Yes | Ürün Kodu (Eşletirme için kullanılacaktır.)
`e.g. ABC0001` | | `title` | `string` | Yes | Ürün Adı
`e.g. Kola 33cc` | | `sku` | `string` | No | Ürün Barkodu | | `description` | `string` | No | Ürün açıklaması | | `unit` | `string` | Yes | Ürün Birimi
Allowed values: `ADET`, `KG`, `GR`, `LT`, `MT`, `KOLI`, `PAKET` | | `is_active` | `boolean` | No | Ürün Durumu
`e.g. True` | | `product_type` | `string` | Yes | Ürün Tipi Fiziksel veya Sanal
Allowed values: `PHYSICALLY`, `VIRTUAL`, `INFO`, `MD` | | `tax_rate` | `number` | Yes | Kdv Oranı
Allowed values: `0`, `1`, `10`, `20` | | `price` | `number` | Yes | Ürün Fiyatı (KDV Hariç)
`e.g. 25.1` | | `stock` | `number` | No | Stok sayısı geçersiz
`e.g. 0` | | `is_weighed` | `boolean` | Yes | Tartılı ürün mü?
`e.g. False` | *** --- # Profiles URL: /docs/public-api/profiles Profiles — PlusPay Public API. ## `GET /v1/profiles` **Kayıtlı profil listesini döner** > Authorization: `Authorization: Bearer ` is required. ### Responses | Status | Schema | Description | | ------ | ----------------------- | ------------ | | `200` | `ProfileListResponse[]` | OK | | `400` | `BadRequestDto` | BAD_REQUEST | | `401` | `UnauthorizedDto` | UNAUTHORIZED | | `403` | `ForbiddenDto` | FORBIDDEN | | `404` | `NotFoundDto` | NOT_FOUND | *`ProfileListResponse`* | Field | Type | Required | Description | | ----------- | --------- | -------- | ---------------------------------------------------- | | `id` | `string` | Yes | Id
`e.g. beed34fa-2873-4ea6-a6de-64af953b5f1f` | | `title` | `string` | Yes | Başlık
`e.g. Asdfgasdasdas` | | `is_active` | `boolean` | Yes | Durumu
`e.g. True` | *** --- # Reports URL: /docs/public-api/reports Reports — PlusPay Public API. ## `POST /v1/report/payments` **Tahsilat Raporlari** > Authorization: `Authorization: Bearer ` is required. ### Request body `Content-Type: application/json` | Field | Type | Required | Description | | ------------ | -------- | -------- | ---------------------------------------------- | | `start_date` | `string` | Yes | Başlangıç tarihi
`e.g. 2026-05-06 00:00` | | `end_date` | `string` | Yes | Bitiş tarihi
`e.g. 2026-05-06 23:59` | | `serial_no` | `string` | No | Terminal Seri No | *Example request* ```json { "start_date": "2026-05-06 00:00", "end_date": "2026-05-06 23:59", "serial_no": "string" } ``` ### Responses | Status | Schema | Description | | ------ | ----------------- | ---------------- | | `200` | — | OK | | `400` | `BadRequestDto` | BAD_REQUEST | | `401` | `UnauthorizedDto` | UNAUTHORIZED | | `403` | `ForbiddenDto` | FORBIDDEN | | `404` | `NotFoundDto` | NOT_FOUND | | `409` | `DuplicateDto` | DUPLICATE_ERROR | | `422` | `ValidationDto` | Validation Error | *** ## `POST /v1/report/invoices` **Fatura Raporlari** > Authorization: `Authorization: Bearer ` is required. ### Request body `Content-Type: application/json` | Field | Type | Required | Description | | ------------ | -------- | -------- | ---------------------------------------------- | | `start_date` | `string` | Yes | Başlangıç tarihi
`e.g. 2026-05-06 00:00` | | `end_date` | `string` | Yes | Bitiş tarihi
`e.g. 2026-05-06 23:59` | | `serial_no` | `string` | No | Terminal Seri No | *Example request* ```json { "start_date": "2026-05-06 00:00", "end_date": "2026-05-06 23:59", "serial_no": "string" } ``` ### Responses | Status | Schema | Description | | ------ | ----------------- | ---------------- | | `200` | — | OK | | `400` | `BadRequestDto` | BAD_REQUEST | | `401` | `UnauthorizedDto` | UNAUTHORIZED | | `403` | `ForbiddenDto` | FORBIDDEN | | `404` | `NotFoundDto` | NOT_FOUND | | `409` | `DuplicateDto` | DUPLICATE_ERROR | | `422` | `ValidationDto` | Validation Error | *** ## `POST /v1/report/pf` **Pf Raporlari** > Authorization: `Authorization: Bearer ` is required. ### Request body `Content-Type: application/json` | Field | Type | Required | Description | | ------------ | -------- | -------- | ---------------------------------------------- | | `start_date` | `string` | Yes | Başlangıç tarihi
`e.g. 2026-05-06 00:00` | | `end_date` | `string` | Yes | Bitiş tarihi
`e.g. 2026-05-06 23:59` | | `serial_no` | `string` | No | Terminal Seri No | *Example request* ```json { "start_date": "2026-05-06 00:00", "end_date": "2026-05-06 23:59", "serial_no": "string" } ``` ### Responses | Status | Schema | Description | | ------ | ----------------- | ---------------- | | `200` | — | OK | | `400` | `BadRequestDto` | BAD_REQUEST | | `401` | `UnauthorizedDto` | UNAUTHORIZED | | `403` | `ForbiddenDto` | FORBIDDEN | | `404` | `NotFoundDto` | NOT_FOUND | | `409` | `DuplicateDto` | DUPLICATE_ERROR | | `422` | `ValidationDto` | Validation Error | *** --- # Transactions URL: /docs/public-api/transactions Transactions — PlusPay Public API. ## `POST /v1/transactions-last-update` **En son güncellenen işlemlerin listesini döner / Retrieves a list of payment transactions. Dikkat: Dakikada en fazla 20 istek yapabilirsiniz.** > Authorization: `Authorization: Bearer ` is required. ### Parameters | Field | In | Type | Required | Description | | ------------ | ----- | -------- | -------- | ---------------- | | `start_date` | query | `string` | Yes | Başlangıç tarihi | | `end_date` | query | `string` | Yes | Bitiş tarihi | ### Request body `Content-Type: application/json` | Field | Type | Required | Description | | ---------------- | ---------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `status` | `string` | No | Islem Durumu
Allowed values: `CANCEL`, `NOT_RESPONSE`, `WAITING`, `SUCCESS`, `FAIL`, `REFUND` | | `payment_type` | `string` | No | Tahsilat Tipi
Allowed values: `POS`, `PAYCELL`, `PAYE`, `MULTINET`, `METROPOL`, `CASH`, `ONLINE`, `BANK_TRANSFER`, `CIO_CARD`, `FASTPAY`, `TICKET`, `SETCARD`, `SODEXO`, `GETIRPAY`, `TOKENFLEX`, `YEMEKMATIK`, `ON_CREDIT`, `CUZDANPLUS`, `ISTANBULCARD`, `HEPSIPAY`, `GASTROPAY`, `EDENRED`, `IWALLET`, `SOFTPOS` | | `payment_method` | `string` | No | Tahsilat Methodu
Allowed values: `QR`, `QR_R`, `NFC`, `CASH`, `CC`, `FAST`, `NONE`, `MOBILE`, `ONLINE`, `CUZDANPLUS`, `MYOZU`, `DYNAMIC_QR`, `GETIR`, `TRENDYOL`, `YEMEKSEPETI`, `YEMEKSEPEETI`, `MIGROSYEMEK`, `QUICKCODE`, `CHIP`, `SWIPE`, `NFC_R` | | `source` | `string` | No | İşlem Kaynağı
Allowed values: `WEB`, `POS` | | `orders` | `string[]` | No | Sipariş kodları
`e.g. ['SiparişKodu1', 'Sipariş Kodu2']` | *Example request* ```json { "status": "CANCEL", "payment_type": "POS", "payment_method": "QR", "source": "WEB", "orders": [ "SiparişKodu1", "Sipariş Kodu2" ] } ``` ### Responses | Status | Schema | Description | | ------ | ------------------ | ---------------- | | `200` | `TransactionDto[]` | OK | | `400` | `BadRequestDto` | BAD_REQUEST | | `401` | `UnauthorizedDto` | UNAUTHORIZED | | `403` | `ForbiddenDto` | FORBIDDEN | | `404` | `NotFoundDto` | NOT_FOUND | | `409` | `DuplicateDto` | DUPLICATE_ERROR | | `422` | `ValidationDto` | Validation Error | *`TransactionDto`* | Field | Type | Required | Description | | ---------------- | ---------------------- | -------- | --------------------------------------------------------------------------------------- | | `id` | `string` | Yes | Transaction Id
`e.g. c6114817-42a1-4dc0-9e79-8168d5f06814` | | `order_code` | `string` | Yes | Sipariş Kodu
`e.g. 342163` | | `payment` | `Payment` | Yes | Tahsilat Detayı | | `transaction_id` | `string` | Yes | Islem Id
`e.g. 100197442` | | `total_amount` | `number` | Yes | Toplam tutar
`e.g. 11.9` | | `is_closed` | `boolean` | Yes | Sipariş kapatıldı mı? (Ödenecek tutar kalmadı ise sipariş kapanıyor.)
`e.g. True` | | `status` | `TransactionStatusDto` | Yes | Islem durumu detayı | | `created_at` | `string` | Yes | İşlem tarihi
`e.g. 2023-02-22 21:06:53` | *** ## `GET /v1/transactions` **Tahsilat Listesini getirir. / Retrieves a list of payment transactions.** > Authorization: `Authorization: Bearer ` is required. ### Parameters | Field | In | Type | Required | Description | | ---------------- | ----- | -------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `start_date` | query | `string` | Yes | Başlangıç tarihi | | `end_date` | query | `string` | Yes | Bitiş tarihi | | `status` | query | `string` | No | Islem Durumu
Allowed values: `CANCEL`, `NOT_RESPONSE`, `WAITING`, `SUCCESS`, `FAIL`, `REFUND` | | `payment_type` | query | `string` | No | Tahsilat Tipi
Allowed values: `POS`, `PAYCELL`, `PAYE`, `MULTINET`, `METROPOL`, `CASH`, `ONLINE`, `BANK_TRANSFER`, `CIO_CARD`, `FASTPAY`, `TICKET`, `SETCARD`, `SODEXO`, `GETIRPAY`, `TOKENFLEX`, `YEMEKMATIK`, `ON_CREDIT`, `CUZDANPLUS`, `ISTANBULCARD`, `HEPSIPAY`, `GASTROPAY`, `EDENRED`, `IWALLET`, `SOFTPOS` | | `payment_method` | query | `string` | No | Tahsilat Methodu
Allowed values: `QR`, `QR_R`, `NFC`, `CASH`, `CC`, `FAST`, `NONE`, `MOBILE`, `ONLINE`, `CUZDANPLUS`, `MYOZU`, `DYNAMIC_QR`, `GETIR`, `TRENDYOL`, `YEMEKSEPETI`, `YEMEKSEPEETI`, `MIGROSYEMEK`, `QUICKCODE`, `CHIP`, `SWIPE`, `NFC_R` | | `source` | query | `string` | No | İşlem Kaynağı
Allowed values: `WEB`, `POS` | ### Responses | Status | Schema | Description | | ------ | ------------------ | ------------ | | `200` | `TransactionDto[]` | OK | | `400` | `BadRequestDto` | BAD_REQUEST | | `401` | `UnauthorizedDto` | UNAUTHORIZED | | `403` | `ForbiddenDto` | FORBIDDEN | | `404` | `NotFoundDto` | NOT_FOUND | *`TransactionDto`* | Field | Type | Required | Description | | ---------------- | ---------------------- | -------- | --------------------------------------------------------------------------------------- | | `id` | `string` | Yes | Transaction Id
`e.g. c6114817-42a1-4dc0-9e79-8168d5f06814` | | `order_code` | `string` | Yes | Sipariş Kodu
`e.g. 342163` | | `payment` | `Payment` | Yes | Tahsilat Detayı | | `transaction_id` | `string` | Yes | Islem Id
`e.g. 100197442` | | `total_amount` | `number` | Yes | Toplam tutar
`e.g. 11.9` | | `is_closed` | `boolean` | Yes | Sipariş kapatıldı mı? (Ödenecek tutar kalmadı ise sipariş kapanıyor.)
`e.g. True` | | `status` | `TransactionStatusDto` | Yes | Islem durumu detayı | | `created_at` | `string` | Yes | İşlem tarihi
`e.g. 2023-02-22 21:06:53` | *** ## `GET /v1/transactions/{transaction_id}` **İşlem detayını getirir. / Retrieves details of a specific transaction.** > Authorization: `Authorization: Bearer ` is required. ### Parameters | Field | In | Type | Required | Description | | ---------------- | ---- | -------- | -------- | ----------- | | `transaction_id` | path | `string` | Yes | | ### Responses | Status | Schema | Description | | ------ | ----------------- | ------------ | | `200` | `TransactionDto` | OK | | `400` | `BadRequestDto` | BAD_REQUEST | | `401` | `UnauthorizedDto` | UNAUTHORIZED | | `403` | `ForbiddenDto` | FORBIDDEN | | `404` | `NotFoundDto` | NOT_FOUND | *`TransactionDto`* | Field | Type | Required | Description | | ---------------- | ---------------------- | -------- | --------------------------------------------------------------------------------------- | | `id` | `string` | Yes | Transaction Id
`e.g. c6114817-42a1-4dc0-9e79-8168d5f06814` | | `order_code` | `string` | Yes | Sipariş Kodu
`e.g. 342163` | | `payment` | `Payment` | Yes | Tahsilat Detayı | | `transaction_id` | `string` | Yes | Islem Id
`e.g. 100197442` | | `total_amount` | `number` | Yes | Toplam tutar
`e.g. 11.9` | | `is_closed` | `boolean` | Yes | Sipariş kapatıldı mı? (Ödenecek tutar kalmadı ise sipariş kapanıyor.)
`e.g. True` | | `status` | `TransactionStatusDto` | Yes | Islem durumu detayı | | `created_at` | `string` | Yes | İşlem tarihi
`e.g. 2023-02-22 21:06:53` | ***