Landing pages
Hosted pages built from blocks, with an email signup that feeds your audience. Publish on a Runearc address or on your own page domain.
Pages
A page has a slug, a name (internal), a title and description (for the browser and search), an ordered
list of blocks, and an optional form_id that a signup block submits to (see Forms and
popups). It is a draft or published; a published page has a url, of the form
/p/<workspace slug>/<slug> on the Runearc site, or on your page domain. Publishing a page with a signup block
and no form fails with page_needs_form.
curl -X POST https://api.runearc.com/v1/pages \
-H "Authorization: Bearer $RUNEARC_API_KEY" -H "Content-Type: application/json" \
-d '{ "name": "Spring launch", "template": "waitlist", "form_id": "frm_..." }'
curl -X POST https://api.runearc.com/v1/pages/$PAGE_ID/publish \
-H "Authorization: Bearer $RUNEARC_API_KEY"| Template id | Contents | |
|---|---|---|
| blank | A hero and a footer. | |
| waitlist | Hero, features and an email signup. | |
| product-launch | Hero, features, signup and a closing call to action. | |
| newsletter | A short pitch and a signup. |
| Block type | Keys | |
|---|---|---|
| hero | headline, subhead, cta_label, cta_href | |
| features | title, items: [{title, body}] (at most 12) | |
| signup | headline, subhead | At most one per page. |
| cta | headline, button_label, button_href | |
| footer | text, links: [{label, href}] (at most 12) |
Each block also has an id (unique in the page). A page has at most 30 blocks, and any text is at most 2,000
characters. Links must be valid URLs or paths (invalid_page_link).
| Request | Body | Returns |
|---|---|---|
| GET /v1/pages | none | Summaries: id, slug, name, status, views, leads, conv_per_view, updated_at, url. |
| GET /v1/pages/templates | none | The four templates. |
| POST /v1/pages | name, slug, template (default blank), form_id | 201 and the page as a draft. |
| GET /v1/pages/{id} | none | The page with blocks. |
| PATCH /v1/pages/{id} | name, slug, title, description, form_id (null clears), blocks | The page. |
| DELETE /v1/pages/{id} | none | 204. Removes its counts too. |
| POST /v1/pages/{id}/publish | none | The published page with its url. |
| POST /v1/pages/{id}/unpublish | none | The page, offline. |
Page domain
Each workspace can serve its pages from one hostname of its own, such as go.yourdomain.com. Set the hostname,
add the CNAME returned in cname_target at your DNS host, then verify. TLS certificates are issued for verified
hosts only. You can pick a published page as the home page of the host; the host resolves a page by its slug,
and with no slug it serves the home page.
| Request | Body | Returns |
|---|---|---|
| GET /v1/page-domain | none | hostname, cname_target, verified, verified_at, home_page_id. |
| PUT /v1/page-domain | hostname | The domain, unverified. Changing the host clears verification and the home page. |
| POST /v1/page-domain/verify | none | Checks the CNAME in live DNS. |
| PUT /v1/page-domain/home | page_id, or null | The domain with its home page. |
| DELETE /v1/page-domain | none | 204. |
Public endpoints
The page server calls these without a key: GET /v1/public/pages/by-host?host=&slug=,
GET /v1/public/pages/by-slug/{org_slug}/{slug}, POST /v1/public/pages/{id}/view (counts a view; bots are
ignored), POST /v1/public/pages/{id}/submit with { "fields": { "email": "..." }, "website": "" } (the
signup, with a honeypot), and GET /v1/public/pages/tls-ask?domain= for certificate issuance. You normally do
not call them.
CLI and MCP
runearc pages templates
runearc pages create "Spring launch" --template waitlist --form frm_...
runearc pages publish pg_...
runearc pages list
runearc pages unpublish pg_... | delete pg_... | show pg_...
runearc pages domain set go.yourdomain.com
runearc pages domain verify
runearc pages domain show | removeMCP tools: list_pages, create_page, get_page, update_page, publish_page, unpublish_page and
delete_page. The domain endpoints have no MCP tool.
Errors
| Code | Status | Meaning and fix |
|---|---|---|
| page_needs_form | 400 | Attach a form with PATCH before publishing a page that has a signup block. |
| invalid_page_form | 400 | The form does not exist in this workspace. |
| page_slug_taken | 409 | Pick another slug. |
| invalid_page_name, invalid_page_slug, unknown_page_template | 400 | Use a name, a lowercase slug and a template from GET /v1/pages/templates. |
| too_many_blocks, too_many_features, too_many_links, too_many_signup_blocks, duplicate_block_id, page_text_too_long, invalid_page_link | 400 | Keep within the block limits above. |
| reserved_page_host | 400 | Use a subdomain of a domain you own. |
| page_host_taken | 409 | Use a different subdomain. |