# Targeting key

#### Definition

A **Targeting Key** is a governed attribute definition that you can safely reference in variation-group targeting rules (e.g., `release`, `country`, `isLoggedIn`). Declaring keys centrally ensures consistent naming, types, and documentation across campaigns and SDKs.

#### Payload Properties

When creating or updating a targeting key, the `payload` can include:

* `id` (String, optional) — Unique targeting key identifier. Include this only when updating an existing targeting key.
* `name` (String, **required**) — Machine-readable key used in `targeting.targetings[].key`.\
  \&#xNAN;*Example:* `"release"`, `"country"`, `"targeting_key_created_with_resource_loader"`.
* `type` (String, **required**) — Data type of the key. Common values: `"string"`, `"number"`, `"boolean"`.\
  \&#xNAN;*Use the type your SDK will emit at runtime.*
* `description` (String, optional) — Human-friendly explanation of what the key represents and how it’s populated by your app/SDK.

> Notes\
> • Keep key names stable; changing them requires updating all targeting that references the key.\
> • Use the most specific type possible to enable operator validation (e.g., numbers for numeric comparisons).

**Example Project Payload:**

```json
{
  "type": "string",
  "name": "targeting_key_created_with_resource_loader",
  "description": "Loaded from resource loader"
}
```

#### Response Fields

When a Targeting Key is returned by the API/Resource Loader, you’ll receive its server-assigned ID and normalized definition:

* `id` (String) — Unique targeting key identifier.
* `name` (String) — Targeting key name used in rules.
* `type` (String) — Data type (e.g., `"string"`).
* `description` (String) — Documentation for the key.

**Example Response**

```json
{
  "description": "Loaded from resource loader",
  "id": "targeting_key",
  "name": "targeting_key_created_with_resource_loader",
  "type": "string"
}
```

#### Error Codes

* **InvalidPayload** – Missing project name when creating a project, or other payload formatting issues.
* **PermissionDenied** – User not allowed to create projects (if such permission is restricted).
