Webflow organizes two broad domains you will use most: site-scoped resources (sites, pages, assets, scripts, redirects, webhooks, ecommerce orders/products/users/forms) and collection-scoped CMS resources (collections, fields, items, locales). Many operations require an ID from one of those domains before you can act on related resources; getting those IDs is the first step in nearly every workflow.
Key entities and relationships
- Site: root scope for hosting, pages, assets, scripts, webhooks, redirects, ecommerce products and orders. Most ecommerce, page, and asset endpoints require a
site_id. - Collection: a CMS collection belongs to a Site. To work with CMS entries you need the
collection_id. Collections expose a schema offieldsused in itemfieldData. - Item (collection item): belongs to a
collection_id. Items haveid,fieldData(including requirednameandslug), and flagsisDraft/isArchived. There is a clear distinction between draft/staged items and live items: operations exist for both staging (create-item,update-item,list-collection-items) and live content (create-item-live,update-item-live,list-collection-items-live,get-item-live). Publishing is separate (publish-item). - Product / SKU / Inventory: products are site-scoped. A product object contains product-level
fieldDataand an array of SKUs. SKUs have their ownidandfieldData(price, slug,sku-values). Inventory is per-SKU and addressed withsku_collection_idandsku_id. - Asset / Asset Folder: assets live under a Site and are referenced by
asset_id.create-assetreturns upload metadata (see Gotchas). Asset IDs are what you reference in item or SKU image fields. - Page / Component: pages and components expose DOM-like content via
get-static-content/get-component-contentand can be updated withupdate-static-content/update-component-content. Page and component operations often accept alocaleIdand abranchIdwhen branching/localized editing is used. - Webhook, User, Form, Order, Redirect: each has its own ID type (e.g.,
webhook_id,user_id,form_submission_id,order_id,redirect_id) and are usually site-scoped or workspace-scoped per the operation signature.
Knowing which ID you need and where to get it is the most important practical step. For example, collection operations almost always require collection_id; product/sku and order operations require site_id plus the specific product_id, sku_id, or order_id.
Typical entry points — what to call first
- Get list of Sites: use
list-sitesto retrievesite.idvalues. Many workflows start from the Site. - For CMS work: call
list-collectionswith thesite_idto findcollection_idand inspect the collection schema viacollection-detailsto learn field slugs and required fields. - To find items: use
list-collection-items(orlist-collection-items-livefor published items) to get itemidand currentfieldData(includingslugandname). - For ecommerce: call
list-productsto get product IDs and nested SKUs, orget-productfor a single product + SKUs. Uselist-ordersto scan recent orders andget-orderto inspect a specific order. - For assets: call
list-assetsorlist-asset-foldersfor existing assets; usecreate-assetto start an upload andget-assetto inspect the metadata after upload. - For pages/components: call
list-pagesorget-page-metadatato obtainpage_id; thenget-static-contentto read DOM nodes; update withupdate-static-content(requireslocaleId). - For forms: use
list-formsto find a form'sid, thenget-form-schemaandlist-submissionsorget-form-submissionfor responses.
Common tasks and the operation sequences to accomplish them
The guidance below describes the minimal sequences that produce the IDs or effects you need. Reference the operation names when assembling requests.
Create a CMS item (staged) and publish it
- Find
site_id->list-collections-> pickcollection_id. - Inspect required fields with
collection-detailsto buildfieldData(must includenameandslugwhere required). - Create the item with
create-item(orcreate-itemsfor a batch). Note theskipInvalidFilesquery (default true) controls whether invalid file references fail the whole request. - If you created a draft/staged item and need it published, call
publish-itemfor thatcollection_idand item(s). Alternatively usecreate-item-liveto create directly on the live site.
Create or update an asset and reference it in CMS fields or SKU images
- Use
create-assetwithsite_id. The response may include either anuploadUrlor a set ofuploadDetails(S3/presigned fields). Provide those upload instructions to whoever will upload the binary. The API’s asset metadata is created when you callcreate-asset; the binary upload may be a separate step outside this API. - After upload, confirm with
get-asset(returnshostedUrl,variants,altText). Use theasset.idinfieldData(or thehostedUrlin image fields) depending on the collection/schema.
Create products and SKUs, then manage inventory
- Create a product with
create-product(passsite_id). The response contains the product object and optionally created SKUs. - To add SKUs separately, call
create-skuswithsite_idandproduct_id. - Update SKU details with
update-sku(site_id,product_id,sku_id) and adjust inventory withupdate-inventory(requiressku_collection_idandsku_id). Uselist-productsorget-productto discoverproduct_idand SKUidvalues.
Process and manage orders
- Use
list-ordersto find recentorderIdvalues (supplysite_id). Inspect a single order withget-order. - Transition order state using
fulfill-orderandunfulfill-order(both requiresite_id+order_id). Issue refunds withrefund-order.
Pages and component content edits
- Get a page's
page_idvialist-pagesorget-page-metadata. - Read content nodes with
get-static-content(orget-component-contentfor components). These responses include node UUIDs and types (text, image, component-instance, etc.). - To update, call
update-static-content(page-level) orupdate-component-content. For pages you must supply thelocaleIdin the query (it's required byupdate-static-content). If the site uses branching, includebranchIdto scope edits to a branch.
Forms and submissions
- Discover a form with
list-forms, get its schema withget-form-schema. - Review responses using
list-submissions(form-scoped) orlist-submissions-by-site(site-scoped); inspect individual responses withget-form-submissionorget-form-submission-by-site. - Modify or delete form submissions with
modify-form-submission/delete-form-submission(note there are both form-scoped and site-scoped variants).
User management and access groups
- List site users with
list-users. Invite a new user to a site withinvite-user(supplysite_id) and update or remove withupdate-user/delete-user. - To check access groups available to assign, call
list-access-groupswithsite_id.
Webhooks and scripts
- Register webhooks with
create-webhook, inspect them withlist-webhooks/get-webhook, and remove withremove-webhook(use thewebhook_id). - Manage custom scripts and blocks via
get-scripts,post-hosted-script/post-inline-scripts, and apply them throughadd-custom-code-tositeoradd-custom-code-to-page(usesite_idorpage_id).get-site-custom-codeandget-page-custom-codeshow scripts applied at those scopes.
Localization and locales
- The API exposes two locale identifiers: site-level locale metadata (returned under a Site’s
locales) and CMScmsLocaleId. When endpoints acceptcmsLocaleId(orlocaleId) they refer to the CMS locale UID listed in the Sites response underlocales.primary.cmsLocaleId/locales.secondary[].cmsLocaleId. Those CMS locale IDs are the values to pass when you need content for a specific translation. They are not interchangeable with the pagelocaleIdin unrelated responses—inspect the Site response to map locale IDs.
Non-obvious behaviors and gotchas
- Slug changes break links. Updating an item or product
slugwill change URLs and can break any external links referencing the old slug. If preserving URLs matters, avoid changingslugor create redirects. - Draft vs live content is explicit. The API separates staged/draft operations from live ones.
create-item/update-itemoperate on staged content;create-item-live/update-item-liveand the*-livelist/get endpoints operate on published content. Usepublish-itemto push staged items live when you need a two-step workflow. skipInvalidFilescontrols file validation for item batch operations. For batch create/update of items, the default istrue(invalid file references are skipped). Setting it tofalsewill cause the entire request to fail if any file is invalid—useful when you need all-or-nothing semantics.- Asset uploads often involve presigned fields.
create-assetfrequently returns either anuploadUrloruploadDetails(S3-style fields). The binary upload step may be outside the Data API; return these details to the requester so they can upload the file to the provided URL or using the provided fields. After the binary is uploaded, checkget-assetto confirmhostedUrlandvariantsare present. - Script registration vs application. Registering a script (inline or hosted) and applying it to a site or page are separate operations: create the script first (register), then apply via
add-custom-code-tosite/add-custom-code-to-pageor by placing it into a custom code block. - Many list endpoints return nested objects (products with SKUs, items with
fieldData). When you need an ID that appears inside another resource, call the parent list/get endpoint first and extract the nestedid(for example,list-productsreturns each product and its skus array—use thoseidvalues for SKU updates). - Page/component updates require locale context.
update-static-contentrequires alocaleIdin the query. If the site uses branching, includebranchIdwhen you intend to update a branch instead of the primary branch. - Several operations exist in both site-scoped and workspace-scoped variants (for webhooks, form submissions, and users). Pick the operation whose path parameters match the scope you intend to operate in (site vs workspace).
Error-relevant observations you can act on
- A 200 response for create endpoints often returns the created object with its new IDs—capture these IDs for follow-up operations (publish, update, link references).
- Create operations for assets/products/items commonly return nested metadata required for the next step (upload details, SKU arrays). Don’t assume the creation is complete until you see the ID(s) or hosted URL(s) you need.
Quick operational checklist
- Need a
site_id? Calllist-sites. - Need a
collection_id? Calllist-collectionswithsite_id. - Need an item id? Call
list-collection-items(orlist-collection-items-livefor published items) withcollection_id. - Upload a file? Call
create-assetwithsite_idand pass the returned upload instructions to the uploader; confirm withget-asset. - Create product + SKUs?
create-product(site) →create-skus(site + product_id) →update-sku/update-inventoryas needed. - Manage orders?
list-orders→get-order→fulfill-order/unfulfill-order/refund-order.
Use these patterns to assemble minimal, deterministic sequences: discover the correct parent ID first, inspect the returned schema or nested objects for the child IDs you need, then call the modifying operation that requires those IDs.