---
title: "Get the schedule"
description: "Selectable pickup or delivery slots for the coming days. Past slots\nand slots too close to now are left out.\n\nSome products need a longer preparation time or must be ordered days\nin advance; with `products` the slots respect those rules, exactly as\n`POST /orders` will. Send it whenever the cart is not empty, and reload\nthe schedule when the set of products changes.\n"
---

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

Path: Storefront API › Schedule

`GET /schedule`

Selectable pickup or delivery slots for the coming days. Past slots
and slots too close to now are left out.

Some products need a longer preparation time or must be ordered days
in advance; with `products` the slots respect those rules, exactly as
`POST /orders` will. Send it whenever the cart is not empty, and reload
the schedule when the set of products changes.

## Authentication

Requires one of the following:

- `publicKey`, apiKey, in header, header `X-Unipage-Key`
- `secretKey`, http, header `Authorization`

## Query parameters

- `orderType` (`getSchedule.query.orderType`; string, required) — The order type to read for.
  - one of `"TAKEOUT"`, `"DELIVERY"`
- `days` (`getSchedule.query.days`; integer, optional) — Number of days, starting today in the restaurant's timezone. A value above 14 is read as 14.
  - min 1; max 14; default `7`
- `products` (`getSchedule.query.products`; string, optional) — The comma-separated product ids in the cart, at most 100. An unknown id is a 422 `VALIDATION` (`fields.products`).

## Code samples

### cURL

```bash
curl --request GET \
  --url 'https://api.unipage.eu/storefront/v1/schedule?orderType=TAKEOUT' \
  --header 'X-Unipage-Key: <X-Unipage-Key>'
```

### TypeScript

```typescript
const url = 'https://api.unipage.eu/storefront/v1/schedule?orderType=TAKEOUT';
const options = {method: 'GET', headers: {'X-Unipage-Key': '<X-Unipage-Key>'}};

fetch(url, options)
  .then(res => res.json())
  .then(json => console.log(json))
  .catch(err => console.error(err));
```

### Python

```python
import requests

url = "https://api.unipage.eu/storefront/v1/schedule?orderType=TAKEOUT"

headers = {"X-Unipage-Key": "<X-Unipage-Key>"}

response = requests.get(url, headers=headers)

print(response.text)
```

## Responses

### 200

The schedule.

#### Example

```json
{
  "timezone": "Europe/Brussels",
  "days": [
    {
      "date": "2026-10-23",
      "weekday": "FRI",
      "isOpen": true,
      "slots": [
        {
          "time": "12:15",
          "at": 1792750500,
          "available": true
        }
      ]
    }
  ]
}
```

- `timezone` (`getSchedule.response.200.timezone`; string, optional)
- `days` (`getSchedule.response.200.days`; array<object>, optional)
  - `date` (`getSchedule.response.200.days.date`; string, optional) — `YYYY-MM-DD` in the restaurant's timezone.
  - `weekday` (`getSchedule.response.200.days.weekday`; string, optional)
  - `isOpen` (`getSchedule.response.200.days.isOpen`; boolean, optional) — `false` (with `slots: []`) for a day without a selectable slot.
  - `slots` (`getSchedule.response.200.days.slots`; array<object>, optional)
    - `time` (`getSchedule.response.200.days.slots.time`; string, optional) — `HH:MM` in the restaurant's timezone.
    - `at` (`getSchedule.response.200.days.slots.at`; integer, optional) — Unix seconds. Send it as `slotAt`.
    - `available` (`getSchedule.response.200.days.slots.available`; boolean, optional) — `false` means the slot exists but is full.

### 401

A missing, unknown or revoked key (`UNAUTHENTICATED`).

#### Example

```json
{
  "error": {
    "code": "UNAUTHENTICATED",
    "message": "No valid key."
  }
}
```

