# Webflow

> Manage Webflow CMS collections, items, pages, assets, and site publishing through the Webflow Data API v2. Create and update CMS content, upload images, and publish changes to live sites.

Source: https://cotera.co/docs/reference/tools/individual-tools/webflow

---

**Authentication Type:** API Key
**Description:** Manage Webflow CMS collections, items, pages, assets, and site publishing through the Webflow Data API v2. Create and update CMS content, upload images, and publish changes to live sites.

***

## Authentication

To authenticate, you'll need a Webflow site API token:

1. Open your Webflow site dashboard
2. Go to **Site settings** → **Apps & integrations** → **API access**
3. Under **API token**, generate a new token (or copy an existing one)

You'll need to provide:

* **apiToken** `string`: Your Webflow site API token

> **Note:** A site API token gives access to a single site. If you manage multiple sites, you need one token per site. List endpoints return up to 100 records per page; use `offset` to page through larger sets.

***

## Sites

### List Sites

List the Webflow sites the connected API token can access. Returns each site ID (needed by the other Webflow tools), its custom domain IDs, and its locale IDs.

**Operation Type:** Query (Read)

**Parameters:**

No parameters required. Lists every site the API token can access.

**Returns:**

* **sites** `array of objects`: Sites the API token can access
  * **id** `string`: Site ID. Pass as `siteId` to the other Webflow tools.
  * **displayName** `string` (nullable): Site name
  * **shortName** `string` (nullable): Slugified site name
  * **timeZone** `string` (nullable): Site time zone
  * **createdOn** `string` (nullable): When the site was created
  * **lastUpdated** `string` (nullable): When the site was last updated
  * **lastPublished** `string` (nullable): When the site was last published
  * **customDomains** `array of objects`: Custom domains attached to the site
    * **id** `string`: Custom domain ID. Pass in `customDomainIds` when publishing the site.
    * **url** `string` (nullable): Domain name
    * **lastPublished** `string` (nullable): When this domain was last published
  * **primaryLocale** `object` (nullable): Primary locale, or null when the site has no localization
    * **id** `string`: Locale ID. Pass as `localeId` to the page tools.
    * **cmsLocaleId** `string` (nullable): CMS locale ID. Pass as `cmsLocaleId` to the CMS item tools.
    * **enabled** `boolean` (nullable): Whether the locale is enabled
    * **displayName** `string` (nullable): Locale name, e.g. "French (France)"
    * **tag** `string` (nullable): IETF tag, e.g. "fr-FR"
    * **subdirectory** `string` (nullable): URL subdirectory the locale is served from
  * **secondaryLocales** `array of objects`: Secondary locales (empty when the site has no localization), same shape as `primaryLocale`
* **count** `number`: Number of sites returned

**Example Usage:**

```json
{}
```

***

## Collections & Schema

### List Collections

List the CMS collections in a Webflow site, e.g. Blog Posts or Team Members. Returns each collection ID and name. Use Get Collection Schema to see the fields of a collection.

**Operation Type:** Query (Read)

**Parameters:**

* **siteId** `string` (required): Site ID to list collections for. Get it from List Sites.

**Returns:**

* **collections** `array of objects`: Collections in the site
  * **id** `string`: Collection ID. Pass as `collectionId` to the CMS item tools.
  * **displayName** `string` (nullable): Collection name, e.g. "Blog Posts"
  * **singularName** `string` (nullable): Singular name, e.g. "Blog Post"
  * **slug** `string` (nullable): Collection URL slug
  * **createdOn** `string` (nullable): When the collection was created
  * **lastUpdated** `string` (nullable): When the collection was last updated
* **count** `number`: Number of collections returned

**Example Usage:**

```json
{
  "siteId": "<site-id>"
}
```

***

### Get Collection Schema

Get the fields of a Webflow CMS collection: each field slug, type, whether it is required, and its validations. Call this before creating or updating items so field values are written in the right format.

**Operation Type:** Query (Read)

**Parameters:**

* **collectionId** `string` (required): Collection ID. Get it from List Collections.

**Returns:**

