Responses are form data sent to you, the page’s owner. They aren’t a database your page
can read from: a page can send a response, but it can’t read back other viewers’ answers.
You don’t add it, your AI does
Ask the AI that builds your page:“Make this a feedback form that sends the answers to Shareable.” · “Add a Submit button that sends my picks to Shareable instead of downloading a file.”If your AI publishes with the Shareable MCP server, it already knows how. The tool descriptions explain both ways below.
Two ways to send a response
- A plain form (no JavaScript)
- Any JSON (custom UIs)
Add
data-shareable to an ordinary <form>. Shareable handles the submit, sends the
fields, and replaces the form with a thank-you message.Always guard with window.Shareable
Shareable adds window.Shareable to your live link whenever the page contains a
data-shareable form or a Shareable.submit( call. If you close collection, it’s still there,
and submit returns { ok: false } with a message. In your dashboard preview it’s a stand-in
that answers “Responses are only collected on the live link.” In a copy of the page someone
saved and opened from their computer it may be missing, or still there with every submit
failing ({ ok: false }), since only the live link can send. Write the page so it still works
either way:
<form data-shareable> needs no guard. Shareable handles it.
How collection turns on
You don’t flip a switch. When you publish, Shareable looks at the page’s HTML: if it contains adata-shareable form or a Shareable.submit( call, the page starts collecting
responses. Publish a version without either one and collection turns off again. It’s checked
on every publish.
For a multi-page deck, any HTML file in the deck counts. Keep the
Shareable.submit( call in the HTML (an inline <script>). A call that lives only in a
separate .js file isn’t detected.
The dashboard preview doesn’t collect. In the preview,
Shareable.submit resolves with
ok: false and a data-shareable form shows “Responses are only collected on the live
link.” That’s how you can tell the button is wired up. To test it for real, open the
published link.How form fields are sent
For a<form data-shareable>, each input’s name becomes a field, and the input type decides
what’s sent:
- Column names: a field is shown under its
name. Adddata-label="…"to an input to show a friendlier label instead (for examplename="q3" data-label="How likely are you to recommend us?"). - Thank-you message: set
data-shareable-success="…"on the form. The default is “Thanks — your response was sent.” If something goes wrong, the error is shown next to the form instead. - Your own submit handlers still run. Shareable stops the browser’s normal form submission
and sends the response, but it doesn’t block other listeners: an
onsubmithandler oraddEventListener('submit', …)on the form (for analytics or UI) still fires. It can’t cancel Shareable’s submission, though: callingpreventDefault()there doesn’t stop the response from being sent. The browser’s built-in checks (required,type="email",min/max) do run first, and an invalid form isn’t sent. - Need your own validation or flow? Leave
data-shareableoff the form, handlesubmityourself, and callShareable.submit(data)when you’re ready to send (see the JSON tab above).
Reading your responses
Open the page in your dashboard and click Responses. You get:- Summary: one card per field, summarized by its type (below).
- Table: one row per response, with who sent it and when. If responses contain a list of items (like one entry per question or per option), you can split it into one row per item, with the response’s other fields copied onto each row.
- A single response: click a row to see every field, labelled.
- Export: download everything as CSV or JSON.
How values are shown
Shareable works out each field’s type from the values people actually sent:
If a field mixes types, it’s shown as text, so one odd value never breaks the view.
From your agent or code
Your agent can read responses with the MCP toolget_responses, or
call the REST API: GET /api/v1/pages/{id}/responses.
Who sent it
Each viewer has one response per page. If they submit again, their new response replaces the old one.- On verified email and specific people pages, a response is labelled with the viewer’s verified email.
- On every other page (anyone with the link, password), responses are anonymous, one per device (browser), and shown as an alias like Anonymous · 3f9a07c2. The alias is different on each page, so you can’t match one person across pages.
Limits
A resubmission replaces the viewer’s earlier response, so it doesn’t count as a new one. Once
a page reaches its limit, new submissions are refused with a message the page can show.
Submissions are also rate limited to keep a page from being flooded.
Closing collection
To stop taking responses, close collection from the page in your dashboard. Responses you already have are kept, and you can reopen it any time. Collection also stops when the link expires or is unpublished. Responses aren’t limited by the page’s view limit: once a link reaches it, no new viewers can open the page, but submissions to it are still accepted (up to the response limits above) until you close collection.Privacy
- Responses are visible only to you (the page owner), in your dashboard, exports, and the API. Other viewers never see them.
- If your page asks for personal details, tell viewers what you’re collecting and why. Don’t ask for passwords or card numbers.
- Deleting a response, or the page, deletes the stored data. See our privacy policy.
Not yet
- Email alerts for new responses. For now, check the Responses view (or have your agent
call
get_responses). - File uploads in a response.
- Reading responses back from the page, for example to show a viewer what they sent last time.