---
title: "Gets a sale"
description: "Returns `Sale` for `sale_id`, including item lines and `payments[]`.\nNon-finalised sales are never returned; only fully-paid sales.\n\n**OAuth scopes:** Requires one of: `sales.read`.\n\n**Required permissions:**\n\n- `merchant_read`"
image: "https://developer.sumup.com/og/index.png"
---

> Documentation Index
> Fetch the complete documentation index at: https://developer.sumup.com/llms.txt
> Use this file to discover all available pages before exploring further.

Path: SumUp REST API › Sales

`GET /v1.0/merchants/{merchant_code}/sales/{sale_id}`

Returns `Sale` for `sale_id`, including item lines and `payments[]`.
Non-finalised sales are never returned; only fully-paid sales.

**OAuth scopes:** Requires one of: `sales.read`.

**Required permissions:**

- `merchant_read`

## Authentication

Requires one of the following:

- `apiKey`, http, header `Authorization`
- `oauth2`, oauth2, scopes: `sales.read`

## Path parameters

- `merchant_code` (`GetSaleV10.path.merchant_code`; string, required) — The merchant code.
  - maxLength 30; example `"MCZM9TGQ"`
- `sale_id` (`GetSaleV10.path.sale_id`; string, required) — The sale ID.
  - example `"5965aa65-e45a-4cc1-9063-c1c1e3b8607f"`

## Code samples

### CLI

```bash
sumup sales get "5965aa65-e45a-4cc1-9063-c1c1e3b8607f" \
  --merchant-code "MCZM9TGQ"

```

### JavaScript

```typescript
import SumUp from "@sumup/sdk";

async function main() {
  const client = new SumUp({ apiKey: "sup_sk_your_api_key" });

  const result = await client.sales.getSaleV10(
    "MCZM9TGQ",
    "5965aa65-e45a-4cc1-9063-c1c1e3b8607f"
  );
  console.log(result);
}

main().catch(console.error);

```

### .NET

```csharp
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using SumUp;

public static class Program
{
    public static async Task Main()
    {
        using var client = new SumUpClient();
        var response = await client.Sales.GetSaleV10Async(
            "your-merchant-code",
            "example-id");

        Console.WriteLine(response.StatusCode);
    }
}

```

### Java

```java
import com.sumup.sdk.SumUpClient;

public final class GetSaleV10Sample {
  public static void main(String[] args) throws Exception {
    var client = new SumUpClient();

    var result = client.sales().getSaleV10(
            "MCZM9TGQ",
            "5965aa65-e45a-4cc1-9063-c1c1e3b8607f"
        );
    System.out.println(result);
  }
}

```

### Python

```python
import os

import sumup

client = sumup.Sumup(api_key=os.environ["SUMUP_API_KEY"])
result = client.sales.get_sale_v_10(
    "MCZM9TGQ",
    "5965aa65-e45a-4cc1-9063-c1c1e3b8607f",
)
print(result)

```

### PHP

```php
<?php

declare(strict_types=1);

require __DIR__ . '/vendor/autoload.php';

$sumup = new \SumUp\SumUp('sup_sk_your_api_key');

$result = $sumup->sales()->getSaleV10(
    'MCZM9TGQ',
    '5965aa65-e45a-4cc1-9063-c1c1e3b8607f',
);

var_dump($result);

```

### Go

```go
package main

import (
	"context"
	"fmt"

	"github.com/sumup/sumup-go"
)

func main() {
	client := sumup.NewClient()
	result, err := client.Sales.GetSaleV10(context.TODO(), "MCZM9TGQ", "5965aa65-e45a-4cc1-9063-c1c1e3b8607f")
	if err != nil {
		panic(err.Error())
	}

	fmt.Printf("%+v\n", result)
}

```

### Rust

```rust
use sumup::{Authorization, Client};
#[tokio::main]
async fn main() {
    let client = Client::default()
        .with_authorization(Authorization::api_key("sup_sk_test_..."));
    let response = client
        .sales()
        .get_sale_v10("MERCHANT_CODE", "RESOURCE_ID")
        .await
        .expect("get_sale_v10 request failed");
    println!("{response:#?}");
}

```

### cURL

```bash
curl --request GET \
  --url https://api.sumup.com/v1.0/merchants/MCZM9TGQ/sales/5965aa65-e45a-4cc1-9063-c1c1e3b8607f \
  --header 'Authorization: Bearer <token>'
```

## Responses

### 200

Sale data with item lines and payments.

#### Example

```json
{
  "id": "dbe3178d-4b83-5024-9b26-9b8e1b280514",
  "currency": {
    "code": "EUR",
    "scale": 2
  },
  "tax_mode": "GROSS",
  "state": "CLOSED",
  "price": {
    "net_amount": 777,
    "gross_amount": 925,
    "taxes": [
      {
        "id": "tax-vat-19",
        "net_amount": 777,
        "gross_amount": 925,
        "tax_amount": 148
      }
    ]
  },
  "created_at": "2026-06-02T10:15:00Z",
  "closed_at": "2026-06-02T10:20:00Z",
  "source": {
    "channel": "POS"
  },
  "items": [
    {
      "id": "line-1",
      "type": "CATALOG",
      "name": "Cappuccino",
      "quantity": 1,
      "price": {
        "unit_amount": 300,
        "total_net_amount": 252,
        "total_gross_amount": 300,
        "taxes": [
          {
            "id": "tax-vat-19",
            "net_amount": 252,
            "gross_amount": 300,
            "tax_amount": 48
          }
        ],
        "total_net_amount_final": 252,
        "total_gross_amount_final": 300,
        "taxes_final": [
          {
            "id": "tax-vat-19",
            "net_amount": 252,
            "gross_amount": 300,
            "tax_amount": 48
          }
        ]
      }
    }
  ],
  "payments": [
    {
      "method": "apple_pay",
      "reference": "TERTYFQ4G3",
      "type": "purchase",
      "amount": 975,
      "status": "SUCCESSFUL",
      "processed_at": "2026-06-02T10:20:00Z"
    }
  ]
}
```

- `id` (`GetSaleV10.response.200.id`; string, required) — The ID of the sale.
  - example `"dbe3178d-4b83-5024-9b26-9b8e1b280514"`
