Webhook
ส่งทุกการตอบกลับไปยังที่อยู่ของคุณเองในรูปแบบ 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 ปลายทางของคุณต้องเข้าถึงได้จากอินเทอร์เน็ตสาธารณะ
ตัวคำขอ
เป็น POST ที่มีเนื้อหาเป็น JSON พร้อมเฮดเดอร์สี่ตัวเดินทางไปด้วย
| เฮดเดอร์ | คำอธิบาย |
|---|---|
| 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 | ID เฉพาะของการส่งครั้งนี้ |
| eventType | เป็น FORM_RESPONSE เสมอ |
| createdAt | เวลาที่การตอบกลับถูกส่ง เป็น timestamp แบบ ISO 8601 ในเขตเวลา UTC |
| 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 ส่วนคำตอบแบบลายเซ็นคือ data URL ของ PNG แบบ base64 ซึ่งคุณบันทึกหรือแสดงผลได้ทันที
ประเภทฟิลด์
ประเภทเป็นชื่อสาธารณะที่คงที่ การเปลี่ยนแปลงภายใน Fillio จึงไม่กระทบการเชื่อมต่อของคุณ อะไรที่ Fillio จับคู่ไม่ได้จะมาเป็น INPUT_TEXT
| ประเภท | คำถาม | ค่า |
|---|---|---|
| INPUT_TEXT | คำตอบสั้น | ข้อความ |
| TEXTAREA | คำตอบยาว | ข้อความ |
| INPUT_EMAIL | อีเมล | ข้อความ |
| INPUT_PHONE_NUMBER | หมายเลขโทรศัพท์ | ข้อความ |
| INPUT_NUMBER | ตัวเลข | ตัวเลขในรูปข้อความ ตรงตามที่พิมพ์เข้ามา |
| INPUT_LINK | ลิงก์ | ข้อความ |
| INPUT_DATE | วันที่ | วันที่ ในรูปแบบ YYYY-MM-DD |
| INPUT_TIME | เวลา | เวลา ในรูปแบบ HH:MM ตามนาฬิกา 24 ชั่วโมง |
| DROPDOWN | ดรอปดาวน์ | ID ตัวเลือกหนึ่งค่า |
| MULTIPLE_CHOICE | เรดิโอ | ID ตัวเลือกหนึ่งค่า |
| CHECKBOXES | ช่องทำเครื่องหมาย | อาร์เรย์ของ ID ตัวเลือก |
| MULTI_SELECT | เลือกหลายรายการ | อาร์เรย์ของ ID ตัวเลือก |
| RATING | การให้คะแนนดาว | ตัวเลข |
| LINEAR_SCALE | มาตราส่วนเชิงเส้น | ตัวเลข |
| RANKING | การจัดอันดับ | อาร์เรย์ของ ID ตัวเลือก เรียงตามลำดับของผู้ตอบ |
| FILE_UPLOAD | อัปโหลดไฟล์ | ลิงก์ดาวน์โหลด |
| SIGNATURE | ลายเซ็น | data URL ของ PNG แบบ base64 |
ถ้าปลายทางของคุณไม่ตอบ
Fillio รอสิบวินาที การหมดเวลา ข้อผิดพลาดของการเชื่อมต่อ หรือสถานะใดที่อยู่นอกช่วง 2xx ถือว่าส่งไม่สำเร็จ และจบแค่นั้น ไม่มีการลองใหม่และไม่มีคิวให้ย้อนส่ง
ตัวการตอบกลับเองไม่ได้รับผลกระทบใด มันถูกบันทึกก่อนที่คำขอจะถูกส่ง และยังอยู่ในแดชบอร์ดของคุณไม่ว่าปลายทางจะเป็นอย่างไร แดชบอร์ดจึงยังเป็นบันทึกที่ครบถ้วนแม้การส่งครั้งหนึ่งจะหายไป
ไม่มีลายเซ็นกำกับ
Fillio ไม่เซ็นคำขอและไม่ส่งความลับร่วมใด เนื้อหาเพียงลำพังจึงพิสูจน์ไม่ได้ว่ามาจากไหน ถ้าปลายทางของคุณต้องมั่นใจ ให้ตั้งที่อยู่ที่มีแต่คุณรู้ คือ path หรือ query string ที่ยาวและเดาไม่ได้ แล้วถือว่าอะไรที่มาถึงที่อื่นคือสิ่งที่เชื่อถือไม่ได้
การส่งแต่ละครั้งมี event ID ของตัวเอง ทั้งในเฮดเดอร์ X-Fillio-Event-Id และในเนื้อหา การจดจำ ID ที่คุณจัดการไปแล้วคือวิธีที่ง่ายที่สุดที่จะทำให้ปลายทางของคุณปลอดภัยแม้ถูกเรียกซ้ำ
ชี้ webhook ไปที่บริการตรวจสอบคำขอสักที่ แล้วส่งฟอร์มของคุณเองหนึ่งครั้ง คุณจะเห็นเพย์โหลดจริงที่ฟอร์มของคุณสร้าง พร้อม ID ฟิลด์ของคุณเองอยู่ในนั้น เป็นวิธีที่เร็วที่สุดในการเขียนตัวจับคู่ฝั่งคุณ