> 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.

# Get the restaurant

GET https://www.lettbestilt.no/api/v1/restaurant

Returns the restaurant's public profile: name, branding (logo, colors, font), contact details, visiting address, capabilities, current preparation time and the newsletter popup. Use it for headers, footers and contact pages; it is much smaller than `GET /menu`.

- `restaurant.capabilities` is the stable, dashboard-controlled answer to what the restaurant offers: pickup, delivery, reservations and payment. The older `restaurant.payment` object is kept for existing clients.
- `restaurant.address` is the visiting address, or `null`. See `Address`.
- `restaurant.newsletterPopup` is set when the popup is enabled and linked to an active coupon, otherwise `null`. The coupon code is never included here; `POST /newsletter/signup` returns it.
- `restaurant.prepTime` includes rush, but this response is cached at the edge (60 s, plus 600 s stale-while-revalidate). Show the number from `GET /prep-time` in checkout.
- `defaultPrepMinutes` and `defaultDeliveryMinutes` are base times **without** rush. Do not show them directly.

Reference: https://docs.lettbestilt.no/api-reference/restaurant-and-menu/get-restaurant

## 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, which is also its LettBestilt subdomain (`{slug}.lettbestilt.no`).

## Response

### 200

The restaurant.

- `restaurant` (Restaurant, optional)

## Errors

### 400 Bad Request Error

`MISSING_SLUG`: the `slug` query parameter is missing.

- `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)

## Types

### Restaurant

- `address` (Address, optional, nullable) — The restaurant's public visiting address. Safe to publish: on the contact page, as `address` and `geo` in Restaurant JSON-LD, and as the map point for pickup. The field is `null` when the restaurant has no street address. It is never an empty shell, so `address === null` means "no address to show", not "an address with empty fields". `latitude` and `longitude` are both set or both `null`; check one of them before you render a map.
- `capabilities` (RestaurantCapabilities, optional) — What the restaurant offers right now, controlled from its dashboard. Build your UI from this object instead of keeping your own feature flags. Treat a missing or `false` field as "not offered".
- `prepTime` (PrepTime, optional) — The current preparation time, already added up: base time plus rush. Show `pickupMinutes` or `deliveryMinutes` as "about X min". They are exactly what `POST /orders` uses to set `estimatedReadyAt` (now plus the minutes) on an as-soon-as-possible order. `rushDelayMinutes` above 0 means the kitchen has turned on rush, which turns itself off at the next midnight (Oslo time). Do not calculate anything yourself; show the numbers as they are.

### 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`.

### Address

The restaurant's public visiting address. Safe to publish: on the contact page, as `address` and `geo` in Restaurant JSON-LD, and as the map point for pickup. The field is `null` when the restaurant has no street address. It is never an empty shell, so `address === null` means "no address to show", not "an address with empty fields". `latitude` and `longitude` are both set or both `null`; check one of them before you render a map.

- `line1` (string, required) — Street address, for example "Heggeliveien 5". Never empty.
- `postalCode` (string, required, nullable) — Four digits, for example "9325".
- `city` (string, required, nullable) — Postal town, for example "Bardufoss".
- `country` (enum, required) — ISO 3166-1 alpha-2. Always "NO".
  - Allowed values: `NO`
- `latitude` (double, required, nullable) — WGS84. Set when the owner picked the address from the address lookup in the dashboard.
- `longitude` (double, required, nullable) — WGS84. Always set together with `latitude`.

### RestaurantCapabilities

What the restaurant offers right now, controlled from its dashboard. Build your UI from this object instead of keeping your own feature flags. Treat a missing or `false` field as "not offered".

- `pickup` (boolean, required) — Customers can order for pickup.
- `delivery` (boolean, required) — Customers can order delivery.
- `reservations` (boolean, required) — The restaurant takes table reservations.
- `payment` (RestaurantCapabilitiesPayment, required) — Checkout options. `online` sends the customer to one hosted SagaPay page, where they choose card, Vipps or another enabled method. `cash` is paid at pickup or delivery.

### PrepTime

The current preparation time, already added up: base time plus rush. Show `pickupMinutes` or `deliveryMinutes` as "about X min". They are exactly what `POST /orders` uses to set `estimatedReadyAt` (now plus the minutes) on an as-soon-as-possible order. `rushDelayMinutes` above 0 means the kitchen has turned on rush, which turns itself off at the next midnight (Oslo time). Do not calculate anything yourself; show the numbers as they are.

- `pickupMinutes` (integer, required) — Base pickup time plus rush.
- `deliveryMinutes` (integer, required) — Base delivery time plus rush.
- `rushDelayMinutes` (integer, required) — Extra minutes from rush right now (0 = no rush).
- `basePickupMinutes` (integer, required) — The restaurant's normal pickup time (same as `defaultPrepMinutes`).
- `baseDeliveryMinutes` (integer, required) — The restaurant's normal delivery time (same as `defaultDeliveryMinutes`).

### RestaurantCapabilitiesPayment

Checkout options. `online` sends the customer to one hosted SagaPay page, where they choose card, Vipps or another enabled method. `cash` is paid at pickup or delivery.

- `online` (boolean, required)
- `cash` (boolean, required)

## Examples

**Response**

```json
{
  "restaurant": {
    "address": {
      "line1": "string",
      "postalCode": "string",
      "city": "string",
      "country": "NO",
      "latitude": 1.1,
      "longitude": 1.1
    },
    "capabilities": {
      "pickup": true,
      "delivery": true,
      "reservations": true,
      "payment": {
        "online": true,
        "cash": true
      }
    },
    "prepTime": {
      "pickupMinutes": 1,
      "deliveryMinutes": 1,
      "rushDelayMinutes": 1,
      "basePickupMinutes": 1,
      "baseDeliveryMinutes": 1
    }
  }
}
```

**SDK Code**

```python
import requests

url = "https://www.lettbestilt.no/api/v1/restaurant"

querystring = {"slug":"slug"}

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

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

print(response.json())
```

```javascript
const url = 'https://www.lettbestilt.no/api/v1/restaurant?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
package main

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

func main() {

	url := "https://www.lettbestilt.no/api/v1/restaurant?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
require 'uri'
require 'net/http'

url = URI("https://www.lettbestilt.no/api/v1/restaurant?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
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

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

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

$client = new \GuzzleHttp\Client();

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

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

```csharp
using RestSharp;

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

```swift
import Foundation

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

let request = NSMutableURLRequest(url: NSURL(string: "https://www.lettbestilt.no/api/v1/restaurant?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()
```