Passer au contenu

Référence de la définition de formulaire

Une définition de formulaire est le JSON qui décrit un formulaire : ses champs, ses étapes, ses conditions, ses limites et ses réglages antipourriel. Le constructeur l’écrit pour vous, et le serveur l’applique à chaque soumission. Utilisez cette page quand vous avez besoin du nom ou de la valeur exacte d’un réglage.

Chaque exemple ci-dessous est un correctif de définition. Chaque clé de premier niveau que vous envoyez remplace toute cette clé, et les clés que vous omettez restent telles quelles. Pour ajouter un champ, envoyez tous les champs existants et le nouveau.

Ces clés de premier niveau peuvent être modifiées : fields, steps, contentBlocks, conditions, visibilityRules, validationRules, limits, spam, verification, settings, allowedOrigins et primaryPublicTarget.

Les destinataires, les expéditeurs et les courriels de notification ne font pas partie de ce correctif. Réglez-les dans les onglets Livraison et Modèles du formulaire. Consultez Premiers pas.

Noms et chemins des champs

fields associe un nom de champ à sa définition. Les noms utilisent des lettres, des chiffres, _ et -.

Les autres réglages désignent un champ par son chemin :

CheminDésigne
emailUn champ de premier niveau
contact.emailUn champ dans le groupe contact
guests[]Chaque élément de la liste guests, dans les étapes, les blocs de contenu et les règles de visibilité
guests[0].nameUn élément de la liste, dans les conditions et les règles de validation

Un chemin qui n’existe pas échoue avec FORM_CONFIG_FIELD_REF_UNKNOWN.

Types de champs

type prend l’une de ces douze valeurs. Toute autre valeur, comme file ou signature, échoue avec FORM_CONFIG_FIELD_TYPE_INVALID.

typeRecueilleSoumis comme
stringUn texte courtChaîne
textareaUn texte longChaîne
emailUne adresse courriel, toujours vérifiéeChaîne
urlUne adresse Web, toujours vérifiéeChaîne
phoneUn numéro de téléphoneChaîne
numberUn nombreNombre, ou chaîne qui se convertit en nombre
booleanOui ou nontrue ou false
dateUne date au format YYYY-MM-DD, toujours vérifiéeChaîne
selectUn choix dans une listeChaîne
checkboxUne case à cocher, ou plusieurs choixtrue ou false, ou une chaîne ou un tableau de chaînes avec allowedValues
objectUn groupe de champsObjet
arrayUn élément répétéTableau

Les questions d’évaluation et les curseurs du constructeur sont des champs number. Il n’y a pas de champ de téléversement de fichier ni de signature.

Options de tous les champs

OptionValeurEffet
labelChaîneLe nom du champ sur le formulaire
descriptionChaîneLe texte d’aide sous le champ
requiredtrue ou falseUne réponse vide échoue avec FIELD_REQUIRED
placeholderChaîneL’indication dans le champ. Pas sur object ni array
defaultValueDépend du typeLa réponse de départ. Pas sur object ni array
messagesObjet de chaînesVos propres textes d’erreur, par règle ou par code d’erreur
JSON
{
  "fields": {
    "name": {
      "type": "string",
      "label": "Your name",
      "description": "As it appears on your invoice.",
      "placeholder": "Jane Example",
      "required": true,
      "messages": { "required": "Enter your name." }
    }
  }
}

Une defaultValue doit convenir au champ : un nombre fini sur number, true ou false sur boolean, une vraie date YYYY-MM-DD sur date, et une chaîne sur les autres types de texte. Avec allowedValues, elle doit en faire partie.

Champs de texte

Ces options fonctionnent sur string, textarea, email, url et phone, ainsi que sur date et select là où le tableau l’indique.

