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

# Update fixed location

PUT https://staging-panic.aura.services/panic-api/v2/predefinedLocations/{id}
Content-Type: application/json

Updates an existing fixed location. Omitting `pointOfContact` leaves the existing collection unchanged, an empty array removes every contact, and a non-empty array is the complete desired collection. Existing contacts can retain their `id`; new contacts omit it. New integrations should avoid legacy `duressCode` fields even if older payloads still accepted them. Reaches your own sites and the sites owned by any of your installers.

This endpoint cannot change which installer owns a site. `installerIdentifier` may be sent only when it restates the current owner, so a location read from this API can be sent straight back unchanged. To move a site, delete it and create it under the new owner. If your account assigns unmatched installers to you, a value that matches none of your installers is also accepted and leaves ownership unchanged.

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

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

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

### Path parameters

- `id` (integer, required) — Fixed location identifier.

### Body (application/json)

This endpoint expects a FixedLocationUpdateRequest.

- `calloutLocationTypeId` (integer, optional, nullable)
- `customerId` (integer, optional, nullable)
- `externalReferenceId` (string, optional, nullable) — Optional stable reference maintained by your integration. Omitting it leaves the stored value unchanged. A non-null value must not already be used by another live fixed location belonging to you or one of your installers.
- `installerIdentifier` (string, optional, nullable) — Accepted only when it restates the site's current owner, which lets a location read from this API be sent back unchanged. Ownership is fixed at creation: naming a different installer, or sending `null` for a site one of your installers owns, is rejected with 400. A value that matches none of your installers is rejected with 400, unless your account assigns unmatched installers to you, in which case it is accepted and ownership is unchanged. Omit the field to leave ownership untouched. Sites owned by an installer that has no `installerIdentifier` of its own read back as `null`, and that `null` may be sent back.
- `locationIdentifier` (string, optional)
- `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. Omit this field to leave the existing value unchanged.
- `latitude` (string, optional) — Supply together with `longitude`; omit both to preserve the stored coordinates.
- `longitude` (string, optional) — Supply together with `latitude`; omit both to preserve the stored coordinates.
- `w3w` (string, optional, nullable)
- `duressCode` (string, optional, nullable) — Legacy field. New integrations should omit it.
- `pointOfContact` (list of FixedLocationPointOfContactUpdate, optional) — The complete desired contact collection. An empty array removes all contacts.

## Response

### 200

Successful.

- `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)
- `pointOfContact` (list of FixedLocationPointOfContact, optional) — Fixed-location contacts. Returned by singular reads and by create and update operations. Deliberately omitted from the broad list response, because contact email addresses and mobile numbers are personal data; resolve an `id` from the list and read that fixed location singly when you need them.

## Errors

### 400 Bad Request Error

Returned when the body is malformed; when `installerIdentifier` is empty; when it is not one of your installers and your account does not assign unmatched installers to you; or when it names an owner other than the site's current one. A `customerSourceId` echoed from a response is accepted only when it still identifies the current owner. Nothing is changed.

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

### 404 Not Found Error

Not found.

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

### 409 Conflict Error

The supplied `externalReferenceId` is already used by another live fixed location belonging to you or to one of your installers. Nothing is changed.

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

### FixedLocationPointOfContactUpdate

- `firstName` (string, required)
- `lastName` (string, optional, default: )
- `mobileNumber` (string, optional) — Required and at least 10 characters when `isPrimaryContact` is true.
- `email` (string, optional) — Required when `isIncidentReportSubscriber` is true.
- `isPrimaryContact` (boolean, optional, default: false) — At most one contact can be primary.
- `isIncidentReportSubscriber` (boolean, optional, default: false)
- `id` (integer, optional) — AURA contact ID from a fixed-location response. Omit for a new contact.

### FixedLocationPointOfContact

- `firstName` (string, required)
- `id` (integer, required)
- `lastName` (string, optional, default: )
- `mobileNumber` (string, optional) — Required and at least 10 characters when `isPrimaryContact` is true.
- `email` (string, optional) — Required when `isIncidentReportSubscriber` is true.
- `isPrimaryContact` (boolean, optional, default: false) — At most one contact can be primary.
- `isIncidentReportSubscriber` (boolean, optional, default: false)

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

**Request**

