Feedback widget
A feedback form collects an anonymous rating - and an optional comment - from any visitor. It has no email or message field and needs no verification. The easiest way to collect votes is the hosted widget: a self-contained script with no dependencies.
Embed the widget
<div data-sendform-feedback="https://sendform.net/!a8Kz3mXq12"
data-mode="yesno"></div>
<script src="https://sendform.net/widget.js" async></script>
The script styles itself under a namespaced .sf-fb class so it will not clash with your page, and it can be loaded once for any number of widgets.
| Attribute | Values | Meaning |
|---|---|---|
data-sendform-feedback |
endpoint URL | Required. The feedback form's public submit URL. |
data-mode |
yesno (default), stars |
Thumbs up/down, or a 1-5 star row. |
data-question |
any text | Overrides the default prompt ("Was this page helpful?" / "How would you rate this page?"). |
The widget captures the current page URL automatically, fetches an antibot token before submitting, and remembers a vote per endpoint and page so a reload cannot re-submit.
Posting a vote yourself
The widget is optional - the endpoint takes a plain POST:
curl -d "rating=1" -d "comment=Very clear" \
-d "page=https://example.com/docs" \
https://sendform.net/!a8Kz3mXq12
| Field | Required | Notes |
|---|---|---|
rating |
yes | yesno forms take 1/0 (also yes/no, true/false, up/down); stars forms take 1-5. |
comment |
no | Up to 2000 characters. |
page |
no | Up to 500 characters. Used to group votes and to rate-limit. |
Feedback endpoints always answer with JSON, whatever the Accept header says. An invalid rating comes back as {"error": "invalid_rating"}.
Rate limiting and quotas
One vote per form, page and IP address per 12 hours. A repeat inside that window is answered {"success": true, "duplicate": true} and is not stored, so the widget still shows its thank-you.
Votes count against the account's monthly submission quota exactly like contact-form submissions. Feedback forms are a paid feature: if the owner's plan stops including them, votes are answered with {"success": true, "not_collected": true} and quietly discarded rather than shown as broken to visitors.
Notifications and webhooks
Votes reach the same delivery pipeline as submissions. By default only votes that carry a comment are pushed to the form's webhooks, so a busy page does not flood a chat channel; turn that off on the form to send every vote. The rating label, comment and page ride along as labelled fields - see Webhooks.