# Upload Updated Place List

Update a place list from a CSV file.
If `file` is present, the CSV is treated as the desired full set of
places: omitted places are deleted, matching places are updated in place,
and new places are inserted. Metadata fields are optional. The upload is
atomic: if any row is invalid, the API returns `400` with validation
errors and no changes are persisted. If the uploaded CSV changes
geographic Place content by adding a place, removing a place, or
changing an existing place's `latitude`, `longitude`, or
`radius_meters`, `sensitive_location_attestation` is required and must
be `"true"`. Matched-place `name` and `external_id` edits are metadata
edits that persist without requiring or recording attestation. A no-op
CSV resubmission of unchanged Place content does not require or record a
new attestation. The CSV header must be exactly
`name,latitude,longitude,radius_meters,external_id`.
When changing Place List locations through the API, accepting
`sensitive_location_attestation: "true"` confirms the following
attestation on behalf of the API user for this request:

```text
I represent and warrant that these locations are not being used to
target or identify individuals at sensitive locations, and that I have
the rights and consents necessary for this targeting, including consent
to share with third parties where required.
```
For guidance on what qualifies as a sensitive location, see
[Places attestation guidelines](https://support.infillion.com/s/article/Places).
Geographic-content-changing uploads submitted without
`sensitive_location_attestation`, or with it set to any value other than
`"true"`, are rejected with a `400` `invalid-request` error on
`/sensitive_location_attestation`. Metadata-only matched-place edits
and no-op resubmissions of unchanged Place content do not require or
record a new attestation. This is a per-request acknowledgment for
actual geographic content changes, not a one-time account-level setting.
The attestation language may be updated over time.

Endpoint: POST /place_lists/{place_list_id}/upload
Version: 3.0.1807
Security: Auth0

## Security:

  - `Auth0` (unknown)
    oauth2 scopes: offline_access, manage:services

## Path parameters:

  - `place_list_id` (integer, required)
    Numeric ID of the place list to update

## Request fields (multipart/form-data):

  - `file` (string)
    CSV file with header `name,latitude,longitude,radius_meters,external_id`.

  - `name` (string)
    Optional updated place list name.
    Example: Starbucks Stores - New York

  - `description` (string)
    Optional updated place list description.

  - `version` (string)
    Optional optimistic-lock version. It is a string because this is a form upload.

  - `sensitive_location_attestation` (string)
    Optional for metadata-only updates and no-op CSV resubmissions. If the uploaded CSV changes geographic Place content by adding a place, removing a place, or changing an existing place's latitude, longitude, or radius_meters, this field must be `"true"`. Matched-place name and external_id edits do not require or record attestation.

## Response 200:

  - `200` (unknown)
    Place list response

## Response 200 fields (application/json):

  - `data` (object)

  - `data.id` (integer)
    Example: 126

  - `data.entity_type` (string)
    Example: place_list

  - `data.version` (integer)
    Example: 2

  - `data.organization_id` (integer)
    Example: 100048

  - `data.name` (string)
    Example: Starbucks Stores - New York

  - `data.description` (string)
    Example: NYC flagship + competitor zones

  - `data.filename` (string)
    Example: starbucks_new_york.csv

  - `data.content_updated_on` (string)

  - `data.places_count` (integer)
    Example: 42

  - `data.strategy_count` (integer)
    Number of strategies currently assigned to this Place List through PLCS geofence targeting.

  - `data.created_on` (string)

  - `data.updated_on` (string)

  - `data.places` (array)
    Nested places — returned on create/update and single GET responses

  - `data.places.id` (integer)
    Example: 5001

  - `data.places.name` (string)
    Example: Times Square

  - `data.places.external_id` (string)
    Example: STORE-001

  - `data.places.geometry_type` (string)
    Returned by the API and must not be supplied by users
    Enum: "circle"

  - `data.places.latitude` (number)
    Example: 40.7589

  - `data.places.longitude` (number)
    Example: -73.9851

  - `data.places.radius_meters` (integer)
    Example: 1000

  - `meta` (object)

  - `meta.status` (string, required)
    Example: success

## Response 400:

  - `400` (unknown)
    Error response

## Response 400 fields (application/json):

  - `errors` (array, required)

  - `errors.code` (string)

  - `errors.sub_code` (string)
    Optional identifier that refines the generic `code` category (e.g. `html5-noscript-tag`). Present on HTML5 upload/preview validation errors; absent otherwise.

  - `errors.field` (string)
    Optional when it is a schema error

  - `errors.message` (string)

  - `meta` (object, required)

  - `meta.status` (string, required)

## Response 401:

  - `401` (unknown)
    Error response

## Response 401 fields (application/json):

  - `errors` (array, required)

  - `errors.code` (string)

  - `errors.sub_code` (string)
    Optional identifier that refines the generic `code` category (e.g. `html5-noscript-tag`). Present on HTML5 upload/preview validation errors; absent otherwise.

  - `errors.field` (string)
    Optional when it is a schema error

  - `errors.message` (string)

  - `meta` (object, required)

  - `meta.status` (string, required)

## Response 403:

  - `403` (unknown)
    Error response

## Response 403 fields (application/json):

  - `errors` (array, required)

  - `errors.code` (string)

  - `errors.sub_code` (string)
    Optional identifier that refines the generic `code` category (e.g. `html5-noscript-tag`). Present on HTML5 upload/preview validation errors; absent otherwise.

  - `errors.field` (string)
    Optional when it is a schema error

  - `errors.message` (string)

  - `meta` (object, required)

  - `meta.status` (string, required)

## Response 404:

  - `404` (unknown)
    Error response

## Response 404 fields (application/json):

  - `errors` (array, required)

  - `errors.code` (string)

  - `errors.sub_code` (string)
    Optional identifier that refines the generic `code` category (e.g. `html5-noscript-tag`). Present on HTML5 upload/preview validation errors; absent otherwise.

  - `errors.field` (string)
    Optional when it is a schema error

  - `errors.message` (string)

  - `meta` (object, required)

  - `meta.status` (string, required)

## Response 409:

  - `409` (unknown)
    Error response

## Response 409 fields (application/json):

  - `errors` (array, required)

  - `errors.code` (string)

  - `errors.sub_code` (string)
    Optional identifier that refines the generic `code` category (e.g. `html5-noscript-tag`). Present on HTML5 upload/preview validation errors; absent otherwise.

  - `errors.field` (string)
    Optional when it is a schema error

  - `errors.message` (string)

  - `meta` (object, required)

  - `meta.status` (string, required)