OptionValeurFonctionne surCode d’erreur
min, maxLongueur, 0 ou plusTous les types de texteFIELD_STRING_TOO_SHORT, FIELD_STRING_TOO_LONG
exactLengthLongueur, 0 ou plus. Ne se combine pas avec min ni maxTous les types de texte, date, selectFIELD_STRING_LENGTH_INVALID
pattern, flagsExpression régulière d’au plus 500 caractères. flags accepte i, m et uTous les types de texteFIELD_PATTERN_INVALID
allowedValuesTableau de chaînesTous les types de texteFIELD_VALUE_NOT_ALLOWED
startsWith, endsWithChaîne non videstring, textarea, email, url, phoneFIELD_STRING_PREFIX_INVALID, FIELD_STRING_SUFFIX_INVALID
contains, notContainsChaîne non videstring, textarea, email, url, phoneFIELD_STRING_CONTAINS_REQUIRED, FIELD_STRING_CONTAINS_FORBIDDEN
JSON
{
  "fields": {
    "reference": {
      "type": "string",
      "label": "Reference",
      "min": 4,
      "max": 20,
      "startsWith": "REF-",
      "pattern": "^REF-[0-9]+$"
    },
    "message": {
      "type": "textarea",
      "label": "Message",
      "required": true,
      "max": 5000,
      "trim": true
    }
  }
}

Texte masqué ou caché

Sur string seulement, inputType vaut password ou hidden. Il change l’affichage du champ. La validation le traite quand même comme une chaîne.

JSON
{
  "fields": {
    "access_code": { "type": "string", "label": "Access code", "inputType": "password" },
    "campaign": { "type": "string", "inputType": "hidden", "defaultValue": "spring" }
  }
}

Vérifications de format sur le texte

Ces options fonctionnent sur les champs string. countryCode et regionCodeCountry fonctionnent aussi sur select.

OptionValeurCode d’erreur
uuidVersionany, v4 ou v7FIELD_UUID_INVALID
countryCodeiso2FIELD_COUNTRY_CODE_INVALID
postalCodeCountryCA ou USFIELD_POSTAL_CODE_INVALID
regionCodeCountryCA ou USFIELD_REGION_CODE_INVALID
timeFormatHH:mm ou HH:mm:ssFIELD_TIME_INVALID
dateTimeFormatiso8601, qui exige un fuseau horaireFIELD_DATETIME_INVALID
JSON
{
  "fields": {
    "postal_code": { "type": "string", "label": "Postal code", "postalCodeCountry": "CA" },
    "province": { "type": "select", "label": "Province", "regionCodeCountry": "CA", "allowedValues": ["QC", "ON"] },
    "pickup_time": { "type": "string", "label": "Pickup time", "timeFormat": "HH:mm" }
  }
}

Champs de courriel

Les réponses email sont toujours vérifiées, et échouent avec FIELD_EMAIL_INVALID. normalizeEmail met l’adresse en minuscules avant de la vérifier et de la conserver.

JSON
{
  "fields": {
    "email": { "type": "email", "label": "Email", "required": true, "max": 254, "trim": true, "normalizeEmail": true }
  }
}

Champs d’URL

Les réponses url sont toujours vérifiées, et acceptent http et https par défaut. Utilisez allowedProtocols pour changer cela. javascript, data et vbscript ne sont pas permis. Une mauvaise adresse échoue avec FIELD_URL_INVALID, et un autre protocole avec FIELD_URL_PROTOCOL_NOT_ALLOWED.

JSON
{
  "fields": {
    "website": { "type": "url", "label": "Website", "allowedProtocols": ["https"] }
  }
}

Champs de téléphone

Un champ phone accepte n’importe quel texte par défaut. phoneFormat accepte e164, qui exige un numéro comme +15145550123, et échoue avec FIELD_PHONE_INVALID.

JSON
{
  "fields": {
    "phone": { "type": "phone", "label": "Phone", "phoneFormat": "e164" }
  }
}

Champs numériques

OptionValeurCode d’erreur
min, maxLa valeur la plus basse et la plus haute, 0 ou plusFIELD_NUMBER_TOO_SMALL, FIELD_NUMBER_TOO_LARGE
integertrue pour des nombres entiers seulementFIELD_INTEGER_REQUIRED
maxDecimalPlacesNombre entier, 0 ou plusFIELD_DECIMAL_PLACES_INVALID

Une valeur qui ne se lit pas comme un nombre échoue avec FIELD_TYPE_INVALID. min et max ne peuvent pas être négatifs, peu importe le type de champ.

