Demandes
Dépannage des demandes
Où chercher quand une demande a été refusée, qu'une invitation n'est jamais arrivée, ou qu'un workflow attend toujours un callback qui s'est déjà produit.
Lire une erreur
Chaque refus porte deux choses : un code pour le type d’échec, et un details.reason pour la cause précise.
Testez le code ; lisez la raison pour savoir quoi corriger. Quand c’est utile, details nomme aussi le field
fautif, les clés qui auraient été acceptées, ou les clés d’option acceptées par une question à choix.
Les méthodes de demande utilisent quatre codes : VALIDATION_ERROR (l’appel était incorrect), CONFLICT (la
demande est dans le mauvais état, ou une clé d’idempotence a été réutilisée), NOT_FOUND, et UPGRADE_REQUIRED
(une restriction de plan ou l’allocation mensuelle). Appeler trop vite renvoie RATE_LIMITED à la place, avec
retryAfterMs — voir la limite de débit.
{
"ok": false,
"error": {
"code": "VALIDATION_ERROR",
"message": "No field with key \"company\".",
"details": { "reason": "UNKNOWN_FIELD_KEY", "field": "prefill.company", "validKeys": ["company_name", "company_size"] }
}
}Raisons que vous pourriez rencontrer
Bien faire l’appel
| Raison | Que faire |
|---|---|
| FORM_NOT_PUBLISHED | Publiez le formulaire. Une demande épingle une version publiée, donc il doit y en avoir une. |
| UNKNOWN_FIELD_KEY | Aucun champ avec cette clé, ou elle appartient à l'autre compartiment. Chaque clé de contexte doit être un champ caché sur le formulaire publié ; envoyez les clés de forme libre dans metadata. Vérifiez fields.list ; validKeys liste celles acceptées. |
| CONTEXT_KEY_NOT_HIDDEN_FIELD | Vous avez envoyé une question visible — ou un champ calculé — dans context. Les questions visibles vont dans prefill ; les champs calculés ne peuvent jamais être définis. |
| INVALID_PREFILL_VALUE | Mauvaise forme pour ce type de question. expectedType indique ce qui était attendu ; pour les questions à choix, envoyez la clé de l’option, pas le libellé ; une matrice prend { "row_key": "column_key" }. expectedType "not_prefillable" signifie que le champ n’accepte aucune valeur de l’appelant — un fichier, une signature, un paiement, une prise de rendez-vous, ou un champ calculé. |
| READONLY_REQUIRES_PREFILL | Une clé verrouillée n'a pas de valeur. Chaque clé de readonly doit aussi être dans prefill. |
| READONLY_REQUIRED_EMPTY | Un champ obligatoire est verrouillé avec une valeur vide — le destinataire ne pourrait jamais soumettre. Fournissez une valeur ou arrêtez de le verrouiller. |
| LANGUAGE_NOT_PUBLISHED | Cette langue n'est pas publiée sur la version actuelle. validKeys liste celles qui le sont. |
| INVALID_REMINDER_SCHEDULE | Un délai n'a pas pu être lu, le même délai apparaît deux fois, ou il y a plus de cinq étapes. Utilisez des jours, heures ou minutes entiers positifs : 2d, 12h, 30m. |
| EXPIRY_OUT_OF_RANGE | expiresAt est dans le passé ou à plus de 365 jours. |
| CALLBACK_URL_NOT_ALLOWED | L'URL n'est pas en HTTPS, porte des identifiants, ou pointe vers une adresse privée. Localhost ne fonctionnera pas — utilisez un tunnel. |
| DOMAIN_NOT_ALLOWED | Ce domaine personnalisé n'est pas actif, ou appartient à un autre espace de travail. |
| INVALID_DOCUMENT_TARGET | Le formulaire n'a pas de bloc Documents, ou il en a plusieurs et vous n'avez pas précisé lequel avec field. validKeys liste les clés de bloc. |
| DOCUMENT_NOT_UPLOADED | L'envoi a été réservé mais les octets ne sont jamais arrivés. Effectuez d'abord un PUT du fichier vers son uploadUrl. |
| DOCUMENT_INVALID | Les octets envoyés ne correspondent pas à la taille, au type ou au sha256 déclarés par documents.create, ou le type n'est pas un PDF ou une image. |
| DOCUMENTS_TOO_MANY | Le bloc afficherait plus de 20 documents, en comptant ceux de l'auteur. |
| DOCUMENTS_TOO_LARGE | Une demande peut porter 100 Mo de documents au total, et 25 Mo par document. |
| SCOPE_REQUIRED | Lister les demandes nécessite un espace de travail ou un formulaire pour délimiter la liste. |
| RECIPIENT_EMAIL_REQUIRED | La livraison par e-mail ou les rappels nécessitent recipient.email. |
| UPGRADE_REQUIRED | Le plan n'inclut pas la fonctionnalité — les rappels sont Pro ou Business, et un compte invité ne peut pas envoyer d'invitations par e-mail. |
| FREE_INVITATIONS_USED | Ce compte Free a épuisé ses 10 invitations gratuites, définitivement. Créez la demande avec "delivery": "none" et envoyez le lien vous-même, ou passez à Pro. |
| MONTHLY_ALLOWANCE_REACHED | L'espace de travail a épuisé son allocation du mois pour les soumissions et les demandes. Chaque demande coûte une unité à sa création, qu'elle soit répondue ou non. Les demandes déjà créées restent répondables ; les nouvelles attendent le 1er du mois (UTC) ou une mise à niveau. |
Agir sur une demande existante
| Raison | Que faire |
|---|---|
| REQUEST_NOT_FOUND | Aucune demande avec cet id dans un espace de travail que ce jeton peut atteindre. |
| REQUEST_NOT_PENDING | Déjà terminée, expirée, ou annulée. Vous ne pouvez pas relancer ou annuler une demande terminée. |
| REMINDER_TOO_SOON | Un rappel manuel a été envoyé il y a moins de dix minutes. details.retryAfterMs indique combien de temps attendre. |
| REMINDER_CAP_REACHED | Cette demande a déjà reçu les huit rappels qu'elle recevra jamais, manuels et planifiés confondus. |
| TEST_REQUEST | Vous avez demandé à formbase d'envoyer une demande test par e-mail. Rien n'est jamais envoyé pour une demande test — ouvrez son lien vous-même à la place. |
| REQUEST_NOT_TERMINAL | Vous avez demandé à rejouer un callback pour une demande encore en attente. Il n'y a rien à rejouer pour l'instant. |
| NO_CALLBACK_TO_REPLAY | La demande a été créée sans callbackUrl. |
| IDEMPOTENCY_CONFLICT | Cette clé a été utilisée pour un corps différent. Utilisez une nouvelle clé, ou envoyez à nouveau le corps original inchangé. |
L’invitation n’est jamais arrivée
Ouvrez la demande dans la page Demandes et lisez la chronologie. La première ligne d’invitation vous indique dans quel cas vous êtes.
| La chronologie dit | Ce que ça signifie | Que faire |
|---|---|---|
| Invitation en attente | Acceptée, pas encore envoyée. | Attendez une minute. Si ça reste en attente, vérifiez que la demande a un e-mail de destinataire. |
| Invitation livrée | Remise au fournisseur d'e-mail. | Demandez au destinataire de vérifier les spams. Envoyer depuis votre propre domaine aide — voir domaines e-mail personnalisés. |
| Invitation échouée | formbase n'a pas pu l'envoyer — ou le fournisseur l'a rejetée, ou le destinataire l'a marquée comme spam. | Lisez deliveryStatus sur requests.get : « failed » est généralement un problème de plan ou d'adresse, donc corrigez-le et envoyez un rappel, qui porte le même lien (sur Free, copiez le lien et envoyez-le vous-même). « bounced » signifie que l'adresse est fausse ou morte — créez une nouvelle demande pour la bonne adresse ; relancer n'aidera pas. |
Aucune entrée de chronologie du tout
Alors aucun e-mail n’a jamais été demandé. La demande a été créée avec delivery: “none” — livrez le lien vous-même, ou
créez une nouvelle demande avec delivery: “email”.
Les invitations et les rappels partagent un budget de dix e-mails par jour, par formulaire et par adresse de destinataire, et une demande n’envoie jamais plus de neuf e-mails à son destinataire au cours de sa vie — une invitation et jusqu’à huit rappels.
Le callback n’a jamais abouti
La section Callback du tiroir de la demande montre l’URL et le résultat. Callback échoué après N tentatives signifie que formbase a essayé et a abandonné — huit tentatives sur environ quatre heures.
Vérifiez l’URL. Elle est affichée dans le tiroir. L’URL de reprise d’un outil de workflow appartient à une seule exécution, et une exécution supprimée ou recréée ne répond plus dessus.
Vérifiez ce qu’a renvoyé votre point de terminaison. Tout ce qui sort de 2xx est un échec. Un 4xx autre que 408 ou 429 arrête immédiatement les nouvelles tentatives — formbase le lit comme « votre point de terminaison a rejeté ceci », et renvoyer les mêmes octets ne peut rien y changer.
Corrigez le récepteur, puis appuyez sur Rejouer. La même charge utile repart avec le même id d’événement, donc un récepteur qui déduplique ne risque rien.
La vérification de signature échoue ?
Presque toujours le corps brut. Si vous analysez le JSON et le re-sérialisez avant de le hacher, les octets diffèrent et la signature ne correspondra jamais. Hachez le corps exactement comme il est arrivé. L’autre cause fréquente est un secret de signature régénéré que le récepteur n’a pas encore récupéré — il n’y a pas de délai de grâce.
Autres situations rencontrées
Le destinataire dit que le lien affiche un avis, pas le formulaire. La demande est définitive — terminée, expirée, ou annulée. C’est la page de résultat. Créez une nouvelle demande s’il a besoin d’une nouvelle tentative.
Une automatisation a cessé de correspondre après une modification — une réponse a disparu du callback, ou
requests.createa commencé à refuser une clé avecUNKNOWN_FIELD_KEY. Une clé de champ publiée a disparu : quelqu’un l’a retapée, ou a supprimé la question et en a ajouté une nouvelle à sa place. Changer le titre est sûr ; aucun des deux autres cas ne l’est. Saisissez l’ancienne clé sur le champ (icône clé de la barre d’outils → Clés) et publiez à nouveau. La publication avertit avant que cela n’arrive — voir Quand une clé publiée est sur le point de disparaître.Le préremplissage d’un téléversement de fichier ou d’une signature est refusé. Ceux-ci ne peuvent pas être fournis par un appelant —
fields.listles marqueprefillable: false.Deux demandes sont apparues pour une même exécution de workflow. L’exécution a été retentée sans
idempotencyKey. Passez l’id d’exécution comme clé.