Setup
In your dashboard, open the quiz → “Settings” → “Integrations” → the Webhooks card. Enter the URL that will receive the POST request.
For testing, you can use webhook.site.
Important: your receiver must respond with a success HTTP status (200, 204 and so on).
Request format
Method:
Header:
Body:
POSTHeader:
Content-Type: application/jsonBody:
JSON
Existing fields stay as they are. New fields appear only when the lead has them, so integrations built for the earlier format keep working.
Full payload example
{
"id": 12345,
"quizId": 611,
"answers": [
{"q": "Question 1", "questionId": 10, "a": ["Option 2"]},
{"q": "Question 2", "questionId": 11, "a": ["Option 3"]}
],
"contacts": {
"name": "John",
"phone": "15551234567",
"email": "example@gmail.com",
"address": "Austin, 1 Example St",
"text": "I would like a consultation",
"messenger": {"type": "telegram", "value": "@username"},
"messengerName": "John"
},
"created": "17.08.2019 22:41",
"quizDurationSeconds": 95,
"result": {
"value": "15%",
"title": "Your discount",
"description": "Complete your request"
},
"extra": {
"href": "https://example.com/page",
"ref": "https://google.com",
"utm": {"utm_source": "google"},
"cookies": {
"_ga": "GA1.2.477745229.1562102022",
"_fbp": "fb.1.1562107156134.812542"
}
}
}
Top-level fields
| Field | Type | Description |
|---|---|---|
answers | array | Answers to the quiz questions |
contacts | object | Contact details |
created | string | Lead date in dd.mm.yyyy hh:mm format |
extra | object | UTM tags, cookies, page URL, referrer and discount |
result | object | null | Quiz result (discount and similar) |
id | number | Lead ID in LeadForms new |
quizId | number | Quiz ID new |
quizDurationSeconds | number | Time taken to complete the quiz, in seconds new |
answers[] fields
| Field | Description |
|---|---|
q | Question text |
questionId | Question ID |
a | Array of answers (strings) |
contacts fields
| Field | Description |
|---|---|
name | Name |
phone | Phone |
email | |
address | Address new |
text | Comment or free text new |
messenger | Messenger: {"type": "telegram", "value": "@username"} new |
messengerName | Name when the contact comes through a messenger new |
messenger.type values: telegram, whatsapp, viber, vk, messenger, instagram, teams, max, wechat, phone.result fields
| Field | Description |
|---|---|
value | Value (for example, the discount amount) |
title | Title |
description | Description |
extra fields
| Field | Description |
|---|---|
href | URL of the page the lead was sent from |
ref | Referrer |
utm | UTM tags (object) |
cookies | Cookies (object) |
discount | Discount, if the quiz has one set up |
Two-step contact form
If the quiz has a two-step contact form:
• The webhook fires when the lead is complete, with all steps collected.
• If someone fills in only the first step and doesn't come back, the lead may be sent about 60 seconds later with partial data.
Sample receiver in PHP
<?php
$data = json_decode(file_get_contents('php://input'), true);
$answers = $data['answers'] ?? [];
$contacts = $data['contacts'] ?? [];
$phone = $contacts['phone'] ?? null;
$email = $contacts['email'] ?? null;
$name = $contacts['name'] ?? ($contacts['messengerName'] ?? null);
$messenger = $contacts['messenger'] ?? null; // ['type' => 'telegram', 'value' => '@username']
$address = $contacts['address'] ?? null;
$comment = $contacts['text'] ?? null;
$createdDate = strtotime($data['created'] ?? 'now');
$utm = $data['extra']['utm'] ?? [];
$result = $data['result'] ?? null;
$quizDurationSeconds = $data['quizDurationSeconds'] ?? null;
$leadId = $data['id'] ?? null;
$quizId = $data['quizId'] ?? null;
// Your processing logic...
http_response_code(200);
exit;
Backward compatibility
Integrations that only read
answers, contacts.name/phone/email, created and extra keep working. Use the new fields (address, text, messenger, quizDurationSeconds, id, quizId, result) when you need them.