* **id** `string`: Collection ID
* **displayName** `string` (nullable): Collection name
* **singularName** `string` (nullable): Singular name
* **slug** `string` (nullable): Collection URL slug
* **createdOn** `string` (nullable): When the collection was created
* **lastUpdated** `string` (nullable): When the collection was last updated
* **fields** `array of objects`: Fields of the collection
  * **id** `string`: Field ID
  * **slug** `string` (nullable): Field slug. This is the key to use in item `fieldData`.
  * **displayName** `string` (nullable): Field label
  * **type** `string` (nullable): Field type: PlainText, RichText, Image, MultiImage, VideoLink, Link, Email, Phone, Number, DateTime, Switch, Color, Option, File, Reference, MultiReference or ExtFileRef
  * **isRequired** `boolean`: Whether a value is required when creating an item
  * **isEditable** `boolean` (nullable): Whether the field can be written through the API
  * **helpText** `string` (nullable): Help text shown to editors
  * **validations** `any` (nullable): Type-specific rules. Option fields list their choices as `options[{id, name}]` (write the id). Reference and MultiReference fields give the target `collectionId`.

**Example Usage:**

```json
{
  "collectionId": "<collection-id>"
}
```

***

## CMS Items

### List Items

List the items in a Webflow CMS collection, with their field values. By default returns staged items (including drafts and unpublished edits); set `live` to `true` to get only what is published on the site. Returns up to 100 items per call; use `offset` to page through the rest.

**Operation Type:** Query (Read)

**Parameters:**

* **collectionId** `string` (required): Collection ID. Get it from List Collections.
* **live** `boolean` (default: false): `false` lists staged items: every item including drafts and unpublished edits. `true` lists only the published versions currently live on the site.
* **cmsLocaleId** `string` (nullable): CMS locale ID to read items in. Omit for the primary locale. Get it from List Sites.
* **name** `string` (nullable): Only return items whose name matches exactly.
* **slug** `string` (nullable): Only return the item with this exact slug.
* **sortBy** `string` (nullable): Field to sort by: `createdOn`, `lastPublished`, `lastUpdated`, `name`, or `slug`.
* **sortOrder** `string` (nullable): Sort direction: `asc` or `desc`.
* **limit** `number` (default: 100): Maximum number of items to return (1–100).
* **offset** `number` (default: 0): Number of items to skip, for pagination.

**Returns:**

* **items** `array of objects`: Collection items
  * **id** `string`: Item ID
  * **cmsLocaleId** `string` (nullable): CMS locale this version of the item belongs to
  * **lastPublished** `string` (nullable): When the item was last published, or null if never published
  * **lastUpdated** `string` (nullable): When the item was last updated
  * **createdOn** `string` (nullable): When the item was created
  * **isArchived** `boolean`: Whether the item is archived
  * **isDraft** `boolean`: Whether the item is a draft
  * **fieldData** `object`: Field values keyed by field slug. Always includes `name` and `slug`.
* **pagination** `object`: Pagination information
  * **limit** `number`: Page size used for this request
  * **offset** `number`: Offset used for this request
  * **total** `number`: Total number of records available. Request the next page with `offset + limit` while `offset + limit < total`.

**Example Usage:**

```json
{
  "collectionId": "<collection-id>",
  "live": false,
  "limit": 100,
  "offset": 0
}
```

***

### Get Item

Get a single Webflow CMS item by ID, with all of its field values. Returns the staged version by default; set `live` to `true` for the published version.

**Operation Type:** Query (Read)

**Parameters:**

* **collectionId** `string` (required): Collection ID the item belongs to.
* **itemId** `string` (required): Item ID.
* **live** `boolean` (default: false): `false` returns the staged version, including unpublished edits. `true` returns the version currently live on the site.
* **cmsLocaleId** `string` (nullable): CMS locale ID to read the item in. Omit for the primary locale.

**Returns:**

* **id** `string`: Item ID
* **cmsLocaleId** `string` (nullable): CMS locale this version of the item belongs to
* **lastPublished** `string` (nullable): When the item was last published
* **lastUpdated** `string` (nullable): When the item was last updated
* **createdOn** `string` (nullable): When the item was created
* **isArchived** `boolean`: Whether the item is archived
* **isDraft** `boolean`: Whether the item is a draft
* **fieldData** `object`: Field values keyed by field slug. Always includes `name` and `slug`.

