> ## Documentation Index
> Fetch the complete documentation index at: https://docs.interchange.io/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.interchange.io/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 of `property`, `postal_code`, `uk_postal_district`, `maid`, `rampid`, `lat_long_radius`, `id5`, `coreid`, `yahoo_connect`, `uid2`, `euid`, `pairid`, `url`. **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`; or an empty `keyType` array.
* `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>
