Cara kerja
Setiap pemeriksaan yang dilalui sebuah kiriman, secara berurutan, dan apa yang bisa dikembalikan masing-masing.
Setiap kiriman ke /f/<formId> melewati pipeline yang sama. Pemeriksaan yang ringan berjalan lebih dulu, jadi banjir request atau formulir yang tidak dikenal hampir tidak memakan biaya. Pemeriksaan pertama yang gagal menentukan responsnya.
Sebelum body dibaca
- 1Proteksi flood600 per menit per IP, di semua formulir429 rate_limited
- 2Pencarian formulirFormulir yang tidak dikenal, dihapus, atau dinonaktifkan404 not_found
- 3Rate limit formulirPreset formulir, per pengunjung dan per formulir429 rate_limited
- 4DijedaFormulir dijeda di dashboard403 form_paused
Membaca kiriman
- 5Parsingurlencoded, multipart, atau JSON, UTF-8, batas ukuran400, 413, 415, atau 422
- 6Kunci APIHanya jika header Authorization dikirim403 forbidden
- 7Domain yang diizinkanOrigin atau Referer dicocokkan dengan domain formulirSpam, atau 403
- 8Pemeriksaan manusiaToken Turnstile, saat pemeriksaan aktif403, atau halaman pemeriksaan
Menilai kiriman
- 9ValidasiTerhadap field yang dipublikasikan, jika ada422 validation_failed
- 10SkorHoneypot, waktu, tautan, kata kunci, duplikatSpam di 5 atau lebih
- 11IdempotensiKey yang sama mengembalikan jawaban pertama lagiReplay, 409, atau 422
- 12Pemakaian bulananJauh melewati batas workspace429 quota_exceeded
Disimpan
Kiriman disimpan
201 untuk kode, 303 untuk browser
- WebhookDitandatangani, dicoba ulang selama sekitar 3 hari
- Email notifikasiKe penerima formulir
- Dashboard dan APILangsung, saat itu juga
Spam juga disimpan, dan dijawab seperti sukses, tetapi tidak mengirim apa pun.
Apa yang dilakukan setiap tahap
Rate limit sebelum yang lain
Rate limit berjalan sebelum body dibaca. Proteksi flood (600 per menit per IP) bahkan berjalan sebelum pencarian formulir, jadi banjir request tidak pernah sampai ke database. Aturan milik formulir berjalan tepat setelah pencarian. Request yang ditolak tidak memakai jatah. Angka pastinya ada di Rate limit.
Parsing
Body diurai sebagai urlencoded, multipart, atau JSON. Teks di-decode sebagai UTF-8, dinormalisasi ke NFC, CRLF menjadi LF, dan karakter kontrol dihapus. Nama yang diawali _ adalah instruksi reserved, seperti _redirect dan _subject, dan tidak pernah disimpan sebagai jawaban. Lihat Formulir HTML.
Siapa pengirimnya
Header Authorization: Bearer bersifat opsional. Secret key (ik_sk_) dengan scope submissions:write melewati pemeriksaan domain yang diizinkan dan pemeriksaan manusia Ikiform. Publishable key (ik_pub_) hanya berfungsi dari domain yang tercantum di key tersebut. Tanpa key, kiriman dinilai berdasarkan Origin-nya.
Spam
Spam tidak pernah menjadi error. Kiriman yang gagal kebijakan domain yang diizinkan dalam mode spam, atau mendapat skor 5 atau lebih, disimpan dengan status spam dan mendapat respons sukses yang sama seperti kiriman asli, jadi bot tidak belajar apa pun. Spam tidak mengirim webhook atau email dan tidak dihitung dalam pemakaian. Lihat Perlindungan spam.
Simpan dan kirim
Kiriman, pengiriman webhook-nya, dan email notifikasinya ditulis dalam satu batch database, lalu diserahkan ke antrean. Pengiriman webhook dan email tidak pernah memperlambat respons, dan kiriman tidak pernah disimpan tanpa pengirimannya.
JSON atau redirect
Endpoint yang sama menjawab browser dengan halaman dan kode dengan JSON. Ikiform memutuskannya per request:
- 1Accept mencakup application/jsonJSON
- 2Body-nya JSONJSON
- 3Sec-Fetch-Mode: navigateRedirect atau halaman
- 4Sec-Fetch-Mode lain, seperti corsJSON
- 5Tanpa Sec-Fetch-Mode, Accept mencakup text/htmlRedirect atau halaman
- 6Selain itu, seperti curlJSON
Aturan pertama yang cocok yang dipakai.
Dalam mode JSON, sukses berarti 201 { "ok": true, "id": "sub_..." }. Dalam mode halaman, sukses berupa redirect 303, dan error menampilkan halaman error hosted yang mencantumkan masalah field berdasarkan label.
Setelah kiriman disimpan
| Apa | Kapan | Detail |
|---|---|---|
| Webhook | Beberapa detik kemudian, dicoba ulang selama sekitar 3 hari | Webhook |
| Email notifikasi | Beberapa detik kemudian, jika notifikasi aktif untuk formulir tersebut | Dibatasi 50 email per formulir per jam (10 untuk workspace yang berumur kurang dari 7 hari), lalu satu ringkasan per jam |
| Dashboard | Langsung, real-time | Spam muncul di filter spam |
| REST API | Langsung | REST API |
ID
| ID | Bentuknya | Catatan |
|---|---|---|
| Formulir | frm_xxxxxxxxxxxxxxxx | frm_ ditambah 16 karakter acak. Publik: ada di URL action formulir Anda. |
| Kiriman | sub_01k7v2c9t3e8m5q4x6z0a1b2c3 | sub_ ditambah 26 karakter, berurutan menurut waktu. |
| Pengiriman webhook | dlv_... | Dikirim sebagai webhook-id; tetap sama di setiap percobaan ulang. |
| Request | req_... | Setiap respons punya header X-Request-Id. Sertakan saat Anda menghubungi dukungan. |
{ "ok": true, "id": "sub_01k7v2c9t3e8m5q4x6z0a1b2c3" }