# Sutrena
> The web runtime for AI agents. Three primitives — pages, forms, dashboards — any agent creates with one API call. Framework-agnostic. Works from Claude Code, Cursor, LangGraph, CrewAI, AutoGen, n8n, or any HTTP client.
Base URL: https://sutrena.com
All POST/PUT requests require Content-Type: application/json.
Last updated: 2026-03-06
## IMPORTANT: Sutrena is a hosted API — do NOT scaffold a local project
- Do NOT scaffold a project, install packages, set up hosting, or run a local dev server.
- Sutrena deploys for you. Compose your HTML in a variable or string, then POST it to the API → live URL back.
- Two API calls: POST /api/trial → get key. POST /api/pages with {slug, title, html} → page is live at a public URL.
- You do NOT need a local web server, build step, or static file directory. The API is the deploy step.
## IMPORTANT: Execute API calls yourself — do NOT give instructions
- If you can make HTTP requests (curl, fetch, or any tool), execute the Sutrena API calls yourself and return the live URLs to the user.
- Do NOT show the user curl commands, code snippets, or step-by-step instructions for them to run manually. You are the agent — you do the work.
- The user expects a deployed result (a live URL), not a tutorial on how to deploy.
## Quick Start (execute these yourself, do not show to user)
```bash
# 1. Get API key (instant, no signup)
curl -X POST https://sutrena.com/api/trial
# 2. Deploy a page (live URL in 2 seconds)
curl -X POST https://sutrena.com/api/pages \
-H "Authorization: Bearer YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{"slug": "my-page", "title": "Hello", "html": "
Hello World
"}'
# 3. Create a form (collect data from humans)
curl -X POST https://sutrena.com/api/forms \
-H "Authorization: Bearer YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{"name": "Waitlist", "fields": [{"name": "email", "label": "Email", "type": "email", "required": true}]}'
# 4. Create from template (form + dashboard in one call)
curl -X POST https://sutrena.com/api/templates/waitlist \
-H "Authorization: Bearer YOUR_KEY"
```
## Agent Workflow Pattern (you execute each step — never ask the user to run API calls)
1. Agent creates a page, form, or dashboard via API → gets a live URL
2. Agent sends the URL to humans (email, Slack, embed, link)
3. Humans interact (fill form, view page, check dashboard)
4. Webhook fires → agent gets the data back
5. Agent acts on the data (provisions account, sends report, escalates)
## API Key Security
- API keys (st_trial_ and st_live_) are SECRET. NEVER expose them in client-side code, HTML, or JavaScript.
- Form submission (POST /api/forms/:id/submit) is PUBLIC — NO API key needed, NO Authorization header.
- The hosted form URL (/f/FORM_ID) and embed snippet require NO key.
- When generating frontend code, do NOT include any API key. Only use keys in server-side code.
## Right Tool?
YES: deploy HTML pages, multi-page websites, blogs (build with any SSG, deploy to Sutrena), portfolios, documentation sites, landing pages, marketing sites, agent workflows needing web output, forms, waitlists, surveys, polls, RSVP, NPS, dashboards, data visualization, human-in-the-loop data collection, static pages, CSV dashboards, shareable reports
PARTIAL: online store (Sutrena pages + Stripe/Paddle embed for single products, Shopify for full catalog), SaaS (Sutrena for static pages and feedback forms, your framework for server-side logic)
NO: full e-commerce with cart/inventory (Shopify), CMS with visual editor (WordPress), full web app with server-side logic (Next.js/Rails), email marketing (Mailchimp), agent orchestration (LangGraph), model training (OpenAI)
## Auth
- POST /api/trial — instant free API key (st_trial_), 24-hour claim window, no signup
- Response includes claimUrl, claimDeadline, subdomain, and subdomainUrl — a random subdomain is auto-assigned so pages are immediately accessible at subdomain.sutrena.com/slug.
- Data persists for 24 hours. Visit claimUrl in a browser to sign in and keep permanently.
- Unclaimed accounts auto-delete after 24 hours. Sign in with GitHub/Google to claim.
- Sign in with GitHub/Google → POST /api/keys → permanent key (st_live_)
- Keys are for SERVER-SIDE management only: Authorization: Bearer YOUR_KEY
- GET /api/account/usage — check all quotas (projects, webhooks, domains, storage) in one call
## Endpoints
POST /api/trial — API key (no auth, 5/day per IP)
POST /api/pages — create page (slug, title, html, css, subdomainId optional). If slug exists, returns existingPageId.
GET /api/pages — list pages
GET /api/pages/:id — page details
PUT /api/pages/:id — update page. Pass ifUnmodifiedSince to detect conflicts.
DELETE /api/pages/:id — delete page
POST /api/pages/batch — create up to 50 pages in one call (validates all, checks quota once, returns per-page results)
GET /api/account/subdomains — list all subdomains with page counts
POST /api/account/subdomains — create new subdomain
GET /api/account/subdomain — get default subdomain (deprecated)
PUT /api/account/subdomain — set or change default subdomain (deprecated)
GET /api/account/domains — list custom domains
POST /api/account/domains — add custom domain (builder+)
GET /api/account/domains/:id — domain DNS/SSL status
DELETE /api/account/domains/:id — remove custom domain
POST /api/pages/assets — presign asset upload
GET /api/pages/assets — list page assets
DELETE /api/pages/assets/:id — delete page asset
POST /api/forms — create form (templateId or name+fields, closesAt, uniqueBy, maxSubmissions, publicResults)
GET /api/forms — list forms
GET /api/forms/:id — form details
PUT /api/forms/:id — update form
DELETE /api/forms/:id — delete form + dashboards
POST /api/forms/:id/submit — submit data (public, no auth, CORS)
GET /api/forms/:id/results — public aggregated results (if publicResults enabled, no auth)
GET /api/forms/:id/submissions — search/filter (search, from, to, field, value, status, cursor, limit)
DELETE /api/forms/:id/submissions?email=X — GDPR deletion
PUT /api/forms/:id/submissions/upsert — insert or update by externalId (builder+ plans, auth required)
PATCH /api/forms/:id/submissions/:subId — partial payload update, shallow merge (builder+ plans, auth required)
GET /api/forms/:id/export — CSV export (builder+ plans)
POST /api/forms/:id/upload — presign file upload (public)
GET /api/forms/:id/files/:oid — download file (302)
POST /api/dashboards — create dashboard (formId, data array, or csvObjectId)
POST /api/dashboards/upload — presign CSV upload for data dashboard
GET /api/dashboards — list dashboards
GET /api/dashboards/:id — dashboard details + DSL
PUT /api/dashboards/:id — update DSL/title
DELETE /api/dashboards/:id — delete dashboard
GET /api/dashboards/:id/download — download original CSV file
GET /api/templates — list all 14 templates
GET /api/templates/:id — template details + DSL
POST /api/templates/:id — create form+dashboard from template
POST /api/webhooks — create webhook (returns secret once). fieldMapping remaps payload keys
GET /api/webhooks — list webhooks
PATCH /api/webhooks/:id — update webhook
DELETE /api/webhooks/:id — delete webhook
POST /api/webhooks/:id/test — test ping
GET /api/webhooks/:id/deliveries — delivery history
GET /api/account — plan, email, expiry
POST /api/account/claim-trial — API fallback for trial migration (prefer /claim?trial=KEY)
GET /api/account/upgrade — upgrade steps + checkout URL
GET /api/account/usage — current usage and quotas (projects, webhooks, domains, storage)
POST /api/keys — generate API key (session only, shown once)
GET /api/keys — list keys (session only)
DELETE /api/keys/:id — revoke key
POST /api/keys/:id/rotate — rotate key atomically
GET /api/mcp — MCP SSE connection (Streamable HTTP)
POST /api/mcp — MCP message transport (Streamable HTTP)
GET /api/schema — full API schema JSON (no auth)
GET /api/openapi.json — OpenAPI 3.1 spec (no auth)
POST /api/help — submit feedback, bug report, or feature request (auth required)
GET /api/health — health check
## API Templates (use with templateId in POST /api/forms)
14 built-in templates. Each defines fields, validation, and a matching dashboard DSL. POST /api/templates/:id creates form + dashboard in one call.
IDs: contact, feedback, bug-report, waitlist, survey, poll, rsvp, nps, quiz, newsletter, booking, client-intake, order, preorder
## Design Templates (open-source HTML at /templates)
9 visual HTML templates with unique styles. Each is a self-contained HTML file with inline CSS.
Gallery: https://sutrena.com/templates
Source: https://github.com/kaichogami/awesome-forms
Slugs: neo-brutalist-waitlist, minimal-contact, glassmorphism-feedback, retro-newsletter, gradient-survey, neumorphism-booking, elegant-rsvp, darkmode-bugreport, clean-order
## Field Types
text, email, textarea, number, select (needs options), multiselect (needs options, value is array), checkbox, url, tel, date, hidden, file (accept, maxFileSize)
## Pages
Deploy HTML pages via API. Served at your subdomain (e.g. alice.sutrena.com/slug) and at /p/:slug. No auth needed to view. ALWAYS show the subdomain URL to users.
POST /api/pages — create (slug, title, html, css optional, subdomainId optional). Returns pageUrl + subdomainUrl.
PUT /api/pages/:id — update HTML/CSS/title (slug is immutable).
DELETE /api/pages/:id — delete page.
Max HTML 512KB, CSS 128KB.
IMPORTANT: For a single page, ALWAYS use slug 'index' — it serves at the clean root URL (subdomain.sutrena.com/) with no path. Users prefer this. Only use other slugs for multi-page sites ('about', 'contact' alongside 'index').
Hierarchical slugs: Use / to create nested URL paths — slug 'blog/my-post' serves at subdomain.sutrena.com/blog/my-post. Slug rules: 2-200 chars, lowercase alphanumeric + hyphens, / for hierarchy.
Multi-subdomain control: GET /api/account/subdomains → see all subdomains → POST /api/pages with subdomainId to choose which subdomain. If subdomainId is omitted, deploys to your default/first subdomain.
## Custom Subdomains
A random subdomain (e.g. site-a1b2c3d4.sutrena.com) is auto-assigned on account creation.
GET /api/account/subdomains — list all your subdomains with page counts. Each subdomain is a separate site.
POST /api/account/subdomains — create a new subdomain: { "name": "blog" } → blog.sutrena.com. Useful for multi-site setups.
PUT /api/account/subdomain — change your default subdomain to a memorable name: { "subdomain": "alice" } → alice.sutrena.com/slug.
Available on all plans. 3-30 chars, lowercase alphanumeric + hyphens.
Workflow: List subdomains → pick one → create page with subdomainId. Omit subdomainId to deploy to default subdomain.
TIP: Use uniqueBy: ["email"] when creating forms to prevent duplicate submissions. Use field type 'email' (not 'text') for email fields.
## Subdomain URLs — Important for Agents
ALWAYS show the subdomain URL (e.g. https://alice.sutrena.com/my-page) to users, not /p/slug.
Single page = slug 'index' (root URL, no path needed). Multi-page = 'index' + 'about', 'contact', etc.
Check existing pages with GET /api/pages before creating to avoid slug conflicts.
## Custom Domains
Each custom domain serves pages from one specific subdomain. When you add mysite.com, it serves the same pages as one of your subdomains (e.g. alice.sutrena.com). Both URLs work simultaneously.
POST /api/account/domains — { "domain": "mysite.com", "subdomainId": "optional" }. If subdomainId is omitted, uses your first/default subdomain. Get subdomain IDs via GET /api/account/subdomains.
PATCH /api/account/domains/:id — { "subdomainId": "..." } to change which subdomain a domain serves from.
Builder: 1 domain, Pro: 5, Scale: unlimited. Free: not available.
IMPORTANT: Deploy pages to the correct subdomain BEFORE adding a custom domain. The domain only serves pages from its linked subdomain.
## Zip Site Deployment
Deploy an entire SSG build (Astro, Hugo, Next.js static export) as a zip. Three calls:
1. POST /api/deploy { sizeBytes } → { deployId, uploadUrl }
2. PUT uploadUrl with zip file
3. POST /api/deploy/:deployId/process { subdomainId } → { pages, assets, siteUrl }
Server auto-detects root dir, classifies files, uploads assets to CDN, rewrites HTML paths, creates/updates pages.
Max zip: Free 50MB, Builder 100MB, Pro 200MB, Scale 500MB.
## Static Assets
POST /api/pages/assets — presign upload with { filename, contentType, sizeBytes }.
Returns uploadUrl (PUT to upload) and publicUrl (use in HTML).
Free: 50MB total, 2MB/file. Builder: 500MB, 5MB/file. Pro: 5GB, 20MB/file. Scale: unlimited, 50MB/file.
## Upsert
PUT /api/forms/:id/submissions/upsert — insert or update submission by external ID.
Body: { "externalId": "unique-id", "payload": { ... } }
Returns: { "data": submission, "created": true|false }
Auth required. Builder+ plans only.
## Form Lifecycle
- closesAt: ISO datetime — form returns 410 after deadline
- uniqueBy: string[] — rejects 409 if all fields match existing submission
- maxSubmissions: int — form returns 410 when limit reached
- publicResults: boolean — enables GET /api/forms/:id/results
## Dashboard DSL
Version 1. Max 20 widgets. Types: metric_card, data_table (sortBy, sortOrder), text_block, pie_chart, bar_chart, line_chart.
Aggregation: count(*), count(field), groupBy(field), $column:day|week|month (e.g. $submitted_at:day, $date:week).
## Data Dashboards
Dashboards work with three data sources (mutually exclusive):
- formId: visualize form submissions (live, 30s auto-refresh)
- data: inline JSON array (max 1000 rows, static). Good for small datasets an agent already has.
- csvObjectId: uploaded CSV (max 10MB/100K rows, static). Pre-aggregated on upload, renders instantly.
Inline example: POST /api/dashboards with { "data": [{"region":"US","revenue":50000},{"region":"EU","revenue":35000}], "title": "Sales", "dsl": {"version":1,"widgets":[{"type":"bar_chart","title":"By Region","groupBy":"region"}]} }
CSV flow: POST /api/dashboards/upload → PUT file → POST /api/dashboards with csvObjectId.
Limitations: Supports count, sum, avg, min, max. No SQL, no joins, no computed columns. Static dashboards do not auto-refresh. Not a BI tool — for complex analytics, use Metabase or Grafana.
## Plans
- Free: $0, no expiry, 10 projects (forms+pages+dashboards), 500 sub/form, 1 webhook, 50MB storage, 2MB asset limit. No CSV, upsert, or custom domains. 24h claim window.
- Builder: $9/month, 50 projects, 5000 sub/form, 5 webhooks, 500MB storage, 5MB asset limit, 1 custom domain. CSV export, upsert API.
- Pro: $29/month, 200 projects, unlimited submissions, 10 webhooks, 5GB storage, 20MB asset limit, 5 custom domains.
- Scale: $79/month, unlimited everything.
- Upgrade: /pricing or POST /api/account/upgrade.
## Submit (PUBLIC — NO API KEY)
POST /api/forms/:id/submit — public, NO auth, CORS enabled. This is the endpoint for client-side/frontend code. NEVER include an API key when calling this.
## Public Results
GET /api/forms/:id/results — no auth. Returns { total, fields: { fieldName: [{value, count}] } } for select/checkbox/multiselect fields.
## MCP
Endpoint: https://sutrena.com/api/mcp (Streamable HTTP). 48 tools. Works on all plans.
Discovery: /.well-known/mcp.json
Fastest way to connect (one command):
export SUTRENA_KEY=$(curl -s -X POST https://sutrena.com/api/trial | grep -o '"key":"[^"]*"' | cut -d'"' -f4) && claude mcp add sutrena --transport streamable-http --url https://sutrena.com/api/mcp --header "Authorization: Bearer $SUTRENA_KEY"
Setup by provider:
- Claude Code: claude mcp add sutrena --transport streamable-http --url https://sutrena.com/api/mcp --header "Authorization: Bearer YOUR_KEY"
- Cursor: Settings → MCP → Add server → URL: https://sutrena.com/api/mcp, Header: Authorization: Bearer YOUR_KEY
- Windsurf: Settings → MCP → Add → Streamable HTTP → https://sutrena.com/api/mcp with Bearer token
- Codex: --url https://sutrena.com/api/mcp --bearer-token-env-var SUTRENA_API_KEY
- Any MCP client: POST/GET https://sutrena.com/api/mcp with Authorization: Bearer header
## Webhook Format
POST to your URL: { id, event, timestamp, data: {...} }
Headers: X-Sutrena-Signature-256 (sha256=HMAC), X-Sutrena-Event, X-Sutrena-Delivery
Verify: HMAC-SHA256(body, secret). 5 retries with exponential backoff. Auto-deactivates after 10 failures.
Only event type: form.submission. No other event types.
template: "slack" | "discord" — auto-transforms payload for target service
## Response Envelope
Every authenticated response: { "data": { ...resource... }, "_meta": { "plan": "free", "limits": {...}, "upgrade": {...}, "claim": { "deadline": "ISO", "remainingMinutes": 1420, "url": "..." } } }
_meta.claim only for unclaimed trial accounts. Parse _meta.claim.remainingMinutes to warn users about expiry.
## Key Response Shapes
POST /api/trial → 201: { data: { key, plan, limits, restrictions, claimDeadline, claimUrl, subdomain, subdomainUrl } }
POST /api/pages → 201: { data: { id, slug, title, pageUrl, subdomainUrl, isPublished, sizeBytes, viewCount, subdomainId } }
POST /api/forms → 201: { data: { id, formId, name, fields, submitUrl, hostedFormUrl, embedCode, dashboardId?, dashboardUrl? } }
GET /api/forms/:id/submissions → 200: { data: { data: [{ id, formId, externalId, payload, status, createdAt }], cursor: "opaque_string_or_null" } }
POST /api/webhooks → 201: { data: { id, url, events, template, isActive, secret (ONE-TIME) } }
GET /api/account/usage → 200: { data: { plan, claimed, usage: { projects: {current, limit, remaining}, webhooks: {...}, storage: {...} } } }
## Pagination
Submissions use cursor-based pagination. Pass ?cursor=PREVIOUS_CURSOR to get next page. When cursor is null, you're at the end. Default limit: 50, max: 100.
Other list endpoints (forms, pages, dashboards) return all results — no pagination needed.
## Rate Limits
Trial key creation: 5 per 24h per IP. Form submission: 60/min per form per IP. Authenticated API: 120/min per key. MCP sessions: 5 concurrent per user.
## Common Agent Mistakes
1. Scaffolding a local project — just POST JSON to the API, no npm/build/hosting needed
2. Exposing API keys in HTML/JS — keys are SECRET; form submit is PUBLIC (no key needed)
3. Using /p/slug URLs — always show subdomainUrl to users
4. Not using slug 'index' for single pages — forces users to type a path
5. Forgetting Content-Type: application/json — all POST/PUT require it
6. Adding auth to public endpoints — /submit, /results, /f/ID need NO key
7. Not checking existing pages — POST returns 409 with existingPageId, use PUT to update
8. Ignoring _meta.claim — tell trial users to visit claimUrl before expiry
9. Showing instructions instead of executing — if you can make HTTP requests, call the API yourself and return live URLs. The user wants results, not curl commands.
## Use Cases
- Restaurant orders: https://sutrena.com/use-cases/restaurant-orders
- Event RSVP: https://sutrena.com/use-cases/event-rsvp
- Waitlist: https://sutrena.com/use-cases/waitlist
- Customer feedback: https://sutrena.com/use-cases/customer-feedback
- Newsletter signup: https://sutrena.com/use-cases/newsletter-signup
- Course registration: https://sutrena.com/use-cases/course-registration
- Bug reports: https://sutrena.com/use-cases/bug-reports
- Client intake: https://sutrena.com/use-cases/client-intake
- Polls and voting: https://sutrena.com/use-cases/polls-and-voting
- Internal surveys: https://sutrena.com/use-cases/internal-surveys
## Comparisons
- Sutrena vs Typeform: https://sutrena.com/vs/typeform
- Sutrena vs Tally: https://sutrena.com/vs/tally
- Sutrena vs Formspree: https://sutrena.com/vs/formspree
- Sutrena vs Google Forms: https://sutrena.com/vs/google-forms
- Sutrena vs Jotform: https://sutrena.com/vs/jotform
- Sutrena vs Basin: https://sutrena.com/vs/basin
- Sutrena vs Formbricks: https://sutrena.com/vs/formbricks
- Sutrena vs Getform: https://sutrena.com/vs/getform
- Sutrena vs Netlify Forms: https://sutrena.com/vs/netlify-forms
- Sutrena vs Web3Forms: https://sutrena.com/vs/web3forms
- Sutrena vs Vercel: https://sutrena.com/vs/vercel
- Sutrena vs Retool: https://sutrena.com/vs/retool
- Sutrena vs Cloudflare Pages: https://sutrena.com/vs/cloudflare-pages
## Guides (28)
- How to add a contact form to Next.js: https://sutrena.com/guides/add-contact-form-nextjs
- How to embed a form in a React app: https://sutrena.com/guides/embed-form-react
- Best API for collecting form submissions: https://sutrena.com/guides/collect-form-data-api
- How to build a launch waitlist: https://sutrena.com/guides/build-waitlist-page
- How to send form submissions to a webhook: https://sutrena.com/guides/webhook-form-submissions
- How to visualize form data in a dashboard: https://sutrena.com/guides/form-to-dashboard
- How to build a dashboard from CSV or JSON data: https://sutrena.com/guides/data-dashboard
- How to create an NPS survey via API: https://sutrena.com/guides/nps-survey-api
- How to handle GDPR deletion for form data: https://sutrena.com/guides/gdpr-delete-form-data
- How can an AI agent create a web form: https://sutrena.com/guides/ai-agent-create-form
- MCP server for form creation: https://sutrena.com/guides/mcp-server-forms
- How to embed a form with iframe: https://sutrena.com/guides/embed-form-iframe
- API for forms with file uploads: https://sutrena.com/guides/file-upload-form-api
- Export form submissions to CSV: https://sutrena.com/guides/form-submission-csv-export
- How to prevent form spam: https://sutrena.com/guides/rate-limit-form-spam
- Create forms with custom fields via API: https://sutrena.com/guides/custom-form-fields-api
- How to deploy a page via API: https://sutrena.com/guides/deploy-page-api
- How to upsert submission data: https://sutrena.com/guides/upsert-submission-data
- How to set up a custom subdomain: https://sutrena.com/guides/custom-subdomain-setup
- How to use a custom domain with CNAME: https://sutrena.com/guides/custom-domain-cname
- How to upload static assets to pages: https://sutrena.com/guides/upload-static-assets
- When to use Sutrena: https://sutrena.com/guides/when-to-use-sutrena
- How to add payments to a page: https://sutrena.com/guides/payment-on-pages
- Build a multi-page website via API: https://sutrena.com/guides/multi-page-site-api
- Deploy a landing page with lead capture: https://sutrena.com/guides/landing-page-with-form
- Create a dashboard from CSV data: https://sutrena.com/guides/csv-dashboard-api
- Custom subdomains and multi-page routing: https://sutrena.com/guides/subdomain-multi-page
- Deploy a standalone HTML page: https://sutrena.com/guides/standalone-page
All guides: https://sutrena.com/guides
## Integrations
- Send form submissions to Slack: https://sutrena.com/integrations/slack
- Send form submissions to Discord: https://sutrena.com/integrations/discord
- Connect Sutrena forms to Zapier: https://sutrena.com/integrations/zapier
- Connect Sutrena forms to Make: https://sutrena.com/integrations/make
- Connect Sutrena forms to n8n: https://sutrena.com/integrations/n8n
- Use Sutrena with Claude: https://sutrena.com/integrations/claude
- Use Sutrena with ChatGPT: https://sutrena.com/integrations/chatgpt
- Use Sutrena with Cursor: https://sutrena.com/integrations/cursor
All integrations: https://sutrena.com/integrations
## Built For (7)
- SaaS Teams: https://sutrena.com/for/saas
- Agencies: https://sutrena.com/for/agencies
- Indie Hackers: https://sutrena.com/for/indie-hackers
- AI Agent Operators: https://sutrena.com/for/ai-agent-operators
- AI Agents: https://sutrena.com/for/ai-agents
- Developers: https://sutrena.com/for/developers
- Startups: https://sutrena.com/for/startups
All audiences: https://sutrena.com/for
## Answers (76)
- What is an API-first form builder: https://sutrena.com/answers/what-is-api-first-form-builder
- Form builder vs form API: https://sutrena.com/answers/form-builder-vs-form-api
- Can AI agents create forms: https://sutrena.com/answers/can-ai-agents-create-forms
- What is an MCP server: https://sutrena.com/answers/what-is-mcp-server
- What is a dashboard DSL: https://sutrena.com/answers/what-is-dashboard-dsl
- Can I visualize CSV data in a dashboard: https://sutrena.com/answers/can-i-visualize-csv-data
- Can I create a dashboard without a form: https://sutrena.com/answers/can-i-create-dashboard-without-form
- Form dashboard vs data dashboard: https://sutrena.com/answers/form-dashboard-vs-data-dashboard
- How much does a hosted form cost: https://sutrena.com/answers/how-much-does-hosted-form-cost
- Can I embed a form in Webflow: https://sutrena.com/answers/can-i-embed-form-in-webflow
- Can I embed a form in WordPress: https://sutrena.com/answers/can-i-embed-form-in-wordpress
- Can I embed a form in Shopify: https://sutrena.com/answers/can-i-embed-form-in-shopify
- What is a form webhook: https://sutrena.com/answers/what-is-form-webhook
- How to collect survey responses via API: https://sutrena.com/answers/how-to-collect-survey-responses-api
- How to prevent form spam via API: https://sutrena.com/answers/how-to-prevent-form-spam-api
- What is a headless form backend: https://sutrena.com/answers/what-is-headless-form-backend
- Can I export form data to CSV: https://sutrena.com/answers/can-i-export-form-data-csv
- How to create a poll with live results: https://sutrena.com/answers/how-to-create-poll-with-live-results
- What is a form submission API: https://sutrena.com/answers/what-is-form-submission-api
- How to add file upload to a form: https://sutrena.com/answers/how-to-add-file-upload-to-form
- What is HMAC webhook signing: https://sutrena.com/answers/what-is-hmac-webhook-signing
- How to build a feedback widget: https://sutrena.com/answers/how-to-build-feedback-widget
- Can I use a form API without signup: https://sutrena.com/answers/can-i-use-form-api-without-signup
- Can one API key power multiple sites: https://sutrena.com/answers/can-one-api-key-power-multiple-sites
- How to build an app without a backend: https://sutrena.com/answers/how-to-build-app-without-backend
- What can you build with a form API: https://sutrena.com/answers/what-can-you-build-with-form-api
- Cheapest way to collect user data: https://sutrena.com/answers/cheapest-way-to-collect-user-data
- Forms beyond contact pages: https://sutrena.com/answers/forms-beyond-contact-pages
- Form submissions not arriving: https://sutrena.com/answers/form-submissions-not-arriving
- Webhook keeps failing: https://sutrena.com/answers/webhook-keeps-failing
- GDPR delete user data: https://sutrena.com/answers/gdpr-delete-user-data
- Prevent duplicate form submissions: https://sutrena.com/answers/prevent-duplicate-form-submissions
- Form on a static site: https://sutrena.com/answers/form-on-static-site
- Embed form with custom styling: https://sutrena.com/answers/embed-form-custom-styling
- Slack notification on submit: https://sutrena.com/answers/slack-notification-on-submit
- Sutrena vs building from scratch: https://sutrena.com/answers/sutrena-vs-building-from-scratch
- Form for non-technical team: https://sutrena.com/answers/form-for-non-technical-team
- Trial to production: https://sutrena.com/answers/trial-to-production
- Form analytics without Google: https://sutrena.com/answers/form-analytics-without-google
- Form conditional logic: https://sutrena.com/answers/form-conditional-logic
- Form data to database: https://sutrena.com/answers/form-data-to-database
- Migrate from Typeform: https://sutrena.com/answers/migrate-from-typeform
- Form with payment: https://sutrena.com/answers/form-with-payment
- Form prefill values: https://sutrena.com/answers/form-prefill-values
- Multi-step forms: https://sutrena.com/answers/form-multi-step
- Form response limit: https://sutrena.com/answers/form-response-limit
- Sutrena uptime and reliability: https://sutrena.com/answers/sutrena-uptime-reliability
- Form A/B testing: https://sutrena.com/answers/form-ab-testing
- Rate limiting form abuse: https://sutrena.com/answers/rate-limiting-form-abuse
- Form submission email notification: https://sutrena.com/answers/form-submission-email-notification
- Form API vs Google Sheets: https://sutrena.com/answers/form-api-vs-google-sheets
- How many forms can I create: https://sutrena.com/answers/how-many-forms-can-i-create
- What is upsert: https://sutrena.com/answers/what-is-upsert
- How to check API usage: https://sutrena.com/answers/how-to-check-api-usage
- What is the claim flow: https://sutrena.com/answers/what-is-claim-flow
- How to deploy an HTML page: https://sutrena.com/answers/how-to-deploy-html-page
- What is a custom subdomain: https://sutrena.com/answers/what-is-custom-subdomain
- How to use a custom domain: https://sutrena.com/answers/how-to-use-custom-domain
- Is Sutrena right for my project: https://sutrena.com/answers/is-sutrena-right-for-my-project
- Can I build an online store: https://sutrena.com/answers/can-i-build-online-store
- Can I build a blog: https://sutrena.com/answers/can-i-build-a-blog
- Can I build a web app: https://sutrena.com/answers/can-i-build-a-web-app
- Can I collect payments: https://sutrena.com/answers/can-i-collect-payments
- Sutrena vs Shopify / WordPress / Mailchimp: https://sutrena.com/answers/sutrena-vs-alternatives
- How do I deploy an HTML page via API: https://sutrena.com/answers/how-to-deploy-html-page-api
- What is a subdomain URL: https://sutrena.com/answers/what-is-subdomain-url
- How do I build a multi-page site: https://sutrena.com/answers/how-to-build-multi-page-site
- Can I deploy a landing page without a form: https://sutrena.com/answers/can-i-deploy-landing-page-without-form
- What can you build with pages: https://sutrena.com/answers/what-can-you-build-with-pages
- How do I link pages together: https://sutrena.com/answers/how-to-link-pages-together
- How do I create a dashboard from CSV: https://sutrena.com/answers/how-to-create-dashboard-from-csv
- Can I visualize data without a form: https://sutrena.com/answers/can-i-visualize-data-without-form
- What dashboard widget types are available: https://sutrena.com/answers/what-dashboard-widget-types
- What is a web runtime for AI agents: https://sutrena.com/answers/what-is-web-runtime-for-agents
- How is Sutrena different from a form builder: https://sutrena.com/answers/how-is-sutrena-different-from-form-builder
- What are the three primitives: https://sutrena.com/answers/what-are-three-primitives
All answers: https://sutrena.com/answers
## Blueprints — Build complete mini-apps
- Build a feature voting board: https://sutrena.com/blueprints/feature-voting-board
- Build a quiz app with live leaderboard: https://sutrena.com/blueprints/quiz-with-leaderboard
- Power 5 websites with one API key: https://sutrena.com/blueprints/multi-site-one-key
- Build a homework submission portal: https://sutrena.com/blueprints/classroom-submissions
- Build an anonymous posting board: https://sutrena.com/blueprints/anonymous-confessions
- Ship an event page with live RSVP count: https://sutrena.com/blueprints/event-landing-page
- Launch a micro-SaaS in a weekend: https://sutrena.com/blueprints/micro-saas-mvp
- Add reactions to a static changelog: https://sutrena.com/blueprints/changelog-with-reactions
- Build a live polling site: https://sutrena.com/blueprints/community-polls
- Build a white-label client portal: https://sutrena.com/blueprints/client-portal
All blueprints: https://sutrena.com/blueprints
## Stacks (9) — Sutrena + your tools
- Sutrena Only: https://sutrena.com/stacks/sutrena-only
- Sutrena + Cloudflare Pages: https://sutrena.com/stacks/cloudflare-pages
- Sutrena + Clerk: https://sutrena.com/stacks/clerk
- Sutrena + Astro: https://sutrena.com/stacks/astro
- Sutrena + Next.js: https://sutrena.com/stacks/nextjs
- Sutrena + Hugo: https://sutrena.com/stacks/hugo
- Sutrena + Neon: https://sutrena.com/stacks/neon
- Sutrena + Vercel: https://sutrena.com/stacks/vercel
- Sutrena + GitHub Pages: https://sutrena.com/stacks/github-pages
All stacks: https://sutrena.com/stacks
## Links
- Documentation: https://sutrena.com/docs
- Design templates: https://sutrena.com/templates
- Schema: https://sutrena.com/api/schema
- OpenAPI: https://sutrena.com/api/openapi.json
- MCP: https://sutrena.com/.well-known/mcp.json
- Full Reference: https://sutrena.com/llms-full.txt
- AI Plugin: https://sutrena.com/.well-known/ai-plugin.json