Développeurs / Référence de l’API

Forms API

v4

Créez des sondages et des formulaires, publiez-les, recueillez les réponses et lisez les résultats depuis votre propre code.

URL de base
https://api.strawpoll.com/v4
Spécification
OpenAPI 3

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 sur https://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 :

bash
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 :

json
{ "error": "This poll is closed.", "code": "closed" }

error s’adresse aux humains ; code, lorsqu’il est présent, s’adresse à votre code.

StatutSignification
400La requête est invalide. Les erreurs de vote indiquent aussi la question dans step.
401Aucune clé API, ou invalid_api_key.
403Vous ne pouvez pas gérer ce formulaire, ou il n’accepte pas cette réponse.
404Introuvable.
409Conflit, par exemple une réponse en double (duplicate).
429rate_limited : patientez le nombre de secondes indiqué par Retry-After.
503busy : 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 sectionCe qui est demandéFields
multiple_choiceChoisir une ou plusieurs options ; properties.layout dropdown affiche une réponse sous forme de liste déroulanteun field multiple_choice avec des choices
picture_choiceChoisir des imagesun field multiple_choice, des choices avec mediaId
rankingClasser des options, avec des points par placeun field ranking avec des choices
ranked_choiceBulletin de vote par classement, dépouillé en second tour instantanéun field ranked_choice avec des choices
meetingTrouver une dateun field date par jour (label YYYY-MM-DD), un choice par créneau (label 09:00-10:00 ou All day)
contentDu texte, ou une question avec properties.variant à yes_no, rating, scale, text, long_text, name, email ou word_cloudun field pour la question
contact_infoNom et adresse e-maildes fields text_small et email
page_break, welcome_screen, thank_you_screen, end_screen, redirectMise en page et écrans de finaucun

Les paramètres valables pour tout le formulaire se trouvent dans properties. Les plus utilisés :

PropriétéValeursPar défaut
resultsVisibilitypublic, public_after_response, public_after_close, privatepublic
responsesVisibilitypublic affiche les noms à côté des résultats, private nonprivate
responseDuplicateChecknone, session, ip, name, email, codeip
responseDuplicateCheckIntervalminutes avant qu’une même personne puisse répondre à nouveau, ou nullnull
opensAt, closesAthorodatages ISO, ou nullnull
responseLimitnombre maximal de réponses, ou nullnull
allowComments, commentsVisibilitytrue/false, public/privatefalse, private
editResponsePermissionsadmin_own_responses, own_responses, admin, nobodyadmin_own_responses
blockVPNUsers, useCaptchaVerificationtrue/falsetrue, false

La spécification OpenAPI liste toutes les propriétés des sections, fields et choices.

Créer un sondage

bash
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 :

json
{
	"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-Key ou Authorization: Bearer sp_your_key.
OutilCe qu’il fait
create_pollUne question avec des options : un vote, un classement ou un sondage de réunion. Publié.
create_formUne enquête de plusieurs questions, de multiple_choice à matrix. Un brouillon.
publish_pollPublier un brouillon.
list_pollsVos sondages, du plus récent au plus ancien, avec le nombre de réponses.
get_resultsVotes par option, rangs moyens, disponibilités des sondages de réunion et dernières réponses texte.
set_poll_openClô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é :

undefined
https://strawpoll.com/forms/new?title=On%20mange%20o%C3%B9%20%3F&options=Pizza|Sushi|Tacos

options 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/meLe propriétaire de la clé et ses espaces de travail.

Formulaires

GET/formsVos formulaires, du plus récent au plus ancien. ?workspaceId= liste les formulaires d’un espace de travail.
POST/formsCré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}/draftEnregistrer title, themeId, properties et sections comme brouillon.
DELETE/forms/{slug}/draftAbandonner le brouillon.
POST/forms/{slug}/publishPublier le brouillon. Un corps contenant sections est enregistré au préalable.

Réponses

GET/forms/{slug}/responsesLes réponses, de la plus récente à la plus ancienne. limit (jusqu’à 100) et offset.
DELETE/forms/{slug}/responsesRé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.

json
{
	"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éponseForme
Questions à choix et à imagesliste d’identifiants de choices, plus un texte si les réponses libres sont autorisées
Classementchaque identifiant de choice, le meilleur en premier
Vote par classementl’identifiant du choice à chaque place, le meilleur en premier, null pour une place laissée vide
Sondage de réunionpour 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 échellele nombre sous forme de chaîne, par exemple "4"
Champs texte et coordonnéesune 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}/codesCodes uniques.
POST/forms/{slug}/codesGénérer count codes de length caractères, avec style et prefix facultatifs.
DELETE/forms/{slug}/codesSupprimer des codes par ids.
GET/forms/{slug}/invitesInvitations par e-mail.
POST/forms/{slug}/invitesAjouter 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}/invitesSupprimer des invitations par ids.
POST/forms/{slug}/invites/importInviter toutes les personnes d’une liste d’invités (inviteListId).
POST/forms/{slug}/invites/sendEnvoyer 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/mediaImporter une image (file en multipart, jusqu’à 5 Mo). Son id sert de mediaId à un choice.
GET/themesVos thèmes, ceux de vos espaces de travail et les thèmes intégrés ; ?workspaceId= pour ceux d’un espace de travail.
POST/themesCré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.