JSON
{
  "fields": {
    "rating": { "type": "number", "label": "Your rating", "integer": true, "min": 1, "max": 5 },
    "budget": { "type": "number", "label": "Budget", "maxDecimalPlaces": 2 }
  }
}

Champs de date

Les réponses date doivent être de vraies dates au format YYYY-MM-DD. dateMin et dateMax prennent le même format et incluent la date indiquée.

RègleCode d’erreur
Pas une vraie dateFIELD_DATE_INVALID
Avant dateMinFIELD_DATE_TOO_EARLY
Après dateMaxFIELD_DATE_TOO_LATE
JSON
{
  "fields": {
    "event_date": { "type": "date", "label": "Event date", "dateMin": "2027-01-01", "dateMax": "2027-12-31" }
  }
}

Champs de choix

Utilisez select pour un seul choix. Énumérez les choix dans allowedValues.

JSON
{
  "fields": {
    "department": { "type": "select", "label": "Department", "required": true, "allowedValues": ["Sales", "Support"] }
  }
}

Plusieurs choix

Utilisez checkbox avec allowedValues. minSelections et maxSelections fixent l’intervalle, et échouent avec FIELD_SELECTION_TOO_FEW et FIELD_SELECTION_TOO_MANY. defaultValue est une chaîne ou un tableau de chaînes de la liste.

JSON
{
  "fields": {
    "interests": {
      "type": "checkbox",
      "label": "Interests",
      "allowedValues": ["Workshops", "Newsletter", "Events"],
      "minSelections": 1,
      "maxSelections": 2,
      "defaultValue": ["Newsletter"]
    }
  }
}

Une seule case à cocher

Sans allowedValues, un checkbox est une seule case à cocher, et boolean fonctionne de la même façon. defaultValue vaut true ou false. Ajoutez accepted quand la case doit être cochée, par exemple pour un consentement. L’échec donne FIELD_ACCEPTED_REQUIRED.

JSON
{
  "fields": {
    "consent": { "type": "checkbox", "label": "I agree to the terms", "required": true, "accepted": true },
    "subscribe": { "type": "boolean", "label": "Send me the newsletter", "defaultValue": false }
  }
}

Groupes

type: "object" regroupe des champs sous un même nom. Il accepte label, description, required, messages et fields. Les groupes s’imbriquent sur au plus 8 niveaux. Les réponses arrivent sous forme d’objet, avec des chemins comme contact.email.

JSON
{
  "fields": {
    "contact": {
      "type": "object",
      "label": "Contact",
      "fields": {
        "name": { "type": "string", "label": "Name", "required": true },
        "email": { "type": "email", "label": "Email", "required": true }
      }
    }
  }
}

Listes

type: "array" répète un élément. item contient n’importe quel type de champ, y compris un groupe.

OptionValeurCode d’erreur
minItemsNombre entier, 0 ou plusFIELD_ARRAY_TOO_SHORT
maxItemsNombre entier, 0 ou plusFIELD_ARRAY_TOO_LONG
uniqueItemstrue pour refuser les répétitionsFIELD_ARRAY_DUPLICATES
JSON
{
  "fields": {
    "guests": {
      "type": "array",
      "label": "Guests",
      "minItems": 1,
      "maxItems": 5,
      "item": {
        "type": "object",
        "fields": {
          "name": { "type": "string", "label": "Guest name", "required": true }
        }
      }
    }
  }
}

Nettoyage des réponses

Les traitements nettoient une réponse avant sa validation. Le résultat est la valeur conservée et livrée. Ils fonctionnent sur string, textarea, email, url, phone, date et select, et un champ peut en avoir jusqu’à 25 de chaque sorte.

Les sanitizers passent d’abord, puis trim, collapseWhitespace et normalizeEmail, puis les transformers, puis caseTransform.

