> ## Documentation Index
> Fetch the complete documentation index at: https://docs.storerocket.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Get a location

> Read one location and its optional attached information.

Requires `location:read` and project API access. The location must belong to the project in the URL.

<ParamField path="project_id" type="string" required>The public project ID.</ParamField>
<ParamField path="location_id" type="string" required>The public location ID.</ParamField>
<ParamField query="includeHours" type="number">Send `1` to include opening hours.</ParamField>
<ParamField query="includeFilters" type="number">Send `1` to include filters.</ParamField>
<ParamField query="includeFields" type="number">Send `1` to include custom fields.</ParamField>
<ParamField query="includeCallsToAction" type="number">Send `1` to include calls to action.</ParamField>

JavaScript examples run in Node.js 22 or later; PHP examples require PHP 8.2 or later with cURL. Both read `STOREROCKET_TOKEN` from your environment. See the [quickstart](/api/quickstart) for setup.

<RequestExample>
  ```bash cURL theme={null}
  curl --get 'https://storerocket.io/api/v2/projects/PROJECT_ID/locations/LOCATION_ID' \
    -H 'Authorization: Bearer YOUR_TOKEN' \
    -H 'Accept: application/json' \
    --data-urlencode 'includeHours=1' \
    --data-urlencode 'includeFilters=1' \
    --data-urlencode 'includeFields=1' \
    --data-urlencode 'includeCallsToAction=1'
  ```

  ```javascript JavaScript theme={null}
  const token = process.env.STOREROCKET_TOKEN;
  if (!token) throw new Error("Set STOREROCKET_TOKEN first.");
  const projectId = "PROJECT_ID";
  const locationId = "LOCATION_ID";

  const url = new URL(`https://storerocket.io/api/v2/projects/${encodeURIComponent(projectId)}/locations/${encodeURIComponent(locationId)}`);
  url.searchParams.set("includeHours", "1");
  url.searchParams.set("includeFilters", "1");
  url.searchParams.set("includeFields", "1");
  url.searchParams.set("includeCallsToAction", "1");
  const response = await fetch(url, {
    headers: {
      Authorization: `Bearer ${token}`,
      Accept: "application/json",
    },
    signal: AbortSignal.timeout(30_000),
  });

  const text = await response.text();
  if (!response.ok) throw new Error(`HTTP ${response.status}: ${text}`);
  console.log(JSON.parse(text));
  ```

  ```php PHP theme={null}
  <?php

  $token = getenv("STOREROCKET_TOKEN") ?: throw new RuntimeException("Set STOREROCKET_TOKEN first.");
  $projectId = "PROJECT_ID";
  $locationId = "LOCATION_ID";

  $url = 'https://storerocket.io/api/v2/projects/' . rawurlencode($projectId) . '/locations/' . rawurlencode($locationId);
  $url .= "?" . http_build_query([
      'includeHours' => 1,
      'includeFilters' => 1,
      'includeFields' => 1,
      'includeCallsToAction' => 1,
  ], "", "&", PHP_QUERY_RFC3986);

  $curl = curl_init($url);
  curl_setopt_array($curl, [
      CURLOPT_HTTPHEADER => [
          "Authorization: Bearer $token",
          "Accept: application/json",
      ],
      CURLOPT_RETURNTRANSFER => true,
      CURLOPT_CONNECTTIMEOUT => 5,
      CURLOPT_TIMEOUT => 30,
  ]);

  $text = curl_exec($curl);
  $error = curl_error($curl);
  $status = (int) curl_getinfo($curl, CURLINFO_HTTP_CODE);
  curl_close($curl);

  if ($text === false) {
      throw new RuntimeException("Request failed: $error");
  }
  if ($status < 200 || $status >= 300) {
      throw new RuntimeException("HTTP $status: $text");
  }
  $data = json_decode($text, false, 512, JSON_THROW_ON_ERROR);
  echo json_encode($data, JSON_PRETTY_PRINT | JSON_THROW_ON_ERROR), PHP_EOL;
  ```
</RequestExample>

## Response format

Successful reads and writes return `200` with a `data` object. The example below shows selected fields with illustrative values.

<ResponseExample>
  ```json Example response theme={null}
  {
    "data": {
      "id": "LOCATION_ID",
      "name": "Downtown Store",
      "address": "123 Main St, Seattle, WA 98101",
      "city": "Seattle",
      "postcode": "98101",
      "phone": "555-0101",
      "lat": 47.6062,
      "lng": -122.3321,
      "marker_id": null,
      "marker_url": null,
      "location_type": "Standard",
      "cover_image_url": null,
      "hours": {
        "name": "Store hours",
        "mon": "09:00-17:00",
        "tue": "09:00-17:00",
        "wed": "09:00-17:00",
        "thu": "09:00-17:00",
        "fri": "09:00-17:00",
        "sat": "10:00-14:00",
        "sun": "closed"
      },
      "filters": [],
      "fields": [{"id":"FIELD_ID","name":"Manager","value":"Sam"}],
      "callsToAction": [{"id":"CTA_ID","title":"Book","value":"https://example.com/book"}]
    }
  }
  ```
</ResponseExample>

The full resource also includes `slug`, `visible`, `display_address`, address components, `timezone`, `email`, `url`, and social fields. `location_type` is a name or null; marker IDs are integers or null. Read `cover_image_url` for the cover, and send `cover` when writing it.

`hours`, `filters`, `fields`, and `callsToAction` are included on GET only when requested with their include flags. No schedule returns `hours: null`. A write response includes these relationships automatically.

Custom fields and calls to action are **arrays in responses**, even though writes use named objects. Location responses do not include `created_at` or `updated_at`.

Errors: `401` authentication, `403` access/permission, `404` inaccessible project or location, `429` rate limit. See [errors](/api/errors).


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.