Présentation
Avec la Forms API (v4), votre propre code crée des sondages et des formulaires, les publie, recueille les réponses et lit les résultats. C’est la même API que celle utilisée par l’éditeur StrawPoll.
- URL de base :
https://api.strawpoll.com/v4(également disponible surhttps://strawpoll.com/api/v4) - Format : du JSON en entrée comme en sortie. Les horodatages sont des chaînes ISO 8601, les identifiants des UUID.
- Spécification lisible par machine : OpenAPI 3.1
Chaque formulaire possède un court identifiant public, le slug, comme dans https://strawpoll.com/r/AZPg4n1Td3-hnVAj6Q8p. Tous les endpoints de formulaire attendent le slug.
Authentification
Créez une clé dans Paramètres → Clés API. Elle ne s’affiche qu’une seule fois : conservez-la en lieu sûr. Envoyez-la avec chaque requête :
curl https://api.strawpoll.com/v4/me
-H "X-API-Key: sp_your_key"Authorization: Bearer sp_your_key fonctionne aussi. Une clé agit en votre nom : elle peut gérer
tous les formulaires que vous gérez dans le tableau de bord, y compris ceux des espaces de travail
dont vous êtes membre. Supprimez une clé dans les paramètres pour la révoquer immédiatement.
Les endpoints destinés aux participants, submit et verify, ne demandent pas de clé depuis un
navigateur. Les requêtes provenant de scripts, de bibliothèques HTTP, de navigateurs headless, de
bots et d’agents IA, reconnus à leur user agent, sont refusées avec automated si elles n’envoient
pas de clé.
Erreurs
Les erreurs renvoient le statut HTTP correspondant et un corps JSON :
{ "error": "This poll is closed.", "code": "closed" }error s’adresse aux humains ; code, lorsqu’il est présent, s’adresse à votre code.
| Statut | Signification |
|---|---|
| 400 | La requête est invalide. Les erreurs de vote indiquent aussi la question dans step. |
| 401 | Aucune clé API, ou invalid_api_key. |
| 403 | Vous ne pouvez pas gérer ce formulaire, ou il n’accepte pas cette réponse. |
| 404 | Introuvable. |
| 409 | Conflit, par exemple une réponse en double (duplicate). |
| 429 | rate_limited : patientez le nombre de secondes indiqué par Retry-After. |
| 503 | busy : de très nombreux votes arrivent en même temps. Réessayez dans un instant. |
Limites de débit
120 requêtes par minute et par clé. Sans clé, les requêtes d’un navigateur sont comptées par compte
connecté ou par navigateur (via son cookie de vote), jusqu’à 3 000 par minute pour l’ensemble des
navigateurs derrière une même adresse IP ; les requêtes sans l’un ni l’autre sont comptées par
adresse IP. Chaque réponse indique votre quota dans X-RateLimit-Limit, X-RateLimit-Remaining et X-RateLimit-Reset (secondes Unix).
Structure d’un formulaire
Un formulaire est une liste de sections. Les sections de question contiennent des fields, et les champs à choix contiennent des choices.
type de section | Ce qui est demandé | Fields |
|---|---|---|
multiple_choice | Choisir une ou plusieurs options ; properties.layout dropdown affiche une réponse sous forme de liste déroulante | un field multiple_choice avec des choices |
picture_choice | Choisir des images | un field multiple_choice, des choices avec mediaId |
ranking | Classer des options, avec des points par place | un field ranking avec des choices |
ranked_choice | Bulletin de vote par classement, dépouillé en second tour instantané | un field ranked_choice avec des choices |
meeting | Trouver une date | un field date par jour (label YYYY-MM-DD), un choice par créneau (label 09:00-10:00 ou All day) |
content | Du texte, ou une question avec properties.variant à yes_no, rating, scale, text, long_text, name, email ou word_cloud | un field pour la question |
contact_info | Nom et adresse e-mail | des fields text_small et email |
page_break, welcome_screen, thank_you_screen, end_screen, redirect | Mise en page et écrans de fin | aucun |
Les paramètres valables pour tout le formulaire se trouvent dans properties. Les plus utilisés :
| Propriété | Valeurs | Par défaut |
|---|---|---|
resultsVisibility | public, public_after_response, public_after_close, private | public |
responsesVisibility | public affiche les noms à côté des résultats, private non | private |
responseDuplicateCheck | none, session, ip, name, email, code | ip |
responseDuplicateCheckInterval | minutes avant qu’une même personne puisse répondre à nouveau, ou null | null |
opensAt, closesAt | horodatages ISO, ou null | null |
responseLimit | nombre maximal de réponses, ou 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 |
La spécification OpenAPI liste toutes les propriétés des sections, fields et choices.
Créer un sondage
curl https://api.strawpoll.com/v4/forms
-H "X-API-Key: sp_your_key"
-H "Content-Type: application/json"
-d '{
"title": "On déjeune où ?",
"status": "published",
"properties": { "responseDuplicateCheck": "ip", "resultsVisibility": "public" },
"sections": [{
"type": "multiple_choice",
"fields": [{
"type": "multiple_choice",
"label": "On déjeune où ?",
"properties": { "isMultipleChoice": false },
"choices": [{ "label": "Pizza" }, { "label": "Sushi" }, { "label": "Tacos" }]
}]
}]
}'La réponse contient le formulaire complet, avec les identifiants générés et ses liens dans urls.formUrl et urls.resultsUrl. Sans "status": "published", un formulaire démarre comme
brouillon, visible par vous seul.
Un sondage de réunion propose des créneaux sur certains jours, dans le fuseau horaire de la section :
{
"title": "Point d’équipe",
"status": "published",
"sections": [
{
"type": "meeting",
"properties": { "timezone": "Europe/Paris", "duration": 60, "location": "Salle 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" }] }
]
}
]
}Assistants IA (MCP)
StrawPoll fait tourner un serveur Model Context Protocol : des assistants IA comme Claude, ChatGPT ou Cursor peuvent ainsi créer des sondages et lire les résultats pour vous.
- URL du serveur :
https://strawpoll.com/mcp(Streamable HTTP) - Connexion : OAuth. Ajoutez l’URL comme connecteur personnalisé dans votre assistant et
connectez-vous à StrawPoll quand il vous le demande ; c’est vous qui décidez d’autoriser l’accès.
Les clients sans OAuth peuvent envoyer à la place une clé API via
X-API-KeyouAuthorization: Bearer sp_your_key.
| Outil | Ce qu’il fait |
|---|---|
create_poll | Une question avec des options : un vote, un classement ou un sondage de réunion. Publié. |
create_form | Une enquête de plusieurs questions, de multiple_choice à matrix. Un brouillon. |
publish_poll | Publier un brouillon. |
list_polls | Vos sondages, du plus récent au plus ancien, avec le nombre de réponses. |
get_results | Votes par option, rangs moyens, disponibilités des sondages de réunion et dernières réponses texte. |
set_poll_open | Clôturer un sondage ou le rouvrir. |
Les sondages créés par un assistant vous appartiennent comme les autres et reprennent vos réglages par défaut pour les nouveaux sondages. Un assistant peut en créer jusqu’à 30 par heure.
Liens de sondage
Les assistants sans outils peuvent vous donner un lien qui ouvre l’éditeur avec le sondage déjà rempli, prêt à être vérifié et publié :
https://strawpoll.com/forms/new?title=On%20mange%20o%C3%B9%20%3F&options=Pizza|Sushi|Tacosoptions est découpé sur | (ou répétez option=). Ajoutez type=ranking ou type=meeting (options comme 2026-11-03 ou 2026-11-03 14:00-15:00, avec timezone=Europe/Paris), multiple=1 pour autoriser plusieurs réponses et other=1 pour une réponse libre.
Endpoints
Compte
GET/me | Le propriétaire de la clé et ses espaces de travail. |
Formulaires
GET/forms | Vos formulaires, du plus récent au plus ancien. ?workspaceId= liste les formulaires d’un espace de travail. |
POST/forms | Créer un formulaire. workspaceId facultatif ; par défaut, votre premier espace de travail. |
GET/forms/{slug} | Le formulaire publié, avec ses sections, fields, choices et décomptes. |
PUT/forms/{slug} | Remplacer le formulaire publié (voir ci-dessous). |
PATCH/forms/{slug} | Modifier uniquement name, isOpen ou properties. |
DELETE/forms/{slug} | Supprimer définitivement le formulaire et ses réponses. |
PUT remplace tout : les sections, fields et choices que vous omettez sont supprimés, avec leurs
réponses. Renvoyez les identifiants des éléments à conserver pour que leurs réponses restent.
Les formulaires retirés par la modération (deleted, blocked) répondent 403.
Brouillons et publication
L’éditeur enregistre les modifications comme brouillon et les publie en une seule étape. D’ici là, les participants continuent de voir le formulaire publié.
PUT/forms/{slug}/draft | Enregistrer title, themeId, properties et sections comme brouillon. |
DELETE/forms/{slug}/draft | Abandonner le brouillon. |
POST/forms/{slug}/publish | Publier le brouillon. Un corps contenant sections est enregistré au préalable. |
Réponses
GET/forms/{slug}/responses | Les réponses, de la plus récente à la plus ancienne. limit (jusqu’à 100) et offset. |
DELETE/forms/{slug}/responses | Réinitialiser : supprimer toutes les réponses et remettre les décomptes à zéro. |
Les totaux par option figurent sur le formulaire lui-même : responseCount sur chaque field et
chaque choice, et score pour les classements. L’objet fields d’une réponse contient ses
réponses sous la forme décrite dans Envoyer une réponse.
Envoyer une réponse
POST/forms/{slug}/submit envoie une réponse comme le fait la page de vote, en appliquant toutes
les règles du formulaire : calendrier, limites, une réponse par personne, captcha, blocage des VPN,
codes et vérification de l’adresse e-mail. Les navigateurs n’ont pas besoin de clé ; les scripts et
autres clients automatisés doivent en envoyer une.
{
"fields": {
"<id du champ à choix>": ["<id du choice>"],
"<id du champ de classement>": [
"<id du meilleur choice>",
"<id du choice suivant>",
"<id du dernier choice>"
],
"<id du champ de date>": [{ "choiceId": "<id du choice>", "status": "yes" }],
"<id du champ oui/non>": "yes",
"<id du champ texte>": "Texte libre"
},
"name": "Ada",
"comment": "Facultatif",
"code": "Code unique facultatif"
}| Réponse | Forme |
|---|---|
| Questions à choix et à images | liste d’identifiants de choices, plus un texte si les réponses libres sont autorisées |
| Classement | chaque identifiant de choice, le meilleur en premier |
| Vote par classement | l’identifiant du choice à chaque place, le meilleur en premier, null pour une place laissée vide |
| Sondage de réunion | pour chaque field de date, une liste de choiceId et status (yes, if_need_be, no) ; name est obligatoire |
| Oui/non | "yes" ou "no" |
| Note et échelle | le nombre sous forme de chaîne, par exemple "4" |
| Champs texte et coordonnées | une chaîne |
Un envoi réussi renvoie l’id de la réponse. Les refus portent un code : upcoming, closed, full, unavailable, decided, captcha, vpn, code, verify_email, disposable, automated (tous en 403), duplicate (409) et busy (503).
Le navigateur du participant reçoit un cookie sp_voter. Avec lui, PUT/forms/{slug}/submit et
l’id de la réponse modifient cette réponse, si le formulaire autorise les participants à la
modifier.
Pour les formulaires limités à une réponse par adresse e-mail, vérifiez d’abord l’adresse avec POST/forms/{slug}/verify : envoyez action: "send" avec l’email, puis action: "verify" avec
le code à 6 chiffres reçu par le participant.
Codes et invitations
GET/forms/{slug}/codes | Codes uniques. |
POST/forms/{slug}/codes | Générer count codes de length caractères, avec style et prefix facultatifs. |
DELETE/forms/{slug}/codes | Supprimer des codes par ids. |
GET/forms/{slug}/invites | Invitations par e-mail. |
POST/forms/{slug}/invites | Ajouter une invitation, ou jusqu’à 1000 via invites. |
PATCH/forms/{slug}/invites/{id} | Modifier une invitation. |
DELETE/forms/{slug}/invites/{id} | Supprimer une invitation. |
DELETE/forms/{slug}/invites | Supprimer des invitations par ids. |
POST/forms/{slug}/invites/import | Inviter toutes les personnes d’une liste d’invités (inviteListId). |
POST/forms/{slug}/invites/send | Envoyer les invitations par e-mail avec subject et message. |
Les messages d’invitation peuvent utiliser les variables name, form et link entre doubles
accolades.
Médias et thèmes
POST/media | Importer une image (file en multipart, jusqu’à 5 Mo). Son id sert de mediaId à un choice. |
GET/themes | Vos thèmes, ceux de vos espaces de travail et les thèmes intégrés ; ?workspaceId= pour ceux d’un espace de travail. |
POST/themes | Créer un thème avec un name et des properties de couleur ; ajoutez workspaceId pour le partager avec un espace de travail que vous possédez ou gérez. |
PUT/themes/{id} | Modifier un thème. workspaceId le partage avec un espace de travail, null le rend de nouveau personnel à son propriétaire. |
DELETE/themes/{id} | Supprimer un thème. Les thèmes d’un espace de travail peuvent être modifiés et supprimés par son propriétaire et ses admins. |
Migrer depuis la Poll API (v3)
La Poll API v3 continue de fonctionner, avec les mêmes chemins, clés et sondages. Le guide de compatibilité v3 indique ce qui correspond à quoi.