POST to one URL. Get spam filtering, files, webhooks, and a dashboard your PM can actually open.
You were hired to ship product UI-not to babysit another serverless function that parses multipart, talks to SMTP, and silently drops messages when the runtime cold-starts. Formspring is the boring endpoint: your form action or fetch target, CORS configured per form, captcha optional, signed webhooks with replay, and MCP when you want agents to list submissions without inventing OAuth from scratch.
Browser POST / fetch
Clientmultipart/form-data or JSON - same endpoint
200 + thank-you
HTTPRedirect or JSON body - your SPA handles either
Signed webhook
Workersubmission.created - verify HMAC, idempotent key
Delivery log
Obs429 retried - replay from dashboard when fixed
MCP query
AIAgent lists open submissions with scoped token
Rotate token
SecOld CI token revoked - least privilege preserved
What stays off your plate
- No SMTP, no bucket ACL archaeology in v1.
- CORS and captcha live next to the form config.
- PM can open the submission without SSH.
What you can rely on without reading our marketing site twice
Row-level promises-not vibes. Docs and security pages back the boring stuff.
| Contract | Formspring | Notes |
|---|---|---|
| Ingress | Hosted POST/JSON endpoint, CORS and captcha scoped per form. | Keep progressive enhancement and SPA paths on the same URL. |
| Delivery | Signed webhooks, replay from UI, delivery logs on the submission row. | See 429s and signature mismatches without tailing CloudWatch. |
| Auth for automation | Scoped API tokens; rotate without revoking your whole account session. | |
| Agents | MCP surface to list and reason about submissions with real permissions. | See /mcp for scope. |
| Residency narrative | EU hosting default; security page for reviewers who ask “where?” |
Treat Formspring like infrastructure: observable handoffs, versionable contracts, and an API surface for the day marketing asks for “just one more integration.”
Hard limits
Not every workload belongs here
Contrarian but true: sometimes you should keep the hop on your origin.
- If you need single-digit millisecond inline processing inside your request path, keep that on your origin-Formspring is network-hop capture, not co-located edge compute.
- We are not a full CDP; expect to push enriched events onward via webhooks or your own workers.
Docs and workflows
Ground-truth links for implementation reviews.
Delete the contact-form Lambda. Keep the observability.
Start free, point staging at a real endpoint, and give support a dashboard the same day-not after you build logging.