> For the complete documentation index, see [llms.txt](https://apidocs.akinon.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://apidocs.akinon.com/b2b/basket.md).

# Basket

Basket stores the items that the user wants to purchase. Users can have multiple active baskets with different segment\_remote\_id. Users can not add products to the basket other than its own division.

After finishing the shopping, the user can name and save the basket in order to create a quotation later. Upon saving the basket, the status of the basket changes to draft. Users can load the basket any time and continue shopping.

The basket becomes submitted when the user issues a quotation request.

## Add Product to Basket

Increase quantity if product is already in the basket, otherwise query commerce api over product\_remote\_id to get product details and add it.

**Example Request**

```
curl --request POST --location 'https://{COMMERCE_URL}/b2b/basket/' \
--header 'Content-Type: application/json' \
--header 'Authorization: Token {token}' \
--data '{
    "product_remote_id": 1,
    "division": 10,
    "quantity": 3
}'
```

Basket items are grouped by product\_remote\_id which is the id information of the product in the Commerce app. divisions list contains the divisions that the product is added for. total\_amount in the first level is the total amount of the basket item. total\_amount in basket\_items is the total amount of the product of all divisions.

**Example Response (200 OK)**

```json
{
  "id": 7,
  "total_amount": "81.65",
  "total_quantity": 6,
  "basket_items": [
    {
      "total_amount": "31.65",
      "price": "10.55",
      "quantity": 3,
      "divisions": [
        {
          "id": 11,
          "name": "sub",
          "erp_code": "ERP02",
          "quantity": 2
        },
        {
          "id": 10,
          "name": "main",
          "erp_code": "ERP01",
          "quantity": 1
        }
      ],
      "product": {
        "sku": "SKU01"
      },
      "product_remote_id": 1
    },
    {
      "total_amount": "40.00",
      "price": "20.00",
      "quantity": 2,
      "divisions": [
        {
          "id": 11,
          "name": "sub",
          "erp_code": "ERP02",
          "quantity": 2
        }
      ],
      "product": {
        "sku": "SKU02"
      },
      "product_remote_id": 2
    },
    {
      "total_amount": "10.00",
      "price": "10.00",
      "quantity": 1,
      "divisions": [
        {
          "id": 10,
          "name": "main",
          "erp_code": "ERP01",
          "quantity": 1
        }
      ],
      "product": {
        "sku": "SKU03",
        "name": "product name",
        "price": "10.00",
        "currency": "try",
        "variants": {
          "color": "red"
        },
        "product_image": "http://example.com/image.jpg"
      },
      "product_remote_id": 3
    }
  ],
  "segment_remote_id": null
}
```

## Remove/Update Product From Basket

Remove or update the product in the basket. If quantity is set to 0, the product is removed from the basket.

**Example Request**

```
curl --request PUT --location  '{B2B_Backend_URL}/api/v1/basket/' \
--header 'Authorization: Token {Token}' \
--header 'Content-Type: application/json' \
--data '{
    "product_remote_id": 1,
    "division": 13,
    "quantity": 0
}'
```

**Example Response (200 OK)**

```json
{
  "id": 11,
  "total_amount": "61.10",
  "total_quantity": 4,
  "basket_items": [
    {
      "total_amount": "21.10",
      "price": "10.55",
      "quantity": 2,
      "divisions": [
        {
          "id": 14,
          "name": "sub",
          "erp_code": "ERP02",
          "quantity": 2
        }
      ],
      "product": {
        "sku": "SKU01"
      },
      "product_remote_id": 1
    },
    {
      "total_amount": "40.00",
      "price": "20.00",
      "quantity": 2,
      "divisions": [
        {
          "id": 14,
          "name": "sub",
          "erp_code": "ERP02",
          "quantity": 2
        }
      ],
      "product": {
        "sku": "SKU02"
      },
      "product_remote_id": 2
    }
  ],
  "segment_remote_id": null
}
```

## List Basket

List active basket of the user.

The listing can be narrowed down to the items carrying certain product attributes. Any attribute the storefront exposes as a filter can be used as a query parameter, and the values are the attribute codes returned by [Basket Filter Attributes](#basket-filter-attributes).

Repeating a parameter matches any of its values, while different parameters must all match. The request below therefore returns the items that are winter **or** summer **and** black:

```
?integration_season_desc=AW 24&integration_season_desc=SS 24&integration_color_desc=999
```

Filtering is not persisted, so the parameters have to be sent again on every request that should stay filtered. Only `basket_items` is narrowed; `total_amount` and `total_quantity` keep describing the whole basket. A value that no longer exists simply matches nothing, and a parameter that is not a filterable attribute is ignored.

**Example Request**

```
curl --request GET --location  '{B2B_Backend_URL}/api/v1/basket/' \
--header 'Authorization: Token {Token}' \
```

**Example Request (filtered)**

```
curl --request GET --location '{B2B_Backend_URL}/api/v1/basket/?integration_season_desc=AW%2024' \
--header 'Authorization: Token {Token}' \
```

**Example Response (200 OK)**

```json
{
  "id": 13,
  "total_amount": "71.65",
  "total_quantity": 5,
  "basket_items": [
    {
      "total_amount": "31.65",
      "price": "10.55",
      "quantity": 3,
      "divisions": [
        {
          "id": 17,
          "name": "sub",
          "erp_code": "ERP02",
          "quantity": 2
        },
        {
          "id": 16,
          "name": "main",
          "erp_code": "ERP01",
          "quantity": 1
        }
      ],
      "product": {
        "sku": "SKU01"
      },
      "product_remote_id": 1
    },
    {
      "total_amount": "40.00",
      "price": "20.00",
      "quantity": 2,
      "divisions": [
        {
          "id": 17,
          "name": "sub",
          "erp_code": "ERP02",
          "quantity": 2
        }
      ],
      "product": {
        "sku": "SKU02"
      },
      "product_remote_id": 2
    }
  ],
  "segment_remote_id": null
}
```

## Basket Filter Attributes

Break the basket down by the product attributes the storefront exposes as filters, such as season, colour or product hierarchy.

Every attribute is returned with the choices a client can offer, and every choice carries how much of the basket it covers. Choices the basket holds come first with their quantity and amount, and the remaining choices follow with zero, so that a filter panel can be rendered from a single response. The `value` of a choice is what [List Basket](#list-basket) expects as a filter value, while `label` is the text to display.

Labels are resolved in the language of the storefront session, so switching the language relabels the same choices. The `value` of a choice never changes with the language, which is why a filter built from it keeps working across languages. A basket can also hold a value the storefront no longer offers, for example a season that has since left the catalogue; such a choice is still listed and can still be filtered by, but its `label` falls back to the raw value.

Send `attributes` to limit the response to certain attributes, as a comma separated list of attribute keys. Each attribute costs a separate aggregate query, so requesting only the ones being rendered keeps the response cheaper. Omitting the parameter returns every filterable attribute.

The same attribute filters accepted by [List Basket](#list-basket) can be sent here as well, in which case the quantities describe the filtered items. The attribute being filtered on keeps all of its choices, but the choices it does not match drop to zero, which is why a filter panel is better built from an unfiltered request.

Items that carry no value for an attribute are left out, as there is nothing to select for them. Their quantities are therefore missing from that attribute's totals.

Requesting an attribute the storefront does not expose as a filter returns `406` with the `baskets_113` error code.

Which attributes are filterable is read from the storefront. While the storefront cannot be reached, this endpoint responds with an empty object, requesting a specific attribute returns `406`, and the attribute filters on [List Basket](#list-basket) are ignored rather than applied.

**Example Request**

```
curl --request GET --location '{B2B_Backend_URL}/api/v1/basket/filter-attributes/?attributes=integration_season_desc,integration_color_desc' \
--header 'Authorization: Token {Token}' \
```

**Example Response (200 OK)**

```json
{
  "integration_season_desc": {
    "label": "Season",
    "choices": [
      {
        "value": "AW 24",
        "label": "2024 AUTUMN/WINTER",
        "quantity": 490,
        "total_amount": "48020.00"
      },
      {
        "value": "SS 24",
        "label": "2024 SPRING/SUMMER",
        "quantity": 52,
        "total_amount": "5096.00"
      },
      {
        "value": "AW 25",
        "label": "2025 AUTUMN/WINTER",
        "quantity": 0,
        "total_amount": "0.00"
      }
    ]
  },
  "integration_color_desc": {
    "label": "Colour",
    "choices": [
      {
        "value": "999",
        "label": "BLACK",
        "quantity": 152,
        "total_amount": "14896.00"
      }
    ]
  }
}
```

**Example Response (406 Not Acceptable)**

```json
{
  "non_field_errors": [
    "'unknown_key' is not a valid basket filter attribute."
  ],
  "error_code": "baskets_113"
}
```

## Delete Basket Item

Delete the basket items that match the given product\_remote\_id from the basket.

**Example Request**

```
curl --request DELETE --location '{B2B_Backend_URL}/api/v1/basket/' \
--header 'Authorization: Token {Token}' \
--header 'Content-Type: application/json' \
--data '{
    "product_remote_id": 2
}'
```

**Example Response (200 OK)**

```json
{
  "id": 32,
  "total_amount": "0.00",
  "total_quantity": 0,
  "basket_items": [],
  "segment_remote_id": null
}
```

## List Draft Baskets

List draft baskets of the user.

**Example Request**

```
curl --request GET --location  '{B2B_Backend_URL}/api/v1/basket/drafts/' \
--header 'Authorization: Token {Token}' \
```

**Example Response (200 OK)**

```json
[
  {
    "id": 18,
    "name": null,
    "total_amount": 0,
    "total_quantity": 0
  },
  {
    "id": 17,
    "name": null,
    "total_amount": 0,
    "total_quantity": 0
  }
]
```

## Save Basket

Save the basket with the given name. Saved baskets are changed to draft status.

**Example Request**

```
curl --request POST --location '{B2B_Backend_URL}/api/v1/basket/save/' \
--header 'Authorization: Token {Token}' \
--header 'Content-Type: application/json' \
--data '{
    "name": "Basket 1"
}'
```

## Load Basket

Load the basket with the given id. Loaded baskets are changed to active status.

**Example Request**

```
curl --request POST --location '{B2B_Backend_URL}/api/v1/basket/<basket_id>/load/' \
--header 'Authorization: Token {Token}' \
--header 'Content-Type: application/json' \
--data '{}'
```

## Import Basket

Allows bulk addition of products to the basket by uploading a file.

**Example Request**

```
curl --location '{B2B_Backend_URL}/api/v1/basket/bulk-import/' \
--header 'Authorization: Token {token}' \
--form 'filename=@"bulk-import-basket.xls"'
```

**Example Response (200 OK)**

```
{
"message": "File imported successfully."
}
```

**File Fields**

| Field                 | Description                                                   |
| --------------------- | ------------------------------------------------------------- |
| product\_\_sku        | The SKU information of the product to be added to the basket. |
| quantity              | The quantity of the product to be added to the basket.        |
| division\_\_erp\_code | The ERP code information of the division.                     |

## Export Basket

Exports products added to the basket as a file. Returns a cache key to track the export status.

**Request Parameters**

| Parameter          | Description                                                                                                                                                                           |
| ------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| fields             | Specifies the fields to be included in the export file. Available fields: **product\_\_sku, division, division\_\_erp\_code, division\_\_name, price, quantity, product\_remote\_id** |
| format             | Specifies the file format for the export. Acceptable values are `csv` and `xls`. The default is `xls`.                                                                                |
| status\_cache\_key | A query parameter to track the status of the file export using the cache key returned from the initial request.                                                                       |

**Example Request**

```
curl --location '{B2B_Backend_URL}/api/v1/basket/?fields=division__erp_code
&fields=product__sku
' \
--header 'Authorization: Token {token}'
```

**Example Response (200 OK)**

```
{
"cache_key": "beacaa8ba65571e3840e28a11f17481e"
}
```

## Export File Status

Checks the status of an export file using the cache key obtained from the export request. Provides information on whether the file is ready for download.

**Example Request**

```
curl --location '{B2B_Backend_URL}/api/v1/basket/?status_cache_key=8381f01436160bb756c805c5e3c25358' \
--header 'Authorization: Token {token}'
```

**Example Response**

```
{
  "is_ready": true,
  "url": "{url}/export_file/beacaa8ba65571e3840e28a11f17481e.xls",
  "status": "completed"
}
```

**Response Parameters**

| Field     | Description                                                                       |
| --------- | --------------------------------------------------------------------------------- |
| is\_ready | Indicates whether the file is ready for download (`true` or `false`).             |
| url       | The URL to download the exported file once it is ready.                           |
| status    | Provides the current status of the export process (e.g., `waiting`, `completed`). |


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://apidocs.akinon.com/b2b/basket.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
