Anfragen
Fehlerbehebung bei Requests
Wo du nachsiehst, wenn ein Request abgelehnt wurde, eine Einladung nie ankam, oder ein Workflow noch auf einen Callback wartet, der bereits passiert ist.
Einen Fehler lesen
Jede Ablehnung trägt zwei Dinge: einen code für die Art des Fehlers, und einen details.reason für die konkrete
Ursache. Verzweige nach dem Code; lies den Grund, um zu wissen, was zu beheben ist. Wo es hilft, nennt details auch das
betroffene field, die Schlüssel, die akzeptiert worden wären, oder die Optionsschlüssel, die eine Auswahlfrage annimmt.
Die Request-Methoden verwenden vier Codes: VALIDATION_ERROR (der Aufruf war falsch), CONFLICT (der Request ist
im falschen Zustand, oder ein Idempotenz-Schlüssel wurde wiederverwendet), NOT_FOUND, und UPGRADE_REQUIRED (eine
Plan-Schranke oder das monatliche Kontingent). Ruft man zu schnell auf, kommt stattdessen RATE_LIMITED zurück, mit
retryAfterMs — siehe die Ratenbegrenzung.
{
"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"] }
}
}Gründe, die dir begegnen könnten
Den Aufruf richtig hinbekommen
| Grund | Was zu tun ist |
|---|---|
| FORM_NOT_PUBLISHED | Veröffentliche das Formular. Ein Request pinnt eine veröffentlichte Version, also muss es eine geben. |
| UNKNOWN_FIELD_KEY | Kein Feld mit diesem Schlüssel, oder er gehört in den anderen Bucket. Jeder Kontext-Schlüssel muss ein verstecktes Feld auf dem veröffentlichten Formular sein; sende frei formulierbare Schlüssel in metadata. Prüfe fields.list; validKeys listet die akzeptierten. |
| CONTEXT_KEY_NOT_HIDDEN_FIELD | Du hast eine sichtbare Frage — oder ein berechnetes Feld — in context gesendet. Sichtbare Fragen gehören in prefill; berechnete Felder lassen sich überhaupt nicht setzen. |
| INVALID_PREFILL_VALUE | Falsche Form für diesen Fragetyp. expectedType sagt, was erwartet wurde; bei Auswahlfragen sende den Optionsschlüssel, nicht das Label; eine Matrix nimmt { "row_key": "column_key" }. expectedType "not_prefillable" bedeutet, das Feld nimmt keinen Wert von einer aufrufenden Seite entgegen — eine Datei, Signatur, Zahlung, Terminbuchung oder ein berechnetes Feld. |
| READONLY_REQUIRES_PREFILL | Ein gesperrter Schlüssel hat keinen Wert. Jeder Schlüssel in readonly muss auch in prefill stehen. |
| READONLY_REQUIRED_EMPTY | Ein Pflichtfeld ist mit einem leeren Wert gesperrt — die empfangende Person könnte nie absenden. Liefere einen Wert oder sperre es nicht. |
| LANGUAGE_NOT_PUBLISHED | Diese Sprache ist auf der aktuellen Version nicht veröffentlicht. validKeys listet die, die es sind. |
| INVALID_REMINDER_SCHEDULE | Ein Offset konnte nicht gelesen werden, derselbe Offset kommt zweimal vor, oder es sind mehr als fünf Schritte. Verwende positive ganze Tage, Stunden oder Minuten: 2d, 12h, 30m. |
| EXPIRY_OUT_OF_RANGE | expiresAt liegt in der Vergangenheit oder mehr als 365 Tage in der Zukunft. |
| CALLBACK_URL_NOT_ALLOWED | Die URL ist nicht HTTPS, trägt Zugangsdaten, oder löst sich zu einer privaten Adresse auf. Localhost funktioniert nicht — nutze einen Tunnel. |
| DOMAIN_NOT_ALLOWED | Diese benutzerdefinierte Domain ist nicht aktiv oder gehört zu einem anderen Workspace. |
| INVALID_DOCUMENT_TARGET | Das Formular hat keinen Dokumente-Block, oder es hat mehr als einen und du hast mit field nicht angegeben, welchen. validKeys listet die Blockschlüssel. |
| DOCUMENT_NOT_UPLOADED | Der Upload wurde reserviert, aber die Bytes sind nie angekommen. Sende die Datei zuerst per PUT an ihre uploadUrl. |
| DOCUMENT_INVALID | Die hochgeladenen Bytes stimmen nicht mit der Größe, dem Typ oder dem sha256 überein, die documents.create angegeben hat, oder der Typ ist kein PDF oder Bild. |
| DOCUMENTS_TOO_MANY | Der Block würde mehr als 20 Dokumente zeigen, einschließlich der hinterlegten. |
| DOCUMENTS_TOO_LARGE | Ein Request darf insgesamt 100 MB an Dokumenten tragen, und 25 MB pro Dokument. |
| SCOPE_REQUIRED | Zum Auflisten von Requests wird ein Workspace oder ein Formular benötigt, auf das die Liste eingegrenzt wird. |
| RECIPIENT_EMAIL_REQUIRED | E-Mail-Zustellung oder Erinnerungen brauchen recipient.email. |
| UPGRADE_REQUIRED | Der Plan enthält das Feature nicht — Erinnerungen sind Pro oder Business, und ein Gastkonto kann keine Einladungen per E-Mail versenden. |
| FREE_INVITATIONS_USED | Dieses Free-Konto hat seine 10 kostenlosen Einladungen endgültig aufgebraucht. Erstelle den Request mit "delivery": "none" und sende den Link selbst, oder upgrade auf Pro. |
| MONTHLY_ALLOWANCE_REACHED | Der Workspace hat sein Kontingent für diesen Monat an Einreichungen und Requests aufgebraucht. Jeder Request kostet beim Erstellen eine Einheit, egal ob er beantwortet wird oder nicht. Bereits erstellte Requests bleiben beantwortbar; neue warten auf den 1. des Monats (UTC) oder ein Upgrade. |
Auf einen bestehenden Request einwirken
| Grund | Was zu tun ist |
|---|---|
| REQUEST_NOT_FOUND | Kein Request mit dieser ID in einem Workspace, den dieses Token erreichen kann. |
| REQUEST_NOT_PENDING | Bereits abgeschlossen, abgelaufen oder storniert. Du kannst einen fertigen Request nicht erinnern oder stornieren. |
| REMINDER_TOO_SOON | Eine manuelle Erinnerung ging vor weniger als zehn Minuten raus. details.retryAfterMs sagt, wie lange zu warten ist. |
| REMINDER_CAP_REACHED | Dieser Request hat bereits alle acht Erinnerungen erhalten, die er jemals bekommt, manuell und geplant zusammen. |
| TEST_REQUEST | Du hast formbase gebeten, eine Testanfrage per E-Mail zu versenden. Für eine solche wird nie etwas versendet — öffne ihren Link stattdessen selbst. |
| REQUEST_NOT_TERMINAL | Du hast versucht, einen Callback für einen Request wiederzuholen, der noch ausstehend ist. Es gibt noch nichts zu wiederholen. |
| NO_CALLBACK_TO_REPLAY | Der Request wurde ohne callbackUrl erstellt. |
| IDEMPOTENCY_CONFLICT | Dieser Schlüssel wurde für einen anderen Body verwendet. Nutze einen neuen Schlüssel, oder sende den ursprünglichen Body unverändert erneut. |
Die Einladung ist nie angekommen
Öffne den Request auf der Requests-Seite und lies die Timeline. Die erste Einladungszeile sagt dir, welcher Fall vorliegt.
| Die Timeline sagt | Was es bedeutet | Was zu tun ist |
|---|---|---|
| Einladung wartet in der Warteschlange | Angenommen, noch nicht gesendet. | Gib ihr eine Minute. Bleibt sie in der Warteschlange, prüfe, ob der Request eine Empfänger-E-Mail hat. |
| Einladung zugestellt | An den E-Mail-Anbieter übergeben. | Bitte sie, den Spam-Ordner zu prüfen. Vom eigenen Domain zu senden hilft — siehe benutzerdefinierte E-Mail-Domains. |
| Einladung fehlgeschlagen | formbase konnte sie nicht senden — oder der Anbieter hat sie zurückgewiesen, oder die empfangende Person hat sie als Spam markiert. | Lies deliveryStatus über requests.get: "failed" ist meist ein Plan- oder Adressproblem, also behebe es und sende eine Erinnerung, die denselben Link trägt (im Free-Plan kopiere den Link und sende ihn selbst). "bounced" bedeutet, die Adresse ist falsch oder tot — erstelle einen neuen Request für die richtige Adresse; eine Erinnerung an dieselbe hilft nicht. |
Gar kein Timeline-Eintrag
Dann wurde nie eine E-Mail angefordert. Der Request wurde mit delivery: “none” erstellt — liefere den Link entweder selbst
aus, oder erstelle einen neuen Request mit delivery: “email”.
Einladungen und Erinnerungen teilen sich ein Budget von zehn E-Mails pro Tag pro Formular und Empfängeradresse, und ein Request schickt seiner empfangenden Person höchstens neun E-Mails in seinem gesamten Leben — eine Einladung und bis zu acht Erinnerungen.
Der Callback ist nie angekommen
Der Abschnitt Callback in der Request-Detailansicht zeigt die URL und das Ergebnis. Callback nach N Versuchen fehlgeschlagen bedeutet, formbase hat es versucht und aufgegeben — acht Versuche über etwa vier Stunden.
Prüfe die URL. Sie wird in der Detailansicht angezeigt. Die Resume-URL eines Workflow-Tools gehört zu einem Lauf, und ein gelöschter oder neu erstellter Lauf antwortet darauf nicht mehr.
Prüfe, was dein Endpunkt zurückgegeben hat. Alles außerhalb von 2xx ist ein Fehlschlag. Ein 4xx außer 408 oder 429 stoppt die Wiederholungen sofort — formbase liest das als “dein Endpunkt hat das abgelehnt”, und dieselben Bytes erneut zu senden kann daran nichts ändern.
Behebe den Empfänger, dann drücke Erneut senden (Replay). Dasselbe Payload geht mit derselben Ereignis-ID erneut hinaus, sodass ein deduplizierender Empfänger sicher ist.
Signaturprüfung schlägt fehl?
Fast immer der rohe Body. Wenn du das JSON parst und vor dem Hashen neu serialisierst, unterscheiden sich die Bytes, und die Signatur stimmt nie überein. Hashe den Body exakt so, wie er ankam. Der andere häufige Grund ist ein neu generiertes Signaturgeheimnis, das der Empfänger noch nicht übernommen hat — es gibt keine Übergangsfrist.
Andere Dinge, auf die Leute stoßen
Die empfangende Person sagt, der Link zeigt einen Hinweis statt des Formulars. Der Request ist endgültig — abgeschlossen, abgelaufen oder storniert. Das ist die Ergebnisseite. Erstelle einen neuen Request, wenn sie es erneut versuchen soll.
Eine Automation hat nach einer Bearbeitung aufgehört zu passen — eine Antwort fehlte plötzlich im Callback, oder
requests.createfing an, einen Schlüssel mitUNKNOWN_FIELD_KEYabzulehnen. Ein veröffentlichter Feldschlüssel ist verschwunden: Jemand hat ihn neu getippt, oder die Frage gelöscht und an ihrer Stelle eine neue hinzugefügt. Umbenennen des Titels ist sicher; beides davon nicht. Tippe den alten Schlüssel auf das Feld (Schlüssel-Symbol in der Symbolleiste → Schlüssel) und veröffentliche erneut. Die Veröffentlichung warnt, bevor das passiert — siehe Wenn ein veröffentlichter Schlüssel gleich verschwindet.Prefill für einen Datei-Upload oder eine Signatur wird abgelehnt. Diese können nicht von einer aufrufenden Seite geliefert werden —
fields.listmarkiert sie mitprefillable: false.Zwei Requests sind für einen Workflow-Lauf entstanden. Der Lauf wurde ohne
idempotencyKeywiederholt. Übergib die Ausführungs-ID als Schlüssel.