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

> Register a signal with key types, regions, and access records

`POST /api/v2/storefront/signals`

Registers a signal so it can be deployed and surfaced to buyers. You set the key types and regions at creation; `keyType` and `regions` are immutable afterward. Use `access` records to control visibility (`PUBLIC` or `PROPRIETARY`) and optional per-advertiser pricing.

## Request

<CodeGroup>
  ```bash curl theme={null}
  curl -X POST https://api.apostra.com/api/v2/storefront/signals \
    -H "Authorization: Bearer $SCOPE3_API_KEY" \
    -H "Content-Type: application/json" \
    -d '{
      "signalId": "acme_high_value_customers",
      "name": "Acme — High-Value Customers",
      "description": "Top 10% LTV customers, refreshed weekly",
      "keyType": ["rampid", "uid2"],
      "regions": ["NORAM", "EMEA"],
      "isLive": false
    }'
  ```

  ```json With access and pricing theme={null}
  {
    "signalId": "acme_auto_intenders",
    "name": "Acme — Auto Intenders",
    "description": "In-market auto shoppers, last 30 days",
    "keyType": ["maid"],
    "regions": ["NORAM"],
    "access": [
      {
        "advertiserId": 88421,
        "visibility": "PROPRIETARY",
        "price": {
          "pricing_option_id": "po_cpm_standard",
          "pricing_model": "cpm",
          "currency": "USD",
          "fixed_price": 2.5
        }
      }
    ],
    "isLive": true
  }
  ```
</CodeGroup>

## Parameters

| Field         | Type      | Required | Notes                                                                                                                                                                                                                                                                                                                                                                         |
| ------------- | --------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `signalId`    | string    | Yes      | Caller-supplied stable identifier. Pattern `^[\w\-:.]+$`, max 255. **Immutable**                                                                                                                                                                                                                                                                                              |
| `name`        | string    | Yes      | Human-readable name (max 255)                                                                                                                                                                                                                                                                                                                                                 |
| `keyType`     | string\[] | Yes      | Identifiers the segment is keyed on. At least one **context** type (`country`, `region`, `metro`, `topic`, `eidr`, `gracenote`, `isrc`, `gtin`, `rss_guid`, `isbn`, `url`, `url_hash`, `custom`) or **identity** type (`maid`, `rampid`, `rampid_derived`, `hashed_email`, `hashed_phone`, `id5`, `uid2`, `euid`, `pairid`) — never both classes on one signal. **Immutable** |
| `agentId`     | string    | No       | Owning signals agent (for agent-managed signals)                                                                                                                                                                                                                                                                                                                              |
| `description` | string    | No       | What the segment represents (max 5000)                                                                                                                                                                                                                                                                                                                                        |
| `regions`     | string\[] | No       | Availability regions: `NORAM`, `LATAM`, `EMEA`, `APAC`, `ANZ`, `GLOBAL` (max 6). **Immutable**                                                                                                                                                                                                                                                                                |
| `metadata`    | object    | No       | Free-form key/value metadata                                                                                                                                                                                                                                                                                                                                                  |
| `access`      | object\[] | No       | Access records. Each requires `advertiserId` (int64) and `visibility` (`PUBLIC` or `PROPRIETARY`); optional `price`                                                                                                                                                                                                                                                           |
| `isLive`      | boolean   | No       | Whether the signal is deployed and accepting buys. Default `false`                                                                                                                                                                                                                                                                                                            |

## Response

```json theme={null}
{
  "signal": {
    "id": 50213,
    "signalId": "acme_high_value_customers",
    "customerId": 1001,
    "adcpAgentId": null,
    "name": "Acme — High-Value Customers",
    "description": "Top 10% LTV customers, refreshed weekly",
    "keyType": ["rampid", "uid2"],
    "regions": ["NORAM", "EMEA"],
    "metadata": null,
    "isLive": false,
    "archivedAt": null,
    "createdBy": "agent@acme.example",
    "updatedBy": null,
    "createdAt": "2026-06-06T12:00:00Z",
    "updatedAt": "2026-06-06T12:00:00Z"
  },
  "access": []
}
```

The numeric `id` and the string `signalId` are both returned. Pass `signalId` to every sibling operation.

## Errors

* `400 VALIDATION_ERROR` — missing `signalId`, `name`, or `keyType`; malformed `signalId`; an empty `keyType` array; or a `keyType` array that mixes context types with identity types (a single signal must be one class or the other — see [Key types and the privacy boundary](/v2/object-guides/signal#key-types-and-the-privacy-boundary)).
* `401 UNAUTHORIZED` — missing or invalid bearer token.

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

## Related

<CardGroup cols={2}>
  <Card title="Signal tasks" href="/v2/storefront/signals/tasks" icon="list-check">
    All signal operations
  </Card>

  <Card title="Signal overview" href="/v2/object-guides/signal" icon="wave-pulse">
    Fields, lifecycle, and concepts
  </Card>

  <Card title="Update signal" href="/v2/storefront/signals/tasks/update-signal" icon="pen">
    Change metadata and access records
  </Card>

  <Card title="Discover signals" href="/v2/storefront/signals/tasks/discover-signals" icon="satellite-dish">
    Find external segments from agents
  </Card>
</CardGroup>
