Toda requisição de webhook do NueForm envia um payload JSON no corpo da requisição. Esta página documenta o schema completo do payload para cada tipo de evento.
Estrutura comum
Todos os payloads de webhook compartilham estes campos de nível superior:
| Campo | Tipo | Descrição |
|---|---|---|
event | string | O tipo do evento (por exemplo, form.submitted) |
formId | string | O ID único do formulário |
formTitle | string | O título do formulário no momento do envio |
responseId | string | O ID único da resposta |
answers | array | Array de objetos de resposta |
respondent | object ou null | Identidade do respondente logado, quando o formulário exigia login. null para envios anônimos. Veja Identidade do respondente. |
submittedAt | string | Timestamp ISO 8601 de quando o evento foi despachado |
Payload de form.submitted
Este é o payload enviado quando um respondente envia uma resposta completa de formulário.
Exemplo completo
{
"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"
}
Referência de campos
Campos de nível superior
event --- string
Sempre "form.submitted" para este tipo de evento.
formId --- string
O ObjectId do MongoDB do formulário. É uma string hexadecimal de 24 caracteres.
formTitle --- string
O título legível do formulário no momento em que o webhook dispara. Observe que, se você renomear o formulário depois, os webhooks já entregues continuarão contendo o título antigo.
responseId --- string
O ObjectId do MongoDB da resposta armazenada. Você pode usá-lo para buscar a resposta completa pela API de Respostas ou como chave de idempotência para desduplicar entregas de webhook.
submittedAt --- string
Timestamp ISO 8601 indicando quando o webhook foi despachado. Ele é gerado no momento do despacho e será muito próximo (mas não necessariamente idêntico) ao campo submittedAt da resposta no banco de dados.
respondent --- object ou null
Identidade do usuário logado que enviou a resposta, exposta apenas quando o formulário exigia login (requireLogin: true). null para todos os envios anônimos. Veja Identidade do respondente abaixo para o schema completo e o comportamento.
Objetos de resposta
Cada entrada no array answers representa a resposta de uma única pergunta:
| Campo | Tipo | Descrição |
|---|---|---|
questionId | string | O ObjectId do MongoDB da pergunta |
value | any | A resposta do respondente (o formato varia conforme o tipo de pergunta) |
Valores de resposta por tipo de pergunta
O campo value de cada objeto de resposta varia de acordo com o tipo de pergunta. Este é o formato para cada tipo:
Entradas de texto
| Tipo de pergunta | Tipo do valor | Exemplo |
|---|---|---|
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" |
Perguntas de escolha
| Tipo de pergunta | Tipo do valor | Exemplo |
|---|---|---|
multiple_choice (única) | string | "Option A" |
multiple_choice (múltipla) | array<string> | ["Option A", "Option C"] |
dropdown | string | "United States" |
yes_no | boolean | true |
picture_choice (única) | string | "choice_id_abc123" |
picture_choice (múltipla) | array<string> | ["choice_id_abc123", "choice_id_def456"] |
Para perguntas multiple_choice, o valor é uma única string quando allowMultiple é false e um array de strings quando allowMultiple é true. Se o respondente selecionar a opção "Other", o array conterá o texto livre digitado por ele como uma string.
Perguntas de avaliação
| Tipo de pergunta | Tipo do valor | Exemplo | Intervalo |
|---|---|---|---|
rating | number | 4 | 1 a steps (padrão 5) |
opinion_scale | number | 7 | min a max |
nps | number | 9 | 0 a 10 |
Data e hora
| Tipo de pergunta | Tipo do valor | Exemplo |
|---|---|---|
date | string | "2025-03-15" |
O formato da string de data corresponde à propriedade dateFormat configurada na pergunta (o padrão é YYYY-MM-DD).
Legal e declarações
| Tipo de pergunta | Tipo do valor | Exemplo |
|---|---|---|
legal | boolean | true |
statement | string | "" (sempre vazio --- declarações não coletam dados) |
Ranking
| Tipo de pergunta | Tipo do valor | Exemplo |
|---|---|---|
ranking | array<string> | ["Speed", "Price", "Quality"] |
O array reflete a ordem escolhida pelo respondente, do primeiro ao último.
Matriz
| Tipo de pergunta | Tipo do valor | Exemplo |
|---|---|---|
matrix | object | { "Speed": "Satisfied", "Price": "Neutral" } |
O objeto mapeia os rótulos das linhas para o rótulo da coluna selecionada em cada linha.
Upload de arquivo
| Tipo de pergunta | Tipo do valor | Exemplo |
|---|---|---|
file_upload | string | "https://storage.nueform.com/uploads/abc123.pdf" |
O valor é a URL do arquivo enviado no armazenamento do NueForm.
Assinatura e desenho
| Tipo de pergunta | Tipo do valor | Exemplo |
|---|---|---|
signature | string | "data:image/png;base64,iVBOR..." |
drawing | string | "data:image/png;base64,iVBOR..." |
Ambos retornam um data URI PNG codificado em base64 da imagem capturada.
Gravação
| Tipo de pergunta | Tipo do valor | Exemplo |
|---|---|---|
recording | string | "https://storage.nueform.com/recordings/abc123.webm" |
O valor é a URL do arquivo de gravação enviado.
Perguntas compostas
Tipos de pergunta compostos (contact_info, address, question_group, multi_question_page) produzem múltiplas entradas de resposta no array answers --- uma para cada subcampo. A resposta de cada subcampo usa o próprio questionId do subcampo.
Por exemplo, uma pergunta contact_info pode produzir:
[
{ "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." }
]
Identidade do respondente
Quando um formulário é configurado com requireLogin: true, todo envio aceito fica vinculado a um usuário autenticado. Os payloads de webhook expõem essa identidade aos donos do formulário através do campo respondent. Para todos os outros envios, o campo é null.
Schema
{
"respondent": {
"id": "507f1f77bcf86cd799439016",
"name": "Jane Smith",
"email": "jane@example.com",
"auth_method": "sso"
}
}
| Campo | Tipo | Descrição |
|---|---|---|
id | string | O ID de usuário do respondente. |
name | string | Nome de exibição na conta do respondente. |
email | string | Endereço de e-mail na conta do respondente. |
auth_method | string | "sso" ou "login". "sso" indica que o respondente é membro da equipe do formulário via Single Sign-On; "login" indica qualquer outro método de autenticação compatível. |
Quando respondent é preenchido
respondent é preenchido apenas quando:
- O formulário tem
requireLogindefinido comotrue, e - Quem enviou fez login porque o formulário exigia antes de enviar.
Quando requireSsoLogin também é true, apenas usuários que são membros da equipe do formulário via SSO conseguem chegar à etapa de envio, então todo respondent preenchido terá auth_method: "sso".
Quando respondent é null
O campo está sempre presente no JSON para um parsing previsível no destino, e é null sempre que qualquer uma destas condições for verdadeira:
- O formulário não exigia login (
requireLoginerafalse). - Quem enviou era anônimo.
- A resposta foi salva pelo fluxo de consentimento pós-envio (o prompt de "claim this response"). Respostas salvas por consentimento nunca aparecem nos payloads de webhook com identidade anexada — elas são armazenadas apenas na visualização "My Responses" do usuário e não são expostas aos receptores de webhook.
Os payloads de webhook só expõem a identidade de respondentes que fizeram login porque o formulário exigia. Identidades coletadas via consentimento pós-envio são intencionalmente omitidas dos webhooks para respeitar o limite entre a privacidade do respondente e a visibilidade do dono do formulário.
Resultados de questionário
Para formulários em modo de questionário (knowledge_quiz, lead_qualification ou match_quiz), a resposta armazenada inclui um objeto quizResults. Embora esse objeto não seja incluído diretamente no payload do webhook, você pode obtê-lo pela API de Respostas usando o responseId do webhook.
O objeto quizResults tem a seguinte estrutura:
{
"formMode": "knowledge_quiz",
"score": 7,
"correctAnswers": 7,
"totalScorableQuestions": 10,
"maxScore": 10,
"matchedEndingId": "507f1f77bcf86cd799439099"
}
| Campo | Tipo | Descrição |
|---|---|---|
formMode | string | O modo do questionário: knowledge_quiz, lead_qualification ou match_quiz |
score | number | A pontuação total do respondente |
correctAnswers | number | Número de perguntas respondidas corretamente (apenas questionário de conhecimento; 0 para os outros modos) |
totalScorableQuestions | number | Número total de perguntas que contribuem para a pontuação |
maxScore | number | A pontuação máxima possível |
matchedEndingId | string ou undefined | O ID da tela final mostrada ao respondente com base na pontuação |
endingTallies | object ou undefined | Apenas questionário de compatibilidade: mapeia cada ID de tela final para sua contagem |
Metadados
A resposta armazenada também pode incluir um objeto metadata contendo campos ocultos passados via parâmetros de URL. Ele está disponível pela API de Respostas, mas não é incluído no payload do webhook.
{
"hiddenFields": {
"utm_source": "google",
"utm_campaign": "spring_sale",
"user_id": "ext_12345"
}
}
Para acessar os metadados de uma resposta entregue via webhook, busque-a usando o responseId:
curl https://app.nueform.com/api/v1/forms/FORM_ID/responses/RESPONSE_ID \
-H "Authorization: Bearer nf_your_api_key"
Cabeçalhos HTTP
Toda requisição de webhook inclui estes cabeçalhos HTTP:
| Cabeçalho | Valor |
|---|---|
Content-Type | application/json |
X-NueForm-Signature | Digest hexadecimal HMAC-SHA256 do corpo bruto da requisição |
Consulte Verificação para saber como validar a assinatura.
Tamanho do payload
Os payloads de webhook costumam ser pequenos (menos de 10 KB). O tamanho depende principalmente do número de perguntas e do comprimento das respostas de texto. Respostas de upload de arquivo contêm URLs (não o conteúdo dos arquivos), então não aumentam significativamente o tamanho do payload.
Próximos passos
- Verificação --- Valide assinaturas de webhook
- Testes --- Teste payloads de webhook localmente
- Eventos --- Tipos de evento e garantias de entrega