/ for AI agents 🤖
Forms your agent can use as a first-class citizen.
Bearer-authed POSTs skip captcha, honeypot, and the per-IP rate limit
— the token IS the trust boundary. The OpenAPI spec is CORS-open so
the agent discovers the surface itself.
agent · bearer Agent books a demo on a user's behalf
Your assistant (Claude, ChatGPT, a custom one) fills out the prospect's demo form
for them — the lead lands in your sales inbox stamped with the agent's label,
attributed in the audit log, no captcha to break.
$ curl -X POST https://login.form4dev.com/api/submit/demo-request \
-H "Authorization: Bearer fmd_a8c91b2e7d…" \
-H "Content-Type: application/json" \
-d '{
"name": "Sarah Chen",
"company": "Acme Corp",
"email": "[email protected]",
"team_size": 12,
"use_case": "Lead capture for marketing site + agent integration",
"monthly_volume": 5000,
"_replyto": "[email protected]",
"_source": "submitted via Claude.ai on user behalf"
}'
{
"success": true,
"id": "sub_d31be…",
"submitted_via": "agent:tok_demo_intake_claude"
}
# Inbox row shows the 🤖 stamp + the token label.
# Skipped: per-IP rate limit, honeypot, CAPTCHA. The token is trust. agent · bulk Bulk import 1,000 leads from a scrape, CSV, or Sheet
Idempotency keys make the loop safely retryable — re-running the same script doesn't
double-post. Per-IP rate limit doesn't apply to Bearer-authed traffic, so a
background job can drain a queue without throttling.
$ cat leads.jsonl | while read line; do
curl -X POST https://login.form4dev.com/api/submit/crm-intake \
-H "Authorization: Bearer fmd_a8c91b2e7d…" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(echo -n "$line" | sha256sum | cut -c1-32)" \
-d "$line"
done
{ "success": true, "id": "sub_…" } ×1000
# Re-run with the same input and you get the same IDs — no dupes.
# Per-IP rate limit doesn't apply to Bearer tokens. agent · discovery Agent discovers the API surface itself
The whole API is described at /api/openapi.json —
CORS-open, no auth required to read. Drop it into an agent's tool-use loop and it
learns the endpoints, parameter types, and response shapes without a docs site.
$ curl -s https://login.form4dev.com/api/openapi.json | jq '.paths | keys'
[
"/api/forms",
"/api/forms/{formId}",
"/api/forms/{formId}/builder",
"/api/forms/{formId}/submissions",
"/api/forms/{formId}/failures",
"/api/submit/{endpointSlug}",
"/api/submissions/{id}",
"/api/tokens",
…
]
# Agent reads, mints a scoped token, picks an endpoint, submits.
# No SDK install, no docs to scrape. Just JSON. agent · voice Voice agent → schema-validated form
Your voice agent (Twilio, Vapi, Retell) transcribes a call, extracts the structured
fields, and submits. The form's strict 13-type schema catches malformed extractions
before they pollute the inbox — bad voice agents fail loudly, not silently.
$ curl -X POST https://login.form4dev.com/api/submit/clinic-intake \
-H "Authorization: Bearer fmd_voice_agent_…" \
-H "Content-Type: application/json" \
-d '{
"patient_name": "Anna Smith",
"phone": "+1 415 555 0117",
"reason_for_visit": "Follow-up — knee injection three weeks ago",
"preferred_date": "2026-06-15",
"preferred_time": "afternoon",
"insurance_provider": "Blue Shield",
"_source": "via Twilio voice agent",
"_replyto": "[email protected]"
}'
{ "success": true, "id": "sub_v8c1e…" }
# Schema rejects bad date formats with 400 + a field-level error
# the agent can react to ("please confirm the date"). agent · workflow Agent logs a workflow event from Slack / GitHub / a file watcher
Use a form as a write-side event log. The agent submits, the form's signed webhook
fires to your downstream system, and the auto-retry (5× with backoff) means your
pipeline doesn't lose the event if its receiver is briefly down.
$ curl -X POST https://login.form4dev.com/api/submit/build-events \
-H "Authorization: Bearer fmd_ci_agent_…" \
-H "Content-Type: application/json" \
-d '{
"kind": "deploy.completed",
"service": "api-gateway",
"git_sha": "8f3a91c",
"env": "production",
"duration_ms": 47120,
"triggered_by": "release-bot"
}'
{ "success": true, "id": "sub_evt_…" }
# Webhook fires to your audit-log service.
# Auto-retried at 1m, 5m, 30m, 2h, 10h if it 5xxs.