**Example Usage:**

```json
{
  "collectionId": "<collection-id>",
  "itemId": "<item-id>",
  "live": false
}
```

***

### Create Draft Items

Create one or more items in a Webflow CMS collection. Items are always created as drafts and are not visible on the live site until published with Publish Items. Call Get Collection Schema first to learn the field slugs and value formats.

**Operation Type:** Mutation (Write)

**Parameters:**

* **collectionId** `string` (required): Collection ID to create items in. Get it from List Collections.
* **items** `array of objects` (required): Items to create. At most 100 per call, counting each locale of each item as one.
  * **fieldData** `object` (required): Field values for the new item. `name` and `slug` are required. Keys are field slugs from the collection schema. Value formats by field type: PlainText, Link, Email, Phone, VideoLink and Color are strings; RichText is an HTML string; Number is a number; Switch is a boolean; DateTime is an ISO 8601 string; Option is the option ID from the schema field validations; Reference is an item ID and MultiReference is an array of item IDs; Image and File are `{"url": "https://...", "alt": "..."}` (4MB max for images) and MultiImage is an array of those.
  * **cmsLocaleIds** `array of strings` (nullable): CMS locale IDs to create the item in. Omit to create it in the primary locale only.
* **skipInvalidFiles** `boolean` (default: true): `true` skips image or file URLs Webflow cannot fetch and still creates the item. Set to `false` to fail the request instead.

**Returns:**

* **items** `array of objects`: The created draft items, one per item and locale (same shape as Get Item output)
* **count** `number`: Number of items created

**Example Usage:**

```json
{
  "collectionId": "<collection-id>",
  "items": [
    {
      "fieldData": {
        "name": "My First Blog Post",
        "slug": "my-first-blog-post",
        "post-body": "<p>Hello world</p>",
        "featured-image": { "url": "https://example.com/hero.png", "alt": "Hero image" }
      },
      "cmsLocaleIds": null
    }
  ],
  "skipInvalidFiles": true
}
```

***

### Update Items

Update one or more existing Webflow CMS items. Only the fields you send are changed. Edits are staged: an item that is already published keeps showing its old content on the live site until it is published again with Publish Items.

**Operation Type:** Mutation (Write)

**Parameters:**

* **collectionId** `string` (required): Collection ID the items belong to.
* **items** `array of objects` (required): Items to update. At most 100 per call.
  * **id** `string` (required): ID of the item to update.
  * **cmsLocaleId** `string` (nullable): CMS locale ID of the version to update. Omit to update the primary locale.
  * **fieldData** `object` (nullable): Field values to change. Only the fields included are updated; the rest keep their values. Same format as Create Draft Items.
  * **isDraft** `boolean` (nullable): Set the draft flag. `false` queues the item to go live on the next site publish. Omit to leave unchanged.
  * **isArchived** `boolean` (nullable): Set the archived flag. Omit to leave unchanged.
* **skipInvalidFiles** `boolean` (default: true): `true` skips image or file URLs Webflow cannot fetch and still updates the item. Set to `false` to fail the request instead.

**Returns:**

* **items** `array of objects`: The updated items as staged (same shape as Get Item output)
* **count** `number`: Number of items updated

**Example Usage:**

```json
{
  "collectionId": "<collection-id>",
  "items": [
    {
      "id": "<item-id>",
      "fieldData": {
        "post-summary": "Updated summary text"
      },
      "isDraft": null,
      "isArchived": null
    }
  ],
  "skipInvalidFiles": true
}
```

***

### Publish Items

Publish one or more Webflow CMS items so their staged content goes live on the site, without publishing the whole site. The call can partly succeed: check `errorCount` and `errors` for items that were not published.

**Operation Type:** Mutation (Write)

**Parameters:**

* **collectionId** `string` (required): Collection ID the items belong to.
* **items** `array of objects` (required): Items to publish. At most 100 per call.
  * **id** `string` (required): Item ID.
  * **cmsLocaleIds** `array of strings` (nullable): CMS locale IDs to apply this to. Omit to apply to the primary locale only.