type de nettoyageCe qu’il fait
trimRetire les espaces au début et à la fin
collapseWhitespaceRemplace toute suite d’espaces et de sauts de ligne par une seule espace
normalizeNewlinesUniformise les sauts de ligne
stripTagsRetire tout ce qui est écrit comme une balise HTML
removeUrlsRetire les adresses Web qui commencent par http://, https:// ou www.
removeEmojiRetire les émojis
digitsOnlyGarde seulement les chiffres. Sur string et phone seulement
type de transformationExige aussiCe qu’il fait
casemode : upper ou lowerChange la casse de toute la réponse
mapvalues : jusqu’à 100 chaînesRemplace une réponse entière par une autre. La réponse doit correspondre exactement
JSON
{
  "fields": {
    "province": {
      "type": "string",
      "label": "Province",
      "sanitizers": [{ "type": "trim" }, { "type": "collapseWhitespace" }],
      "transformers": [{ "type": "case", "mode": "upper" }, { "type": "map", "values": { "QC": "Québec" } }]
    }
  }
}

Options raccourcies

OptionValeurFonctionne sur
trimtrueLes champs de texte
collapseWhitespacetruestring, textarea
normalizeEmailtrueemail
caseTransformupper ou lowerstring, textarea, select

Pipelines

pipeline exécute les nettoyages, les transformations et les validateurs dans une seule liste que vous ordonnez vous-même. Il ne se combine pas avec sanitizers, transformers, validators, trim, collapseWhitespace, normalizeEmail ni caseTransform, échoue alors avec FORM_CONFIG_FIELD_OPTION_CONFLICT, et exige au moins une étape. L’onglet Traitement de l’application affiche un pipeline sans permettre de le modifier : préférez donc les deux listes ci-dessus.

JSON
{
  "fields": {
    "code": {
      "type": "string",
      "label": "Code",
      "pipeline": [
        { "step": "sanitizer", "sanitizer": { "type": "trim" } },
        { "step": "validator", "validator": { "type": "startsWith", "value": "A", "code": "CODE_PREFIX", "message": "Start the code with A." } },
        { "step": "transformer", "transformer": { "type": "case", "mode": "lower" } }
      ]
    }
  }
}

Validateurs

Ajoutez des vérifications à un champ de texte avec validators. Chacune exige un type, un code en majuscules comme CUSTOM_POSTAL_CODE, et le message à afficher. Les réponses de validation renvoient votre code et votre message.

typeAccepte aussiRéussit quand la réponse est
emailUne adresse courriel
urlallowedProtocolsUne adresse Web
domainUn nom de domaine
phoneE164format : e164Un numéro comme +15145550123
postalCodecountry : CA ou US, obligatoireUn code postal ou ZIP
regionCodecountry : CA ou US, obligatoireUn code de province ou d’État
countryCodeformat : iso2Un code de pays à deux lettres
uuidversion : any, v4 ou v7Un UUID
ipUne adresse IPv4 ou IPv6
ipv4Une adresse IPv4
ipv6Une adresse IPv6
containsvalue, obligatoireContient le texte
notContainsvalue, obligatoireNe contient pas le texte
startsWithvalue, obligatoireCommence par le texte
endsWithvalue, obligatoireSe termine par le texte
regexpattern, obligatoire, d’au plus 500 caractères. flags : i, m, uCorrespond à l’expression
JSON
{
  "fields": {
    "postal_code": {
      "type": "string",
      "label": "Postal code",
      "validators": [
        { "type": "postalCode", "country": "CA", "code": "CUSTOM_POSTAL_CODE", "message": "Enter a valid postal code." }
      ]
    },
    "sku": {
      "type": "string",
      "label": "Product code",
      "validators": [
        { "type": "regex", "pattern": "^[A-Z]{3}-[0-9]{4}$", "code": "CUSTOM_SKU", "message": "Use a code such as ABC-1234." }
      ]
    }
  }
}

Conditions

Une condition est vraie ou fausse pour un ensemble de réponses. Elle sert aux règles de visibilité, aux règles de validation, aux étapes et aux blocs de contenu.

