> ## Documentation Index
> Fetch the complete documentation index at: https://docs.apostra.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Create property list

> Create an include or exclude list of typed properties for an advertiser

`POST /api/v2/buyer/advertisers/{advertiserId}/property-lists`

Creates a named property list scoped to an advertiser. Submit website domains via the `domains` shorthand, mixed web/mobile/CTV identifiers via `identifiers`, or both. Identifiers are resolved against the AAO registry and local catalog; the response carries a `resolutionSummary` showing how many will actually target.

## Request

<CodeGroup>
  ```bash curl theme={null}
  curl -X POST https://api.apostra.com/api/v2/buyer/advertisers/12345/property-lists \
    -H "Authorization: Bearer $SCOPE3_API_KEY" \
    -H "Content-Type: application/json" \
    -d '{
      "name": "Q1 Campaign - UK Premium",
      "purpose": "include",
      "domains": ["example-times.com", "example-press.co.uk", "example-news.com"],
      "filters": { "channels_any": ["display", "olv"] }
    }'
  ```

  ```json Mixed web + mobile + CTV theme={null}
  {
    "name": "Cross-screen premium",
    "purpose": "include",
    "identifiers": [
      { "type": "domain", "value": "example-times.com" },
      { "type": "ios_bundle", "value": "com.exampletimes.ExampleTimes" },
      { "type": "android_package", "value": "com.exampletimes.android" },
      { "type": "roku_store_id", "value": "12" }
    ]
  }
  ```
</CodeGroup>

## Parameters

| Field | Type | Required | Notes |
| - | - | - | - |
| `advertiserId` | string | Yes | Path. Owning advertiser |
| `name` | string | Yes | List name (1–255 chars) |
| `purpose` | enum | Yes | `include` (only buy these) or `exclude` (never buy these) |
| `domains` | string\[] | No | Shorthand for `identifiers` of `type: "domain"`. Up to 100,000 |
| `identifiers` | object\[] | No | Typed `{ type, value }`. `type` is `domain`, `subdomain`, `ios_bundle`, `android_package`, `apple_app_store_id`, `google_play_id`, `roku_store_id`, `fire_tv_asin`, `samsung_app_id`, `apple_tv_bundle`, or `bundle_id`. Up to 100,000 |
| `filters` | object | No | `channels_any` restricts which targeting profiles the list links to. Channels include `display`, `olv`, `social`, `ctv`, `dooh`, and more |
| `appliesToAllCampaigns` | boolean | No | Defaults to `true`. See [Lists that apply to every campaign](#lists-that-apply-to-every-campaign). Set on create only |

Provide `domains`, `identifiers`, or both — the combined total must be 1–100,000. They are concatenated and deduplicated.

## Lists that apply to every campaign

Every property list belongs to the advertiser it was created for.

* **`appliesToAllCampaigns: true` (the default)** makes the list the advertiser's all-campaigns list for its purpose (for the channels in `filters.channels_any`, or every channel when omitted). An advertiser has one all-campaigns list per purpose, so the new list replaces the previous one, and the response names it in `replacedPropertyListIds`. The replaced list stays saved but applies to no campaign (its `appliesToAllCampaigns` becomes `false`); a list still used in other channels is not replaced. Active media buys are moved from the replaced list to the new one straight away, and the response's `cascadeSummary` reports how many.
* **If no list slot covers the list's channels** (the advertiser's brand has no list slots, or none for the channels in `filters.channels_any`), a default create cannot apply the list: it is saved for campaign use only, returned with `appliesToAllCampaigns: false`, and nothing is replaced or pushed (`cascadeSummary` reports zero media buys).
* **`appliesToAllCampaigns: false`** saves the list for the advertiser without applying it to any campaign. The advertiser's lists and every active media buy stay as they were, and the response has no `cascadeSummary`. Apply it to one campaign by setting it as that campaign's own list (see [Campaign lists](/v2/guides/property-lists#campaign-lists)).

The choice is fixed when the list is created. `GET` and list responses return `appliesToAllCampaigns` for lists that carry an owner record for the requested advertiser.

## Response

```json theme={null}
{
  "propertyList": {
    "listId": "42",
    "name": "Cross-screen premium",
    "purpose": "include",
    "identifiers": [
      { "type": "domain", "value": "example-times.com" },
      { "type": "ios_bundle", "value": "com.exampletimes.ExampleTimes" },
      { "type": "android_package", "value": "com.exampletimes.android" }
    ],
    "unresolvedIdentifiers": [{ "type": "roku_store_id", "value": "12" }],
    "registeredIdentifiers": [],
    "domains": ["example-times.com"],
    "unresolvedDomains": [],
    "registeredDomains": [],
    "propertyCount": 14,
    "resolutionSummary": {
      "totalRequested": 4,
      "resolvedCount": 3,
      "registeredCount": 0,
      "unresolvedCount": 1,
      "resolutionRate": 0.75
    },
    "appliesToAllCampaigns": true,
    "createdAt": "2026-01-15T10:30:00.000Z",
    "updatedAt": "2026-01-15T10:30:00.000Z"
  }
}
```

`identifiers` is the persisted resolved set. `unresolvedIdentifiers` and `registeredIdentifiers` are transient — they appear on create/update only, not on subsequent `GET`s. Always inspect `resolutionSummary`: a non-zero `unresolvedCount` means those identifiers will not target.

## Errors

* `400 VALIDATION_ERROR` — missing `name` or `purpose`, empty identifier set, or combined total above 100,000.
* `404 NOT_FOUND` — `advertiserId` does not exist or is not visible to the authenticated account.

See [Errors](/v2/reference/errors) for the full error contract.

## Related

<CardGroup cols={2}>
  <Card title="Property list tasks" href="/v2/buyer/property-lists/tasks" icon="list-check">
    All property list operations
  </Card>

  <Card title="Property Lists guide" href="/v2/guides/property-lists" icon="list">
    Identifier types, resolution, and concepts
  </Card>

  <Card title="Check property list" href="/v2/buyer/property-lists/tasks/check-property-list" icon="circle-check">
    Validate a candidate set before creating
  </Card>

  <Card title="Update property list" href="/v2/buyer/property-lists/tasks/update-property-list" icon="pen">
    Replace identifiers on an existing list
  </Card>
</CardGroup>


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.