# Campaign Events

`POST campaignEvents`

Receive `CAMPAIGN.STATUS` events via webhook whenever an RCS campaign's
per-carrier launch status (AT&T, T-Mobile, Verizon, other carriers) or
verification status (AEGIS, Google) changes.

Subscribe by attaching a webhook to an RCS agent sender — `CAMPAIGN.STATUS`
is only supported for agent senders, not phone numbers. Attempting to attach
this event to a phone number returns `400 Bad Request`.

The payload includes the agent reference, the connected campaign and
brand public ids, and the full `carrierLaunches` object.

**Before trusting the payload, verify the `PINNACLE-SIGNING-SECRET` header matches the signing secret of the webhook this event was delivered to.** Respond with a `200` to acknowledge receipt — any non-2xx response causes Pinnacle to retry with exponential backoff.

## Authentication

No authentication is required.

## Parameters

- `PINNACLE-SIGNING-SECRET` — header, string. Secret for verifying the authenticity of the request. Starts with `pss-` and is unique for each webhook. Find it at webhooks.

## Request body

Required.

Content type: `application/json`.

### Fields

- `type` — `string`, values: `CAMPAIGN.STATUS`
- `agent` — `object`. The RCS agent the campaign-status update is for.
- `agent.id` — `string`. RCS agent id (`agent_*`).
- `agent.name` — `string`. Display name configured on the agent. Null if unset.
- `campaign` — `object`. Reference to the connected campaign.
- `campaign.publicId` — `string`. Campaign public id (`rcs_*` for RCS campaigns). Null if the agent isn't yet linked to a campaign.
- `campaign.type` — `string`, values: `RCS`, `TOLL_FREE`, `10DLC`. Campaign protocol — currently always `RCS` for `CAMPAIGN.STATUS` events. Future event variants may carry `TOLL_FREE` or `10DLC`.
- `brand` — `object`. Reference to the brand owning the agent's connected campaign.
- `brand.publicId` — `string`. Brand public id (`b_*`). Null if no brand is linked.
- `brand.name` — `string`. Brand display name. Null if unset.
- `carrierLaunches` — `object`. Resolved per-key launch status for the campaign's agent. Carrier
statuses live under `carriers` and verifier statuses under
`verification`.
- `carrierLaunches.carriers` — `object`. Per-carrier launch status. Each carrier moves through
`NOT_LAUNCHED` → `PENDING` → `LAUNCHED` as Pinnacle submits the
agent for review and the carrier accepts it. The agent is only
deliverable on a carrier once that carrier reports `LAUNCHED`.
- `carrierLaunches.carriers.ATT` — `string`, values: `NOT_LAUNCHED`, `PENDING`, `LAUNCHED`. Status of an RCS agent's launch on a specific carrier.
  - `NOT_LAUNCHED` — no launch requested yet
  - `PENDING` — submitted to the carrier, review in progress
  - `LAUNCHED` — live on the carrier
- `carrierLaunches.carriers.TMOBILE` — `string`, values: `NOT_LAUNCHED`, `PENDING`, `LAUNCHED`. Status of an RCS agent's launch on a specific carrier.
  - `NOT_LAUNCHED` — no launch requested yet
  - `PENDING` — submitted to the carrier, review in progress
  - `LAUNCHED` — live on the carrier
- `carrierLaunches.carriers.VERIZON` — `string`, values: `NOT_LAUNCHED`, `PENDING`, `LAUNCHED`. Status of an RCS agent's launch on a specific carrier.
  - `NOT_LAUNCHED` — no launch requested yet
  - `PENDING` — submitted to the carrier, review in progress
  - `LAUNCHED` — live on the carrier
- `carrierLaunches.carriers.OTHERS` — `string`, values: `NOT_LAUNCHED`, `PENDING`, `LAUNCHED`. Status of an RCS agent's launch on a specific carrier.
  - `NOT_LAUNCHED` — no launch requested yet
  - `PENDING` — submitted to the carrier, review in progress
  - `LAUNCHED` — live on the carrier
- `carrierLaunches.verification` — `object`. External verifier status. AEGIS (the U.S. carrier vetting
authority used by AT&T, T-Mobile, and Verizon) and Google each
send a verification email to the brand's contact address. Each
verifier moves through `NOT_SENT` → `SENT` → `VERIFIED` once
the brand replies and the verifier confirms ownership.
- `carrierLaunches.verification.AEGIS` — `string`, values: `NOT_SENT`, `SENT`, `VERIFIED`. Status of an RCS agent's verification with a verifier (AEGIS or Google).
  - `NOT_SENT` — verification email not sent yet
  - `SENT` — sent (awaiting reply on the brand contact email)
  - `VERIFIED` — verified
- `carrierLaunches.verification.GOOGLE` — `string`, values: `NOT_SENT`, `SENT`, `VERIFIED`. Status of an RCS agent's verification with a verifier (AEGIS or Google).
  - `NOT_SENT` — verification email not sent yet
  - `SENT` — sent (awaiting reply on the brand contact email)
  - `VERIFIED` — verified
- `updatedAt` — `string`, format: date-time. ISO 8601 timestamp of when the change was applied.

### Example

```json
{
  "type": "CAMPAIGN.STATUS",
  "agent": {
    "id": "agent_iM9wQcyBBjYn",
    "name": "Acme Support"
  },
  "campaign": {
    "publicId": "rcs_xyz789",
    "type": "RCS"
  },
  "brand": {
    "publicId": "b_pqr456",
    "name": "Acme Inc."
  },
  "carrierLaunches": {
    "carriers": {
      "ATT": "LAUNCHED",
      "TMOBILE": "PENDING",
      "VERIZON": "NOT_LAUNCHED",
      "OTHERS": "NOT_LAUNCHED"
    },
    "verification": {
      "AEGIS": "VERIFIED",
      "GOOGLE": "SENT"
    }
  },
  "updatedAt": "2026-05-03T15:00:00Z"
}
```

## Responses

### 200

Return a 200 status to indicate that the data was received successfully

## Machine-readable schema

[OpenAPI 3.1 JSON](https://docs.pinnacle.sh/openapi.json)
