Form infrastructure for agentic software

Headless forms
AI agents can ship
in 30 seconds.

No database. No UI to build. Define a schema in JSON, publish from the CLI, and your agent has a live form — hosted, validated, with signed webhooks back to your runtime.

No database setup No frontend to build One CLI command to publish

MIT · Cloudflare Workers · Sub-50ms cold starts

terminal — 30 seconds to a live form
$ agentsforms init
✓ Created forms/onboarding.json

$ agentsforms forms publish onboarding
✓ Published → forms.agentsforms.com/f/onboarding

# Agent creates a session, embeds the form
$ agentsforms sessions create onboarding \
--metadata '{"agent_run_id":"run_123"}'
✓ Session → forms.agentsforms.com/s/sess_abc

# Human fills it. Signed webhook fires.
← POST /your-agent/webhook
X-AgentsForms-Signature: t=1782..., v1=a3f2...
{ event: "submission.completed", answers: {...} }

Embed on a site. Or send as a link.

AgentsForms gives you both. Embed a form into any page your agent builds. Or fire off a hosted URL. Same schema, same validation, same signed webhook at the other end.

Primary

Embed on a site

Your agent builds a page, drops in an AgentsForms embed, and the form lives natively on the site. No redirect, no external link — the user never leaves the experience.

1 Agent builds the site
Your agent generates the page — a support portal, an onboarding flow, a checkout. It drops an <iframe src="forms.agentsforms.com/f/onboarding"> into the markup.
2 User fills the form inline
The form renders natively on the site. Validation happens client-side. The user never sees an external URL or a third-party branding.
3 Signed webhook → agent resumes
Submission is validated, stored, and delivered to your agent's webhook. HMAC-signed. Your agent picks up structured data and continues.
<!-- Your agent-generated page --> <h1>Support Portal</h1> <iframe src="forms.agentsforms.com/f/support-intake" style="width:100%; border:none;" ></iframe> <!-- Form lives here. No redirect. -->
Also

Send as a link

When your agent is mid-conversation and needs a quick answer — approval, clarification, missing field — fire a hosted form URL. One click for the human, structured data back.

1 Agent detects missing info
Mid-task, your agent realizes it needs approval or clarification. It calls POST /v1/forms/approval/sessions and gets back a hosted URL.
2 Agent sends the link
The agent drops the URL into chat, Slack, email — wherever the human is. "Hey, approve this deploy before I proceed: forms.agentsforms.com/s/sess_abc"
3 Human clicks, fills, done
One click opens the form. No login, no account. The human fills it, submits, and your agent's webhook fires. Agent resumes with the decision.
# Agent mid-conversation Agent: Before I deploy, approve these changes: forms.agentsforms.com/s/sess_abc Human: [clicks, checks boxes, submits] → webhook fires → agent deploys

What you get. What you don't have to build.

{ } schema.json

Schema-first

One JSON file is the contract. Fields, types, validation rules, agent hints. Same schema drives CLI, API, SDK, and the hosted renderer. No drift, no duplication.

{ "type": "select", "options": [...] }
↗ POST /sessions

Headless by default

Every form gets a hosted URL and an embed snippet. But the real surface is the API — your agent creates sessions and reads submissions without ever touching HTML.

POST /v1/forms/:id/sessions
🔏 HMAC-SHA256

Signed, not hopeful

Every webhook is cryptographically signed, timestamped, and idempotent. Retried with exponential backoff. Your agent resumes on data it can actually verify.

X-AgentsForms-Signature: t=…, v1=…

Same shape end-to-end. Define, submit, resume.

You define the schema. The human fills the form. The agent gets structured data. One contract, three surfaces.

01You define
support-intake.json { "name": "Support intake", "slug": "support-intake", "fields": [ { "id": "priority", "type": "select", "options": [ { "label": "High", "value": "high" }, { "label": "Normal", "value": "normal" } ] }, { "id": "message", "type": "textarea" } ] }
02Human submits
{ "submissionId": "sub_01J9X3...", "formId": "form_abc123", "status": "complete", "answers": { "priority": "high", "message": "Agent stuck on refund policy edge case." } }
03Agent resumes
POST /your-agent/webhook Content-Type: application/json X-AgentsForms-Signature: t=1782223332, v1=a3f2b9c1... { "event": "submission.completed", "data": { "submissionId": "sub_01J9X3...", "answers": { "priority": "high" } } }

Six commands. No database. Live in 30 seconds.

terminal
$ npm install -g @agentsforms/cli
$ agentsforms login
$ agentsforms init
✓ Created forms/onboarding.json
$ agentsforms forms publish onboarding
✓ Published → forms.agentsforms.com/f/onboarding

# Your agent now has a live form. Embed it or send the link.
$ agentsforms sessions create onboarding \
--metadata '{"agent_run_id":"run_123"}'
✓ Session → forms.agentsforms.com/s/sess_abc

$ agentsforms submissions tail onboarding
Waiting for submissions…

Prefer raw HTTP? API reference →