**Returns:**

* **publishedItemIds** `array of strings`: IDs of the items that were published
* **errors** `array`: Items Webflow could not publish, with the reason. Can be non-empty even when other items were published.
* **publishedCount** `number`: Number of items published
* **errorCount** `number`: Number of items that failed to publish. Check this before reporting success.

**Example Usage:**

```json
{
  "collectionId": "<collection-id>",
  "items": [{ "id": "<item-id>", "cmsLocaleIds": null }]
}
```

***

### Unpublish Items

Take one or more Webflow CMS items off the live site. The items are not deleted: they stay in the collection as drafts and can be published again with Publish Items.

**Operation Type:** Mutation (Write)

**Parameters:**

* **collectionId** `string` (required): Collection ID the items belong to.
* **items** `array of objects` (required): Items to unpublish. At most 100 per call.
  * **id** `string` (required): Item ID.
  * **cmsLocaleIds** `array of strings` (nullable): CMS locale IDs to apply this to. Omit to apply to the primary locale only.

**Returns:**

* **unpublishedItemIds** `array of strings`: IDs of the items that were unpublished
* **unpublishedCount** `number`: Number of items unpublished

**Example Usage:**

```json
{
  "collectionId": "<collection-id>",
  "items": [{ "id": "<item-id>", "cmsLocaleIds": null }]
}
```

***

## Pages

### List Pages

List the pages of a Webflow site with their metadata: title, slug, published path, SEO and Open Graph settings, and draft or archived state. Returns up to 100 pages per call; use `offset` to page through the rest.

**Operation Type:** Query (Read)

**Parameters:**

* **siteId** `string` (required): Site ID to list pages for. Get it from List Sites.
* **localeId** `string` (nullable): Locale ID to read page metadata in. Omit for the primary locale. Get it from List Sites.
* **limit** `number` (default: 100): Maximum number of pages to return (1–100).
* **offset** `number` (default: 0): Number of pages to skip, for pagination.

**Returns:**

* **pages** `array of objects`: Pages in the site (see Get Page Metadata for the full field list)
* **pagination** `object`: Pagination information
  * **limit** `number`: Page size used for this request
  * **offset** `number`: Offset used for this request
  * **total** `number`: Total number of records available

**Example Usage:**

```json
{
  "siteId": "<site-id>",
  "limit": 100,
  "offset": 0
}
```

***

### Get Page Metadata

Get the metadata of a single Webflow page: title, slug, published path, SEO title and description, Open Graph settings, and draft or archived state. Does not return the page body; use Get Page Content for that.

**Operation Type:** Query (Read)

**Parameters:**

* **pageId** `string` (required): Page ID. Get it from List Pages.
* **localeId** `string` (nullable): Locale ID to read the metadata in. Omit for the primary locale.

**Returns:**

* **id** `string`: Page ID. Pass as `pageId` to the other page tools.
* **siteId** `string` (nullable): Site the page belongs to
* **title** `string` (nullable): Page title
* **slug** `string` (nullable): Page URL slug
* **parentId** `string` (nullable): ID of the parent folder, or null for a top-level page
* **collectionId** `string` (nullable): Collection ID when this is a CMS collection template page, otherwise null
* **localeId** `string` (nullable): Locale this version of the page belongs to
* **publishedPath** `string` (nullable): Path the page is published at, e.g. "/pricing"
* **createdOn** `string` (nullable): When the page was created
* **lastUpdated** `string` (nullable): When the page was last updated
* **archived** `boolean`: Whether the page is archived
* **draft** `boolean`: Whether the page is a draft
* **seo** `object`: Search engine metadata
  * **title** `string` (nullable): SEO title shown in search results
  * **description** `string` (nullable): SEO meta description
* **openGraph** `object`: Social sharing metadata
  * **title** `string` (nullable): Open Graph title
  * **titleCopied** `boolean` (nullable): Whether the Open Graph title mirrors the SEO title
  * **description** `string` (nullable): Open Graph description
  * **descriptionCopied** `boolean` (nullable): Whether the Open Graph description mirrors the SEO description

