Cada Form ganha um endpoint. O Studio mostra o que chegou.
Você posta JSON de qualquer lugar — app, site, script. O Forma valida contra os Fields que você definiu, guarda a Submission com origin e user-agent, e mostra tudo no Studio. Sem SDK obrigatório, sem formulário hospedado no meio do caminho.
import { Forma } from "@forma/sdk";
const forma = new Forma({ apiKey: "frm_..." });
await forma.submit({
email: "ana@acme.com",
message: "O botão some no mobile",
rating: 4,
});Crie um Form
O Form ganha uma API key e um endpoint de POST na hora. Comece de um Template — Feedback, Contato, Newsletter, NPS — ou vazio.
Poste do seu app
Use o @forma/sdk, um Authorization: Bearer, o header X-Forma-Key, ou a key na própria URL.
Leia no Studio
Cada Submission aparece com os Fields separados, o JSON cru e os metadados de quem enviou.
Os Fields são o contrato
Um Field tem um nome, que aparece no Studio, e uma key, que é a propriedade do JSON. É isso que separa uma Submission legível de um blob.
Valida na entrada
Field obrigatório que não veio, email malformado ou número que chegou como string voltam 400 com a key que falhou.
Ou não valida nada
Form sem Fields é ingest aberto: qualquer JSON entra e você organiza depois. Chaves a mais nunca são descartadas.
Muda sem migrar
Renomear um Field não toca nas Submissions antigas. Trocar a key deixa o valor velho visível em Outros.
O que o endpoint garante
valores padrão, configuráveis por ambiente- Rate limit
- 20/min por IP
- e 60/min por API key
- Excedente
- 429 + Retry-After
- em segundos, no header
- Payload
- até 100 KB
- objeto JSON, não array
- CORS
- aberto
- dá para postar do browser
Surveys públicos falam com o agente do browser.
Em /f/… o Forma registra describe_form e submit_form. O POST continua o contrato — WebMCP só descreve a página aberta.