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

# List fixed locations

GET https://staging-panic.aura.services/panic-api/v2/predefinedLocations

Lists fixed locations across your whole estate: the sites belonging to your own customer source and the sites belonging to each of your installers. Every entry reports its owner as `installerIdentifier`, which is `null` for your own sites. If you have no installers, the response is exactly what it has always been. Use `externalReferenceId` for exact reconciliation against an identifier maintained by your integration. Point-of-contact details are omitted from this collection response; retrieve the fixed location by its AURA `id` when contact details are required.

Every filter on this operation narrows the same query and they combine freely, with one exception: `installerIdentifier` and `customerSourceId` both name the owning source, so supplying both is a contradiction rather than a narrower search and is rejected. Results are ordered by ascending `id`, so `limit` and `offset` page through them predictably.

Callout-scoped tokens cannot read this endpoint. Use a server token.

Reference: https://docs.aurasos.com/api-reference/fixed-locations/list-fixed-locations

## Authentication

- `Authorization` header (bearer token, required) — Bearer authentication of the form `Bearer <token>`, where token is your auth token.

## Servers

- `https://staging-panic.aura.services` (Staging, default)
- `https://panic.aura.services` (Production)

## Request

### Query parameters

- `installerIdentifier` (string, optional) — Narrows the response to the sites owned by one of your installers. The value must be an `installerIdentifier` returned by `GET /panic-api/v2/installers`. Matching is exact and case sensitive. An unknown value is rejected, and so is an empty one: `?installerIdentifier=` does not mean "my own sites". To select those, pass your own `customerSourceId` instead. Cannot be combined with `customerSourceId`.
- `customerSourceId` (integer, optional) — Narrows the response to the sites owned by exactly one customer source, which must be your own or one of your installers'. This identifies an AURA customer source, so it is not the same thing as `customerId`, which identifies an end customer. It is the only way to select just your own sites, and the only way to select an installer that has no `installerIdentifier` set. Both values come from `GET /panic-api/v2/installers`, as `self.customerSourceId` and each installer's `customerSourceId`. Cannot be combined with `installerIdentifier`.
- `customerId` (integer, optional) — Narrows the response to the sites linked to one end customer. Contrast `customerSourceId`, which selects by owning installer or monitoring centre: this selects on a different dimension, so the two can be combined to mean "that customer's sites owned by that source". Sites belonging to customer sources outside your estate are never returned, whatever this is set to.
- `externalReferenceId` (string, optional) — Exact, case-sensitive match against the integrator-owned fixed-location reference. The value is not constrained as unique, so the response can contain more than one match.
- `limit` (integer, optional, default: 100) — Maximum number of fixed locations to return. Values outside 1 to 100 are not rejected: they fall back to 100, as does a value that is not a number.
- `offset` (integer, optional, default: 0) — Number of matching fixed locations to skip. A negative value, or one that is not a number, is treated as 0.
- `search` (string, optional) — Case-insensitive prefix match against `locationIdentifier`.

## Response

### 200

Successful.

- `limit` (integer, optional)
- `offset` (integer, optional)
- `total` (integer, optional)
- `data` (list of FixedLocationListItem, optional)

## Errors

### 400 Bad Request Error

Invalid query parameter. Returned when `externalReferenceId` is supplied but is empty, whitespace only, or longer than 255 characters; when `installerIdentifier` is empty or is not one of your installers; when `customerSourceId` is not your own source or one of your installers'; or when `installerIdentifier` and `customerSourceId` are supplied together.

- `message` (string, optional)
- `errors` (ErrorResponseErrors, optional) — Error detail. May be a string, an array of strings, or an object (some routes return a serialized error object).

### 401 Unauthorized Error

Unauthorized.

- `message` (string, optional)
- `errors` (ErrorResponseErrors, optional) — Error detail. May be a string, an array of strings, or an object (some routes return a serialized error object).

## Types

### FixedLocationListItem

A predefined (fixed) location as returned by the list endpoint. Coordinates are returned as strings. Identical to `FixedLocation` except that it carries no `pointOfContact` collection.

