Webhooks
हर सबमिशन को, आते ही, JSON के रूप में अपने किसी पते पर भेजें।
हर रिस्पॉन्स पर एक POST
जवाब सेव होते ही भेजा जाता है, बिना जवाब देने वाले को इंतज़ार कराए।
एक स्थिर JSON ढाँचा
सार्वजनिक टाइप नाम और स्थायी फ़ील्ड ID, इसलिए सवाल का नाम बदलने से आपका कोड कभी नहीं टूटता।
10 सेकंड, एक ही कोशिश
Fillio आपके एंडपॉइंट का दस सेकंड इंतज़ार करता है और उसके बाद दोबारा कोशिश नहीं करता।
Webhook चालू करना
फ़ॉर्म खोलें, सेटिंग्स टैब पर जाएँ और Webhook चालू करें। वह पता चिपकाएँ जिस पर सबमिशन जाने चाहिए; टाइप करना रुकते ही Fillio उसे सेव कर लेता है और स्क्रीन पर पुष्टि दिखा देता है। हर फ़ॉर्म पर एक पता रहता है, और टॉगल वापस बंद करने पर वह मिट जाता है।
पता HTTPS ही होना चाहिए
Fillio सिर्फ़ उन्हीं पतों को कॉल करता है जो https:// से शुरू होते हैं। http:// वाला पता सेटिंग्स की फ़ील्ड ले तो लेती है, पर उसे कभी कॉल नहीं किया जाता, यानी सेव दिखने वाला webhook चुपचाप कुछ भी नहीं भेजेगा।
प्राइवेट नेटवर्क के अंदर इशारा करने वाले पते भी मना कर दिए जाते हैं: 10.x, 127.x, 169.254.x, 172.16-31.x या 192.168.x पर मौजूद कोई भी होस्ट, कोई भी IPv6 पता, और ऐसा हर नाम जो localhost हो या .local या .internal पर ख़त्म होता हो। आपका एंडपॉइंट सार्वजनिक इंटरनेट से पहुँच में होना चाहिए।
रिक्वेस्ट
JSON बॉडी के साथ एक POST। उसके साथ चार हेडर आते हैं।
| हेडर | विवरण |
|---|---|
| Content-Type: application/json | बॉडी हमेशा JSON होती है। |
| User-Agent: Fillio Webhooks/1.0 | कॉल करने वाले की पहचान Fillio के रूप में कराता है, जो तब काम आता है जब एक ही एंडपॉइंट कई सेवाओं को सुन रहा हो। |
| X-Fillio-Event: FORM_RESPONSE | इवेंट का नाम। आज Fillio सिर्फ़ FORM_RESPONSE भेजता है। |
| X-Fillio-Event-Id | इस डिलीवरी के लिए एक नया UUID, जो बॉडी में eventId के रूप में दोहराया जाता है। |
पेलोड
इवेंट बताने वाला एक लिफ़ाफ़ा, और रिस्पॉन्स बताने वाला एक data ऑब्जेक्ट।
{
"eventId": "8f2c1d7a-4b09-4e5c-9a13-6d0f8b2e77c4",
"eventType": "FORM_RESPONSE",
"createdAt": "2026-08-26T09:14:22.481Z",
"data": {
"responseId": "Qh3Rk9wZm1sVtY7cN2xP",
"formId": "7bTn4Kq2Wx",
"formName": "Workshop signup",
"createdAt": "2026-08-26T09:14:22.481Z",
"fields": [
{
"key": "V1StGXR8_Z5jdHi6B-myT",
"label": "Full name",
"type": "INPUT_TEXT",
"value": "Mira Kaya"
},
{
"key": "kM4pQz7LxAe2Rn0BsTvUw",
"label": "Which session?",
"type": "MULTIPLE_CHOICE",
"value": "c9XbNf3JdQ",
"options": [
{ "id": "c9XbNf3JdQ", "text": "Morning" },
{ "id": "eR2mYt8KpL", "text": "Afternoon" }
]
},
{
"key": "zA6cWn1FyH4tXd9QrLbEs",
"label": "How likely are you to recommend us?",
"type": "LINEAR_SCALE",
"value": 9
}
]
}
}| प्रॉपर्टी | विवरण |
|---|---|
| eventId | इस डिलीवरी की अनोखी ID। |
| eventType | हमेशा FORM_RESPONSE। |
| createdAt | रिस्पॉन्स कब सबमिट हुआ, UTC में ISO 8601 टाइमस्टैम्प के रूप में। |
| data.responseId | सेव किए गए रिस्पॉन्स की ID। |
| data.formId | फ़ॉर्म की ID, वही जो उसके सार्वजनिक लिंक में दिखती है। |
| data.formName | फ़ॉर्म का शीर्षक सादे टेक्स्ट में, बिना किसी फ़ॉर्मैटिंग के। |
| data.fields | हर भरे हुए सवाल के लिए एक एंट्री। |
fields के अंदर
हर एंट्री में चार प्रॉपर्टी होती हैं, और विकल्पों वाले सवाल में एक पाँचवीं भी।
| प्रॉपर्टी | विवरण |
|---|---|
| key | सवाल की स्थायी ID। शब्द कितने भी बदलें, यह वैसी ही रहती है, इसलिए मिलान लेबल से नहीं, इसी से करें। |
| label | सवाल, जैसा एडिटर में लिखा गया है। |
| type | सवाल का टाइप, नीचे दी गई सूची में से। |
| value | जवाब, उसी रूप में जिसमें वह सवाल उसे सेव करता है। |
| options | सिर्फ़ विकल्पों वाले सवालों पर: हर विकल्प की ID और टेक्स्ट, ताकि आप जवाब को वापस लेबल में बदल सकें। |
सिर्फ़ भरे हुए सवाल आते हैं
जिस सवाल को जवाब देने वाले ने छुआ ही नहीं, वह खाली मान के रूप में भेजे जाने के बजाय ऐरे में होता ही नहीं, और कंडीशनल लॉजिक से छिपा सवाल तो कभी दिखता ही नहीं। हर जवाब को उसकी key से ढूँढ़ें, स्थान या एंट्री की तय संख्या पर भरोसा न करें।
विकल्प वाले जवाबों में ID आती है, लेबल नहीं
ड्रॉपडाउन या मल्टिपल चॉइस का जवाब चुने हुए विकल्प की ID होता है, और चेकबॉक्स, मल्टी-सिलेक्ट या रैंकिंग का जवाब विकल्प ID का ऐरे। उन्हें उसी एंट्री की options सूची से मिलाएँ। रैंकिंग का जवाब वही क्रम रखता है जो जवाब देने वाले ने आइटम को दिया था।
“अन्य” विकल्प
जब जवाब देने वाला “अन्य” बॉक्स में कुछ लिखता है, तो मान कोई विकल्प ID नहीं होता, बल्कि __OTHER__: के बाद उसका लिखा हुआ टेक्स्ट होता है। जवाब पढ़ने के लिए यह उपसर्ग हटा दें।
"value": "__OTHER__:Heard about it from a friend"फ़ाइलें और हस्ताक्षर
फ़ाइल अपलोड का जवाब Fillio के स्टोरेज में रखी फ़ाइल का डाउनलोड लिंक होता है। हस्ताक्षर का जवाब base64 PNG डेटा URL होता है, जिसे आप सीधे सेव या प्रदर्शित कर सकते हैं।
फ़ील्ड टाइप
टाइप एक स्थिर सार्वजनिक नाम है, इसलिए Fillio के अंदर हुआ कोई बदलाव आपके इंटीग्रेशन तक कभी नहीं पहुँचता। जिसे Fillio मैप नहीं कर पाता, वह INPUT_TEXT के रूप में आता है।
| टाइप | सवाल | मान |
|---|---|---|
| INPUT_TEXT | लघु उत्तर | टेक्स्ट |
| TEXTAREA | दीर्घ उत्तर | टेक्स्ट |
| INPUT_EMAIL | ईमेल | टेक्स्ट |
| INPUT_PHONE_NUMBER | फ़ोन नंबर | टेक्स्ट |
| INPUT_NUMBER | संख्या | संख्या, टेक्स्ट के रूप में, ठीक वैसे ही जैसे टाइप की गई थी |
| INPUT_LINK | लिंक | टेक्स्ट |
| INPUT_DATE | तारीख़ | तारीख़, YYYY-MM-DD के रूप में |
| INPUT_TIME | समय | समय, 24 घंटे की घड़ी पर HH:MM के रूप में |
| DROPDOWN | ड्रॉपडाउन | एक विकल्प ID |
| MULTIPLE_CHOICE | रेडियो | एक विकल्प ID |
| CHECKBOXES | चेकबॉक्स | विकल्प ID का एक ऐरे |
| MULTI_SELECT | मल्टी-सेलेक्ट | विकल्प ID का एक ऐरे |
| RATING | स्टार रेटिंग | एक संख्या |
| LINEAR_SCALE | लीनियर स्केल | एक संख्या |
| RANKING | रैंकिंग | विकल्प ID का एक ऐरे, जवाब देने वाले के क्रम में |
| FILE_UPLOAD | फ़ाइल अपलोड | एक डाउनलोड लिंक |
| SIGNATURE | हस्ताक्षर | एक base64 PNG डेटा URL |
अगर आपका एंडपॉइंट जवाब न दे
Fillio दस सेकंड इंतज़ार करता है। टाइमआउट, कनेक्शन की गड़बड़ी या 2xx से बाहर का कोई भी स्टेटस नाकाम डिलीवरी मानी जाती है, और बात वहीं ख़त्म: न कोई दोबारा कोशिश, न कोई कतार जिससे दोबारा भेजा जा सके।
इससे रिस्पॉन्स पर कोई असर नहीं पड़ता। वह रिक्वेस्ट भेजने से पहले ही सेव हो जाता है और आपके डैशबोर्ड में बना रहता है, आपका एंडपॉइंट चाहे कुछ भी करे। इसलिए कोई डिलीवरी खो भी जाए तो डैशबोर्ड पूरा रिकॉर्ड रहता है।
कोई सिग्नेचर नहीं होता
Fillio रिक्वेस्ट पर हस्ताक्षर नहीं करता और कोई साझा सीक्रेट नहीं भेजता, इसलिए अकेली बॉडी यह साबित नहीं करती कि वह कहाँ से आई है। अगर आपके एंडपॉइंट को पक्का जानना ज़रूरी है, तो उसे ऐसा पता दें जो सिर्फ़ आप जानते हों: लंबा, अंदाज़ा न लगने वाला पाथ या क्वेरी स्ट्रिंग। कहीं और आने वाली हर चीज़ को अविश्वसनीय मानें।
हर डिलीवरी अपनी इवेंट ID साथ लाती है, X-Fillio-Event-Id हेडर में भी और बॉडी में भी। जो ID आप पहले संभाल चुके हैं उन्हें दर्ज रखना ही अपने एंडपॉइंट को दो बार कॉल के लिए सुरक्षित बनाने का सबसे आसान तरीका है।
webhook को किसी भी रिक्वेस्ट-इंस्पेक्शन एंडपॉइंट पर लगाएँ और अपना फ़ॉर्म एक बार खुद भरें। आपको ठीक वही पेलोड दिखेगा जो आपका फ़ॉर्म बनाता है, आपकी अपनी फ़ील्ड ID के साथ। अपनी तरफ़ की मैपिंग लिखने का यही सबसे तेज़ तरीका है।