Introduction
Launchlist is a lightweight waitlist platform. Create a project, generate an API key, and start collecting emails — in under 2 minutes.
There are two ways to collect emails: the REST API for server-side integrations, and the embeddable widget for dropping a form directly on any webpage. Both write to the same subscriber list inside your Launchlist dashboard.
Quick start
Get from sign-up to collecting emails in about 2 minutes.
Sign in at /login, then go to Dashboard → Waitlists → New waitlist. Choose a name and a URL-safe slug (e.g. my-app-beta).
Open your project and click Generate key in the API Keys panel. Copy the key immediately — it is shown in full once. Store it as an environment variable.
Make a POST request with the subscriber's email:
You'll get back a 201 Created on success. The subscriber immediately appears in your dashboard.
Creating a project
A project (also called a waitlist) is a named collection of subscriber emails. Each project has a unique slug used in API calls and embed URLs.
| Field | Required | Notes |
|---|---|---|
| Name | Yes | Display name shown in your dashboard. |
| Slug | Yes | Lowercase, hyphens only. Used in API and embed URLs. Must be globally unique. |
| Description | No | Internal note — not shown to subscribers. |
Navigate to Dashboard → Waitlists → New waitlist to create one. The slug is auto-generated from the name but you can edit it before saving.
API keys
Each project can have multiple API keys. Keys are scoped to a single project — a key for project my-app cannot add subscribers to other-app.
Generating a key
Open a project and click Generate key in the API Keys panel. The full key is shown once. If you lose it, revoke it and generate a new one.
Key format
All keys follow the format ll_live_ followed by 48 lowercase hex characters:
Security
Authentication
The /api/v1/subscribe endpoint requires an API key passed in one of two ways:
| Method | Header |
|---|---|
| Bearer token (preferred) | Authorization: Bearer ll_live_your_key |
| Header | X-API-Key: ll_live_your_key |
Both methods are equivalent. Choose whichever your HTTP client handles more naturally.
Bearer token example
X-API-Key example
POST /api/v1/subscribe
Add an email address to the waitlist associated with the API key. Idempotent — submitting an email twice returns 200 on the second call.
Request
| Header | Value |
|---|---|
| Content-Type | application/json |
| Authorization | Bearer <api_key> (or X-API-Key) |
Body
| Field | Type | Required | Description |
|---|---|---|---|
| string | Yes | Must be a valid email address. Stored lowercase. | |
| name | string | No | Subscriber name. Stored as-is. |
Responses
| Status | Body | Meaning |
|---|---|---|
| 201 Created | { "message": "Subscribed successfully" } | Email added to waitlist. |
| 200 OK | { "message": "Already subscribed" } | Email already exists — no duplicate created. |
| 400 Bad Request | { "error": "A valid email is required" } | Missing or malformed email. |
| 401 Unauthorized | { "error": "Invalid or revoked API key" } | Missing, wrong, or revoked key. |
| 500 Server Error | { "error": "Failed to subscribe" } | Database error. |
Code examples
JavaScript
Python
cURL
PHP
POST /api/v1/widget/[slug]
A public endpointfor browser-side subscriptions. No API key required. Used automatically by the embeddable widget — you generally don't call this directly unless you're building a custom widget UI.
Path parameter
| Param | Description |
|---|---|
| [slug] | Your project slug, e.g. my-saas-beta |
Body
| Field | Type | Required |
|---|---|---|
| string | Yes | |
| name | string | No |
Responses
| Status | Meaning |
|---|---|
| 201 | Subscribed successfully |
| 200 | Already subscribed |
| 400 | Invalid email |
| 404 | Project not found or inactive |
| 500 | Server error |
Widget builder
The widget builder lets you design an embeddable signup form without writing any code. Open it from your project page by clicking Widget in the top-right.
Templates
| Template | Best for |
|---|---|
| Card | Standalone signup section, landing pages, sidebar. |
| Minimal | Inline forms inside existing content or blog posts. |
| Banner | Full-width sections with copy on the left, form on the right. |
| Dark | Dark-themed websites or footer CTAs. |
Customization options
| Option | Description |
|---|---|
| Accent color | Button and highlight color. Supports any hex value. |
| Border radius | Sharp (4px), Rounded (12px), or Pill (999px). |
| Heading | Main headline text. |
| Subtext | Supporting description below the heading. |
| Button text | The submit button label. |
| Placeholder | Email input placeholder text. |
| Success message | Text shown after a successful subscription. |
| Ask for name | Adds an optional name field above the email input. |
Saving changes
Click Save changes to persist your config. The saved config is served to all embeds automatically — you never need to update your embed code when you change the widget design.
Script embed
The script embed is the recommended way to add a Launchlist widget to your site. It creates an auto-resizing iframe and requires no additional configuration.
The iframe sends a postMessage with its height whenever the content changes (including after a successful subscription). This keeps the iframe perfectly fitted to its content with no scrollbars.
iFrame embed
For simpler setups or CMSs that don't allow script tags, use the plain iframe variant. You'll need to set a fixed height manually.
| Attribute | Recommended value |
|---|---|
| width | 100% (fluid) |
| min-height | 180px for Minimal, 280px for Card/Dark, 120px for Banner |
| frameborder | 0 |
| scrolling | no |
Error codes
FAQ
Is there a rate limit on the subscribe endpoint?
The API key endpoint has no hard rate limit in the current version. The widget endpoint (no auth) has basic protection against abuse at the infrastructure level. Both will gain configurable rate limits in a future release.
Can I export my subscribers?
Yes — open a project in the dashboard, view the subscribers table, and export functionality is coming soon. In the meantime, you can query the subscribers table directly from your Launchlist dashboard.
Will a subscriber see an error if they submit twice?
No. The subscribe endpoint is intentionally idempotent — a duplicate email returns 200 OK with the message "Already subscribed" rather than an error. This lets you safely call the endpoint without de-duplicating on the client.
Does the widget work inside a React app?
Yes. Use the script embed or iframe — both work in React, Next.js, or any framework. Alternatively, call /api/v1/widget/[slug] directly from your own form component.
Is the embed CORS-friendly?
Yes. Both subscribe endpoints include Access-Control-Allow-Origin: * headers so they can be called from any domain.
What data is stored per subscriber?
email, name (optional), source (api or widget), and created_at. You can pass extra metadata via the metadata field in direct database inserts.
How do I delete a subscriber?
A subscriber management UI with delete support is on the roadmap.