Überblick
Mit der Forms API (v4) erstellt dein eigener Code Umfragen und Formulare, veröffentlicht sie, sammelt Antworten und liest die Ergebnisse. Es ist dieselbe API, die auch der StrawPoll-Editor nutzt.
- Basis-URL:
https://api.strawpoll.com/v4(auch erreichbar unterhttps://strawpoll.com/api/v4) - Format: JSON rein, JSON raus. Zeitstempel sind ISO-8601-Strings, IDs sind UUIDs.
- Maschinenlesbare Spezifikation: OpenAPI 3.1
Jedes Formular hat eine kurze öffentliche ID, den Slug, wie in https://strawpoll.com/r/AZPg4n1Td3-hnVAj6Q8p. Alle Formular-Endpunkte erwarten den Slug.
Authentifizierung
Erstelle unter Einstellungen → API-Schlüssel einen Schlüssel. Er wird nur einmal angezeigt, bewahre ihn also sicher auf. Schick ihn mit jeder Anfrage mit:
curl https://api.strawpoll.com/v4/me
-H "X-API-Key: sp_your_key"Authorization: Bearer sp_your_key funktioniert ebenfalls. Ein Schlüssel handelt in deinem Namen:
Er kann jedes Formular verwalten, das du im Dashboard verwalten kannst, auch in Workspaces, denen du
angehörst. Löschst du einen Schlüssel in den Einstellungen, ist er sofort ungültig.
Die Endpunkte für Teilnehmende, submit und verify, brauchen aus einem Browser heraus keinen
Schlüssel. Anfragen von Skripten, HTTP-Bibliotheken, Headless-Browsern, Bots und KI-Agenten, die am
User-Agent erkannt werden, lehnen sie ohne Schlüssel mit automated ab.
Fehler
Fehler kommen mit dem passenden HTTP-Status und einem JSON-Body:
{ "error": "This poll is closed.", "code": "closed" }error richtet sich an Menschen, code (falls vorhanden) an deinen Code.
| Status | Bedeutung |
|---|---|
| 400 | Die Anfrage ist ungültig. Fehler bei Stimmen nennen die Frage zusätzlich in step. |
| 401 | Kein API-Schlüssel oder invalid_api_key. |
| 403 | Du kannst dieses Formular nicht verwalten, oder es nimmt diese Antwort nicht an. |
| 404 | Nicht gefunden. |
| 409 | Konflikt, etwa eine doppelte Antwort (duplicate). |
| 429 | rate_limited: Warte so viele Sekunden, wie Retry-After angibt. |
| 503 | busy: Gerade gehen sehr viele Stimmen gleichzeitig ein. Versuch es gleich noch einmal. |
Ratenlimits
120 Anfragen pro Minute und Schlüssel. Ohne Schlüssel zählen Anfragen aus einem Browser pro
angemeldetem Konto oder pro Browser (über sein Abstimmungs-Cookie), mit bis zu 3.000 pro Minute für
alle Browser hinter einer IP-Adresse. Anfragen ohne beides zählen pro IP-Adresse. Jede Antwort
meldet dein Kontingent in X-RateLimit-Limit, X-RateLimit-Remaining und X-RateLimit-Reset (Unix-Sekunden).
Aufbau eines Formulars
Ein Formular ist eine Liste von Sections. Frage-Sections enthalten Fields, und Auswahlfelder enthalten Choices.
Section-type | Was gefragt wird | Fields |
|---|---|---|
multiple_choice | Eine oder mehrere Optionen wählen; properties.layout dropdown zeigt eine Antwort als Auswahlmenü | ein multiple_choice-Field mit Choices |
picture_choice | Bilder wählen | ein multiple_choice-Field, Choices mit mediaId |
ranking | Optionen ordnen, Punkte pro Platz | ein ranking-Field mit Choices |
ranked_choice | Stimmzettel für eine Präferenzwahl, ausgezählt als Stichwahl in mehreren Runden | ein ranked_choice-Field mit Choices |
meeting | Einen Termin finden | ein date-Field pro Tag (Label YYYY-MM-DD), eine Choice pro Uhrzeit (Label 09:00-10:00 oder All day) |
content | Text, oder eine Frage mit properties.variant als yes_no, rating, scale, text, long_text, name, email oder word_cloud | ein Field für die Frage |
contact_info | Name und E-Mail-Adresse | Fields text_small und email |
page_break, welcome_screen, thank_you_screen, end_screen, redirect | Layout und Abschluss | keine |
Einstellungen für das ganze Formular stehen in properties. Die wichtigsten:
| Property | Werte | Standard |
|---|---|---|
resultsVisibility | public, public_after_response, public_after_close, private | public |
responsesVisibility | public zeigt Namen neben den Ergebnissen, private nicht | private |
responseDuplicateCheck | none, session, ip, name, email, code | ip |
responseDuplicateCheckInterval | Minuten, bis dieselbe Person erneut antworten darf, oder null | null |
opensAt, closesAt | ISO-Zeitstempel oder null | null |
responseLimit | Höchstzahl an Antworten oder null | null |
allowComments, commentsVisibility | true/false, public/private | false, private |
editResponsePermissions | admin_own_responses, own_responses, admin, nobody | admin_own_responses |
blockVPNUsers, useCaptchaVerification | true/false | true, false |
Die OpenAPI-Spezifikation listet jede Property von Sections, Fields und Choices auf.
Eine Umfrage erstellen
curl https://api.strawpoll.com/v4/forms
-H "X-API-Key: sp_your_key"
-H "Content-Type: application/json"
-d '{
"title": "Wo gehen wir mittagessen?",
"status": "published",
"properties": { "responseDuplicateCheck": "ip", "resultsVisibility": "public" },
"sections": [{
"type": "multiple_choice",
"fields": [{
"type": "multiple_choice",
"label": "Wo gehen wir mittagessen?",
"properties": { "isMultipleChoice": false },
"choices": [{ "label": "Pizza" }, { "label": "Sushi" }, { "label": "Tacos" }]
}]
}]
}'Die Antwort ist das vollständige Formular mit erzeugten IDs und seinen Links in urls.formUrl und urls.resultsUrl. Ohne "status": "published" beginnt ein Formular als Entwurf, den nur du sehen
kannst.
Eine Terminumfrage bietet Uhrzeiten an bestimmten Tagen an, in der Zeitzone der Section:
{
"title": "Team-Meeting",
"status": "published",
"sections": [
{
"type": "meeting",
"properties": { "timezone": "Europe/Berlin", "duration": 60, "location": "Raum 1" },
"fields": [
{
"type": "date",
"label": "2026-11-02",
"choices": [{ "label": "09:00-10:00" }, { "label": "14:00-15:00" }]
},
{ "type": "date", "label": "2026-11-03", "choices": [{ "label": "09:00-10:00" }] }
]
}
]
}KI-Assistenten (MCP)
StrawPoll betreibt einen Server für das Model Context Protocol. So können KI-Assistenten wie Claude, ChatGPT oder Cursor für dich Umfragen erstellen und Ergebnisse lesen.
- Server-URL:
https://strawpoll.com/mcp(Streamable HTTP) - Anmeldung: OAuth. Füge die URL in deinem Assistenten als eigenen Connector hinzu und melde
dich bei StrawPoll an, wenn er danach fragt. Du entscheidest, ob du den Zugriff erlaubst. Clients
ohne OAuth können stattdessen einen API-Schlüssel als
X-API-KeyoderAuthorization: Bearer sp_your_keysenden.
| Tool | Was es tut |
|---|---|
create_poll | Eine Frage mit Optionen: eine Abstimmung, eine Rangfolge oder eine Terminumfrage. Veröffentlicht. |
create_form | Eine Befragung mit mehreren Fragen, von multiple_choice bis matrix. Ein Entwurf. |
publish_poll | Einen Entwurf veröffentlichen. |
list_polls | Deine Umfragen, neueste zuerst, mit der Zahl der Antworten. |
get_results | Stimmen pro Option, durchschnittliche Plätze, Verfügbarkeit bei Terminen und neue Textantworten. |
set_poll_open | Eine Umfrage schließen oder wieder öffnen. |
Umfragen eines Assistenten gehören dir wie jede andere und nutzen deine Standards für neue Umfragen. Ein Assistent kann bis zu 30 pro Stunde erstellen.
Umfragelinks
Assistenten ohne Tools können dir einen Link geben, der den Editor mit ausgefüllter Umfrage öffnet, bereit zum Prüfen und Veröffentlichen:
https://strawpoll.com/forms/new?title=Wo%20essen%20wir%3F&options=Pizza|Sushi|Tacosoptions wird an | getrennt (oder wiederhole option=). Mit type=ranking oder type=meeting (Optionen wie 2026-11-03 oder 2026-11-03 14:00-15:00, dazu timezone=Europe/Berlin) wählst du
den Typ, mit multiple=1 erlaubst du mehrere Antworten und mit other=1 eine eigene Antwort.
Endpunkte
Konto
GET/me | Die Person, der der Schlüssel gehört, und ihre Workspaces. |
Formulare
GET/forms | Deine Formulare, neueste zuerst. ?workspaceId= listet die Formulare eines Workspaces. |
POST/forms | Ein Formular erstellen. Optional mit workspaceId, sonst in deinem ersten Workspace. |
GET/forms/{slug} | Das veröffentlichte Formular mit Sections, Fields, Choices und Zählständen. |
PUT/forms/{slug} | Das veröffentlichte Formular ersetzen (siehe unten). |
PATCH/forms/{slug} | Nur name, isOpen oder properties ändern. |
DELETE/forms/{slug} | Das Formular und seine Antworten endgültig löschen. |
PUT ersetzt alles: Sections, Fields und Choices, die du weglässt, werden mitsamt ihren Antworten
gelöscht. Schick die IDs der Teile zurück, die bleiben sollen, damit ihre Antworten erhalten
bleiben. Von der Moderation entfernte Formulare (deleted, blocked) antworten mit 403.
Entwürfe und Veröffentlichen
Der Editor speichert Änderungen als Entwurf und veröffentlicht sie in einem Schritt. Bis dahin sehen Teilnehmende das veröffentlichte Formular.
PUT/forms/{slug}/draft | title, themeId, properties und sections als Entwurf speichern. |
DELETE/forms/{slug}/draft | Den Entwurf verwerfen. |
POST/forms/{slug}/publish | Den Entwurf veröffentlichen. Ein Body mit sections wird vorher gespeichert. |
Antworten
GET/forms/{slug}/responses | Antworten, neueste zuerst. limit (bis 100) und offset. |
DELETE/forms/{slug}/responses | Zurücksetzen: alle Antworten löschen und die Zählstände auf null setzen. |
Die Summen pro Option stehen am Formular selbst: responseCount an jedem Field und jeder Choice,
dazu score bei Rangfolgen. Das fields-Objekt einer Antwort enthält ihre Antworten in der Form,
die unter Antwort abschicken beschrieben ist.
Antwort abschicken
POST/forms/{slug}/submit schickt eine Antwort so ab wie die Abstimmungsseite, mit allen Regeln
des Formulars: Zeitplan, Limits, eine Antwort pro Person, Captcha, VPN-Sperre, Codes und
E-Mail-Bestätigung. Browser brauchen keinen Schlüssel, Skripte und andere automatisierte Clients
müssen einen senden.
{
"fields": {
"<ID des Auswahlfelds>": ["<Choice-ID>"],
"<ID des Rangfolgefelds>": [
"<ID der besten Choice>",
"<nächste Choice-ID>",
"<letzte Choice-ID>"
],
"<ID des Terminfelds>": [{ "choiceId": "<Choice-ID>", "status": "yes" }],
"<ID des Ja/Nein-Felds>": "yes",
"<ID des Textfelds>": "Freitext"
},
"name": "Ada",
"comment": "Optional",
"code": "Optionaler Einmalcode"
}| Antwort | Form |
|---|---|
| Auswahl- und Bildfragen | Liste von Choice-IDs, plus ein Text, wenn eigene Antworten erlaubt sind |
| Rangfolge | jede Choice-ID, die beste zuerst |
| Präferenzwahl | die Choice-ID auf jedem Platz, die beste zuerst, null für einen leeren Platz |
| Terminumfrage | pro Datumsfeld eine Liste aus choiceId und status (yes, if_need_be, no); name ist Pflicht |
| Ja/Nein | "yes" oder "no" |
| Bewertung und Skala | die Zahl als String, etwa "4" |
| Text- und Kontaktfelder | ein String |
Eine erfolgreiche Antwort liefert die id der Antwort zurück. Ablehnungen tragen einen code: upcoming, closed, full, unavailable, decided, captcha, vpn, code, verify_email, disposable, automated (alle 403), duplicate (409) und busy (503).
Der Browser der teilnehmenden Person bekommt ein sp_voter-Cookie. Damit ändern PUT/forms/{slug}/submit und die id der Antwort genau diese Antwort, sofern das Formular
Änderungen erlaubt.
Ist ein Formular auf eine Antwort pro E-Mail-Adresse begrenzt, bestätige die Adresse zuerst mit POST/forms/{slug}/verify: Schick action: "send" mit der email, danach action: "verify" mit
dem sechsstelligen code, den die Person bekommen hat.
Codes und Einladungen
GET/forms/{slug}/codes | Einmalcodes. |
POST/forms/{slug}/codes | count Codes mit length Zeichen erzeugen, optional mit style und prefix. |
DELETE/forms/{slug}/codes | Codes nach ids löschen. |
GET/forms/{slug}/invites | E-Mail-Einladungen. |
POST/forms/{slug}/invites | Eine Einladung hinzufügen oder bis zu 1000 als invites. |
PATCH/forms/{slug}/invites/{id} | Eine Einladung ändern. |
DELETE/forms/{slug}/invites/{id} | Eine Einladung löschen. |
DELETE/forms/{slug}/invites | Einladungen nach ids löschen. |
POST/forms/{slug}/invites/import | Alle auf einer Einladungsliste (inviteListId) einladen. |
POST/forms/{slug}/invites/send | Einladungen mit subject und message per E-Mail verschicken. |
Einladungstexte können die Platzhalter name, form und link in doppelten geschweiften Klammern
verwenden.
Medien und Designs
POST/media | Ein Bild hochladen (Multipart file, bis 5 MB). Seine id dient als mediaId einer Choice. |
GET/themes | Deine Designs, die Designs deiner Workspaces und die eingebauten; ?workspaceId= für die eines Workspaces. |
POST/themes | Ein Design mit name und Farb-properties erstellen; mit workspaceId teilst du es mit einem Workspace, den du besitzt oder verwaltest. |
PUT/themes/{id} | Ein Design ändern. workspaceId teilt es mit einem Workspace, null macht es wieder zum eigenen Design der Inhaberin oder des Inhabers. |
DELETE/themes/{id} | Ein Design löschen. Die Designs eines Workspaces können Inhaber und Admins ändern und löschen. |
Umstieg von der Poll API (v3)
Die Poll API v3 funktioniert weiter, mit denselben Pfaden, Schlüsseln und Umfragen. Was wohin gehört, steht im Leitfaden zur v3-Kompatibilität.