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

# Bulk CSV import

Use bulk CSV import when you need to load or refresh a large Fixed Location
portfolio. Smaller integrations should usually use the REST Fixed Location
endpoints directly so each change can be validated immediately.

> **Warning**
>
> **The CSV is treated as the complete portfolio for your customer source.**
> Each upload is a full sync: rows not yet in AURA are created, changed rows are
> updated, and any active Fixed Location in your source that is **missing from
> the file is marked as deleted** (matched on `externalReferenceId`). A partial
> CSV will silently remove every site it omits.
>
> For a monitoring centre with installers, include an `installerIdentifier` column
> when the file contains installer-owned sites. The value must exactly match one
> returned by [List installers](/api-reference/installers/list-installers). Rows
> with no value are synced against the centre's own customer source; rows with an
> installer value are synced against that installer. Rows whose installer value
> matches no installer are skipped, even when your account assigns unmatched
> installers to you over REST. The upload is fanned out to
> the centre and eligible installer sources, so each source is still reconciled as
> a complete portfolio. Include the complete parent portfolio and the complete
> portfolio for every installer reported with `bulkSyncManaged: true`. Do not
> upload a partial file for only one installer.

## Choose one maintenance mode

Because each upload is a full sync, pick one of these modes and stay with it:

* **One-off import, then REST** — use CSV once to seed the portfolio, then
  create, update, and delete Fixed Locations through the REST endpoints. Don't
  upload another CSV unless it contains the *entire* current portfolio.
* **CSV sync as the source of truth** — maintain the portfolio exclusively
  through repeated full-file uploads from your source system, and avoid making
  REST changes between uploads.

Mixing the two concurrently risks dropped sites: a Fixed Location created via
the REST API will be deleted by the next CSV upload that doesn't include it.

## How it works

1. Prepare a CSV of your **complete** Fixed Location portfolio from your source
   system.
2. Upload it with a callback URL.
3. AURA processes the file asynchronously as a full sync (create / update /
   delete).
4. Your backend receives the result at the callback URL.
5. Reconcile AURA Fixed Locations against your source system.

Three details matter for the upload:

* It's a **multipart** request, and the CSV file's field name must be
  `locations`.
* `callbackUrl` is **required** and must be HTTPS — the asynchronous import
  result is POSTed there.
* The upload (`POST /v1/predefinedlocations/upload`) and export
  (`GET /v1/predefinedlocations/download`) live on the Panic API host but use
  `/v1/...` paths **without** the `/panic-api` prefix used by the rest of the
  API.

The optional CSV column is named `installerIdentifier` (case-insensitive header
matching). Values are matched exactly, including case and whitespace.

## Reconciliation

Use a stable `externalReferenceId` for each Fixed Location. After the import
finishes, compare the returned or downloaded records with your own source
system and resolve missing, duplicated, or outdated locations before operators
request response.

## In the API Reference

* [Bulk upload fixed locations](/api-reference/fixed-locations/bulk-upload-fixed-locations)
* [Download fixed locations as CSV](/api-reference/fixed-locations/download-fixed-locations-csv)
* [Fixed Locations](/api-reference/fixed-locations)