---
name: "website_save_page"
area: "websites"
title: "Save a page or a post"
price: "$0.01"
method: "POST"
url: "https://api.conecto.chat/v1/tools/website_save_page"
mcp_server: "https://api.conecto.chat/mcp/websites"
auth: "Authorization: Bearer <conecto_sk_ key>"
docs_url: "https://conecto.chat/tools/websites/website_save_page"
---

# Save a page or a post (`website_save_page`)

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

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".

Price: $0.01 a call. A call that fails costs nothing.

## Use it when

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

- For the footer, header button, blog title or language, use [website_settings](https://conecto.chat/tools/websites/website_settings.md).

## Say this to your agent

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

## Inputs

| Name | Type | Required | Description | Allowed values | Default |
|---|---|---|---|---|---|
| `site` | string | yes | The site's name, as in cncto.co/w/<name>. 3 to 60 characters. |  |  |
| `path` | string | yes | Up to 120 characters. |  |  |
| `kind` | string | no |  | `"page"`, `"post"` | `"page"` |
| `title` | string | no | Up to 120 characters. |  |  |
| `description` | string | no | For search engines and link previews. Up to 300 characters. |  |  |
| `nav` | string | no | The page's label in the menu; "" takes it out. Up to 40 characters. |  |  |
| `nav_order` | integer | no | -999 to 999. |  |  |
| `sections` | array of objects | no | 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". Up to 40 items. |  |  |
| `sections[].type` | string | yes, in each item of `sections` |  | `"hero"`, `"text"`, `"features"`, `"image"`, `"gallery"`, `"pricing"`, `"testimonials"`, `"faq"`, `"cta"`, `"stats"`, `"logos"`, `"contact"`, `"booking"`, `"newsletter"`, `"posts"` |  |
| `body` | string | no | Posts: Markdown. Up to 100,000 characters. |  |  |
| `date` | string | no | Posts. Default today. Matches ^\\d{4}-\\d{2}-\\d{2}$. |  |  |
| `image` | string | no | A file_id: the image shown when the page is shared, and a post's cover. Up to 36 characters. |  |  |

## Example

Written for Halverson Cycle & Repair, a bike shop with a repair workshop in Portland, Oregon.

MCP: call `website_save_page` on the MCP server `https://api.conecto.chat/mcp/websites` with these arguments:

```json
{
  "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"
    }
  ]
}
```

REST:

```bash
curl 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"}]}'
```

## Response

```json
{
  "call_id": "5f0c8a2e-3b7d-4c1e-9a64-2d8e1f7b0c93",
  "tool": "website_save_page",
  "status": "succeeded",
  "replayed": false,
  "cost_usd": "$0.01",
  "balance_usd": "$19.75",
  "result": {
    "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."
  }
}
```

`result`: The page (path, kind, title, description, nav, sections or body) with its address, and created: true when it is new.

## Errors

| Code | Status | When | Fix |
|---|---|---|---|
| `not_found` | 404 | No website of the business has that name. | Call website_list and use one of its names. |
| `not_found` | 404 | An image is not a file in the file store. | Upload it with files_upload and use its file_id. |
| `invalid_input` | 400 | The 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. |
| `conflict` | 409 | The path is a page and would become a post, or the other way round. | Use another path, or delete the old one first. |
| `limit_reached` | 409 | The site has as many pages and posts as it may. | Delete pages it no longer needs with website_delete_page. |

The refusals every tool can give (401 key, 402 balance, 429 limits) are on the errors page: https://conecto.chat/docs/errors.md

## Related

- [website_create](https://conecto.chat/tools/websites/website_create.md): Starts a website for the business at cncto.co/w/<name> as a draft with a home page, in its brand. $0.01 a call.
- [website_settings](https://conecto.chat/tools/websites/website_settings.md): Changes the site's title, description, language, footer, header button, blog, and whether its pages carry the analytics script and the chat. $0.001 a call.
- [website_preview](https://conecto.chat/tools/websites/website_preview.md): A private link to the draft as it would look published, working for 24 hours. Free up to 1,000,000 reads a month.
- [website_publish](https://conecto.chat/tools/websites/website_publish.md): Puts the draft online; the first publish starts the monthly rent, later ones cost the price of an edit. $5 for the first publish (the first month of the site's rent), $0.01 after that ($5.00 the first time, then $0.01), up to $5.00.
- [website_get](https://conecto.chat/tools/websites/website_get.md): A site with every page of its draft, its settings, its kept versions, and whether the draft has unpublished changes. Free up to 1,000,000 reads a month.
- [website_list](https://conecto.chat/tools/websites/website_list.md): The business's websites, published or not. Free up to 1,000,000 reads a month.
- [website_delete_page](https://conecto.chat/tools/websites/website_delete_page.md): Removes a page or post from the draft; the home page stays. $0.001 a call.
- [website_rollback](https://conecto.chat/tools/websites/website_rollback.md): Publishes one of the kept versions again; the draft stays as it is. $0.01 a call.
- [website_unpublish](https://conecto.chat/tools/websites/website_unpublish.md): Takes the site offline and ends its rent; the draft and versions stay. Free.
- [website_delete](https://conecto.chat/tools/websites/website_delete.md): Deletes a site for good, with its pages, versions and address; the name is never used again. Free.
