---
title: "Search places"
method: GET
path: "/places"
tags: ["Places"]
---

# Search places

`GET /places`

## Request

- Base URL: `https://api.layout.link/v1`
- URL: `https://api.layout.link/v1/places`
- Auth: HTTP bearer

Restaurants open right now, by name or kind of food, from what Layout holds, ranked by the person's location when you send it. Read-only: nothing is built or charged.

## Query parameters

- `query` string, required
- `near` string
- `lat` number
- `lng` number
- `limit` integer

## Headers

- `Layout-Version` '2026-10-01'

## Response `200`

Places, possibly none. Read `searched` and `emptyBecause` before telling anyone there is nothing there.

- PlaceList
  - `places` Place[], required: Places open right now. A closed place, or one whose hours Layout does not hold, is never listed.
    - `placeId` string, required
    - `slug` string, nullable, required: The public storefront path on layout.link.
    - `name` string, required
    - `address` string, nullable, required
    - `city` string, nullable, required
    - `region` string, nullable, required
    - `cuisine` string, nullable, required
    - `rating` number, nullable, required
    - `priceLevel` number, nullable, required: 1 (inexpensive) to 4 (very expensive). Null: not known.
    - `website` string, nullable, required
    - `openNow` boolean, nullable, required: Prefer `openStatus`: null here means not known, never closed.
    - `openStatus` 'open' | 'closed' | 'unknown', required: At the store's own clock. `unknown`: Layout holds no hours.
    - `ordering` 'confirmed' | 'unconfirmed' | 'unavailable', required: `confirmed`: Layout found an online ordering route. `unconfirmed`: not decided yet. `unavailable`: Layout looked and there is none.
    - `closesAt` string, nullable, required: Store-local closing time when open.
    - `opensAt` string, nullable, required: Store-local next opening when closed.
    - `closingSoon` boolean, required: Open, and closing within 45 minutes.
    - `distanceKm` number, nullable, required
    - `distanceMi` number, nullable, required: One decimal. Usually from the centre of `near` when it is sent and Layout can place it, else from `lat`/`lng`. Check `localityMatched`. Null without a location.
    - `photoUrl` string, nullable, required
  - `stillChecking` true: Layout is still checking whether more places there take online orders. Ask again in a minute.
  - `stillCheckingCount` integer
  - `searched` boolean, required: False when Layout did not look this time, so an empty list says nothing about the area.
  - `localityMatched` boolean, required: False when Layout could not place `near`: the rows are real but not where the person asked.
  - `emptyBecause` 'all_closed' | 'not_searched' | 'nothing_to_search': Why `places` is empty, when it is: everything there is shut, Layout did not look this time, or the query named nothing to look for.
  - `searchLimit` object: Sent with `searched: false` when a limit, not the area, is why Layout did not look further.
    - `pool` 'registry_only' | 'approved', required: `registry_only`: sandbox and applications not approved for live search only what Layout already holds. `approved`: an approved live application's pool of searches beyond it.
    - `scope` 'developer' | 'platform', nullable, required: Whose daily limit stopped the search: your developer account's, or the pool's across every developer. Null for `registry_only`.
    - `perDay` integer, required: The limit that applied, per day. 0 for `registry_only`.
    - `message` string, required

## Other responses

- `400`: A parameter is missing or out of range. The message names it. `unsupported_version`: the Layout-Version header names no version this API answers.
- `401`: The token is missing, expired, revoked, issued for another audience, or the person disconnected. Every 401 reads the same.
- `403`: The credential is real and may not do this: an application or account that is suspended, a live person on an unapproved application, a scope the token was not granted, or a person whose Layout account cannot order yet.
- `429`: A per-minute brake, or this application's daily place reads. The message names the limit.
- `500`: Layout failed to answer. Retry with backoff.
- `503`: Credentials or a dependency could not be checked right now. Retry with backoff.

---

[API](https://skmtc.dev/layout/apis/layout-partner-api.md) · [All operations](https://skmtc.dev/layout/apis/layout-partner-api/llms.txt) · [OpenAPI document](https://skmtc.dev/layout/apis/layout-partner-api/revisions/7ff4ba01bf56?raw)
