# Shipping Related

This document covers all services for setting delivery details for an order, including the requests and responses associated with these services.

{% hint style="warning" %}
**Authenticated Endpoints**

Accessing authenticated endpoints requires users to establish a session through Session Authentication. To do this:

1. Users must log in using their credentials (e.g., username and password) via a designated authentication endpoint.
2. Upon successful login, the server will generate and return a session cookie to the client.
3. This session cookie must be included in subsequent API requests as part of the headers. The session cookie serves as proof of authentication and ensures secure access to protected resources.
   {% endhint %}

### `GET` Get Delivery Options

This method is used to get the available delivery options, if any.

**Path:** `https://{commerce_url}/orders/checkout/`

The response could be one of the following pages:

* DeliveryOptionSelectionPage`(if any delivery option available)`
* SlotSelectionPage`(if scheduled delivery is active)`
* AddressSelectionPage`(if none of above is available)`

**Example Request**

```python
import requests

url = "https://{commerce_url}/orders/checkout/"

payload = {}
headers = {
  'x-requested-with': 'XMLHttpRequest',
  'Cookie': 'osessionid=<session_id>'
}

response = requests.request("GET", url, headers=headers, data=payload)

print(response.text)
```

**Example Response**

```json
    {
    	"context_list": [
        	{
				{
					"page_context": {
						"is_user_logged_in": true,
						"can_guest_purchase": true,
						"has_gift_box": false
					},
					"page_name": "IndexPage",
					"page_slug": "indexpage"
				},
				{
					"page_context": {
						"addresses": [],
						"country": {
							"pk": 1,
							"name": "Türkiye",
							"code": "tr"
						}
					},
					"page_name": "AddressSelectionPage",
					"page_slug": "addressselectionpage"
				}
			}
    	],
    	"template_name": "orders/checkout.html",
    	"errors": null,
    	"pre_order": {...}
    }
```

### `POST` Set Delivery Option

This method is used to set the selected delivery option to the current pre-order.

**Path:** `https://{commerce_url}/orders/checkout/?page=DeliveryOptionSelectionPage`

The response can vary depending on the services in use:

1. If the scheduled delivery feature is enabled, the response is "SlotSelectionPage".
2. If the scheduled delivery feature is disabled, the response depends on the selected delivery option:
   * If the selected delivery option is a pickup location, the response is "PickupLocationSelectionPage".
   * If the selected delivery option is a retail store, the response is "RetailStoreSelectionPage".
   * If the selected delivery option is customer, the response is "AddressSelectionPage".

**Example Request**

```py
import requests

url = "https://{commerce_url}/orders/checkout/?page=DeliveryOptionSelectionPage"

payload = 'delivery_option=1&clear=false'
headers = {
  'x-requested-with': 'XMLHttpRequest',
  'Cookie': 'osessionid=<session_id>',
  'Content-Type': 'application/x-www-form-urlencoded'
}

response = requests.request("POST", url, headers=headers, data=payload)

print(response.text)
```

**Example Response 1 - Slot Selection**

When scheduled delivery is enabled, the following response is generated as endpoint result.

```json
    {
    	"context_list": [
			{
				"page_context": {
					"slots": [
						{
							"upper": "2023-03-15 17:00:00+00:00",
	 						"lower": "2023-03-15 15:00:00+00:00",
						},
						{
							"upper": "2023-03-15 21:00:00+00:00",
	 						"lower": "2023-03-15 19:00:00+00:00",
						}
					]
				},
				"page_name": "SlotSelectionPage",
				"page_slug": "slotselectionpage"
			}
    	],
    	"template_name": "orders/checkout.html",
    	"errors": null,
    	"pre_order": {...}
    }
```

**Example Response 2 - Pickup Location**

If the selected delivery option is a pickup location, the following result is generated as endpoint response.

