Développeurs
Méthodes API
Référence complète de toutes les méthodes exposées par l’API REST de formbase. Chaque méthode présente ses paramètres, des exemples de requêtes et la structure des réponses.
Un seul endpoint, de nombreuses méthodes
Chaque méthode est POST https://api.formbase.so/api/v1 avec un corps JSON
{"method": "...", "params": {...}} et un en-tête Authorization: Bearer fb_…. Consultez la
vue d’ensemble de l’API pour l’authentification et la gestion des erreurs, et
les tokens API pour le token lui-même.
Conventions
paramspeut être omis ; il vaut alors{}par défaut. Une méthode inconnue renvoie404 METHOD_NOT_FOUND.Un token est lié à un seul espace de travail. Nommer un autre espace de travail, ou un formulaire qui s’y trouve, renvoie
403 FORBIDDEN, même si vous appartenez aux deux.Pagination. Les méthodes de liste renvoient
{ items, nextCursor, hasMore }; la plupart renvoient aussicanPaginate, qui vautfalsequandhasMoreest vrai mais qu’aucun curseur ne peut reprendre (recherche approximative). RenvoyeznextCursorcommecursor.limitva de 1 à 100, 20 par défaut — saufrequests.list, dont le défaut est 25.Limites de débit. 120 appels par minute et par token, en commun avec le serveur MCP ;
requests.createa sa propre limite de 60 par minute. L’échec d’authentification est limité séparément, 30 par 15 minutes et par IP, au-delà desquelles les tokens invalides reçoiventRATE_LIMITEDau lieu deUNAUTHORIZED.Taille du corps. 1 Mio. Les corps plus volumineux sont rejetés avec
VALIDATION_ERROR.Versionnage. Le chemin porte la version. Les changements cassants sont livrés sous
/api/v2; les nouvelles méthodes et les nouveaux champs de réponse ne le sont pas.
Formulaires
forms.list
Lister les formulaires d’un espace de travail. Prend en charge la pagination par curseur et une recherche par nom approximative.
workspaceIdstringrequired
workspaceIdstringrequiredIdentifiant de l’espace de travail.
folderIdstring | nulloptional
folderIdstring | nulloptionalFiltrer par dossier. Passez null pour les formulaires à la racine uniquement. Omettez pour tout lister.
querystringoptional
querystringoptionalRecherche par nom approximative. Les résultats sont limités à limit ; non paginés par curseur.
limitnumberoptionaldefault: 20
limitnumberoptionaldefault: 20Taille de la page (1–100).
cursorstringoptional
cursorstringoptionalCurseur de pagination issu d’une réponse précédente.
curl -X POST https://api.formbase.so/api/v1 \
-H "Authorization: Bearer fb_..." \
-H "Content-Type: application/json" \
-d '{
"method": "forms.list",
"params": { "workspaceId": "ws_abc123" }
}'{
"ok": true,
"data": {
"items": [
{
"id": "frm_abc123",
"name": "Contact Form",
"folderId": null,
"workspaceId": "ws_abc123",
"isPublished": true,
"publishedAt": 1714041851000,
"unpublishedAt": null,
"createdAt": 1714041800000,
"lastEditedAt": 1714042000000,
"emoji": null
}
],
"nextCursor": null,
"hasMore": false,
"canPaginate": false
}
}forms.get
Obtenir tous les détails d’un formulaire, notamment les questions, la couverture, le logo et une URL de prévisualisation.
formIdstringrequired
formIdstringrequiredIdentifiant du formulaire.
curl -X POST https://api.formbase.so/api/v1 \
-H "Authorization: Bearer fb_..." \
-H "Content-Type: application/json" \
-d '{
"method": "forms.get",
"params": { "formId": "frm_abc123" }
}'{
"ok": true,
"data": {
"id": "frm_abc123",
"name": "Event Feedback",
"folderId": null,
"workspaceId": "ws_abc123",
"isPublished": true,
"publishedAt": 1714041851000,
"unpublishedAt": null,
"createdAt": 1714041800000,
"lastEditedAt": 1714042000000,
"emoji": null,
"questions": [
{
"id": "q_1",
"type": "email-input",
"inputType": "email",
"title": "Your email",
"metadata": null
},
{
"id": "q_2",
"type": "rating-input",
"inputType": "rating",
"title": "Overall experience",
"metadata": { "kind": "rating", "maxStars": 5 }
}
],
"hasContent": true,
"cover": null,
"logo": null,
"isDeleted": false,
"trashedAt": null,
"previewUrl": "https://formbase.so/preview/abc..."
}
}forms.create
Créer un nouveau formulaire vide. Retourne le formulaire et une URL de prévisualisation.
namestringrequired
namestringrequiredNom du formulaire (1–255 caractères).
workspaceIdstringrequired
workspaceIdstringrequiredIdentifiant de l’espace de travail.
folderIdstringoptional
folderIdstringoptionalPlacer le formulaire dans un dossier. Omettez pour créer à la racine de l’espace de travail.
curl -X POST https://api.formbase.so/api/v1 \
-H "Authorization: Bearer fb_..." \
-H "Content-Type: application/json" \
-d '{
"method": "forms.create",
"params": {
"name": "Contact",
"workspaceId": "ws_abc123"
}
}'const res = await fetch('https://api.formbase.so/api/v1', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.FORMBASE_TOKEN}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
method: 'forms.create',
params: { name: 'Contact', workspaceId: 'ws_abc123' },
}),
})
const { ok, data } = await res.json()import os, requests
res = requests.post(
"https://api.formbase.so/api/v1",
headers={"Authorization": f"Bearer {os.environ['FORMBASE_TOKEN']}"},
json={
"method": "forms.create",
"params": {
"name": "Contact",
"workspaceId": "ws_abc123",
},
},
)
data = res.json(){
"ok": true,
"data": {
"id": "frm_new123",
"name": "Contact",
"workspaceId": "ws_abc123",
"folderId": null,
"isPublished": false,
"createdAt": 1714041851000,
"previewUrl": "https://formbase.so/preview/abc..."
}
}forms.update
Mettre à jour les métadonnées d’un formulaire : nom, dossier, emoji, couverture ou logo. Ne modifie pas le contenu du formulaire (utilisez les outils d’édition pour cela).
formIdstringrequired
formIdstringrequiredIdentifiant du formulaire.
namestringoptional
namestringoptionalNouveau nom du formulaire (1–255 caractères).
folderIdstring | nulloptional
folderIdstring | nulloptionalDéplacer le formulaire dans un dossier. Passez null pour le déplacer à la racine de l’espace de travail.
emojistring | nulloptional
emojistring | nulloptionalEmoji du formulaire (10 caractères max). Passez null pour effacer.
coverobjectoptional
coverobjectoptionalCouverture. {"type": "color", "color": "#ffffff"},
{"type": "image", "url": "https://...", "offsetY": 50} (offsetY 0–100, 50 par défaut), ou
{"type": "none"} pour supprimer. Les URLs d’image doivent être en http(s) ou une URI
data:image.
logoobjectoptional
logoobjectoptionalLogo. {"type": "icon", "name": "HeartIcon"}, {"type": "image", "url": "https://..."}, ou
{"type": "none"} pour supprimer. Les noms d’icônes sont fixes : QuestionMarkIcon,
ListBulletsIcon, ChartBarIcon, ClockCountdownIcon, HeartIcon,
LightbulbIcon, CheckCircleIcon, MagnifyingGlassIcon, TrendUpIcon,
EnvelopeIcon, PhoneIcon, CalendarIcon, LinkIcon, UsersIcon.
Passez au moins un des cinq champs modifiables. Cela ne change pas le contenu du formulaire — utilisez les outils MCP d’édition pour cela.
curl -X POST https://api.formbase.so/api/v1 \
-H "Authorization: Bearer fb_..." \
-H "Content-Type: application/json" \
-d '{
"method": "forms.update",
"params": {
"formId": "frm_abc123",
"name": "Updated Name",
"emoji": "📋"
}
}'{
"ok": true,
"data": {
"id": "frm_abc123",
"name": "Updated Name",
"folderId": null,
"emoji": "📋"
}
}cover et logo ne reviennent que si vous les avez envoyés. Un payload identique à l’état actuel sur chaque champ
scalaire ajoute noChange: true.
forms.publish
Publier un formulaire pour qu’il puisse accepter des réponses, et figer ses clés de champ dans un nouveau snapshot.
Idempotent : un formulaire déjà publié renvoie un succès avec alreadyPublished: true, et un formulaire dépublié est republié depuis son
dernier snapshot.
formIdstringrequired
formIdstringrequiredID du formulaire.
Un formulaire avec des blocs de contenu mais sans question se publie avec un avertissement. Un formulaire sans aucun contenu ne peut pas être publié. Publier ne crée pas d’URL publique — appelez shareLinks.create pour cela.
forms.unpublish
Mettre un formulaire hors ligne. Les répondants ne peuvent plus l’ouvrir. Idempotent — un formulaire non publié renvoie
alreadyUnpublished: true. Réversible avec forms.publish.
formIdstringrequired
formIdstringrequiredID du formulaire.
forms.delete
Déplacer un formulaire vers la corbeille. Ses liens de partage actifs sont révoqués, donc leurs URLs publiques cessent de fonctionner.
formIdstringrequired
formIdstringrequiredID du formulaire.
La restauration ne ramène pas les liens
forms.restore renvoie le formulaire, mais les liens de partage qu’il a révoqués restent révoqués. Créez-en de nouveaux avec
shareLinks.create. Un formulaire déjà dans la corbeille renvoie alreadyTrashed: true et garde sa date de mise
à la corbeille d’origine.
forms.restore
Restaurer un formulaire depuis la corbeille.
formIdstringrequired
formIdstringrequiredID du formulaire.
folderIdstring | nulloptional
folderIdstring | nulloptionalOù le restaurer. Omettez pour son dossier d’origine, null pour la racine de l’espace de travail, ou un ID de dossier.
Un formulaire qui n’est pas dans la corbeille renvoie alreadyRestored: true.
formSettings.get
Lire les paramètres de comportement d’un formulaire.
formIdstringrequired
formIdstringrequiredID du formulaire.
Renvoie { settings, isDefault, availableEmailDomains, defaultFromAddress, payment }. isDefault vaut vrai
quand le formulaire n’a pas encore de ligne de paramètres enregistrée et que vous voyez les valeurs par défaut.
availableEmailDomains contient les ids de domaines vérifiés à passer comme emailDomainId, et
payment indique si Stripe est connecté (le connecter est une étape du tableau de bord).
formSettings.update
Mettre à jour les paramètres de comportement d’un formulaire. Une mise à jour partielle : seuls les champs envoyés sont écrits.
formIdstringrequired
formIdstringrequiredID du formulaire.
Accessgroupoptional
Accessgroupoptionallanguage (BCP-47, “en” par défaut), requireAuthentication, showBranding,
captchaEnabled, passwordEnabled, password (4 caractères ou plus ; une chaîne implique
passwordEnabled: true, null retire la protection).
Owner notificationsgroupoptional
Owner notificationsgroupoptionalnotifyOnSubmission, notificationEmails (tableau), selfNotificationSubject,
selfNotificationEmailBody, pdfGenerationEnabled, showViewSubmissionButton. Les e-mails du
propriétaire ne sont pas traduisibles — écrivez-les dans la langue voulue.
Respondent notificationsgroupoptional
Respondent notificationsgroupoptionalrespondentNotificationEnabled, respondentNotificationTo (l’id de champ d’une question e-mail, ou
null), respondentNotificationSubject, respondentNotificationBody,
respondentNotificationPdfEnabled.
Remindersgroupoptional
RemindersgroupoptionalrespondentReminderEnabled, respondentReminderTo, respondentReminderSubject,
respondentReminderBody, respondentReminderRequiredFieldIds, et reminderSteps — des décalages
d’inactivité comme [“1d”,“3d”,“1w”], 5 au maximum, triés et dédupliqués à l’enregistrement, [] pour aucun. Le
planning s’applique aussi bien aux réponses abandonnées sur lien public qu’aux demandes. Pro.
After submitgroupoptional
After submitgroupoptionalredirectUrl (http(s) ; null ou “” efface), redirectQueryParams (
[{ paramName, fieldId }]), allowAnotherResponse (mutuellement exclusif avec une redirection),
maxSubmissionsPerRespondent (0 = illimité, max 1000), editAfterSubmit, maxEdits (max 3 ; 0
signifie illimité avec Pro et Business, 3 avec Free).
Retentiongroupoptional
RetentiongroupoptionaldraftRetentionDays et submissionRetentionDays (0–36500, null revient à la valeur par défaut). La
rétention des soumissions est Business, et la définir efface toute date de suppression fixe configurée dans l’éditeur.
emailDomainIdstring | nulloptional
emailDomainIdstring | nulloptionalUn id de domaine e-mail vérifié depuis formSettings.get, pour une adresse d’expéditeur personnalisée. null
réinitialise à l’expéditeur par défaut.
Les objets et corps sont du texte brut et acceptent les paramètres {{variable}} ; les sauts de ligne deviennent des
paragraphes. Personnaliser un objet ou un corps destiné au répondant le rend traduisible, donc ses clés apparaissent immédiatement dans
translations.listEntries.
Soumissions
submissions.list
Lister les soumissions d’un formulaire, page la plus récente en premier, avec pagination par curseur.
formIdstringrequired
formIdstringrequiredID du formulaire.
includeDraftsbooleanoptionaldefault: true
includeDraftsbooleanoptionaldefault: trueInclure les réponses commencées mais jamais soumises. Les brouillons sont une fonctionnalité Pro : sur Free, seules les soumissions terminées sont listées.
translationLanguagestringoptional
translationLanguagestringoptionalJoindre les traductions IA stockées des réponses sous items[].translation.display, avec les mêmes clés que
display. items[].answers et items[].display restent toujours l’original.
limitnumberoptionaldefault: 20
limitnumberoptionaldefault: 20Taille de page (1–100).
cursorstringoptional
cursorstringoptionalCurseur de pagination issu d’une réponse précédente.
{
"ok": true,
"data": {
"formId": "frm_abc123",
"formName": "Event Feedback",
"items": [
{
"id": "sub_xyz789",
"submittedAt": "2026-05-18 18:02:28",
"isCompleted": true,
"createdAt": "2026-05-18 18:02:19",
"answers": {
"email": "user@example.com",
"plan": "pro",
"contacts": [{ "name": "Ada" }, { "name": "Grace" }]
},
"display": {
"email": "user@example.com",
"plan": "Pro",
"contacts": "Ada, Grace"
}
}
],
"nextCursor": null,
"hasMore": false,
"canPaginate": false
}
}Les mêmes réponses que les webhooks et les callbacks
Chaque élément porte answers indexé par clé de champ et display avec les
mêmes clés, en texte lisible — la forme que portent un payload de webhook, un
callback de demande et requests.get. Une réponse à choix est sa clé d’option, un
groupe répétable un tableau d’instances. Appelez fields.list pour le titre et les libellés d’option de chaque clé. Cette
méthode ne renvoie aucun total.
submissions.pdf
Obtenir un lien vers le PDF d’une soumission. Conçu pour le connecteur Zapier : renvoie un résultat seulement quand le formulaire a une intégration Zapier active configurée pour inclure le PDF, et que le PDF a été conservé.
formIdstringrequired
formIdstringrequiredID du formulaire.
submissionIdstringrequired
submissionIdstringrequiredID de la soumission. Doit appartenir à ce formulaire et être complète.
{
"ok": true,
"data": {
"url": "https://api.formbase.so/api/storage/...",
"filename": "formbase-submission-sub_xyz789.pdf",
"contentType": "application/pdf",
"byteLength": 148213
}
}submissions.sample
Construire un payload de soumission d’exemple pour un formulaire, sans aucune donnée réelle. C’est exactement la forme que porte une
livraison de soumission sur lien public, donc les connecteurs s’en servent pour découvrir les champs ; une soumission provenant d’une
demande atteint un abonnement sous forme de request.completed à la place, échantillonnée par
requests.sample. data.form.snapshotId est la version publiée actuelle du formulaire, le même id
que portent les événements en direct, ou null tant que le formulaire n’est pas publié.
formIdstringrequired
formIdstringrequiredIdentifiant du formulaire.
{
"ok": true,
"data": {
"id": "evt_example000000000000",
"type": "submission.completed",
"createdAt": "2026-05-18T19:00:00.000Z",
"apiVersion": "2026-09-24",
"test": true,
"data": {
"form": { "id": "frm_abc123", "name": "Event Feedback", "snapshotId": "js7abc123" },
"submission": {
"id": "sub_example000000000000",
"respondentEmail": "respondent@example.com",
"submittedAt": "2026-05-18T19:00:00.000Z",
"updatedAt": null,
"editCount": 0,
"pdfUrl": null,
"language": "en"
},
"answers": { "your_email": "john@example.com" },
"display": { "your_email": "john@example.com" }
}
}
}La sémantique des champs et du payload est documentée une seule fois, dans la référence webhooks.
Liens de partage
Champs
fields.list
Liste chaque champ de la version actuellement publiée d’un formulaire, avec la clé pour l’adresser. Appelez ceci avant requests.create au
lieu de coder les clés en dur. Voir Clés de champ.
formIdstringrequired
formIdstringrequiredID du formulaire. Un formulaire qui n’a jamais été publié n’a pas encore de clés de champ et répond avec published: false
sans éléments.
curl -X POST https://api.formbase.so/api/v1 \
-H "Authorization: Bearer fb_..." \
-H "Content-Type: application/json" \
-d '{
"method": "fields.list",
"params": { "formId": "j57..." }
}'{
"ok": true,
"data": {
"published": true,
"items": [
{ "key": "company_name", "type": "text", "title": "Company", "required": true, "prefillable": true },
{
"key": "company_size", "type": "select", "title": "Company size", "required": false, "prefillable": true,
"options": [
{ "key": "1_50", "label": "1–50" },
{ "key": "51_200", "label": "51–200" }
]
},
{
"key": "satisfaction", "type": "matrix", "title": "How did we do?", "required": false, "prefillable": true,
"rows": [{ "key": "delivery_speed", "label": "Delivery speed" }],
"columns": [{ "key": "very_good", "label": "Very good" }, { "key": "poor", "label": "Poor" }]
},
{ "key": "case_id", "type": "hidden", "title": "Case", "required": false, "prefillable": false, "context": true },
{ "key": "total", "type": "number", "title": "Total", "required": false, "prefillable": false, "calculated": true }
],
"hasMore": false
}
}Lire les indicateurs
context: true signale un champ caché — sa valeur va dans context, jamais dans prefill.
prefillable: false signale un champ pour lequel personne ne peut fournir de valeur (fichier, signature, paiement, prise de
rendez-vous, documents). Pour une question à choix, envoyez la clé de l’option, pas son libellé ; une matrice liste ses
rows et columns de la même façon et prend { "row_key": "column_key" }.
calculated: true signale un champ calculé : le formulaire calcule sa valeur, vous la relisez dans answers, et
rien ne peut l’envoyer.
Un groupe répétable est type: “group” avec repeating: true et un tableau members. Un bloc Documents
est type: “documents” et porte documents: [{ name }], les fichiers déjà rédigés que chaque répondant voit
déjà.
Demandes
Une demande assigne un formulaire publié à une personne et vous rappelle quand elle se termine. Le guide conceptuel se trouve dans Créer une demande ; ceci est la liste des paramètres.
requests.create
Crée une demande. Consomme une unité de l’allocation mensuelle de l’espace de travail, que le destinataire réponde ou non.
formIdstringrequired
formIdstringrequiredLe formulaire publié à assigner.
recipientobjectoptional
recipientobjectoptional{ email?, name? }. Un e-mail est requis quand delivery vaut “email” ; sinon il identifie
simplement la personne sur la page Demandes et sur ses réponses.
prefillobjectoptional
prefillobjectoptionalRéponses initiales par clé de champ. Le destinataire les voit et peut les modifier.
readonlystring[]optional
readonlystring[]optionalClés préremplies que le destinataire ne peut pas modifier. Chaque clé ici doit aussi apparaître dans prefill, et un champ
verrouillé obligatoire doit être prérempli avec une valeur non vide.
contextobjectoptional
contextobjectoptionalValeurs pour les champs cachés du formulaire, par clé de champ. Fiables, immuables, et renvoyées dans le callback. Une clé inconnue est
rejetée avec UNKNOWN_FIELD_KEY.
metadataobjectoptional
metadataobjectoptionalVotre propre suivi. N’atteint jamais le formulaire ; revient dans les callbacks et les lectures.
languagestringoptional
languagestringoptionalL’une des langues publiées du formulaire. Par défaut, celle du formulaire.
deliverystringoptionaldefault: none
deliverystringoptionaldefault: none“email” pour que formbase envoie l’invitation (nécessite un e-mail de destinataire, et Pro ou Business ou l’une des 10
invitations gratuites d’un compte Free), ou “none” pour livrer le lien vous-même.
remindersstring[]optional
remindersstring[]optionalRemplace le planning de rappel du formulaire pour cette demande. Un tableau vide désactive les rappels.
expiresAtnumberoptional
expiresAtnumberoptionalMillisecondes epoch. Par défaut 30 jours, 365 jours au maximum.
callbackUrlstringoptional
callbackUrlstringoptionalOù formbase envoie le callback en POST quand la demande se termine. HTTPS uniquement, et l’hôte doit résoudre vers une adresse publique.
externalIdstringoptional
externalIdstringoptionalVotre propre id pour cette demande. Filtrable dans requests.list.
idempotencyKeystringoptional
idempotencyKeystringoptionalLe répéter avec le même corps renvoie la demande d’origine avec deduplicated: true. Un corps différent est rejeté. Les clés
vivent 30 jours.
domainIdstringoptional
domainIdstringoptionalGénère le lien sur l’un de vos domaines personnalisés. API REST uniquement.
documentsobject[]optional
documentsobject[]optional[{ documentId, field?, name? }] — fichiers remis à ce seul destinataire, téléversés au préalable avec
documents.create.
testbooleanoptionaldefault: false
testbooleanoptionaldefault: falseUn essai à blanc : rien n’est envoyé par e-mail, le callback porte “test”: true, et la soumission ne compte nulle part. Le
lien se ferme dans les 24 heures, et sur Free un workspace peut créer 10 demandes de test par jour.
curl -X POST https://api.formbase.so/api/v1 \
-H "Authorization: Bearer fb_..." \
-H "Content-Type: application/json" \
-d '{
"method": "requests.create",
"params": {
"formId": "j57...",
"recipient": { "email": "ada@acme.com", "name": "Ada" },
"prefill": { "company_name": "Acme" },
"readonly": ["company_name"],
"context": { "case_id": "CASE-9" },
"delivery": "email",
"externalId": "run-42",
"callbackUrl": "https://automation.example/webhook/resume-abc",
"idempotencyKey": "run-42"
}
}'{
"ok": true,
"data": {
"id": "kd7...",
"status": "pending",
"url": "https://form.formbase.so/r/rq_...",
"deliveryStatus": "queued",
"expiresAt": 1794787200000,
"createdAt": 1789379200000,
"externalId": "run-42",
"deduplicated": false
}
}Conservez l’url
url porte le token à usage unique. requests.get peut généralement le reconstruire, mais il revient
null pour une demande créée avant que le déploiement n’ait de clé de token de demande. Si vous livrez le lien vous-même,
stockez-le à la création.
deliveryStatus vaut not_requested jusqu’à ce qu’une invitation soit mise en file, puis queued →
sent ou failed, et bounced une fois que le fournisseur d’e-mail signale un rejet définitif ou une
plainte.
requests.get
Récupère une demande en entier : statut, résultat, ce qui a été prérempli, sa chronologie, et — une fois terminée — answers et display classées par clé de champ, les deux mêmes maps que porte le callback.
requestIdstringrequired
requestIdstringrequiredID de la demande.
{
"ok": true,
"data": {
"id": "kd7...",
"formId": "j57...",
"status": "completed",
"outcome": "approve",
"isTest": false,
"recipient": { "email": "ada@acme.com", "name": "Ada" },
"language": "en",
"externalId": "run-42",
"metadata": null,
"context": { "case_id": "CASE-9" },
"prefill": { "company_name": "Acme" },
"readonlyKeys": ["company_name"],
"delivery": "email",
"deliveryStatus": "sent",
"hasCallback": true,
"callbackFailedAt": null,
"submissionId": "kp2...",
"url": "https://form.formbase.so/r/rq_...",
"answers": { "company_name": "Acme", "decision": "approve" },
"display": { "company_name": "Acme", "decision": "Approve" },
"timeline": [
{ "id": "kd7...:created", "type": "created", "at": 1789379200000 },
{ "id": "kd7...:completed", "type": "completed", "at": 1789465600000 }
],
"expiresAt": 1794787200000,
"completedAt": 1789465600000
}
}outcome vs status
status indique si la demande s’est terminée ; outcome indique ce que le destinataire a décidé —
approve, decline, changes, ou null pour tout sauf une demande terminée dont le
destinataire a choisi l’une des trois — y compris un formulaire sans
question de décision. L’URL de callback elle-même n’est jamais renvoyée ;
hasCallback indique seulement si l’une est définie.
L’exemple ci-dessus est réduit. Une réponse complète porte aussi workspaceId, formSnapshotId,
createdVia, documents, reminderStep, remindersSent, reminderDueAt,
dataPurgedAt, et le reste des horodatages (updatedAt, openedAt, startedAt,
lastActivityAt, expiredAt, canceledAt, canceledBy, cancelReason).
Deux champs indiquent quand la copie sous vos yeux est la seule copie. callbackFailedAt est défini tant que le callback de
cette demande a épuisé ses tentatives, et effacé une fois qu’un passe ou que vous le rejouez. dataPurgedAt est défini une
fois que la rétention a dépouillé la demande : context, prefill et metadata reviennent vides,
readonlyKeys et documents valent [], et submissionId, answers et
display valent null.
timeline est dérivée, du plus ancien au plus récent. Chaque entrée a un id, un at, et un
type — created, invitation, reminder, opened, started,
completed, expired, canceled, callback. Les entrées de livraison ajoutent
deliveryStatus et attemptCount, et les callbacks ajoutent eventType. Les lignes de livraison sont
conservées 30 jours, donc les chronologies plus anciennes s’amincissent jusqu’aux horodatages.
requests.list
Liste les demandes d’un espace de travail ou d’un formulaire, les plus récentes en premier. Les demandes de test sont exclues sauf si vous les demandez.
workspaceIdstringoptional
workspaceIdstringoptionalLimite à un espace de travail. Fournissez ceci ou formId.
formIdstringoptional
formIdstringoptionalLimite à un formulaire.
statusstringoptional
statusstringoptionalpending, completed, expired, ou canceled.
outcomestringoptional
outcomestringoptionalapprove, decline, ou changes. Implique les demandes terminées uniquement.
externalIdstringoptional
externalIdstringoptionalVotre propre id, pour retrouver la demande créée par une exécution.
includeTestbooleanoptionaldefault: false
includeTestbooleanoptionaldefault: falseInclut les demandes créées avec test: true.
limitnumberoptionaldefault: 25
limitnumberoptionaldefault: 25Taille de page (1–100).
cursorstringoptional
cursorstringoptionalCurseur de pagination d’une réponse précédente.
{
"ok": true,
"data": {
"items": [
{
"id": "kd7...",
"formId": "j57...",
"status": "pending",
"outcome": null,
"recipient": { "email": "ada@acme.com", "name": "Ada" },
"externalId": "run-42",
"deliveryStatus": "sent",
"expiresAt": 1794787200000,
"createdAt": 1789379200000
}
],
"nextCursor": null,
"hasMore": false
}
}Les éléments de la liste portent les mêmes champs que requests.get moins url, answers,
display, et timeline, et chacun porte isTest. Fournissez workspaceId ou
formId — n’en fournir aucun renvoie 400 VALIDATION_ERROR avec la raison SCOPE_REQUIRED.
outcome prime sur status, puisque seule une demande terminée a un verdict.
requests.cancel
Retire une demande en attente. Le lien cesse de fonctionner, le destinataire voit un avis de retrait, et un callback request.canceled se
déclenche.
requestIdstringrequired
requestIdstringrequiredID de la demande.
reasonstringoptional
reasonstringoptionalVotre note expliquant pourquoi, conservée sur la demande et envoyée dans le callback.
requests.remind
Envoie un e-mail au destinataire maintenant, sans toucher au planning de rappel. Nécessite un e-mail de destinataire et un plan Pro ou Business.
requestIdstringrequired
requestIdstringrequiredID de la demande. Doit encore être en attente, et ne pas être une demande de test.
Deux planchers s’appliquent : au moins 10 minutes entre deux rappels manuels, et 8 rappels au maximum par demande au total, manuels et
programmés confondus. Le planning automatique n’est pas touché — reminderStep et reminderDueAt restent où ils
étaient.
requests.replayCallback
Renvoie le callback qu’une demande a déclenché à sa fin — même charge utile, même id d’événement, pour qu’un récepteur qui l’a déjà traité puisse dédupliquer. À utiliser après avoir réparé un point de terminaison défaillant.
requestIdstringrequired
requestIdstringrequiredID de la demande. Doit être terminée, expirée, ou annulée.
{
"ok": true,
"data": { "dispatchId": "kf9...", "eventId": "evt_kf9..." }
}requests.sample
Construire un événement de demande d’exemple pour un formulaire, sans aucune demande réelle. C’est exactement l’enveloppe que reçoit un
abonnement request_* créé avec webhooks.create, donc les connecteurs s’en servent pour
découvrir les champs. Un exemple terminé porte les mêmes réponses d’exemple que montre
submissions.sample ; un exemple expiré ou annulé porte seulement le bloc request.
formIdstringrequired
formIdstringrequiredIdentifiant du formulaire.
eventTypestringrequired
eventTypestringrequiredLa fin à illustrer par un exemple, dans l’orthographe de webhooks.create. Le type de l’enveloppe est la forme
avec point.
request_completedrequest_expiredrequest_canceled{
"ok": true,
"data": {
"id": "evt_example000000000000",
"type": "request.completed",
"createdAt": "2026-05-18T19:00:00.000Z",
"apiVersion": "2026-09-24",
"test": true,
"data": {
"request": {
"id": "req_example000000000000",
"externalId": "order-1234",
"status": "completed",
"language": "en",
"recipient": { "email": "recipient@example.com", "name": "Sample Recipient" },
"metadata": { "source": "sample" },
"context": {},
"createdAt": "2026-05-18T18:00:00.000Z",
"completedAt": "2026-05-18T19:00:00.000Z"
},
"form": { "id": "frm_abc123", "name": "Event Feedback", "snapshotId": "js7abc123" },
"submission": {
"id": "sub_example000000000000",
"respondentEmail": "respondent@example.com",
"submittedAt": "2026-05-18T19:00:00.000Z",
"updatedAt": null,
"editCount": 0,
"pdfUrl": null,
"language": "en"
},
"answers": { "your_email": "john@example.com" },
"display": { "your_email": "john@example.com" }
}
}
}Le bloc request et le résultat sont documentés sur la page des callbacks ; le volet
soumission, sur la référence webhooks. Les ids d’exemple sont les valeurs fixes
indiquées ci-dessus et test vaut true, afin qu’un récepteur puisse distinguer un exemple d’un événement réel.
documents.create
Réserver un téléversement pour un fichier que vous remettrez à un destinataire via le bloc Documents du
formulaire. Les octets ne transitent jamais par cette API : vous obtenez un PUT présigné, vous téléversez, et requests.create vérifie
l’objet avant que la demande n’existe.
formIdstringrequired
formIdstringrequiredLe formulaire dont le bloc Documents affichera le fichier. Limite le téléversement à cet espace de travail.
namestringrequired
namestringrequiredNom d’affichage vu par le destinataire (1–200 caractères). Remplaçable par demande.
contentTypestringrequired
contentTypestringrequiredapplication/pdf ou un type d’image : image/png, image/jpeg, image/webp,
image/gif, image/svg+xml, image/avif, image/bmp, image/tiff. Les
documents Office ne sont pas acceptés.
sizenumberrequired
sizenumberrequiredLongueur exacte en octets. Maximum 25 Mo (26 214 400).
sha256stringoptional
sha256stringoptionalDigest hexadécimal des octets. Vérifié après le téléversement quand il est fourni.
{
"ok": true,
"data": {
"id": "kn7...",
"name": "Lease contract draft",
"contentType": "application/pdf",
"size": 412000,
"uploadUrl": "https://...",
"expiresAt": 1792198800000
}
}Faites un PUT des octets bruts vers uploadUrl dans l’heure, avec Content-Type réglé sur le type
déclaré, puis référencez l’id depuis requests.create :
{
"method": "requests.create",
"params": {
"formId": "j57...",
"documents": [
{ "documentId": "kn7...", "name": "Your lease contract" },
{ "documentId": "kn8...", "field": "attachments" }
]
}
}fieldest la clé de champ du bloc Documents. Optionnelle quand le formulaire a exactement un bloc ; requise avec deux ou plus.- Les documents rédigés du bloc restent ; les vôtres apparaissent en dessous, pour ce seul destinataire.
- Plafonds : 25 Mo par document, 100 Mo de documents par demande, 20 documents affichés par bloc, documents rédigés compris.
Un téléversement peut être référencé par un nombre quelconque de demandes. Un téléversement que rien ne référence expire. Les octets comptent dans le stockage du propriétaire de l’espace de travail jusqu’à ce que la dernière demande qui les référence soit dépouillée par la rétention.
Chaque échec ici est 400 VALIDATION_ERROR avec un details.reason : DOCUMENT_TYPE_NOT_ALLOWED,
DOCUMENT_TOO_LARGE, INVALID_DOCUMENT_NAME ou INVALID_DOCUMENT_SHA256 pour cette méthode, et
DOCUMENT_NOT_FOUND, DOCUMENT_NOT_UPLOADED (vous avez sauté le PUT), DOCUMENT_INVALID,
INVALID_DOCUMENT_TARGET, DOCUMENTS_TOO_LARGE ou DOCUMENTS_TOO_MANY pour
requests.create.
Webhooks
webhooks.list
Lister les abonnements webhook d’un formulaire.
formIdstringrequired
formIdstringrequiredIdentifiant du formulaire.
{
"ok": true,
"data": {
"items": [
{
"subscriptionId": "int_abc123",
"formId": "frm_abc123",
"provider": "zapier",
"targetUrl": "https://hooks.zapier.com/...",
"eventType": "submission_created",
"status": "active",
"createdAt": 1714041851000
}
],
"hasMore": false
}
}webhooks.create
Abonner une URL aux événements d’un formulaire : soumissions nouvelles ou abandonnées, ou demandes du formulaire qui se terminent. L’URL doit utiliser HTTPS.
formIdstringrequired
formIdstringrequiredIdentifiant du formulaire.
targetUrlstringrequired
targetUrlstringrequiredURL HTTPS destinée à recevoir les charges utiles du webhook.
providerstringrequired
providerstringrequiredÀ quel outil appartient l’abonnement. C’est une étiquette pour votre propre suivi — il n’y a aucune application de marketplace à installer, et tous les fournisseurs se comportent de la même façon.
zapiermaken8neventTypestringoptionaldefault: submission_created
eventTypestringoptionaldefault: submission_createdType d’événement auquel s’abonner. Les trois types submission_ livrent le payload de soumission :
livrent l’
événement de demande correspondant chaque fois qu’une demande du formulaire se termine de
cette façon, signé avec le secret de cet abonnement ; les demandes de test n’atteignent aucun abonnement.submission_created une première soumission, submission_updated une modification par le répondant, et
submission_abandoned un brouillon inactif. Les trois types request_
submission_createdsubmission_updatedsubmission_abandonedrequest_completedrequest_expiredrequest_canceledidleWindowstringoptional
idleWindowstringoptionalRequis quand eventType vaut submission_abandoned ; rejeté pour tout autre type.
12h1d3d1wsigningSecretstringoptional
signingSecretstringoptionalSecret de signature HMAC optionnel, 32 à 255 caractères. Quand il est fourni, les livraisons incluent X-formbase-Signature.
Le secret est stocké mais jamais renvoyé par l’API.
curl -X POST https://api.formbase.so/api/v1 \
-H "Authorization: Bearer fb_..." \
-H "Content-Type: application/json" \
-d '{
"method": "webhooks.create",
"params": {
"formId": "frm_abc123",
"targetUrl": "https://hooks.zapier.com/hooks/catch/...",
"provider": "zapier",
"eventType": "submission_created",
"signingSecret": "whsec_0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
}
}'{
"ok": true,
"data": {
"subscriptionId": "int_new123",
"formId": "frm_abc123",
"provider": "zapier",
"targetUrl": "https://hooks.zapier.com/hooks/catch/...",
"eventType": "submission_created"
}
}Les abonnements de soumission abandonnée renvoient l’idleWindow choisi, à la fois depuis webhooks.create et
webhooks.list. Tout autre abonnement l’omet.
Un abonnement de demande entend les mêmes événements qu’un callback, mais comme sa propre livraison :
son propre id d’événement, sa propre signature, et son propre budget de cinq tentatives, après quoi l’abonnement se met en pause. Une
demande créée avec un callbackUrl sur un formulaire ayant un abonnement request_completed se déclenche donc deux
fois, une fois vers chaque récepteur. requests.replayCallback ne renvoie que le callback. Utilisez
requests.sample pour voir le payload avant qu’une demande ne se soit terminée.
webhooks.delete
Supprimer un abonnement webhook.
subscriptionIdstringrequired
subscriptionIdstringrequiredIdentifiant d’abonnement issu de webhooks.list ou webhooks.create.
{
"ok": true,
"data": {
"subscriptionId": "int_abc123",
"deleted": true
}
}Analytiques
analytics.get
Obtenir les métriques analytiques agrégées d’un formulaire. Prend en charge les filtres par plage de dates, appareil, source de trafic et pays.
Les analyses sont une fonctionnalité Pro, et la règle suit le forfait du propriétaire de l’espace de travail, comme l’onglet Analyses du tableau de bord. Si le propriétaire n’est pas sur Pro, l’appel renvoie UPGRADE_REQUIRED — y compris pour l’historique enregistré quand il l’était. Un membre Free dans l’espace d’un propriétaire Pro reçoit bien les données.
formIdstringrequired
formIdstringrequiredIdentifiant du formulaire.
fromnumberoptional
fromnumberoptionalDébut de la plage de dates sous forme d’horodatage Unix en millisecondes. Doit être inférieur ou égal à to quand les deux
sont définis.
tonumberoptional
tonumberoptionalFin de la plage de dates sous forme d’horodatage Unix en millisecondes. Omettez les deux pour tout l’historique — period
revient alors comme { "from": null, "to": null }.
devicestringoptionaldefault: all
devicestringoptionaldefault: allFiltrer par type d’appareil.
alldesktopmobiletablettrafficSourcestringoptional
trafficSourcestringoptionalFiltrer par source de trafic (ex. “Direct”, “Google”).
countrystringoptional
countrystringoptionalFiltrer par code pays à 2 lettres (ex. “US”, “DE”).
includeEventsbooleanoptionaldefault: false
includeEventsbooleanoptionaldefault: falseRenvoyer aussi les événements analytiques assainis derrière les métriques, pour votre propre analyse. Aucun id de visiteur.
Les taux sont des nombres de 0 à 100, les compteurs sont des entiers, et totalEvents est le nombre brut de lignes
d’événements avant déduplication en visiteurs uniques.
{
"ok": true,
"data": {
"formId": "frm_abc123",
"period": { "from": null, "to": null },
"totalEvents": 17,
"metrics": {
"views": 7,
"uniqueVisitors": 7,
"engaged": 6,
"submissions": 4,
"engagementRate": 86,
"completionRate": 57,
"bounceRate": 14
},
"breakdown": {
"byBrowser": { "Chrome": 17 },
"byCountry": { "US": 10, "DE": 7 },
"byDevice": { "desktop": 14, "mobile": 3 },
"bySource": { "Direct": 12, "Google": 5 }
}
}
}Espaces de travail
workspaces.list
Lister les espaces de travail que votre token peut atteindre. Aucun paramètre.
Un token API est lié à un seul espace de travail, donc ceci renvoie exactement celui-là — même quand votre compte appartient à plusieurs.
{
"ok": true,
"data": {
"items": [
{
"id": "ws_abc123",
"name": "Acme Inc",
"createdAt": 1714041800000,
"role": "owner"
}
],
"nextCursor": null,
"hasMore": false,
"canPaginate": false
}
}workspaces.createInvite
Créer un lien d’invitation pour un espace de travail.
workspaceIdstringrequired
workspaceIdstringrequiredIdentifiant de l’espace de travail.
expiresAtnumberoptional
expiresAtnumberoptionalExpiration sous forme d’horodatage Unix futur en millisecondes.
maxUsesnumberoptional
maxUsesnumberoptionalNombre maximum d’utilisations de l’invitation.
{
"ok": true,
"data": {
"id": "inv_abc123",
"workspaceId": "ws_abc123",
"code": "aBcDeFgH",
"expiresAt": null,
"maxUses": null,
"uses": 0,
"createdAt": 1714041851000
}
}workspaces.getInvite
Obtenir une invitation à un espace de travail. Renvoie la même forme que workspaces.createInvite.
inviteIdstringrequired
inviteIdstringrequiredIdentifiant de l’invitation.
workspaces.updateInvite
Mettre à jour une invitation existante à un espace de travail. Fournissez au moins l’un des champs expiresAt ou
maxUses, sinon l’appel est rejeté. Renvoie l’invitation mise à jour.
inviteIdstringrequired
inviteIdstringrequiredIdentifiant de l’invitation.
expiresAtnumberoptional
expiresAtnumberoptionalNouvel horodatage d’expiration en millisecondes.
maxUsesnumberoptional
maxUsesnumberoptionalNouvelle limite d’utilisations.
workspaces.revokeInvite
Révoquer définitivement une invitation à un espace de travail.
inviteIdstringrequired
inviteIdstringrequiredIdentifiant de l’invitation.
{
"ok": true,
"data": {
"inviteId": "inv_abc123",
"revoked": true
}
}Dossiers
folders.list
Lister les dossiers d’un espace de travail.
workspaceIdstringrequired
workspaceIdstringrequiredIdentifiant de l’espace de travail.
limitnumberoptionaldefault: 20
limitnumberoptionaldefault: 20Taille de la page (1–100).
cursorstringoptional
cursorstringoptionalCurseur de pagination.
{
"ok": true,
"data": {
"items": [
{
"id": "fld_abc123",
"name": "Customer Feedback",
"workspaceId": "ws_abc123",
"parentId": null,
"createdAt": 1714041800000
}
],
"nextCursor": null,
"hasMore": false,
"canPaginate": false
}
}folders.create
Créer un dossier dans un espace de travail. Idempotent — retourne le dossier existant si un dossier portant le même nom existe déjà.
workspaceIdstringrequired
workspaceIdstringrequiredIdentifiant de l’espace de travail.
namestringrequired
namestringrequiredNom du dossier (1–255 caractères).
parentIdstring | nulloptional
parentIdstring | nulloptionalIdentifiant du dossier parent pour l’imbrication. Omettez pour la racine.
{
"ok": true,
"data": {
"id": "fld_new123",
"name": "Customer Feedback",
"workspaceId": "ws_abc123",
"parentId": null,
"createdAt": 1714041851000,
"alreadyExisted": false
}
}folders.update
Renommer un dossier ou le déplacer dans un autre parent.
folderIdstringrequired
folderIdstringrequiredIdentifiant du dossier.
namestringoptional
namestringoptionalNouveau nom du dossier (1–255 caractères).
parentIdstring | nulloptional
parentIdstring | nulloptionalNouveau dossier parent. Passez null pour déplacer à la racine.
folders.delete
Supprimer définitivement un dossier et tout son contenu (sous-dossiers et formulaires).
folderIdstringrequired
folderIdstringrequiredIdentifiant du dossier.
Opération destructive
Cette action supprime définitivement tous les sous-dossiers et formulaires à l’intérieur du dossier. Elle est irréversible.
{
"ok": true,
"data": {
"folderId": "fld_abc123",
"deletedFolderIds": ["fld_abc123"],
"deletedFormIds": ["frm_in_folder"],
"message": "Folder and 1 form deleted."
}
}Traductions
translations.listLanguages
Lister toutes les langues configurées sur un formulaire.
formIdstringrequired
formIdstringrequiredIdentifiant du formulaire.
{
"ok": true,
"data": {
"formId": "frm_abc123",
"items": [
{
"language": "es",
"completion": { "total": 15, "current": 12, "outdated": 2, "missing": 1, "suggested": 0 },
"lastUpdatedAt": 1714041851000
}
],
"nextCursor": null,
"hasMore": false,
"canPaginate": false
}
}translations.addLanguage
Enregistrer une langue sur un formulaire. Toute autre méthode de traduction échoue avec 404 NOT_FOUND tant que ce n’est pas fait.
formIdstringrequired
formIdstringrequiredIdentifiant du formulaire.
languagestringrequired
languagestringrequiredBalise de langue BCP-47 (ex. “es”, “pt-BR”).
{
"ok": true,
"data": {
"formId": "frm_abc123",
"language": "es",
"rowId": "tl_new123"
}
}translations.removeLanguage
Supprimer une langue et toutes ses traductions d’un formulaire.
formIdstringrequired
formIdstringrequiredIdentifiant du formulaire.
languagestringrequired
languagestringrequiredBalise de langue BCP-47.
translations.listEntries
Lister chaque clé source pour une langue sur un formulaire, avec son état actuel. C’est ainsi que vous découvrez les valeurs de key que
prend translations.setEntry.
formIdstringrequired
formIdstringrequiredIdentifiant du formulaire.
languagestringrequired
languagestringrequiredBalise de langue BCP-47. Doit déjà être sur le formulaire.
{
"ok": true,
"data": {
"formId": "frm_abc123",
"language": "es",
"completion": { "total": 15, "current": 12, "outdated": 2, "missing": 1, "suggested": 0 },
"items": [
{
"key": "block_q_1.title",
"status": "current",
"value": "[{\"text\":\"Tu correo electrónico\"}]",
"sourceFragment": "[{\"text\":\"Your email\"}]",
"updatedAt": 1714041851000,
"block": { "id": "q_1", "type": "email-input", "label": "Your email" }
}
],
"hasMore": false
}
}status vaut missing (rien de stocké), outdated (la source a changé depuis), current,
ou suggested (une suggestion IA en attente, non acceptée). Les clés couvrent le contenu du formulaire (
block_<id>.) et, une fois qu’un auteur les a personnalisés, les e-mails de confirmation et de rappel au répondant (
, email.confirmation.email.reminder.*).
translations.setEntry
Définir une entrée de traduction. La langue doit avoir été ajoutée via translations.addLanguage au préalable.
formIdstringrequired
formIdstringrequiredIdentifiant du formulaire.
languagestringrequired
languagestringrequiredBalise de langue BCP-47.
keystringrequired
keystringrequiredUne clé issue de translations.listEntries. N’en construisez pas une à la main.
valuestringrequired
valuestringrequiredLe fragment traduit, sérialisé en JSON. Sa structure de marques doit correspondre au fragment source.
curl -X POST https://api.formbase.so/api/v1 \
-H "Authorization: Bearer fb_..." \
-H "Content-Type: application/json" \
-d '{
"method": "translations.setEntry",
"params": {
"formId": "frm_abc123",
"language": "es",
"key": "block_q_1.title",
"value": "[{\"text\":\"Tu correo electrónico\"}]"
}
}'Les écritures ici sont immédiates
L’API n’a pas d’étape brouillon-puis-publication : un setEntry ou deleteEntry atteint les répondants
immédiatement. Le tableau de bord et les outils de traduction MCP utilisent un brouillon à la place.
Renvoie { formId, language, key }.
translations.deleteEntry
Supprimer une entrée de traduction, ce qui fait revenir cette clé à la langue par défaut du formulaire. Idempotent. Quand la dernière entrée d’une langue disparaît, la langue quitte les langues publiées du formulaire.
formIdstringrequired
formIdstringrequiredIdentifiant du formulaire.
languagestringrequired
languagestringrequiredBalise de langue BCP-47.
keystringrequired
keystringrequiredClé de traduction à supprimer.
Compte
me.get
Obtenir des informations sur l’utilisateur authentifié.
{
"ok": true,
"data": {
"id": "usr_abc123",
"email": "you@example.com",
"name": "Jane Doe"
}
}Méta
methods.list
Lister chaque nom de méthode que ce déploiement sert, trié. La réponse qui fait foi quand cette page et le serveur ne sont pas d’accord.
{
"ok": true,
"data": {
"methods": [
"methods.list",
"analytics.get",
"folders.create",
"folders.delete",
"folders.list",
"folders.update",
"formSettings.get",
"formSettings.update",
"forms.create",
"forms.delete",
"forms.get",
"forms.list",
"..."
]
}
}Référence des erreurs
Chaque réponse d’erreur a la même structure. L’ensemble des code de premier niveau est fermé exprès : un nouveau mode de défaillance
n’ajoute jamais un code, il ajoute une reason. Branchez-vous sur code pour le résultat au niveau HTTP et sur details.reason pour la
correction.
{
"ok": false,
"error": {
"code": "VALIDATION_ERROR",
"message": "No field with key \"company\" on this form.",
"details": { "reason": "UNKNOWN_FIELD_KEY", "field": "prefill.company", "validKeys": ["company_name", "contacts"] }
}
}details est présent chaque fois que le serveur peut nommer la cause. Outre reason, il peut porter
field (le paramètre en cause, pointé pour l’imbrication), validKeys, validValues (les
valeurs d’option qu’une question à choix accepte), expectedType, feature (sur
UPGRADE_REQUIRED), et retryAfterMs (sur un appel throttlé). Les raisons propres à la surface d’une requête sont
listées avec chaque méthode ci-dessus.
Voici tous les codes :
VALIDATION_ERROR400optional
VALIDATION_ERROR400optionalParamètres invalides ou manquants dans la requête.
UNAUTHORIZED401optional
UNAUTHORIZED401optionalToken API absent ou invalide.
FORBIDDEN403optional
FORBIDDEN403optionalLe token n’a pas accès à la ressource demandée.
NOT_FOUND404optional
NOT_FOUND404optionalLa ressource n’existe pas.
METHOD_NOT_FOUND404optional
METHOD_NOT_FOUND404optionalNom de méthode inconnu. Utilisez methods.list pour voir les méthodes disponibles.
CONFLICT409optional
CONFLICT409optionalLa ressource n’est pas dans un état qui permet cet appel — une demande qui n’est plus en attente, une clé d’idempotence réutilisée avec un corps différent.
RATE_LIMITED429optional
RATE_LIMITED429optionalPlus de 120 appels par minute sur ce token, plus de 60 appels à requests.create par minute, ou trop d’échecs
d’authentification depuis cette IP.
UPGRADE_REQUIRED402optional
UPGRADE_REQUIRED402optionalLa fonctionnalité nécessite un niveau d’abonnement supérieur, l’espace de travail a épuisé son allocation mensuelle (raison
MONTHLY_ALLOWANCE_REACHED), ou un compte Free a épuisé ses 10 invitations gratuites (raison
FREE_INVITATIONS_USED).
INTERNAL_ERROR500optional
INTERNAL_ERROR500optionalErreur serveur inattendue. Réessayez plus tard.