```json
{
  "externalReferenceId": "DOCS-EXTERNAL-1",
  "locationIdentifier": "DOCS-LOC-1",
  "latitude": "-26.2",
  "longitude": "28.2",
  "pointOfContact": [
    {
      "firstName": "Sam",
      "lastName": "Jansen",
      "mobileNumber": "+31612345678",
      "email": "sam@example.com",
      "isPrimaryContact": true,
      "isIncidentReportSubscriber": true,
      "id": 901
    }
  ]
}
```

**Response**

```json
{
  "id": 22,
  "customerId": 3,
  "customerSourceId": 35,
  "installerIdentifier": "skywalker",
  "externalReferenceId": "SHOP",
  "locationIdentifier": "must also be unique string 123",
  "locationDescription": "some description",
  "locationAdditionalInformation": "upstairs flat with big dog",
  "formattedAddress": "23 baker street",
  "buildingName": "Harbour Point",
  "entranceNote": "Enter through the side gate",
  "requiresInternalCheck": true,
  "latitude": "-27.45678",
  "longitude": "26.678819",
  "w3w": "panther.logbook.blue",
  "calloutLocationTypeId": 3,
  "calloutLocationTypeValue": "string",
  "calloutLocationTypeDescription": "string",
  "duressCode": "string",
  "medicalCoverage": true,
  "securityCoverage": true,
  "inCoverageLastCheckedAt": "2024-01-15T09:30:00Z",
  "createdAt": "2024-01-15T09:30:00Z",
  "updatedAt": "2024-01-15T09:30:00Z",
  "calloutLocationType.id": 1,
  "calloutLocationType.value": "string",
  "calloutLocationType.description": "string",
  "calloutLocationType.addressType": "string",
  "calloutLocationType.createdAt": "2024-01-15T09:30:00Z",
  "calloutLocationType.updatedAt": "2024-01-15T09:30:00Z",
  "calloutLocationType.locationCategory": "string",
  "calloutLocationType.deprecatedAt": "2024-01-15T09:30:00Z",
  "pointOfContact": [
    {
      "firstName": "string",
      "id": 1,
      "lastName": "",
      "mobileNumber": "+31612345678",
      "email": "string",
      "isPrimaryContact": false,
      "isIncidentReportSubscriber": false
    }
  ]
}
```

**SDK Code**

```python Success
import requests

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

payload = {
    "externalReferenceId": "DOCS-EXTERNAL-1",
    "locationIdentifier": "DOCS-LOC-1",
    "latitude": "-26.2",
    "longitude": "28.2",
    "pointOfContact": [
        {
            "firstName": "Sam",
            "lastName": "Jansen",
            "mobileNumber": "+31612345678",
            "email": "sam@example.com",
            "isPrimaryContact": True,
            "isIncidentReportSubscriber": True,
            "id": 901
        }
    ]
}
headers = {
    "Authorization": "Bearer <token>",
    "Content-Type": "application/json"
}

response = requests.put(url, json=payload, headers=headers)

print(response.json())
```

```javascript Success
const url = 'https://staging-panic.aura.services/panic-api/v2/predefinedLocations/12345';
const options = {
  method: 'PUT',
  headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
  body: '{"externalReferenceId":"DOCS-EXTERNAL-1","locationIdentifier":"DOCS-LOC-1","latitude":"-26.2","longitude":"28.2","pointOfContact":[{"firstName":"Sam","lastName":"Jansen","mobileNumber":"+31612345678","email":"sam@example.com","isPrimaryContact":true,"isIncidentReportSubscriber":true,"id":901}]}'
};

try {
  const response = await fetch(url, options);
  const data = await response.json();
  console.log(data);
} catch (error) {
  console.error(error);
}
```

```go Success
package main

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

func main() {

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

	payload := strings.NewReader("{\n  \"externalReferenceId\": \"DOCS-EXTERNAL-1\",\n  \"locationIdentifier\": \"DOCS-LOC-1\",\n  \"latitude\": \"-26.2\",\n  \"longitude\": \"28.2\",\n  \"pointOfContact\": [\n    {\n      \"firstName\": \"Sam\",\n      \"lastName\": \"Jansen\",\n      \"mobileNumber\": \"+31612345678\",\n      \"email\": \"sam@example.com\",\n      \"isPrimaryContact\": true,\n      \"isIncidentReportSubscriber\": true,\n      \"id\": 901\n    }\n  ]\n}")

	req, _ := http.NewRequest("PUT", url, payload)

	req.Header.Add("Authorization", "Bearer <token>")
	req.Header.Add("Content-Type", "application/json")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
```

