> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.lettbestilt.no/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.lettbestilt.no/_mcp/server.

# List available reservation times

GET https://www.lettbestilt.no/api/v1/dine-in/availability

Returns the reservation times for one date and party size, in 15-minute slots. `available: true` means at least one table, or combination of tables, that can be booked online fits the party at that time.

Slots are left out when they are outside opening hours, too late in the day (after closing time minus the restaurant's service time), inside the restaurant's minimum notice, or after the restaurant has closed online booking for that day. A party larger than `maxPartySize` gets an empty list.

If the restaurant does not take table reservations, the response is `{ "enabled": false, "slots": [] }`.

Rate limit: 60 requests per 60 seconds per slug and IP. Cached at the edge for 15 seconds (plus 30 s stale-while-revalidate). Walkthrough: [Table reservations](/reservations).

Reference: https://docs.lettbestilt.no/api-reference/reservations/get-reservation-availability

## Authentication

- `Authorization` header (bearer token, required) — Either this or a trusted browser origin. The restaurant's API key, sent as `Authorization: Bearer lbs_…`. Use it from your server only, never in browser code. Keys are issued per restaurant by LettBestilt.
- `Origin` header (required) — Either this or an API key. No key is needed when the request's `Origin` header is trusted for this restaurant: `https://{slug}.lettbestilt.no`, a verified domain of the restaurant, or a partner origin LettBestilt has bound to the restaurant. Browsers set `Origin` themselves; it is not something you configure. Not accepted by `GET /site-gate`, which requires an API key.

## Request

### Query parameters

- `slug` (string, required) — The restaurant's slug.
- `date` (string, required) — The date as `YYYY-MM-DD`, in Oslo time.
- `partySize` (integer, optional, default: 2) — Number of guests. Defaults to 2.

## Response

### 200

The slots for the date.

- `enabled` (boolean, optional) — Whether the restaurant takes table reservations.
- `maxPartySize` (integer, optional) — The largest party that can book online. Only present when `enabled` is `true`.
- `slots` (list of ApiV1DineInAvailabilityGetResponsesContentApplicationJsonSchemaSlotsItems, optional)

## Errors

### 400 Bad Request Error

`MISSING_SLUG`, or `BAD_REQUEST` for an invalid `date` or `partySize`.

- `error` (ErrorBody, required)

### 401 Unauthorized Error

`UNAUTHORIZED`: missing or invalid API key, and the request does not come from a trusted browser origin.

- `error` (ErrorBody, required)

### 404 Not Found Error

`RESTAURANT_NOT_FOUND`: no live restaurant has this slug.

- `error` (ErrorBody, required)

### 429 Too Many Requests Error

`RATE_LIMITED`: more than 60 requests in 60 seconds for this slug and IP.

- `error` (ErrorBody, required)

## Types

### ApiV1DineInAvailabilityGetResponsesContentApplicationJsonSchemaSlotsItems

- `time` (string, optional) — Start time as `HH:mm` in Oslo time, for display.
- `iso` (datetime, optional) — Start time in UTC (ISO 8601). Send this as `dineInAt` to `POST /reservations`.
- `available` (boolean, optional) — Whether a table is free for the party at this time.

### ErrorBody

- `code` (enum, required) — A machine-readable error code.
  - Allowed values: `MISSING_SLUG`, `MISSING_TOKEN`, `INVALID_JSON`, `INVALID_SUCCESS_URL`, `INVALID_CANCEL_URL`, `VALIDATION_FAILED`, `RESTAURANT_NOT_FOUND`, `ORDER_NOT_FOUND`, `RATE_LIMITED`, `BAD_REQUEST`, `UNAUTHORIZED`, `FORBIDDEN`, `POPUP_NOT_AVAILABLE`, `PRICE_CHANGED`, `PAYMENT_INCOMPLETE`, `PAYMENT_PENDING`, `PAYMENT_PROVIDER_INVALID`, `FULFILLMENT_NOT_ALLOWED`, `IDEMPOTENCY_CONFLICT`, `DINE_IN_DISABLED`, `PARTY_TOO_LARGE`, `TOO_EARLY`, `INTERNAL_ERROR`
- `message` (string, required) — A human-readable explanation. Often in Norwegian, and for business rules usually suitable to show the customer.
- `details` (any, optional) — Extra data for some codes, for example `issues` for `VALIDATION_FAILED` or the totals for `PRICE_CHANGED`.

## Examples

**Response**

```json
{
  "enabled": true,
  "maxPartySize": 8,
  "slots": [
    {
      "time": "17:00",
      "iso": "2026-10-16T15:00:00.000Z",
      "available": true
    },
    {
      "time": "17:15",
      "iso": "2026-10-16T15:15:00.000Z",
      "available": false
    }
  ]
}
```

**SDK Code**

```python Reservations_getReservationAvailability_example
import requests

url = "https://www.lettbestilt.no/api/v1/dine-in/availability"

querystring = {"date":"date","slug":"slug"}

headers = {"Authorization": "Bearer <token>"}

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

print(response.json())
```

```javascript Reservations_getReservationAvailability_example
const url = 'https://www.lettbestilt.no/api/v1/dine-in/availability?date=date&slug=slug';
const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};

try {
  const response = await fetch(url, options);
  const data = await response.json();
  console.log(data);
} catch (error) {
  console.error(error);
}
```

```go Reservations_getReservationAvailability_example
package main

import (
	"fmt"
	"net/http"
	"io"
)

func main() {

	url := "https://www.lettbestilt.no/api/v1/dine-in/availability?date=date&slug=slug"

	req, _ := http.NewRequest("GET", url, nil)

	req.Header.Add("Authorization", "Bearer <token>")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
```

```ruby Reservations_getReservationAvailability_example
require 'uri'
require 'net/http'

url = URI("https://www.lettbestilt.no/api/v1/dine-in/availability?date=date&slug=slug")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'

response = http.request(request)
puts response.read_body
```

```java Reservations_getReservationAvailability_example
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.get("https://www.lettbestilt.no/api/v1/dine-in/availability?date=date&slug=slug")
  .header("Authorization", "Bearer <token>")
  .asString();
```

```php Reservations_getReservationAvailability_example
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://www.lettbestilt.no/api/v1/dine-in/availability?date=date&slug=slug', [
  'headers' => [
    'Authorization' => 'Bearer <token>',
  ],
]);

echo $response->getBody();
```

```csharp Reservations_getReservationAvailability_example
using RestSharp;

var client = new RestClient("https://www.lettbestilt.no/api/v1/dine-in/availability?date=date&slug=slug");
var request = new RestRequest(Method.GET);
request.AddHeader("Authorization", "Bearer <token>");
IRestResponse response = client.Execute(request);
```

```swift Reservations_getReservationAvailability_example
import Foundation

let headers = ["Authorization": "Bearer <token>"]

let request = NSMutableURLRequest(url: NSURL(string: "https://www.lettbestilt.no/api/v1/dine-in/availability?date=date&slug=slug")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "GET"
request.allHTTPHeaderFields = headers

let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
  if (error != nil) {
    print(error as Any)
  } else {
    let httpResponse = response as? HTTPURLResponse
    print(httpResponse)
  }
})

dataTask.resume()
```