ওয়েবহুক
প্রতিটি জমা আসামাত্রই JSON হিসেবে আপনার নিজের একটি ঠিকানায় পাঠিয়ে দিন।
প্রতি রেসপন্সে একটি POST
উত্তর জমা হওয়ার সঙ্গে সঙ্গেই পাঠানো হয়, উত্তরদাতাকে অপেক্ষায় না রেখে।
স্থির একটি JSON কাঠামো
পাবলিক টাইপের নাম আর স্থায়ী ফিল্ড আইডি, তাই প্রশ্নের নাম বদলালেও আপনার কোড ভাঙে না।
10 সেকেন্ড, একটিই চেষ্টা
Fillio আপনার এন্ডপয়েন্টের জন্য দশ সেকেন্ড অপেক্ষা করে আর তারপর আর চেষ্টা করে না।
ওয়েবহুক চালু করা
ফর্মটি খুলুন, সেটিংস ট্যাবে যান আর ওয়েবহুক চালু করুন। যে ঠিকানায় জমাগুলো পৌঁছাবে সেটি পেস্ট করুন; আপনি লেখা থামানোর একটু পরেই Fillio সেটি সেভ করে আর পর্দায় জানিয়ে দেয়। প্রতিটি ফর্মে একটি ঠিকানা থাকে, আর টগলটি আবার বন্ধ করলে সেটি মুছে যায়।
ঠিকানাটি অবশ্যই HTTPS হতে হবে
Fillio কেবল https:// দিয়ে শুরু হওয়া ঠিকানাতেই কল করে। সেটিংসের ঘরটি http:// ঠিকানা নিয়ে নেয় বটে, কিন্তু সেখানে কখনও কল করা হয় না। ফলে সেভ হয়েছে বলে মনে হওয়া ওয়েবহুকটি নীরবে কিছুই পৌঁছে দেবে না।
কোনো ব্যক্তিগত নেটওয়ার্কের ভেতরের ঠিকানাও নেওয়া হয় না: 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 | ইভেন্টের নাম। FORM_RESPONSE-ই আজ পর্যন্ত Fillio-র পাঠানো একমাত্র মান। |
| 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 | এই ডেলিভারির জন্য একটি অনন্য আইডি। |
| eventType | সবসময় FORM_RESPONSE। |
| createdAt | রেসপন্সটি কখন জমা পড়েছে, UTC-তে ISO 8601 টাইমস্ট্যাম্প হিসেবে। |
| data.responseId | জমা হওয়া রেসপন্সটির আইডি। |
| data.formId | ফর্মের আইডি, যেটি তার পাবলিক লিংকেও থাকে। |
| data.formName | ফর্মের শিরোনাম, সাধারণ টেক্সট হিসেবে, কোনো ফরম্যাটিং ছাড়াই। |
| data.fields | উত্তর দেওয়া প্রতিটি প্রশ্নের জন্য একটি করে এন্ট্রি। |
fields-এর ভেতরে
প্রতিটি এন্ট্রিতে চারটি প্রপার্টি থাকে, আর অপশনওয়ালা প্রশ্নে থাকে পঞ্চম একটি।
| প্রপার্টি | বিবরণ |
|---|---|
| key | প্রশ্নটির স্থায়ী আইডি। লেখার প্রতিটি বদল সয়েও এটি টিকে থাকে, তাই লেবেল নয়, এটির সঙ্গেই মেলান। |
| label | প্রশ্নটি যেভাবে এডিটরে লেখা আছে। |
| type | প্রশ্নের ধরন, নিচের তালিকা থেকে নেওয়া। |
| value | উত্তরটি, সেই প্রশ্ন যে আকারে সেটি জমা রাখে সেই আকারে। |
| options | কেবল অপশনওয়ালা প্রশ্নে: প্রতিটি অপশনের আইডি ও লেখা, যাতে আপনি উত্তরটিকে আবার লেবেলে ফিরিয়ে নিতে পারেন। |
কেবল উত্তর দেওয়া প্রশ্নই আসে
উত্তরদাতা যে প্রশ্নটি ছুঁয়েও দেখেননি সেটি খালি মান হিসেবে না গিয়ে অ্যারে থেকেই বাদ থাকে, আর কন্ডিশনাল লজিকে লুকানো প্রশ্ন কখনওই আসে না। অবস্থান বা এন্ট্রির নির্দিষ্ট সংখ্যার উপর ভরসা না করে প্রতিটি উত্তর তার key দিয়ে খুঁজে নিন।
পছন্দের উত্তরে লেবেল নয়, আইডি থাকে
ড্রপডাউন বা মাল্টিপল চয়েসের উত্তর হলো বেছে নেওয়া অপশনটির আইডি, আর চেকবক্স, মাল্টি-সিলেক্ট বা র্যাঙ্কিং-এর উত্তর হলো অপশন আইডির একটি অ্যারে। একই এন্ট্রির options তালিকার সঙ্গে মিলিয়ে সেগুলো পড়ুন। র্যাঙ্কিং-এর উত্তর উত্তরদাতা যে ক্রমে আইটেমগুলো সাজিয়েছেন সেই ক্রমটিই ধরে রাখে।
Other অপশন
উত্তরদাতা যখন Other ঘরে কিছু লেখেন, মানটি কোনো অপশন আইডি নয়। সেটি হয় __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 | ড্রপডাউন | একটি অপশন আইডি |
| MULTIPLE_CHOICE | রেডিও | একটি অপশন আইডি |
| CHECKBOXES | চেকবক্স | অপশন আইডির একটি অ্যারে |
| MULTI_SELECT | মাল্টি-সিলেক্ট | অপশন আইডির একটি অ্যারে |
| RATING | স্টার রেটিং | একটি সংখ্যা |
| LINEAR_SCALE | লিনিয়ার স্কেল | একটি সংখ্যা |
| RANKING | র্যাংকিং | অপশন আইডির একটি অ্যারে, উত্তরদাতার সাজানো ক্রমে |
| FILE_UPLOAD | ফাইল আপলোড | একটি ডাউনলোড লিংক |
| SIGNATURE | স্বাক্ষর | একটি base64 PNG ডেটা URL |
আপনার এন্ডপয়েন্ট সাড়া না দিলে
Fillio দশ সেকেন্ড অপেক্ষা করে। টাইমআউট, কানেকশন এরর কিংবা 2xx-এর বাইরের যেকোনো স্ট্যাটাস ব্যর্থ ডেলিভারি হিসেবে গোনা হয়, আর সেখানেই শেষ: আবার চেষ্টা করা হয় না, ফিরে চালানোর মতো কোনো সারিও নেই।
রেসপন্সটির উপর এর কোনো প্রভাব পড়ে না। রিকোয়েস্ট পাঠানোর আগেই সেটি জমা হয়ে যায় আর আপনার এন্ডপয়েন্ট যা-ই করুক সেটি আপনার ড্যাশবোর্ডে থেকে যায়, তাই কোনো ডেলিভারি হারিয়ে গেলেও ড্যাশবোর্ডই পূর্ণ হিসাব থাকে।
কোনো স্বাক্ষর নেই
Fillio রিকোয়েস্টে স্বাক্ষর করে না আর কোনো শেয়ার্ড সিক্রেটও পাঠায় না, তাই কেবল বডি দেখে বোঝা যায় না সেটি কোথা থেকে এল। আপনার এন্ডপয়েন্টকে নিশ্চিত হতে হলে তাকে এমন একটি ঠিকানা দিন যা কেবল আপনিই জানেন: লম্বা, আন্দাজ করা যায় না এমন একটি পাথ বা কোয়েরি স্ট্রিং। আর অন্য কোথাও আসা সবকিছুকে অবিশ্বস্ত ধরুন।
প্রতিটি ডেলিভারির নিজস্ব ইভেন্ট আইডি থাকে, X-Fillio-Event-Id হেডারে আর বডিতে, দুই জায়গাতেই। যেগুলো আপনি আগেই সামলেছেন সেগুলো টুকে রাখাই আপনার এন্ডপয়েন্টকে দুবার কল করার জন্য নিরাপদ করার সবচেয়ে সহজ উপায়।
ওয়েবহুকটি যেকোনো রিকোয়েস্ট-পরিদর্শক এন্ডপয়েন্টের দিকে তাক করুন আর নিজের ফর্মটি একবার জমা দিন। আপনার ফর্ম ঠিক কী পেলোড বানায় তা নিজের ফিল্ড আইডিসহ দেখতে পাবেন। নিজের দিকের ম্যাপিং লেখার সবচেয়ে দ্রুত উপায় এটাই।