> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.pinnacle.sh/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.pinnacle.sh/_mcp/server.

# Changelog

## May 2, 2026

## New webhook event: `CAMPAIGN.STATUS`

Subscribe to per-campaign status changes — including per-carrier launch
state (AT\&T, T-Mobile, Verizon, other carriers) and verification state
for AEGIS and Google.

### What's new?

* New `CAMPAIGN.STATUS` webhook event type. Subscribe by attaching a
  webhook to an RCS agent sender — this event is only supported for agent
  senders, not phone numbers. Pin a webhook to this event in the
  dashboard, or leave the event filter unset to receive every event your
  agent emits.
* Each payload includes the agent reference (`agent.id` + `agent.name`), the
  connected campaign (`campaign.publicId`, `campaign.type`), the brand
  reference, the resolved `carrierLaunches` snapshot, and the change
  timestamp.
* `carrierLaunches` is split into two groups with human-readable statuses:
  * `carriers` (`ATT`, `TMOBILE`, `VERIZON`, `OTHERS`) — each
    `NOT_LAUNCHED` / `PENDING` / `LAUNCHED`.
  * `verification` (`AEGIS`, `GOOGLE`) — each `NOT_SENT` / `SENT` /
    `VERIFIED`.

> **Note**
>
> Have questions? Reach out — [founders@pinnacle.sh](mailto:founders@pinnacle.sh)

## April 24, 2026

## Hosted Forms

Collect structured responses from your recipients with Pinnacle-hosted forms. Mint a form URL, deliver it over SMS or RCS in the same call, and receive completed submissions as a new `FORM.SUBMISSION` webhook event.

