Jede NueForm-Webhook-Anfrage sendet eine JSON-Payload im Anfrage-Body. Diese Seite dokumentiert das vollständige Payload-Schema für jeden Ereignistyp.
Gemeinsame Struktur
Alle Webhook-Payloads teilen sich diese Felder auf oberster Ebene:
| Feld | Typ | Beschreibung |
|---|---|---|
event | string | Der Ereignistyp (z. B. form.submitted) |
formId | string | Die eindeutige ID des Formulars |
formTitle | string | Der Titel des Formulars zum Zeitpunkt der Übermittlung |
responseId | string | Die eindeutige ID der Response |
answers | array | Array von Antwortobjekten |
respondent | object oder null | Identität der angemeldeten befragten Person, wenn das Formular einen Login erforderte. null bei anonymen Übermittlungen. Siehe Identität der Befragten. |
submittedAt | string | ISO-8601-Zeitstempel des Ereignisversands |
form.submitted-Payload
Diese Payload wird gesendet, wenn eine befragte Person eine vollständige Formularantwort übermittelt.
Vollständiges Beispiel
{
"event": "form.submitted",
"formId": "507f1f77bcf86cd799439011",
"formTitle": "Customer Feedback Survey",
"responseId": "507f1f77bcf86cd799439022",
"answers": [
{
"questionId": "507f1f77bcf86cd799439033",
"value": "Jane Doe"
},
{
"questionId": "507f1f77bcf86cd799439044",
"value": "jane@example.com"
},
{
"questionId": "507f1f77bcf86cd799439055",
"value": 4
},
{
"questionId": "507f1f77bcf86cd799439066",
"value": "The onboarding flow was smooth and intuitive."
},
{
"questionId": "507f1f77bcf86cd799439077",
"value": ["Feature A", "Feature C"]
},
{
"questionId": "507f1f77bcf86cd799439088",
"value": true
}
],
"respondent": {
"id": "507f1f77bcf86cd799439016",
"name": "Jane Smith",
"email": "jane@example.com",
"auth_method": "sso"
},
"submittedAt": "2025-03-15T14:32:07.123Z"
}
Feldreferenz
Felder auf oberster Ebene
event --- string
Bei diesem Ereignistyp immer "form.submitted".
formId --- string
Die MongoDB-ObjectId des Formulars. Das ist ein 24-stelliger Hexadezimal-String.
formTitle --- string
Der menschenlesbare Titel des Formulars zum Zeitpunkt des Webhook-Versands. Beachte: Wenn du das Formular später umbenennst, enthalten bereits zugestellte Webhooks weiterhin den alten Titel.
responseId --- string
Die MongoDB-ObjectId der gespeicherten Response. Damit kannst du die vollständige Response über die Responses-API abrufen oder sie als Idempotenzschlüssel zum Deduplizieren von Webhook-Zustellungen verwenden.
submittedAt --- string
ISO-8601-Zeitstempel, der angibt, wann der Webhook versendet wurde. Er wird zum Versandzeitpunkt erzeugt und liegt sehr nah am submittedAt-Feld der Response in der Datenbank (ist aber nicht zwingend identisch).
respondent --- object oder null
Identität des angemeldeten Benutzers, der die Response übermittelt hat — nur enthalten, wenn das Formular einen Login erforderte (requireLogin: true). null bei allen anonymen Übermittlungen. Das vollständige Schema und Verhalten findest du unten unter Identität der Befragten.
Antwortobjekte
Jeder Eintrag im answers-Array steht für die Antwort auf eine einzelne Frage:
| Feld | Typ | Beschreibung |
|---|---|---|
questionId | string | Die MongoDB-ObjectId der Frage |
value | any | Die Antwort der befragten Person (Format je nach Fragetyp unterschiedlich) |
Antwortwerte nach Fragetyp
Das value-Feld in jedem Antwortobjekt hängt vom Fragetyp ab. Hier ist das Format für jeden Typ:
Texteingaben
| Fragetyp | Wertetyp | Beispiel |
|---|---|---|
short_text | string | "Jane Doe" |
long_text | string | "I really enjoyed the product..." |
email | string | "jane@example.com" |
phone | string | "+1 (555) 123-4567" |
number | number | 42 |
url | string | "https://example.com" |
Auswahlfragen
| Fragetyp | Wertetyp | Beispiel |
|---|---|---|
multiple_choice (einfach) | string | "Option A" |
multiple_choice (mehrfach) | array<string> | ["Option A", "Option C"] |
dropdown | string | "United States" |
yes_no | boolean | true |
picture_choice (einfach) | string | "choice_id_abc123" |
picture_choice (mehrfach) | array<string> | ["choice_id_abc123", "choice_id_def456"] |
Bei multiple_choice-Fragen ist der Wert ein einzelner String, wenn allowMultiple auf false steht, und ein String-Array, wenn allowMultiple auf true steht. Wählt die befragte Person die Option „Sonstiges", enthält das Array ihre Freitexteingabe als String.
Bewertungsfragen
| Fragetyp | Wertetyp | Beispiel | Wertebereich |
|---|---|---|---|
rating | number | 4 | 1 bis steps (Standard 5) |
opinion_scale | number | 7 | min bis max |
nps | number | 9 | 0 bis 10 |
Datum und Uhrzeit
| Fragetyp | Wertetyp | Beispiel |
|---|---|---|
date | string | "2025-03-15" |
Das Format des Datums-Strings entspricht der dateFormat-Eigenschaft der Frage (Standard: YYYY-MM-DD).
Rechtliches und Hinweistexte
| Fragetyp | Wertetyp | Beispiel |
|---|---|---|
legal | boolean | true |
statement | string | "" (immer leer --- Hinweistexte erfassen keine Daten) |
Ranking
| Fragetyp | Wertetyp | Beispiel |
|---|---|---|
ranking | array<string> | ["Speed", "Price", "Quality"] |
Das Array spiegelt die von der befragten Person gewählte Reihenfolge wider, vom ersten bis zum letzten Platz.
Matrix
| Fragetyp | Wertetyp | Beispiel |
|---|---|---|
matrix | object | { "Speed": "Satisfied", "Price": "Neutral" } |
Das Objekt ordnet jeder Zeilenbeschriftung die gewählte Spaltenbeschriftung zu.
Datei-Upload
| Fragetyp | Wertetyp | Beispiel |
|---|---|---|
file_upload | string | "https://storage.nueform.com/uploads/abc123.pdf" |
Der Wert ist die URL der hochgeladenen Datei im NueForm-Speicher.
Unterschrift und Zeichnung
| Fragetyp | Wertetyp | Beispiel |
|---|---|---|
signature | string | "data:image/png;base64,iVBOR..." |
drawing | string | "data:image/png;base64,iVBOR..." |
Beide liefern eine base64-codierte PNG-Data-URI des erfassten Bildes.
Aufnahme
| Fragetyp | Wertetyp | Beispiel |
|---|---|---|
recording | string | "https://storage.nueform.com/recordings/abc123.webm" |
Der Wert ist die URL der hochgeladenen Aufnahmedatei.
Zusammengesetzte Fragen
Zusammengesetzte Fragetypen (contact_info, address, question_group, multi_question_page) erzeugen mehrere Antworteinträge im answers-Array --- einen pro Teilfeld. Jede Teilfeld-Antwort verwendet die eigene questionId des Teilfelds.
Eine contact_info-Frage könnte zum Beispiel Folgendes erzeugen:
[
{ "questionId": "first_name", "value": "Jane" },
{ "questionId": "last_name", "value": "Doe" },
{ "questionId": "email", "value": "jane@example.com" },
{ "questionId": "phone_number", "value": "+1 555-0100" },
{ "questionId": "company", "value": "Acme Inc." }
]
Identität der Befragten
Wenn ein Formular mit requireLogin: true konfiguriert ist, ist jede angenommene Übermittlung an einen angemeldeten Benutzer gebunden. Webhook-Payloads legen diese Identität den Formularbesitzern über das respondent-Feld offen. Bei allen anderen Übermittlungen ist das Feld null.
Schema
{
"respondent": {
"id": "507f1f77bcf86cd799439016",
"name": "Jane Smith",
"email": "jane@example.com",
"auth_method": "sso"
}
}
| Feld | Typ | Beschreibung |
|---|---|---|
id | string | Die Benutzer-ID der befragten Person. |
name | string | Anzeigename des Kontos der befragten Person. |
email | string | E-Mail-Adresse des Kontos der befragten Person. |
auth_method | string | Entweder "sso" oder "login". "sso" bedeutet, die befragte Person ist per Single Sign-On Mitglied des Formular-Teams; "login" steht für jede andere unterstützte Authentifizierungsmethode. |
Wann respondent befüllt ist
respondent ist nur befüllt, wenn:
- das Formular
requireLoginauftruegesetzt hat, und - die übermittelnde Person sich vor dem Absenden angemeldet hat, weil das Formular es verlangte.
Wenn zusätzlich requireSsoLogin auf true steht, erreichen nur Benutzer den Absende-Schritt, die per SSO Mitglied des Formular-Teams sind — jedes befüllte respondent-Objekt hat dann auth_method: "sso".
Wann respondent null ist
Das Feld ist für berechenbares Parsen immer im JSON vorhanden und ist null, sobald einer dieser Punkte zutrifft:
- Das Formular erforderte keinen Login (
requireLoginwarfalse). - Die übermittelnde Person war anonym.
- Die Response wurde über den Einwilligungs-Flow nach dem Absenden gespeichert (die Aufforderung „Diese Antwort übernehmen"). Per Einwilligung gespeicherte Responses erscheinen in Webhook-Payloads niemals mit Identität — sie werden nur in der „Meine Antworten"-Ansicht der Person gespeichert und nicht an Webhook-Empfänger weitergegeben.
Webhook-Payloads legen die Identität nur für Befragte offen, die sich angemeldet haben, weil das Formular es verlangte. Identitäten aus der Einwilligung nach dem Absenden werden Webhooks bewusst vorenthalten, um die Grenze zwischen der Privatsphäre der Befragten und den Einblicken der Formularbesitzer zu wahren.
Quiz-Ergebnisse
Bei Formularen in einem Quiz-Modus (knowledge_quiz, lead_qualification oder match_quiz) enthält die gespeicherte Response ein quizResults-Objekt. Dieses Objekt ist nicht direkt in der Webhook-Payload enthalten, du kannst es aber über die Responses-API mit der responseId aus dem Webhook abrufen.
Das quizResults-Objekt hat folgende Struktur:
{
"formMode": "knowledge_quiz",
"score": 7,
"correctAnswers": 7,
"totalScorableQuestions": 10,
"maxScore": 10,
"matchedEndingId": "507f1f77bcf86cd799439099"
}
| Feld | Typ | Beschreibung |
|---|---|---|
formMode | string | Der Quiz-Modus: knowledge_quiz, lead_qualification oder match_quiz |
score | number | Die Gesamtpunktzahl der befragten Person |
correctAnswers | number | Anzahl der richtig beantworteten Fragen (nur Wissensquiz; 0 bei anderen Modi) |
totalScorableQuestions | number | Gesamtzahl der Fragen, die in die Punktzahl einfließen |
maxScore | number | Die maximal erreichbare Punktzahl |
matchedEndingId | string oder undefined | Die ID des Endscreens, der der befragten Person basierend auf ihrer Punktzahl angezeigt wurde |
endingTallies | object oder undefined | Nur Match-Quiz: ordnet jeder Endscreen-ID ihren Zählerstand zu |
Metadaten
Die gespeicherte Response kann außerdem ein metadata-Objekt mit versteckten Feldern enthalten, die über URL-Parameter übergeben wurden. Diese sind über die Responses-API verfügbar, aber nicht Teil der Webhook-Payload.
{
"hiddenFields": {
"utm_source": "google",
"utm_campaign": "spring_sale",
"user_id": "ext_12345"
}
}
Um die Metadaten einer per Webhook zugestellten Response abzurufen, hole sie über die responseId:
curl https://app.nueform.com/api/v1/forms/FORM_ID/responses/RESPONSE_ID \
-H "Authorization: Bearer nf_your_api_key"
HTTP-Header
Jede Webhook-Anfrage enthält diese HTTP-Header:
| Header | Wert |
|---|---|
Content-Type | application/json |
X-NueForm-Signature | HMAC-SHA256-Hex-Digest des rohen Anfrage-Bodys |
Wie du die Signatur validierst, erfährst du unter Verifizierung.
Payload-Größe
Webhook-Payloads sind in der Regel klein (unter 10 KB). Die Größe hängt vor allem von der Anzahl der Fragen und der Länge der Textantworten ab. Datei-Upload-Antworten enthalten URLs (keine Dateiinhalte) und vergrößern die Payload daher kaum.
Nächste Schritte
- Verifizierung --- Webhook-Signaturen validieren
- Testen --- Webhook-Payloads lokal testen
- Ereignisse --- Ereignistypen und Zustellgarantien