TEASEDocs
ProductsLinkLanding-page builder

API reference gaps in the landing builder

Two live features with routes that the auto-generated API reference doesn't cover yet.

The auto-generated API reference (under /docs/api-reference, built from openapi.json) covers most of the landing builder's endpoints. Two live features currently have zero coverage there. This page is a stand-in route list for both — see each feature's own how-to for context and examples.

Custom HTML design library

See Upload a custom HTML design for the full walkthrough. Routes live in api/admin/landing_designs.py, all under /api/admin/landing-designs:

Method & pathPurpose
GET /landing-designsList designs visible to the current account/creator scope
POST /landing-designsCreate a new (empty) design
GET /landing-designs/{id}Fetch one design, including its draft HTML
POST /landing-designs/{id}/uploadUpload a document (.html or .zip) — sanitize → validate slots → store
POST /landing-designs/{id}/renameRename a design
DELETE /landing-designs/{id}Delete a design (409 while any domain still references it)
GET /landing-designs/{id}/previewRender the draft HTML through the live runtime, for the admin editor
GET /landing-designs/starter.zipDownload a starter kit (index.html with every slot + CSS + README + AI prompt)

Activation happens through the existing background-config endpoint (already documented elsewhere): POST /api/admin/bg/config?domain=… with {"design": "custom", "custom_design_id": <id>}.

See Give a media buyer a read-only stats link for the full walkthrough. The panel-side routes live in api/admin/landing_share_api.py (under the same admin API surface as the rest of Link, though the module itself lives alongside the Club product's admin routes since it reuses Club's report-share storage), under /api/admin/landing-share:

Method & pathPurpose
GET /landing-share?domain=…List live (non-revoked, non-expired) buyer links for a domain
POST /landing-share?domain=…&days=…&expires_days=…Create a link: freeze the domain's numbers and mint a token
POST /landing-share/{id}/refreshRe-freeze the same link's numbers without changing its URL
DELETE /landing-share/{id}Revoke a link (the row stays for audit; the public URL 404s)

The public page itself is one route, shared with the panel's PDF report shares: GET /exports/{token} (in api/shared_export.py) — unauthenticated, rate-limited, and serves a frozen snapshot rather than querying live data.

What's next

On this page