```json
    {
    	"context_list": [
			{
				"page_context": {
					"addresses": [
						{
							"pk": 1,
							"title": "Location Title",
							"line": "some address lines",
							"country": {
								"pk": 1,
								"name": "Türkiye",
								"code": "tr"
							},
							"city": {
								"pk": 1,
								"name": "İstanbul",
							},
							"township": {
								"pk": 1,
								"name": "Township",
							},
							"district" : {
								"pk": 1,
								"name": "District",
							},
						}
					],
					"country": {
						"pk": 1,
						"name": "Türkiye",
						"code": "tr"
					}
				},
				"page_name": "PickupLocationSelectionPage",
				"page_slug": "pickuplocationselectionpage"
			}
    	],
    	"template_name": "orders/checkout.html",
    	"errors": null,
    	"pre_order": {...}
    }
```

**Example Response 3 - Retail Store**

If the selected delivery option is a retail store, the following result is generated as endpoint response.

```json
    {
    	"context_list": [
			{
				"page_context": {
					"addresses": [
						{
							"pk": 1,
							"title": "Location Title",
							"line": "some address lines",
							"country": {
								"pk": 1,
								"name": "Türkiye",
								"code": "tr"
							},
							"city": {
								"pk": 1,
								"name": "İstanbul",
							},
							"township": {
								"pk": 1,
								"name": "Township",
							},
							"district" : {
								"pk": 1,
								"name": "District",
							},
						}
					],
					"retail_stores": [
						{
							"pk": 1,
							"name": "",
							"address": "",
							"township": {
								"pk": 1,
								"name": "Township",
							},
							"district" : {
								"pk": 1,
								"name": "District",
							},
						},
					],
					"country": {
						"pk": 1,
						"name": "Türkiye",
						"code": "tr"
					}
				},
				"page_name": "RetailStoreSelectionPage",
				"page_slug": "retailstoreselectionpage"
			}
    	],
    	"template_name": "orders/checkout.html",
    	"errors": null,
    	"pre_order": {...}
    }
```

**Response 4 - Ship to Customer**

In case none of the above conditions are valid for the request, the following response is generated as the endpoint result.

```json
    {
    	"context_list": [
			{
				"page_context": {
					"addresses": [
						{
							"pk": 1,
							"title": "Address Title",
							"line": "some address lines",
							"country": {
								"pk": 1,
								"name": "Türkiye",
								"code": "tr"
							},
							"city": {
								"pk": 1,
								"name": "İstanbul",
							},
							"township": {
								"pk": 1,
								"name": "Township",
							},
							"district" : {
								"pk": 1,
								"name": "District",
							},
						}
					],
					"country": {
						"pk": 1,
						"name": "Türkiye",
						"code": "tr"
					}
				},
				"page_name": "AddressSelectionPage",
				"page_slug": "addressselectionpage"
			}
    	],
    	"template_name": "orders/checkout.html",
    	"errors": null,
    	"pre_order": {...}
    }
```

### `POST` Send User's Billing and Shipping Addresses

This method is used to notify the user’s designated shipping and billing addresses.

**Path:** `https://{commerce_url}/orders/checkout/?page=AddressSelectionPage`

**Example Request**

```python
import requests

url = "https://{commerce_url}/orders/checkout/?page=AddressSelectionPage"

payload = 'shipping_address=42&billing_address=42'
headers = {
  'x-requested-with': 'XMLHttpRequest',
  'Cookie': 'osessionid=<session_id>',
  'Content-Type': 'application/x-www-form-urlencoded'
}

response = requests.request("POST", url, headers=headers, data=payload)

print(response.text)
```

**Example Response**

```json
    {
    	"context_list": [
        	{
            	"page_context": {
                	"shipping_options": [
                    	{
                        	"pk": 1,
                        	"name": "Yurt İçi Kargo",
                        	"slug": "yurtici",
                        	"logo": null,
                        	"shipping_amount": 8.5,
                        	"description": null,
                        	"kwargs": {}
                    	},
                    	{
                        	"pk": 2,
                        	"name": "Aras Kargo",
                        	"slug": "aras-kargo",
                        	"logo": null,
                        	"shipping_amount": 0,
                        	"description": null,
                        	"kwargs": {}
                    	}
                	]
            	},
            	"page_name": "ShippingOptionSelectionPage",
            	"page_slug": "shippingoptionselectionpage"
        	}
    	],
    	"template_name": "orders/checkout.html",
    	"errors": null,
    	"pre_order": {...}
    }
```

### `POST` Select Slot (DateTime Range)