- `id` (integer, optional)
- `customerId` (integer, optional, nullable)
- `customerSourceId` (integer, optional)
- `installerIdentifier` (string, optional, nullable) — The named installer that owns this site. `null` means either that the site belongs to your own customer source or that it belongs to an installer whose identifier has been cleared. Use `customerSourceId` when you need to distinguish those cases. Always `null` if you have no installers.
- `externalReferenceId` (string, optional, nullable) — Identifier maintained by the integration. It is returned and can be used for exact list filtering. New REST creates and updates reject a value already used by another live fixed location in your tree, but historical data and writes through other ingestion paths may still contain duplicates.
- `locationIdentifier` (string, optional) — A unique string you assign to identify the site.
- `locationDescription` (string, optional, nullable)
- `locationAdditionalInformation` (string, optional, nullable)
- `formattedAddress` (string, optional, nullable)
- `buildingName` (string, optional, nullable) — Optional name of the building at this fixed location.
- `entranceNote` (string, optional, nullable) — Instructions that help a responder find or use the correct entrance.
- `requiresInternalCheck` (boolean, optional) — Whether a responder must enter the premises to complete the site check.
- `latitude` (string, optional)
- `longitude` (string, optional)
- `w3w` (string, optional, nullable) — what3words address for the site.
- `calloutLocationTypeId` (integer, optional, nullable)
- `calloutLocationTypeValue` (string, optional, nullable)
- `calloutLocationTypeDescription` (string, optional, nullable)
- `duressCode` (string, optional, nullable) — Legacy field. New integrations should not rely on it.
- `medicalCoverage` (boolean, optional, nullable)
- `securityCoverage` (boolean, optional, nullable)
- `inCoverageLastCheckedAt` (datetime, optional, nullable)
- `createdAt` (datetime, optional)
- `updatedAt` (datetime, optional)
- `calloutLocationType.id` (integer, optional, nullable) — Literal top-level key whose name contains a dot (a serialization artifact), not a nested `calloutLocationType` object. Treat these `calloutLocationType.*` keys as opaque; they are null unless a callout location type is assigned.
- `calloutLocationType.value` (string, optional, nullable)
- `calloutLocationType.description` (string, optional, nullable)
- `calloutLocationType.addressType` (string, optional, nullable)
- `calloutLocationType.createdAt` (datetime, optional, nullable)
- `calloutLocationType.updatedAt` (datetime, optional, nullable)
- `calloutLocationType.locationCategory` (string, optional, nullable)
- `calloutLocationType.deprecatedAt` (datetime, optional, nullable)

### ErrorResponseErrors

Error detail. May be a string, an array of strings, or an object (some routes return a serialized error object).

- string
- list of string
- map from string to any

## Examples

### Your whole estate

**Response**

```json
{
  "limit": 100,
  "offset": 0,
  "total": 2,
  "data": [
    {
      "id": 12345,
      "customerSourceId": 591,
      "installerIdentifier": null,
      "externalReferenceId": "DOCS-EXTERNAL-1",
      "locationIdentifier": "DOCS-LOC-1",
      "formattedAddress": null,
      "latitude": "-26.2",
      "longitude": "28.2",
      "medicalCoverage": true,
      "securityCoverage": true,
      "inCoverageLastCheckedAt": "2026-06-08T14:34:48.648Z",
      "createdAt": "2026-06-08T14:34:48.649Z",
      "updatedAt": "2026-06-08T14:34:48.649Z"
    },
    {
      "id": 12346,
      "customerSourceId": 412,
      "installerIdentifier": "skywalker",
      "externalReferenceId": "DOCS-EXTERNAL-2",
      "locationIdentifier": "DOCS-LOC-2",
      "formattedAddress": null,
      "latitude": "-26.3",
      "longitude": "28.3",
      "medicalCoverage": true,
      "securityCoverage": true,
      "inCoverageLastCheckedAt": "2026-06-08T14:34:48.648Z",
      "createdAt": "2026-06-08T14:34:48.649Z",
      "updatedAt": "2026-06-08T14:34:48.649Z"
    }
  ]
}
```

