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 idContents
blankA hero and a footer.
waitlistHero, features and an email signup.
product-launchHero, features, signup and a closing call to action.
newsletterA short pitch and a signup.
Block typeKeys
heroheadline, subhead, cta_label, cta_href
featurestitle, items: [{title, body}] (at most 12)
signupheadline, subheadAt most one per page.
ctaheadline, button_label, button_href
footertext, 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).

RequestBodyReturns
GET /v1/pagesnoneSummaries: id, slug, name, status, views, leads, conv_per_view, updated_at, url.
GET /v1/pages/templatesnoneThe four templates.
POST /v1/pagesname, slug, template (default blank), form_id201 and the page as a draft.
GET /v1/pages/{id}noneThe page with blocks.
PATCH /v1/pages/{id}name, slug, title, description, form_id (null clears), blocksThe page.
DELETE /v1/pages/{id}none204. Removes its counts too.
POST /v1/pages/{id}/publishnoneThe published page with its url.
POST /v1/pages/{id}/unpublishnoneThe 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.

RequestBodyReturns
GET /v1/page-domainnonehostname, cname_target, verified, verified_at, home_page_id.
PUT /v1/page-domainhostnameThe domain, unverified. Changing the host clears verification and the home page.
POST /v1/page-domain/verifynoneChecks the CNAME in live DNS.
PUT /v1/page-domain/homepage_id, or nullThe domain with its home page.
DELETE /v1/page-domainnone204.
Setting the page domain needs permission to change workspace settings (owners and admins). The hostname must be a subdomain, not a bare domain. Hostnames that are Runearc's own, or in use by another workspace, are refused.

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 | remove

MCP tools: list_pages, create_page, get_page, update_page, publish_page, unpublish_page and delete_page. The domain endpoints have no MCP tool.

Errors

CodeStatusMeaning and fix
page_needs_form400Attach a form with PATCH before publishing a page that has a signup block.
invalid_page_form400The form does not exist in this workspace.
page_slug_taken409Pick another slug.
invalid_page_name, invalid_page_slug, unknown_page_template400Use 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_link400Keep within the block limits above.
reserved_page_host400Use a subdomain of a domain you own.
page_host_taken409Use a different subdomain.

Something unclear or wrong? The API answers every error with a fix, and so should these docs. Back to runearc.com