Developer-friendly waitlist

The developer-friendly waitlist. One POST, we keep the count.

Build your own interface for a Standard waitlist using its submission API. Get signup positions, capacity checks, email deduplication, and private status links without building those rules yourself. Queues and preorders have different admission responses; use the workflow-specific documentation.

Start with a signup template and make it yours.

A look at your page

Build with us from the start

Join the developer preview and tell us what you’re working on.

0 already joined

Explore the full template
Template preview · Developers

Build with us from the start

Join the developer preview and tell us what you’re working on.

Use your work email if this is for a team project.

0 already joined

The endpoint

POST the field keys from your form as JSON. Values are coerced the way a browser would send them, so numbers can be strings and checkboxes can be "on". Hidden-by-rule fields are ignored. The response is explicit:

  • 201 joined with position, or 200 already_joined without private entry details
  • 409 waitlist_full and 423 waitlist_closed, both with reopensAt
  • 422 validation_failed with a list of fieldKey, code, and message
  • 429 rate_limited with Retry-After

Keys, captcha, and CORS

Browser calls send a Cloudflare Turnstile token. Server calls send a Bearer API key and skip the captcha. CORS is open for the two public endpoints and never uses credentials. A honeypot, a timing check, and per-IP limits stay on regardless.

Webhooks you can verify

Starter and Pro include signed webhooks. Eligible signup events send a JSON payload with an HMAC-SHA256 signature over a timestamp and the raw body. Failed deliveries retry, and you can inspect delivery logs or redeliver from the dashboard. Held Standard signups wait until released before side effects are dispatched.

Correct under concurrency

Positions and capacity are decided under a database row lock per waitlist. The integration test fires 50 concurrent joins at capacity 10 and gets exactly 10 entries numbered 1 to 10. Per-day, per-week, and per-month capacity use the same lock, with a time zone and reset time you choose.

Render it yourself

GET the form definition and theme as JSON and build a native form in React, Swift, or a terminal. Or point a plain HTML form at the endpoint and let it redirect back with the result. The hosted widget stays available for the pages where you do not want to write anything.

FAQ

Questions

Is there an SDK?

Not yet. The docs include curl, fetch, and plain HTML examples. Choose the documentation for Standard submissions, queue tickets, or preorder orders.

How do I test webhooks locally?

Point the URL at a tunnel or webhook.site, hit Send test in the dashboard, and verify the signature with the snippet in the docs.

What are the limits?

Free includes 100 accepted signups, tickets, or orders per UTC month across the account. All form types share one lifetime 120-hour account grace period. After it ends, new uncovered Standard details are held from the owner; queues, preorders, and bookings pause uncovered requests. Capacity, hours, stock, rate limits, and the separate abuse ceiling (3,000 per month on Free) can also stop submissions. See the API and usage guides for response contracts.

Can I export everything?

Available Standard entries can be exported from the dashboard with fields across form revisions. Held entries are excluded until released. Public entry listing is not currently available.

Read the usage and grace period guide →

Choose the page for your next step.

Free includes 300 accepted signups, tickets, or orders per month across your account.

Create your form