# 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` |
***