**Example Usage:**

```json
{
  "pageId": "<page-id>"
}
```

***

### Update Page Metadata

Update the metadata of a Webflow page: title, slug, SEO title and description, and Open Graph title and description. Only the fields you provide are sent. Changes go live on the next site publish. Does not change the page body.

**Operation Type:** Mutation (Write)

**Parameters:**

* **pageId** `string` (required): Page ID. Get it from List Pages.
* **localeId** `string` (nullable): Locale ID of the version to update. Omit to update the primary locale.
* **title** `string` (nullable): New page title. Omit to leave unchanged.
* **slug** `string` (nullable): New URL slug. Omit to leave unchanged. Webflow ignores this for the home page, collection template pages, and utility pages (404, password, search).
* **seoTitle** `string` (nullable): New SEO title. Omit to leave unchanged.
* **seoDescription** `string` (nullable): New SEO meta description. Omit to leave unchanged.
* **openGraphTitle** `string` (nullable): New Open Graph title. Only takes effect when `openGraphTitleCopied` is `false`. Omit to leave unchanged.
* **openGraphTitleCopied** `boolean` (nullable): `true` makes the Open Graph title mirror the SEO title; `false` lets it differ. Omit to leave unchanged.
* **openGraphDescription** `string` (nullable): New Open Graph description. Only takes effect when `openGraphDescriptionCopied` is `false`. Omit to leave unchanged.
* **openGraphDescriptionCopied** `boolean` (nullable): `true` makes the Open Graph description mirror the SEO description; `false` lets it differ. Omit to leave unchanged.

**Returns:**

The updated page metadata (same shape as Get Page Metadata output).

**Example Usage:**

```json
{
  "pageId": "<page-id>",
  "seoTitle": "Pricing — My Company",
  "seoDescription": "Simple, transparent pricing for teams of all sizes.",
  "openGraphTitleCopied": true,
  "openGraphDescriptionCopied": true
}
```

***

### Get Page Content

Read the static content of a Webflow page as a list of nodes: text, images, component instances and form elements. Use it to audit page copy. Read-only: static page content cannot be changed through these tools. Returns up to 100 nodes per call; use `offset` to page through the rest. CMS-driven content is not included; read that with the CMS item tools.

**Operation Type:** Query (Read)

**Parameters:**

* **pageId** `string` (required): Page ID. Get it from List Pages.
* **localeId** `string` (nullable): Locale ID to read the content in. Omit for the primary locale. Get it from List Sites.
* **limit** `number` (default: 100): Maximum number of nodes to return (1–100).
* **offset** `number` (default: 0): Number of nodes to skip, for pagination.

**Returns:**

* **pageId** `string`: Page ID
* **branchId** `string` (nullable): Branch ID when the page is a branch, otherwise null
* **lastUpdated** `string` (nullable): When the page content was last updated
* **nodes** `array of objects`: Content nodes on the page, in document order
  * **id** `string`: Node ID
  * **type** `string`: Node type: `text`, `image`, `component-instance`, `text-input`, `select`, `submit-button`, or `search-button`
  * **html** `string` (nullable): HTML of a text node, including its wrapping tag. Null for other node types.
  * **text** `string` (nullable): Plain text of a text node. Null for other node types.
  * **imageAlt** `string` (nullable): Alt text of an image node
  * **imageAssetId** `string` (nullable): Asset ID of an image node
  * **componentId** `string` (nullable): Component ID of a component-instance node
  * **propertyOverrides** `array of objects` (nullable): Property values overridden on a component-instance node
    * **propertyId** `string`: Component property ID
    * **type** `string` (nullable): Property type, e.g. "Plain Text" or "Rich Text"
    * **label** `string` (nullable): Property label
    * **html** `string` (nullable): HTML value of the property
    * **text** `string` (nullable): Plain text value of the property
  * **placeholder** `string` (nullable): Placeholder of a text-input node
  * **choices** `array of objects` (nullable): Choices of a select node
    * **value** `string`: Value submitted for the choice
    * **text** `string`: Label shown for the choice
  * **value** `string` (nullable): Button label of a submit-button or search-button node
  * **waitingText** `string` (nullable): Label a submit-button node shows while submitting
  * **attributes** `object`: Custom attributes set on the element
