Satiara isn't tied to one platform. It talks to your site through one endpoint that implements nine tools. WordPress sites get our ready-made plugin. Any other stack (Next.js, Ghost, Sanity, Rails, anything) can connect by hosting this endpoint. An afternoon of work, and Satiara runs on it.
Host a single HTTPS URL with an unguessable secret in the path (treat it like a password). Satiara POSTs every call to it in this shape, and reads the reply from result.content[0].text (a JSON string):
POST https://yoursite.com/api/satiara/<secret>
Content-Type: application/json
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": { "name": "get_site_info", "arguments": {} }
}
→ 200 OK
{
"jsonrpc": "2.0",
"id": 1,
"result": { "content": [ { "type": "text", "text": "{\"name\":\"My Site\",\"url\":\"https://yoursite.com\"}" } ] }
}
→ errors: { "result": { "isError": true, "content": [ { "type": "text", "text": "reason" } ] } }Implement all nine and every Satiara feature works: autopilot, refreshes, internal links, SEO delivery, brand detection, cover images. set_seo, set_featured_image and get_brand may return an error if your stack can't support them, Satiara degrades gracefully.
| Tool | Arguments | Returns | What it's for |
|---|---|---|---|
get_site_info | none | { name, description, url, published_posts, draft_posts } | Basic facts about the site. |
list_posts | { per_page?, type? } | { posts: [{ id, title, status, type, link, date?, modified?, excerpt? }], total? } | The content inventory. |
get_post | { id } | { id, title, content } | One post's full HTML content. |
create_post | { title, content, status?, categories?, tags? } | { id, link? } | Create a draft or published post. Content is clean HTML. |
update_post | { id, content } | ok | Replace a post's content (used for refreshes and fixes; Satiara keeps undo state on its side). |
add_internal_links | { id, links: [{ anchor_text, target_url? , target_post_id? }] } | { inserted } | Wrap existing anchor text in links to related pages. Never duplicate an existing link. |
set_seo | { id, seo_title?, meta_description?, schema? } | ok | Store the SEO title, meta description, and JSON-LD so YOUR templates render them in <head>. Never inject into the body. |
set_featured_image | { id, svg, title?, replace? } | ok | Upload the branded cover SVG and set it as the post's featured image. Keep an existing image unless replace is true. |
get_brand | none | { name?, description?, home?, logo_url?, icon_url?, colors?, font? } | The site's brand as the platform knows it (used for automatic brand detection). |
Reference implementation: the WordPress plugin (~500 lines of PHP) implements the whole protocol, port it to your stack in an afternoon. Then add your site in the dashboard, choose Custom (API), and paste your endpoint URL.
Questions about the protocol? growth@satiara.com
Start your trial, $7