This method is used to notify the user's designated date and time range for delivery. In order to make this request, the shipping address must be set beforehand.

**Path:** `https://{commerce_url}/orders/checkout/?page=SlotSelectionPage`

**Example Request**

```python
import requests

url = "https://{commerce_url}/orders/checkout/?page=SlotSelectionPage"

payload = 'upper=2023-03-15%2017%3A00%3A00%2B00%3A00&lower=2023-03-15%2015%3A00%3A00%2B00%3A00'
headers = {
  'x-requested-with': 'XMLHttpRequest',
  'Cookie': 'osessionid=<session_id>',
  'Content-Type': 'application/x-www-form-urlencoded'
}

response = requests.request("POST", url, headers=headers, data=payload)

print(response.text)
```

**Example Response**

```json
     {
    	"context_list": [
        	{
            	"page_context": {
                	"checkout_url": null,
                	"status_url": null,
                	"payment_options": [
                    	{
                        	"pk": 1,
                        	"name": "Kredi Kartı",
                        	"payment_type": "credit_card",
                        	"payment_type_label": "Kredi Kartı"
                    	}
                	],
                	"unavailable_options": []
            	},
            	"page_name": "PaymentOptionSelectionPage",
            	"page_slug": "paymentoptionselectionpage"
        	}
    	],
    	"template_name": "orders/checkout.html",
    	"errors": null,
    	"pre_order": {...}
    }
```

### `POST` Select Pickup Location

This method is used to notify the user’s designated pickup location.

**Path:** `https://{commerce_url}/orders/checkout/?page=PickupLocationSelectionPage`

**Example Request**

```python
import requests

url = "https://{commerce_url}/orders/checkout/?page=PickupLocationSelectionPage"

payload = 'remote_id=42&billing_address=1'
headers = {
  'x-requested-with': 'XMLHttpRequest',
  'Cookie': 'osessionid=<session_id>',
  'Content-Type': 'application/x-www-form-urlencoded'
}

response = requests.request("POST", url, headers=headers, data=payload)

print(response.text)
```

**Example Response**

```json
    {
    	"context_list": [
        	{
            	"page_context": {
                	"shipping_options": [
                    	{
                        	"pk": 1,
                        	"name": "Yurt İçi Kargo",
                        	"slug": "yurtici",
                        	"logo": null,
                        	"shipping_amount": 8.5,
                        	"description": null,
                        	"kwargs": {}
                    	},
                    	{
                        	"pk": 2,
                        	"name": "Aras Kargo",
                        	"slug": "aras-kargo",
                        	"logo": null,
                        	"shipping_amount": 0,
                        	"description": null,
                        	"kwargs": {}
                    	}
                	]
            	},
            	"page_name": "ShippingOptionSelectionPage",
            	"page_slug": "shippingoptionselectionpage"
        	}
    	],
    	"template_name": "orders/checkout.html",
    	"errors": null,
    	"pre_order": {...}
    }
```

### `POST` Select Retail Store

This method is used to notify the user’s designated retail store.

**Path:** `https://{commerce_url}/orders/checkout/?page=RetailStoreSelectionPage`

**Example Request**

```python
import requests

url = "https://{commerce_url}/orders/checkout/?page=RetailStoreSelectionPage"

payload = 'billing_address=1&retail_store=42'
headers = {
  'x-requested-with': 'XMLHttpRequest',
  'Cookie': 'osessionid=<session_id>',
  'Content-Type': 'application/x-www-form-urlencoded'
}

response = requests.request("POST", url, headers=headers, data=payload)

print(response.text)
```

**Example Response**

```json
    {
    	"context_list": [
        	{
            	"page_context": {
                	"shipping_options": [
                    	{
                        	"pk": 1,
                        	"name": "Yurt İçi Kargo",
                        	"slug": "yurtici",
                        	"logo": null,
                        	"shipping_amount": 8.5,
                        	"description": null,
                        	"kwargs": {}
                    	},
                    	{
                        	"pk": 2,
                        	"name": "Aras Kargo",
                        	"slug": "aras-kargo",
                        	"logo": null,
                        	"shipping_amount": 0,
                        	"description": null,
                        	"kwargs": {}
                    	}
                	]
            	},
            	"page_name": "ShippingOptionSelectionPage",
            	"page_slug": "shippingoptionselectionpage"
        	}
    	],
    	"template_name": "orders/checkout.html",
    	"errors": null,
    	"pre_order": {...}
    }
```

