Webhook
Kirim setiap pengiriman ke alamat milik Anda sendiri, dalam bentuk JSON, begitu ia masuk.
Satu POST per respons
Dikirim segera setelah jawaban tersimpan, tanpa membuat responden menunggu.
Bentuk JSON yang stabil
Nama jenis publik dan ID bidang permanen, jadi mengganti nama pertanyaan tidak pernah merusak kode Anda.
10 detik, satu percobaan
Fillio menunggu sepuluh detik untuk endpoint Anda dan tidak mencoba lagi setelahnya.
Mengaktifkan webhook
Buka formulir, masuk ke tab Pengaturan, lalu aktifkan Webhook. Tempel alamat yang harus menerima pengiriman; Fillio menyimpannya sesaat setelah Anda berhenti mengetik dan menampilkan konfirmasinya di layar. Setiap formulir memuat satu alamat, dan mematikan sakelarnya kembali akan menghapus alamat itu.
Alamatnya harus HTTPS
Fillio hanya memanggil alamat yang diawali https://. Alamat http:// diterima oleh bidang pengaturan tetapi tidak pernah dipanggil, jadi webhook yang tampak tersimpan diam-diam tidak mengirimkan apa pun.
Alamat yang mengarah ke dalam jaringan pribadi juga ditolak: host mana pun di 10.x, 127.x, 169.254.x, 172.16-31.x atau 192.168.x, alamat IPv6 apa pun, serta nama apa pun yang berupa localhost atau berakhiran .local atau .internal. Endpoint Anda harus dapat dijangkau dari internet publik.
Permintaannya
Sebuah POST dengan body JSON. Empat header menyertainya.
| Header | Deskripsi |
|---|---|
| Content-Type: application/json | Body-nya selalu JSON. |
| User-Agent: Fillio Webhooks/1.0 | Menandai pemanggilnya sebagai Fillio, yang berguna ketika satu endpoint mendengarkan beberapa layanan sekaligus. |
| X-Fillio-Event: FORM_RESPONSE | Nama peristiwanya. FORM_RESPONSE adalah satu-satunya nilai yang dikirim Fillio saat ini. |
| X-Fillio-Event-Id | UUID baru untuk pengiriman ini, diulang sebagai eventId di dalam body. |
Payload
Sebuah amplop yang menjelaskan peristiwanya, dan objek data yang menjelaskan responsnya.
{
"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
}
]
}
}| Properti | Deskripsi |
|---|---|
| eventId | ID unik untuk pengiriman ini. |
| eventType | Selalu FORM_RESPONSE. |
| createdAt | Waktu respons dikirimkan, sebagai stempel waktu ISO 8601 dalam UTC. |
| data.responseId | ID respons yang tersimpan. |
| data.formId | ID formulir, sama dengan yang muncul di tautan publiknya. |
| data.formName | Judul formulir sebagai teks biasa, dengan semua pemformatan dihilangkan. |
| data.fields | Satu entri untuk setiap pertanyaan yang dijawab. |
Di dalam fields
Setiap entri membawa empat properti, dan pertanyaan yang memiliki opsi membawa properti kelima.
| Properti | Deskripsi |
|---|---|
| key | ID permanen pertanyaan itu. Ia bertahan melewati setiap perubahan kata, jadi cocokkan berdasarkan ini, bukan berdasarkan labelnya. |
| label | Pertanyaannya seperti yang tertulis di editor. |
| type | Jenis pertanyaannya, diambil dari daftar di bawah. |
| value | Jawabannya, dalam bentuk yang disimpan pertanyaan tersebut. |
| options | Hanya pada pertanyaan yang memiliki opsi: ID dan teks setiap opsi, sehingga Anda dapat mengubah jawaban kembali menjadi label. |
Hanya pertanyaan yang dijawab yang tiba
Pertanyaan yang tidak disentuh responden tidak ada di dalam array, bukan dikirim sebagai nilai kosong, dan pertanyaan yang disembunyikan logika bersyarat sama sekali tidak muncul. Cari setiap jawaban lewat key-nya alih-alih mengandalkan posisi atau jumlah entri yang tetap.
Jawaban pilihan membawa ID, bukan label
Jawaban daftar pilihan atau pilihan ganda berupa ID opsi yang dipilih, sedangkan jawaban kotak centang, multi-pilihan, atau peringkat berupa array ID opsi. Cocokkan ID itu dengan daftar options pada entri yang sama. Jawaban peringkat mempertahankan urutan yang disusun responden.
Opsi Lainnya
Ketika responden menulis di kotak Lainnya, nilainya bukan ID opsi melainkan teks __OTHER__: diikuti apa yang mereka ketik. Buang awalan itu untuk membaca jawabannya.
"value": "__OTHER__:Heard about it from a friend"File dan tanda tangan
Jawaban unggah file berupa tautan unduhan ke file di penyimpanan Fillio. Jawaban tanda tangan berupa data URL PNG base64, yang dapat Anda simpan atau tampilkan langsung.
Jenis bidang
Jenis adalah nama publik yang stabil, jadi perubahan di dalam Fillio tidak pernah sampai ke integrasi Anda. Apa pun yang tidak dapat dipetakan Fillio tiba sebagai INPUT_TEXT.
| Jenis | Pertanyaan | Nilai |
|---|---|---|
| INPUT_TEXT | Jawaban Singkat | Teks |
| TEXTAREA | Jawaban Panjang | Teks |
| INPUT_EMAIL | Teks | |
| INPUT_PHONE_NUMBER | Nomor Telepon | Teks |
| INPUT_NUMBER | Angka | Angka sebagai teks, persis seperti yang diketik |
| INPUT_LINK | Tautan | Teks |
| INPUT_DATE | Tanggal | Tanggal, dalam bentuk YYYY-MM-DD |
| INPUT_TIME | Waktu | Waktu, dalam bentuk HH:MM pada jam 24 jam |
| DROPDOWN | Daftar pilihan | Satu ID opsi |
| MULTIPLE_CHOICE | Radio | Satu ID opsi |
| CHECKBOXES | Kotak Centang | Array berisi ID opsi |
| MULTI_SELECT | Multi-Pilihan | Array berisi ID opsi |
| RATING | Penilaian Bintang | Sebuah angka |
| LINEAR_SCALE | Skala Linear | Sebuah angka |
| RANKING | Peringkat | Array berisi ID opsi, dalam urutan pilihan responden |
| FILE_UPLOAD | Unggah File | Tautan unduhan |
| SIGNATURE | Tanda Tangan | Data URL PNG base64 |
Jika endpoint Anda tidak menjawab
Fillio menunggu sepuluh detik. Waktu habis, kesalahan koneksi, atau status apa pun di luar rentang 2xx dihitung sebagai pengiriman yang gagal, dan sampai di situ saja: tidak ada percobaan ulang dan tidak ada antrean untuk diputar ulang.
Responsnya sendiri tidak pernah terpengaruh. Ia disimpan sebelum permintaan dibuat dan tetap ada di dasbor Anda apa pun yang dilakukan endpoint Anda, sehingga dasbor tetap menjadi catatan yang utuh meski ada pengiriman yang hilang.
Tidak ada tanda tangan
Fillio tidak menandatangani permintaannya dan tidak mengirim rahasia bersama, jadi body-nya saja tidak membuktikan dari mana ia berasal. Jika endpoint Anda harus yakin, berikan alamat yang hanya Anda ketahui: path atau query string yang panjang dan tak tertebak. Anggap apa pun yang tiba di tempat lain sebagai tidak tepercaya.
Setiap pengiriman membawa ID peristiwanya sendiri, baik di header X-Fillio-Event-Id maupun di dalam body. Mencatat ID yang sudah Anda tangani adalah cara paling sederhana agar endpoint Anda aman dipanggil dua kali.
Arahkan webhook ke endpoint pemeriksa permintaan mana pun lalu kirim formulir Anda sendiri sekali. Anda akan melihat payload persis yang dihasilkan formulir Anda, lengkap dengan ID bidang Anda sendiri. Itulah cara tercepat untuk menulis pemetaan di sisi Anda.