For developers
A form is one file and one POST
No bundle, no hydration, no client framework. Open a published ava42 form and the network tab shows a single HTML document - that is the whole page. Then integrate it with a REST API small enough to hold in your head.
Free plan: one form, ten responses, the full API. $10/month for everything unlimited.
Why it's built this way
Every claim here is checkable in ten seconds
Open any form on this site with devtools. That is the argument.
1
One request
CSS is inline, the icon is an inline SVG, and there is no JavaScript bundle, web font, analytics beacon or third-party call. Forms are rendered once at publish and stored complete, so serving one never touches the database.
0
Zero JS to submit
Every form is a native <form method=POST>. Conditional logic, multi-step paging, drag-to-rank and live recall are enhancements; with scripts off the fields show, the steps stack, ranking becomes selects, and the server re-evaluates every rule itself.
p99
Rust and embedded SQLite
axum, no GC pauses, and a database that lives in-process - a query is a function call, not a network hop. Flat tail latency on a single small machine, which is also why it costs $10 rather than $50.
How to integrate
Four things, and you have all of it
Mint a key in Settings → API. Everything below is org-scoped to that key.
1. Create a form
A form is its JSON. Post the schema, get a live URL back.
curl -X POST https://ava42.com/v1/forms \
-H "Authorization: Bearer ava_..." \
-H "content-type: application/json" \
-d '{"title":"Bug report","fields":[
{"type":"text","name":"summary","label":"What broke?","required":true},
{"type":"select","name":"severity","label":"How bad?",
"options":["Annoying","Blocking","On fire"]},
{"type":"file","name":"screenshot","label":"A screenshot","max":2}
]}'
# => {"id":"...","slug":"bug-report-8f21","url":"/f/bug-report-8f21"}2. Read the answers
JSON for code, CSV for the spreadsheet someone will inevitably ask for.
curl https://ava42.com/v1/forms/FORM_ID/submissions \ -H "Authorization: Bearer ava_..." curl https://ava42.com/v1/forms/FORM_ID/submissions.csv \ -H "Authorization: Bearer ava_..." -o answers.csv
Or don't poll at all: set webhook_url on the form and each submission is POSTed to you as JSON when it arrives.
3. Prefill from the URL
Name a query parameter after a question and it arrives filled in. No setup, no hidden fields. The respondent's own answer always wins.
https://ava42.com/f/[email protected]&plan=Pro
A parameter matching no question - utm_source, lead_id - is stored with the response anyway, so hidden data needs no fields defined. (A file question is the one thing a link cannot fill: browsers only let a person choose a file.)
4. Embed it
One iframe. The form drops its page background and card border when framed, and posts its height so it resizes as questions appear.
<iframe src="https://ava42.com/f/your-slug" title="Bug report"
style="width:100%;border:0;height:600px" loading="lazy"></iframe>
<script>addEventListener("message",function(e){
if(e.origin!=="https://ava42.com"||e.data?.ava!=="height")return;
document.querySelector('iframe[src*="/f/your-slug"]').style.height=
e.data.height+"px";
});</script>Without the script it still works - you pick a height and live with it.
Bring your own model
The schema is written for machines, so use whichever one you like
We have a generator built in, but you are not obliged to use ours. The full field spec lives at /schema.md and an ingestible summary of the whole product at /llms.txt. Point Claude, ChatGPT or a local model at either and it can produce a valid form.
Read https://ava42.com/schema.md and output ONLY a JSON FormSchema for a patient intake form: contact details, insurance, symptoms, consent checkbox. Use conditional logic so insurance questions appear only when insured=yes.
Then post what it gives you to /v1/forms, or paste it into the builder's import box. Every schema is validated server-side before it can publish, so a model that invents a field type gets a named error rather than a broken form.
Our own generator is part of Pro. Your own model works on any plan, including free.
Worth knowing before you build
The limits, stated plainly
No SDK
Deliberately. Seven endpoints and a Bearer token do not need a client library, and a library is a thing that goes stale between you and the API.
20 MB per file
On every plan including Pro - three files and 30 MB per response. A hard ceiling rather than a tier: an upload is validated in memory, and one customer's 200 MB video should not threaten everyone else's forms.
One region
Embedded SQLite is a single writer, so there is one machine, in ord, with the database replicated continuously off-machine. Published forms are edge-cached worldwide; writes go to one place.
Build something in the next ten minutes
Sign in, mint a key in Settings → API, and post your first schema. The free plan has the whole API in it.