ওয়েবহুক

প্রতিটি জমা আসামাত্রই 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 হেডারে আর বডিতে, দুই জায়গাতেই। যেগুলো আপনি আগেই সামলেছেন সেগুলো টুকে রাখাই আপনার এন্ডপয়েন্টকে দুবার কল করার জন্য নিরাপদ করার সবচেয়ে সহজ উপায়।

টিপ

ওয়েবহুকটি যেকোনো রিকোয়েস্ট-পরিদর্শক এন্ডপয়েন্টের দিকে তাক করুন আর নিজের ফর্মটি একবার জমা দিন। আপনার ফর্ম ঠিক কী পেলোড বানায় তা নিজের ফিল্ড আইডিসহ দেখতে পাবেন। নিজের দিকের ম্যাপিং লেখার সবচেয়ে দ্রুত উপায় এটাই।