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.

HeaderDeskripsi
Content-Type: application/jsonBody-nya selalu JSON.
User-Agent: Fillio Webhooks/1.0Menandai pemanggilnya sebagai Fillio, yang berguna ketika satu endpoint mendengarkan beberapa layanan sekaligus.
X-Fillio-Event: FORM_RESPONSENama peristiwanya. FORM_RESPONSE adalah satu-satunya nilai yang dikirim Fillio saat ini.
X-Fillio-Event-IdUUID 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
      }
    ]
  }
}
PropertiDeskripsi
eventIdID unik untuk pengiriman ini.
eventTypeSelalu FORM_RESPONSE.
createdAtWaktu respons dikirimkan, sebagai stempel waktu ISO 8601 dalam UTC.
data.responseIdID respons yang tersimpan.
data.formIdID formulir, sama dengan yang muncul di tautan publiknya.
data.formNameJudul formulir sebagai teks biasa, dengan semua pemformatan dihilangkan.
data.fieldsSatu entri untuk setiap pertanyaan yang dijawab.

Di dalam fields

Setiap entri membawa empat properti, dan pertanyaan yang memiliki opsi membawa properti kelima.

PropertiDeskripsi
keyID permanen pertanyaan itu. Ia bertahan melewati setiap perubahan kata, jadi cocokkan berdasarkan ini, bukan berdasarkan labelnya.
labelPertanyaannya seperti yang tertulis di editor.
typeJenis pertanyaannya, diambil dari daftar di bawah.
valueJawabannya, dalam bentuk yang disimpan pertanyaan tersebut.
optionsHanya 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.

JenisPertanyaanNilai
INPUT_TEXTJawaban SingkatTeks
TEXTAREAJawaban PanjangTeks
INPUT_EMAILEmailTeks
INPUT_PHONE_NUMBERNomor TeleponTeks
INPUT_NUMBERAngkaAngka sebagai teks, persis seperti yang diketik
INPUT_LINKTautanTeks
INPUT_DATETanggalTanggal, dalam bentuk YYYY-MM-DD
INPUT_TIMEWaktuWaktu, dalam bentuk HH:MM pada jam 24 jam
DROPDOWNDaftar pilihanSatu ID opsi
MULTIPLE_CHOICERadioSatu ID opsi
CHECKBOXESKotak CentangArray berisi ID opsi
MULTI_SELECTMulti-PilihanArray berisi ID opsi
RATINGPenilaian BintangSebuah angka
LINEAR_SCALESkala LinearSebuah angka
RANKINGPeringkatArray berisi ID opsi, dalam urutan pilihan responden
FILE_UPLOADUnggah FileTautan unduhan
SIGNATURETanda TanganData 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.

Tips

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.