Como funciona
Cada verificação pela qual um envio passa, em ordem, e o que cada uma pode retornar.
Cada envio para /f/<formId> passa pelo mesmo pipeline. As verificações baratas rodam primeiro, então um flood ou um formulário desconhecido custa quase nada. A primeira verificação que falhar define a resposta.
Antes de ler o corpo
- 1Proteção contra flood600 por minuto por IP, em todos os formulários429 rate_limited
- 2Busca do formulárioFormulários desconhecidos, excluídos ou desativados404 not_found
- 3Limites de taxa do formulárioO preset do formulário, por visitante e por formulário429 rate_limited
- 4PausadoO formulário está pausado no painel403 form_paused
Lendo o envio
- 5Parsingurlencoded, multipart ou JSON, UTF-8, limites de tamanho400, 413, 415 ou 422
- 6Chave de APISó quando um header Authorization é enviado403 forbidden
- 7Domínios permitidosOrigin ou Referer comparado aos domínios do formulárioSpam, ou 403
- 8Verificação humanaToken do Turnstile, quando a verificação está ativa403, ou uma página de verificação
Avaliando o envio
- 9ValidaçãoContra os campos publicados, se houver422 validation_failed
- 10PontuaçãoHoneypot, tempo, links, palavras-chave, duplicadosSpam a partir de 5
- 11IdempotênciaUma chave repetida repete a primeira respostaRepetição, 409 ou 422
- 12Uso mensalMuito acima do limite do workspace429 quota_exceeded
Armazenado
Envio salvo
201 para código, 303 para navegadores
- WebhooksAssinados, com novas tentativas por cerca de 3 dias
- E-mail de notificaçãoPara os destinatários do formulário
- Painel e APIAo vivo, na hora
Spam também é armazenado e respondido como sucesso, mas não dispara nada.
O que cada etapa faz
Limites de taxa antes de tudo
Os limites de taxa rodam antes de o corpo ser lido. A proteção contra flood (600 por minuto por IP) roda antes até da busca do formulário, então um flood nunca chega ao banco de dados. As regras do próprio formulário rodam logo depois da busca. Requisições rejeitadas não consomem a cota. Os números exatos estão em Limites de taxa.
Parsing
O corpo é lido como urlencoded, multipart ou JSON. O texto é decodificado como UTF-8 e normalizado para NFC, CRLF vira LF e caracteres de controle são removidos. Nomes que começam com _ são instruções reservadas, como _redirect e _subject, e nunca são armazenados como respostas. Veja Formulários HTML.
Quem enviou
Um header Authorization: Bearer é opcional. Uma chave secreta (ik_sk_) com o escopo submissions:write pula a verificação de domínios permitidos e a verificação humana do Ikiform. Uma chave publicável (ik_pub_) só funciona a partir dos domínios listados na chave. Sem chave, o envio é avaliado pelo seu Origin.
Spam
Spam nunca é um erro. Um envio que falha na política de domínios permitidos no modo spam, ou que pontua 5 ou mais, é armazenado com status spam e recebe a mesma resposta de sucesso de um envio real, então os bots não aprendem nada. Spam não dispara webhooks nem e-mails e não conta no uso. Veja Proteção contra spam.
Armazenar e entregar
O envio, suas entregas de webhook e seu e-mail de notificação são gravados em um único lote no banco de dados e depois entregues a uma fila. A entrega de webhooks e os e-mails nunca deixam a resposta mais lenta, e um envio nunca é armazenado sem as suas entregas.
JSON ou redirecionamento
O mesmo endpoint responde navegadores com páginas e código com JSON. O Ikiform decide por requisição:
- 1Accept inclui application/jsonJSON
- 2O corpo é JSONJSON
- 3Sec-Fetch-Mode: navigateRedirecionamento ou página
- 4Qualquer outro Sec-Fetch-Mode, como corsJSON
- 5Sem Sec-Fetch-Mode, Accept inclui text/htmlRedirecionamento ou página
- 6Qualquer outra coisa, como curlJSON
A primeira regra que corresponder vence.
No modo JSON, sucesso é 201 { "ok": true, "id": "sub_..." }. No modo página, sucesso é um redirecionamento 303, e os erros mostram uma página de erro hospedada que lista os problemas de cada campo pelo rótulo.
Depois que um envio é armazenado
| O quê | Quando | Detalhes |
|---|---|---|
| Webhooks | Segundos depois, com novas tentativas por cerca de 3 dias | Webhooks |
| E-mail de notificação | Segundos depois, se as notificações estiverem ativas no formulário | Limitado a 50 e-mails por formulário por hora (10 para workspaces com menos de 7 dias), depois um resumo por hora |
| Painel | Na hora, ao vivo | Spam aparece no filtro de spam |
| API REST | Na hora | API REST |
Ids
| Id | Formato | Observações |
|---|---|---|
| Formulário | frm_xxxxxxxxxxxxxxxx | frm_ mais 16 caracteres aleatórios. Público: ele aparece na URL do action do seu formulário. |
| Envio | sub_01k7v2c9t3e8m5q4x6z0a1b2c3 | sub_ mais 26 caracteres, ordenados por tempo. |
| Entrega de webhook | dlv_... | Enviado como webhook-id; continua o mesmo entre as novas tentativas. |
| Requisição | req_... | Toda resposta tem um header X-Request-Id. Informe-o quando entrar em contato com o suporte. |
{ "ok": true, "id": "sub_01k7v2c9t3e8m5q4x6z0a1b2c3" }