So funktioniert es
Jede Prüfung, die eine Einsendung durchläuft, in Reihenfolge, und was jede davon zurückgeben kann.
Jeder Post an /f/<formId> durchläuft dieselbe Pipeline. Günstige Prüfungen laufen zuerst, sodass eine Flut oder ein unbekanntes Formular fast nichts kostet. Die erste fehlschlagende Prüfung bestimmt die Antwort.
Bevor der Body gelesen wird
- 1Flutschutz600 pro Minute und IP, über alle Formulare429 rate_limited
- 2Formular-LookupUnbekannte, gelöschte oder deaktivierte Formulare404 not_found
- 3Rate-Limits des FormularsDie Voreinstellung des Formulars, pro Besucher und pro Formular429 rate_limited
- 4PausiertDas Formular ist im Dashboard pausiert403 form_paused
Den Post lesen
- 5Parsenurlencoded, multipart oder JSON, UTF-8, Größenlimits400, 413, 415 oder 422
- 6API-SchlüsselNur wenn ein Authorization-Header gesendet wird403 forbidden
- 7Erlaubte DomainsOrigin oder Referer gegen die Domains des FormularsSpam oder 403
- 8MenschlichkeitsprüfungTurnstile-Token, wenn die Prüfung aktiv ist403 oder eine Prüfseite
Den Post bewerten
- 9ValidierenGegen die veröffentlichten Felder, falls vorhanden422 validation_failed
- 10BewertenHoneypot, Timing, Links, Schlüsselwörter, DuplikateSpam ab 5
- 11IdempotenzEin wiederholter Schlüssel liefert die erste Antwort erneutWiederholung, 409 oder 422
- 12Monatliche NutzungWeit über dem Limit des Workspace429 quota_exceeded
Gespeichert
Einsendung gespeichert
201 für Code, 303 für Browser
- WebhooksSigniert, etwa 3 Tage lang erneut versucht
- Benachrichtigungs-E-MailAn die Empfänger des Formulars
- Dashboard und APILive, sofort
Spam wird auch gespeichert und wie ein Erfolg beantwortet, löst aber nichts aus.
Was jede Stufe macht
Rate-Limits vor allem anderen
Rate-Limits greifen, bevor der Body gelesen wird. Der Flutschutz (600 pro Minute pro IP) läuft sogar vor der Formularsuche, sodass eine Flut nie die Datenbank erreicht. Die eigenen Regeln des Formulars greifen direkt nach der Suche. Abgelehnte Anfragen verbrauchen kein Kontingent. Genaue Zahlen findest du unter Rate-Limits.
Parsing
Der Body wird als urlencoded, multipart oder JSON geparst. Text wird als UTF-8 dekodiert und nach NFC normalisiert, CRLF wird zu LF und Steuerzeichen werden entfernt. Namen, die mit _ beginnen, sind reservierte Anweisungen wie _redirect und _subject und werden nie als Antworten gespeichert. Siehe HTML-Formulare.
Wer es gesendet hat
Ein Authorization: Bearer-Header ist optional. Ein Secret Key (ik_sk_) mit dem Scope submissions:write überspringt die Prüfung der erlaubten Domains und die Ikiform-Menschlichkeitsprüfung. Ein Publishable Key (ik_pub_) funktioniert nur von den Domains, die beim Schlüssel eingetragen sind. Ohne Schlüssel wird der Post anhand seines Origin beurteilt.
Spam
Spam ist nie ein Fehler. Ein Post, der die Domain-Richtlinie im Spam-Modus nicht erfüllt oder einen Score von 5 oder mehr erreicht, wird mit Status spam gespeichert und bekommt dieselbe Erfolgsantwort wie ein echter, sodass Bots nichts lernen. Spam löst keine Webhooks oder E-Mails aus und zählt nicht zur Nutzung. Siehe Spamschutz.
Speichern und zustellen
Die Einsendung, ihre Webhook-Zustellungen und ihre Benachrichtigungs-E-Mail werden in einem Datenbank-Batch geschrieben und dann an eine Queue übergeben. Webhook-Zustellung und E-Mail verlangsamen nie die Antwort, und eine Einsendung wird nie ohne ihre Zustellungen gespeichert.
JSON oder eine Weiterleitung
Derselbe Endpunkt antwortet Browsern mit Seiten und Code mit JSON. Ikiform entscheidet pro Anfrage:
- 1Accept enthält application/jsonJSON
- 2Der Body ist JSONJSON
- 3Sec-Fetch-Mode: navigateWeiterleitung oder Seite
- 4Jeder andere Sec-Fetch-Mode, etwa corsJSON
- 5Kein Sec-Fetch-Mode, Accept enthält text/htmlWeiterleitung oder Seite
- 6Alles andere, etwa curlJSON
Die erste passende Regel gewinnt.
Im JSON-Modus ist Erfolg 201 { "ok": true, "id": "sub_..." }. Im Seitenmodus ist Erfolg eine 303-Weiterleitung, und Fehler zeigen eine gehostete Fehlerseite, die Feldprobleme nach Label auflistet.
Nachdem eine Einsendung gespeichert ist
| Was | Wann | Details |
|---|---|---|
| Webhooks | Sekunden später, erneute Versuche über etwa 3 Tage | Webhooks |
| Benachrichtigungs-E-Mail | Sekunden später, wenn Benachrichtigungen für das Formular aktiv sind | Begrenzt auf 50 E-Mails pro Formular und Stunde (10 bei Workspaces, die jünger als 7 Tage sind), danach eine stündliche Zusammenfassung |
| Dashboard | Sofort, live | Spam erscheint unter dem Spamfilter |
| REST API | Sofort | REST API |
IDs
| ID | Sieht aus wie | Hinweise |
|---|---|---|
| Formular | frm_xxxxxxxxxxxxxxxx | frm_ plus 16 zufällige Zeichen. Öffentlich: Sie steht in der Action-URL deines Formulars. |
| Einsendung | sub_01k7v2c9t3e8m5q4x6z0a1b2c3 | sub_ plus 26 Zeichen, zeitlich sortiert. |
| Webhook-Zustellung | dlv_... | Wird als webhook-id gesendet; bleibt bei erneuten Versuchen gleich. |
| Anfrage | req_... | Jede Antwort hat einen X-Request-Id-Header. Gib ihn an, wenn du den Support kontaktierst. |
{ "ok": true, "id": "sub_01k7v2c9t3e8m5q4x6z0a1b2c3" }