This is deliberate. The server-to-server
POST /identify refuses email and every other personal identifier, a protocol asserting “wallet 0xABC is alice@example.com” is exactly the wallet-to-identity link the privacy model prevents. Email arrives through a form, from the subscriber, or not at all.Double opt-in
When a form requires confirmation, a submission doesn’t join the list right away. The subscriber first proves the address is theirs by clicking a link in a confirmation email. This is the flow that keeps your list clean and your sending reputation intact.1
Submit
The subscriber submits the form with their email (and optionally a wallet address and custom fields). The submission is stored as pending, no list membership, no tags applied yet.
2
Confirm
A confirmation email is sent from your organization’s verified sender, so it routes on your own sending domain rather than a platform default. It’s a branded email in the same card layout as your other transactional mail, carrying your workspace logo and accent color (falling back to the platform look when you haven’t set them). The email links to a hosted confirmation page.
3
Join
Clicking the link confirms the subscriber. Only now are the form’s tags and list membership applied, the subscriber genuinely joins the bound list at confirmation, not at submission.
4
Trigger
Confirmation fires a
segment_entered trigger for the bound list, so an automation can greet the new subscriber the moment they join. See Triggers and conditions.Because tags and list membership are held until the click, a
segment_entered automation on the bound list fires on genuine, confirmed subscribers only. An abandoned or unconfirmed submission never enters the list and never triggers the flow.Binding to a list
A form is bound to a list (a segment you import into) when you create it. Every confirmed submission joins that list, which is what makes the form useful: the list feeds campaigns and automations like any other segment. A contact captured this way becomes email-reachable, and the server-to-server API will report it as reachable without ever returning the address.Every form lands in a list, automatically
Rolling out. Auto-created form lists are shipping now; if a form you created earlier isn’t showing its list yet, it’s backfilled the next time a subscriber confirms.
- Adds the contact to that list (the auto-created one, or the list you bound explicitly).
- Tags the contact with the list’s backing tag (the form-named tag).
- Fires the
segment_enteredtrigger for the list, so a welcome automation can greet the subscriber the moment they join.
Submitting a form
Forms can be embedded on your site (the browser posts to the public submit endpoint) or fed server-side from your own backend.- Public (browser)
- Server-side (secret key)
{token} is the form’s public token. Body:origin is read from the request headers, not the body. A tripped honeypot returns { "ok": true } silently.{ "ok": true, ... }; when confirmation is required the response indicates a pending confirmation rather than an immediate join.
Reading submissions
Back your own dashboard with the paginated submissions endpoint.integer
default:"1"
1-based page number.
integer
default:"25"
Rows per page, clamped to 1–100.
The email address itself is never returned in the submissions list. Reachability and consent are reported; the address stays protected. To collect an address you can message, that’s what the confirmed list membership is for.