```ruby Success
require 'uri'
require 'net/http'

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

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Put.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n  \"externalReferenceId\": \"DOCS-EXTERNAL-1\",\n  \"locationIdentifier\": \"DOCS-LOC-1\",\n  \"latitude\": \"-26.2\",\n  \"longitude\": \"28.2\",\n  \"pointOfContact\": [\n    {\n      \"firstName\": \"Sam\",\n      \"lastName\": \"Jansen\",\n      \"mobileNumber\": \"+31612345678\",\n      \"email\": \"sam@example.com\",\n      \"isPrimaryContact\": true,\n      \"isIncidentReportSubscriber\": true,\n      \"id\": 901\n    }\n  ]\n}"

response = http.request(request)
puts response.read_body
```

```java Success
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.put("https://staging-panic.aura.services/panic-api/v2/predefinedLocations/12345")
  .header("Authorization", "Bearer <token>")
  .header("Content-Type", "application/json")
  .body("{\n  \"externalReferenceId\": \"DOCS-EXTERNAL-1\",\n  \"locationIdentifier\": \"DOCS-LOC-1\",\n  \"latitude\": \"-26.2\",\n  \"longitude\": \"28.2\",\n  \"pointOfContact\": [\n    {\n      \"firstName\": \"Sam\",\n      \"lastName\": \"Jansen\",\n      \"mobileNumber\": \"+31612345678\",\n      \"email\": \"sam@example.com\",\n      \"isPrimaryContact\": true,\n      \"isIncidentReportSubscriber\": true,\n      \"id\": 901\n    }\n  ]\n}")
  .asString();
```

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

$client = new \GuzzleHttp\Client();

$response = $client->request('PUT', 'https://staging-panic.aura.services/panic-api/v2/predefinedLocations/12345', [
  'body' => '{
  "externalReferenceId": "DOCS-EXTERNAL-1",
  "locationIdentifier": "DOCS-LOC-1",
  "latitude": "-26.2",
  "longitude": "28.2",
  "pointOfContact": [
    {
      "firstName": "Sam",
      "lastName": "Jansen",
      "mobileNumber": "+31612345678",
      "email": "sam@example.com",
      "isPrimaryContact": true,
      "isIncidentReportSubscriber": true,
      "id": 901
    }
  ]
}',
  'headers' => [
    'Authorization' => 'Bearer <token>',
    'Content-Type' => 'application/json',
  ],
]);

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

```csharp Success
using RestSharp;

var client = new RestClient("https://staging-panic.aura.services/panic-api/v2/predefinedLocations/12345");
var request = new RestRequest(Method.PUT);
request.AddHeader("Authorization", "Bearer <token>");
request.AddHeader("Content-Type", "application/json");
request.AddParameter("application/json", "{\n  \"externalReferenceId\": \"DOCS-EXTERNAL-1\",\n  \"locationIdentifier\": \"DOCS-LOC-1\",\n  \"latitude\": \"-26.2\",\n  \"longitude\": \"28.2\",\n  \"pointOfContact\": [\n    {\n      \"firstName\": \"Sam\",\n      \"lastName\": \"Jansen\",\n      \"mobileNumber\": \"+31612345678\",\n      \"email\": \"sam@example.com\",\n      \"isPrimaryContact\": true,\n      \"isIncidentReportSubscriber\": true,\n      \"id\": 901\n    }\n  ]\n}", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
```

```swift Success
import Foundation

let headers = [
  "Authorization": "Bearer <token>",
  "Content-Type": "application/json"
]
let parameters = [
  "externalReferenceId": "DOCS-EXTERNAL-1",
  "locationIdentifier": "DOCS-LOC-1",
  "latitude": "-26.2",
  "longitude": "28.2",
  "pointOfContact": [
    [
      "firstName": "Sam",
      "lastName": "Jansen",
      "mobileNumber": "+31612345678",
      "email": "sam@example.com",
      "isPrimaryContact": true,
      "isIncidentReportSubscriber": true,
      "id": 901
    ]
  ]
] as [String : Any]

let postData = JSONSerialization.data(withJSONObject: parameters, options: [])

let request = NSMutableURLRequest(url: NSURL(string: "https://staging-panic.aura.services/panic-api/v2/predefinedLocations/12345")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "PUT"
request.allHTTPHeaderFields = headers
request.httpBody = postData as Data

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