Documentation
Redback Feedback docs
Everything the dashboard can do, the API and the MCP server can do too, under the same rules. One API key per organisation, JSON in, JSON out, data in Sydney.
- Quick start
- Authentication
- Forms and questions
- Links and the email footer
- Responses and stats
- Invite links
- REST reference
- MCP server
- Public endpoints
- Limits and errors
Quick start
- Sign in at app.redbackfeedback.com and create an API key under API keys. The secret starts with
rb_live_and is shown once. - List your forms:
curl https://api.redbackfeedback.com/v1/forms -H "Authorization: Bearer rb_live_..."
- Or add the MCP server to Claude Code and ask it to build a form for you:
claude mcp add --transport http redback https://api.redbackfeedback.com/mcp --header "Authorization: Bearer rb_live_..."
Authentication
Send Authorization: Bearer rb_live_... on every request to https://api.redbackfeedback.com. A key belongs to one organisation and can do anything a signed-in user can, except create or revoke keys. Keys are stored hashed; revoke one from the dashboard and it stops working within a minute.
Public endpoints (the survey page's calls and footer clicks) take no credential.
Forms and questions
A form has a kind, a status and a list of questions.
- survey: a page of questions at
https://redbackfeedback.com/f/{formId}. - footer: a row of rate-this-interaction buttons for an email signature or template. The first question is the button row and must be
csat,rating,npsoryesno. A click records the answer; the thank-you page offers the remaining questions and a comment box.
A form starts as draft. Set it active before sharing it. archived closes it and keeps the responses.
| Type | Answer value | What you get back |
|---|---|---|
csat | 1 to 5 | average, CSAT% (the share of 4s and 5s), histogram |
rating | 1 to max (5 or 10) | average, histogram |
nps | 0 to 10 | average, NPS (% of 9 to 10 minus % of 0 to 6), histogram |
yesno | true or false | yes%, histogram |
choice | option index, or an array when multiple | histogram by option |
text | string up to maxLength (default 2000) | count |
Question ids are short lower-case handles like overall ([a-z][a-z0-9_]{0,31}). Stats are keyed on them, so keep them stable once responses exist.
curl -X POST https://api.redbackfeedback.com/v1/forms \
-H "Authorization: Bearer rb_live_..." -H "Content-Type: application/json" -d '{
"kind": "footer", "name": "Support footer", "title": "How was this interaction?", "status": "active",
"questions": [
{ "id": "rating", "type": "csat", "label": "How was this interaction?" },
{ "id": "resolved", "type": "yesno", "label": "Was your issue resolved?" }
],
"theme": { "colour": "#c8102e" }
}'
Optional fields: intro, thankYou, theme.colour (#rrggbb), theme.logoUrl (https), and settings: collectComment and dedupeByRef (footer forms, both default true), redirectUrl (send the respondent there after submitting), showCredit.
Links and the email footer
Survey link
https://redbackfeedback.com/f/{formId}. Add attribution so each response tells you what it was about:
ref: your reference for the order, ticket or person (returned on the response).a: the staff member or team.tag.<key>=<value>: anything else, up to 10.
https://redbackfeedback.com/f/form_abc?ref=ORD-1043&a=Sam&tag.store=newtownFooter buttons
Each button is a link to https://redbackfeedback.com/r/{formId}?s=<score> with the same attribution. s is the answer to the first question: 1 to 5 for csat, 1 to max for rating, 0 to 10 for NPS, 1 (yes) or 0 (no) for yes/no. With dedupeByRef on, one response per ref: the first click wins and later clicks reopen the comment box. Without s the link simply opens the survey page.
Get a ready-made snippet with GET /v1/forms/{id}/embed (or the get_embed tool, or the Share tab in the dashboard). It returns email-safe HTML (a table, inline styles, no images, no script) and a plain-text version, in your choice of emoji, numbers, stars or words.
curl "https://api.redbackfeedback.com/v1/forms/form_abc/embed?style=emoji&ref={{ticket.id}}&agent={{agent.name}}" \
-H "Authorization: Bearer rb_live_..."
Anything that looks like a merge field ({{ticket.id}}, %AGENT%, [Order], *|FNAME|*) is left exactly as typed, so your helpdesk or email tool fills it at send time. Literal values are URL-encoded for you.
Responses and stats
A response carries answers keyed by question id, an optional comment, the ref, agent and tags from the link, a source (link, invite, footer or api) and the browser's user agent and language. Nothing else about the respondent is stored.
GET /v1/forms/{id}/responses?limit=50&since=2026-10-01&until=2026-10-31lists newest first; pass the returnedcursorback for the next page.GET /v1/forms/{id}/statsreturns the count and, per question, average, CSAT%, NPS, yes% and a histogram.GET /v1/forms/{id}/responses.csvdownloads a spreadsheet with one column per question (up to 10,000 rows; narrow withsinceanduntil).POST /v1/forms/{id}/responsesrecords feedback you collected elsewhere (a phone call, a kiosk, a chat).DELETE /v1/responses/{id}removes one permanently and adjusts the stats. Use it for privacy requests.
Invite links
For a known list of people, mint single-use survey links. Each is spent on the first submission and the response carries the recipient's ref.
curl -X POST https://api.redbackfeedback.com/v1/forms/form_abc/invites \
-H "Authorization: Bearer rb_live_..." -H "Content-Type: application/json" \
-d '{ "recipients": [ { "ref": "C-1", "label": "Customer one" }, { "ref": "C-2" } ] }'
Or { "count": 20 } for anonymous links. Up to 500 per call. The platform never sends email: you send the links through your own tools.
REST reference
Base URL https://api.redbackfeedback.com. All timestamps are ISO 8601 in UTC.
| Method | Path | Body or query | Returns |
|---|---|---|---|
| GET | /v1/me | principal and organisation | |
| GET | /v1/org | organisation | |
| PATCH | /v1/org | { name?, settings: { website? } } | organisation |
| GET | /v1/members | { items } | |
| GET | /v1/forms | { items } newest first | |
| POST | /v1/forms | kind, name, title, questions, intro?, thankYou?, theme?, settings?, status? | form (201) |
| GET | /v1/forms/{id} | form | |
| PATCH | /v1/forms/{id} | any create field except kind | form |
| DELETE | /v1/forms/{id} | form, archived | |
| GET | /v1/forms/{id}/responses | limit, cursor, since, until | { items, cursor? } |
| POST | /v1/forms/{id}/responses | { answers, comment?, ref?, agent?, tags? } | response (201) |
| GET | /v1/forms/{id}/responses.csv | since, until | CSV |
| GET | /v1/forms/{id}/stats | stats | |
| GET | /v1/forms/{id}/invites | { items } | |
| POST | /v1/forms/{id}/invites | { count } or { recipients } | { items } (201) |
| GET | /v1/forms/{id}/embed | style, ref, agent, tag.* | { link, footer? } |
| GET | /v1/responses/{id} | response | |
| DELETE | /v1/responses/{id} | { ok } | |
| GET | /v1/keys | signed-in users only | { items } |
| POST | /v1/keys | { name }, signed-in users only | { key, secret } (201) |
| DELETE | /v1/keys/{id} | signed-in users only | key, revoked |
MCP server
Endpoint https://api.redbackfeedback.com/mcp: Streamable HTTP, stateless, JSON responses, your API key as a bearer header. Works with Claude Code, Cursor, VS Code, Windsurf, n8n and any client that takes a URL and a header. Claude.ai and Claude Desktop custom connectors expect OAuth, which is a planned addition.
| Tool | Does |
|---|---|
get_org | The organisation the key belongs to |
list_forms, get_form | Browse forms |
create_form, update_form, set_form_status | Build, change, activate or archive a form |
get_form_stats | Count, CSAT%, NPS, averages, histograms |
list_responses, get_response, delete_response | Read or remove responses |
record_response | Record feedback collected elsewhere |
export_responses_csv | CSV text, one column per question |
create_invite_links | Single-use survey links per recipient |
get_embed | The survey link and the footer snippet |
Try: "Create a footer form called Support footer with a CSAT question and a yes/no 'Was your issue resolved?', activate it, and give me the emoji snippet with {{ticket.id}} as the ref."
Public endpoints
These take no credential. The survey page uses them; so can a front-end of your own.
| Method | Path | Notes |
|---|---|---|
| GET | /v1/public/forms/{id}?t= | The form as a respondent may see it; t is an invite token |
| POST | /v1/public/forms/{id}/responses | { answers, comment?, ref?, agent?, tags?, token? }; required questions must be answered |
| POST | /v1/public/responses/{id}/follow-up | { key, comment?, answers? } within 24 hours, with the key the submit reply gave |
| GET | /r/{formId}?s= | A footer click; answers with the thank-you page |
Limits and errors
- Names 120 characters, titles 200, intro 2,000, thank-you 1,000, up to 40 questions, 2 to 20 options, text answers up to 10,000 characters, comments 4,000, request bodies 256 KB.
- 200 requests a second with a burst of 400.
- Errors are
{ "error": { "message", "details"? } }: 400 lists every validation fault indetails; 401 a missing or revoked credential; 403 something the credential may not do; 404 nothing by that id in your organisation; 409 already done (an invite used twice).
Questions or a missing feature? Use the invite form on the home page to reach us.