OpérateurvalueVraie quand la réponse
isFilledAucuneN’est pas vide
isEmptyAucuneEst vide
equalsN’importe laquelleEst égale à la valeur
notEqualsN’importe laquelleN’est pas égale à la valeur
inTableauEst dans le tableau
notInTableauN’est pas dans le tableau
greaterThanNombre ou texteEst plus grande
greaterThanOrEqualNombre ou texteEst plus grande ou égale
lessThanNombre ou texteEst plus petite
lessThanOrEqualNombre ou texteEst plus petite ou égale
matchesExpression régulièreCorrespond à l’expression

Combinez les conditions avec all, any et not. Une condition s’imbrique sur au plus 5 niveaux, et un groupe contient au plus 25 conditions. Un groupe vide échoue avec FORM_CONFIG_CONDITION_REQUIRED.

L’exemple suivant est complet. Il affiche details quand type vaut Commercial et que size dépasse 10, ou quand type n’est pas rempli.

JSON
{
  "fields": {
    "type": { "type": "select", "label": "Type", "allowedValues": ["Personal", "Commercial"] },
    "size": { "type": "number", "label": "Team size" },
    "details": { "type": "textarea", "label": "Details" }
  },
  "visibilityRules": [
    {
      "id": "show-details",
      "path": "details",
      "default": "hidden",
      "state": "visible",
      "when": {
        "any": [
          { "all": [
            { "path": "type", "operator": "equals", "value": "Commercial" },
            { "path": "size", "operator": "greaterThan", "value": 10 }
          ] },
          { "not": { "path": "type", "operator": "isFilled" } }
        ]
      }
    }
  ]
}

Conditions nommées

conditions conserve jusqu’à 100 conditions par nom, pour les réutiliser dans l’application. Chacune a un id et, au besoin, un label d’au plus 200 caractères, une description d’au plus 2 000 caractères et un when. Une règle garde sa propre copie de la logique : une condition nommée ne change donc pas le comportement d’un formulaire.

JSON
{
  "fields": {
    "type": { "type": "select", "label": "Type", "allowedValues": ["Personal", "Commercial"] }
  },
  "conditions": [
    {
      "id": "is-commercial",
      "label": "Commercial project",
      "when": { "path": "type", "operator": "equals", "value": "Commercial" }
    }
  ]
}

Règles de visibilité

Une règle de visibilité affiche ou masque un champ ou un groupe. Quand when est vrai, le champ prend state. Sinon, il prend default, qui vaut visible si vous l’omettez. Un formulaire peut avoir jusqu’à 100 règles, à raison d’une règle par champ.

Le serveur applique aussi ces règles. Les réponses à un champ masqué sont abandonnées, et ses vérifications ne s’exécutent pas.

JSON
{
  "fields": {
    "meal": { "type": "select", "label": "Meal", "allowedValues": ["Standard", "Other"] },
    "meal_details": { "type": "string", "label": "Tell us more" }
  },
  "visibilityRules": [
    {
      "id": "show-meal-details",
      "path": "meal_details",
      "default": "hidden",
      "state": "visible",
      "when": { "path": "meal", "operator": "equals", "value": "Other" }
    }
  ]
}

Règles de validation

Une règle de validation vérifie un champ seulement quand une condition est vraie. then contient jusqu’à 25 actions, chacune avec un path et un validator. Un formulaire peut avoir jusqu’à 100 règles.

Le validator est n’importe quel type de la section Validateurs, ou l’un de ceux-ci :

typeAccepte aussiRéussit quand
requiredLe champ n’est pas vide
allOfvalidatorsTous les validateurs de la liste réussissent
anyOfvalidatorsAu moins un validateur de la liste réussit

Chacun exige un code et un message. Les listes allOf et anyOf contiennent jusqu’à 25 validateurs et s’imbriquent sur au plus 3 niveaux.

JSON
{
  "fields": {
    "type": { "type": "select", "label": "Type", "allowedValues": ["Personal", "Commercial"] },
    "company": { "type": "string", "label": "Company" }
  },
  "validationRules": [
    {
      "id": "company-if-commercial",
      "when": { "path": "type", "operator": "equals", "value": "Commercial" },
      "then": [
        {
          "path": "company",
          "validator": { "type": "required", "code": "COMPANY_REQUIRED", "message": "Enter the company name." }
        }
      ]
    }
  ]
}

