Webflow CMS Skill
Credentials
- API Token:
${WEBFLOW_API_KEY}
- Site ID:
68f612cac31a6f533ce5528d
- Site: berendstrik.webflow.io
Image Upload Workflow
OPTION 1: Webflow Native (PREFERRED — but requires asset upload permission)
const { WebflowClient } = require('webflow-api');
const fs = require('fs');
const client = new WebflowClient({
token: process.env.WEBFLOW_API_TOKEN
});
async function uploadAsset(filePath, fileName) {
const fileBuffer = fs.readFileSync(filePath);
const arrayBuffer = fileBuffer.buffer.slice(
fileBuffer.byteOffset,
fileBuffer.byteOffset + fileBuffer.byteLength
);
return await client.assets.utilities.createAndUpload(
'68f612cac31a6f533ce5528d',
{ file: arrayBuffer, fileName }
);
}
⚠️ NOTE: The Personal Access Token may not have asset upload permissions (401 Unauthorized). If this fails, use Zernio workaround below.
OPTION 2: Zernio Workaround (RECOMMENDED when native fails)
# 1. Upload to Zernio
zernio media:upload /path/to/image.jpg
# Returns: {"url": "https://media.zernio.com/temp/..."}
# 2. Use the Zernio URL in Webflow PATCH
curl -X PATCH "https://api.webflow.com/v2/collections/<ID>/items/<ITEM_ID>" \
-H "Authorization: Bearer <TOKEN>" \
-H "Content-Type: application/json" \
-d '{"fieldData": {"cover": {"url": "https://media.zernio.com/temp/..."}}}'
Collections
Museums Collection
- Collection ID:
69ce595b57060eb28a767604
- Fields: name, slug, museum-description, cover (Image), article (RichText), url-naar-collectie (Link), city (PlainText), pic-1 (Image)
- Item IDs: See museums section below
Events Collection
- Collection ID:
69bfd230ceecbebceff82be0
- Fields: name, date-time, location, location-link, gallery, cover-image (Image), event-short-description, event-description, google-maps-embed (RichText), event-passed
Arts Collection
- Collection ID:
69bfd1ac805e504d421e717e
- Fields: title, slug, category, image (Image), description
FAQs Collection
- Collection ID:
69bfcf6e010a4c52f2a48c84
Common Operations
# List collections
curl -s "https://api.webflow.com/v2/sites/<SITE_ID>/collections" \
-H "Authorization: Bearer <TOKEN>"
# Get items
curl -s "https://api.webflow.com/v2/collections/<COLLECTION_ID>/items?limit=20" \
-H "Authorization: Bearer <TOKEN>"
# Update item (PATCH)
curl -s -X PATCH "https://api.webflow.com/v2/collections/<COLLECTION_ID>/items/<ITEM_ID>" \
-H "Authorization: Bearer <TOKEN>" \
-H "Content-Type: application/json" \
-d '{"fieldData": {"field-slug": "value"}}'
# Update image field
curl -s -X PATCH "https://api.webflow.com/v2/collections/<COLLECTION_ID>/items/<ITEM_ID>" \
-H "Authorization: Bearer <TOKEN>" \
-H "Content-Type: application/json" \
-d '{"fieldData": {"cover": {"url": "https://..."}}}'
# Publish site
curl -s -X POST "https://api.webflow.com/v2/sites/<SITE_ID>/publish" \
-H "Authorization: Bearer <TOKEN>" \
-H "Content-Type: application/json" \
-d '{}'
Museums (11 items)
| ID |
Naam |
City |
69da5015eae9663f6a1249a7 |
Stedelijk Museum Amsterdam |
Amsterdam |
69da502755f63a9020331500 |
Collectie Gelderland |
Arnhem |
69da5028589590c9f45f26f5 |
Fries Museum |
Leeuwarden |
69da50296e1e2ae5ac11da20 |
Museum Boijmans Van Beuningen |
Rotterdam |
69da502a33b6e39977b3878e |
Museum De Lakenhal |
Leiden |
69da502c36537a51a7297f60 |
SCHUNCK |
Heerlen |
69da502fff42dc29f5e158e4 |
Museum Het Valkhof |
Nijmegen |
69da51907598dd35f8bb0196 |
Rijksmuseum Twenthe |
Enschede |
69da519179c7893028f9a61a |
Stedelijk Museum Schiedam |
Schiedam |
69da5192c39688272b34cd9f |
TextielMuseum |
Tilburg |
69da519333b6e39977b3c51b |
Museum Het Domein |
Sittard |
Events (5 items)
| ID |
Naam |
Gallery |
Date |
69c905c1c217479704f7a9d4 |
Heem |
Fries Museum |
28 Apr 2024 – 27 Apr 2025 |
69c905bf336bdaf15ece39a1 |
33 1/3 RPM |
De Vishal |
7 Sep – 13 Oct 2024 |
69c905bdfecfd85d4f92cc0d |
Copilot, Voice and Vision |
Galerie Fons Welters |
2 Nov – 21 Dec 2024 |
69c905acfecfd85d4f92ca7d |
Connecting Threads |
GPS Gallery |
9 Jan – 17 Jan 2026 |
69bfda27313639e3d6279b81 |
Art Rotterdam 2026 |
Rotterdam Ahoy |
27 – 29 Mar 2026 |
Error Codes
- 401: Invalid token or no asset upload permission
- 404: Collection/item not found
- 429: Rate limited — wait 60s
- validation_error: Missing required field
Notes
- Image fields use
{"url": "..."} format, not plain URL string
- RichText fields need valid HTML
- Asset upload via native API may fail with 401 if token lacks permissions → use Zernio workaround
1---2name: webflow3description: Webflow CMS Skill4---5# Webflow CMS Skill67## Credentials8- **API Token**: `${WEBFLOW_API_KEY}`9- **Site ID**: `68f612cac31a6f533ce5528d`10- **Site**: berendstrik.webflow.io1112## Image Upload Workflow1314### OPTION 1: Webflow Native (PREFERRED — but requires asset upload permission)1516```javascript17const { WebflowClient } = require('webflow-api');18const fs = require('fs');1920const client = new WebflowClient({ 21 token: process.env.WEBFLOW_API_TOKEN22});2324async function uploadAsset(filePath, fileName) {25 const fileBuffer = fs.readFileSync(filePath);26 const arrayBuffer = fileBuffer.buffer.slice(27 fileBuffer.byteOffset, 28 fileBuffer.byteOffset + fileBuffer.byteLength29 );30 31 return await client.assets.utilities.createAndUpload(32 '68f612cac31a6f533ce5528d',33 { file: arrayBuffer, fileName }34 );35}36```3738**⚠️ NOTE:** The Personal Access Token may not have asset upload permissions (401 Unauthorized). If this fails, use Zernio workaround below.3940### OPTION 2: Zernio Workaround (RECOMMENDED when native fails)4142```bash43# 1. Upload to Zernio44zernio media:upload /path/to/image.jpg45# Returns: {"url": "https://media.zernio.com/temp/..."}4647# 2. Use the Zernio URL in Webflow PATCH48curl -X PATCH "https://api.webflow.com/v2/collections/<ID>/items/<ITEM_ID>" \49 -H "Authorization: Bearer <TOKEN>" \50 -H "Content-Type: application/json" \51 -d '{"fieldData": {"cover": {"url": "https://media.zernio.com/temp/..."}}}'52```5354## Collections5556### Museums Collection57- **Collection ID**: `69ce595b57060eb28a767604`58- **Fields**: name, slug, museum-description, cover (Image), article (RichText), url-naar-collectie (Link), city (PlainText), pic-1 (Image)59- **Item IDs**: See museums section below6061### Events Collection62- **Collection ID**: `69bfd230ceecbebceff82be0`63- **Fields**: name, date-time, location, location-link, gallery, cover-image (Image), event-short-description, event-description, google-maps-embed (RichText), event-passed6465### Arts Collection66- **Collection ID**: `69bfd1ac805e504d421e717e`67- **Fields**: title, slug, category, image (Image), description6869### FAQs Collection70- **Collection ID**: `69bfcf6e010a4c52f2a48c84`7172## Common Operations7374```bash75# List collections76curl -s "https://api.webflow.com/v2/sites/<SITE_ID>/collections" \77 -H "Authorization: Bearer <TOKEN>"7879# Get items80curl -s "https://api.webflow.com/v2/collections/<COLLECTION_ID>/items?limit=20" \81 -H "Authorization: Bearer <TOKEN>"8283# Update item (PATCH)84curl -s -X PATCH "https://api.webflow.com/v2/collections/<COLLECTION_ID>/items/<ITEM_ID>" \85 -H "Authorization: Bearer <TOKEN>" \86 -H "Content-Type: application/json" \87 -d '{"fieldData": {"field-slug": "value"}}'8889# Update image field90curl -s -X PATCH "https://api.webflow.com/v2/collections/<COLLECTION_ID>/items/<ITEM_ID>" \91 -H "Authorization: Bearer <TOKEN>" \92 -H "Content-Type: application/json" \93 -d '{"fieldData": {"cover": {"url": "https://..."}}}'9495# Publish site96curl -s -X POST "https://api.webflow.com/v2/sites/<SITE_ID>/publish" \97 -H "Authorization: Bearer <TOKEN>" \98 -H "Content-Type: application/json" \99 -d '{}'100```101102## Museums (11 items)103| ID | Naam | City |104|----|------|------|105| `69da5015eae9663f6a1249a7` | Stedelijk Museum Amsterdam | Amsterdam |106| `69da502755f63a9020331500` | Collectie Gelderland | Arnhem |107| `69da5028589590c9f45f26f5` | Fries Museum | Leeuwarden |108| `69da50296e1e2ae5ac11da20` | Museum Boijmans Van Beuningen | Rotterdam |109| `69da502a33b6e39977b3878e` | Museum De Lakenhal | Leiden |110| `69da502c36537a51a7297f60` | SCHUNCK | Heerlen |111| `69da502fff42dc29f5e158e4` | Museum Het Valkhof | Nijmegen |112| `69da51907598dd35f8bb0196` | Rijksmuseum Twenthe | Enschede |113| `69da519179c7893028f9a61a` | Stedelijk Museum Schiedam | Schiedam |114| `69da5192c39688272b34cd9f` | TextielMuseum | Tilburg |115| `69da519333b6e39977b3c51b` | Museum Het Domein | Sittard |116117## Events (5 items)118| ID | Naam | Gallery | Date |119|----|------|--------|------|120| `69c905c1c217479704f7a9d4` | Heem | Fries Museum | 28 Apr 2024 – 27 Apr 2025 |121| `69c905bf336bdaf15ece39a1` | 33 1/3 RPM | De Vishal | 7 Sep – 13 Oct 2024 |122| `69c905bdfecfd85d4f92cc0d` | Copilot, Voice and Vision | Galerie Fons Welters | 2 Nov – 21 Dec 2024 |123| `69c905acfecfd85d4f92ca7d` | Connecting Threads | GPS Gallery | 9 Jan – 17 Jan 2026 |124| `69bfda27313639e3d6279b81` | Art Rotterdam 2026 | Rotterdam Ahoy | 27 – 29 Mar 2026 |125126## Error Codes127- **401**: Invalid token or no asset upload permission128- **404**: Collection/item not found129- **429**: Rate limited — wait 60s130- **validation_error**: Missing required field131132## Notes133- Image fields use `{"url": "..."}` format, not plain URL string134- RichText fields need valid HTML135- Asset upload via native API may fail with 401 if token lacks permissions → use Zernio workaround