Fillioเอกสาร

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-IdUUID ใหม่สำหรับการส่งครั้งนี้ ซึ่งซ้ำอยู่ในเนื้อหาในชื่อ 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
      }
    ]
  }
}
พร็อพเพอร์ตีคำอธิบาย
eventIdID เฉพาะของการส่งครั้งนี้
eventTypeเป็น FORM_RESPONSE เสมอ
createdAtเวลาที่การตอบกลับถูกส่ง เป็น timestamp แบบ ISO 8601 ในเขตเวลา UTC
data.responseIdID ของการตอบกลับที่บันทึกไว้
data.formIdID ของฟอร์ม ตัวเดียวกับที่ปรากฏในลิงก์สาธารณะของมัน
data.formNameชื่อฟอร์มในรูปข้อความล้วน โดยตัดการจัดรูปแบบออกทั้งหมด
data.fieldsหนึ่งรายการต่อหนึ่งคำถามที่ถูกตอบ

ภายใน fields

ทุกรายการมีสี่พร็อพเพอร์ตี และคำถามที่มีตัวเลือกจะมีตัวที่ห้าเพิ่ม

พร็อพเพอร์ตีคำอธิบาย
keyID ถาวรของคำถาม มันอยู่รอดทุกการแก้ถ้อยคำ จึงควรจับคู่ด้วยค่านี้แทนที่จะใช้ป้ายคำถาม
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 ฟิลด์ของคุณเองอยู่ในนั้น เป็นวิธีที่เร็วที่สุดในการเขียนตัวจับคู่ฝั่งคุณ