- `error` (`getSchedule.response.401.error`; object, required)
  - `code` (`getSchedule.response.401.error.code`; string, required)
    - one of `"UNAUTHENTICATED"`, `"FORBIDDEN"`, `"NOT_FOUND"`, `"METHOD_NOT_ALLOWED"`, `"VALIDATION"`, `"SLOT_UNAVAILABLE"`, `"DELIVERY_UNAVAILABLE"`, `"PRODUCT_UNAVAILABLE"`, `"COUPON_INVALID"`, `"MINIMUM_NOT_REACHED"`, `"RATE_LIMITED"`, `"INTERNAL"`
  - `message` (`getSchedule.response.401.error.message`; string, required) — Human readable.
  - `fields` (`getSchedule.response.401.error.fields`; map<string>, optional) — Only present when the error belongs to specific request fields.

### 403

A public key on a secret route, or used from an origin that is not
registered for it (`FORBIDDEN`).

#### Example

```json
{
  "error": {
    "code": "FORBIDDEN",
    "message": "Origin not registered for this key."
  }
}
```

- `error` (`getSchedule.response.403.error`; object, required)
  - `code` (`getSchedule.response.403.error.code`; string, required)
    - one of `"UNAUTHENTICATED"`, `"FORBIDDEN"`, `"NOT_FOUND"`, `"METHOD_NOT_ALLOWED"`, `"VALIDATION"`, `"SLOT_UNAVAILABLE"`, `"DELIVERY_UNAVAILABLE"`, `"PRODUCT_UNAVAILABLE"`, `"COUPON_INVALID"`, `"MINIMUM_NOT_REACHED"`, `"RATE_LIMITED"`, `"INTERNAL"`
  - `message` (`getSchedule.response.403.error.message`; string, required) — Human readable.
  - `fields` (`getSchedule.response.403.error.fields`; map<string>, optional) — Only present when the error belongs to specific request fields.

### 422

The request is not valid, see `fields` (`VALIDATION`).

#### Example

```json
{
  "error": {
    "code": "VALIDATION",
    "message": "The request is not valid.",
    "fields": {
      "products": "Unknown product."
    }
  }
}
```

- `error` (`getSchedule.response.422.error`; object, required)
  - `code` (`getSchedule.response.422.error.code`; string, required)
    - one of `"UNAUTHENTICATED"`, `"FORBIDDEN"`, `"NOT_FOUND"`, `"METHOD_NOT_ALLOWED"`, `"VALIDATION"`, `"SLOT_UNAVAILABLE"`, `"DELIVERY_UNAVAILABLE"`, `"PRODUCT_UNAVAILABLE"`, `"COUPON_INVALID"`, `"MINIMUM_NOT_REACHED"`, `"RATE_LIMITED"`, `"INTERNAL"`
  - `message` (`getSchedule.response.422.error.message`; string, required) — Human readable.
  - `fields` (`getSchedule.response.422.error.fields`; map<string>, optional) — Only present when the error belongs to specific request fields.

### 429

Too many requests (`RATE_LIMITED`). Wait `Retry-After` seconds.

#### Example

```json
{
  "error": {
    "code": "RATE_LIMITED",
    "message": "Too many requests."
  }
}
```

- `error` (`getSchedule.response.429.error`; object, required)
  - `code` (`getSchedule.response.429.error.code`; string, required)
    - one of `"UNAUTHENTICATED"`, `"FORBIDDEN"`, `"NOT_FOUND"`, `"METHOD_NOT_ALLOWED"`, `"VALIDATION"`, `"SLOT_UNAVAILABLE"`, `"DELIVERY_UNAVAILABLE"`, `"PRODUCT_UNAVAILABLE"`, `"COUPON_INVALID"`, `"MINIMUM_NOT_REACHED"`, `"RATE_LIMITED"`, `"INTERNAL"`
  - `message` (`getSchedule.response.429.error.message`; string, required) — Human readable.
  - `fields` (`getSchedule.response.429.error.fields`; map<string>, optional) — Only present when the error belongs to specific request fields.


Source: https://developer.unipage.be/storefront/api/schedule/retrieve/index.md
