Websites

Save a page or a post

website_save_page · Changes data · Markdown

Creates or changes a page of the draft from sections, or a blog post in Markdown.

$0.01 a call

From your agent’s balance. A call that fails costs nothing.

An example

Make the home page: a big photo of the Willamette 8, "Bikes that keep rolling", our three promises, and a button to book a fitting.

Your agent callswebsite_save_page$0.01 a call

The example business is Halverson Cycle & Repair, a bike shop with a repair workshop in Portland, Oregon. The reply is the one the tool really gives.

With these arguments
{
  "site": "halverson-cycle",
  "path": "",
  "title": "Halverson Cycle & Repair",
  "sections": [
    {
      "type": "hero",
      "heading": "Bikes that keep rolling",
      "text": "City, gravel and cargo bikes, and a repair workshop that knows them, on SE Ash St in Portland.",
      "image": "3b9f0d2c-7e14-4a8b-9c61-5d2e8f0a1b47",
      "image_alt": "The Willamette 8 in green",
      "buttons": [
        {
          "label": "See the bikes",
          "link": "/bikes"
        },
        {
          "label": "Book a fitting",
          "link": "/#fitting"
        }
      ],
      "layout": "split"
    },
    {
      "type": "features",
      "heading": "Why Halverson",
      "items": [
        {
          "title": "Built here",
          "text": "Every bike is built and tuned in our workshop before it leaves."
        },
        {
          "title": "Repairs in days",
          "text": "Most tune-ups are ready in 2 to 3 working days."
        },
        {
          "title": "A free first tune-up",
          "text": "Every bike we sell comes back for one within 6 months."
        }
      ]
    },
    {
      "type": "booking",
      "id": "fitting",
      "heading": "Come in for a fitting",
      "text": "1830 SE Ash St, Portland. Book a 45-minute bike fitting.",
      "meeting": "bike-fitting",
      "button_label": "Book a fitting"
    }
  ]
}
What comes back
{
  "page": {
    "path": "",
    "kind": "page",
    "title": "Halverson Cycle & Repair",
    "description": "",
    "nav": "",
    "nav_order": 0,
    "sections": [
      {
        "type": "hero",
        "heading": "Bikes that keep rolling",
        "text": "City, gravel and cargo bikes, and a repair workshop that knows them, on SE Ash St in Portland.",
        "image": "3b9f0d2c-7e14-4a8b-9c61-5d2e8f0a1b47",
        "image_alt": "The Willamette 8 in green",
        "buttons": [
          {
            "label": "See the bikes",
            "link": "/bikes"
          },
          {
            "label": "Book a fitting",
            "link": "/#fitting"
          }
        ],
        "layout": "split"
      },
      {
        "type": "features",
        "heading": "Why Halverson",
        "items": [
          {
            "title": "Built here",
            "text": "Every bike is built and tuned in our workshop before it leaves."
          },
          {
            "title": "Repairs in days",
            "text": "Most tune-ups are ready in 2 to 3 working days."
          }
        ]
      }
    ],
    "body": "",
    "date": null,
    "image": "",
    "address": "https://cncto.co/w/halverson-cycle/"
  },
  "created": false,
  "next": "See it with website_preview; put it online with website_publish."
}

Use it when

A page or a blog post is new or changes; the change stays in the draft until it is published.

What it does

Create or change a page of the draft, matched by path ("" is the home page, "about", "services/cleaning"); only what is passed changes, and sections replace all of the page's sections. A page is made of sections; a blog post (kind "post", path = its slug) has a Markdown body and a date, and lives at /blog/<slug>. nav puts the page in the menu with that label. Images are image file_ids from the file store; in Markdown write ![alt](file:<file_id>). Sections, each {"type": ...}: hero {heading, text, image, image_alt, buttons [{label, link}] (up to 2), layout "center" | "split"}; text {heading, body (Markdown)}; features {heading, text, items [{title, text}]}; image {image, alt, caption, size "normal" | "wide"}; gallery {heading, images [{image, alt, caption}]}; pricing {heading, text, plans [{name, price, period, description, features [..], button, highlight, label (above a highlighted plan; default "Most popular" in the site's language)}]}; testimonials {heading, items [{quote, name, role}]}; faq {heading, items [{question, answer (Markdown)}]}; cta {heading, text, button}; stats {heading, items [{value, label}]}; logos {heading, images [{image, alt}]}; contact {heading, text, email, phone, address, form (a form's slug), button_label}; booking {heading, text, meeting (a meeting type's slug), button_label}; newsletter {heading, text, newsletter (its slug), button_label}; posts {heading, count} lists the latest blog posts. Images are image file_ids from the file store, with alt text. A link is a page of the site ("/about"), https://..., mailto: or tel:. Optional on any section: id (for "#links") and background "plain" | "tinted" | "brand".

