Build and publish site pages
List, read, create, generate, edit, publish, and remove pages on the brand's agent site.
The brand's agent site is a public, AI-readable site served at /{username}. These tools cover the full lifecycle of its pages: authoring or AI-generating content, editing metadata, and taking pages live or offline.
When to use
Use these tools to manage the durable Pages on the agent site — the Profile, FAQ, custom pages, and local service-area landing pages. For the brand's whole-page front door, generate_homepage composes an AI-designed homepage at /home/{username}. A published page is only publicly reachable if the agent site itself is public; turn the whole site on with set_agent_site_public first (or check its state with get_feed_settings). AI generation (generate_agent_page, generate_homepage, generate_service_area_pages) requires a Starter or Pro plan with available credits.
Typical sequence
list_agent_pages— see what pages already exist and their generation status.- Author the page:
create_agent_page(you provide the content, no LLM) orgenerate_agent_page(AI writes it in the background). For local businesses,generate_service_area_pagescreates one page per neighborhood × service. - For AI-generated pages, poll
list_agent_pagesuntil the page reportsgenerating: false. get_agent_pageto read the full body;update_agent_pageto adjust title, slug, or meta description.publish_agent_pageto go live (ensure the site itself is public viaset_agent_site_public).unpublish_agent_pageto revert to draft, ordelete_agent_pageto remove permanently.
Tools
list_agent_pages
List all pages on the brand's agent site, with each page's generation status. Use this to poll after generate_agent_page or generate_service_area_pages: a page with generating: true is still having its AI content filled in; generating: false means the content has landed. A page that's still generating cannot be published — publish_agent_page rejects it until generating: false.
Authentication: Required.
| Parameter | Type | Required | Description |
|---|---|---|---|
syntheticId | integer | Yes | The agent ID whose pages to list. |
Returns count and a pages array. Each page includes agentPageId, title, slug, status (draft / published / archived), pageType, category, and generating.
get_agent_page
Fetch one page on the brand's agent site, including its body (markdown extracted from the page's sections). Use after list_agent_pages to read the full content before proposing an edit with update_agent_page.
Authentication: Required. The agent must belong to the authenticated account (owner, admin, or a group-shared member).
| Parameter | Type | Required | Description |
|---|---|---|---|
agentPageId | string | Yes | The page to fetch (from list_agent_pages). |
Returns success, the syntheticId, and a page object with agentPageId, type, title, slug, status, metaDescription, body, publishedAt, updatedAt, and generating. A page belonging to a different agent returns a generic not-found error.
create_agent_page
Create a new page by providing the content yourself. No LLM call, no credits. Pass body as markdown — it's wrapped in a hero (headline = title) plus a single section. To have AI write the content instead, use generate_agent_page.
Page types:
custom(default): a branded page whose slug is derived from the title (auto-suffixed-2,-3on collision).profile/faq: the brand's typed profile or FAQ page. Only one of each per agent — if it already exists this returns an error pointing you toupdate_agent_page. The reserved slug (profile/faq) is used automatically.
Authentication: Required. The agent must belong to the authenticated account (owner, admin, or a group-shared member). An account in read-only mode can't do this — the call returns a read-only error.
| Parameter | Type | Required | Description |
|---|---|---|---|
syntheticId | integer | Yes | The agent ID to add the page to. |
type | "custom" | "profile" | "faq" | No | Page type. Defaults to custom. |
title | string (1–300) | Yes | Page title. Also drives the URL slug for custom pages. |
body | string (1–100000) | Yes | Page body as markdown. Wrapped in a hero + single section by the renderer. |
status | "draft" | "published" | No | Publication status. Defaults to draft. |
metaDescription | string (≤500) | No | Short SEO meta description. |
Returns success, the syntheticId, the new agentPageId, plus the type, title, slug, and status. A published page is only publicly reachable if the agent site itself is public — see set_agent_site_public.
generate_agent_page
Create a new page and generate its content with AI. The page is created immediately as a draft shell, then a background job fills in the hero and sections. This tool returns right away — poll list_agent_pages until the page reports generating: false. For local service-area landing pages, use generate_service_area_pages instead.
Authentication: Paid. The agent's owning account must have available credits (a Starter or Pro plan) — the background content generation uses LLM credits, billed to the owner.
| Parameter | Type | Required | Description |
|---|---|---|---|
syntheticId | integer | Yes | The agent ID to add the page to. |
title | string (1–200) | Yes | Human-readable page title. Shows as the hero headline and in nav. |
slug | string (1–200) | Yes | URL slug — the page resolves to /{username}/{slug}. Lowercase letters, numbers, and hyphens only. Must be unique per agent and cannot be a reserved slug (profile, faq, services, resources, service-areas). |
category | enum | No | Nav placement. product (default) = an offering, shown in the Products/Services nav. resource = a topic/pillar page, shown in the Resources nav. |
Returns agentPageId, plus the syntheticId, slug, title, and category. The page starts as a draft with placeholder content; poll list_agent_pages and wait for generating: false, then publish it with publish_agent_page.
generate_homepage
Generate the brand's AI-designed homepage — a bespoke, whole-page design (palette, typography, and section layout) composed by an LLM design director from the brand's real content and photos, served at /home/{username}. Distinct from generate_agent_page (which creates one tier-2 crawler page): the homepage is the brand's front door. Returns right away; the design generates in the background (~1–2 minutes) and is saved as a new version each run, so regenerating is safe. The owner previews it in-app; it goes public at /home/{username} only once the homepage is published.
Authentication: Paid. Generating the homepage uses LLM credits, billed to the agent's owning account and gated on its plan/balance.
| Parameter | Type | Required | Description |
|---|---|---|---|
syntheticId | integer | Yes | The agent ID to generate the homepage for. |
moodPrompt | string (≤300) | No | Optional design direction, e.g. "big type, lots of whitespace, editorial". Omit to let the design director choose from the brand's content. |
Returns the designId and version for the design that is now generating, plus the syntheticId. Poll the brand's homepage status (or wait for the completion notification) before treating the design as ready.
generate_homepage_variants
Explore several homepage looks at once: runs the AI design director multiple times in divergent curated style directions (Editorial, Bold & Confident, Warm & Human, Dark Technical) and produces real candidate designs the owner picks from. The live homepage does not change until a candidate is chosen with choose_homepage_variant. Returns right away; the variants generate in the background (~3–5 minutes).
Authentication: Paid. Each variant is a metered LLM generation billed to the agent's owning account, gated on its plan/balance (no free-first grant — unlike the single generate_homepage).
| Parameter | Type | Required | Description |
|---|---|---|---|
syntheticId | integer | Yes | The agent ID to generate style variants for. |
directionKeys | string[] (1–4) | No | Style directions to explore: editorial, bold, warm, technical, minimal, heritage. Omit for a curated trio. |
moodPrompt | string (≤300) | No | Optional extra design direction applied to every variant. |
Returns the batch designId and the directions being generated. Poll list_homepage_variants until the candidates appear.
list_homepage_variants
List the homepage style-variant candidates currently awaiting the owner's pick. Each carries a direction name, one-line vibe, and the design thesis the AI wrote for that variant. Visual previews live on the in-app Homepage page.
Authentication: Required. The agent must belong to the authenticated account.
| Parameter | Type | Required | Description |
|---|---|---|---|
syntheticId | integer | Yes | The agent ID to list variant candidates for. |
Returns candidates — each with designId, direction, name, vibe, and designThesis. An empty list means nothing is awaiting a pick.
choose_homepage_variant
Apply one style-variant candidate as the brand's live homepage design; the other candidates are retired. Changes what renders at /home/{username} once the homepage is published.
Authentication: Required. The agent must belong to the authenticated account. An account in read-only mode can't do this.
| Parameter | Type | Required | Description |
|---|---|---|---|
syntheticId | integer | Yes | The agent ID the candidate belongs to. |
designId | string | Yes | The candidate's designId from list_homepage_variants. |
Returns success: true when the pick applied. success: false means the candidate was no longer available (already picked, or replaced by a newer batch) — call list_homepage_variants for the current set.
get_homepage_status
Read the agent's generative homepage state in one call: whether an AI-designed homepage exists (active version, style, and the design thesis the AI wrote), whether a generation is currently running (with the design-mockup preview URL once it lands) or failed, whether the homepage is published (live at /home/{username}), and which app experience the brand runs (chat brands' homepage is their primary site; full brands are Agent-Site-first). Call it before making claims or recommendations about the brand's Pendium-hosted site.
Authentication: Required. The agent must belong to the authenticated account.
| Parameter | Type | Required | Description |
|---|---|---|---|
syntheticId | integer | Yes | The agent ID to read homepage status for. |
Returns experience, hasHomepage, published, liveUrl, activeDesign (version, style, designThesis), and currentRun. currentRun reflects the newest design's state: generating (with mockupPreviewUrl) while a design is being built, awaiting_approval (with designId + mockupPreviewUrl) when a design preview is parked for the user to approve or change in the app chat, or failed (with the error). It is null when nothing is in flight.
list_homepage_templates
List the homepage template gallery — curated design languages (Editorial, Bold & Confident, Warm & Human, Dark Technical, Swiss Minimal, Heritage & Craft), each with a full example-site mockup image. The mockups are real renders of each style applied to a demo brand, so they show exactly what the design system produces. Templates differ from variants: variants are one-off explorations of your brand; templates are a persistent gallery you can re-apply any time.
Authentication: Required. The agent must belong to the authenticated account.
| Parameter | Type | Required | Description |
|---|---|---|---|
syntheticId | integer | Yes | The agent ID (templates are global; the call is access-scoped). |
Returns templates — each with key, name, vibe, and mockupUrl (a full-page mockup image suitable for showing in a card).
apply_homepage_template
Redesign the agent's homepage in one of the gallery templates: the design director regenerates the page in that design language while the brand's own content, logo, and photos stay in place. Runs in the background (~1–2 minutes) and lands as a new design version — the previous design is kept, so applying a template is safe to try.
Authentication: Paid. A metered LLM generation billed to the agent's owning account, gated on its plan/balance. An account in read-only mode can't do this.
| Parameter | Type | Required | Description |
|---|---|---|---|
syntheticId | integer | Yes | The agent ID to redesign the homepage for. |
templateKey | string | Yes | The template's key from list_homepage_templates. |
moodPrompt | string (≤300) | No | Optional extra direction layered on top of the template. |
Returns the new designId, version, and generating: true. The redesigned homepage appears on the in-app Homepage page when ready; it's live at /home/{username} only while the homepage is published.
update_agent_page
Edit the metadata of an existing page — its title, URL slug, and/or SEO meta description. Pass agentPageId plus whichever fields you want to change (at least one). Synchronous, no LLM call. To (re)generate the page's hero and section content, use generate_agent_page instead.
Authentication: Required. The agent must belong to the authenticated account (owner, admin, or a group-shared member). An account in read-only mode can't do this — the call returns a read-only error.
| Parameter | Type | Required | Description |
|---|---|---|---|
agentPageId | string | Yes | The page to edit (from list_agent_pages). |
title | string (1–200) | No | New page title / hero headline. Omit to keep current. |
slug | string (1–200) | No | New URL slug — resolves to /{username}/{slug}. Lowercase letters, numbers, and hyphens only. Must be unique per agent and cannot be a reserved slug (profile, faq, services). Omit to keep current. |
metaDescription | string (≤320) | No | New SEO meta description. Omit to keep current. |
At least one of title, slug, or metaDescription must be provided. Returns success, the syntheticId, and the agentPageId. A page belonging to a different agent returns a generic not-found error.
publish_agent_page
Publish a page so it goes live at /{username}/{slug}, and ping IndexNow (Bing/Yandex) to re-crawl the newly-visible URL. Synchronous, no LLM call. The page must have finished generating its content first — publishing a page that's still generating is rejected (it would otherwise go live as an empty placeholder shell). Poll list_agent_pages until it reports generating: false, then publish.
A published page is only publicly reachable if the agent site itself is public — use set_agent_site_public to turn the whole site on.
Authentication: Required. The agent must belong to the authenticated account (owner, admin, or a group-shared member). An account in read-only mode can't do this — the call returns a read-only error.
| Parameter | Type | Required | Description |
|---|---|---|---|
agentPageId | string | Yes | The page to publish (from list_agent_pages). |
Returns success, the syntheticId, and the agentPageId. A page belonging to a different agent returns a generic not-found error.
unpublish_agent_page
Take a page offline. The page stops resolving at its public URL and reverts to a draft, but is not deleted — re-publish it any time with publish_agent_page. Synchronous, no LLM call. To remove a page permanently instead, use delete_agent_page.
Authentication: Required. The agent must belong to the authenticated account (owner, admin, or a group-shared member). An account in read-only mode can't do this — the call returns a read-only error.
| Parameter | Type | Required | Description |
|---|---|---|---|
agentPageId | string | Yes | The page to unpublish (from list_agent_pages). |
Returns success, the syntheticId, and the agentPageId. A page belonging to a different agent returns a generic not-found error.
delete_agent_page
Permanently remove a page from the brand's agent site. Destructive and irreversible. Anyone with access to the agent — including shared team members — can delete a page (alongside creating, editing, and publishing pages). Synchronous, no LLM call. To take a page offline without deleting it, use unpublish_agent_page instead.
Authentication: Required. An account in read-only mode can't do this — the call returns a read-only error.
| Parameter | Type | Required | Description |
|---|---|---|---|
agentPageId | string | Yes | The page to delete (from list_agent_pages). |
Returns success, the syntheticId, and the deletedAgentPageId. A page belonging to a different agent returns the same generic not-found error (no distinction, so the page's existence isn't leaked).
generate_service_area_pages
Generate local landing pages for a service business — one page per neighborhood × service combination, each with a lead-capture form. The brand must have resolved service areas first (connect a Yelp or Google Business listing that has neighborhoods); otherwise this returns an error. Pages are generated in the background as drafts. This tool returns immediately with how many pages were planned — poll list_agent_pages and watch for new pages with category: "service_area".
Authentication: Paid. The agent's owning account must have available credits (a Starter or Pro plan) — generating the pages uses LLM credits, billed to the owner.
| Parameter | Type | Required | Description |
|---|---|---|---|
syntheticId | integer | Yes | The agent ID to generate service-area pages for. |
Returns plannedCount — the upper bound on how many pages will be created (combinations that already have a page are skipped) — plus the syntheticId. Poll list_agent_pages and count pages with category: "service_area" until it stops rising.