Agent-friendly.Set auto_palette: true to skip palette selection — the API auto-picks the best match for the website's design.
02
Authentication
All authenticated endpoints use a Bearer token with the api_key returned when you create a list. Each list has its own unique key prefixed with sd_.
http header
Authorization: Bearer sd_k8x2mQ7nP3abYm7v...
Keep it secret.Your api_key grants full access to the list's subscriber data. Never expose it in client-side code or public repos. The embed_key (prefixed emb_) is safe to use in frontend code.
Unauthenticated requests to protected endpoints return 401 Unauthorized. If the key doesn't match the requested list, you'll get 403 Forbidden.
03
Endpoints
Base URL: https://waitlist.pl/api/v1
POST/api/v1/listsCreate a new list. Analyzes the website, generates palettes, and returns embed code and API key.
Accounting-ready.Each transaction includes Stripe receipt and invoice URLs. Use invoice_url to download PDF invoices for bookkeeping. Refunds appear as negative amounts with status: "refunded".
04
Rate Limits
Rate limits are enforced per scope. Exceeding them returns 429 Too Many Requests with a Retry-After header.
Scope
Limit
Window
Per email address (global)
3 confirmation emails
per day
Per list (subscribes)
50 requests
per minute
Per list (subscribes)
500 requests
per hour
Per list (pending cap)
1,000 unconfirmed
at any time
Per IP address
10 subscribes
per minute
API key (subscriber fetch)
100 requests
per minute
Bounce protection.Lists with a bounce rate above 30% (with 10+ emails sent) are automatically suspended. Lists above 10% (with 50+ sent) trigger a soft suspension with owner notification.
05
Code Examples
Full working examples in curl, Node.js, and Python. Copy, paste, run.
# 1. Create a listcurl-X POST https://waitlist.pl/api/v1/lists \
-H"Content-Type: application/json" \
-d'{
"url": "https://mysite.com",
"email": "[email protected]",
"auto_palette": true
}'# Response includes api_key and embed_key# Save the api_key: sd_k8x2mQ7nP3abYm7v# 2. Fetch subscriberscurl https://waitlist.pl/api/v1/lists/LIST_ID/subscribers \
-H"Authorization: Bearer sd_k8x2mQ7nP3abYm7v"# 3. Delete a subscriber (GDPR)curl-X DELETE https://waitlist.pl/api/v1/lists/LIST_ID/subscribers/user%40example.com \
-H"Authorization: Bearer sd_k8x2mQ7nP3abYm7v"# 4. Upgrade to 1k tiercurl-X POST https://waitlist.pl/api/v1/lists/LIST_ID/pay \
-H"Authorization: Bearer sd_k8x2mQ7nP3abYm7v" \
-H"Content-Type: application/json" \
-d'{"tier": "unlock_1k"}'
Start free. Pay per-list only when you need more subscribers. No accounts, no monthly bills unless you choose unlimited.
Free
$0
forever
Up to 100 confirmed subscribers
Full API access
AI-generated email template
Double opt-in emails
1K
$5
one-time, per list
Up to 1,000 confirmed subscribers
Full API access
CSV export
Everything in Free
10K
$19.99
one-time, per list
Up to 10,000 confirmed subscribers
Full API access
CSV export
Everything in Free
Unlimited
$10/mo
subscription, per list
Unlimited confirmed subscribers
Full API access
Priority support
Everything in Free
How it works.Subscribers are always collected, even on the free tier. When you exceed 100 confirmed subscribers, API access to subscriber data returns 402 Payment Required until you upgrade. New subscribers still receive confirmation emails — you never lose signups.
07
Agent Payments
AI agents can upgrade lists programmatically using the pay endpoint. The flow returns a Stripe Checkout URL that can be opened in a browser or processed automatically.
Payment Flow
The agent calls the pay endpoint with the desired tier, receives a checkout URL, and either redirects the user or opens a browser window to complete payment.
1
Request checkout
Call POST /api/v1/lists/:id/pay with the desired tier. Returns a Stripe checkout_url.
2
Complete payment
Redirect the user to the checkout_url or open it in a browser. Stripe handles the rest.
Agent Example
A fully automated agent can initiate payment and poll for tier changes after the user completes checkout.
bash
# 1. Request a checkout sessioncurl-X POST https://waitlist.pl/api/v1/lists/LIST_ID/pay \
-H"Authorization: Bearer sd_k8x2mQ7nP3abYm7v" \
-H"Content-Type: application/json" \
-d'{"tier":"unlock_1k"}'# Response: {"checkout_url": "https://checkout.stripe.com/c/pay/cs_live_..."}# 2. Open the checkout URL in a browser (agent-side)# - On macOS: open "$CHECKOUT_URL"# - On Linux: xdg-open "$CHECKOUT_URL"# - Or return the URL to the user for manual completion# 3. Poll for tier upgrade confirmationcurl https://waitlist.pl/api/v1/lists/LIST_ID \
-H"Authorization: Bearer sd_k8x2mQ7nP3abYm7v"# Check response: "tier" changes from "free" to "unlock_1k" after payment
Fully automated.After calling /pay, the agent receives a Stripe Checkout URL. For human-in-the-loop flows, redirect the user. For fully automated agents, use Stripe's API directly with the checkout session ID to complete payment programmatically.
Tier verification.Always poll GET /api/v1/lists/:id after payment to confirm the tier upgrade. Stripe webhooks process asynchronously, so the tier may take a few seconds to update.
Error Codes
All error responses follow the same shape:
json
{
"error": "rate_limit_exceeded",
"message": "Too many requests. Retry after 60 seconds."
}