### `POST` Send Shipping Option

This method is used to notify the shipping option selected by the user. Once the user sets a shipping option, the result will be one of the following pages based on the platform settings: `SampleProductPage`,`ReservationSelectionPage`, `PaymentOptionSelectionPage`.

**Path:** `https://{commerce_url}/orders/checkout/?page=ShippingOptionSelectionPage`

**Example Request**

```python
import requests

url = "https://{commerce_url}/orders/checkout/?page=ShippingOptionSelectionPage"

payload = 'shipping_option=1'
headers = {
  'x-requested-with': 'XMLHttpRequest',
  'Cookie': 'osessionid=<session_id>',
  'Content-Type': 'application/x-www-form-urlencoded'
}

response = requests.request("POST", url, headers=headers, data=payload)

print(response.text)

```

**Example Response 1 - Payment Options**

```json
     {
    	"context_list": [
        	{
            	"page_context": {
                	"checkout_url": null,
                	"status_url": null,
                	"payment_options": [
                    	{
                        	"pk": 1,
                        	"name": "Kredi Kartı",
                        	"payment_type": "credit_card",
                        	"payment_type_label": "Kredi Kartı"
                    	}
                	],
                	"unavailable_options": []
            	},
            	"page_name": "PaymentOptionSelectionPage",
            	"page_slug": "paymentoptionselectionpage"
        	}
    	],
    	"template_name": "orders/checkout.html",
    	"errors": null,
    	"pre_order": {...}
    }
```

**Example Response 2 - Sample Products**

```json
     {
    	"context_list": [
        	{
            	"page_context": {
                	"sample_products": [
						{
							"pk": 3239,
							"name": "2-Li Aile Çerçevesi 13x18cm",
							"base_code": "1KCERV0784",
							"sku": "2672881078584",
							"product_type": "0",
							"is_active": true,
							"parent": null,
							"attributes": {
								"integration_ProductAtt13Desc": "Dekoratif - %50+%50",
								"integration_ProductAtt12Desc": "%50 + %20 PROMOSYON",
								"integration_ProductAtt07Desc": "50+50 promosyon",
								"boyut": "13x18 CM",
								"uretim_yeri": "ÇİN",
								"renk": "STD",
								"integration_ProductAtt03Desc": "2011/2012 KIŞ",
								"integration_ProductCode": "1KCERV0784139",
								"integration_ProductAtt01Desc": "DIŞ ALIM",
								"integration_ProductAtt05Desc": "%50+%20 OUTLET PROMOSYONU",
								"integration_ProductAtt09Desc": "POLYRESİN",
								"integration_ProductAtt15Desc": "%50+%20 PROMOSYON",
								"integration_ProductHierarchyLevel01": "TEKSTİL DIŞI",
								"integration_ProductHierarchyLevel02": "Dekoratif",
								"integration_ProductAtt02Desc": "Dekoratif - Çerçeve",
								"integration_ProductAtt14Desc": "POLİREZİN ÇERÇEVE"
							},
							"attributes_kwargs": {
								"integration_ProductHierarchyLevel01": {
									"value": "TEKSTİL DIŞI",
									"label": "TEKSTİL DIŞI"
								},
								"renk": {
									"value": "STD",
									"label": "STD"
								},
								"integration_ProductHierarchyLevel02": {
									"value": "Dekoratif",
									"label": "Dekoratif"
								}
							},
							"extra_attributes": {},
							"group_products": [],
							"productimage_set": [
								{
									"pk": 978,
									"status": "active",
									"image": "https://cdn-mgsm.akinon.net/products/2017/01/23/2022/ce59ad7a-15f8-44d6-9c0d-9df0fe5405ba.jpg",
									"order": 0,
									"created_date": "2017-01-24T10:38:10.663088Z",
									"specialimage_set": []
								},
								{
									"pk": 2434,
									"status": "active",
									"image": "https://cdn-mgsm.akinon.net/products/2017/01/23/2022/93e48ca3-3bac-4bec-940c-64a9de3c4040.jpg",
									"order": 1,
									"created_date": "2017-01-24T10:39:44.865219Z",
									"specialimage_set": []
								},
								{
									"pk": 3928,
									"status": "active",
									"image": "https://cdn-mgsm.akinon.net/products/2017/01/23/2022/66d2b6b9-3d27-482f-93d5-e48abf231122.jpg",
									"order": 2,
									"created_date": "2017-01-24T10:41:16.058763Z",
									"specialimage_set": []
								}
							],
							"attribute_set": 62,
							"custom_attribute_set": null,
							"is_listable": true,
							"listing_code": null,
							"data_source": null
						},
					],
                	"allowed_quantity": 2
            	},
            	"page_name": "SampleProductPage",
            	"page_slug": "sampleproductpage"
        	}
    	],
    	"template_name": "orders/checkout.html",
    	"errors": null,
    	"pre_order": {...}
    }
```

