Skip to content

Platform APIs on a published site

A site built on ESTAGE is not a static export: the platform installs runtime modules into it, and those modules expose globals your pages can call. The AI wires them for you when you describe what you want — “email me on Telegram when someone submits this form”, “add a chatbot”, “show my three latest posts on the homepage” — but they are ordinary JavaScript, so hand-written code and custom components can call them too.

Two rules apply to all of them:

  • A global exists only when its feature is enabled on the project. Call defensively (window.estageAI?.ask?.(…)) so a page never crashes when a feature is off.
  • Never hand-roll the thing a module already does. Credentials live server-side; an API key pasted into site code is exposed to every visitor. The modules exist precisely so keys never reach the bundle.

Available when the AI Assistant is enabled. Calls run server-side against the platform’s AI and are billed to the project owner, bounded by a monthly cap.

MethodReturnsWhat it does
chat(messages, { onToken })full textStreaming conversation. messages is [{ role: 'user' | 'assistant', content }]; onToken(text) fires per chunk.
ask(prompt)stringOne-shot question.
generate(prompt)stringOne-shot generation — a headline, a summary line, a reply draft.
classify(text, ['A','B','C'])one categoryPicks exactly one of the categories you pass.
extract(text, ['name','email'])objectPulls named fields out of free text.
summarize(text)stringCondenses text.
translate(text, 'Spanish')stringTranslates text.
vision(image, prompt)stringDescribes or analyses an image. image is a URL or { base64, mediaType }. Also available as analyzeImage.
readDocument(file, prompt)stringAnswers questions about a PDF or text document. Also available as askDocument.
image(prompt)image URLGenerates an image, hosted on the CDN. Requires image generation to be enabled.
configobjectThe assistant’s greeting, starter suggestions, and widget settings.

More on what to build with these: AI Assistant examples.

window.estageConnector — call an external service safely

Section titled “window.estageConnector — call an external service safely”

Available when at least one connector is configured. The secret stays encrypted server-side; the call goes through a relay that pins the destination.

MethodWhat it does
estageConnector(connector, action, params)Fire-and-forget action, e.g. estageConnector('telegram', 'sendMessage', { text }).
estageConnectorFetch(connector, action, params)Same, but returns the relay’s response envelope when you need the result.
estageConnectorPresign(connector, action, params)Requests a signed URL — used by storage connectors for direct uploads.

window.estageBlog — read your posts anywhere

Section titled “window.estageBlog — read your posts anywhere”

Available when the blog is enabled. Blog pages use hooks directly; this global is for everything outside /blog — a homepage “latest posts” strip, a footer list.

MethodReturnsWhat it does
posts(options?)arrayPublished posts, with the same filters as the blog pages (limit, category, author). Drafts are hidden.
post(slug)objectOne post by slug.
authors() / categories()arrayThe author and category lists.
readypromiseResolves once the post snapshot has loaded.
reload()promiseRe-fetches the snapshot.

window.estageCommunity — community data on your site

Section titled “window.estageCommunity — community data on your site”

Available when the Community toolkit is installed. Reads work for anonymous visitors; writes require a signed-in member, and the member’s credential never touches your page — the browser holds only an opaque, community-scoped handle.

MethodWhat it does
fetchThreads({ filter, channel, category, cursor })A page of the feed, with a cursor for the next one.
fetchThread(id) / fetchComments(id)One post and its comments.
fetchProfileThreads(...)Posts by one member.
createPost(...) / createComment(...)Publish a post or a comment as the signed-in member.
uploadImage(...)Attach an image to a post.

Localization — window.estageSetLocale, estageGetLocale, estageI18n

Section titled “Localization — window.estageSetLocale, estageGetLocale, estageI18n”

Available when localization is set up. Translations are applied to the rendered DOM, so your JSX stays untouched.

MethodWhat it does
estageSetLocale(code)Switches the site to a locale and remembers the choice.
estageGetLocale()The active locale code.
estageI18n.locales()Every locale the site has, default first.
estageI18n.current() / getDefault()Active and default locale codes.
estageI18n.name(code)The language’s native name, for a custom switcher.

Build your own language switcher by calling estageSetLocale — never hand-roll a translation layer next to this one.

window.estagePersonalize — audience variants

Section titled “window.estagePersonalize — audience variants”

Available when personalization is set up. Copy variants are data, chosen per audience.

MethodWhat it does
audience()The active audience id, or null.
set(id)Forces an audience — useful for previewing a variant.
off()Clears the audience and restores the default copy.

window.estageFunnel — funnel tracking from any element

Section titled “window.estageFunnel — funnel tracking from any element”

Available on pages that are part of a funnel. Lets a hand-written or AI-generated button report into funnel analytics without importing anything.

MethodWhat it does
trackEvent(name, data?)Records a custom event, e.g. trackEvent('upgrade-clicked', { variant: 'a' }).
captureLead(...)Records a lead against the current step.
recordVisit(...)Records a visit to the current step.

Building against the platform from outside

Section titled “Building against the platform from outside”

Beyond runtime globals, a project can be driven programmatically: connect it to the Claude app as a custom connector and an assistant can read files, edit pages, generate images, and publish through the platform’s own validated write path. See Connect Claude Code.