* **pagination** `object`: Pagination information
  * **limit** `number`: Page size used for this request
  * **offset** `number`: Offset used for this request
  * **total** `number`: Total number of records available

**Example Usage:**

```json
{
  "pageId": "<page-id>",
  "limit": 100,
  "offset": 0
}
```

***

## Publishing

### Publish Site

Publish a whole Webflow site to its custom domains, its webflow\.io subdomain, or both. This pushes every staged change live at once: page content, page metadata, and all staged CMS items, including changes made by other people. To publish only specific CMS items, use Publish Items instead. Webflow queues the publish and allows one per minute per site.

**Operation Type:** Mutation (Write)

**Parameters:**

* **siteId** `string` (required): Site ID to publish. Get it from List Sites.
* **customDomainIds** `array of strings` (nullable): IDs of the custom domains to publish to, from `customDomains` in List Sites. Omit to skip custom domains.
* **publishToWebflowSubdomain** `boolean` (default: false): Whether to publish to the site's default "webflow\.io" staging subdomain.

**Returns:**

* **customDomains** `array of objects`: Custom domains the publish was queued for
  * **id** `string`: Custom domain ID
  * **url** `string` (nullable): Domain name
  * **lastPublished** `string` (nullable): When the domain was last published before this request
* **publishToWebflowSubdomain** `boolean`: Whether the publish was queued for the webflow\.io subdomain

**Example Usage:**

```json
{
  "siteId": "<site-id>",
  "customDomainIds": ["<domain-id>"],
  "publishToWebflowSubdomain": false
}
```

***

## Assets

### List Assets

List the images and files uploaded to a Webflow site, with their public URLs, file names, types, sizes and alt text. Use it to find an existing asset before uploading a duplicate. Returns up to 100 assets per call; use `offset` to page through the rest.

**Operation Type:** Query (Read)

**Parameters:**

* **siteId** `string` (required): Site ID to list assets for. Get it from List Sites.
* **limit** `number` (default: 100): Maximum number of assets to return (1–100).
* **offset** `number` (default: 0): Number of assets to skip, for pagination.

**Returns:**

* **assets** `array of objects`: Assets in the site
  * **id** `string`: Asset ID
  * **displayName** `string` (nullable): Name shown in the Webflow assets panel
  * **originalFileName** `string` (nullable): File name the asset was uploaded with
  * **contentType** `string` (nullable): MIME type, e.g. "image/png"
  * **size** `number` (nullable): File size in bytes
  * **hostedUrl** `string` (nullable): Public URL of the asset. Use it as the `url` of an Image or File field when writing CMS items.
  * **altText** `string` (nullable): Alt text
  * **createdOn** `string` (nullable): When the asset was uploaded
  * **lastUpdated** `string` (nullable): When the asset was last updated
* **pagination** `object`: Pagination information
  * **limit** `number`: Page size used for this request
  * **offset** `number`: Offset used for this request
  * **total** `number`: Total number of records available

**Example Usage:**

```json
{
  "siteId": "<site-id>",
  "limit": 100,
  "offset": 0
}
```

***

### Upload Asset

Upload an image or file from a public URL into the assets of a Webflow site. Returns the hosted URL, which can be used as the value of an Image or File field when creating or updating CMS items. For an image the user attached to the chat, use Upload Chat Image instead.

**Operation Type:** Mutation (Write)

**Parameters:**

* **siteId** `string` (required): Site ID to upload the asset to. Get it from List Sites.
* **fileUrl** `string` (required): Publicly reachable HTTPS URL of the file to upload. 4MB max for images, 10MB for other files. The URL must be HTTPS and passes SSRF checks; at most 3 redirects are followed.
* **fileName** `string` (nullable): File name to store the asset under, including its extension, e.g. "hero.png". Under 100 characters. Omit to use the last segment of `fileUrl`.
* **parentFolderId** `string` (nullable): ID of the asset folder to put the file in. Omit for the top level.

