Webflow API
Manage Webflow sites, pages, CMS collections, items, assets, and forms via the REST API v2.
Official docs:
https://developers.webflow.com/data/reference/rest-introduction
When to Use
Use this skill when you need to:
- List and inspect sites in a Webflow workspace
- Read page metadata and site structure
- Manage CMS collections — list, create, delete collections and fields
- CRUD CMS items — create, read, update, delete, and publish collection items
- List and manage assets (images, files) on a site
- Retrieve form submissions from Webflow forms
Prerequisites
Connect your Webflow account via the vm0 platform (OAuth connector). The WEBFLOW_TOKEN environment variable is automatically configured.
Verify authentication:
curl -s "https://api.webflow.com/v2/token/authorized_by" --header "Authorization: Bearer $(printenv WEBFLOW_TOKEN)" | jq '{id, email, firstName, lastName}'
Expected response: Your user information (id, email, name).
How to Use
All examples assume WEBFLOW_TOKEN is set.
Base URL: https://api.webflow.com/v2
1. Get Authorized User
Get information about the authenticated user:
curl -s "https://api.webflow.com/v2/token/authorized_by" --header "Authorization: Bearer $(printenv WEBFLOW_TOKEN)" | jq '{id, email, firstName, lastName}'
2. List Sites
List all sites accessible to the authenticated user:
curl -s "https://api.webflow.com/v2/sites" --header "Authorization: Bearer $(printenv WEBFLOW_TOKEN)" | jq '.sites[] | {id, displayName, shortName, lastPublished}'
3. Get Site Details
Retrieve details for a specific site. Replace <site-id> with an actual site ID from the list sites response.
curl -s "https://api.webflow.com/v2/sites/<site-id>" --header "Authorization: Bearer $(printenv WEBFLOW_TOKEN)" | jq '{id, displayName, shortName, lastPublished, previewUrl}'
4. List Pages
List all pages for a site. Replace <site-id> with your site ID.
curl -s "https://api.webflow.com/v2/sites/<site-id>/pages" --header "Authorization: Bearer $(printenv WEBFLOW_TOKEN)" | jq '.pages[] | {id, title, slug, createdOn, lastUpdated}'
5. Get Page Metadata
Retrieve metadata for a specific page. Replace <page-id> with an actual page ID.
curl -s "https://api.webflow.com/v2/pages/<page-id>" --header "Authorization: Bearer $(printenv WEBFLOW_TOKEN)" | jq '{id, title, slug, seo: {title: .seo.title, description: .seo.description}}'
6. Update Page Settings
Update SEO settings or other metadata for a page. Replace <page-id> with your page ID.
Write to /tmp/webflow_page_update.json:
{
"body": {
"seo": {
"title": "Updated Page Title",
"description": "Updated meta description for this page"
}
}
}
curl -s -X PATCH "https://api.webflow.com/v2/pages/<page-id>" --header "Authorization: Bearer $(printenv WEBFLOW_TOKEN)" --header "Content-Type: application/json" -d @/tmp/webflow_page_update.json | jq '{id, title, slug}'
7. List Collections
List all CMS collections for a site. Replace <site-id> with your site ID.
curl -s "https://api.webflow.com/v2/sites/<site-id>/collections" --header "Authorization: Bearer $(printenv WEBFLOW_TOKEN)" | jq '.collections[] | {id, displayName, singularName, slug}'
8. Get Collection Details
Retrieve schema and details for a specific collection, including field definitions. Replace <collection-id> with your collection ID.
curl -s "https://api.webflow.com/v2/collections/<collection-id>" --header "Authorization: Bearer $(printenv WEBFLOW_TOKEN)" | jq '{id, displayName, singularName, slug, fields: [.fields[] | {id, displayName, slug, type, isRequired}]}'
9. List Collection Items
List all items in a CMS collection. Replace <collection-id> with your collection ID.
curl -s "https://api.webflow.com/v2/collections/<collection-id>/items" --header "Authorization: Bearer $(printenv WEBFLOW_TOKEN)" | jq '.items[] | {id, fieldData: .fieldData}'
Supports pagination with offset and limit query parameters:
curl -s "https://api.webflow.com/v2/collections/<collection-id>/items?offset=0&limit=10" --header "Authorization: Bearer $(printenv WEBFLOW_TOKEN)" | jq '{pagination, items: [.items[] | {id, fieldData: .fieldData}]}'
10. Get Collection Item
Get a single item by ID. Replace <collection-id> and <item-id>.
curl -s "https://api.webflow.com/v2/collections/<collection-id>/items/<item-id>" --header "Authorization: Bearer $(printenv WEBFLOW_TOKEN)" | jq '{id, fieldData}'
11. Create Collection Item
Create a new item in a CMS collection. Replace <collection-id> with your collection ID.
Write to /tmp/webflow_item.json:
{
"fieldData": {
"name": "New Blog Post",
"slug": "new-blog-post"
}
}
curl -s -X POST "https://api.webflow.com/v2/collections/<collection-id>/items" --header "Authorization: Bearer $(printenv WEBFLOW_TOKEN)" --header "Content-Type: application/json" -d @/tmp/webflow_item.json | jq '{id, fieldData}'
12. Update Collection Item
Update an existing item. Replace <collection-id> and <item-id>.
Write to /tmp/webflow_item_update.json:
{
"fieldData": {
"name": "Updated Blog Post Title"
}
}
curl -s -X PATCH "https://api.webflow.com/v2/collections/<collection-id>/items/<item-id>" --header "Authorization: Bearer $(printenv WEBFLOW_TOKEN)" --header "Content-Type: application/json" -d @/tmp/webflow_item_update.json | jq '{id, fieldData}'
13. Delete Collection Item
Delete an item from a collection. Replace <collection-id> and <item-id>.
curl -s -X DELETE "https://api.webflow.com/v2/collections/<collection-id>/items/<item-id>" --header "Authorization: Bearer $(printenv WEBFLOW_TOKEN)"
14. Publish Collection Items
Publish one or more staged items. Replace <collection-id> with your collection ID.
Write to /tmp/webflow_publish.json:
{
"itemIds": ["<item-id-1>", "<item-id-2>"]
}
curl -s -X POST "https://api.webflow.com/v2/collections/<collection-id>/items/publish" --header "Authorization: Bearer $(printenv WEBFLOW_TOKEN)" --header "Content-Type: application/json" -d @/tmp/webflow_publish.json | jq '{publishedItemIds}'
15. List Assets
List all assets (images, files) for a site. Replace <site-id> with your site ID.
curl -s "https://api.webflow.com/v2/sites/<site-id>/assets" --header "Authorization: Bearer $(printenv WEBFLOW_TOKEN)" | jq '.assets[] | {id, displayName, url, fileSize, contentType}'
16. Get Asset Details
Get details for a specific asset. Replace <asset-id> with your asset ID.
curl -s "https://api.webflow.com/v2/assets/<asset-id>" --header "Authorization: Bearer $(printenv WEBFLOW_TOKEN)" | jq '{id, displayName, url, fileSize, contentType, createdOn}'
17. List Form Submissions
List submissions for a specific form. Replace <form-id> with your form ID.
curl -s "https://api.webflow.com/v2/forms/<form-id>/submissions" --header "Authorization: Bearer $(printenv WEBFLOW_TOKEN)" | jq '.formSubmissions[] | {id, submittedAt, formData}'
To find form IDs, list all forms for a site first:
curl -s "https://api.webflow.com/v2/sites/<site-id>/forms" --header "Authorization: Bearer $(printenv WEBFLOW_TOKEN)" | jq '.forms[] | {id, displayName, siteId}'
18. Publish Site
Trigger a site publish. Replace <site-id> with your site ID.
Write to /tmp/webflow_publish_site.json:
{
"publishToWebflowSubdomain": true
}
curl -s -X POST "https://api.webflow.com/v2/sites/<site-id>/publish" --header "Authorization: Bearer $(printenv WEBFLOW_TOKEN)" --header "Content-Type: application/json" -d @/tmp/webflow_publish_site.json
Guidelines
- Start with
/v2/token/authorized_by: Always verify auth first before calling other endpoints - Get site ID first: Most operations require a site ID — call List Sites first
- CMS workflow: List collections -> get collection schema -> CRUD items -> publish items
- Staged vs Live items: By default, item endpoints work with staged (draft) items. Use
/items/livepath for published items - Pagination: List endpoints support
offsetandlimitquery parameters (default limit is 100) - Rate limits: 60 requests per minute; back off on 429 responses
- Field data: When creating/updating items, field values go inside the
fieldDataobject, keyed by field slug