Étapes

steps regroupe les champs en pages. À partir de deux, les pages hébergées et les intégrations par script en affichent une à la fois, avec Suivant, Précédent et un compteur. Un formulaire peut avoir jusqu’à 50 étapes.

OptionValeurEffet
idChaîne uniqueNomme l’étape, y compris pour la validation d’étape
fieldsDe 1 à 100 cheminsLes champs de l’étape. Énumérez aussi les champs conditionnels
labelChaîneLe titre de l’étape
summaryChaîne d’au plus 2 000 caractèresS’affiche sous le titre
validateOnstepSubmit, change ou blurchange permet à Suivant de sauter la vérification sur le serveur. Les autres vérifient d’abord
visibleWhenConditionMasque l’étape et ignore ses champs, sauf si elle est vraie

La soumission vérifie toujours tout le formulaire. Consultez Sections et formulaires à étapes.

JSON
{
  "fields": {
    "name": { "type": "string", "label": "Name", "required": true },
    "email": { "type": "email", "label": "Email", "required": true },
    "attending": { "type": "boolean", "label": "Will you attend?" },
    "meal": { "type": "select", "label": "Meal", "allowedValues": ["Standard", "Vegetarian"] }
  },
  "steps": [
    { "id": "about", "label": "About you", "summary": "How to reach you.", "fields": ["name", "email", "attending"], "validateOn": "stepSubmit" },
    {
      "id": "seat",
      "label": "Your seat",
      "fields": ["meal"],
      "visibleWhen": { "path": "attending", "operator": "equals", "value": true }
    }
  ]
}

Blocs de contenu

Un bloc de contenu place du texte ou un séparateur parmi les champs. Il ne contient aucune réponse : il n’atteint donc jamais la validation, les soumissions ni les courriels. Un formulaire peut en avoir jusqu’à 100.

OptionValeurEffet
idChaîne uniqueNomme le bloc
typetext ou separatorUn séparateur affiche une ligne, avec title comme libellé s’il est défini
titleChaîne d’au plus 200 caractèresUn titre
description, bodyChaînes d’au plus 5 000 caractèresDes paragraphes, sur text
before, afterChemin de champSon emplacement. Utilisez l’un des deux. Sans ni l’un ni l’autre, il termine le formulaire
visibleWhenConditionAffiche le bloc seulement quand elle est vraie
JSON
{
  "fields": {
    "name": { "type": "string", "label": "Name" },
    "seats": { "type": "number", "label": "Seats", "integer": true, "min": 1 }
  },
  "contentBlocks": [
    { "id": "intro", "type": "text", "title": "Seats are limited", "body": "Register early to save your spot.", "before": "name" },
    { "id": "divider", "type": "separator", "after": "name" },
    {
      "id": "group-note",
      "type": "text",
      "body": "We'll contact you about group rates.",
      "after": "seats",
      "visibleWhen": { "path": "seats", "operator": "greaterThan", "value": 5 }
    }
  ]
}

Limites

limits accepte duplicateWindowSeconds, rateLimits et quotas. Toute autre clé fait échouer toute la requête avec BAD_REQUEST. Consultez Limites et protection antipourriel pour ce que fait chacune.

OptionValeur
duplicateWindowSecondsNombre entier. Toute valeur sous 60 agit comme 60
rateLimits[].idChaîne unique
rateLimits[].scopeipHash par visiteur, form, workspace, origin, deviceToken ou idempotencyKey
rateLimits[].windowSecondsNombre entier, 1 ou plus
rateLimits[].maxNombre entier, 1 ou plus
rateLimits[].messageVotre propre message
quotas[].idChaîne unique
quotas[].scopeform ou workspace
quotas[].periodday, week, month ou lifetime
quotas[].maxAcceptedNombre entier, 1 ou plus
quotas[].messageVotre propre message
JSON
{
  "limits": {
    "duplicateWindowSeconds": 300,
    "rateLimits": [
      { "id": "per-visitor", "scope": "ipHash", "windowSeconds": 600, "max": 10 },
      { "id": "whole-form", "scope": "form", "windowSeconds": 3600, "max": 300 }
    ],
    "quotas": [
      { "id": "cap", "scope": "form", "period": "lifetime", "maxAccepted": 200, "message": "Registration is full." }
    ]
  }
}

