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

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

Lists the installers configured under the authenticated customer source, together with the calling customer source itself.

Call this once when a customer's credentials are configured, to discover whether that customer uses installers at all. An empty `installers` array means the customer manages all of its Fixed Locations directly. A populated array means Fixed Locations can be assigned to an installer when they are created. Fixed Location callouts are attributed automatically from the resolved site's owner.

A monitoring centre may hold Fixed Locations of its own alongside those belonging to its installers. Rows returned by the Fixed Location list carry a `customerSourceId`, which you can match against the values below to tell the two apart.

Installers are configured by AURA on request. This endpoint does not create them.

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

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

## Response

### 200

Successful.

- `self` (InstallerSelf, optional) — The customer source whose credentials made the request.
- `installers` (list of Installer, optional) — The installers configured under the authenticated customer source. Empty when there are none.

## Errors

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

### InstallerSelf

The customer source whose credentials made the request.

- `customerSourceId` (integer, optional)
- `name` (string, optional, nullable)

### Installer

An end client of the monitoring centre, whose Fixed Locations and callouts are attributed separately for reporting and billing.

- `installerIdentifier` (string, optional, nullable) — The value you send to address this installer on Fixed Location and callout requests. It is supplied to AURA by the monitoring centre and recorded exactly as given, so matching is case sensitive and whitespace is significant. Null when AURA holds no identifier for this installer, in which case its Fixed Locations are visible to you but cannot be addressed by identifier.
- `name` (string, optional, nullable) — The installer's name as agreed with AURA.
- `customerSourceId` (integer, optional) — AURA's identifier for this installer. Fixed Location list rows carry the same value, so it can be used to tell whose sites are whose.
- `bulkSyncManaged` (boolean, optional) — True when this installer's Fixed Locations are maintained by CSV bulk upload, where each upload is a full synchronisation and any site absent from the file is removed. False when the installer is excluded from bulk synchronisation, so its Fixed Locations are maintained over REST.

### ErrorResponseErrors

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

## Examples

### Customer source that sells through installers

**Response**

```json
{
  "self": {
    "customerSourceId": 400,
    "name": "Organa Monitoring"
  },
  "installers": [
    {
      "installerIdentifier": "skywalker",
      "name": "Skywalker Security",
      "customerSourceId": 412,
      "bulkSyncManaged": true
    },
    {
      "installerIdentifier": "SoloAlarms",
      "name": "Solo Alarms",
      "customerSourceId": 413,
      "bulkSyncManaged": false
    }
  ]
}
```

**SDK Code**

```python Customer source that sells through installers
import requests

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

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

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

print(response.json())
```

```javascript Customer source that sells through installers
const url = 'https://staging-panic.aura.services/panic-api/v2/installers';
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 Customer source that sells through installers
package main

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

func main() {

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

	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 Customer source that sells through installers
require 'uri'
require 'net/http'

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

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 Customer source that sells through installers
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/installers")
  .header("Authorization", "Bearer <token>")
  .asString();
```

```php Customer source that sells through installers
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

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

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

```csharp Customer source that sells through installers
using RestSharp;

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

```swift Customer source that sells through installers
import Foundation

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

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

### Customer source that manages its Fixed Locations directly

**Response**

```json
{
  "self": {
    "customerSourceId": 400,
    "name": "Organa Monitoring"
  },
  "installers": []
}
```

**SDK Code**

```python Customer source that manages its Fixed Locations directly
import requests

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

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

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

print(response.json())
```

```javascript Customer source that manages its Fixed Locations directly
const url = 'https://staging-panic.aura.services/panic-api/v2/installers';
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 Customer source that manages its Fixed Locations directly
package main

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

func main() {

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

	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 Customer source that manages its Fixed Locations directly
require 'uri'
require 'net/http'

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

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 Customer source that manages its Fixed Locations directly
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/installers")
  .header("Authorization", "Bearer <token>")
  .asString();
```

```php Customer source that manages its Fixed Locations directly
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

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

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

```csharp Customer source that manages its Fixed Locations directly
using RestSharp;

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

```swift Customer source that manages its Fixed Locations directly
import Foundation

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

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