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.

What’s new?

Form endpoints

  • POST /forms — create a form without sending it (returns the public https://forms.pinnacle.sh/{form_id} URL).
  • POST /forms/send — 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}, PATCH /forms/{id} — retrieve and partial-update a form.
  • POST /forms/list, POST /forms/{id}/submissions/list — 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.

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.

1{
2 "type": "FORM.SUBMISSION",
3 "sender": "agent_iM9wQcyBBjYn",
4 "conversation": { "id": "convo_…", "from": "agent_…", "to": "+14155551234" },
5 "form": { "id": "form_…", "url": "https://forms.pinnacle.sh/form_…", "name": "Contact request" },
6 "submission": {
7 "id": "fsub_…",
8 "from": "agent_iM9wQcyBBjYn",
9 "to": "+14155551234",
10 "data": { "full_name": "Ada Lovelace", "email": "ada@example.com" },
11 "fields": [
12 { "key": "full_name", "label": "Full name", "type": "text", "value": "Ada Lovelace" },
13 { "key": "email", "label": "Email", "type": "email", "value": "ada@example.com" }
14 ],
15 "ip_address": "203.0.113.45",
16 "user_agent": "Mozilla/5.0 …",
17 "submitted_at": "2026-04-24T00:35:04.406Z"
18 }
19}

See the Receiving Messages and User Events guide for full routing details.