> **Image size limit (changed in PR #9726):** Images (detected by file-name extension or served content type) are rejected before the upload if they exceed 4MB. Non-image files keep a 10MB cap. Files declared or streamed over the cap are rejected with an actionable error.

**Returns:**

* **assetId** `string`: ID of the new asset
* **hostedUrl** `string` (nullable): Public URL of the uploaded asset. Use it as the `url` of an Image or File field when writing CMS items.
* **fileName** `string`: File name the asset was stored under
* **contentType** `string` (nullable): MIME type Webflow assigned to the asset
* **size** `number`: Size of the uploaded file in bytes

**Example Usage:**

```json
{
  "siteId": "<site-id>",
  "fileUrl": "https://example.com/hero.png",
  "fileName": "hero.png",
  "parentFolderId": null
}
```

***

### Upload Chat Image

Upload an image the user attached to this chat into the assets of a Webflow site. Reads the image straight from the conversation, so no URL is needed. Returns the hosted URL, which can be used as the value of an Image field when creating or updating CMS items.

> **Chat-only tool:** This operation is available in chat conversations only. It is **not** available in workflow ToolCall nodes because it reads images from the live conversation context. For workflows, use Upload Asset with a public URL instead.

**Supported image types:** PNG, JPEG, GIF, SVG, WebP, AVIF. 4MB max.

**Operation Type:** Mutation (Write)

**Parameters:**

* **siteId** `string` (required): Site ID to upload the image to. Get it from List Sites.
* **imageNumber** `number` (default: 1): Which attached image to upload. Images are numbered starting from the most recent user message that has attachments, in the order they were attached, then continuing into earlier messages. 1 (default) is the first image of the most recent message with images.
* **fileName** `string` (nullable): File name to store the asset under, including its extension, e.g. "hero.png". Under 100 characters. Omit to keep the name the image was attached with (falls back to `image.<ext>` for pasted images that have no name).
* **parentFolderId** `string` (nullable): ID of the asset folder to put the image in. Omit for the top level.

> **Caveats:** Only inline base64 images attached in chat are supported — PDFs and other document types attached in chat are not covered. Hidden messages are skipped. If an image is not stored inline (e.g. a URL reference), use Upload Asset with a public URL instead. Errors are actionable: no images attached, `imageNumber` out of range, unsupported type, over 4MB, or image not stored inline.

**Returns:**

* **assetId** `string`: ID of the new asset
* **hostedUrl** `string` (nullable): Public URL of the uploaded asset. Use it as the `url` of an Image or File field when writing CMS items.
* **fileName** `string`: File name the asset was stored under
* **contentType** `string` (nullable): MIME type Webflow assigned to the asset
* **size** `number`: Size of the uploaded file in bytes

**Example Usage:**

```json
{
  "siteId": "<site-id>",
  "imageNumber": 1,
  "fileName": "hero.png",
  "parentFolderId": null
}
```

***

## Common Use Cases

**CMS Content Management:**

* List collections to discover what CMS content types a site has (Blog Posts, Team Members, etc.)
* Get a collection's schema before creating items to ensure field slugs and formats are correct
* Create draft items in bulk, then publish them once reviewed
* Update existing CMS items (e.g. refresh a blog post body or change a featured image) without touching other fields

**Site Publishing & Workflow:**

* Stage multiple page and CMS edits, then publish items individually without triggering a full site rebuild
* Publish the whole site to a webflow\.io subdomain first for staging review, then publish to custom domains
* Unpublish items that should no longer be visible without deleting them from the CMS

**Asset Management:**

* List existing assets before uploading to avoid duplicates
* Upload images from a public URL (e.g. a CDN or S3 bucket) and get back the hosted URL to use in CMS Image fields
* In a chat workflow, attach an image directly and upload it to Webflow without needing an intermediate URL — then pass the returned `hostedUrl` to a CMS item field

**SEO & Page Metadata:**

* Audit all pages in a site to find missing SEO titles or descriptions
* Bulk-update Open Graph metadata across pages to match a new brand tone
* Read static page copy with Get Page Content to audit headlines and body text