Le code de réponse reste RATE_LIMITED ou FORM_QUOTA_REACHED, peu importe le contenu de message.

Les dates d’ouverture et de fermeture ne font pas partie de limits. Réglez-les sous Fenêtre de réponse, dans l’onglet Publication.

Vérifications antipourriel

OptionValeurEffet
honeypotFieldChemin de champRefuse une soumission dont ce champ est rempli. Les nouveaux formulaires utilisent _formerie_hp. Omettez-le pour désactiver la vérification
minSubmitTimeMsNombre entier, 0 ou plusRefuse un formulaire envoyé plus vite que ce délai, quand le client envoie metadata.startedAt. 0 la désactive
maxLinksNombre entier, 0 ou plusRefuse une soumission avec plus de liens que ce nombre, dans l’ensemble de ses réponses. 0 refuse tout lien. Omettez-le pour désactiver la vérification
JSON
{
  "spam": {
    "honeypotField": "_formerie_hp",
    "minSubmitTimeMs": 1000,
    "maxLinks": 3
  }
}

Vérification humaine

OptionValeurEffet
providerturnstile, recaptcha-v2 ou recaptcha-v3Le défi à afficher
modemanaged ou custommanaged utilise les clés de Formerie, sur turnstile seulement. Précisez-le toujours
requiredtrue ou falseSi une soumission doit réussir le défi
siteKeyClé de site publiqueNécessaire avec custom quand required vaut true
minScoreDe 0 à 1Le score le plus bas accepté, sur recaptcha-v3 seulement
expectedActionChaîneL’action que le jeton doit porter, sur recaptcha-v3 seulement
JSON
{
  "verification": {
    "provider": "turnstile",
    "mode": "managed",
    "required": true
  }
}

Avec vos propres clés, saisissez la clé secrète dans l’application, sous Vérification humaine, dans les Paramètres du formulaire. Elle est chiffrée, et elle reste en place quand vous changez le reste de verification avec le même fournisseur. Tant qu’aucune clé n’est enregistrée, required doit rester à false, comme dans cet exemple, sinon le changement échoue avec FORM_CONFIG_VERIFICATION_SECRET_REQUIRED.

JSON
{
  "verification": {
    "provider": "recaptcha-v3",
    "mode": "custom",
    "required": false,
    "siteKey": "your-public-site-key",
    "minScore": 0.5,
    "expectedAction": "contact"
  }
}

Origines autorisées

allowedOrigins énumère les sites dont le code de navigateur peut appeler directement le formulaire. Chaque entrée est une origine exacte, sans chemin ni caractère générique. Consultez Origines autorisées pour savoir quand elles sont nécessaires.

JSON
{
  "allowedOrigins": ["https://www.example.com", "https://example.com", "http://localhost:5173"]
}

Adresse publique

primaryPublicTarget fixe l’adresse principale du formulaire.

kindExige aussiAdresse
workspaceLe chemin de l’espace de travail sur forms.formerie.com
formerieLa même adresse Formerie
runtimeHostnamehostname, et bindingKind : workspace ou formVotre propre nom d’hôte. Connectez-le d’abord sous Domaines
JSON
{
  "primaryPublicTarget": {
    "kind": "runtimeHostname",
    "hostname": "forms.example.com",
    "bindingKind": "workspace"
  }
}

Comportement du formulaire

settings.behavior contient ce qui se passe autour des champs. settings se remplace au complet : envoyez donc behavior, branding et layout ensemble.

OptionValeur
languageUne balise de langue comme en-CA ou fr-CA
submitButtonLabelAu plus 80 caractères
successMessageAu plus 280 caractères
successRedirectUrlUne adresse http ou https, d’au plus 500 caractères

Image de marque

settings.branding donne son style à la page hébergée et à l’intégration par script.