Browse, build, and theme forms in the [Pinnacle Dashboard → Forms](https://app.pinnacle.sh/dashboard/forms).

### What's new?

**Form endpoints**

* [`POST /forms`](/api-reference/forms/create-form) — create a form without sending it (returns the public `https://forms.pinnacle.sh/{form_id}` URL).
* [`POST /forms/send`](/api-reference/forms/send-form) — create (or reuse) a form and deliver its URL over SMS or RCS in one call. When `to` is provided, Pinnacle dispatches the message and the recipient is recorded on the response (`submission.to` plus the outbound `message_id`). Omit `to` to mint a standalone submission URL for embedding in your own outreach.
* [`GET /forms/{id}`](/api-reference/forms/get-form), [`PATCH /forms/{id}`](/api-reference/forms/update-form) — retrieve and partial-update a form.
* [`POST /forms/list`](/api-reference/forms/list-forms), [`POST /forms/{id}/submissions/list`](/api-reference/forms/list-form-submissions) — paginated listings of forms and of their completed submissions.

**16 field types out of the box**

Text, textarea, email, url, phone (auto-formats + E.164-normalized on submit), number, range slider, rating stars, date, time, datetime, color picker, select, radio group, checkbox group, and an `address` input with built-in Google Places autocomplete.

**Theme overrides**

Per-form `theme_override` layered on top of your team's default theme — tweak colors, background (solid / gradient / pattern / image), font family, corner radius, submit button label, success message, and post-submission redirect URL. Configure team-wide defaults from the [Pinnacle Dashboard → Forms](https://app.pinnacle.sh/dashboard/forms).

**Updatable submissions**

Set `can_update: true` to let a recipient reopen their submission URL and edit their answers. The form rehydrates with their prior values; `submission_count` reflects distinct recipients and `last_submitted_at` tracks the latest edit.

### New webhook event: `FORM.SUBMISSION`

When a recipient completes a form, every webhook subscribed to the sender receives a `FORM.SUBMISSION` event. The payload carries the sender, an optional conversation reference, the form summary, and a resolved snapshot of every field paired with the submitted value — ready to render or route on without a separate `get_form` call. Manage subscribers from the [Pinnacle Dashboard → Webhooks](https://app.pinnacle.sh/dashboard/development/webhooks).

```json
{
  "type": "FORM.SUBMISSION",
  "sender": "agent_iM9wQcyBBjYn",
  "conversation": { "id": "convo_…", "from": "agent_…", "to": "+14155551234" },
  "form": { "id": "form_…", "url": "https://forms.pinnacle.sh/form_…", "name": "Contact request" },
  "submission": {
    "id": "fsub_…",
    "from": "agent_iM9wQcyBBjYn",
    "to": "+14155551234",
    "data": { "full_name": "Ada Lovelace", "email": "ada@example.com" },
    "fields": [
      { "key": "full_name", "label": "Full name", "type": "text", "value": "Ada Lovelace" },
      { "key": "email", "label": "Email", "type": "email", "value": "ada@example.com" }
    ],
    "ip_address": "203.0.113.45",
    "user_agent": "Mozilla/5.0 …",
    "submitted_at": "2026-04-24T00:35:04.406Z"
  }
}
```

See the [Receiving Messages and User Events](/guides/messages/receiving) guide for full routing details.

## April 15, 2026

## Custom Webhook Headers

Attach custom HTTP headers to any webhook so your endpoint can authenticate incoming events, route them to the right tenant, or integrate with auth-gated infrastructure without a proxy in between.

### What's new?

**Custom headers on webhooks**

* Pass a `headers` object on [`POST /webhooks/attach`](/api-reference/webhooks/attach-webhook) when creating a new webhook **or** when attaching an existing `webhookId`
* Supplying `headers` with an existing `webhookId` **overwrites** the stored headers — omit the field to leave existing headers unchanged
* Headers are returned on every webhook response (`list_webhooks`, `get_webhooks`, `attach_webhook`) so you always see what will be sent
* Every webhook delivery includes the headers you configured alongside the standard `PINNACLE-SIGNING-SECRET`

**Header rules**

* Header names must match `^[A-Za-z0-9][A-Za-z0-9_-]*$` — start with a letter or digit, contain only letters, digits, `-`, or `_`
* Names are case-insensitive (per [RFC 9110](https://datatracker.ietf.org/doc/html/rfc9110#name-field-names)) and normalized to uppercase before storage
* Values must be strings
* The reserved `PINNACLE-SIGNING-SECRET` header is silently stripped and cannot be overridden — Pinnacle always sets it with your signing secret for request verification

**Use cases**

* Add an `AUTHORIZATION: Bearer …` header so your webhook endpoint can sit behind the same auth as the rest of your API
* Include a tenant identifier (`X-TENANT-ID`) to route multi-tenant deliveries without parsing the payload
* Pass an `X-API-KEY` for legacy systems that require pre-shared keys

[View API reference →](/api-reference/webhooks/attach-webhook)

> **Note**
>
> Have questions? Reach out to us - [founders@pinnacle.sh](mailto:founders@pinnacle.sh)

## April 5, 2026

## Usage Analytics, New Guides & Blog Launch

Track your real message spend in the dashboard, explore rewritten guides, and check out 20+ new blog posts on [pinnacle.sh/blog](https://pinnacle.sh/blog).

### What's new?

**Live usage analytics**

The [analytics dashboard](https://app.pinnacle.sh/dashboard/analytics) now shows your real-time messaging volume and spend.

* RCS, SMS, and MMS usage charts with a default 30-day window
* Combined credit balance showing purchased and subscription credits side-by-side
* Improved validation feedback when creating test agents — errors now tell you exactly which fields need attention

**Updated documentation**

* **[Sending messages](/api-reference/messages)** — expanded with coverage on [broadcasting to audiences](/api-reference/messages/blast-sms), [typing indicators](/api-reference/messages/send-typing-indicator), and [message reactions](/api-reference/messages/react)
* **[Receiving messages](/api-reference/webhooks)** — expanded with a step-by-step webhook setup walkthrough and structured event-type reference
* **[Test agents](/branded-test-agents)** — updated to reflect that test agents support the full RCS feature set (rich cards, carousels, buttons, media), limited only to your whitelisted numbers
* **Ruby quickstarts** — updated to use the SDK's `process()` method for webhook verification and idiomatic snake\_case, now on SDK v2.0.15

**Better RCS error messages**

When whitelisting testers, you'll now get clear error messages if the carrier requires your agent to be launched first — instead of a generic rejection.

**Blog launch**

We published 20+ posts on [pinnacle.sh/blog](https://pinnacle.sh/blog) covering everything from getting started to platform deep-dives:

* [RCS Test Agents: Send Your First Rich Message in Under Two Minutes](https://pinnacle.sh/blog/rcs-test-agents-send-your-first-rich-message-in-under-two-minutes)
* [RCS Fallback: Automatic SMS/MMS Delivery for Every Recipient](https://pinnacle.sh/blog/rcs-sms-fallback-automatic-message-delivery-for-all-devices)
* [Bulk Messaging: Send to Thousands of Contacts at Once](https://pinnacle.sh/blog/bulk-messaging-send-sms-mms-rcs-to-thousands-at-once)
* [Validate Before You Send: Message Validation for SMS, MMS, and RCS](https://pinnacle.sh/blog/validate-sms-mms-rcs-before-sending-pinnacle-message-validation)
* [Pinnacle vs. Twilio](https://pinnacle.sh/blog/pinnacle-vs-twilio-business-messaging-comparison) | [vs. Attentive](https://pinnacle.sh/blog/pinnacle-vs-attentive-business-messaging-comparison) | [vs. AWS](https://pinnacle.sh/blog/pinnacle-vs-amazon-business-messaging-comparison)

> **Note**
>
> Have questions? Reach out to us - [founders@pinnacle.sh](mailto:founders@pinnacle.sh)

## March 29, 2026

## Bulk Webhook Management

Webhook management just got simpler — attach and detach webhooks to multiple senders in a single API call.

### What's new?

**Bulk webhook attach/detach**

* **Attach webhooks** to multiple senders at once via [`POST /webhooks/attach`](/api-reference/webhooks/attach-webhook) — pass an array of phone numbers and/or RCS agent IDs
* **Detach webhooks** from multiple senders via [`POST /webhooks/detach`](/api-reference/webhooks/detach-webhook) — remove webhook routing in bulk
* Simplified `senders` field replaces the previous per-number configuration
* Detach now works regardless of webhook status

No more looping through numbers one at a time — configure all your webhook routing in a single request.

[View API reference →](/api-reference/webhooks)

> **Note**
>
> Have questions? Reach out to us - [founders@pinnacle.sh](mailto:founders@pinnacle.sh)

## March 27, 2026

## Simplified RCS Campaigns

RCS campaign submissions just got easier — we've streamlined the required fields so you can get approved faster with less friction.

### What's new?

**Simplified RCS campaign submissions**

We've removed deprecated and redundant fields from the RCS campaign schema. Submitting a campaign now requires fewer fields while still meeting carrier compliance requirements.

* Removed legacy profile fields that are no longer needed
* Added `cta_media` for attaching compliance media (e.g., opt-in screenshots)
* Added `opt_in_method` to clearly describe how users consent to receive messages
* Updated `use_case_description` for clearer campaign intent

These changes reduce the back-and-forth during carrier review and help you get your RCS agents approved faster. See our [RCS campaign compliance guide](/guides/campaigns/rcs-compliance) for details.

> **Note**
>
> Have questions? Reach out to us - [founders@pinnacle.sh](mailto:founders@pinnacle.sh)

## March 25, 2026

## Conversations, Reactions & More

New conversation threading, message reactions, validation endpoints, URL shortening, and an expanded MCP server.

### What's new?

**Conversations API**

Messages between a sender and recipient are now grouped into conversation threads — the backbone of inbox-style experiences.

* **List conversations** filtered by brand, campaign, sender, or receiver
* **Get a conversation** by ID or phone number pair
* **List messages** within a conversation with pagination
* **Update conversation notes** for internal tracking

[View API reference →](/api-reference/conversations)

**Message reactions**

React to messages with emoji using [`POST /messages/react`](/api-reference/messages/react). Messages support multiple reactions.

**Message validation**

Validate SMS, MMS, and RCS messages before sending — check segment count, encoding, unsupported files, and estimated cost without consuming credits.

* [`POST /messages/validate/sms`](/api-reference/messages/validate-sms) | [`POST /messages/validate/mms`](/api-reference/messages/validate-mms) | [`POST /messages/validate/rcs`](/api-reference/messages/validate-rcs)

**URL shortener**

Create tracked short links (`pncl.to`) with click analytics, configurable expiration, and updatable destinations.

* [`POST /tools/url`](/api-reference/tools/create-url) | [`GET /tools/url/{linkId}`](/api-reference/tools/get-url)

**MCP Server — 89 tools**

The [Pinnacle MCP server](/mcp) now exposes **89 tools** (up from 71 at launch), covering conversations, webhooks, test agents, and more.

> **Note**
>
> Have questions? Reach out to us - [founders@pinnacle.sh](mailto:founders@pinnacle.sh)

## March 16, 2026

## Feedback, Support & SOC 2

New in-app feedback tools and SOC 2 compliance infrastructure to keep your data secure and your voice heard.

### What's new?

**Feedback & support**

A new feedback button is now available directly in the dashboard — ask questions about our docs, submit feature requests, report bugs, or reach out to support without leaving your workflow. Help documentation is also accessible from the dashboard header.

**SOC 2 compliance**

We've implemented automated audit log exports and database backup infrastructure to meet SOC 2 requirements. Your messaging data is backed by enterprise-grade security and compliance controls.

> **Note**
>
> Have questions? Reach out to us - [founders@pinnacle.sh](mailto:founders@pinnacle.sh)

## March 13, 2026

## RCS Test Agents & Carrier Status

Go from zero to your first RCS message in under 2 minutes — no campaign approval required. Create a test agent, whitelist your number, and start sending rich messages right away.

### What's new?

**RCS test agent management API**

Every Pro account gets up to **5 test agents** to experiment with RCS before going through the full campaign approval process. With the new test agent API, you can:

* **Create a test agent** via [`POST /rcs/test/agents`](/api-reference/rcs-agents/test/create-agent) — set up branding, contact info, and colors in a single call
* **Whitelist your number** via [`POST /rcs/test/agents/{agentId}/whitelist`](/api-reference/rcs-agents/test/whitelist-number) — register your device to receive test messages
* **Send your first RCS message** — once whitelisted, you can immediately send rich messages with cards, buttons, and media through your test agent

You can also [update agents](/api-reference/rcs-agents/test/update-agent) and [check whitelist status](/api-reference/rcs-agents/test/get-whitelist-status) programmatically, making it easy to integrate into your development workflow.

**RCS carrier launch status**

You can now see the launch status of your RCS agents across each carrier directly in the dashboard and API. Each agent shows per-carrier status — `NOT_LAUNCHED`, `PENDING`, or `LAUNCHED` — so you know exactly where your agent stands before going live.

> **Note**
>
> Have questions? Reach out to us - [founders@pinnacle.sh](mailto:founders@pinnacle.sh)

## March 8, 2026

## Inbox Embed

The embedded components library now includes an **[Inbox](/ui/components/inbox)**, allowing you to add a full-featured messaging inbox directly into your website.

![Inbox](https://pncl.to/5NVSekVskYnXtQOlMBOOMDGHx5E5cV)

### What's new?

**Inbox embed**

Give your users a complete RCS and SMS messaging experience — conversations, message history, rich media, and real-time updates — all in a single iframe.

* Token-based authentication with scoped permissions
* Filter conversations by brand, sender, or simply show everything for a team
* Customizable colors with `primaryColor`
* Real-time message and conversation updates

**Send RCS Message updates**

[Send RCS Message](/ui/components/send-rcs-message) embed has been updated to use the new v2 token-based flow — message configuration is now securely encoded in the signed token on your backend.

> **Note**
>
> Have questions? Reach out to us - [founders@pinnacle.sh](mailto:founders@pinnacle.sh)

## March 2, 2026

## MCP Server

Introducing the **Pinnacle MCP Server** — connect AI assistants like Claude, Cursor, and Windsurf directly to the Pinnacle API using the [Model Context Protocol](https://modelcontextprotocol.io).

### What's new?

**MCP Server with 71 tools**

Send SMS, MMS, and RCS messages, manage contacts, audiences, brands, and campaigns, purchase phone numbers, configure webhooks, and more — all through natural language in your AI client. No code required.

* **Remote**: Connect instantly at `https://mcp.pinnacle.sh/mcp` with your existing API key
* **Local**: Run via `npx @pinnacle-rcs/mcp` for development and testing
* **npm**: Available as [`@pinnacle-rcs/mcp`](https://www.npmjs.com/package/@pinnacle-rcs/mcp)

Supported clients: **Claude Desktop**, **Claude Code**, **Cursor**, **Windsurf**, and any MCP-compatible AI tool.

[Get started →](/mcp)

> **Note**
>
> Have questions? Reach out to us - [founders@pinnacle.sh](mailto:founders@pinnacle.sh)

## February 19, 2026

## RCS Fallback Messages

Never lose a message again — RCS messages now **automatically fall back to SMS or MMS** when a recipient's device doesn't support RCS.

### What's new?

**RCS fallback messages**

Include a `fallback` object in your RCS send request with a `from` phone number and `text` or `mediaUrls`. If RCS delivery fails, the message is resent as SMS or MMS automatically.

* **SMS fallback** when only `text` is provided (≤3072 characters)
* **MMS fallback** when `mediaUrls` are included or text exceeds 3072 characters
* Original RCS message status updates to `FALLBACK_SENT`
* Webhook delivers `fallbackMessage` details so you can track both legs

[Learn more →](/guides/messages/sending#fallback-messages)

> **Note**
>
> Have questions? Reach out to us - [founders@pinnacle.sh](mailto:founders@pinnacle.sh)

## February 6, 2026

## Send RCS Message Embed

Say hello to embedded components! This is the beginning of our embedded components library, starting with our [send rcs demo](embedded-components/send-rcs), which allows you to add a component like this: ![send component](https://pncl.to/Q0srJ3J74209U2Sp5VfIA3xJj29e5z) where you can demo RCS to your customers.

### What's new?

**Embedded UI components**

Instead of building RCS demos yourself from scratch, you can drag, drop, and customize ours in one simple iframe with your company's product's information and brnading. Want to check out what the component looks like? [Try it out!](https://www.pinnacle.sh/send)

> **Note**
>
> Have questions? Reach out to us - [founders@pinnacle.sh](mailto:founders@pinnacle.sh)

## January 29, 2026

## Ruby SDK

Pinnacle now has a **Ruby SDK** — the third official SDK alongside Python and TypeScript.

### What's new?

**Ruby SDK**

Full coverage of the Pinnacle API in idiomatic Ruby. Send SMS, MMS, and RCS messages, manage contacts and audiences, handle webhooks, and more.

* Available as the [`rcs`](https://rubygems.org/gems/rcs) gem
* Webhook processing with signature verification via the `process` method
* File uploads with `upload_from_path`

Get started with our [Ruby quickstart guides](/quickstart/sms/ruby) for SMS and [RCS](/quickstart/rcs/ruby).

> **Note**
>
> Have questions? Reach out to us - [founders@pinnacle.sh](mailto:founders@pinnacle.sh)

## December 7, 2025

## Blasts & Scheduled Messages

Send messages to entire audiences at once and schedule messages for future delivery.

### What's new?

**Bulk messaging (Blasts)**

Blast an SMS, MMS, or RCS message to every contact in an audience with a single API call. Combine with scheduling to send blasts at a specific time.

* [`POST /messages/blast/sms`](/api-reference/messages/blast-sms) | [`POST /messages/blast/mms`](/api-reference/messages/blast-mms) | [`POST /messages/blast/rcs`](/api-reference/messages/blast-rcs)
* Target an audience by ID
* Optional scheduling with future send times
* List and track blasts with [`POST /messages/blasts/list`](/api-reference/messages/list-blasts)

**Scheduled messages**

Schedule any message — single or blast — for future delivery and cancel before it sends.

* Schedule via the `scheduledTime` field on any send endpoint
* Cancel with [`DELETE /messages/schedule/{id}`](/api-reference/messages/cancel-scheduled-message)
* List upcoming scheduled messages with [`POST /messages/schedules/list`](/api-reference/messages/list-scheduled-messages)

> **Note**
>
> Have questions? Reach out to us - [founders@pinnacle.sh](mailto:founders@pinnacle.sh)

## November 17, 2025

## Audiences & Contacts

Organize your recipients into audiences and manage contacts with full create, read, update, and delete support.

### What's new?

**Audiences**

Group contacts into audiences for targeted messaging. Create an audience, add or remove contacts, and use it as the target for bulk sends.

* Create, update, and delete audiences
* Add and remove contacts in bulk
* Filter audiences by name

[View API reference →](/api-reference/audiences)

**Contacts**

Store recipient details alongside their phone number — name, email, tags, and custom descriptions. Contacts can belong to multiple audiences and are reusable across campaigns.

* Create and update contacts with metadata
* Filter by phone number, name, tags, or archived status
* Look up contacts by ID or phone number

[View API reference →](/api-reference/contacts)

> **Note**
>
> Have questions? Reach out to us - [founders@pinnacle.sh](mailto:founders@pinnacle.sh)