What comes back

The page (path, kind, title, description, nav, sections or body) with its address, and created: true when it is new. Every reply also carries cost_usd and balance_usd.

Inputs

NameTypeWhat it is
siteRequiredstringThe site's name, as in cncto.co/w/<name>. 3 to 60 characters.
pathRequiredstringUp to 120 characters.
kindstringOne of: page,post. Default: page.
titlestringUp to 120 characters.
descriptionstringFor search engines and link previews. Up to 300 characters.
navstringThe page's label in the menu; "" takes it out. Up to 40 characters.
nav_orderinteger-999 to 999.
sectionsarray of objectsSections, each {"type": ...}: hero {heading, text, image, image_alt, buttons [{label, link}] (up to 2), layout "center" | "split"}; text {heading, body (Markdown)}; features {heading, text, items [{title, text}]}; image {image, alt, caption, size "normal" | "wide"}; gallery {heading, images [{image, alt, caption}]}; pricing {heading, text, plans [{name, price, period, description, features [..], button, highlight, label (above a highlighted plan; default "Most popular" in the site's language)}]}; testimonials {heading, items [{quote, name, role}]}; faq {heading, items [{question, answer (Markdown)}]}; cta {heading, text, button}; stats {heading, items [{value, label}]}; logos {heading, images [{image, alt}]}; contact {heading, text, email, phone, address, form (a form's slug), button_label}; booking {heading, text, meeting (a meeting type's slug), button_label}; newsletter {heading, text, newsletter (its slug), button_label}; posts {heading, count} lists the latest blog posts. Images are image file_ids from the file store, with alt text. A link is a page of the site ("/about"), https://..., mailto: or tel:. Optional on any section: id (for "#links") and background "plain" | "tinted" | "brand". Up to 40 items.
sections[].typeRequiredstringOne of: hero,text,features,image,gallery,pricing,testimonials,faq,cta,stats,logos,contact,booking,newsletter,posts.
bodystringPosts: Markdown. Up to 100,000 characters.
datestringPosts. Default today. Matches ^\d{4}-\d{2}-\d{2}$.
imagestringA file_id: the image shown when the page is shared, and a post's cover. Up to 36 characters.

The call

Over MCP, call website_save_page on https://api.conecto.chat/mcp/websites. Over REST:

Terminal
curl -X POST https://api.conecto.chat/v1/tools/website_save_page \
  -H "Authorization: Bearer $CONECTO_KEY" \
  -H "Content-Type: application/json" \
  -d '{"site":"halverson-cycle","path":"","title":"Halverson Cycle & Repair","sections":[{"type":"hero","heading":"Bikes that keep rolling","text":"City, gravel and cargo bikes, and a repair workshop that knows them, on SE Ash St in Portland.","image":"3b9f0d2c-7e14-4a8b-9c61-5d2e8f0a1b47","image_alt":"The Willamette 8 in green","buttons":[{"label":"See the bikes","link":"/bikes"},{"label":"Book a fitting","link":"/#fitting"}],"layout":"split"},{"type":"features","heading":"Why Halverson","items":[{"title":"Built here","text":"Every bike is built and tuned in our workshop before it leaves."},{"title":"Repairs in days","text":"Most tune-ups are ready in 2 to 3 working days."},{"title":"A free first tune-up","text":"Every bike we sell comes back for one within 6 months."}]},{"type":"booking","id":"fitting","heading":"Come in for a fitting","text":"1830 SE Ash St, Portland. Book a 45-minute bike fitting.","meeting":"bike-fitting","button_label":"Book a fitting"}]}'

When it refuses

A refused call costs nothing and says what to do next.

CodeWhenWhat to do
not_found404No website of the business has that name.Call website_list and use one of its names.
not_found404An image is not a file in the file store.Upload it with files_upload and use its file_id.
invalid_input400The path, a section or a field is not valid: sections on a post, a body on a page, a new page without a title, an image that is not a picture.Fix what the message names; the tool description lists every section and its fields.
conflict409The path is a page and would become a post, or the other way round.Use another path, or delete the old one first.
limit_reached409The site has as many pages and posts as it may.Delete pages it no longer needs with website_delete_page.

Give this to your agent.

Set up Conecto from https://conecto.chat/SKILL.md