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 & path | Purpose |
|---|---|
GET /landing-designs | List designs visible to the current account/creator scope |
POST /landing-designs | Create a new (empty) design |
GET /landing-designs/{id} | Fetch one design, including its draft HTML |
POST /landing-designs/{id}/upload | Upload a document (.html or .zip) — sanitize → validate slots → store |
POST /landing-designs/{id}/rename | Rename a design |
DELETE /landing-designs/{id} | Delete a design (409 while any domain still references it) |
GET /landing-designs/{id}/preview | Render the draft HTML through the live runtime, for the admin editor |
GET /landing-designs/starter.zip | Download 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>}.
Buyer stats link
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 & path | Purpose |
|---|---|
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}/refresh | Re-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
- Back to Landing-page builder
- Troubleshooting