**SDK Code**

```python Your whole estate
import requests

url = "https://staging-panic.aura.services/panic-api/v2/predefinedLocations"

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

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

print(response.json())
```

```javascript Your whole estate
const url = 'https://staging-panic.aura.services/panic-api/v2/predefinedLocations';
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 Your whole estate
package main

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

func main() {

	url := "https://staging-panic.aura.services/panic-api/v2/predefinedLocations"

	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 Your whole estate
require 'uri'
require 'net/http'

url = URI("https://staging-panic.aura.services/panic-api/v2/predefinedLocations")

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 Your whole estate
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.get("https://staging-panic.aura.services/panic-api/v2/predefinedLocations")
  .header("Authorization", "Bearer <token>")
  .asString();
```

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

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://staging-panic.aura.services/panic-api/v2/predefinedLocations', [
  'headers' => [
    'Authorization' => 'Bearer <token>',
  ],
]);

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

```csharp Your whole estate
using RestSharp;

var client = new RestClient("https://staging-panic.aura.services/panic-api/v2/predefinedLocations");
var request = new RestRequest(Method.GET);
request.AddHeader("Authorization", "Bearer <token>");
IRestResponse response = client.Execute(request);
```

```swift Your whole estate
import Foundation

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

let request = NSMutableURLRequest(url: NSURL(string: "https://staging-panic.aura.services/panic-api/v2/predefinedLocations")! 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()
```

### Narrowed to one installer

**Response**

```json
{
  "limit": 100,
  "offset": 0,
  "total": 1,
  "data": [
    {
      "id": 12346,
      "customerSourceId": 412,
      "installerIdentifier": "skywalker",
      "externalReferenceId": "DOCS-EXTERNAL-2",
      "locationIdentifier": "DOCS-LOC-2",
      "formattedAddress": null,
      "latitude": "-26.3",
      "longitude": "28.3",
      "medicalCoverage": true,
      "securityCoverage": true,
      "inCoverageLastCheckedAt": "2026-06-08T14:34:48.648Z",
      "createdAt": "2026-06-08T14:34:48.649Z",
      "updatedAt": "2026-06-08T14:34:48.649Z"
    }
  ]
}
```

**SDK Code**

```python Narrowed to one installer
import requests

url = "https://staging-panic.aura.services/panic-api/v2/predefinedLocations"

querystring = {"installerIdentifier":"skywalker"}

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

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

print(response.json())
```

```javascript Narrowed to one installer
const url = 'https://staging-panic.aura.services/panic-api/v2/predefinedLocations?installerIdentifier=skywalker';
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 Narrowed to one installer
package main

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

func main() {

	url := "https://staging-panic.aura.services/panic-api/v2/predefinedLocations?installerIdentifier=skywalker"

	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 Narrowed to one installer
require 'uri'
require 'net/http'

url = URI("https://staging-panic.aura.services/panic-api/v2/predefinedLocations?installerIdentifier=skywalker")

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 Narrowed to one installer
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.get("https://staging-panic.aura.services/panic-api/v2/predefinedLocations?installerIdentifier=skywalker")
  .header("Authorization", "Bearer <token>")
  .asString();
```

```php Narrowed to one installer
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://staging-panic.aura.services/panic-api/v2/predefinedLocations?installerIdentifier=skywalker', [
  'headers' => [
    'Authorization' => 'Bearer <token>',
  ],
]);

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

```csharp Narrowed to one installer
using RestSharp;

var client = new RestClient("https://staging-panic.aura.services/panic-api/v2/predefinedLocations?installerIdentifier=skywalker");
var request = new RestRequest(Method.GET);
request.AddHeader("Authorization", "Bearer <token>");
IRestResponse response = client.Execute(request);
```

```swift Narrowed to one installer
import Foundation

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

let request = NSMutableURLRequest(url: NSURL(string: "https://staging-panic.aura.services/panic-api/v2/predefinedLocations?installerIdentifier=skywalker")! 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()
```