- `currency` (`GetSaleV10.response.200.currency`; string, required) — Three-letter [ISO 4217](https://en.wikipedia.org/wiki/ISO_4217) currency code of the amount.
  - one of `"BRL"`, `"CHF"`, `"CLP"`, `"COP"`, `"CZK"`, `"DKK"`, `"EUR"`, `"GBP"`, `"HRK"`, `"HUF"`, `"NOK"`, `"PLN"`, `"RON"`, `"SEK"`, `"USD"`; example `"EUR"`
- `items` (`GetSaleV10.response.200.items`; array<object>, required) — The lines sold in this sale, in the order they were added to the cart. Includes merchant fees (`type: "FEE"`) when present; fee details are in `features`.
  - `id` (`GetSaleV10.response.200.items.id`; string, required) — Stable identifier of the line within the sale. Used for linking (e.g. deposits).
    - maxLength 100; example `"line-1"`
  - `type` (`GetSaleV10.response.200.items.type`; string, required) — Classifies a sale line. Not a schema subclass. Known values: `CATALOG`, `DEPOSIT`, `GIFT_CARD`, `CUSTOM`, `FEE`. `FEE` lines represent merchant-charged fees on the sale (e.g. shipping, service charge, surcharge, cancellation). They participate in sale totals like any other line; type-specific data is carried in `features` (see `Feature` for the conventional feature keys). This is intentionally an open string, NOT a closed enum: new values are added over time as pure data and consumers MUST tolerate unknown values, rendering the line from the generic envelope (name, quantity, price, taxes) and reading any extra information from `features`.
    - example `"CATALOG"`
  - `name` (`GetSaleV10.response.200.items.name`; string, required) — Display name of the line.
    - maxLength 250; example `"Cappuccino"`
  - `quantity` (`GetSaleV10.response.200.items.quantity`; number, required) — The numerical value representing the quantity in the specified unit.
    - format `double`; min 0; example `2.15332`
  - `unit_of_measure` (`GetSaleV10.response.200.items.unit_of_measure`; object, required) — The unit of measure of the item.
    - `group_id` (`GetSaleV10.response.200.items.unit_of_measure.group_id`; string, required) — The group of the unit of measure.
      - maxLength 100; example `"weight"`
    - `unit_id` (`GetSaleV10.response.200.items.unit_of_measure.unit_id`; string, required) — The specific unit of measure within the group.
      - maxLength 100; example `"weight.kilogram"`
    - `unit_ratio` (`GetSaleV10.response.200.items.unit_of_measure.unit_ratio`; number, required) — The ratio of the specified unit to the base unit of the group.
      - format `double`; example `1.24412`
  - `price` (`GetSaleV10.response.200.items.price`; object, required) — Pricing for a single line, valid for every item type. Merges the standard amounts (with tax breakdown) and the final amounts (after discounts/modifiers). Totals and tax amounts can be negative for return-like operations (for example a deposit with `operation_type` = `RETURN`).
    - `unit_amount` (`GetSaleV10.response.200.items.price.unit_amount`; integer, required) — The price of a single unit. If the tax_mode is GROSS it includes taxes, otherwise no tax is included. It does NOT include discounts.
      - format `int64`; min 0; example `300`
    - `total_net_amount` (`GetSaleV10.response.200.items.price.total_net_amount`; object, required) — The net amount (including modifiers if applied). It does NOT include discounts.
      - example `252`
      - `currency` (`GetSaleV10.response.200.items.price.total_net_amount.currency`; string, required) — Currency ISO 4217 code
        - example `"MXN"`
      - `value` (`GetSaleV10.response.200.items.price.total_net_amount.value`; integer, required) — Amount in minor units (e.g. cents).
        - example `1000`
    - `total_gross_amount` (`GetSaleV10.response.200.items.price.total_gross_amount`; object, required) — The gross amount (including modifiers if applied). It does NOT include discounts.
      - example `300`
      - `currency` (`GetSaleV10.response.200.items.price.total_gross_amount.currency`; string, required) — Currency ISO 4217 code
        - example `"MXN"`
      - `value` (`GetSaleV10.response.200.items.price.total_gross_amount.value`; integer, required) — Amount in minor units (e.g. cents).
        - example `1000`
    - `taxes` (`GetSaleV10.response.200.items.price.taxes`; array<object>, required) — Taxes applied on top of the net amount resulting in the gross amount.
      - example `[{"id":"tax-vat-19","net_amount":252,"gross_amount":300,"tax_amount":48}]`
      - `id` (`GetSaleV10.response.200.items.price.taxes.id`; string, required) — Tax ID from the Tax Service (External Id)
        - maxLength 100; example `"b064ed44-66e1-45a1-a963-b783808f0436"`
      - `net_amount` (`GetSaleV10.response.200.items.price.taxes.net_amount`; object, required) — Net amount before applying the tax. The value of the amount in minor units of the currency according to the Sale.currency.scale.
        - `currency` (`GetSaleV10.response.200.items.price.taxes.net_amount.currency`; string, required) — Currency ISO 4217 code
          - example `"MXN"`
        - `value` (`GetSaleV10.response.200.items.price.taxes.net_amount.value`; integer, required) — Amount in minor units (e.g. cents).
          - example `1000`
      - `gross_amount` (`GetSaleV10.response.200.items.price.taxes.gross_amount`; object, required) — Gross amount after applying the tax. The value of the amount in minor units of the currency according to the Sale.currency.scale.
        - `currency` (`GetSaleV10.response.200.items.price.taxes.gross_amount.currency`; string, required) — Currency ISO 4217 code
          - example `"MXN"`
        - `value` (`GetSaleV10.response.200.items.price.taxes.gross_amount.value`; integer, required) — Amount in minor units (e.g. cents).
          - example `1000`
      - `tax_amount` (`GetSaleV10.response.200.items.price.taxes.tax_amount`; object, required) — Amount of tax. The value of the amount in minor units of the currency according to the Sale.currency.scale.
        - `currency` (`GetSaleV10.response.200.items.price.taxes.tax_amount.currency`; string, required) — Currency ISO 4217 code
          - example `"MXN"`
        - `value` (`GetSaleV10.response.200.items.price.taxes.tax_amount.value`; integer, required) — Amount in minor units (e.g. cents).
          - example `1000`
      - `name` (`GetSaleV10.response.200.items.price.taxes.name`; string, optional) — Tax name, e.g. "MwSt."
        - maxLength 255
      - `percentage` (`GetSaleV10.response.200.items.price.taxes.percentage`; integer, optional) — The tax rate percentage in minor units (1/100000). For example 19000 = 19%.
        - format `int64`; min 0; example `19000`
    - `total_net_amount_final` (`GetSaleV10.response.200.items.price.total_net_amount_final`; object, required) — The final net amount including discounts and modifiers. Equals `total_net_amount` if no discounts apply.
      - example `210`
      - `currency` (`GetSaleV10.response.200.items.price.total_net_amount_final.currency`; string, required) — Currency ISO 4217 code
        - example `"MXN"`
      - `value` (`GetSaleV10.response.200.items.price.total_net_amount_final.value`; integer, required) — Amount in minor units (e.g. cents).
        - example `1000`
    - `total_gross_amount_final` (`GetSaleV10.response.200.items.price.total_gross_amount_final`; object, required) — The final gross amount including discounts, modifiers and taxes. Equals `total_gross_amount` if no discounts apply.
      - example `250`
      - `currency` (`GetSaleV10.response.200.items.price.total_gross_amount_final.currency`; string, required) — Currency ISO 4217 code
        - example `"MXN"`
      - `value` (`GetSaleV10.response.200.items.price.total_gross_amount_final.value`; integer, required) — Amount in minor units (e.g. cents).
        - example `1000`
    - `taxes_final` (`GetSaleV10.response.200.items.price.taxes_final`; array<object>, required) — Taxes applied on top of `total_net_amount_final` resulting in `total_gross_amount_final`. Equals `taxes` if no discounts apply.
      - example `[{"id":"tax-vat-19","net_amount":210,"gross_amount":250,"tax_amount":40}]`
      - `id` (`GetSaleV10.response.200.items.price.taxes_final.id`; string, required) — Tax ID from the Tax Service (External Id)
        - maxLength 100; example `"b064ed44-66e1-45a1-a963-b783808f0436"`
      - `net_amount` (`GetSaleV10.response.200.items.price.taxes_final.net_amount`; object, required) — Net amount before applying the tax. The value of the amount in minor units of the currency according to the Sale.currency.scale.
        - `currency` (`GetSaleV10.response.200.items.price.taxes_final.net_amount.currency`; string, required) — Currency ISO 4217 code
          - example `"MXN"`
        - `value` (`GetSaleV10.response.200.items.price.taxes_final.net_amount.value`; integer, required) — Amount in minor units (e.g. cents).
          - example `1000`
      - `gross_amount` (`GetSaleV10.response.200.items.price.taxes_final.gross_amount`; object, required) — Gross amount after applying the tax. The value of the amount in minor units of the currency according to the Sale.currency.scale.
        - `currency` (`GetSaleV10.response.200.items.price.taxes_final.gross_amount.currency`; string, required) — Currency ISO 4217 code
          - example `"MXN"`
        - `value` (`GetSaleV10.response.200.items.price.taxes_final.gross_amount.value`; integer, required) — Amount in minor units (e.g. cents).
          - example `1000`
      - `tax_amount` (`GetSaleV10.response.200.items.price.taxes_final.tax_amount`; object, required) — Amount of tax. The value of the amount in minor units of the currency according to the Sale.currency.scale.
        - `currency` (`GetSaleV10.response.200.items.price.taxes_final.tax_amount.currency`; string, required) — Currency ISO 4217 code
          - example `"MXN"`
        - `value` (`GetSaleV10.response.200.items.price.taxes_final.tax_amount.value`; integer, required) — Amount in minor units (e.g. cents).
          - example `1000`
      - `name` (`GetSaleV10.response.200.items.price.taxes_final.name`; string, optional) — Tax name, e.g. "MwSt."
        - maxLength 255
      - `percentage` (`GetSaleV10.response.200.items.price.taxes_final.percentage`; integer, optional) — The tax rate percentage in minor units (1/100000). For example 19000 = 19%.
        - format `int64`; min 0; example `19000`
    - `discounts` (`GetSaleV10.response.200.items.price.discounts`; array<object>, optional) — Discounts applied. Discount amounts do not affect `total_net_amount` / `total_gross_amount`; they are reflected in the `*_final` amounts.
      - example `[]`
      - `level` (`GetSaleV10.response.200.items.price.discounts.level`; string, required) — Specifies where discount was applied by user (either merchant or consumer): - CART: Applied to the whole cart (calculated and distributed per sale item) - ITEM: Applied to specific sale item *Accepted values:* ["ITEM", "CART"].
        - minLength 4; maxLength 4; example `"CART"`
      - `source` (`GetSaleV10.response.200.items.price.discounts.source`; object, required) — The source of discount. Exactly one property must be set.
        - `ad_hoc` (`GetSaleV10.response.200.items.price.discounts.source.ad_hoc`; object, optional) — Discount created ad-hoc on device during checkout.
          - `id` (`GetSaleV10.response.200.items.price.discounts.source.ad_hoc.id`; string, optional) — The unique identifier of the ad-hoc discount.
            - format `uuid`; example `"075b0b5c-a1f4-46da-9aca-92fb6dd5905d"`
          - `name` (`GetSaleV10.response.200.items.price.discounts.source.ad_hoc.name`; string, optional) — The name of the ad-hoc discount.
            - maxLength 100; example `"Happy Hour"`
          - `description` (`GetSaleV10.response.200.items.price.discounts.source.ad_hoc.description`; string, optional) — The description of the ad-hoc discount.
            - maxLength 250; example `"Happy Hour from 10 to 12."`
        - `basic` (`GetSaleV10.response.200.items.price.discounts.source.basic`; object, optional) — Preset discount applied manually on the POS.
          - `id` (`GetSaleV10.response.200.items.price.discounts.source.basic.id`; string, required) — The unique identifier of the basic discount.
            - format `uuid`; example `"075b0b5c-a1f4-46da-9aca-92fb6dd5905d"`
          - `name` (`GetSaleV10.response.200.items.price.discounts.source.basic.name`; string, required) — The name of the basic discount.
            - maxLength 100; example `"Staff discount"`
          - `application_mode` (`GetSaleV10.response.200.items.price.discounts.source.basic.application_mode`; string, required) — Method of applying the discount to the items or cart.
            - one of `"MANUAL"`, `"AUTOMATIC"`; example `"MANUAL"`
          - `description` (`GetSaleV10.response.200.items.price.discounts.source.basic.description`; string, optional, nullable) — The description of the loyalty discount.
            - maxLength 250; example `"10% off food for staff members."`
        - `coupon` (`GetSaleV10.response.200.items.price.discounts.source.coupon`; object, optional) — Discount applied manually when entering a coupon code at checkout.
          - `id` (`GetSaleV10.response.200.items.price.discounts.source.coupon.id`; string, required) — The unique identifier of the coupon discount.
            - format `uuid`; example `"075b0b5c-a1f4-46da-9aca-92fb6dd5905d"`
          - `code` (`GetSaleV10.response.200.items.price.discounts.source.coupon.code`; string, required) — The coupon code.
            - maxLength 100; example `"FREE_COFFEE"`
          - `name` (`GetSaleV10.response.200.items.price.discounts.source.coupon.name`; string, required) — The name of the coupon discount.
            - maxLength 100; example `"Free coffee"`
          - `application_mode` (`GetSaleV10.response.200.items.price.discounts.source.coupon.application_mode`; string, required) — Method of applying the discount to the items or cart.
            - one of `"MANUAL"`, `"AUTOMATIC"`; example `"MANUAL"`
          - `description` (`GetSaleV10.response.200.items.price.discounts.source.coupon.description`; string, optional, nullable) — The description of the coupon discount.
            - maxLength 250; example `"Free coffee with this coupon."`
          - `discount_class` (`GetSaleV10.response.200.items.price.discounts.source.coupon.discount_class`; string, optional, nullable) — The method used to target items to discount. Must be populated for ITEM level discounts, and must be null for CART level discounts (CART level targets all items, therefore none of these categories apply).
            - one of `"ITEM"`, `"CATEGORY"`, `"BUNDLE"`, `"BUY_X_GET_Y"`, `"MEAL_DEAL"`; example `"ITEM"`
        - `offer` (`GetSaleV10.response.200.items.price.discounts.source.offer`; object, optional) — Discount applied automatically when cart is updated based on preset promotions.
          - `id` (`GetSaleV10.response.200.items.price.discounts.source.offer.id`; string, required) — The unique identifier of the offer discount.
            - format `uuid`; example `"075b0b5c-a1f4-46da-9aca-92fb6dd5905d"`
          - `name` (`GetSaleV10.response.200.items.price.discounts.source.offer.name`; string, required) — The name of the offer discount.
            - maxLength 100; example `"Breakfast combo deal"`
          - `application_mode` (`GetSaleV10.response.200.items.price.discounts.source.offer.application_mode`; string, required) — Method of applying the discount to the items or cart.
            - one of `"MANUAL"`, `"AUTOMATIC"`; example `"MANUAL"`
          - `description` (`GetSaleV10.response.200.items.price.discounts.source.offer.description`; string, optional, nullable) — The description of the offer discount.
            - maxLength 250; example `"Buy a Croissant, get a coffee for £1"`
          - `discount_class` (`GetSaleV10.response.200.items.price.discounts.source.offer.discount_class`; string, optional, nullable) — The method used to target items to discount. Must be populated for ITEM level discounts, and must be null for CART level discounts (CART level targets all items, therefore none of these categories apply).
            - one of `"ITEM"`, `"CATEGORY"`, `"BUNDLE"`, `"BUY_X_GET_Y"`, `"MEAL_DEAL"`; example `"ITEM"`
        - `loyalty` (`GetSaleV10.response.200.items.price.discounts.source.loyalty`; object, optional) — Discount applied when redeeming a reward from the merchant's loyalty scheme.
          - `id` (`GetSaleV10.response.200.items.price.discounts.source.loyalty.id`; string, required) — The unique identifier of the promotion or reward.
            - format `uuid`; example `"075b0b5c-a1f4-46da-9aca-92fb6dd5905d"`
          - `loyalty_type` (`GetSaleV10.response.200.items.price.discounts.source.loyalty.loyalty_type`; string, required) — The type of loyalty discount, either a promotion (e.g. new customer discount) or a reward (free coffee after completing stamp card).
            - one of `"PROMOTION"`, `"REWARD"`; example `"REWARD"`
          - `scheme_type` (`GetSaleV10.response.200.items.price.discounts.source.loyalty.scheme_type`; string, required) — The scheme type of the loyalty program.
            - one of `"STAMPS"`, `"POINTS"`; example `"POINTS"`
          - `name` (`GetSaleV10.response.200.items.price.discounts.source.loyalty.name`; string, required) — The name of the loyalty discount.
            - maxLength 100; example `"Free coffee"`
          - `application_mode` (`GetSaleV10.response.200.items.price.discounts.source.loyalty.application_mode`; string, required) — Method of applying the discount to the items or cart.
            - one of `"MANUAL"`, `"AUTOMATIC"`; example `"MANUAL"`
          - `points` (`GetSaleV10.response.200.items.price.discounts.source.loyalty.points`; integer, optional, nullable) — The number of points used for this loyalty discount. Must be a positive integer if the scheme type is POINTS. Must not be populated if the scheme type is STAMPS.
            - format `int64`; min 1; example `50`
          - `description` (`GetSaleV10.response.200.items.price.discounts.source.loyalty.description`; string, optional, nullable) — The description of the loyalty discount.
            - maxLength 250; example `"Free coffee for 50 points"`
          - `discount_class` (`GetSaleV10.response.200.items.price.discounts.source.loyalty.discount_class`; string, optional, nullable) — The method used to target items to discount. Must be populated for ITEM level discounts, and must be null for CART level discounts (CART level targets all items, therefore none of these categories apply).
            - one of `"ITEM"`, `"CATEGORY"`, `"BUNDLE"`, `"BUY_X_GET_Y"`, `"MEAL_DEAL"`; example `"ITEM"`
      - `value` (`GetSaleV10.response.200.items.price.discounts.value`; object, required) — The value type of the discount, either a percentage based or absolute monetary value. It is required that only one of the following is set: - absolute - percentage.
        - `absolute` (`GetSaleV10.response.200.items.price.discounts.value.absolute`; integer, optional) — The absolute value in minor units of the currency according to the Sale.currency.scale. Example: 10000 = 10.00
          - format `int64`; min 0; example `100`
        - `percentage` (`GetSaleV10.response.200.items.price.discounts.value.percentage`; integer, optional) — The percentage in minor units (1/100000). Examples: - 10% -> 0.10 (decimal) = 10000 (minor units) - 15.5% -> 0.155 (decimal) = 15500 (minor units) - 0.001% -> 0.00001 (decimal) = 1 (minor units)
          - format `int64`; min 0; example `10000`
      - `net_amount` (`GetSaleV10.response.200.items.price.discounts.net_amount`; integer, required) — The net amount of the discount. The value of the amount in minor units of the currency according to the Sale.currency.scale.
        - format `int64`; min 0; example `100`
      - `gross_amount` (`GetSaleV10.response.200.items.price.discounts.gross_amount`; integer, required) — The gross amount of the discount. The value of the amount in minor units of the currency according to the Sale.currency.scale.
        - format `int64`; min 0; example `100`
      - `tax_amount` (`GetSaleV10.response.200.items.price.discounts.tax_amount`; integer, required) — The tax amount of the discount. The value of the amount in minor units of the currency according to the Sale.currency.scale.
        - format `int64`; min 0; example `100`
      - `id` (`GetSaleV10.response.200.items.price.discounts.id`; string, optional) — An id used to associate a discount line with a specific discount. Since we can apply multiple discounts (e.g. 2x 10% whole cart off) we need to be able to identify which discount line belongs to which cart discount. Recommended to use UUID identifiers.
        - maxLength 100; example `"075b0b5c-a1f4-46da-9aca-92fb6dd5905d"`
      - `description` (`GetSaleV10.response.200.items.price.discounts.description`; string, optional) — A description or reason of the discount.
        - maxLength 250; example `"Happy Hour"`
  - `service_type` (`GetSaleV10.response.200.items.service_type`; string, optional) — The type of service for this line.
    - one of `"IN_HOUSE"`, `"TAKE_AWAY"`; example `"IN_HOUSE"`
  - `note` (`GetSaleV10.response.200.items.note`; string, optional) — Optional free-text note attached to the line, visible on receipts.
    - maxLength 300; example `"extra hot"`
  - `categories` (`GetSaleV10.response.200.items.categories`; array<object>, optional) — Categories the line belongs to. A shared optional structure available to any line; not a per-type field.
    - example `[{"id":"cat-hot-drinks","name":"Hot Drinks"}]`
    - `id` (`GetSaleV10.response.200.items.categories.id`; string, required) — The category id. Usually a UUID, but not always (legacy cases).
      - maxLength 100; example `"b064ed44-66e1-45a1-a963-b783808f0436"`
    - `name` (`GetSaleV10.response.200.items.categories.name`; string, required) — The category name.
      - maxLength 30; example `"Food"`
  - `modifiers` (`GetSaleV10.response.200.items.modifiers`; array<object>, optional) — Modifiers customise a line (e.g. "oat milk" on a cappuccino). A shared optional structure available to any line; not a per-type field.
    - example `[]`
    - `unit_amount` (`GetSaleV10.response.200.items.modifiers.unit_amount`; integer, required) — The price of a single unit. If the tax_mode is GROSS, it includes taxes, otherwise no tax included. It doesn't include discounts.
      - format `int64`; min 0; example `100`
    - `total_net_amount` (`GetSaleV10.response.200.items.modifiers.total_net_amount`; integer, required) — The value of the amount in minor units of the currency according to the Sale.currency.scale. `value` can get large for some currencies and applications. Use Long type or a similar data type when parsing `value`.
      - format `int64`; min 0; example `100`
    - `total_gross_amount` (`GetSaleV10.response.200.items.modifiers.total_gross_amount`; integer, required) — The value of the amount in minor units of the currency according to the Sale.currency.scale. `value` can get large for some currencies and applications. Use Long type or a similar data type when parsing `value`.
      - format `int64`; min 0; example `100`
    - `taxes` (`GetSaleV10.response.200.items.modifiers.taxes`; array<unknown>, required) — Taxes applied on top of net amount resulting in gross amount.
      - `id` (`GetSaleV10.response.200.items.modifiers.taxes.id`; string, required) — Tax ID from the Tax Service (External Id)
        - maxLength 100; example `"b064ed44-66e1-45a1-a963-b783808f0436"`
      - `net_amount` (`GetSaleV10.response.200.items.modifiers.taxes.net_amount`; integer, required) — Net amount before applying the tax. The value of the amount in minor units of the currency according to the Sale.currency.scale.
        - format `int64`; min 0; example `100`
      - `gross_amount` (`GetSaleV10.response.200.items.modifiers.taxes.gross_amount`; integer, required) — Gross amount after applying the tax. The value of the amount in minor units of the currency according to the Sale.currency.scale.
        - format `int64`; min 0; example `100`
      - `tax_amount` (`GetSaleV10.response.200.items.modifiers.taxes.tax_amount`; integer, required) — Amount of tax. The value of the amount in minor units of the currency according to the Sale.currency.scale.
        - format `int64`; min 0; example `100`
      - `name` (`GetSaleV10.response.200.items.modifiers.taxes.name`; string, optional) — Tax name, e.g. "MwSt."
        - maxLength 255
      - `percentage` (`GetSaleV10.response.200.items.modifiers.taxes.percentage`; integer, optional) — The tax rate percentage in minor units (1/100000). For example 19000 = 19%.
        - format `int64`; min 0; example `19000`
    - `total_net_amount_final` (`GetSaleV10.response.200.items.modifiers.total_net_amount_final`; integer, required) — The final net amount includes discounts and modifiers. It does NOT include taxes. If no discounts are applied, it should be equal to total_net_amount.
      - format `int64`; min 0; example `100`
    - `total_gross_amount_final` (`GetSaleV10.response.200.items.modifiers.total_gross_amount_final`; integer, required) — The final gross amount includes discounts, modifiers, and taxes. If no discounts are applied, it should be equal to total_gross_amount.
      - format `int64`; min 0; example `100`
    - `taxes_final` (`GetSaleV10.response.200.items.modifiers.taxes_final`; array<unknown>, required) — Taxes applied on top of `total_net_amount_final` amount resulting in `total_gross_amount_final` amount. If no discounts are applied, it should be equal to `taxes`.
      - `id` (`GetSaleV10.response.200.items.modifiers.taxes_final.id`; string, required) — Tax ID from the Tax Service (External Id)
        - maxLength 100; example `"b064ed44-66e1-45a1-a963-b783808f0436"`
      - `net_amount` (`GetSaleV10.response.200.items.modifiers.taxes_final.net_amount`; integer, required) — Net amount before applying the tax. The value of the amount in minor units of the currency according to the Sale.currency.scale.
        - format `int64`; min 0; example `100`
      - `gross_amount` (`GetSaleV10.response.200.items.modifiers.taxes_final.gross_amount`; integer, required) — Gross amount after applying the tax. The value of the amount in minor units of the currency according to the Sale.currency.scale.
        - format `int64`; min 0; example `100`
      - `tax_amount` (`GetSaleV10.response.200.items.modifiers.taxes_final.tax_amount`; integer, required) — Amount of tax. The value of the amount in minor units of the currency according to the Sale.currency.scale.
        - format `int64`; min 0; example `100`
      - `name` (`GetSaleV10.response.200.items.modifiers.taxes_final.name`; string, optional) — Tax name, e.g. "MwSt."
        - maxLength 255
      - `percentage` (`GetSaleV10.response.200.items.modifiers.taxes_final.percentage`; integer, optional) — The tax rate percentage in minor units (1/100000). For example 19000 = 19%.
        - format `int64`; min 0; example `19000`
    - `id` (`GetSaleV10.response.200.items.modifiers.id`; string, required) — Modifier id, coming from the Item Catalog
      - maxLength 100; example `"b064ed44-66e1-45a1-a963-b783808f0436"`
    - `name` (`GetSaleV10.response.200.items.modifiers.name`; string, required) — Modifier name, coming from the Item Catalog
      - maxLength 150; example `"Extra Cheese"`
    - `set` (`GetSaleV10.response.200.items.modifiers.set`; object, required) — Modifier set attached to an item.
      - `id` (`GetSaleV10.response.200.items.modifiers.set.id`; string, required) — The id of the modifier set that modifier belongs to.
        - maxLength 100; example `"b064ed44-66e1-45a1-a963-b783808f0436"`
      - `name` (`GetSaleV10.response.200.items.modifiers.set.name`; string, required) — The name of the modifier set that the modifier belongs to.
        - minLength 1; maxLength 150; example `"Burger Toppings"`
    - `quantity` (`GetSaleV10.response.200.items.modifiers.quantity`; number, required) — The numerical value representing the quantity in the specified unit.
      - format `double`; min 0; example `2.15332`
    - `discounts` (`GetSaleV10.response.200.items.modifiers.discounts`; array<object>, optional) — Discounts applied. Important: Discount amounts shouldn't take effect on net and gross amounts. Discount money amounts depend on where discount was applied: - for item level discount: whole discount money amount is applied - for cart level discount: only part of the whole amount is applied (discount money value is split on each line item)
      - `level` (`GetSaleV10.response.200.items.modifiers.discounts.level`; string, required) — Specifies where discount was applied by user (either merchant or consumer): - CART: Applied to the whole cart (calculated and distributed per sale item) - ITEM: Applied to specific sale item *Accepted values:* ["ITEM", "CART"].
        - minLength 4; maxLength 4; example `"CART"`
      - `source` (`GetSaleV10.response.200.items.modifiers.discounts.source`; object, required) — The source of discount. Exactly one property must be set.
        - `ad_hoc` (`GetSaleV10.response.200.items.modifiers.discounts.source.ad_hoc`; object, optional) — Discount created ad-hoc on device during checkout.
          - `id` (`GetSaleV10.response.200.items.modifiers.discounts.source.ad_hoc.id`; string, optional) — The unique identifier of the ad-hoc discount.
            - format `uuid`; example `"075b0b5c-a1f4-46da-9aca-92fb6dd5905d"`
          - `name` (`GetSaleV10.response.200.items.modifiers.discounts.source.ad_hoc.name`; string, optional) — The name of the ad-hoc discount.
            - maxLength 100; example `"Happy Hour"`
          - `description` (`GetSaleV10.response.200.items.modifiers.discounts.source.ad_hoc.description`; string, optional) — The description of the ad-hoc discount.
            - maxLength 250; example `"Happy Hour from 10 to 12."`
        - `basic` (`GetSaleV10.response.200.items.modifiers.discounts.source.basic`; object, optional) — Preset discount applied manually on the POS.
          - `id` (`GetSaleV10.response.200.items.modifiers.discounts.source.basic.id`; string, required) — The unique identifier of the basic discount.
            - format `uuid`; example `"075b0b5c-a1f4-46da-9aca-92fb6dd5905d"`
          - `name` (`GetSaleV10.response.200.items.modifiers.discounts.source.basic.name`; string, required) — The name of the basic discount.
            - maxLength 100; example `"Staff discount"`
          - `application_mode` (`GetSaleV10.response.200.items.modifiers.discounts.source.basic.application_mode`; string, required) — Method of applying the discount to the items or cart.
            - one of `"MANUAL"`, `"AUTOMATIC"`; example `"MANUAL"`
          - `description` (`GetSaleV10.response.200.items.modifiers.discounts.source.basic.description`; string, optional, nullable) — The description of the loyalty discount.
            - maxLength 250; example `"10% off food for staff members."`
        - `coupon` (`GetSaleV10.response.200.items.modifiers.discounts.source.coupon`; object, optional) — Discount applied manually when entering a coupon code at checkout.
          - `id` (`GetSaleV10.response.200.items.modifiers.discounts.source.coupon.id`; string, required) — The unique identifier of the coupon discount.
            - format `uuid`; example `"075b0b5c-a1f4-46da-9aca-92fb6dd5905d"`
          - `code` (`GetSaleV10.response.200.items.modifiers.discounts.source.coupon.code`; string, required) — The coupon code.
            - maxLength 100; example `"FREE_COFFEE"`
          - `name` (`GetSaleV10.response.200.items.modifiers.discounts.source.coupon.name`; string, required) — The name of the coupon discount.
            - maxLength 100; example `"Free coffee"`
          - `application_mode` (`GetSaleV10.response.200.items.modifiers.discounts.source.coupon.application_mode`; string, required) — Method of applying the discount to the items or cart.
            - one of `"MANUAL"`, `"AUTOMATIC"`; example `"MANUAL"`
          - `description` (`GetSaleV10.response.200.items.modifiers.discounts.source.coupon.description`; string, optional, nullable) — The description of the coupon discount.
            - maxLength 250; example `"Free coffee with this coupon."`
          - `discount_class` (`GetSaleV10.response.200.items.modifiers.discounts.source.coupon.discount_class`; string, optional, nullable) — The method used to target items to discount. Must be populated for ITEM level discounts, and must be null for CART level discounts (CART level targets all items, therefore none of these categories apply).
            - one of `"ITEM"`, `"CATEGORY"`, `"BUNDLE"`, `"BUY_X_GET_Y"`, `"MEAL_DEAL"`; example `"ITEM"`
        - `offer` (`GetSaleV10.response.200.items.modifiers.discounts.source.offer`; object, optional) — Discount applied automatically when cart is updated based on preset promotions.
          - `id` (`GetSaleV10.response.200.items.modifiers.discounts.source.offer.id`; string, required) — The unique identifier of the offer discount.
            - format `uuid`; example `"075b0b5c-a1f4-46da-9aca-92fb6dd5905d"`
          - `name` (`GetSaleV10.response.200.items.modifiers.discounts.source.offer.name`; string, required) — The name of the offer discount.
            - maxLength 100; example `"Breakfast combo deal"`
          - `application_mode` (`GetSaleV10.response.200.items.modifiers.discounts.source.offer.application_mode`; string, required) — Method of applying the discount to the items or cart.
            - one of `"MANUAL"`, `"AUTOMATIC"`; example `"MANUAL"`
          - `description` (`GetSaleV10.response.200.items.modifiers.discounts.source.offer.description`; string, optional, nullable) — The description of the offer discount.
            - maxLength 250; example `"Buy a Croissant, get a coffee for £1"`
          - `discount_class` (`GetSaleV10.response.200.items.modifiers.discounts.source.offer.discount_class`; string, optional, nullable) — The method used to target items to discount. Must be populated for ITEM level discounts, and must be null for CART level discounts (CART level targets all items, therefore none of these categories apply).
            - one of `"ITEM"`, `"CATEGORY"`, `"BUNDLE"`, `"BUY_X_GET_Y"`, `"MEAL_DEAL"`; example `"ITEM"`
        - `loyalty` (`GetSaleV10.response.200.items.modifiers.discounts.source.loyalty`; object, optional) — Discount applied when redeeming a reward from the merchant's loyalty scheme.
          - `id` (`GetSaleV10.response.200.items.modifiers.discounts.source.loyalty.id`; string, required) — The unique identifier of the promotion or reward.
            - format `uuid`; example `"075b0b5c-a1f4-46da-9aca-92fb6dd5905d"`
          - `loyalty_type` (`GetSaleV10.response.200.items.modifiers.discounts.source.loyalty.loyalty_type`; string, required) — The type of loyalty discount, either a promotion (e.g. new customer discount) or a reward (free coffee after completing stamp card).
            - one of `"PROMOTION"`, `"REWARD"`; example `"REWARD"`
          - `scheme_type` (`GetSaleV10.response.200.items.modifiers.discounts.source.loyalty.scheme_type`; string, required) — The scheme type of the loyalty program.
            - one of `"STAMPS"`, `"POINTS"`; example `"POINTS"`
          - `name` (`GetSaleV10.response.200.items.modifiers.discounts.source.loyalty.name`; string, required) — The name of the loyalty discount.
            - maxLength 100; example `"Free coffee"`
          - `application_mode` (`GetSaleV10.response.200.items.modifiers.discounts.source.loyalty.application_mode`; string, required) — Method of applying the discount to the items or cart.
            - one of `"MANUAL"`, `"AUTOMATIC"`; example `"MANUAL"`
          - `points` (`GetSaleV10.response.200.items.modifiers.discounts.source.loyalty.points`; integer, optional, nullable) — The number of points used for this loyalty discount. Must be a positive integer if the scheme type is POINTS. Must not be populated if the scheme type is STAMPS.
            - format `int64`; min 1; example `50`
          - `description` (`GetSaleV10.response.200.items.modifiers.discounts.source.loyalty.description`; string, optional, nullable) — The description of the loyalty discount.
            - maxLength 250; example `"Free coffee for 50 points"`
          - `discount_class` (`GetSaleV10.response.200.items.modifiers.discounts.source.loyalty.discount_class`; string, optional, nullable) — The method used to target items to discount. Must be populated for ITEM level discounts, and must be null for CART level discounts (CART level targets all items, therefore none of these categories apply).
            - one of `"ITEM"`, `"CATEGORY"`, `"BUNDLE"`, `"BUY_X_GET_Y"`, `"MEAL_DEAL"`; example `"ITEM"`
      - `value` (`GetSaleV10.response.200.items.modifiers.discounts.value`; object, required) — The value type of the discount, either a percentage based or absolute monetary value. It is required that only one of the following is set: - absolute - percentage.
        - `absolute` (`GetSaleV10.response.200.items.modifiers.discounts.value.absolute`; integer, optional) — The absolute value in minor units of the currency according to the Sale.currency.scale. Example: 10000 = 10.00
          - format `int64`; min 0; example `100`
        - `percentage` (`GetSaleV10.response.200.items.modifiers.discounts.value.percentage`; integer, optional) — The percentage in minor units (1/100000). Examples: - 10% -> 0.10 (decimal) = 10000 (minor units) - 15.5% -> 0.155 (decimal) = 15500 (minor units) - 0.001% -> 0.00001 (decimal) = 1 (minor units)
          - format `int64`; min 0; example `10000`
      - `net_amount` (`GetSaleV10.response.200.items.modifiers.discounts.net_amount`; integer, required) — The net amount of the discount. The value of the amount in minor units of the currency according to the Sale.currency.scale.
        - format `int64`; min 0; example `100`
      - `gross_amount` (`GetSaleV10.response.200.items.modifiers.discounts.gross_amount`; integer, required) — The gross amount of the discount. The value of the amount in minor units of the currency according to the Sale.currency.scale.
        - format `int64`; min 0; example `100`
      - `tax_amount` (`GetSaleV10.response.200.items.modifiers.discounts.tax_amount`; integer, required) — The tax amount of the discount. The value of the amount in minor units of the currency according to the Sale.currency.scale.
        - format `int64`; min 0; example `100`
      - `id` (`GetSaleV10.response.200.items.modifiers.discounts.id`; string, optional) — An id used to associate a discount line with a specific discount. Since we can apply multiple discounts (e.g. 2x 10% whole cart off) we need to be able to identify which discount line belongs to which cart discount. Recommended to use UUID identifiers.
        - maxLength 100; example `"075b0b5c-a1f4-46da-9aca-92fb6dd5905d"`
      - `description` (`GetSaleV10.response.200.items.modifiers.discounts.description`; string, optional) — A description or reason of the discount.
        - maxLength 250; example `"Happy Hour"`
  - `references` (`GetSaleV10.response.200.items.references`; object, optional) — Outward identifiers and links for a line, kept in one place rather than scattered per item type.
    - `catalog_source` (`GetSaleV10.response.200.items.references.catalog_source`; string, optional) — The source of the catalog the line originates from.
      - one of `"SUMUP"`, `"EXTERNAL"`; default `"SUMUP"`; example `"SUMUP"`
    - `catalog_reference` (`GetSaleV10.response.200.items.references.catalog_reference`; string, optional) — Reference to the backing catalog entity (item variant, deposit, ...), typically a URN such as `urn:sumup:pos:variant:${MERCHANT_CODE}:${ITEM_ID}:${VARIANT_ID}` or `urn:sumup:pos:deposit:${MERCHANT_CODE}:${DEPOSIT_ID}`. Empty for ad-hoc / manual lines. Type-agnostic on purpose: a new item type backed by a catalog entity reuses this field instead of adding its own.
      - maxLength 255; example `"urn:sumup:pos:variant:MCGLE7VC:9736e947-6f1f-487f-846a-c5954fb06a5a:7fff192f-ce29-4673-890f-2d68ba557946"`
    - `external_id` (`GetSaleV10.response.200.items.references.external_id`; string, optional) — An external reference id connecting this line to another system.
      - maxLength 250; example `"POS-LINE-001"`
    - `sku` (`GetSaleV10.response.200.items.references.sku`; string, optional) — Stock keeping unit, enriched from the Catalog when available.
      - maxLength 100; example `"COFFEE-LARGE"`
  - `features` (`GetSaleV10.response.200.items.features`; array<object>, optional) — Named, typed, type-specific data. New item types add their data here as features instead of new schema variants. See `Feature` for per-type examples.
    - example `[{"name":"variant_name","value_type":"TEXT","value":"Large"}]`
    - `name` (`GetSaleV10.response.200.items.features.name`; string, required) — The feature name/key.
      - maxLength 100; example `"operation_type"`
    - `value_type` (`GetSaleV10.response.200.items.features.value_type`; string, required) — The data type of a feature value. The wire `value` is always a string and is parsed according to this type.
      - one of `"TEXT"`, `"INTEGER"`, `"DECIMAL"`, `"DATE"`, `"BOOLEAN"`; example `"TEXT"`
    - `value` (`GetSaleV10.response.200.items.features.value`; string, required) — The feature value in canonical string form, to be parsed per `value_type` (e.g. INTEGER -> "3", DECIMAL -> "1.50", DATE -> "2026-07-02", BOOLEAN -> "true"). Carrying it as a string keeps the wire format stable as new feature names and value types are introduced.
      - maxLength 1000; example `"SALE"`
- `price` (`GetSaleV10.response.200.price`; object, required) — Sale-level pricing aggregate, parallel to `LineItemPrice` on each `SaleLineItem`. Line-level breakdown (unit price, line discounts, per-line taxes) lives on `items[].price`. This object holds the rolled-up totals and cart-level adjustments that consumers use for receipts and payment reconciliation.
  - `net_amount` (`GetSaleV10.response.200.price.net_amount`; object, required) — Final net total for the sale: sum of `items[].price.total_net_amount_final` after cart-level discounts (tips excluded). In minor units according to `Sale.currency.scale`.
    - example `777`
    - `currency` (`GetSaleV10.response.200.price.net_amount.currency`; string, required) — Currency ISO 4217 code
      - example `"MXN"`
    - `value` (`GetSaleV10.response.200.price.net_amount.value`; integer, required) — Amount in minor units (e.g. cents).
      - example `1000`
  - `gross_amount` (`GetSaleV10.response.200.price.gross_amount`; object, required) — Final gross total for the sale: sum of `items[].price.total_gross_amount_final` after cart-level discounts (tips excluded). Same value as search `total_amount`, in minor units according to `Sale.currency.scale`. Payment amounts include tips and can therefore differ from this gross total.
    - example `925`
    - `currency` (`GetSaleV10.response.200.price.gross_amount.currency`; string, required) — Currency ISO 4217 code
      - example `"MXN"`
    - `value` (`GetSaleV10.response.200.price.gross_amount.value`; integer, required) — Amount in minor units (e.g. cents).
      - example `1000`
  - `taxes` (`GetSaleV10.response.200.price.taxes`; array<object>, required) — Tax lines aggregated across the sale (after cart-level discounts). Per-line tax detail remains on `items[].price.taxes` / `taxes_final`.
    - example `[{"id":"tax-vat-19","net_amount":777,"gross_amount":925,"tax_amount":148}]`
    - `id` (`GetSaleV10.response.200.price.taxes.id`; string, required) — Tax ID from the Tax Service (External Id)
      - maxLength 100; example `"b064ed44-66e1-45a1-a963-b783808f0436"`
    - `net_amount` (`GetSaleV10.response.200.price.taxes.net_amount`; object, required) — Net amount before applying the tax. The value of the amount in minor units of the currency according to the Sale.currency.scale.
      - `currency` (`GetSaleV10.response.200.price.taxes.net_amount.currency`; string, required) — Currency ISO 4217 code
        - example `"MXN"`
      - `value` (`GetSaleV10.response.200.price.taxes.net_amount.value`; integer, required) — Amount in minor units (e.g. cents).
        - example `1000`
    - `gross_amount` (`GetSaleV10.response.200.price.taxes.gross_amount`; object, required) — Gross amount after applying the tax. The value of the amount in minor units of the currency according to the Sale.currency.scale.
      - `currency` (`GetSaleV10.response.200.price.taxes.gross_amount.currency`; string, required) — Currency ISO 4217 code
        - example `"MXN"`
      - `value` (`GetSaleV10.response.200.price.taxes.gross_amount.value`; integer, required) — Amount in minor units (e.g. cents).
        - example `1000`
    - `tax_amount` (`GetSaleV10.response.200.price.taxes.tax_amount`; object, required) — Amount of tax. The value of the amount in minor units of the currency according to the Sale.currency.scale.
      - `currency` (`GetSaleV10.response.200.price.taxes.tax_amount.currency`; string, required) — Currency ISO 4217 code
        - example `"MXN"`
      - `value` (`GetSaleV10.response.200.price.taxes.tax_amount.value`; integer, required) — Amount in minor units (e.g. cents).
        - example `1000`
    - `name` (`GetSaleV10.response.200.price.taxes.name`; string, optional) — Tax name, e.g. "MwSt."
      - maxLength 255
    - `percentage` (`GetSaleV10.response.200.price.taxes.percentage`; integer, optional) — The tax rate percentage in minor units (1/100000). For example 19000 = 19%.
      - format `int64`; min 0; example `19000`
  - `cart_discounts` (`GetSaleV10.response.200.price.cart_discounts`; array<object>, optional) — Discounts applied at cart level. Item-level discounts remain on `items[].price.discounts`.
    - example `[]`
    - `level` (`GetSaleV10.response.200.price.cart_discounts.level`; string, required) — Specifies where discount was applied by user (either merchant or consumer): - CART: Applied to the whole cart (calculated and distributed per sale item) - ITEM: Applied to specific sale item *Accepted values:* ["ITEM", "CART"].
      - minLength 4; maxLength 4; example `"CART"`
    - `source` (`GetSaleV10.response.200.price.cart_discounts.source`; object, required) — The source of discount. Exactly one property must be set.
      - `ad_hoc` (`GetSaleV10.response.200.price.cart_discounts.source.ad_hoc`; object, optional) — Discount created ad-hoc on device during checkout.
        - `id` (`GetSaleV10.response.200.price.cart_discounts.source.ad_hoc.id`; string, optional) — The unique identifier of the ad-hoc discount.
          - format `uuid`; example `"075b0b5c-a1f4-46da-9aca-92fb6dd5905d"`
        - `name` (`GetSaleV10.response.200.price.cart_discounts.source.ad_hoc.name`; string, optional) — The name of the ad-hoc discount.
          - maxLength 100; example `"Happy Hour"`
        - `description` (`GetSaleV10.response.200.price.cart_discounts.source.ad_hoc.description`; string, optional) — The description of the ad-hoc discount.
          - maxLength 250; example `"Happy Hour from 10 to 12."`
      - `basic` (`GetSaleV10.response.200.price.cart_discounts.source.basic`; object, optional) — Preset discount applied manually on the POS.
        - `id` (`GetSaleV10.response.200.price.cart_discounts.source.basic.id`; string, required) — The unique identifier of the basic discount.
          - format `uuid`; example `"075b0b5c-a1f4-46da-9aca-92fb6dd5905d"`
        - `name` (`GetSaleV10.response.200.price.cart_discounts.source.basic.name`; string, required) — The name of the basic discount.
          - maxLength 100; example `"Staff discount"`
        - `application_mode` (`GetSaleV10.response.200.price.cart_discounts.source.basic.application_mode`; string, required) — Method of applying the discount to the items or cart.
          - one of `"MANUAL"`, `"AUTOMATIC"`; example `"MANUAL"`
        - `description` (`GetSaleV10.response.200.price.cart_discounts.source.basic.description`; string, optional, nullable) — The description of the loyalty discount.
          - maxLength 250; example `"10% off food for staff members."`
      - `coupon` (`GetSaleV10.response.200.price.cart_discounts.source.coupon`; object, optional) — Discount applied manually when entering a coupon code at checkout.
        - `id` (`GetSaleV10.response.200.price.cart_discounts.source.coupon.id`; string, required) — The unique identifier of the coupon discount.
          - format `uuid`; example `"075b0b5c-a1f4-46da-9aca-92fb6dd5905d"`
        - `code` (`GetSaleV10.response.200.price.cart_discounts.source.coupon.code`; string, required) — The coupon code.
          - maxLength 100; example `"FREE_COFFEE"`
        - `name` (`GetSaleV10.response.200.price.cart_discounts.source.coupon.name`; string, required) — The name of the coupon discount.
          - maxLength 100; example `"Free coffee"`
        - `application_mode` (`GetSaleV10.response.200.price.cart_discounts.source.coupon.application_mode`; string, required) — Method of applying the discount to the items or cart.
          - one of `"MANUAL"`, `"AUTOMATIC"`; example `"MANUAL"`
        - `description` (`GetSaleV10.response.200.price.cart_discounts.source.coupon.description`; string, optional, nullable) — The description of the coupon discount.
          - maxLength 250; example `"Free coffee with this coupon."`
        - `discount_class` (`GetSaleV10.response.200.price.cart_discounts.source.coupon.discount_class`; string, optional, nullable) — The method used to target items to discount. Must be populated for ITEM level discounts, and must be null for CART level discounts (CART level targets all items, therefore none of these categories apply).
          - one of `"ITEM"`, `"CATEGORY"`, `"BUNDLE"`, `"BUY_X_GET_Y"`, `"MEAL_DEAL"`; example `"ITEM"`
      - `offer` (`GetSaleV10.response.200.price.cart_discounts.source.offer`; object, optional) — Discount applied automatically when cart is updated based on preset promotions.
        - `id` (`GetSaleV10.response.200.price.cart_discounts.source.offer.id`; string, required) — The unique identifier of the offer discount.
          - format `uuid`; example `"075b0b5c-a1f4-46da-9aca-92fb6dd5905d"`
        - `name` (`GetSaleV10.response.200.price.cart_discounts.source.offer.name`; string, required) — The name of the offer discount.
          - maxLength 100; example `"Breakfast combo deal"`
        - `application_mode` (`GetSaleV10.response.200.price.cart_discounts.source.offer.application_mode`; string, required) — Method of applying the discount to the items or cart.
          - one of `"MANUAL"`, `"AUTOMATIC"`; example `"MANUAL"`
        - `description` (`GetSaleV10.response.200.price.cart_discounts.source.offer.description`; string, optional, nullable) — The description of the offer discount.
          - maxLength 250; example `"Buy a Croissant, get a coffee for £1"`
        - `discount_class` (`GetSaleV10.response.200.price.cart_discounts.source.offer.discount_class`; string, optional, nullable) — The method used to target items to discount. Must be populated for ITEM level discounts, and must be null for CART level discounts (CART level targets all items, therefore none of these categories apply).
          - one of `"ITEM"`, `"CATEGORY"`, `"BUNDLE"`, `"BUY_X_GET_Y"`, `"MEAL_DEAL"`; example `"ITEM"`
      - `loyalty` (`GetSaleV10.response.200.price.cart_discounts.source.loyalty`; object, optional) — Discount applied when redeeming a reward from the merchant's loyalty scheme.
        - `id` (`GetSaleV10.response.200.price.cart_discounts.source.loyalty.id`; string, required) — The unique identifier of the promotion or reward.
          - format `uuid`; example `"075b0b5c-a1f4-46da-9aca-92fb6dd5905d"`
        - `loyalty_type` (`GetSaleV10.response.200.price.cart_discounts.source.loyalty.loyalty_type`; string, required) — The type of loyalty discount, either a promotion (e.g. new customer discount) or a reward (free coffee after completing stamp card).
          - one of `"PROMOTION"`, `"REWARD"`; example `"REWARD"`
        - `scheme_type` (`GetSaleV10.response.200.price.cart_discounts.source.loyalty.scheme_type`; string, required) — The scheme type of the loyalty program.
          - one of `"STAMPS"`, `"POINTS"`; example `"POINTS"`
        - `name` (`GetSaleV10.response.200.price.cart_discounts.source.loyalty.name`; string, required) — The name of the loyalty discount.
          - maxLength 100; example `"Free coffee"`
        - `application_mode` (`GetSaleV10.response.200.price.cart_discounts.source.loyalty.application_mode`; string, required) — Method of applying the discount to the items or cart.
          - one of `"MANUAL"`, `"AUTOMATIC"`; example `"MANUAL"`
        - `points` (`GetSaleV10.response.200.price.cart_discounts.source.loyalty.points`; integer, optional, nullable) — The number of points used for this loyalty discount. Must be a positive integer if the scheme type is POINTS. Must not be populated if the scheme type is STAMPS.
          - format `int64`; min 1; example `50`
        - `description` (`GetSaleV10.response.200.price.cart_discounts.source.loyalty.description`; string, optional, nullable) — The description of the loyalty discount.
          - maxLength 250; example `"Free coffee for 50 points"`
        - `discount_class` (`GetSaleV10.response.200.price.cart_discounts.source.loyalty.discount_class`; string, optional, nullable) — The method used to target items to discount. Must be populated for ITEM level discounts, and must be null for CART level discounts (CART level targets all items, therefore none of these categories apply).
          - one of `"ITEM"`, `"CATEGORY"`, `"BUNDLE"`, `"BUY_X_GET_Y"`, `"MEAL_DEAL"`; example `"ITEM"`
    - `value` (`GetSaleV10.response.200.price.cart_discounts.value`; object, required) — The value type of the discount, either a percentage based or absolute monetary value. It is required that only one of the following is set: - absolute - percentage.
      - `absolute` (`GetSaleV10.response.200.price.cart_discounts.value.absolute`; integer, optional) — The absolute value in minor units of the currency according to the Sale.currency.scale. Example: 10000 = 10.00
        - format `int64`; min 0; example `100`
      - `percentage` (`GetSaleV10.response.200.price.cart_discounts.value.percentage`; integer, optional) — The percentage in minor units (1/100000). Examples: - 10% -> 0.10 (decimal) = 10000 (minor units) - 15.5% -> 0.155 (decimal) = 15500 (minor units) - 0.001% -> 0.00001 (decimal) = 1 (minor units)
        - format `int64`; min 0; example `10000`
    - `net_amount` (`GetSaleV10.response.200.price.cart_discounts.net_amount`; integer, required) — The net amount of the discount. The value of the amount in minor units of the currency according to the Sale.currency.scale.
      - format `int64`; min 0; example `100`
    - `gross_amount` (`GetSaleV10.response.200.price.cart_discounts.gross_amount`; integer, required) — The gross amount of the discount. The value of the amount in minor units of the currency according to the Sale.currency.scale.
      - format `int64`; min 0; example `100`
    - `tax_amount` (`GetSaleV10.response.200.price.cart_discounts.tax_amount`; integer, required) — The tax amount of the discount. The value of the amount in minor units of the currency according to the Sale.currency.scale.
      - format `int64`; min 0; example `100`
    - `id` (`GetSaleV10.response.200.price.cart_discounts.id`; string, optional) — An id used to associate a discount line with a specific discount. Since we can apply multiple discounts (e.g. 2x 10% whole cart off) we need to be able to identify which discount line belongs to which cart discount. Recommended to use UUID identifiers.
      - maxLength 100; example `"075b0b5c-a1f4-46da-9aca-92fb6dd5905d"`
    - `description` (`GetSaleV10.response.200.price.cart_discounts.description`; string, optional) — A description or reason of the discount.
      - maxLength 250; example `"Happy Hour"`
- `tax_mode` (`GetSaleV10.response.200.tax_mode`; string, required) — The tax mode used by merchant for displaying prices and calculating taxes: - NO_TAX: The prices don't contain any taxes, merchant don't report taxes - GROSS: The prices used by merchant already include taxes (common in EU), the tax is calculated from the gross price - NET: The prices used by merchant don't include taxes (common in US), the tax is calculated from the net price Since tax values can be different for the same net price depending if the tax was calculated from gross or net price, this info is necessary to be able to reconcile tax calculations.
  - one of `"NO_TAX"`, `"GROSS"`, `"NET"`; example `"NO_TAX"`
- `source` (`GetSaleV10.response.200.source`; object, required) — Information about the source of the sale.
  - `channel` (`GetSaleV10.response.200.source.channel`; string, required) — The sale_channel is field that indicates the channel through which the sale was made. For example, if the sale was made in the merchant app, the sale_channel could be POS. If the sale was made on a kiosk, the sale_channel is KIOSK. *Accepted values:* ["POS", "KIOSK", "ONLINE_STORE", "SOLO", "ORDER_AND_PAY", "INVOICE", "BOOKINGS", "ORDER_AGGREGATOR", "SUBSCRIPTIONS", "UNKNOWN"].
    - example `"POS"`
  - `sub_channel` (`GetSaleV10.response.200.source.sub_channel`; string, optional) — The sub_channel is an optional field that can be used to provide more information about the sale_channel. For example, if the sale_channel is ONLINE_PAYMENTS, the sub_channel could be "WIX" or "QR_CODE" or "WOOCOMMERCE".
    - maxLength 50; example `"QR_CODE"`
  - `external_id` (`GetSaleV10.response.200.source.external_id`; string, optional) — An external reference ID for connecting orders/sales between products
    - maxLength 250; example `"123456"`
  - `external_sub_channel_id` (`GetSaleV10.response.200.source.external_sub_channel_id`; string, optional) — An external reference ID for the sub-channel. For example, when channel is BOOKINGS and sub_channel is POS, this can hold the OMS order ID while external_id holds the appointment ID.
    - maxLength 250; example `"9736e947-6f1f-487f-846a-c5954fb06a5a"`
- `payments` (`GetSaleV10.response.200.payments`; array<object>, required) — Payments on this sale, in the order they were recorded.
  - example `[{"method":"card","reference":"TERTYFQ4G3","type":"purchase","amount":975,"status":"SUCCESSFUL","processed_at":"2026-06-02T10:20:00Z"}]`
  - `method` (`GetSaleV10.response.200.payments.method`; string, required) — Payment method on public sales read API v1.0. Digital wallets are first-class methods. Gift card payments use `gift_card`, not `apm`. Input is case-insensitive; the canonical form is lowercase snake_case. **VALUES**: [card, cash, apm, external, apple_pay, google_pay, whatsapp_pay, gift_card].
    - maxLength 20; example `"card"`
  - `reference` (`GetSaleV10.response.200.payments.reference`; string, required) — The reference to the actual payment used for this sale, e.g. the sumup transaction code.
    - maxLength 50; example `"TERTYFQ4G3"`
  - `type` (`GetSaleV10.response.200.payments.type`; string, required) — Payment operation type. This is distinct from the payment instrument in `method`. Input is case-insensitive; the canonical form is lowercase snake_case. **VALUES**: [purchase, unreferenced_refund] Defaults to "purchase" if unspecified. Either a normal purchase or an unreferenced refund for negative sales like deposit returns.
    - default `"purchase"`; example `"purchase"`
  - `amount` (`GetSaleV10.response.200.payments.amount`; integer, required) — The amount of the payment including tips. The value of the amount in minor units of `Sale.currency`.
    - format `int64`; min 0; example `975`
  - `status` (`GetSaleV10.response.200.payments.status`; string, required) — The status of the payment.
    - one of `"FAILED"`, `"SUCCESSFUL"`, `"CANCELED"`; example `"SUCCESSFUL"`
  - `processed_at` (`GetSaleV10.response.200.payments.processed_at`; string, required) — UTC date-time when SumUp recorded this payment’s exposed `status` (successful, failed, or canceled). Server processed time when available; otherwise the payment provider’s transaction time. Not the device clock.
    - format `date-time`; example `"2017-07-21T17:32:28+01:00"`
  - `apm_type` (`GetSaleV10.response.200.payments.apm_type`; string, optional) — Alternative payment method type when `method` is `apm`. Gift card is not an APM on this API. Input is case-insensitive; the canonical form is lowercase snake_case. **VALUES**: [qr_code_pix, sepa_dd, paypal, sumup_pay, twint, iris].
    - maxLength 20
  - `card` (`GetSaleV10.response.200.payments.card`; object, optional) — Card brand, credit/debit processing type, and last four digits.
    - `brand` (`GetSaleV10.response.200.payments.card.brand`; string, required) — The brand of the card. Input is case-insensitive; the canonical form is lowercase snake_case. **VALUES**: [amex, cup, diners, discover, elo, elv, hipercard, jcb, maestro, mastercard, visa, visa_electron, visa_vpay, vr, eftpos, conecs, swile, girocard, interac, sumup, bancomat].
      - maxLength 20; example `"visa"`
    - `type` (`GetSaleV10.response.200.payments.card.type`; string, required) — Credit or debit processing choice, not brand or funding. `unknown` when unavailable; prepaid/voucher are not processing types.
      - one of `"credit"`, `"debit"`, `"unknown"`; example `"debit"`
    - `last_4_digits` (`GetSaleV10.response.200.payments.card.last_4_digits`; string, required) — The last 4 digits of the card used for the payment.
      - minLength 4; maxLength 4; pattern `^\d{4}$`; example `"1234"`
  - `gift_card` (`GetSaleV10.response.200.payments.gift_card`; object, optional) — Gift card used for this payment. Present when `method` is `gift_card` and the gift card id is known. Gift card IDs use the format "GC" followed by 9 alphanumeric characters (e.g. GCZ3NTMB1V).
    - `id` (`GetSaleV10.response.200.payments.gift_card.id`; string, required) — Gift card identifier. Format "GC" followed by 9 alphanumeric characters (e.g. GCZ3NTMB1V).
      - example `"GCZ3NTMB1V"`
- `created_at` (`GetSaleV10.response.200.created_at`; string, required) — Instant when the sale was created.
  - format `date-time`; example `"2026-06-02T10:15:00Z"`
- `closed_at` (`GetSaleV10.response.200.closed_at`; string, required) — Instant when the sale was closed. Always present: non-finalised sales are never returned.
  - format `date-time`; example `"2026-06-02T10:20:00Z"`
- `state` (`GetSaleV10.response.200.state`; string, required) — Lifecycle state of the sale. Non-finalised sales are never returned; only fully-paid sales.
  - one of `"CLOSED"`; example `"CLOSED"`
- `user_id` (`GetSaleV10.response.200.user_id`; string, optional) — Identity UUID of the cashier who processed the sale. Omitted when the cashier identity is unknown.
  - format `uuid`; example `"d6f51684-519b-454c-bdb3-deeb05f52b92"`
- `name` (`GetSaleV10.response.200.name`; string, optional) — Human-readable name of the sale (not unique, not the sale id).
  - maxLength 160; example `"Order 1234"`
- `note` (`GetSaleV10.response.200.note`; string, optional) — Optional note attached to the sale, visible on receipts and the UI.
  - maxLength 300; example `"Please deliver to the back door."`

### 401

The client is not authenticated (auth header is empty or invalid).

#### Example

```json
{
  "type": "https://developer.sumup.com/problem/not-found",
  "title": "Requested resource couldn't be found.",
  "status": 404,
  "detail": "The requested resource doesn't exist or does not belong to you.",
  "instance": "http://example.com"
}
```

- `type` (`GetSaleV10.response.401.type`; string, required) — A URI reference that identifies the problem type.
  - format `uri`; example `"https://developer.sumup.com/problem/not-found"`
- `title` (`GetSaleV10.response.401.title`; string, optional) — A short, human-readable summary of the problem type.
  - example `"Requested resource couldn't be found."`
- `status` (`GetSaleV10.response.401.status`; integer, optional) — The HTTP status code generated by the origin server for this occurrence of the problem.
  - example `404`
- `detail` (`GetSaleV10.response.401.detail`; string, optional) — A human-readable explanation specific to this occurrence of the problem.
  - example `"The requested resource doesn't exist or does not belong to you."`
- `instance` (`GetSaleV10.response.401.instance`; string, optional) — A URI reference that identifies the specific occurrence of the problem.
  - format `uri`

### 403

Missing `sales.read`, merchant code mismatch on the token, or no `merchant_read` permission.

#### Example

```json
{
  "type": "https://developer.sumup.com/problem/not-found",
  "title": "Requested resource couldn't be found.",
  "status": 404,
  "detail": "The requested resource doesn't exist or does not belong to you.",
  "instance": "http://example.com"
}
```

- `type` (`GetSaleV10.response.403.type`; string, required) — A URI reference that identifies the problem type.
  - format `uri`; example `"https://developer.sumup.com/problem/not-found"`
- `title` (`GetSaleV10.response.403.title`; string, optional) — A short, human-readable summary of the problem type.
  - example `"Requested resource couldn't be found."`
- `status` (`GetSaleV10.response.403.status`; integer, optional) — The HTTP status code generated by the origin server for this occurrence of the problem.
  - example `404`
- `detail` (`GetSaleV10.response.403.detail`; string, optional) — A human-readable explanation specific to this occurrence of the problem.
  - example `"The requested resource doesn't exist or does not belong to you."`
- `instance` (`GetSaleV10.response.403.instance`; string, optional) — A URI reference that identifies the specific occurrence of the problem.
  - format `uri`

### 404

Sale not found. Non-finalised sales are never returned; only fully-paid sales.

#### Example

```json
{
  "type": "https://developer.sumup.com/problem/not-found",
  "title": "Requested resource couldn't be found.",
  "status": 404,
  "detail": "The requested resource doesn't exist or does not belong to you.",
  "instance": "http://example.com"
}
```

- `type` (`GetSaleV10.response.404.type`; string, required) — A URI reference that identifies the problem type.
  - format `uri`; example `"https://developer.sumup.com/problem/not-found"`
- `title` (`GetSaleV10.response.404.title`; string, optional) — A short, human-readable summary of the problem type.
  - example `"Requested resource couldn't be found."`
- `status` (`GetSaleV10.response.404.status`; integer, optional) — The HTTP status code generated by the origin server for this occurrence of the problem.
  - example `404`
- `detail` (`GetSaleV10.response.404.detail`; string, optional) — A human-readable explanation specific to this occurrence of the problem.
  - example `"The requested resource doesn't exist or does not belong to you."`
- `instance` (`GetSaleV10.response.404.instance`; string, optional) — A URI reference that identifies the specific occurrence of the problem.
  - format `uri`

### 412

User-Agent header is not present or is empty.

#### Example

```json
{
  "type": "https://developer.sumup.com/problem/not-found",
  "title": "Requested resource couldn't be found.",
  "status": 404,
  "detail": "The requested resource doesn't exist or does not belong to you.",
  "instance": "http://example.com"
}
```

- `type` (`GetSaleV10.response.412.type`; string, required) — A URI reference that identifies the problem type.
  - format `uri`; example `"https://developer.sumup.com/problem/not-found"`
- `title` (`GetSaleV10.response.412.title`; string, optional) — A short, human-readable summary of the problem type.
  - example `"Requested resource couldn't be found."`
- `status` (`GetSaleV10.response.412.status`; integer, optional) — The HTTP status code generated by the origin server for this occurrence of the problem.
  - example `404`
- `detail` (`GetSaleV10.response.412.detail`; string, optional) — A human-readable explanation specific to this occurrence of the problem.
  - example `"The requested resource doesn't exist or does not belong to you."`
- `instance` (`GetSaleV10.response.412.instance`; string, optional) — A URI reference that identifies the specific occurrence of the problem.
  - format `uri`


Source: https://developer.sumup.com/api/sales/get-sale-v10/index.md