OptionValeur
brandNameAu plus 80 caractères
logoUrlUne adresse http ou https, d’au plus 500 caractères
densitycompact, comfortable ou spacious
fontPresetarial, georgia, helvetica, inter, mono, system, times ou verdana
previewThemelight ou dark. Les visiteurs obtiennent celui que vous choisissez
radiusnone, soft ou round
themes.light, themes.darkDes couleurs au format #RRGGBB

Chaque thème accepte accentColor, accentTextColor, backgroundColor, borderColor, errorColor, errorTextColor, fieldBackgroundColor, mutedTextColor, surfaceColor et textColor.

Le CSS personnalisé n’est pas appliqué aux pages hébergées.

Mise en page

settings.layout fixe la largeur de la page hébergée.

OptionValeur
containerWidthModecontained, custom ou full
containerMinWidth, containerMaxWidthUne longueur comme 44rem, 720px, 90% ou 72ch, avec custom
JSON
{
  "settings": {
    "behavior": {
      "language": "fr-CA",
      "submitButtonLabel": "Envoyer",
      "successMessage": "Merci, nous vous répondrons sous peu."
    },
    "branding": {
      "brandName": "Example",
      "density": "comfortable",
      "fontPreset": "inter",
      "previewTheme": "light",
      "radius": "soft",
      "themes": { "light": { "accentColor": "#007c72" } }
    },
    "layout": { "containerWidthMode": "custom", "containerMaxWidth": "44rem" }
  }
}

Limites de taille

ÉlémentLimite
Champs d’un formulaire, y compris ceux des groupes et des listes250
Imbrication des groupes et des listes8 niveaux
Étapes50
Chemins dans une étape100
Résumé d’étape2 000 caractères
Blocs de contenu100
Titre d’un bloc de contenu200 caractères
Description ou corps d’un bloc de contenu5 000 caractères chacun
Conditions nommées100
Libellé, description d’une condition nommée200, 2 000 caractères
Règles de visibilité100
Règles de validation100
Actions dans une règle de validation25
Conditions dans une règle25
Imbrication des conditions5 niveaux
Validateurs dans un allOf ou un anyOf25, sur au plus 3 niveaux
Nettoyages, transformations ou étapes de pipeline sur un champ25 de chaque sorte
Entrées d’une transformation map100
Expression régulière500 caractères
Corps JSON d’une soumission100 000 octets

Lire les erreurs de définition

Une définition refusée renvoie VALIDATION_FAILED avec issues, et chaque problème a un path, un code stable et un message. Corrigez ces chemins et envoyez de nouveau le correctif.

CodeCe qui ne va pas
FORM_CONFIG_FIELD_TYPE_INVALIDtype n’est pas l’un des douze types de champs
FORM_CONFIG_FIELD_OPTION_INVALIDCette option ne fonctionne pas sur ce type de champ
FORM_CONFIG_FIELD_OPTION_CONFLICTDeux options ne peuvent pas être utilisées ensemble
FORM_CONFIG_FIELD_REF_UNKNOWNUn chemin désigne un champ qui n’existe pas
FORM_CONFIG_FIELDS_REQUIREDLe formulaire n’a aucun champ
FORM_CONFIG_NUMBER_TOO_SMALLUn nombre est sous son minimum
FORM_CONFIG_RANGE_INVALIDUn minimum dépasse son maximum
FORM_CONFIG_DEFAULT_VALUE_INVALIDdefaultValue ne convient pas au champ
FORM_CONFIG_DEFAULT_VALUE_NOT_ALLOWEDdefaultValue n’est pas dans allowedValues
FORM_CONFIG_CODE_INVALIDUn code n’est pas composé de majuscules, de chiffres et de _
FORM_CONFIG_VALIDATOR_INVALIDLe type de validateur n’existe pas
FORM_CONFIG_CONDITION_OPERATOR_INVALIDL’operator de la condition n’existe pas
FORM_CONFIG_ID_DUPLICATEDeux entrées d’une liste ont le même id
FORM_CONFIG_ORIGIN_WILDCARDUne origine autorisée utilise *
FORM_CONFIG_ORIGIN_INVALIDUne origine autorisée a un chemin, ou n’est pas en http ou https