**Example Response 3 - Reservation Selection**

```json
     {
    	"context_list": [
        	{
            	"page_context": {
					"slots": [
						{
							"upper": "2023-03-15 17:00:00+00:00",
	 						"lower": "2023-03-15 15:00:00+00:00",
						},
						{
							"upper": "2023-03-15 21:00:00+00:00",
	 						"lower": "2023-03-15 19:00:00+00:00",
						}
					]
            	},
            	"page_name": "ReservationSelectionPage",
            	"page_slug": "reservationselectionpage"
        	}
    	],
    	"template_name": "orders/checkout.html",
    	"errors": null,
    	"pre_order": {...}
    }
```

### `POST` Set Reservation Selection

This method is used to notify the user’s designated reservation selection.

**Path:** `https://{commerce_url}/orders/checkout/?page=ReservationSelectionPage`

**Example Request 1**

```python
import requests

url = "https://{commerce_url}/orders/checkout/?page=ReservationSelectionPage"

payload = 'skip_reservation=true'
headers = {
  'x-requested-with': 'XMLHttpRequest',
  'Cookie': 'osessionid=<session_id>',
  'Content-Type': 'application/x-www-form-urlencoded'
}

response = requests.request("POST", url, headers=headers, data=payload)

print(response.text)
```

**Example Response 1 - Reservation Skipped**

```json
    {
    	"context_list": [
        	{
            	"page_context": {
                	"checkout_url": null,
                	"status_url": null,
                	"payment_options": [
                    	{
                        	"pk": 1,
                        	"name": "Kredi Kartı",
                        	"payment_type": "credit_card",
                        	"payment_type_label": "Kredi Kartı"
                    	}
                	],
                	"unavailable_options": []
            	},
            	"page_name": "PaymentOptionSelectionPage",
            	"page_slug": "paymentoptionselectionpage"
        	}
    	],
    	"template_name": "orders/checkout.html",
    	"errors": null,
    	"pre_order": {...}
    }
```

**Example Request 2**

```python
import requests

url = "https://{commerce_url}/orders/checkout/?page=ReservationSelectionPage"

payload = 'upper=2023-03-15%2017%3A00%3A00%2B00%3A00&lower=2023-03-15%2015%3A00%3A00%2B00%3A00&skip_reservation=false'
headers = {
  'x-requested-with': 'XMLHttpRequest',
  'Cookie': 'osessionid=<session_id>',
  'Content-Type': 'application/x-www-form-urlencoded'
}

response = requests.request("POST", url, headers=headers, data=payload)

print(response.text)
```

**Example Response 2 - Reservation Made**

```json
    {
    	"context_list": [
        	{
            	"page_context": {
                	"slots:": [
						{
							"05/14/2030": {
								"is_available": true,
								"time_slot": {
									"upper": "2023-03-15 17:00:00+00:00",
									"lower": "2023-03-15 15:00:00+00:00",
								}
								"quota": 100,
								"is_delivery_range_active": true,
							}
						}
					]
            	},
            	"page_name": "ReservationSelectionPage",
            	"page_slug": "ReservationSelectionPage"
        	}
    	],
    	"template_name": "orders/checkout.html",
    	"errors": null,
    	"pre_order": {...}
    }
```
