Skip to content

Waitlist API

REST endpoints for the Waitlist area of Lessly.

The Waitlist area publishes 7 REST endpoints. Paths are relative to https://api.lessly.com; see Authentication for the required header.

GET/waitlist/config

Get the waitlist configuration (consent text, policy url, policy label, policy version, sender domain, invite template, invite subject) for the current product. Returns null if not configured yet.

MCP tool: waitlist_config_get

Parameters

No parameters.

Response

Returns object | null.

PUT/waitlist/config

Create or replace the waitlist configuration for the current product (full-document upsert). consent_text is plain text (may contain a {policy} placeholder); policy_url/policy_label render a structured policy link; invite_subject is the invite email subject line. Stored as-is; content correctness is the controller responsibility.

MCP tool: waitlist_config_upsert

Parameters

NameInTypeRequiredDescription
policyVersionbodystringPolicy version label, controller-owned free string. Stored as-is, not validated for monotonicity.
consentTextbodystringPlain-text consent statement shown at signup. May contain a {policy} placeholder marking the policy link. Stored as-is (no HTML sanitization).
policyUrlbodystring | nullPolicy link URL (http/https/mailto). Rendered as a structured link in the form. Null to clear.
policyLabelbodystring | nullVisible text for the policy link. Falls back to the URL itself if absent.
senderDomainbodystring | nullSender domain for invite emails (bare hostname). Verification happens at send time, not here. Null to clear.
senderNamebodystring | nullController display name shown as the invite From name and in the default email body (A7§64 controller identity). Stored as-is. Null to clear (falls back to a generic sender name).
inviteTemplatebodystring | nullInvite email template ({{vars}}). Stored as-is; rendered/validated at send time. Null to clear.
inviteSubjectbodystring | nullInvite email subject line. Plain text, stored as-is; CR/LF stripped at send time. Null to clear (falls back to a default subject).
siteBaseUrlbodystring | nullPer-product public base URL of the tenant site; invite (/signup) and opt-out (/withdraw) links are built from it. http/https only, path allowed, trailing slash stripped. Stored as-is (DP-013); not content-verified. Null to clear.

Response

Returns object.

FieldTypeAlwaysDescription
createdAtstring (date-time)
policyUrlstring | null
productIdstring
updatedAtstring (date-time)
senderNamestring | null
consentTextstring
policyLabelstring | null
siteBaseUrlstring | null
senderDomainstring | null
inviteSubjectstring | null
policyVersionstring
inviteTemplatestring | null
GET/waitlist/embed

Returns the waitlist embed <script> tag for the current product.

MCP tool: waitlist_embed_get

Parameters

No parameters.

Response

Returns object.

FieldTypeAlwaysDescription
product_idstring
script_tagstring
public_edge_urlstring
POST/waitlist/erasure

GDPR Art.17 erasure by email within the current product. Hard-deletes the signup and its invite tokens, reduces the consent-ledger rows to the post-erasure minimum (raw email replaced by a keyed hash), and adds the email to the do-not-contact suppression list. Idempotent. Returns counts of what was affected; never returns PII.

MCP tool: waitlist_signups_erase

Parameters

NameInTypeRequiredDescription
emailbodystringEmail address to erase (GDPR Art.17) within the current product. Normalized (trimmed + lowercased) server-side. The operation is idempotent.

Response

Returns object.

FieldTypeAlwaysDescription
suppressedboolean
deletedTokensnumber
deletedSignupsnumber
reducedConsentsnumber
POST/waitlist/invites/send

Send invite emails to waitlist signups. Provide an explicit email list and/or a filter; set force=true to resend when a live invite already exists.

MCP tool: waitlist_invites_send

Parameters

NameInTypeRequiredDescription
emailsbodystring[]Explicit recipient emails (e.g. from waitlist_signups_list). Combined with filter if both given.
filterbodyobjectSelection filter over signups; resolved server-side with pagination.
forcebodybooleanResend even when a live invite token already exists (mints a fresh token).

Response

Returns object.

FieldTypeAlwaysDescription
sentobject[]
failedobject[]
skippedobject[]
GET/waitlist/signups

List waitlist signups for the current product. Supports status filtering, keyset pagination, and field selection.

MCP tool: waitlist_signups_list

Parameters

NameInTypeRequiredDescription
statusquerystring | string[]one of: pending, invited, registeredFilter by status. A single value or an array. Omit to return all statuses.
fieldsquerystring[]one of: status, created_at, source, country, email, ip_hashFields to include per row. Default ["status","created_at"]; id is always included. email and ip_hash are PII and audited when requested.
cursorquerystringKeyset cursor from a previous response next_cursor. Omit to start from the beginning.
limitqueryintegerPage size, 1–200. Default 50.
orderquerystringone of: newest, oldestSort by created_at. newest = most recent first. Default newest.
qquerystringPrefix search on email (case-insensitive). Returns signups whose email starts with this value. Audited as PII access (DP-009).

Response

Returns object.

FieldTypeAlwaysDescription
itemsobject[]
has_moreboolean
next_cursorstring | null
GET/waitlist/signups/stats

Funnel counts (signup, invited, registered) for the current product over a time window, plus non_monotonic. Each stage is counted by its own transition timestamp, so a window can be non-monotonic (registered > signup) — transition events within the period, not a fixed cohort.

MCP tool: waitlist_signups_funnel

Parameters

NameInTypeRequiredDescription
periodquerystringone of: 7d, 30d, 90d, allTime window. "7d"/"30d"/"90d" = trailing N days ending now; "all" = all time. Default "30d".

Response

Returns object.

FieldTypeAlwaysDescription
tostring
fromstring | null
periodstring
signupnumber
invitednumber
registerednumber
non_monotonicboolean
Was this page helpful?
Esc

Start typing to search the docs.

navigateselect