diff --git a/.fern/metadata.json b/.fern/metadata.json
index 62c4d643..167c7279 100644
--- a/.fern/metadata.json
+++ b/.fern/metadata.json
@@ -1,5 +1,5 @@
{
- "cliVersion": "4.65.1",
+ "cliVersion": "5.35.2",
"generatorName": "fernapi/fern-typescript-node-sdk",
"generatorVersion": "3.53.13",
"generatorConfig": {
@@ -34,6 +34,6 @@
}
}
},
- "originGitCommit": "998225e70e3e266cc158f022dfdd12904d54da2d",
+ "originGitCommit": "005f29a7da515da7f49554b529cc7ace5b98128c",
"sdkVersion": "3.3.5"
}
diff --git a/.fern/replay.lock b/.fern/replay.lock
new file mode 100644
index 00000000..f3bca3d8
--- /dev/null
+++ b/.fern/replay.lock
@@ -0,0 +1,16 @@
+# DO NOT EDIT MANUALLY - Managed by Fern Replay
+version: "1.0"
+generations:
+ - commit_sha: 0d725d748249dc47a85c817629bc5090b65de8b4
+ tree_hash: dae1fe3a61a2dbcf38eeb2985025ce164758d0e6
+ timestamp: 2026-10-15T18:34:23.400Z
+ cli_version: unknown
+ generator_versions: {}
+ - commit_sha: b2cc3f2a565d60d3e860cf7ef9e5feab208127ac
+ tree_hash: 3e96dc29c83ad338171f0be65c3344eb760ac9de
+ timestamp: 2026-10-15T18:34:24.201Z
+ cli_version: unknown
+ generator_versions:
+ fernapi/fern-typescript-node-sdk: 3.53.13
+current_generation: b2cc3f2a565d60d3e860cf7ef9e5feab208127ac
+patches: []
diff --git a/.fernignore b/.fernignore
index 408c3334..a8a4b552 100644
--- a/.fernignore
+++ b/.fernignore
@@ -13,4 +13,7 @@ tests/wire/workspaces/auditLogs.test.ts
jest.config.mjs
# Security scanning
-.github/workflows/socket_reachability.yml
\ No newline at end of file
+.github/workflows/socket_reachability.yml
+.fern/replay.lock
+.fern/replay.yml
+.gitattributes
diff --git a/.gitattributes b/.gitattributes
new file mode 100644
index 00000000..74928d6a
--- /dev/null
+++ b/.gitattributes
@@ -0,0 +1 @@
+.fern/replay.lock linguist-generated=true
diff --git a/package.json b/package.json
index f80cbf3e..cb8be9d7 100644
--- a/package.json
+++ b/package.json
@@ -23,7 +23,7 @@
"test:wire": "jest --selectProjects wire"
},
"dependencies": {
- "form-data": "^4.0.6",
+ "form-data": "^4.0.4",
"formdata-node": "^6.0.3",
"node-fetch": "^2.7.0",
"readable-stream": "^4.5.2",
@@ -59,8 +59,6 @@
"sideEffects": false,
"resolutions": {
"pbkdf2": "^3.1.3",
- "@types/babel__traverse": "7.20.6",
- "browserslist": "4.28.7",
- "form-data": "4.0.6"
+ "@types/babel__traverse": "7.20.6"
}
}
diff --git a/reference.md b/reference.md
index ade8c4b2..7f5e92dc 100644
--- a/reference.md
+++ b/reference.md
@@ -71,7 +71,9 @@ await client.token.authorizedBy();
Information about the authorization token
-Access to this endpoint requires a bearer token from a [Data Client App](/data/docs/getting-started-data-clients).
+Access to this endpoint requires a bearer token from either a [Data Client App](/data/docs/data-clients/getting-started), a [Workspace token](/data/reference/authentication/workspace-token), or a [Site token](/data/reference/authentication/site-token).
+
+The `application` object is only returned for tokens issued to an OAuth app. For tokens without an OAuth app, such as Site and Workspace API tokens (`grantType: client_credentials`), the response omits `application`.
@@ -110,6 +112,68 @@ await client.token.introspect();
+
+
+
+
+## Workspaces
+client.workspaces.list() -> Webflow.Workspaces
+
+-
+
+#### 📝 Description
+
+
+-
+
+
+-
+
+List the workspaces the token can access, including each workspace's ID. Use this endpoint to find the `workspace_id` that other workspace endpoints require.
+
+The response includes the workspaces granted to the token, plus the workspace that owns each site granted to the token. It returns only active workspaces (not archived, deleted, or draft) and isn't paginated.
+
+This endpoint supports workspace API tokens and Data Client apps.
+
+Required scope | `workspace:read`
+
+
+
+
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```typescript
+await client.workspaces.list();
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**requestOptions:** `WorkspacesClient.RequestOptions`
+
+
+
+
+
+
+
@@ -164,7 +228,7 @@ await client.sites.create("580e63e98c9a982ac9b8b741", {
-
-**workspace_id:** `string` — Unique identifier for a Workspace
+**workspace_id:** `string` — Unique identifier for a Workspace. Find it with [List Workspaces](/data/reference/enterprise/workspace-management/list) (workspace API tokens and Data Client apps), or with `authorization.authorizedTo.workspaceIds` from [Get Authorization Info](/data/reference/token/introspect). With a site token, read `workspaceId` from [Get Site](/data/reference/sites/get).
@@ -533,12 +597,15 @@ await client.sites.getCustomDomain("580e63e98c9a982ac9b8b741");
-
-Publishes a site to one or more more domains.
+Publishes a site or an individual page to one or more domains.
+If multiple individual pages are published to staging, publishing from staging to production publishes all staged changes.
To publish to a specific custom domain, use the domain IDs from the [Get Custom Domains](/data/reference/sites/get-custom-domain) endpoint.
You must include at least one of the `customDomains` or `publishToWebflowSubdomain` properties in the request body.
+To publish an individual page instead of the entire site, provide the ID of the page in the `pageId` parameter.
+
This endpoint has a specific rate limit of one successful publish queue per minute.
Required scope | `sites:write`
@@ -599,6 +666,72 @@ await client.sites.publish("580e63e98c9a982ac9b8b741", {
+
+
+
+
+## Optimize
+client.optimize.list() -> Webflow.OptimizeReferenceListResponse
+
+-
+
+#### 📝 Description
+
+
+-
+
+
+-
+
+Lists the `optimizeId` values the provided access token can access, and the resource each one comes from, such as a Webflow site or a non-Webflow site. Use an `optimizeId` with the other Optimize endpoints.
+
+Results are sorted by `optimizeId` and aren't paginated.
+
+Webflow sites accept OAuth app tokens and Site API tokens. Non-Webflow sites that use Optimize accept only OAuth app tokens, including tokens authorized for a whole workspace.
+
+This endpoint requires a Webflow site with the Optimize add-on, or a non-Webflow site that uses Optimize.
+
+Each access token can have one Optimize request in flight at a time, across all Optimize endpoints. Additional concurrent requests return `429 Too Many Requests`. Wait for your in-flight request to finish, or for the `Retry-After` interval, then retry.
+
+Required scope | `sites:read`
+
+
+
+
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```typescript
+await client.optimize.list();
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**requestOptions:** `OptimizeClient.RequestOptions`
+
+
+
+
+
+
+
@@ -893,6 +1026,85 @@ await client.collections.delete("580e63fc8c9a982ac9b8b745");
+
+
+
+
+client.collections.patch(collection_id, { ...params }) -> Webflow.Collection
+
+-
+
+#### 📝 Description
+
+
+-
+
+
+-
+
+Update a collection's display name, singular name, slug, or field groups.
+
+**Field group rules:**
+- A collection can have a maximum of 50 field groups
+- Each `displayName` must be unique across all field groups in the collection
+- Each `fieldId` must be unique across all field groups in the collection
+- Ecommerce collections do not support field groups
+
+Required scope | `cms:write`
+
+
+
+
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```typescript
+await client.collections.patch("580e63fc8c9a982ac9b8b745");
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**collection_id:** `string` — Unique identifier for a Collection
+
+
+
+
+
+-
+
+**request:** `Webflow.PatchCollectionRequest`
+
+
+
+
+
+-
+
+**requestOptions:** `CollectionsClient.RequestOptions`
+
+
+
+
+
+
+
@@ -1005,7 +1217,8 @@ Required scope | `pages:read`
```typescript
await client.pages.getMetadata("63c720f9347c2139b248e552", {
- localeId: "65427cf400e02b306eaa04a0"
+ localeId: "65427cf400e02b306eaa04a0",
+ translatable: "65427cf400e02b306eaa04a0"
});
```
@@ -1171,7 +1384,8 @@ Required scope | `pages:read`
await client.pages.getContent("63c720f9347c2139b248e552", {
localeId: "65427cf400e02b306eaa04a0",
limit: 1,
- offset: 1
+ offset: 1,
+ translatable: "65427cf400e02b306eaa04a0"
});
```
@@ -1446,7 +1660,8 @@ await client.components.getContent("580e63e98c9a982ac9b8b741", "8505ba55-ef72-62
localeId: "65427cf400e02b306eaa04a0",
branchId: "68026fa68ef6dc744c75b833",
limit: 1,
- offset: 1
+ offset: 1,
+ translatable: "65427cf400e02b306eaa04a0"
});
```
@@ -1659,7 +1874,8 @@ await client.components.getProperties("580e63e98c9a982ac9b8b741", "8505ba55-ef72
localeId: "65427cf400e02b306eaa04a0",
branchId: "68026fa68ef6dc744c75b833",
limit: 1,
- offset: 1
+ offset: 1,
+ translatable: "65427cf400e02b306eaa04a0"
});
```
@@ -1828,6 +2044,8 @@ Get a list of scripts that have been registered to a site. A site can have a max
To apply a script to a site or page, the script must first be registered to a site via the [Register Script](/data/reference/custom-code/custom-code/register-hosted) endpoints. Once registered, the script can be applied to a Site or Page using the appropriate endpoints. See the documentation on [working with Custom Code](/data/docs/custom-code) for more information.
+Access to this endpoint requires a bearer token obtained from an [OAuth Code Grant Flow](/data/reference/oauth-app).
+
Required scope | `custom_code:read`
@@ -1897,6 +2115,8 @@ Register a hosted script to a site.
To apply a script to a site or page, the script must first be registered to a site via the [Register Script](/data/reference/custom-code/custom-code/register-hosted) endpoints. Once registered, the script can be applied to a Site or Page using the appropriate endpoints. See the documentation on [working with Custom Code](/data/docs/custom-code) for more information.
+Access to this endpoint requires a bearer token obtained from an [OAuth Code Grant Flow](/data/reference/oauth-app).
+
Required scope | `custom_code:write`
@@ -1979,6 +2199,8 @@ Register an inline script to a site. Inline scripts are limited to 2000 characte
To apply a script to a site or page, the script must first be registered to a site via the [Register Script](/data/reference/custom-code/custom-code/register-hosted) endpoints. Once registered, the script can be applied to a Site or Page using the appropriate endpoints. See the documentation on [working with Custom Code](/data/docs/custom-code) for more information.
+Access to this endpoint requires a bearer token obtained from an [OAuth Code Grant Flow](/data/reference/oauth-app).
+
Required scope | `custom_code:write`
@@ -2075,7 +2297,8 @@ Required scope | `assets:read`
await client.assets.list("580e63e98c9a982ac9b8b741", {
localeId: "65427cf400e02b306eaa04a0",
offset: 1,
- limit: 1
+ limit: 1,
+ folderId: "folderId"
});
```
@@ -2625,8 +2848,8 @@ await client.assets.getFolder("6390c49774a71f0e3c1a08ee");
-## Webhooks
-client.webhooks.list(site_id) -> Webflow.WebhookList
+## Custom Fonts
+client.customFonts.list(site_id, { ...params }) -> Webflow.CustomFonts
-
@@ -2638,7 +2861,7 @@ await client.assets.getFolder("6390c49774a71f0e3c1a08ee");
-
-List all App-created Webhooks registered for a given site
+List the custom fonts uploaded to a site.
Required scope | `sites:read`
@@ -2655,7 +2878,10 @@ Required scope | `sites:read`
-
```typescript
-await client.webhooks.list("580e63e98c9a982ac9b8b741");
+await client.customFonts.list("580e63e98c9a982ac9b8b741", {
+ offset: 1,
+ limit: 1
+});
```
@@ -2679,7 +2905,15 @@ await client.webhooks.list("580e63e98c9a982ac9b8b741");
-
-**requestOptions:** `WebhooksClient.RequestOptions`
+**request:** `Webflow.CustomFontsListRequest`
+
+
+
+
+
+-
+
+**requestOptions:** `CustomFontsClient.RequestOptions`
@@ -2691,7 +2925,7 @@ await client.webhooks.list("580e63e98c9a982ac9b8b741");
-client.webhooks.create(site_id, { ...params }) -> Webflow.Webhook
+client.customFonts.create(site_id, { ...params }) -> Webflow.CustomFontCreateResponse
-
@@ -2703,11 +2937,14 @@ await client.webhooks.list("580e63e98c9a982ac9b8b741");
-
-Create a new Webhook.
+Register a custom font on a site and get a presigned S3 URL to upload the font binary.
-Limit of 75 registrations per `triggerType`, per site.
+The response includes a `customFont` object and an `upload` object. Use the `upload.url` and `upload.fields`
+to POST the font binary directly to S3 as `multipart/form-data`. The binary must go in a field named `file`
+and must be the last field in the form (an AWS S3 requirement). S3 returns `201 Created` on a successful upload.
+
+To learn more, see [Custom fonts](/data/docs/custom-fonts).
-Access to this endpoint requires a bearer token from a [Data Client App](/data/docs/getting-started-data-clients).
Required scope | `sites:write`
@@ -2723,14 +2960,13 @@ Required scope | `sites:write`
-
```typescript
-await client.webhooks.create("580e63e98c9a982ac9b8b741", {
- id: "582266e0cd48de0f0e3c6d8b",
- triggerType: "form_submission",
- url: "https://webhook.site/7f7f7f7f-7f7f-7f7f-7f7f-7f7f7f7f7f7f",
- workspaceId: "4f4e46fd476ea8c507000001",
- siteId: "562ac0395358780a1f5e6fbd",
- lastTriggered: new Date("2023-02-08T23:59:28.000Z"),
- createdOn: new Date("2022-11-08T23:59:28.000Z")
+await client.customFonts.create("580e63e98c9a982ac9b8b741", {
+ fileName: "AcmeSans-Regular.woff2",
+ fileHash: "3c7d87c9575702bc3b1e991f4d3c638e",
+ fontFamily: "Acme Sans",
+ weight: 400,
+ italic: false,
+ fontDisplay: "auto"
});
```
@@ -2755,7 +2991,7 @@ await client.webhooks.create("580e63e98c9a982ac9b8b741", {
-
-**request:** `Webflow.Webhook`
+**request:** `Webflow.CustomFontsCreateRequest`
@@ -2763,7 +2999,7 @@ await client.webhooks.create("580e63e98c9a982ac9b8b741", {
-
-**requestOptions:** `WebhooksClient.RequestOptions`
+**requestOptions:** `CustomFontsClient.RequestOptions`
@@ -2775,7 +3011,7 @@ await client.webhooks.create("580e63e98c9a982ac9b8b741", {
-client.webhooks.get(webhook_id) -> Webflow.Webhook
+client.customFonts.get(site_id, font_id) -> Webflow.CustomFontsGetResponse
-
@@ -2787,9 +3023,9 @@ await client.webhooks.create("580e63e98c9a982ac9b8b741", {
-
-Get a specific Webhook instance
+Get details about a custom font on a site.
-Required scope: `sites:read`
+Required scope | `sites:read`
@@ -2804,7 +3040,7 @@ Required scope: `sites:read`
-
```typescript
-await client.webhooks.get("580e64008c9a982ac9b8b754");
+await client.customFonts.get("580e63e98c9a982ac9b8b741", "66f3a1b2c4d5e6f7a8b9c0d1");
```
@@ -2820,7 +3056,7 @@ await client.webhooks.get("580e64008c9a982ac9b8b754");
-
-**webhook_id:** `string` — Unique identifier for a Webhook
+**site_id:** `string` — Unique identifier for a Site
@@ -2828,7 +3064,15 @@ await client.webhooks.get("580e64008c9a982ac9b8b754");
-
-**requestOptions:** `WebhooksClient.RequestOptions`
+**font_id:** `string` — Unique identifier for a custom font on a site
+
+
+
+
+
+-
+
+**requestOptions:** `CustomFontsClient.RequestOptions`
@@ -2840,7 +3084,7 @@ await client.webhooks.get("580e64008c9a982ac9b8b754");
-client.webhooks.delete(webhook_id) -> void
+client.customFonts.delete(site_id, font_id) -> void
-
@@ -2852,9 +3096,9 @@ await client.webhooks.get("580e64008c9a982ac9b8b754");
-
-Remove a Webhook
+Delete a custom font from a site.
-Required scope: `sites:read`
+Required scope | `sites:write`
@@ -2869,7 +3113,7 @@ Required scope: `sites:read`
-
```typescript
-await client.webhooks.delete("580e64008c9a982ac9b8b754");
+await client.customFonts.delete("580e63e98c9a982ac9b8b741", "66f3a1b2c4d5e6f7a8b9c0d1");
```
@@ -2885,7 +3129,7 @@ await client.webhooks.delete("580e64008c9a982ac9b8b754");
-
-**webhook_id:** `string` — Unique identifier for a Webhook
+**site_id:** `string` — Unique identifier for a Site
@@ -2893,20 +3137,27 @@ await client.webhooks.delete("580e64008c9a982ac9b8b754");
-
-**requestOptions:** `WebhooksClient.RequestOptions`
+**font_id:** `string` — Unique identifier for a custom font on a site
-
-
+
+
+-
+
+**requestOptions:** `CustomFontsClient.RequestOptions`
+
+
+
+
+
-## Forms
-client.forms.list(site_id, { ...params }) -> Webflow.FormList
+client.customFonts.update(site_id, font_id, { ...params }) -> Webflow.CustomFontsUpdateResponse
-
@@ -2918,9 +3169,12 @@ await client.webhooks.delete("580e64008c9a982ac9b8b754");
-
-List forms for a given site.
+Update the metadata of a custom font. The font binary is not changed by this endpoint.
+To replace the binary, use [Replace custom font file](#operation/replace-custom-font-file).
-Required scope | `forms:read`
+The request body must include at least one of `fontFamily`, `weight`, `italic`, or `fontDisplay`.
+
+Required scope | `sites:write`
@@ -2935,10 +3189,7 @@ Required scope | `forms:read`
-
```typescript
-await client.forms.list("580e63e98c9a982ac9b8b741", {
- limit: 1,
- offset: 1
-});
+await client.customFonts.update("580e63e98c9a982ac9b8b741", "66f3a1b2c4d5e6f7a8b9c0d1");
```
@@ -2962,7 +3213,7 @@ await client.forms.list("580e63e98c9a982ac9b8b741", {
-
-**request:** `Webflow.FormsListRequest`
+**font_id:** `string` — Unique identifier for a custom font on a site
@@ -2970,7 +3221,15 @@ await client.forms.list("580e63e98c9a982ac9b8b741", {
-
-**requestOptions:** `FormsClient.RequestOptions`
+**request:** `Webflow.CustomFontsUpdateRequest`
+
+
+
+
+
+-
+
+**requestOptions:** `CustomFontsClient.RequestOptions`
@@ -2982,7 +3241,7 @@ await client.forms.list("580e63e98c9a982ac9b8b741", {
-client.forms.get(form_id) -> Webflow.Form
+client.customFonts.replaceFile(site_id, font_id, { ...params }) -> Webflow.CustomFontCreateResponse
-
@@ -2994,9 +3253,14 @@ await client.forms.list("580e63e98c9a982ac9b8b741", {
-
-Get information about a given form.
+Replace the binary of an existing custom font while preserving its ID and any references to it.
+The upload handshake is identical to [Create custom font](#operation/create-custom-font).
-Required scope | `forms:read`
+If the existing font has a non-empty `axes` array (a variable font), you must include an `axes` field
+in the request. Send `axes: []` to declare that the new binary is a static font, or send the new variable
+axes to declare it is still variable. Omitting `axes` when the existing font is variable returns `400`.
+
+Required scope | `sites:write`
@@ -3011,7 +3275,10 @@ Required scope | `forms:read`
-
```typescript
-await client.forms.get("580e63e98c9a982ac9b8b741");
+await client.customFonts.replaceFile("580e63e98c9a982ac9b8b741", "66f3a1b2c4d5e6f7a8b9c0d1", {
+ fileName: "AcmeSans-Regular-v2.woff2",
+ fileHash: "3c7d87c9575702bc3b1e991f4d3c638e"
+});
```
@@ -3027,7 +3294,7 @@ await client.forms.get("580e63e98c9a982ac9b8b741");
-
-**form_id:** `string` — Unique identifier for a Form
+**site_id:** `string` — Unique identifier for a Site
@@ -3035,7 +3302,23 @@ await client.forms.get("580e63e98c9a982ac9b8b741");
-
-**requestOptions:** `FormsClient.RequestOptions`
+**font_id:** `string` — Unique identifier for a custom font on a site
+
+
+
+
+
+-
+
+**request:** `Webflow.CustomFontsReplaceFileRequest`
+
+
+
+
+
+-
+
+**requestOptions:** `CustomFontsClient.RequestOptions`
@@ -3047,7 +3330,7 @@ await client.forms.get("580e63e98c9a982ac9b8b741");
-client.forms.listSubmissions(form_id, { ...params }) -> Webflow.FormSubmissionList
+client.customFonts.batchCreate(site_id, { ...params }) -> Webflow.CustomFontBatchCreateResponse
-
@@ -3059,15 +3342,23 @@ await client.forms.get("580e63e98c9a982ac9b8b741");
-
-List form submissions for a given form
+Register 1–25 custom fonts in a single request and get a presigned S3 URL for each one.
+This collapses the registration step for a whole font family (for example, Regular, Bold,
+Italic, and Bold Italic) into one rate-limited request.
-
- When a form is used in a component definition, each instance of the form is considered a unique form.
+Registration is batched, but the binary uploads are not: the response contains one `upload`
+object per registered font, and you must POST each font binary to its own presigned S3 URL
+exactly as you would for [Create custom font](#operation/create-custom-font). The Webflow API
+server never receives the raw font bytes.
- To get a combined list of submissions for a form that appears across multiple component instances, use the [List Form Submissions by Site](/data/reference/forms/form-submissions/list-submissions-by-site) endpoint.
-
+The response is `200 OK` for a valid request body. Per-font results are reported in the
+`created` and `failed` arrays. If the site's font limit is reached partway through the batch,
+the fonts that still fit are registered and returned in `created`, while the rest appear in
+`failed` with `name: "FontLimitReached"` — valid fonts are never discarded because a later
+font in the same batch could not be registered. Each presigned URL expires approximately
+15 minutes after issuance, so upload the binaries promptly.
-Required scope | `forms:read`
+Required scope | `sites:write`
@@ -3082,9 +3373,15 @@ Required scope | `forms:read`
-
```typescript
-await client.forms.listSubmissions("580e63e98c9a982ac9b8b741", {
- offset: 1,
- limit: 1
+await client.customFonts.batchCreate("580e63e98c9a982ac9b8b741", {
+ items: [{
+ fileName: "AcmeSans-Regular.woff2",
+ fileHash: "3c7d87c9575702bc3b1e991f4d3c638e",
+ fontFamily: "Acme Sans",
+ weight: 400,
+ italic: false,
+ fontDisplay: "auto"
+ }]
});
```
@@ -3101,7 +3398,7 @@ await client.forms.listSubmissions("580e63e98c9a982ac9b8b741", {
-
-**form_id:** `string` — Unique identifier for a Form
+**site_id:** `string` — Unique identifier for a Site
@@ -3109,7 +3406,7 @@ await client.forms.listSubmissions("580e63e98c9a982ac9b8b741", {
-
-**request:** `Webflow.FormsListSubmissionsRequest`
+**request:** `Webflow.CustomFontBatchCreateRequest`
@@ -3117,7 +3414,7 @@ await client.forms.listSubmissions("580e63e98c9a982ac9b8b741", {
-
-**requestOptions:** `FormsClient.RequestOptions`
+**requestOptions:** `CustomFontsClient.RequestOptions`
@@ -3129,7 +3426,7 @@ await client.forms.listSubmissions("580e63e98c9a982ac9b8b741", {
-client.forms.getSubmission(form_submission_id) -> Webflow.FormSubmission
+client.customFonts.batchDelete(site_id, { ...params }) -> Webflow.CustomFontBatchDeleteResponse
-
@@ -3141,9 +3438,14 @@ await client.forms.listSubmissions("580e63e98c9a982ac9b8b741", {
-
-Get information about a given form submissio.
+Delete 1-100 custom fonts in a single request. The response is always `200 OK` for a valid request body.
+Per-font results are reported in the `deleted` and `failed` arrays.
-Required scope | `forms:read`
+The endpoint is idempotent: fonts that do not exist appear in `failed` with `name: "NotFound"` rather than
+failing the entire request. You can safely retry a partial failure by re-sending only the IDs that did not
+appear in `deleted`.
+
+Required scope | `sites:write`
@@ -3158,7 +3460,11 @@ Required scope | `forms:read`
-
```typescript
-await client.forms.getSubmission("580e63e98c9a982ac9b8b741");
+await client.customFonts.batchDelete("580e63e98c9a982ac9b8b741", {
+ items: [{
+ id: "66f3a1b2c4d5e6f7a8b9c0d1"
+ }]
+});
```
@@ -3174,7 +3480,7 @@ await client.forms.getSubmission("580e63e98c9a982ac9b8b741");
-
-**form_submission_id:** `string` — Unique identifier for a Form Submission
+**site_id:** `string` — Unique identifier for a Site
@@ -3182,7 +3488,15 @@ await client.forms.getSubmission("580e63e98c9a982ac9b8b741");
-
-**requestOptions:** `FormsClient.RequestOptions`
+**request:** `Webflow.CustomFontBatchDeleteRequest`
+
+
+
+
+
+-
+
+**requestOptions:** `CustomFontsClient.RequestOptions`
@@ -3194,7 +3508,8 @@ await client.forms.getSubmission("580e63e98c9a982ac9b8b741");
-client.forms.deleteSubmission(form_submission_id) -> void
+## Webhooks
+client.webhooks.list(site_id) -> Webflow.WebhookList
-
@@ -3206,10 +3521,9 @@ await client.forms.getSubmission("580e63e98c9a982ac9b8b741");
-
-Delete a form submission
-
+List all App-created Webhooks registered for a given site
-Required scope | `forms:write`
+Required scope | `sites:read`
@@ -3224,7 +3538,7 @@ Required scope | `forms:write`
-
```typescript
-await client.forms.deleteSubmission("580e63e98c9a982ac9b8b741");
+await client.webhooks.list("580e63e98c9a982ac9b8b741");
```
@@ -3240,7 +3554,7 @@ await client.forms.deleteSubmission("580e63e98c9a982ac9b8b741");
-
-**form_submission_id:** `string` — Unique identifier for a Form Submission
+**site_id:** `string` — Unique identifier for a Site
@@ -3248,7 +3562,7 @@ await client.forms.deleteSubmission("580e63e98c9a982ac9b8b741");
-
-**requestOptions:** `FormsClient.RequestOptions`
+**requestOptions:** `WebhooksClient.RequestOptions`
@@ -3260,7 +3574,7 @@ await client.forms.deleteSubmission("580e63e98c9a982ac9b8b741");
-client.forms.updateSubmission(form_submission_id, { ...params }) -> Webflow.FormSubmission
+client.webhooks.create(site_id, { ...params }) -> Webflow.Webhook
-
@@ -3272,9 +3586,12 @@ await client.forms.deleteSubmission("580e63e98c9a982ac9b8b741");
-
-Update hidden fields on a form submission
+Create a new Webhook.
-Required scope | `forms:write`
+Limit of 75 registrations per `triggerType`, per site.
+
+Access to this endpoint requires a bearer token from a [Data Client App](/data/docs/data-clients/getting-started).
+Required scope | `sites:write`
@@ -3289,7 +3606,15 @@ Required scope | `forms:write`
-
```typescript
-await client.forms.updateSubmission("580e63e98c9a982ac9b8b741");
+await client.webhooks.create("580e63e98c9a982ac9b8b741", {
+ id: "582266e0cd48de0f0e3c6d8b",
+ triggerType: "form_submission",
+ url: "https://webhook.site/7f7f7f7f-7f7f-7f7f-7f7f-7f7f7f7f7f7f",
+ workspaceId: "4f4e46fd476ea8c507000001",
+ siteId: "562ac0395358780a1f5e6fbd",
+ lastTriggered: new Date("2023-02-08T23:59:28.000Z"),
+ createdOn: new Date("2022-11-08T23:59:28.000Z")
+});
```
@@ -3305,7 +3630,7 @@ await client.forms.updateSubmission("580e63e98c9a982ac9b8b741");
-
-**form_submission_id:** `string` — Unique identifier for a Form Submission
+**site_id:** `string` — Unique identifier for a Site
@@ -3313,7 +3638,7 @@ await client.forms.updateSubmission("580e63e98c9a982ac9b8b741");
-
-**request:** `Webflow.FormsUpdateSubmissionRequest`
+**request:** `Webflow.Webhook`
@@ -3321,7 +3646,7 @@ await client.forms.updateSubmission("580e63e98c9a982ac9b8b741");
-
-**requestOptions:** `FormsClient.RequestOptions`
+**requestOptions:** `WebhooksClient.RequestOptions`
@@ -3333,8 +3658,7 @@ await client.forms.updateSubmission("580e63e98c9a982ac9b8b741");
-## Products
-client.products.list(site_id, { ...params }) -> Webflow.ProductAndSkUsList
+client.webhooks.get(webhook_id) -> Webflow.Webhook
-
@@ -3346,12 +3670,9 @@ await client.forms.updateSubmission("580e63e98c9a982ac9b8b741");
-
-Retrieve all products for a site.
-
-Use `limit` and `offset` to page through all products with subsequent requests. All SKUs for each product
-will also be fetched and returned. The `limit`, `offset` and `total` values represent Products only and do not include any SKUs.
+Get a specific Webhook instance
-Required scope | `ecommerce:read`
+Required scope: `sites:read`
@@ -3366,10 +3687,7 @@ Required scope | `ecommerce:read`
-
```typescript
-await client.products.list("580e63e98c9a982ac9b8b741", {
- offset: 1,
- limit: 1
-});
+await client.webhooks.get("580e64008c9a982ac9b8b754");
```
@@ -3385,15 +3703,7 @@ await client.products.list("580e63e98c9a982ac9b8b741", {
-
-**site_id:** `string` — Unique identifier for a Site
-
-
-
-
-
--
-
-**request:** `Webflow.ProductsListRequest`
+**webhook_id:** `string` — Unique identifier for a Webhook
@@ -3401,7 +3711,7 @@ await client.products.list("580e63e98c9a982ac9b8b741", {
-
-**requestOptions:** `ProductsClient.RequestOptions`
+**requestOptions:** `WebhooksClient.RequestOptions`
@@ -3413,7 +3723,7 @@ await client.products.list("580e63e98c9a982ac9b8b741", {
-client.products.create(site_id, { ...params }) -> Webflow.ProductAndSkUs
+client.webhooks.delete(webhook_id) -> void
-
@@ -3425,16 +3735,9 @@ await client.products.list("580e63e98c9a982ac9b8b741", {
-
-Create a new ecommerce product and defaultSKU. A product, at minimum, must have a single SKU.
-
-To create a product with multiple SKUs:
- - First, create a list of `sku-properties`, also known as [product options](https://help.webflow.com/hc/en-us/articles/33961334531347-Create-product-options-and-variants). For example, a T-shirt product may have a "color" `sku-property`, with a list of enum values: red, yellow, and blue, another `sku-property` may be "size", with a list of enum values: small, medium, and large.
- - Once, a product is created with a list of `sku-properties`, Webflow will create a **default SKU**, which is always a combination of the first `enum` values of each `sku-property`. (e.g. Small - Red - T-Shirt)
- - After creation, you can create additional SKUs for the product, using the [Create SKUs endpoint.](/data/reference/ecommerce/products/create-sku)
-
-Upon creation, the default product type will be `Advanced`, which ensures all Product and SKU fields will be shown to users in the Designer.
+Remove a Webhook
-Required scope | `ecommerce:write`
+Required scope: `sites:read`
@@ -3449,61 +3752,7 @@ Required scope | `ecommerce:write`
-
```typescript
-await client.products.create("580e63e98c9a982ac9b8b741", {
- publishStatus: "staging",
- product: {
- fieldData: {
- name: "Colorful T-shirt",
- slug: "colorful-t-shirt",
- description: "Our best-selling t-shirt available in multiple colors and sizes",
- skuProperties: [{
- id: "color",
- name: "Color",
- "enum": [{
- id: "red",
- name: "Red",
- slug: "red"
- }, {
- id: "yellow",
- name: "Yellow",
- slug: "yellow"
- }, {
- id: "blue",
- name: "Blue",
- slug: "blue"
- }]
- }, {
- id: "size",
- name: "Size",
- "enum": [{
- id: "small",
- name: "Small",
- slug: "small"
- }, {
- id: "medium",
- name: "Medium",
- slug: "medium"
- }, {
- id: "large",
- name: "Large",
- slug: "large"
- }]
- }]
- }
- },
- sku: {
- fieldData: {
- name: "Colorful T-shirt - Red Small",
- slug: "colorful-t-shirt-red-small",
- price: {
- value: 2499,
- unit: "USD",
- currency: "USD"
- },
- mainImage: "https://rocketamp-sample-store.myshopify.com/cdn/shop/products/Gildan_2000_Antique_Cherry_Red_Front_1024x1024.jpg?v=1527232987"
- }
- }
-});
+await client.webhooks.delete("580e64008c9a982ac9b8b754");
```
@@ -3519,15 +3768,7 @@ await client.products.create("580e63e98c9a982ac9b8b741", {
-
-**site_id:** `string` — Unique identifier for a Site
-
-
-
-
-
--
-
-**request:** `Webflow.ProductSkuCreate`
+**webhook_id:** `string` — Unique identifier for a Webhook
@@ -3535,7 +3776,7 @@ await client.products.create("580e63e98c9a982ac9b8b741", {
-
-**requestOptions:** `ProductsClient.RequestOptions`
+**requestOptions:** `WebhooksClient.RequestOptions`
@@ -3547,7 +3788,8 @@ await client.products.create("580e63e98c9a982ac9b8b741", {
-client.products.get(site_id, product_id) -> Webflow.ProductAndSkUs
+## Forms
+client.forms.list(site_id, { ...params }) -> Webflow.FormList
-
@@ -3559,10 +3801,9 @@ await client.products.create("580e63e98c9a982ac9b8b741", {
-
-Retrieve a single product by its ID. All of its SKUs will also be
-retrieved.
+List forms for a given site.
-Required scope | `ecommerce:read`
+Required scope | `forms:read`
@@ -3577,7 +3818,10 @@ Required scope | `ecommerce:read`
-
```typescript
-await client.products.get("580e63e98c9a982ac9b8b741", "580e63fc8c9a982ac9b8b745");
+await client.forms.list("580e63e98c9a982ac9b8b741", {
+ limit: 1,
+ offset: 1
+});
```
@@ -3601,7 +3845,7 @@ await client.products.get("580e63e98c9a982ac9b8b741", "580e63fc8c9a982ac9b8b745"
-
-**product_id:** `string` — Unique identifier for a Product
+**request:** `Webflow.FormsListRequest`
@@ -3609,7 +3853,7 @@ await client.products.get("580e63e98c9a982ac9b8b741", "580e63fc8c9a982ac9b8b745"
-
-**requestOptions:** `ProductsClient.RequestOptions`
+**requestOptions:** `FormsClient.RequestOptions`
@@ -3621,7 +3865,7 @@ await client.products.get("580e63e98c9a982ac9b8b741", "580e63fc8c9a982ac9b8b745"
-client.products.update(site_id, product_id, { ...params }) -> Webflow.Product
+client.forms.get(form_id) -> Webflow.Form
-
@@ -3633,11 +3877,4881 @@ await client.products.get("580e63e98c9a982ac9b8b741", "580e63fc8c9a982ac9b8b745"
-
-Update an existing Product.
-
-Updating an existing Product will set the product type to `Advanced`, which ensures all Product and SKU fields will be shown to users in the Designer.
+Get information about a given form.
-Required scope | `ecommerce:write`
+Required scope | `forms:read`
+
+
+
+
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```typescript
+await client.forms.get("580e63e98c9a982ac9b8b741");
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**form_id:** `string` — Unique identifier for a Form
+
+
+
+
+
+-
+
+**requestOptions:** `FormsClient.RequestOptions`
+
+
+
+
+
+
+
+
+
+
+
+client.forms.listSubmissions(form_id, { ...params }) -> Webflow.FormSubmissionList
+
+-
+
+#### 📝 Description
+
+
+-
+
+
+-
+
+List form submissions for a given form
+
+
+ When a form is used in a component definition, each instance of the form is considered a unique form.
+
+ To get a combined list of submissions for a form that appears across multiple component instances, use the [List Form Submissions by Site](/data/reference/forms/form-submissions/list-submissions-by-site) endpoint.
+
+
+Required scope | `forms:read`
+
+
+
+
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```typescript
+await client.forms.listSubmissions("580e63e98c9a982ac9b8b741", {
+ offset: 1,
+ limit: 1
+});
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**form_id:** `string` — Unique identifier for a Form
+
+
+
+
+
+-
+
+**request:** `Webflow.FormsListSubmissionsRequest`
+
+
+
+
+
+-
+
+**requestOptions:** `FormsClient.RequestOptions`
+
+
+
+
+
+
+
+
+
+
+
+client.forms.getSubmission(form_submission_id) -> Webflow.FormSubmission
+
+-
+
+#### 📝 Description
+
+
+-
+
+
+-
+
+Get information about a given form submissio.
+
+Required scope | `forms:read`
+
+
+
+
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```typescript
+await client.forms.getSubmission("580e63e98c9a982ac9b8b741");
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**form_submission_id:** `string` — Unique identifier for a Form Submission
+
+
+
+
+
+-
+
+**requestOptions:** `FormsClient.RequestOptions`
+
+
+
+
+
+
+
+
+
+
+
+client.forms.deleteSubmission(form_submission_id) -> void
+
+-
+
+#### 📝 Description
+
+
+-
+
+
+-
+
+Delete a form submission
+
+
+Required scope | `forms:write`
+
+
+
+
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```typescript
+await client.forms.deleteSubmission("580e63e98c9a982ac9b8b741");
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**form_submission_id:** `string` — Unique identifier for a Form Submission
+
+
+
+
+
+-
+
+**requestOptions:** `FormsClient.RequestOptions`
+
+
+
+
+
+
+
+
+
+
+
+client.forms.updateSubmission(form_submission_id, { ...params }) -> Webflow.FormSubmission
+
+-
+
+#### 📝 Description
+
+
+-
+
+
+-
+
+Update hidden fields on a form submission
+
+Required scope | `forms:write`
+
+
+
+
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```typescript
+await client.forms.updateSubmission("580e63e98c9a982ac9b8b741");
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**form_submission_id:** `string` — Unique identifier for a Form Submission
+
+
+
+
+
+-
+
+**request:** `Webflow.FormsUpdateSubmissionRequest`
+
+
+
+
+
+-
+
+**requestOptions:** `FormsClient.RequestOptions`
+
+
+
+
+
+
+
+
+
+
+
+## Products
+client.products.list(site_id, { ...params }) -> Webflow.ProductAndSkUsList
+
+-
+
+#### 📝 Description
+
+
+-
+
+
+-
+
+Retrieve all products for a site.
+
+Use `limit` and `offset` to page through all products with subsequent requests. All SKUs for each product
+will also be fetched and returned. The `limit`, `offset` and `total` values represent Products only and do not include any SKUs.
+
+Required scope | `ecommerce:read`
+
+
+
+
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```typescript
+await client.products.list("580e63e98c9a982ac9b8b741", {
+ offset: 1,
+ limit: 1
+});
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**site_id:** `string` — Unique identifier for a Site
+
+
+
+
+
+-
+
+**request:** `Webflow.ProductsListRequest`
+
+
+
+
+
+-
+
+**requestOptions:** `ProductsClient.RequestOptions`
+
+
+
+
+
+
+
+
+
+
+
+client.products.create(site_id, { ...params }) -> Webflow.ProductAndSkUs
+
+-
+
+#### 📝 Description
+
+
+-
+
+
+-
+
+Create a new ecommerce product and defaultSKU. A product, at minimum, must have a single SKU.
+
+To create a product with multiple SKUs:
+ - First, create a list of `sku-properties`, also known as [product options](https://help.webflow.com/hc/en-us/articles/33961334531347-Create-product-options-and-variants). For example, a T-shirt product may have a "color" `sku-property`, with a list of enum values: red, yellow, and blue, another `sku-property` may be "size", with a list of enum values: small, medium, and large.
+ - Once, a product is created with a list of `sku-properties`, Webflow will create a **default SKU**, which is always a combination of the first `enum` values of each `sku-property`. (e.g. Small - Red - T-Shirt)
+ - After creation, you can create additional SKUs for the product, using the [Create SKUs endpoint.](/data/reference/ecommerce/products/create-sku)
+
+Upon creation, the default product type will be `Advanced`, which ensures all Product and SKU fields will be shown to users in the Designer.
+
+Required scope | `ecommerce:write`
+
+
+
+
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```typescript
+await client.products.create("580e63e98c9a982ac9b8b741", {
+ publishStatus: "staging",
+ product: {
+ fieldData: {
+ name: "Colorful T-shirt",
+ slug: "colorful-t-shirt",
+ description: "Our best-selling t-shirt available in multiple colors and sizes",
+ skuProperties: [{
+ id: "color",
+ name: "Color",
+ "enum": [{
+ id: "red",
+ name: "Red",
+ slug: "red"
+ }, {
+ id: "yellow",
+ name: "Yellow",
+ slug: "yellow"
+ }, {
+ id: "blue",
+ name: "Blue",
+ slug: "blue"
+ }]
+ }, {
+ id: "size",
+ name: "Size",
+ "enum": [{
+ id: "small",
+ name: "Small",
+ slug: "small"
+ }, {
+ id: "medium",
+ name: "Medium",
+ slug: "medium"
+ }, {
+ id: "large",
+ name: "Large",
+ slug: "large"
+ }]
+ }]
+ }
+ },
+ sku: {
+ fieldData: {
+ name: "Colorful T-shirt - Red Small",
+ slug: "colorful-t-shirt-red-small",
+ price: {
+ value: 2499,
+ unit: "USD",
+ currency: "USD"
+ },
+ mainImage: "https://rocketamp-sample-store.myshopify.com/cdn/shop/products/Gildan_2000_Antique_Cherry_Red_Front_1024x1024.jpg?v=1527232987"
+ }
+ }
+});
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**site_id:** `string` — Unique identifier for a Site
+
+
+
+
+
+-
+
+**request:** `Webflow.ProductSkuCreate`
+
+
+
+
+
+-
+
+**requestOptions:** `ProductsClient.RequestOptions`
+
+
+
+
+
+
+
+
+
+
+
+client.products.get(site_id, product_id) -> Webflow.ProductAndSkUs
+
+-
+
+#### 📝 Description
+
+
+-
+
+
+-
+
+Retrieve a single product by its ID. All of its SKUs will also be
+retrieved.
+
+Required scope | `ecommerce:read`
+
+
+
+
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```typescript
+await client.products.get("580e63e98c9a982ac9b8b741", "580e63fc8c9a982ac9b8b745");
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**site_id:** `string` — Unique identifier for a Site
+
+
+
+
+
+-
+
+**product_id:** `string` — Unique identifier for a Product
+
+
+
+
+
+-
+
+**requestOptions:** `ProductsClient.RequestOptions`
+
+
+
+
+
+
+
+
+
+
+
+client.products.update(site_id, product_id, { ...params }) -> Webflow.Product
+
+-
+
+#### 📝 Description
+
+
+-
+
+
+-
+
+Update an existing Product.
+
+Updating an existing Product will set the product type to `Advanced`, which ensures all Product and SKU fields will be shown to users in the Designer.
+
+Required scope | `ecommerce:write`
+
+
+
+
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```typescript
+await client.products.update("580e63e98c9a982ac9b8b741", "580e63fc8c9a982ac9b8b745");
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**site_id:** `string` — Unique identifier for a Site
+
+
+
+
+
+-
+
+**product_id:** `string` — Unique identifier for a Product
+
+
+
+
+
+-
+
+**request:** `Webflow.ProductSkuUpdate`
+
+
+
+
+
+-
+
+**requestOptions:** `ProductsClient.RequestOptions`
+
+
+
+
+
+
+
+
+
+
+
+client.products.createSku(site_id, product_id, { ...params }) -> Webflow.ProductsCreateSkuResponse
+
+-
+
+#### 📝 Description
+
+
+-
+
+
+-
+
+Create additional SKUs to manage every [option and variant of your Product.](https://help.webflow.com/hc/en-us/articles/33961334531347-Create-product-options-and-variants)
+
+Creating SKUs through the API will set the product type to `Advanced`, which ensures all Product and SKU fields will be shown to users in the Designer.
+
+Required scope | `ecommerce:write`
+
+
+
+
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```typescript
+await client.products.createSku("580e63e98c9a982ac9b8b741", "580e63fc8c9a982ac9b8b745", {
+ skus: [{
+ id: "66072fb71b89448912e2681c",
+ cmsLocaleId: "653ad57de882f528b32e810e",
+ lastPublished: new Date("2023-03-17T18:47:35.000Z"),
+ lastUpdated: new Date("2023-03-17T18:47:35.000Z"),
+ createdOn: new Date("2023-03-17T18:47:35.000Z"),
+ fieldData: {
+ name: "Colorful T-shirt - Default",
+ slug: "colorful-t-shirt-default",
+ price: {
+ value: 2499,
+ unit: "USD",
+ currency: "USD"
+ }
+ }
+ }]
+});
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**site_id:** `string` — Unique identifier for a Site
+
+
+
+
+
+-
+
+**product_id:** `string` — Unique identifier for a Product
+
+
+
+
+
+-
+
+**request:** `Webflow.ProductsCreateSkuRequest`
+
+
+
+
+
+-
+
+**requestOptions:** `ProductsClient.RequestOptions`
+
+
+
+
+
+
+
+
+
+
+
+client.products.updateSku(site_id, product_id, sku_id, { ...params }) -> Webflow.Sku
+
+-
+
+#### 📝 Description
+
+
+-
+
+
+-
+
+Update a specified SKU.
+
+Updating an existing SKU will set the Product type to `Advanced`, which ensures all Product and SKU fields will be shown to users in the Designer.
+
+Required scope | `ecommerce:write`
+
+
+
+
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```typescript
+await client.products.updateSku("580e63e98c9a982ac9b8b741", "580e63fc8c9a982ac9b8b745", "5e8518516e147040726cc415", {
+ sku: {
+ id: "66072fb71b89448912e2681c",
+ cmsLocaleId: "653ad57de882f528b32e810e",
+ lastPublished: new Date("2023-03-17T18:47:35.000Z"),
+ lastUpdated: new Date("2023-03-17T18:47:35.000Z"),
+ createdOn: new Date("2023-03-17T18:47:35.000Z"),
+ fieldData: {
+ name: "Colorful T-shirt - Default",
+ slug: "colorful-t-shirt-default",
+ price: {
+ value: 2499,
+ unit: "USD",
+ currency: "USD"
+ }
+ }
+ }
+});
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**site_id:** `string` — Unique identifier for a Site
+
+
+
+
+
+-
+
+**product_id:** `string` — Unique identifier for a Product
+
+
+
+
+
+-
+
+**sku_id:** `string` — Unique identifier for a SKU
+
+
+
+
+
+-
+
+**request:** `Webflow.ProductsUpdateSkuRequest`
+
+
+
+
+
+-
+
+**requestOptions:** `ProductsClient.RequestOptions`
+
+
+
+
+
+
+
+
+
+
+
+## Orders
+client.orders.list(site_id, { ...params }) -> Webflow.OrderList
+
+-
+
+#### 📝 Description
+
+
+-
+
+
+-
+
+List all orders created for a given site.
+
+Required scope | `ecommerce:read`
+
+
+
+
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```typescript
+await client.orders.list("580e63e98c9a982ac9b8b741", {
+ status: "pending",
+ offset: 1,
+ limit: 1
+});
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**site_id:** `string` — Unique identifier for a Site
+
+
+
+
+
+-
+
+**request:** `Webflow.OrdersListRequest`
+
+
+
+
+
+-
+
+**requestOptions:** `OrdersClient.RequestOptions`
+
+
+
+
+
+
+
+
+
+
+
+client.orders.get(site_id, order_id) -> Webflow.Order
+
+-
+
+#### 📝 Description
+
+
+-
+
+
+-
+
+Retrieve a single product by its ID. All of its SKUs will also be
+retrieved.
+
+Required scope | `ecommerce:read`
+
+
+
+
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```typescript
+await client.orders.get("580e63e98c9a982ac9b8b741", "5e8518516e147040726cc415");
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**site_id:** `string` — Unique identifier for a Site
+
+
+
+
+
+-
+
+**order_id:** `string` — Unique identifier for an Order
+
+
+
+
+
+-
+
+**requestOptions:** `OrdersClient.RequestOptions`
+
+
+
+
+
+
+
+
+
+
+
+client.orders.update(site_id, order_id, { ...params }) -> Webflow.Order
+
+-
+
+#### 📝 Description
+
+
+-
+
+
+-
+
+This API lets you update the fields, `comment`, `shippingProvider`,
+and/or `shippingTracking` for a given order. All three fields can be
+updated simultaneously or independently.
+
+Required scope | `ecommerce:write`
+
+
+
+
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```typescript
+await client.orders.update("580e63e98c9a982ac9b8b741", "5e8518516e147040726cc415");
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**site_id:** `string` — Unique identifier for a Site
+
+
+
+
+
+-
+
+**order_id:** `string` — Unique identifier for an Order
+
+
+
+
+
+-
+
+**request:** `Webflow.OrdersUpdateRequest`
+
+
+
+
+
+-
+
+**requestOptions:** `OrdersClient.RequestOptions`
+
+
+
+
+
+
+
+
+
+
+
+client.orders.updateFulfill(site_id, order_id, { ...params }) -> Webflow.Order
+
+-
+
+#### 📝 Description
+
+
+-
+
+
+-
+
+Updates an order's status to fulfilled
+
+Required scope | `ecommerce:write`
+
+
+
+
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```typescript
+await client.orders.updateFulfill("580e63e98c9a982ac9b8b741", "5e8518516e147040726cc415");
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**site_id:** `string` — Unique identifier for a Site
+
+
+
+
+
+-
+
+**order_id:** `string` — Unique identifier for an Order
+
+
+
+
+
+-
+
+**request:** `Webflow.OrdersUpdateFulfillRequest`
+
+
+
+
+
+-
+
+**requestOptions:** `OrdersClient.RequestOptions`
+
+
+
+
+
+
+
+
+
+
+
+client.orders.updateUnfulfill(site_id, order_id) -> Webflow.Order
+
+-
+
+#### 📝 Description
+
+
+-
+
+
+-
+
+Updates an order's status to unfulfilled
+
+Required scope | `ecommerce:write`
+
+
+
+
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```typescript
+await client.orders.updateUnfulfill("580e63e98c9a982ac9b8b741", "5e8518516e147040726cc415");
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**site_id:** `string` — Unique identifier for a Site
+
+
+
+
+
+-
+
+**order_id:** `string` — Unique identifier for an Order
+
+
+
+
+
+-
+
+**requestOptions:** `OrdersClient.RequestOptions`
+
+
+
+
+
+
+
+
+
+
+
+client.orders.refund(site_id, order_id, { ...params }) -> Webflow.Order
+
+-
+
+#### 📝 Description
+
+
+-
+
+
+-
+
+This API will reverse a Stripe charge and refund an order back to a
+customer. It will also set the order's status to `refunded`.
+
+Required scope | `ecommerce:write`
+
+
+
+
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```typescript
+await client.orders.refund("580e63e98c9a982ac9b8b741", "5e8518516e147040726cc415");
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**site_id:** `string` — Unique identifier for a Site
+
+
+
+
+
+-
+
+**order_id:** `string` — Unique identifier for an Order
+
+
+
+
+
+-
+
+**request:** `Webflow.OrdersRefundRequest`
+
+
+
+
+
+-
+
+**requestOptions:** `OrdersClient.RequestOptions`
+
+
+
+
+
+
+
+
+
+
+
+## Inventory
+client.inventory.list(sku_collection_id, sku_id) -> Webflow.InventoryItem
+
+-
+
+#### 📝 Description
+
+
+-
+
+
+-
+
+List the current inventory levels for a particular SKU item.
+
+Required scope | `ecommerce:read`
+
+
+
+
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```typescript
+await client.inventory.list("6377a7c4b7a79608c34a46f7", "5e8518516e147040726cc415");
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**sku_collection_id:** `string` — Unique identifier for a SKU collection. Use the List Collections API to find this ID.
+
+
+
+
+
+-
+
+**sku_id:** `string` — Unique identifier for a SKU
+
+
+
+
+
+-
+
+**requestOptions:** `InventoryClient.RequestOptions`
+
+
+
+
+
+
+
+
+
+
+
+client.inventory.update(sku_collection_id, sku_id, { ...params }) -> Webflow.InventoryItem
+
+-
+
+#### 📝 Description
+
+
+-
+
+
+-
+
+Updates the current inventory levels for a particular SKU item.
+
+Updates may be given in one or two methods, absolutely or incrementally.
+- Absolute updates are done by setting `quantity` directly.
+- Incremental updates are by specifying the inventory delta in `updateQuantity` which is then added to the `quantity` stored on the server.
+
+Required scope | `ecommerce:write`
+
+
+
+
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```typescript
+await client.inventory.update("6377a7c4b7a79608c34a46f7", "5e8518516e147040726cc415", {
+ inventoryType: "infinite"
+});
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**sku_collection_id:** `string` — Unique identifier for a SKU collection. Use the List Collections API to find this ID.
+
+
+
+
+
+-
+
+**sku_id:** `string` — Unique identifier for a SKU
+
+
+
+
+
+-
+
+**request:** `Webflow.InventoryUpdateRequest`
+
+
+
+
+
+-
+
+**requestOptions:** `InventoryClient.RequestOptions`
+
+
+
+
+
+
+
+
+
+
+
+## Ecommerce
+client.ecommerce.getSettings(site_id) -> Webflow.EcommerceSettings
+
+-
+
+#### 📝 Description
+
+
+-
+
+
+-
+
+Retrieve ecommerce settings for a site.
+
+Required scope | `ecommerce:read`
+
+
+
+
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```typescript
+await client.ecommerce.getSettings("580e63e98c9a982ac9b8b741");
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**site_id:** `string` — Unique identifier for a Site
+
+
+
+
+
+-
+
+**requestOptions:** `EcommerceClient.RequestOptions`
+
+
+
+
+
+
+
+
+
+
+
+## Analyze Reports
+client.analyze.reports.traffic(site_id, { ...params }) -> Webflow.TrafficResponse
+
+-
+
+#### 📝 Description
+
+
+-
+
+
+-
+
+Returns a daily time series of a single metric — sessions, users, or page views — over a time window.
+
+Filter the report with top-level query parameters (`country`, `deviceType`, `pagePath`, etc.) or via the `filter` parameter for multi-value and negation matching.
+
+This endpoint requires a workspace with the Analyze add-on.
+
+Each access token can have one Analyze request in flight at a time, across all Analyze endpoints. Additional concurrent requests return `429 Too Many Requests`. Wait for your in-flight request to finish, or for the `Retry-After` interval, then retry.
+
+Required scope | `sites:read`
+
+
+
+
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```typescript
+await client.analyze.reports.traffic("580e63e98c9a982ac9b8b741", {
+ startTime: new Date("2026-04-01T00:00:00.000Z"),
+ endTime: new Date("2026-04-08T00:00:00.000Z"),
+ metricScope: "session",
+ bucketTimeZone: "America/New_York",
+ deviceType: "desktop",
+ country: "US",
+ pagePath: "/towels",
+ trafficSource: "SO",
+ referrer: "google.com",
+ browser: "Chrome",
+ utmCampaign: "dont-panic-2026",
+ utmMedium: "email",
+ utmSource: "hitchhikers-guide"
+});
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**site_id:** `string` — Unique identifier for a Site
+
+
+
+
+
+-
+
+**request:** `Webflow.analyze.ReportsTrafficRequest`
+
+
+
+
+
+-
+
+**requestOptions:** `ReportsClient.RequestOptions`
+
+
+
+
+
+
+
+
+
+
+
+client.analyze.reports.topPages(site_id, { ...params }) -> Webflow.TopPagesResponse
+
+-
+
+#### 📝 Description
+
+
+-
+
+
+-
+
+Returns the most-visited pages over a time window, ranked by `sortBy` (sessions, users, or page views).
+
+Each row carries all three scope counts; `sortBy` only governs ordering. Filter the report with top-level query parameters (`country`, `deviceType`, `pagePath`, etc.) or via the `filter` parameter for multi-value and negation matching.
+
+Set `timeseries[bucketTimeZone]` to attach a daily page view `timeseries` to each row. Bucket counts are always page views regardless of `sortBy`. Row-level counts honor the requested sort, but the timeseries does not.
+
+This endpoint requires a workspace with the Analyze add-on.
+
+Each access token can have one Analyze request in flight at a time, across all Analyze endpoints. Additional concurrent requests return `429 Too Many Requests`. Wait for your in-flight request to finish, or for the `Retry-After` interval, then retry.
+
+Required scope | `sites:read`
+
+
+
+
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```typescript
+await client.analyze.reports.topPages("580e63e98c9a982ac9b8b741", {
+ startTime: new Date("2026-04-01T00:00:00.000Z"),
+ endTime: new Date("2026-04-08T00:00:00.000Z"),
+ sortBy: "session",
+ limit: 1,
+ deviceType: "desktop",
+ country: "US",
+ pagePath: "/towels",
+ trafficSource: "SO",
+ referrer: "google.com",
+ browser: "Chrome",
+ utmCampaign: "dont-panic-2026",
+ utmMedium: "email",
+ utmSource: "hitchhikers-guide"
+});
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**site_id:** `string` — Unique identifier for a Site
+
+
+
+
+
+-
+
+**request:** `Webflow.analyze.ReportsTopPagesRequest`
+
+
+
+
+
+-
+
+**requestOptions:** `ReportsClient.RequestOptions`
+
+
+
+
+
+
+
+
+
+
+
+client.analyze.reports.topDimensions(site_id, { ...params }) -> Webflow.TopDimensionsResponse
+
+-
+
+#### 📝 Description
+
+
+-
+
+
+-
+
+Returns the top values within a chosen `dimension` — top countries, top traffic sources, top campaigns, top audiences, and so on — over a time window, ranked by sessions or users.
+
+Filter the report with top-level query parameters (`country`, `deviceType`, `pagePath`, etc.) or via the `filter` parameter for multi-value and negation matching.
+
+This endpoint requires a workspace with the Analyze add-on.
+
+Each access token can have one Analyze request in flight at a time, across all Analyze endpoints. Additional concurrent requests return `429 Too Many Requests`. Wait for your in-flight request to finish, or for the `Retry-After` interval, then retry.
+
+Required scope | `sites:read`
+
+
+
+
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```typescript
+await client.analyze.reports.topDimensions("580e63e98c9a982ac9b8b741", {
+ startTime: new Date("2026-04-01T00:00:00.000Z"),
+ endTime: new Date("2026-04-08T00:00:00.000Z"),
+ dimension: "country",
+ metricScope: "session",
+ limit: 1,
+ deviceType: "desktop",
+ country: "US",
+ pagePath: "/towels",
+ trafficSource: "SO",
+ referrer: "google.com",
+ browser: "Chrome",
+ utmCampaign: "dont-panic-2026",
+ utmMedium: "email",
+ utmSource: "hitchhikers-guide"
+});
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**site_id:** `string` — Unique identifier for a Site
+
+
+
+
+
+-
+
+**request:** `Webflow.analyze.ReportsTopDimensionsRequest`
+
+
+
+
+
+-
+
+**requestOptions:** `ReportsClient.RequestOptions`
+
+
+
+
+
+
+
+
+
+
+
+client.analyze.reports.topEvents(site_id, { ...params }) -> Webflow.TopEventsResponse
+
+-
+
+#### 📝 Description
+
+
+-
+
+
+-
+
+Returns the top events over a time window, ranked by how often they occurred.
+
+Events are counted individually, not rolled up into sessions, users, or page views — so this report has no `metricScope`. Each row's `count` is how many times the event occurred. Filter the report with top-level query parameters (`country`, `deviceType`, `pagePath`, etc.) or via the `filter` parameter for multi-value and negation matching.
+
+Set `timeseries[bucketTimeZone]` to attach a daily event count `timeseries` to each row.
+
+This endpoint requires a workspace with the Analyze add-on.
+
+Each access token can have one Analyze request in flight at a time, across all Analyze endpoints. Additional concurrent requests return `429 Too Many Requests`. Wait for your in-flight request to finish, or for the `Retry-After` interval, then retry.
+
+Required scope | `sites:read`
+
+
+
+
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```typescript
+await client.analyze.reports.topEvents("580e63e98c9a982ac9b8b741", {
+ startTime: new Date("2026-04-01T00:00:00.000Z"),
+ endTime: new Date("2026-04-08T00:00:00.000Z"),
+ limit: 1,
+ deviceType: "desktop",
+ country: "US",
+ pagePath: "/towels",
+ trafficSource: "SO",
+ browser: "Chrome",
+ utmCampaign: "dont-panic-2026",
+ utmMedium: "email",
+ utmSource: "hitchhikers-guide"
+});
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**site_id:** `string` — Unique identifier for a Site
+
+
+
+
+
+-
+
+**request:** `Webflow.analyze.ReportsTopEventsRequest`
+
+
+
+
+
+-
+
+**requestOptions:** `ReportsClient.RequestOptions`
+
+
+
+
+
+
+
+
+
+
+
+client.analyze.reports.timeOnPage(site_id, { ...params }) -> Webflow.TimeOnPageResponse
+
+-
+
+#### 📝 Description
+
+
+-
+
+
+-
+
+Returns the average time on page over a time window — as a single aggregate value, or bucketed by day or week when `timeseries` is supplied.
+
+Choose how the average is computed with `metricScope` (per session, user, or page view). Filter the report with top-level query parameters (`country`, `deviceType`, `pagePath`, etc.) or via the `filter` parameter for multi-value and negation matching.
+
+This endpoint requires a workspace with the Analyze add-on.
+
+Each access token can have one Analyze request in flight at a time, across all Analyze endpoints. Additional concurrent requests return `429 Too Many Requests`. Wait for your in-flight request to finish, or for the `Retry-After` interval, then retry.
+
+Required scope | `sites:read`
+
+
+
+
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```typescript
+await client.analyze.reports.timeOnPage("580e63e98c9a982ac9b8b741", {
+ startTime: new Date("2026-04-01T00:00:00.000Z"),
+ endTime: new Date("2026-04-08T00:00:00.000Z"),
+ metricScope: "session",
+ deviceType: "desktop",
+ country: "US",
+ pagePath: "/towels",
+ trafficSource: "SO",
+ referrer: "google.com",
+ browser: "Chrome",
+ utmCampaign: "dont-panic-2026",
+ utmMedium: "email",
+ utmSource: "hitchhikers-guide"
+});
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**site_id:** `string` — Unique identifier for a Site
+
+
+
+
+
+-
+
+**request:** `Webflow.analyze.ReportsTimeOnPageRequest`
+
+
+
+
+
+-
+
+**requestOptions:** `ReportsClient.RequestOptions`
+
+
+
+
+
+
+
+
+
+
+
+client.analyze.reports.scrollDepth(site_id, { ...params }) -> Webflow.ScrollDepthResponse
+
+-
+
+#### 📝 Description
+
+
+-
+
+
+-
+
+Returns the scroll-depth distribution for the site over a time window. Each row reports the scroll depth (in pixels) that a share of page views reached, at fixed breakpoints of 75%, 50%, and 25% of page views.
+
+Filter the report with top-level query parameters (`country`, `deviceType`, `pagePath`, etc.) or via the `filter` parameter for multi-value and negation matching. Omit `deviceType` to include all devices.
+
+This endpoint requires a workspace with the Analyze add-on.
+
+Each access token can have one Analyze request in flight at a time, across all Analyze endpoints. Additional concurrent requests return `429 Too Many Requests`. Wait for your in-flight request to finish, or for the `Retry-After` interval, then retry.
+
+Required scope | `sites:read`
+
+
+
+
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```typescript
+await client.analyze.reports.scrollDepth("580e63e98c9a982ac9b8b741", {
+ startTime: new Date("2026-04-01T00:00:00.000Z"),
+ endTime: new Date("2026-04-08T00:00:00.000Z"),
+ deviceType: "desktop",
+ country: "US",
+ pagePath: "/towels",
+ trafficSource: "SO",
+ referrer: "google.com",
+ browser: "Chrome",
+ utmCampaign: "dont-panic-2026",
+ utmMedium: "email",
+ utmSource: "hitchhikers-guide"
+});
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**site_id:** `string` — Unique identifier for a Site
+
+
+
+
+
+-
+
+**request:** `Webflow.analyze.ReportsScrollDepthRequest`
+
+
+
+
+
+-
+
+**requestOptions:** `ReportsClient.RequestOptions`
+
+
+
+
+
+
+
+
+
+
+
+client.analyze.reports.browserWindowHeight(site_id, { ...params }) -> Webflow.BrowserWindowHeightResponse
+
+-
+
+#### 📝 Description
+
+
+-
+
+
+-
+
+Returns the average browser window height (in CSS pixels) for the site over a time window. The response wraps the single aggregate in a one-element `data` array for SDK uniformity with other Analyze reports.
+
+Filter the report with top-level query parameters (`country`, `deviceType`, `pagePath`, etc.) or via the `filter` parameter for multi-value and negation matching. Omit `deviceType` to include all devices.
+
+This endpoint requires a workspace with the Analyze add-on.
+
+Each access token can have one Analyze request in flight at a time, across all Analyze endpoints. Additional concurrent requests return `429 Too Many Requests`. Wait for your in-flight request to finish, or for the `Retry-After` interval, then retry.
+
+Required scope | `sites:read`
+
+
+
+
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```typescript
+await client.analyze.reports.browserWindowHeight("580e63e98c9a982ac9b8b741", {
+ startTime: new Date("2026-04-01T00:00:00.000Z"),
+ endTime: new Date("2026-04-08T00:00:00.000Z"),
+ deviceType: "desktop",
+ country: "US",
+ pagePath: "/towels",
+ trafficSource: "SO",
+ referrer: "google.com",
+ browser: "Chrome",
+ utmCampaign: "dont-panic-2026",
+ utmMedium: "email",
+ utmSource: "hitchhikers-guide"
+});
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**site_id:** `string` — Unique identifier for a Site
+
+
+
+
+
+-
+
+**request:** `Webflow.analyze.ReportsBrowserWindowHeightRequest`
+
+
+
+
+
+-
+
+**requestOptions:** `ReportsClient.RequestOptions`
+
+
+
+
+
+
+
+
+
+
+
+client.analyze.reports.pageFlow(site_id, { ...params }) -> Webflow.PageFlowResponse
+
+-
+
+#### 📝 Description
+
+
+-
+
+
+-
+
+Returns the pages visitors viewed immediately before or after a required anchor page over a time window, ranked by sessions, users, or page views.
+
+For a CMS template instance, provide both `collectionId` and `itemSlug` with `pageId`. Filter the report with top-level query parameters (`country`, `deviceType`, `pagePath`, etc.) or via the `filter` parameter for multi-value and negation matching.
+
+This endpoint requires a workspace with the Analyze add-on.
+
+Each access token can have one Analyze request in flight at a time, across all Analyze endpoints. Additional concurrent requests return `429 Too Many Requests`. Wait for your in-flight request to finish, or for the `Retry-After` interval, then retry.
+
+Required scope | `sites:read`
+
+
+
+
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```typescript
+await client.analyze.reports.pageFlow("580e63e98c9a982ac9b8b741", {
+ startTime: new Date("2026-04-01T00:00:00.000Z"),
+ endTime: new Date("2026-04-08T00:00:00.000Z"),
+ direction: "previous",
+ metricScope: "session",
+ pageId: "65f1b2c4a8d3e5f7a9c1b2d3",
+ collectionId: "66abc1234567890abcdef012",
+ itemSlug: "anchor-post",
+ limit: 1,
+ deviceType: "desktop",
+ country: "US",
+ pagePath: "/towels",
+ trafficSource: "SO",
+ referrer: "google.com",
+ browser: "Chrome",
+ utmCampaign: "dont-panic-2026",
+ utmMedium: "email",
+ utmSource: "hitchhikers-guide"
+});
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**site_id:** `string` — Unique identifier for a Site
+
+
+
+
+
+-
+
+**request:** `Webflow.analyze.ReportsPageFlowRequest`
+
+
+
+
+
+-
+
+**requestOptions:** `ReportsClient.RequestOptions`
+
+
+
+
+
+
+
+
+
+
+
+## Analyze Goals
+client.analyze.goals.listGoals(site_id) -> Webflow.GoalsResponse
+
+-
+
+#### 📝 Description
+
+
+-
+
+
+-
+
+Returns the goals configured for a site. This endpoint returns a list of goals, not a report. It takes no time window, filters, or other query parameters, and unknown query parameters return `400 analyze_input_validation`.
+
+Each goal includes its type (`goalType`) and whether it's a site goal (`isSiteGoal`). Integration goals also include `integrationSource`, and HubSpot or Marketo form goals include the `formId`. Use a goal's `goalId` with [Get Goal Performance](/data/reference/analyze/goal-performance) to get its daily conversions.
+
+This endpoint requires a workspace with the Analyze add-on.
+
+Each access token can have one Analyze request in flight at a time, across all Analyze endpoints. Additional concurrent requests return `429 Too Many Requests`. Wait for your in-flight request to finish, or for the `Retry-After` interval, then retry.
+
+Required scope | `sites:read`
+
+
+
+
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```typescript
+await client.analyze.goals.listGoals("580e63e98c9a982ac9b8b741");
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**site_id:** `string` — Unique identifier for a Site
+
+
+
+
+
+-
+
+**requestOptions:** `GoalsClient.RequestOptions`
+
+
+
+
+
+
+
+
+
+
+
+client.analyze.goals.goalPerformance(site_id, goal_id, { ...params }) -> Webflow.GoalPerformanceResponse
+
+-
+
+#### 📝 Description
+
+
+-
+
+
+-
+
+Returns daily conversion counts for one goal over a time window, together with the goal's configuration (the same object [List Goals](/data/reference/analyze/list-goals) returns). Conversions are always counted as unique conversions.
+
+Days are bucketed in `bucketTimeZone`, which defaults to `UTC`. An unknown `goal_id` returns `404`. A goal with no conversions in the window returns an empty `data` array. Filter the report with top-level query parameters (`country`, `deviceType`, `pagePath`, etc.) or via the `filter` parameter for multi-value and negation matching.
+
+This endpoint requires a workspace with the Analyze add-on.
+
+Each access token can have one Analyze request in flight at a time, across all Analyze endpoints. Additional concurrent requests return `429 Too Many Requests`. Wait for your in-flight request to finish, or for the `Retry-After` interval, then retry.
+
+Required scope | `sites:read`
+
+
+
+
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```typescript
+await client.analyze.goals.goalPerformance("580e63e98c9a982ac9b8b741", "198020177", {
+ startTime: new Date("2026-04-01T00:00:00.000Z"),
+ endTime: new Date("2026-04-08T00:00:00.000Z"),
+ bucketTimeZone: "America/New_York",
+ deviceType: "desktop",
+ country: "US",
+ pagePath: "/towels",
+ trafficSource: "SO",
+ referrer: "google.com",
+ browser: "Chrome",
+ utmCampaign: "dont-panic-2026",
+ utmMedium: "email",
+ utmSource: "hitchhikers-guide"
+});
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**site_id:** `string` — Unique identifier for a Site
+
+
+
+
+
+-
+
+**goal_id:** `string` — Identifier of the goal, from `goalId` in [List Goals](/data/reference/analyze/list-goals). A numeric string, not a Webflow object ID.
+
+
+
+
+
+-
+
+**request:** `Webflow.analyze.GoalsGoalPerformanceRequest`
+
+
+
+
+
+-
+
+**requestOptions:** `GoalsClient.RequestOptions`
+
+
+
+
+
+
+
+
+
+
+
+## Collections Fields
+client.collections.fields.create(collection_id, { ...params }) -> Webflow.FieldCreate
+
+-
+
+#### 📝 Description
+
+
+-
+
+
+-
+
+Create a custom field in a collection.
+
+Field validation is currently not available through the API.
+
+Bulk creation of fields is not supported with this endpoint. To add multiple fields at once, include them when you [create the collection.](/data/v2.0.0/reference/cms/collections/create)
+
+Required scope | `cms:write`
+
+
+
+
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```typescript
+await client.collections.fields.create("580e63fc8c9a982ac9b8b745", {
+ id: "562ac0395358780a1f5e6fbc",
+ isEditable: true,
+ isRequired: false,
+ type: "RichText",
+ displayName: "Post Body",
+ helpText: "Add the body of your post here"
+});
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**collection_id:** `string` — Unique identifier for a Collection
+
+
+
+
+
+-
+
+**request:** `Webflow.FieldCreate`
+
+
+
+
+
+-
+
+**requestOptions:** `FieldsClient.RequestOptions`
+
+
+
+
+
+
+
+
+
+
+
+client.collections.fields.delete(collection_id, field_id) -> void
+
+-
+
+#### 📝 Description
+
+
+-
+
+
+-
+
+Delete a custom field in a collection. This endpoint does not currently support bulk deletion.
+
+Required scope | `cms:write`
+
+
+
+
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```typescript
+await client.collections.fields.delete("580e63fc8c9a982ac9b8b745", "580e63fc8c9a982ac9b8b745");
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**collection_id:** `string` — Unique identifier for a Collection
+
+
+
+
+
+-
+
+**field_id:** `string` — Unique identifier for a Field in a collection
+
+
+
+
+
+-
+
+**requestOptions:** `FieldsClient.RequestOptions`
+
+
+
+
+
+
+
+
+
+
+
+client.collections.fields.update(collection_id, field_id, { ...params }) -> Webflow.Field
+
+-
+
+#### 📝 Description
+
+
+-
+
+
+-
+
+Update a custom field in a collection.
+
+Required scope | `cms:write`
+
+
+
+
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```typescript
+await client.collections.fields.update("580e63fc8c9a982ac9b8b745", "580e63fc8c9a982ac9b8b745", {
+ isRequired: false,
+ displayName: "Post Body",
+ helpText: "Add the body of your post here"
+});
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**collection_id:** `string` — Unique identifier for a Collection
+
+
+
+
+
+-
+
+**field_id:** `string` — Unique identifier for a Field in a collection
+
+
+
+
+
+-
+
+**request:** `Webflow.collections.FieldUpdate`
+
+
+
+
+
+-
+
+**requestOptions:** `FieldsClient.RequestOptions`
+
+
+
+
+
+
+
+
+
+
+
+## Collections Items
+client.collections.items.listItems(collection_id, { ...params }) -> Webflow.CollectionItemList
+
+-
+
+#### 📝 Description
+
+
+-
+
+
+-
+
+
+ Rich Text field values can contain Webflow component instances as `` markup — see [Components in Rich Text](/data/docs/working-with-the-cms/components-in-rich-text) for the markup grammar, how to find component and property IDs, and the write constraints.
+
+
+List of all Items within a Collection.
+
+
+ This endpoint supports:
+
+ - Custom `filter[...]` queries support up to 10 filter terms and 2 text-search terms per request.
+ - Custom `sort[...]` queries support up to 3 sort fields per request.
+
+
+Required scope | `CMS:read`
+
+
+
+
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```typescript
+await client.collections.items.listItems("580e63fc8c9a982ac9b8b745", {
+ cmsLocaleId: "cmsLocaleId",
+ offset: 1,
+ limit: 1,
+ name: "name",
+ slug: "slug",
+ sortBy: "createdOn",
+ sortOrder: "asc",
+ translatable: "65427cf400e02b306eaa04a0"
+});
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**collection_id:** `string` — Unique identifier for a Collection
+
+
+
+
+
+-
+
+**request:** `Webflow.collections.ItemsListItemsRequest`
+
+
+
+
+
+-
+
+**requestOptions:** `ItemsClient.RequestOptions`
+
+
+
+
+
+
+
+
+
+
+
+client.collections.items.createItem(collection_id, { ...params }) -> Webflow.CollectionItem
+
+-
+
+#### 📝 Description
+
+
+-
+
+
+-
+
+
+ Rich Text field values can contain Webflow component instances as `` markup — see [Components in Rich Text](/data/docs/working-with-the-cms/components-in-rich-text) for the markup grammar, how to find component and property IDs, and the write constraints.
+
+
+Create Item(s) in a Collection.
+
+
+ This endpoint remains supported. New integrations should use [Create Items](/data/reference/cms/collection-items/staged-items/create-items), which accepts both request shapes below and can create an item in several locales under one ID. [This guide to creating items](/data/docs/working-with-the-cms/create-items) shows how each shape maps.
+
+
+This endpoint accepts two request shapes, and a request must use one or the other:
+
+- **Single item** — send `fieldData` at the top level. Set `cmsLocaleId` to create the item in a specific locale.
+- **Multiple items** — send an `items` array with at least one entry. Each entry needs its own `fieldData`, and can set its own `cmsLocaleId`, `isDraft`, and `isArchived`. The API ignores any other property on an entry.
+
+```json
+{
+ "items": [
+ {
+ "isArchived": false,
+ "isDraft": false,
+ "fieldData": {
+ "name": "Senior Data Analyst",
+ "slug": "senior-data-analyst"
+ }
+ },
+ {
+ "isArchived": false,
+ "isDraft": false,
+ "fieldData": {
+ "name": "Product Manager",
+ "slug": "product-manager"
+ }
+ }
+ ]
+}
+```
+
+A request that carries both `fieldData` and `items` returns a `400`.
+
+To create an item in several locales under one ID, use [Create Items](/data/reference/cms/collection-items/staged-items/create-items).
+
+Required scope | `CMS:write`
+
+
+
+
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```typescript
+await client.collections.items.createItem("580e63fc8c9a982ac9b8b745", {
+ skipInvalidFiles: true,
+ body: {
+ isArchived: false,
+ isDraft: false,
+ fieldData: {
+ name: "The Hitchhiker's Guide to the Galaxy",
+ slug: "hitchhikers-guide-to-the-galaxy",
+ "plain-text": "Don't Panic.",
+ "rich-text": "
A Guide to Interstellar Travel
A towel is about the most massively useful thing an interstellar hitchhiker can have. Don't forget yours!
",
+ "main-image": {
+ "fileId": "62b720ef280c7a7a3be8cabe",
+ "url": "/files/62b720ef280c7a7a3be8cabe_image.png"
+ },
+ "image-gallery": [
+ {
+ "fileId": "62b720ef280c7a7a3be8cabd",
+ "url": "/files/62b720ef280c7a7a3be8cabd_image.png"
+ },
+ {
+ "fileId": "62b720ef280c7a7a3be8cabe",
+ "url": "/files/62b720ef280c7a7a3be8cabe_image.png"
+ }
+ ],
+ "intro-video": "https://www.youtube.com/watch?v=aJ83KAggd-4",
+ "official-site": "https://hitchhikers.fandom.com/wiki/The_Hitchhiker%27s_Guide_to_the_Galaxy",
+ "contact-email": "zaphod.beeblebrox@heartofgold.gov",
+ "support-phone": "424-242-4242",
+ "answer-to-everything": 42,
+ "release-date": "1979-10-12T00:00:00.000Z",
+ "is-featured": true,
+ "brand-color": "#000000",
+ category: "62b720ef280c7a7a3be8cabf",
+ author: "62b720ef280c7a7a3be8cab0",
+ tags: [
+ "62b720ef280c7a7a3be8cab1",
+ "62b720ef280c7a7a3be8cab2"
+ ],
+ "downloadable-asset": {
+ "fileId": "62b720ef280c7a7a3be8cab3",
+ "url": "/files/62b720ef280c7a7a3be8cab3_document.pdf"
+ }
+ }
+ }
+});
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**collection_id:** `string` — Unique identifier for a Collection
+
+
+
+
+
+-
+
+**request:** `Webflow.collections.ItemsCreateItemRequest`
+
+
+
+
+
+-
+
+**requestOptions:** `ItemsClient.RequestOptions`
+
+
+
+
+
+
+
+
+
+
+
+client.collections.items.deleteItems(collection_id, { ...params }) -> void
+
+-
+
+#### 📝 Description
+
+
+-
+
+
+-
+
+Delete Items from a Collection.
+
+Items will only be deleted in the primary locale unless a `cmsLocaleId` is included in the request.
+
+Required scope | `CMS:write`
+
+
+
+
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```typescript
+await client.collections.items.deleteItems("580e63fc8c9a982ac9b8b745", {
+ items: [{
+ id: "580e64008c9a982ac9b8b754"
+ }]
+});
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**collection_id:** `string` — Unique identifier for a Collection
+
+
+
+
+
+-
+
+**request:** `Webflow.collections.ItemsDeleteItemsRequest`
+
+
+
+
+
+-
+
+**requestOptions:** `ItemsClient.RequestOptions`
+
+
+
+
+
+
+
+
+
+
+
+client.collections.items.updateItems(collection_id, { ...params }) -> Webflow.ItemsUpdateItemsResponse
+
+-
+
+#### 📝 Description
+
+
+-
+
+
+-
+
+
+ Rich Text field values can contain Webflow component instances as `` markup — see [Components in Rich Text](/data/docs/working-with-the-cms/components-in-rich-text) for the markup grammar, how to find component and property IDs, and the write constraints.
+
+
+Update a single item or multiple items in a Collection.
+
+The limit for this endpoint is 100 items.
+
+Items will only be updated in the primary locale, unless a `cmsLocaleId` is included in the request.
+
+
+ `isDraft: true` doesn't unpublish an item. The resulting status depends on whether the item has been published before:
+
+ - **Item that has never been published:** the item gets a `Draft` status.
+ - **Already-published item:** the item gets a `Changes in draft` status. The live item stays published, and your changes are held back until you publish them.
+
+ Setting `isDraft: false` queues the item to publish on the next site publish. To remove an item from the live site, use [Unpublish Live Collection Items](/data/reference/cms/collection-items/live-items/delete-items-live). For the full status mapping, see [Publishing with the CMS API](/data/docs/working-with-the-cms/publishing).
+
+
+Required scope | `CMS:write`
+
+
+
+
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```typescript
+await client.collections.items.updateItems("580e63fc8c9a982ac9b8b745", {
+ skipInvalidFiles: true,
+ items: [{
+ id: "66f6ed9576ddacf3149d5ea6",
+ cmsLocaleId: "66f6e966c9e1dc700a857ca5",
+ fieldData: {
+ name: "Ne Paniquez Pas",
+ slug: "ne-paniquez-pas",
+ featured: false
+ }
+ }, {
+ id: "66f6ed9576ddacf3149d5ea6",
+ cmsLocaleId: "66f6e966c9e1dc700a857ca4",
+ fieldData: {
+ name: "No Entrar en P\u00E1nico",
+ slug: "no-entrar-en-panico",
+ featured: false
+ }
+ }, {
+ id: "66f6ed9576ddacf3149d5eaa",
+ cmsLocaleId: "66f6e966c9e1dc700a857ca5",
+ fieldData: {
+ name: "Au Revoir et Merci pour Tous les Poissons",
+ slug: "au-revoir-et-merci",
+ featured: false
+ }
+ }, {
+ id: "66f6ed9576ddacf3149d5eaa",
+ cmsLocaleId: "66f6e966c9e1dc700a857ca4",
+ fieldData: {
+ name: "Hasta Luego y Gracias por Todo el Pescado",
+ slug: "hasta-luego-y-gracias",
+ featured: false
+ }
+ }]
+});
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**collection_id:** `string` — Unique identifier for a Collection
+
+
+
+
+
+-
+
+**request:** `Webflow.collections.ItemsUpdateItemsRequest`
+
+
+
+
+
+-
+
+**requestOptions:** `ItemsClient.RequestOptions`
+
+
+
+
+
+
+
+
+
+
+
+client.collections.items.listItemsLive(collection_id, { ...params }) -> Webflow.CollectionItemList
+
+-
+
+#### 📝 Description
+
+
+-
+
+
+-
+
+
+ Rich Text field values can contain Webflow component instances as `` markup — see [Components in Rich Text](/data/docs/working-with-the-cms/components-in-rich-text) for the markup grammar, how to find component and property IDs, and the write constraints.
+
+
+List all published items in a collection.
+
+
+ Serving data to applications in real-time? Use the Content Delivery API at `api-cdn.webflow.com` for better performance. The CDN-backed endpoint is optimized for high-volume reads, while the Data API is designed for writes and management operations.
+
+
+
+ This endpoint supports:
+
+ - Custom `filter[...]` queries support up to 10 filter terms and 2 text-search terms per request.
+ - Custom `sort[...]` queries support up to 3 sort fields per request.
+
+
+Required scope | `CMS:read`
+
+
+
+
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```typescript
+await client.collections.items.listItemsLive("580e63fc8c9a982ac9b8b745", {
+ cmsLocaleId: "cmsLocaleId",
+ offset: 1,
+ limit: 1,
+ name: "name",
+ slug: "slug",
+ sortBy: "createdOn",
+ sortOrder: "asc",
+ translatable: "65427cf400e02b306eaa04a0"
+});
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**collection_id:** `string` — Unique identifier for a Collection
+
+
+
+
+
+-
+
+**request:** `Webflow.collections.ItemsListItemsLiveRequest`
+
+
+
+
+
+-
+
+**requestOptions:** `ItemsClient.RequestOptions`
+
+
+
+
+
+
+
+
+
+
+
+client.collections.items.createItemLive(collection_id, { ...params }) -> Webflow.CollectionItem
+
+-
+
+#### 📝 Description
+
+
+-
+
+
+-
+
+
+ Rich Text field values can contain Webflow component instances as `` markup — see [Components in Rich Text](/data/docs/working-with-the-cms/components-in-rich-text) for the markup grammar, how to find component and property IDs, and the write constraints.
+
+
+Create item(s) in a collection that will be immediately published to the live site.
+
+This endpoint accepts two request shapes, and a request must use one or the other:
+
+- **Single item** — send `fieldData` at the top level. Set `cmsLocaleId` to create the item in a specific locale.
+- **Multiple items** — send an `items` array with at least one entry. Each entry needs its own `fieldData`, and can set its own `cmsLocaleId`, `isDraft`, and `isArchived`. The API ignores any other property on an entry.
+
+```json
+{
+ "items": [
+ {
+ "isArchived": false,
+ "isDraft": false,
+ "fieldData": {
+ "name": "Senior Data Analyst",
+ "slug": "senior-data-analyst"
+ }
+ },
+ {
+ "isArchived": false,
+ "isDraft": false,
+ "fieldData": {
+ "name": "Product Manager",
+ "slug": "product-manager"
+ }
+ }
+ ]
+}
+```
+
+A request that carries both `fieldData` and `items` returns a `400`.
+
+To create items in several locales, use [Create Items](/data/reference/cms/collection-items/staged-items/create-items) and then [Publish Collection Item(s)](/data/reference/cms/collection-items/staged-items/publish-item). Create Items writes staged content only.
+
+Required scope | `CMS:write`
+
+
+
+
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```typescript
+await client.collections.items.createItemLive("580e63fc8c9a982ac9b8b745", {
+ skipInvalidFiles: true,
+ body: {
+ isArchived: false,
+ isDraft: false,
+ fieldData: {
+ name: "The Hitchhiker's Guide to the Galaxy",
+ slug: "hitchhikers-guide-to-the-galaxy",
+ "plain-text": "Don't Panic.",
+ "rich-text": "
A Guide to Interstellar Travel
A towel is about the most massively useful thing an interstellar hitchhiker can have. Don't forget yours!
",
+ "main-image": {
+ "fileId": "62b720ef280c7a7a3be8cabe",
+ "url": "/files/62b720ef280c7a7a3be8cabe_image.png"
+ },
+ "image-gallery": [
+ {
+ "fileId": "62b720ef280c7a7a3be8cabd",
+ "url": "/files/62b720ef280c7a7a3be8cabd_image.png"
+ },
+ {
+ "fileId": "62b720ef280c7a7a3be8cabe",
+ "url": "/files/62b720ef280c7a7a3be8cabe_image.png"
+ }
+ ],
+ "intro-video": "https://www.youtube.com/watch?v=aJ83KAggd-4",
+ "official-site": "https://hitchhikers.fandom.com/wiki/The_Hitchhiker%27s_Guide_to_the_Galaxy",
+ "contact-email": "zaphod.beeblebrox@heartofgold.gov",
+ "support-phone": "424-242-4242",
+ "answer-to-everything": 42,
+ "release-date": "1979-10-12T00:00:00.000Z",
+ "is-featured": true,
+ "brand-color": "#000000",
+ category: "62b720ef280c7a7a3be8cabf",
+ author: "62b720ef280c7a7a3be8cab0",
+ tags: [
+ "62b720ef280c7a7a3be8cab1",
+ "62b720ef280c7a7a3be8cab2"
+ ],
+ "downloadable-asset": {
+ "fileId": "62b720ef280c7a7a3be8cab3",
+ "url": "/files/62b720ef280c7a7a3be8cab3_document.pdf"
+ }
+ }
+ }
+});
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**collection_id:** `string` — Unique identifier for a Collection
+
+
+
+
+
+-
+
+**request:** `Webflow.collections.ItemsCreateItemLiveRequest`
+
+
+
+
+
+-
+
+**requestOptions:** `ItemsClient.RequestOptions`
+
+
+
+
+
+
+
+
+
+
+
+client.collections.items.deleteItemsLive(collection_id, { ...params }) -> void
+
+-
+
+#### 📝 Description
+
+
+-
+
+
+-
+
+Unpublish up to 100 items from the live site and set the `isDraft` property to `true`.
+
+Items will only be unpublished in the primary locale unless a `cmsLocaleId` is included in the request.
+
+Required scope | `CMS:write`
+
+
+
+
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```typescript
+await client.collections.items.deleteItemsLive("580e63fc8c9a982ac9b8b745", {
+ items: [{
+ id: "580e64008c9a982ac9b8b754"
+ }]
+});
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**collection_id:** `string` — Unique identifier for a Collection
+
+
+
+
+
+-
+
+**request:** `Webflow.collections.ItemsDeleteItemsLiveRequest`
+
+
+
+
+
+-
+
+**requestOptions:** `ItemsClient.RequestOptions`
+
+
+
+
+
+
+
+
+
+
+
+client.collections.items.updateItemsLive(collection_id, { ...params }) -> Webflow.CollectionItemListNoPagination
+
+-
+
+#### 📝 Description
+
+
+-
+
+
+-
+
+
+ Rich Text field values can contain Webflow component instances as `` markup — see [Components in Rich Text](/data/docs/working-with-the-cms/components-in-rich-text) for the markup grammar, how to find component and property IDs, and the write constraints.
+
+
+Update a single published item or multiple published items (up to 100) in a Collection
+
+Items will only be updated in the primary locale, unless a `cmsLocaleId` is included in the request.
+
+Required scope | `CMS:write`
+
+
+
+
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```typescript
+await client.collections.items.updateItemsLive("580e63fc8c9a982ac9b8b745", {
+ skipInvalidFiles: true,
+ items: [{
+ id: "66f6ed9576ddacf3149d5ea6",
+ cmsLocaleId: "66f6e966c9e1dc700a857ca5",
+ fieldData: {
+ name: "Ne Paniquez Pas",
+ slug: "ne-paniquez-pas",
+ featured: false
+ }
+ }, {
+ id: "66f6ed9576ddacf3149d5ea6",
+ cmsLocaleId: "66f6e966c9e1dc700a857ca4",
+ fieldData: {
+ name: "No Entrar en P\u00E1nico",
+ slug: "no-entrar-en-panico",
+ featured: false
+ }
+ }, {
+ id: "66f6ed9576ddacf3149d5eaa",
+ cmsLocaleId: "66f6e966c9e1dc700a857ca5",
+ fieldData: {
+ name: "Au Revoir et Merci pour Tous les Poissons",
+ slug: "au-revoir-et-merci",
+ featured: false
+ }
+ }, {
+ id: "66f6ed9576ddacf3149d5eaa",
+ cmsLocaleId: "66f6e966c9e1dc700a857ca4",
+ fieldData: {
+ name: "Hasta Luego y Gracias por Todo el Pescado",
+ slug: "hasta-luego-y-gracias",
+ featured: false
+ }
+ }]
+});
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**collection_id:** `string` — Unique identifier for a Collection
+
+
+
+
+
+-
+
+**request:** `Webflow.collections.ItemsUpdateItemsLiveRequest`
+
+
+
+
+
+-
+
+**requestOptions:** `ItemsClient.RequestOptions`
+
+
+
+
+
+
+
+
+
+
+
+client.collections.items.createItems(collection_id, { ...params }) -> Webflow.BulkCollectionItem
+
+-
+
+#### 📝 Description
+
+
+-
+
+
+-
+
+
+ Rich Text field values can contain Webflow component instances as `` markup — see [Components in Rich Text](/data/docs/working-with-the-cms/components-in-rich-text) for the markup grammar, how to find component and property IDs, and the write constraints.
+
+
+Create an item or multiple items in a CMS Collection across multiple corresponding locales.
+
+
+ This endpoint remains supported. New integrations should use [Create Items](/data/reference/cms/collection-items/staged-items/create-items), which does everything this endpoint does and can also add locale variants to an existing item. [This guide to creating items](/data/docs/working-with-the-cms/create-items) shows how the request shape maps.
+
+
+
+ - This endpoint can create up to 100 items in a request.
+ - If the `cmsLocaleIds` parameter is not included in the request, an item will only be created in the primary locale.
+
+
+Required scope | `CMS:write`
+
+
+
+
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```typescript
+await client.collections.items.createItems("580e63fc8c9a982ac9b8b745", {
+ skipInvalidFiles: true,
+ cmsLocaleIds: ["66f6e966c9e1dc700a857ca3", "66f6e966c9e1dc700a857ca4", "66f6e966c9e1dc700a857ca5"],
+ isArchived: false,
+ isDraft: false,
+ fieldData: {
+ name: "Don\u2019t Panic",
+ slug: "dont-panic"
+ }
+});
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**collection_id:** `string` — Unique identifier for a Collection
+
+
+
+
+
+-
+
+**request:** `Webflow.collections.CreateBulkCollectionItemRequestBody`
+
+
+
+
+
+-
+
+**requestOptions:** `ItemsClient.RequestOptions`
+
+
+
+
+
+
+
+
+
+
+
+client.collections.items.insertItems(collection_id, { ...params }) -> Webflow.ItemsInsertItemsResponse
+
+-
+
+#### 📝 Description
+
+
+-
+
+
+-
+
+Create one or more staged items in a CMS Collection.
+
+Send an `items` array with `fieldData` for each item. By default, new items are created in the primary locale. To choose other locales or add variants to an existing item, expand the options below.
+
+- **Publishing:** Set `isDraft: false` to queue an item for the next site publish. Items are created as drafts (`isDraft: true`) by default. To publish individual items, use [Publish Collection Item(s)](/data/reference/cms/collection-items/staged-items/publish-item).
+- **Request limit:** Up to 100 items, counting every locale variant across all entries. One item in three locales counts as three; an item in the primary locale only counts as one.
+
+Required scope | `cms:write`
+
+
+
+ Each new item gets one ID. Its locale variants share that ID and the same `fieldData`.
+
+ - **Selected locales:** Set `cmsLocaleIds` to the locale IDs you want to create the item in.
+ - **All site locales:** Set `allCmsLocales: true` to include every current site locale, including the primary locale, without listing IDs.
+ - **Primary locale only:** Omit both `cmsLocaleIds` and `allCmsLocales`.
+
+ Use only one locale selector per entry. `allCmsLocales` is available only for new items and accepts only `true`; omit it instead of sending `false`.
+
+
+
+ Set `id` to an existing item's ID and provide the new locales in `cmsLocaleIds`. The variants reuse that ID. The item must exist and must not already have a variant in any requested locale.
+
+ Send the source content in `fieldData` as a starting point for translators. To provide different content per locale, send multiple entries with the same `id`, each with one locale in `cmsLocaleIds` and its own `fieldData`.
+
+
+
+ These requests return a `400`:
+
+ - Combining `allCmsLocales` with `cmsLocaleIds` (even an empty array) or `id`.
+ - Setting `allCmsLocales` to `false`, a string, or `null`.
+ - Sending unrecognized properties, including singular `cmsLocaleId`. Use `cmsLocaleIds` (plural).
+ - Repeating a locale within one entry, or the same `id`/locale pair across entries.
+
+ Check the response's `message` and `details` for validation errors. Some errors identify an entry, such as `items[2].cmsLocaleIds`. Invalid locale selector combinations return a message with an empty `details` array.
+
+
+
+Moving from `POST /items` or `POST /items/bulk`? See [Creating collection items](/data/docs/working-with-the-cms/create-items) for request mappings.
+
+Rich Text fields can include Webflow components. See [Components in Rich Text](/data/docs/working-with-the-cms/components-in-rich-text) for markup and constraints.
+
+
+
+
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```typescript
+await client.collections.items.insertItems("580e63fc8c9a982ac9b8b745", {
+ skipInvalidFiles: true,
+ items: [{
+ fieldData: {
+ name: "Mostly Harmless",
+ slug: "mostly-harmless"
+ }
+ }]
+});
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**collection_id:** `string` — Unique identifier for a Collection
+
+
+
+
+
+-
+
+**request:** `Webflow.collections.InsertCollectionItemsRequestBody`
+
+
+
+
+
+-
+
+**requestOptions:** `ItemsClient.RequestOptions`
+
+
+
+
+
+
+
+
+
+
+
+client.collections.items.getItem(collection_id, item_id, { ...params }) -> Webflow.CollectionItem
+
+-
+
+#### 📝 Description
+
+
+-
+
+
+-
+
+
+ Rich Text field values can contain Webflow component instances as `` markup — see [Components in Rich Text](/data/docs/working-with-the-cms/components-in-rich-text) for the markup grammar, how to find component and property IDs, and the write constraints.
+
+
+Get details of a selected Collection Item.
+
+Required scope | `CMS:read`
+
+
+
+
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```typescript
+await client.collections.items.getItem("580e63fc8c9a982ac9b8b745", "580e64008c9a982ac9b8b754", {
+ cmsLocaleId: "cmsLocaleId",
+ translatable: "65427cf400e02b306eaa04a0"
+});
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**collection_id:** `string` — Unique identifier for a Collection
+
+
+
+
+
+-
+
+**item_id:** `string` — Unique identifier for an Item
+
+
+
+
+
+-
+
+**request:** `Webflow.collections.ItemsGetItemRequest`
+
+
+
+
+
+-
+
+**requestOptions:** `ItemsClient.RequestOptions`
+
+
+
+
+
+
+
+
+
+
+
+client.collections.items.deleteItem(collection_id, item_id, { ...params }) -> void
+
+-
+
+#### 📝 Description
+
+
+-
+
+
+-
+
+Delete an item from a collection.
+
+Required scope | `CMS:write`
+
+
+
+
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```typescript
+await client.collections.items.deleteItem("580e63fc8c9a982ac9b8b745", "580e64008c9a982ac9b8b754", {
+ cmsLocaleId: "cmsLocaleId"
+});
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**collection_id:** `string` — Unique identifier for a Collection
+
+
+
+
+
+-
+
+**item_id:** `string` — Unique identifier for an Item
+
+
+
+
+
+-
+
+**request:** `Webflow.collections.ItemsDeleteItemRequest`
+
+
+
+
+
+-
+
+**requestOptions:** `ItemsClient.RequestOptions`
+
+
+
+
+
+
+
+
+
+
+
+client.collections.items.updateItem(collection_id, item_id, { ...params }) -> Webflow.CollectionItem
+
+-
+
+#### 📝 Description
+
+
+-
+
+
+-
+
+
+ Rich Text field values can contain Webflow component instances as `` markup — see [Components in Rich Text](/data/docs/working-with-the-cms/components-in-rich-text) for the markup grammar, how to find component and property IDs, and the write constraints.
+
+
+Update a selected Item in a Collection.
+
+
+ `isDraft: true` doesn't unpublish an item. The resulting status depends on whether the item has been published before:
+
+ - **Item that has never been published:** the item gets a `Draft` status.
+ - **Already-published item:** the item gets a `Changes in draft` status. The live item stays published, and your changes are held back until you publish them.
+
+ Setting `isDraft: false` queues the item to publish on the next site publish. To remove an item from the live site, use [Unpublish Live Collection Items](/data/reference/cms/collection-items/live-items/delete-items-live). For the full status mapping, see [Publishing with the CMS API](/data/docs/working-with-the-cms/publishing).
+
+
+Required scope | `CMS:write`
+
+
+
+
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```typescript
+await client.collections.items.updateItem("580e63fc8c9a982ac9b8b745", "580e64008c9a982ac9b8b754", {
+ skipInvalidFiles: true,
+ body: {
+ isArchived: false,
+ isDraft: false,
+ fieldData: {
+ name: "The Hitchhiker's Guide to the Galaxy",
+ slug: "hitchhikers-guide-to-the-galaxy",
+ "plain-text": "Don't Panic.",
+ "rich-text": "
A Guide to Interstellar Travel
A towel is about the most massively useful thing an interstellar hitchhiker can have. Don't forget yours!
",
+ "main-image": {
+ "fileId": "62b720ef280c7a7a3be8cabe",
+ "url": "/files/62b720ef280c7a7a3be8cabe_image.png"
+ },
+ "image-gallery": [
+ {
+ "fileId": "62b720ef280c7a7a3be8cabd",
+ "url": "/files/62b720ef280c7a7a3be8cabd_image.png"
+ },
+ {
+ "fileId": "62b720ef280c7a7a3be8cabe",
+ "url": "/files/62b720ef280c7a7a3be8cabe_image.png"
+ }
+ ],
+ "intro-video": "https://www.youtube.com/watch?v=aJ83KAggd-4",
+ "official-site": "https://hitchhikers.fandom.com/wiki/The_Hitchhiker%27s_Guide_to_the_Galaxy",
+ "contact-email": "zaphod.beeblebrox@heartofgold.gov",
+ "support-phone": "424-242-4242",
+ "answer-to-everything": 42,
+ "release-date": "1979-10-12T00:00:00.000Z",
+ "is-featured": true,
+ "brand-color": "#000000",
+ category: "62b720ef280c7a7a3be8cabf",
+ author: "62b720ef280c7a7a3be8cab0",
+ tags: [
+ "62b720ef280c7a7a3be8cab1",
+ "62b720ef280c7a7a3be8cab2"
+ ],
+ "downloadable-asset": {
+ "fileId": "62b720ef280c7a7a3be8cab3",
+ "url": "/files/62b720ef280c7a7a3be8cab3_document.pdf"
+ }
+ }
+ }
+});
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**collection_id:** `string` — Unique identifier for a Collection
+
+
+
+
+
+-
+
+**item_id:** `string` — Unique identifier for an Item
+
+
+
+
+
+-
+
+**request:** `Webflow.collections.ItemsUpdateItemRequest`
+
+
+
+
+
+-
+
+**requestOptions:** `ItemsClient.RequestOptions`
+
+
+
+
+
+
+
+
+
+
+
+client.collections.items.getItemLive(collection_id, item_id, { ...params }) -> Webflow.CollectionItem
+
+-
+
+#### 📝 Description
+
+
+-
+
+
+-
+
+
+ Rich Text field values can contain Webflow component instances as `` markup — see [Components in Rich Text](/data/docs/working-with-the-cms/components-in-rich-text) for the markup grammar, how to find component and property IDs, and the write constraints.
+
+
+Get details of a selected Collection live Item.
+
+
+ Serving data to applications in real-time? Use the Content Delivery API at `api-cdn.webflow.com` for better performance. The CDN-backed endpoint is optimized for high-volume reads, while the Data API is designed for writes and management operations.
+
+
+Required scope | `CMS:read`
+
+
+
+
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```typescript
+await client.collections.items.getItemLive("580e63fc8c9a982ac9b8b745", "580e64008c9a982ac9b8b754", {
+ cmsLocaleId: "cmsLocaleId",
+ translatable: "65427cf400e02b306eaa04a0"
+});
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**collection_id:** `string` — Unique identifier for a Collection
+
+
+
+
+
+-
+
+**item_id:** `string` — Unique identifier for an Item
+
+
+
+
+
+-
+
+**request:** `Webflow.collections.ItemsGetItemLiveRequest`
+
+
+
+
+
+-
+
+**requestOptions:** `ItemsClient.RequestOptions`
+
+
+
+
+
+
+
+
+
+
+
+client.collections.items.deleteItemLive(collection_id, item_id, { ...params }) -> void
+
+-
+
+#### 📝 Description
+
+
+-
+
+
+-
+
+Unpublish a live item from the site and set the `isDraft` property to `true`.
+
+For bulk unpublishing, please use [this endpoint.](/data/v2.0.0/reference/cms/collection-items/live-items/delete-items-live)
+
+Required scope | `CMS:write`
+
+
+
+
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```typescript
+await client.collections.items.deleteItemLive("580e63fc8c9a982ac9b8b745", "580e64008c9a982ac9b8b754", {
+ cmsLocaleId: "cmsLocaleId"
+});
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**collection_id:** `string` — Unique identifier for a Collection
+
+
+
+
+
+-
+
+**item_id:** `string` — Unique identifier for an Item
+
+
+
+
+
+-
+
+**request:** `Webflow.collections.ItemsDeleteItemLiveRequest`
+
+
+
+
+
+-
+
+**requestOptions:** `ItemsClient.RequestOptions`
+
+
+
+
+
+
+
+
+
+
+
+client.collections.items.updateItemLive(collection_id, item_id, { ...params }) -> Webflow.CollectionItem
+
+-
+
+#### 📝 Description
+
+
+-
+
+
+-
+
+
+ Rich Text field values can contain Webflow component instances as `` markup — see [Components in Rich Text](/data/docs/working-with-the-cms/components-in-rich-text) for the markup grammar, how to find component and property IDs, and the write constraints.
+
+
+Update a selected live Item in a Collection. The updates for this Item will be published to the live site.
+
+Required scope | `CMS:write`
+
+
+
+
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```typescript
+await client.collections.items.updateItemLive("580e63fc8c9a982ac9b8b745", "580e64008c9a982ac9b8b754", {
+ skipInvalidFiles: true,
+ body: {
+ isArchived: false,
+ isDraft: false,
+ fieldData: {
+ name: "The Hitchhiker's Guide to the Galaxy",
+ slug: "hitchhikers-guide-to-the-galaxy",
+ "plain-text": "Don't Panic.",
+ "rich-text": "
A Guide to Interstellar Travel
A towel is about the most massively useful thing an interstellar hitchhiker can have. Don't forget yours!
",
+ "main-image": {
+ "fileId": "62b720ef280c7a7a3be8cabe",
+ "url": "/files/62b720ef280c7a7a3be8cabe_image.png"
+ },
+ "image-gallery": [
+ {
+ "fileId": "62b720ef280c7a7a3be8cabd",
+ "url": "/files/62b720ef280c7a7a3be8cabd_image.png"
+ },
+ {
+ "fileId": "62b720ef280c7a7a3be8cabe",
+ "url": "/files/62b720ef280c7a7a3be8cabe_image.png"
+ }
+ ],
+ "intro-video": "https://www.youtube.com/watch?v=aJ83KAggd-4",
+ "official-site": "https://hitchhikers.fandom.com/wiki/The_Hitchhiker%27s_Guide_to_the_Galaxy",
+ "contact-email": "zaphod.beeblebrox@heartofgold.gov",
+ "support-phone": "424-242-4242",
+ "answer-to-everything": 42,
+ "release-date": "1979-10-12T00:00:00.000Z",
+ "is-featured": true,
+ "brand-color": "#000000",
+ category: "62b720ef280c7a7a3be8cabf",
+ author: "62b720ef280c7a7a3be8cab0",
+ tags: [
+ "62b720ef280c7a7a3be8cab1",
+ "62b720ef280c7a7a3be8cab2"
+ ],
+ "downloadable-asset": {
+ "fileId": "62b720ef280c7a7a3be8cab3",
+ "url": "/files/62b720ef280c7a7a3be8cab3_document.pdf"
+ }
+ }
+ }
+});
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**collection_id:** `string` — Unique identifier for a Collection
+
+
+
+
+
+-
+
+**item_id:** `string` — Unique identifier for an Item
+
+
+
+
+
+-
+
+**request:** `Webflow.collections.ItemsUpdateItemLiveRequest`
+
+
+
+
+
+-
+
+**requestOptions:** `ItemsClient.RequestOptions`
+
+
+
+
+
+
+
+
+
+
+
+client.collections.items.publishItem(collection_id, { ...params }) -> Webflow.ItemsPublishItemResponse
+
+-
+
+#### 📝 Description
+
+
+-
+
+
+-
+
+Publish an item or multiple items.
+
+Publishing a draft item automatically sets `isDraft` to `false`.
+You don't need to update the item's draft status before calling this endpoint.
+
+Required scope | `cms:write`
+
+
+
+
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```typescript
+await client.collections.items.publishItem("580e63fc8c9a982ac9b8b745", {
+ itemIds: ["643fd856d66b6528195ee2ca", "643fd856d66b6528195ee2cb", "643fd856d66b6528195ee2cc"]
+});
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**collection_id:** `string` — Unique identifier for a Collection
+
+
+
+
+
+-
+
+**request:** `Webflow.ItemsPublishItemRequest`
+
+
+
+
+
+-
+
+**requestOptions:** `ItemsClient.RequestOptions`
+
+
+
+
+
+
+
+
+
+
+
+## Optimize Optimizations
+client.optimize.optimizations.list(optimize_id, { ...params }) -> Webflow.OptimizationListResponse
+
+-
+
+#### 📝 Description
+
+
+-
+
+
+-
+
+Lists the optimizations for an `optimizeId`, with each one's type, status, intervals, and current goals. Returns live and draft optimizations unless you set `status`.
+
+Each report covers a date range within a single interval of an optimization. Use an interval's `start` and `end` to choose a report's `intervalStart` and `intervalEnd`.
+
+Each interval lists its goals as they were when it started. `currentGoals` lists the optimization's goals as they're set up now, and each goal's `source` shows where it comes from. A report accepts a `goalId` from either list.
+
+Results are sorted by `optimizationId`, and each optimization's intervals are listed oldest first. To get the next page, pass `nextCursor` as `cursor`.
+
+This endpoint requires a Webflow site with the Optimize add-on, or a non-Webflow site that uses Optimize.
+
+Each access token can have one Optimize request in flight at a time, across all Optimize endpoints. Additional concurrent requests return `429 Too Many Requests`. Wait for your in-flight request to finish, or for the `Retry-After` interval, then retry.
+
+Required scope | `sites:read`
+
+
+
+
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```typescript
+await client.optimize.optimizations.list("117420042", {
+ status: ["live", "draft"],
+ pageSize: 1,
+ cursor: "c2xhcnRpYmFydGZhc3Q"
+});
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**optimize_id:** `string` — The Optimize ID, from [List Optimize IDs](/data/reference/optimize/list-optimize-ids).
+
+
+
+
+
+-
+
+**request:** `Webflow.optimize.OptimizationsListRequest`
+
+
+
+
+
+-
+
+**requestOptions:** `OptimizationsClient.RequestOptions`
+
+
+
+
+
+
+
+
+
+
+
+client.optimize.optimizations.summary(optimize_id, optimization_id, { ...params }) -> Webflow.OptimizationSummaryResponse
+
+-
+
+#### 📝 Description
+
+
+-
+
+
+-
+
+Returns each variation's sessions, users, conversions, and conversion rate for one goal, over a date range within one interval. Traditional tests and AI-optimized optimizations also include each variation's comparison with the base variation.
+
+Value goals also include each variation's total value and average conversion value. Choose the goal with `goalId`, and narrow the results with `filter`.
+
+This endpoint requires a Webflow site with the Optimize add-on, or a non-Webflow site that uses Optimize.
+
+Each access token can have one Optimize request in flight at a time, across all Optimize endpoints. Additional concurrent requests return `429 Too Many Requests`. Wait for your in-flight request to finish, or for the `Retry-After` interval, then retry.
+
+Required scope | `sites:read`
+
+
+
+
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```typescript
+await client.optimize.optimizations.summary("117420042", "417200971", {
+ intervalStart: new Date("2026-09-01T00:00:00.000Z"),
+ intervalEnd: new Date("2026-09-15T00:00:00.000Z"),
+ goalId: "198042421"
+});
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**optimize_id:** `string` — The Optimize ID, from [List Optimize IDs](/data/reference/optimize/list-optimize-ids).
+
+
+
+
+
+-
+
+**optimization_id:** `string` — The optimization ID, from [List Optimizations](/data/reference/optimize/list-optimizations).
+
+
+
+
+
+-
+
+**request:** `Webflow.optimize.OptimizationsSummaryRequest`
+
+
+
+
+
+-
+
+**requestOptions:** `OptimizationsClient.RequestOptions`
+
+
+
+
+
+
+
+
+
+
+
+client.optimize.optimizations.audienceInsights(optimize_id, optimization_id, { ...params }) -> Webflow.OptimizationAudienceInsightsResponse
+
+-
+
+#### 📝 Description
+
+
+-
+
+
+-
+
+Returns each variation's sessions, users, conversions, and conversion rate for each segment of one dimension, for one goal over a date range within one interval. Choose the dimension with `groupBy`.
+
+Each segment also shows how the variation is trending against the base variation in that segment, and how confident that trend is. Choose the goal with `goalId`, and narrow the results with `filter`.
+
+This endpoint requires a Webflow site with the Optimize add-on, or a non-Webflow site that uses Optimize.
+
+Each access token can have one Optimize request in flight at a time, across all Optimize endpoints. Additional concurrent requests return `429 Too Many Requests`. Wait for your in-flight request to finish, or for the `Retry-After` interval, then retry.
+
+Required scope | `sites:read`
+
+
+
+
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```typescript
+await client.optimize.optimizations.audienceInsights("117420042", "417200971", {
+ intervalStart: new Date("2026-09-01T00:00:00.000Z"),
+ intervalEnd: new Date("2026-09-15T00:00:00.000Z"),
+ groupBy: "country",
+ goalId: "198042421"
+});
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**optimize_id:** `string` — The Optimize ID, from [List Optimize IDs](/data/reference/optimize/list-optimize-ids).
+
+
+
+
+
+-
+
+**optimization_id:** `string` — The optimization ID, from [List Optimizations](/data/reference/optimize/list-optimizations).
+
+
+
+
+
+-
+
+**request:** `Webflow.optimize.OptimizationsAudienceInsightsRequest`
+
+
+
+
+
+-
+
+**requestOptions:** `OptimizationsClient.RequestOptions`
+
+
+
+
+
+
+
+
+
+
+
+client.optimize.optimizations.trend(optimize_id, optimization_id, { ...params }) -> Webflow.OptimizationTrendResponse
+
+-
+
+#### 📝 Description
+
+
+-
+
+
+-
+
+Returns each variation's sessions, users, conversions, and conversion rate by day or week, for one goal over a date range within one interval. Traditional tests and AI-optimized optimizations also include each variation's comparison with the base variation.
+
+Buckets use the account's time zone, returned as `timeZone`. For AI-optimized optimizations, `strength` covers the whole date range and is the same in every bucket. Choose the goal with `goalId`, and narrow the results with `filter`.
+
+This endpoint requires a Webflow site with the Optimize add-on, or a non-Webflow site that uses Optimize.
+
+Each access token can have one Optimize request in flight at a time, across all Optimize endpoints. Additional concurrent requests return `429 Too Many Requests`. Wait for your in-flight request to finish, or for the `Retry-After` interval, then retry.
+
+Required scope | `sites:read`
@@ -3652,7 +8766,12 @@ Required scope | `ecommerce:write`
-
```typescript
-await client.products.update("580e63e98c9a982ac9b8b741", "580e63fc8c9a982ac9b8b745");
+await client.optimize.optimizations.trend("117420042", "417200971", {
+ intervalStart: new Date("2026-09-01T00:00:00.000Z"),
+ intervalEnd: new Date("2026-09-15T00:00:00.000Z"),
+ granularity: "daily",
+ goalId: "198042421"
+});
```
@@ -3668,7 +8787,7 @@ await client.products.update("580e63e98c9a982ac9b8b741", "580e63fc8c9a982ac9b8b7
-
-**site_id:** `string` — Unique identifier for a Site
+**optimize_id:** `string` — The Optimize ID, from [List Optimize IDs](/data/reference/optimize/list-optimize-ids).
@@ -3676,7 +8795,7 @@ await client.products.update("580e63e98c9a982ac9b8b741", "580e63fc8c9a982ac9b8b7
-
-**product_id:** `string` — Unique identifier for a Product
+**optimization_id:** `string` — The optimization ID, from [List Optimizations](/data/reference/optimize/list-optimizations).
@@ -3684,7 +8803,7 @@ await client.products.update("580e63e98c9a982ac9b8b741", "580e63fc8c9a982ac9b8b7
-
-**request:** `Webflow.ProductSkuUpdate`
+**request:** `Webflow.optimize.OptimizationsTrendRequest`
@@ -3692,7 +8811,7 @@ await client.products.update("580e63e98c9a982ac9b8b741", "580e63fc8c9a982ac9b8b7
-
-**requestOptions:** `ProductsClient.RequestOptions`
+**requestOptions:** `OptimizationsClient.RequestOptions`
@@ -3704,7 +8823,8 @@ await client.products.update("580e63e98c9a982ac9b8b741", "580e63fc8c9a982ac9b8b7
-client.products.createSku(site_id, product_id, { ...params }) -> Webflow.ProductsCreateSkuResponse
+## Optimize Optimizations Goals
+client.optimize.optimizations.goals.list(optimize_id, optimization_id, { ...params }) -> Webflow.OptimizationGoalsResponse
-
@@ -3716,11 +8836,13 @@ await client.products.update("580e63e98c9a982ac9b8b741", "580e63fc8c9a982ac9b8b7
-
-Create additional SKUs to manage every [option and variant of your Product.](https://help.webflow.com/hc/en-us/articles/33961334531347-Create-product-options-and-variants)
+Lists an optimization's goals in two lists. `goals` holds the goals of the interval that contains the requested date range, as they were when it started, with its target goals marked. `currentGoals` holds the optimization's goals as they're set up now, with where each comes from. Use a `goalId` from either list to choose the goal a report measures.
-Creating SKUs through the API will set the product type to `Advanced`, which ensures all Product and SKU fields will be shown to users in the Designer.
+This endpoint requires a Webflow site with the Optimize add-on, or a non-Webflow site that uses Optimize.
-Required scope | `ecommerce:write`
+Each access token can have one Optimize request in flight at a time, across all Optimize endpoints. Additional concurrent requests return `429 Too Many Requests`. Wait for your in-flight request to finish, or for the `Retry-After` interval, then retry.
+
+Required scope | `sites:read`
@@ -3735,32 +8857,274 @@ Required scope | `ecommerce:write`
-
```typescript
-await client.products.createSku("580e63e98c9a982ac9b8b741", "580e63fc8c9a982ac9b8b745", {
- skus: [{
- id: "66072fb71b89448912e2681c",
- cmsLocaleId: "653ad57de882f528b32e810e",
- lastPublished: new Date("2023-03-17T18:47:35.000Z"),
- lastUpdated: new Date("2023-03-17T18:47:35.000Z"),
- createdOn: new Date("2023-03-17T18:47:35.000Z"),
- fieldData: {
- name: "Colorful T-shirt - Default",
- slug: "colorful-t-shirt-default",
- price: {
- value: 2499,
- unit: "USD",
- currency: "USD"
- }
- }
- }]
+await client.optimize.optimizations.goals.list("117420042", "417200971", {
+ intervalStart: new Date("2026-09-01T00:00:00.000Z"),
+ intervalEnd: new Date("2026-09-15T00:00:00.000Z")
+});
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**optimize_id:** `string` — The Optimize ID, from [List Optimize IDs](/data/reference/optimize/list-optimize-ids).
+
+
+
+
+
+-
+
+**optimization_id:** `string` — The optimization ID, from [List Optimizations](/data/reference/optimize/list-optimizations).
+
+
+
+
+
+-
+
+**request:** `Webflow.optimize.optimizations.GoalsListRequest`
+
+
+
+
+
+-
+
+**requestOptions:** `GoalsClient.RequestOptions`
+
+
+
+
+
+
+
+
+
+
+
+## Optimize Optimizations Dimensions
+client.optimize.optimizations.dimensions.list(optimize_id, optimization_id, { ...params }) -> Webflow.OptimizationDimensionsResponse
+
+-
+
+#### 📝 Description
+
+
+-
+
+
+-
+
+Lists the dimensions you can group or filter an optimization's reports by, for a date range within one interval. Use a dimension's `id` in `groupBy`, in `filter`, or to list its values.
+
+This endpoint requires a Webflow site with the Optimize add-on, or a non-Webflow site that uses Optimize.
+
+Each access token can have one Optimize request in flight at a time, across all Optimize endpoints. Additional concurrent requests return `429 Too Many Requests`. Wait for your in-flight request to finish, or for the `Retry-After` interval, then retry.
+
+Required scope | `sites:read`
+
+
+
+
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```typescript
+await client.optimize.optimizations.dimensions.list("117420042", "417200971", {
+ intervalStart: new Date("2026-09-01T00:00:00.000Z"),
+ intervalEnd: new Date("2026-09-15T00:00:00.000Z")
+});
+
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**optimize_id:** `string` — The Optimize ID, from [List Optimize IDs](/data/reference/optimize/list-optimize-ids).
+
+
+
+
+
+-
+
+**optimization_id:** `string` — The optimization ID, from [List Optimizations](/data/reference/optimize/list-optimizations).
+
+
+
+
+
+-
+
+**request:** `Webflow.optimize.optimizations.DimensionsListRequest`
+
+
+
+
+
+-
+
+**requestOptions:** `DimensionsClient.RequestOptions`
+
+
+
+
+
+
+
+
+
+
+
+client.optimize.optimizations.dimensions.listValues(optimize_id, optimization_id, dimension_id, { ...params }) -> Webflow.OptimizationDimensionValuesResponse
+
+-
+
+#### 📝 Description
+
+
+-
+
+
+-
+
+Lists the values seen for one dimension over a date range within one interval, with how often each appeared. Use a `value` in `filter` to narrow a report.
+
+Values are sorted by `eventCount`, highest first. To get the next page, pass `nextCursor` as `cursor`. Counts can change between requests, so a value can move to a different page while you page through the list.
+
+This endpoint requires a Webflow site with the Optimize add-on, or a non-Webflow site that uses Optimize.
+
+Each access token can have one Optimize request in flight at a time, across all Optimize endpoints. Additional concurrent requests return `429 Too Many Requests`. Wait for your in-flight request to finish, or for the `Retry-After` interval, then retry.
+
+Required scope | `sites:read`
+
+
+
+
+
+#### 🔌 Usage
+
+
+-
+
+
+-
+
+```typescript
+await client.optimize.optimizations.dimensions.listValues("117420042", "417200971", "country", {
+ intervalStart: new Date("2026-09-01T00:00:00.000Z"),
+ intervalEnd: new Date("2026-09-15T00:00:00.000Z"),
+ pageSize: 1,
+ cursor: "ZmpvcmRz"
});
-```
+```
+
+
+
+
+
+#### ⚙️ Parameters
+
+
+-
+
+
+-
+
+**optimize_id:** `string` — The Optimize ID, from [List Optimize IDs](/data/reference/optimize/list-optimize-ids).
+
+
+
+
+
+-
+
+**optimization_id:** `string` — The optimization ID, from [List Optimizations](/data/reference/optimize/list-optimizations).
+
+
+
+
+
+-
+
+**dimension_id:** `string` — The dimension `id`, from [List Dimensions](/data/reference/optimize/list-dimensions). URL-encode it, because dimension IDs can contain `:`, `.`, and spaces. Unlike `groupBy`, this accepts `urlParameter`.
+
+
+
+
+
+-
+
+**request:** `Webflow.optimize.optimizations.DimensionsListValuesRequest`
+
+
+
+
+
+-
+
+**requestOptions:** `DimensionsClient.RequestOptions`
+
+
+
+
+
+
+
+
+
+
+
+## Pages Scripts
+client.pages.scripts.getCustomCode(page_id) -> Webflow.ScriptApplyList
+
+-
+
+#### 📝 Description
+
+
+-
+
+
+-
+
+Get all scripts applied to a page.
+
+Access to this endpoint requires a bearer token obtained from an [OAuth Code Grant Flow](/data/reference/oauth-app).
+
+Required scope | `custom_code:read`
-#### ⚙️ Parameters
+#### 🔌 Usage
-
@@ -3768,23 +9132,24 @@ await client.products.createSku("580e63e98c9a982ac9b8b741", "580e63fc8c9a982ac9b
-
-**site_id:** `string` — Unique identifier for a Site
-
+```typescript
+await client.pages.scripts.getCustomCode("63c720f9347c2139b248e552");
+
+```
+
+
+#### ⚙️ Parameters
+
-
-**product_id:** `string` — Unique identifier for a Product
-
-
-
-
-
-**request:** `Webflow.ProductsCreateSkuRequest`
+**page_id:** `string` — Unique identifier for a Page
@@ -3792,7 +9157,7 @@ await client.products.createSku("580e63e98c9a982ac9b8b741", "580e63fc8c9a982ac9b
-
-**requestOptions:** `ProductsClient.RequestOptions`
+**requestOptions:** `ScriptsClient.RequestOptions`
@@ -3804,7 +9169,7 @@ await client.products.createSku("580e63e98c9a982ac9b8b741", "580e63fc8c9a982ac9b
-client.products.updateSku(site_id, product_id, sku_id, { ...params }) -> Webflow.Sku
+client.pages.scripts.upsertCustomCode(page_id, { ...params }) -> Webflow.ScriptApplyList
-
@@ -3816,11 +9181,15 @@ await client.products.createSku("580e63e98c9a982ac9b8b741", "580e63fc8c9a982ac9b
-
-Update a specified SKU.
+Apply registered scripts to a page. If you have multiple scripts your App needs to apply or maintain on a page, ensure they are always included in the request body for this endpoint. To remove individual scripts, simply call this endpoint without the script in the request body.
-Updating an existing SKU will set the Product type to `Advanced`, which ensures all Product and SKU fields will be shown to users in the Designer.
+
+ To apply a script to a page, the script must first be registered to a Site via the [Register Script](/data/reference/custom-code/custom-code/register-hosted) endpoints. Once registered, the script can be applied to a Site or Page using the appropriate endpoints. See the documentation on [working with Custom Code](/data/docs/custom-code) for more information.
+
-Required scope | `ecommerce:write`
+Access to this endpoint requires a bearer token obtained from an [OAuth Code Grant Flow](/data/reference/oauth-app).
+
+Required scope | `custom_code:write`
@@ -3835,23 +9204,19 @@ Required scope | `ecommerce:write`
-
```typescript
-await client.products.updateSku("580e63e98c9a982ac9b8b741", "580e63fc8c9a982ac9b8b745", "5e8518516e147040726cc415", {
- sku: {
- id: "66072fb71b89448912e2681c",
- cmsLocaleId: "653ad57de882f528b32e810e",
- lastPublished: new Date("2023-03-17T18:47:35.000Z"),
- lastUpdated: new Date("2023-03-17T18:47:35.000Z"),
- createdOn: new Date("2023-03-17T18:47:35.000Z"),
- fieldData: {
- name: "Colorful T-shirt - Default",
- slug: "colorful-t-shirt-default",
- price: {
- value: 2499,
- unit: "USD",
- currency: "USD"
+await client.pages.scripts.upsertCustomCode("63c720f9347c2139b248e552", {
+ scripts: [{
+ id: "cms_slider",
+ location: "header",
+ version: "1.0.0",
+ attributes: {
+ "my-attribute": "some-value"
}
- }
- }
+ }, {
+ id: "alert",
+ location: "header",
+ version: "0.0.1"
+ }]
});
```
@@ -3868,23 +9233,7 @@ await client.products.updateSku("580e63e98c9a982ac9b8b741", "580e63fc8c9a982ac9b
-
-**site_id:** `string` — Unique identifier for a Site
-
-
-
-
-
--
-
-**product_id:** `string` — Unique identifier for a Product
-
-
-
-
-
--
-
-**sku_id:** `string` — Unique identifier for a SKU
+**page_id:** `string` — Unique identifier for a Page
@@ -3892,7 +9241,7 @@ await client.products.updateSku("580e63e98c9a982ac9b8b741", "580e63fc8c9a982ac9b
-
-**request:** `Webflow.ProductsUpdateSkuRequest`
+**request:** `Webflow.ScriptApplyList`
@@ -3900,7 +9249,7 @@ await client.products.updateSku("580e63e98c9a982ac9b8b741", "580e63fc8c9a982ac9b
-
-**requestOptions:** `ProductsClient.RequestOptions`
+**requestOptions:** `ScriptsClient.RequestOptions`
@@ -3912,8 +9261,7 @@ await client.products.updateSku("580e63e98c9a982ac9b8b741", "580e63fc8c9a982ac9b
-## Orders
-client.orders.list(site_id, { ...params }) -> Webflow.OrderList
+client.pages.scripts.deleteCustomCode(page_id) -> void
-
@@ -3925,9 +9273,13 @@ await client.products.updateSku("580e63e98c9a982ac9b8b741", "580e63fc8c9a982ac9b
-
-List all orders created for a given site.
+Remove all scripts from a page applied by the App. This endpoint will not remove scripts from the site's registered scripts.
-Required scope | `ecommerce:read`
+To remove individual scripts applied by the App, use the [Add/Update Custom Code](/data/reference/custom-code/custom-code-pages/upsert-custom-code) endpoint.
+
+Access to this endpoint requires a bearer token obtained from an [OAuth Code Grant Flow](/data/reference/oauth-app).
+
+Required scope | `custom_code:write`
@@ -3942,11 +9294,7 @@ Required scope | `ecommerce:read`
-
```typescript
-await client.orders.list("580e63e98c9a982ac9b8b741", {
- status: "pending",
- offset: 1,
- limit: 1
-});
+await client.pages.scripts.deleteCustomCode("63c720f9347c2139b248e552");
```
@@ -3962,15 +9310,7 @@ await client.orders.list("580e63e98c9a982ac9b8b741", {
-
-**site_id:** `string` — Unique identifier for a Site
-
-
-
-
-
--
-
-**request:** `Webflow.OrdersListRequest`
+**page_id:** `string` — Unique identifier for a Page
@@ -3978,7 +9318,7 @@ await client.orders.list("580e63e98c9a982ac9b8b741", {
-
-**requestOptions:** `OrdersClient.RequestOptions`
+**requestOptions:** `ScriptsClient.RequestOptions`
@@ -3990,7 +9330,8 @@ await client.orders.list("580e63e98c9a982ac9b8b741", {
-client.orders.get(site_id, order_id) -> Webflow.Order
+## Sites Redirects
+client.sites.redirects.list(site_id) -> Webflow.Redirects
-
@@ -4002,10 +9343,13 @@ await client.orders.list("580e63e98c9a982ac9b8b741", {
-
-Retrieve a single product by its ID. All of its SKUs will also be
-retrieved.
+Fetch a list of all 301 redirect rules configured for a specific site.
-Required scope | `ecommerce:read`
+Use this endpoint to review, audit, or manage the redirection rules that control how traffic is rerouted on your site.
+
+This endpoint requires an Enterprise workspace.
+
+Required scope: `sites:read`
@@ -4020,7 +9364,7 @@ Required scope | `ecommerce:read`
-
```typescript
-await client.orders.get("580e63e98c9a982ac9b8b741", "5e8518516e147040726cc415");
+await client.sites.redirects.list("580e63e98c9a982ac9b8b741");
```
@@ -4044,15 +9388,7 @@ await client.orders.get("580e63e98c9a982ac9b8b741", "5e8518516e147040726cc415");
-
-**order_id:** `string` — Unique identifier for an Order
-
-
-
-
-
--
-
-**requestOptions:** `OrdersClient.RequestOptions`
+**requestOptions:** `RedirectsClient.RequestOptions`
@@ -4064,7 +9400,7 @@ await client.orders.get("580e63e98c9a982ac9b8b741", "5e8518516e147040726cc415");
-client.orders.update(site_id, order_id, { ...params }) -> Webflow.Order
+client.sites.redirects.create(site_id, { ...params }) -> Webflow.Redirect
-
@@ -4076,11 +9412,13 @@ await client.orders.get("580e63e98c9a982ac9b8b741", "5e8518516e147040726cc415");
-
-This API lets you update the fields, `comment`, `shippingProvider`,
-and/or `shippingTracking` for a given order. All three fields can be
-updated simultaneously or independently.
+Add a new 301 redirection rule to a site.
-Required scope | `ecommerce:write`
+This endpoint allows you to define a source path (`fromUrl`) and its corresponding destination path (`toUrl`), which will dictate how traffic is rerouted on your site. This is useful for managing site changes, restructuring URLs, or handling outdated links.
+
+This endpoint requires an Enterprise workspace.
+
+Required scope: `sites:write`
@@ -4095,7 +9433,11 @@ Required scope | `ecommerce:write`
-
```typescript
-await client.orders.update("580e63e98c9a982ac9b8b741", "5e8518516e147040726cc415");
+await client.sites.redirects.create("580e63e98c9a982ac9b8b741", {
+ id: "42e1a2b7aa1a13f768a0042a",
+ fromUrl: "/mostly-harmless",
+ toUrl: "/earth"
+});
```
@@ -4119,15 +9461,7 @@ await client.orders.update("580e63e98c9a982ac9b8b741", "5e8518516e147040726cc415
-
-**order_id:** `string` — Unique identifier for an Order
-
-
-
-
-
--
-
-**request:** `Webflow.OrdersUpdateRequest`
+**request:** `Webflow.Redirect`
@@ -4135,7 +9469,7 @@ await client.orders.update("580e63e98c9a982ac9b8b741", "5e8518516e147040726cc415
-
-**requestOptions:** `OrdersClient.RequestOptions`
+**requestOptions:** `RedirectsClient.RequestOptions`
@@ -4147,7 +9481,7 @@ await client.orders.update("580e63e98c9a982ac9b8b741", "5e8518516e147040726cc415
-client.orders.updateFulfill(site_id, order_id, { ...params }) -> Webflow.Order
+client.sites.redirects.delete(site_id, redirect_id) -> Webflow.Redirects
-
@@ -4159,9 +9493,13 @@ await client.orders.update("580e63e98c9a982ac9b8b741", "5e8518516e147040726cc415
-
-Updates an order's status to fulfilled
+Remove a 301 redirection rule from a site.
-Required scope | `ecommerce:write`
+This is useful for cleaning up outdated or unnecessary redirects, ensuring that your site's routing behavior remains efficient and up-to-date.
+
+This endpoint requires an Enterprise workspace.
+
+Required scope: `sites:write`
@@ -4176,7 +9514,7 @@ Required scope | `ecommerce:write`
-
```typescript
-await client.orders.updateFulfill("580e63e98c9a982ac9b8b741", "5e8518516e147040726cc415");
+await client.sites.redirects.delete("580e63e98c9a982ac9b8b741", "66c4cb9a20cac35ed19500e6");
```
@@ -4200,15 +9538,7 @@ await client.orders.updateFulfill("580e63e98c9a982ac9b8b741", "5e8518516e1470407
-
-**order_id:** `string` — Unique identifier for an Order
-
-
-
-
-
--
-
-**request:** `Webflow.OrdersUpdateFulfillRequest`
+**redirect_id:** `string` — Unique identifier site redirect
@@ -4216,7 +9546,7 @@ await client.orders.updateFulfill("580e63e98c9a982ac9b8b741", "5e8518516e1470407
-
-**requestOptions:** `OrdersClient.RequestOptions`
+**requestOptions:** `RedirectsClient.RequestOptions`
@@ -4228,7 +9558,7 @@ await client.orders.updateFulfill("580e63e98c9a982ac9b8b741", "5e8518516e1470407
-client.orders.updateUnfulfill(site_id, order_id) -> Webflow.Order
+client.sites.redirects.update(site_id, redirect_id, { ...params }) -> Webflow.Redirect
-
@@ -4240,9 +9570,11 @@ await client.orders.updateFulfill("580e63e98c9a982ac9b8b741", "5e8518516e1470407
-
-Updates an order's status to unfulfilled
+Update a 301 redirection rule from a site.
-Required scope | `ecommerce:write`
+This endpoint requires an Enterprise workspace.
+
+Required scope: `sites:write`
@@ -4257,7 +9589,11 @@ Required scope | `ecommerce:write`
-
```typescript
-await client.orders.updateUnfulfill("580e63e98c9a982ac9b8b741", "5e8518516e147040726cc415");
+await client.sites.redirects.update("580e63e98c9a982ac9b8b741", "66c4cb9a20cac35ed19500e6", {
+ id: "42e1a2b7aa1a13f768a0042a",
+ fromUrl: "/mostly-harmless",
+ toUrl: "/earth"
+});
```
@@ -4281,7 +9617,7 @@ await client.orders.updateUnfulfill("580e63e98c9a982ac9b8b741", "5e8518516e14704
-
-**order_id:** `string` — Unique identifier for an Order
+**redirect_id:** `string` — Unique identifier site redirect
@@ -4289,7 +9625,15 @@ await client.orders.updateUnfulfill("580e63e98c9a982ac9b8b741", "5e8518516e14704
-
-**requestOptions:** `OrdersClient.RequestOptions`
+**request:** `Webflow.Redirect`
+
+
+
+
+
+-
+
+**requestOptions:** `RedirectsClient.RequestOptions`
@@ -4301,7 +9645,8 @@ await client.orders.updateUnfulfill("580e63e98c9a982ac9b8b741", "5e8518516e14704
-client.orders.refund(site_id, order_id, { ...params }) -> Webflow.Order
+## Sites Plans
+client.sites.plans.getSitePlan(site_id) -> Webflow.SitePlan
-
@@ -4313,10 +9658,11 @@ await client.orders.updateUnfulfill("580e63e98c9a982ac9b8b741", "5e8518516e14704
-
-This API will reverse a Stripe charge and refund an order back to a
-customer. It will also set the order's status to `refunded`.
+Get site plan details for the specified Site.
-Required scope | `ecommerce:write`
+This endpoint requires an Enterprise workspace.
+
+Required scope | `sites:read`
@@ -4331,7 +9677,7 @@ Required scope | `ecommerce:write`
-
```typescript
-await client.orders.refund("580e63e98c9a982ac9b8b741", "5e8518516e147040726cc415");
+await client.sites.plans.getSitePlan("580e63e98c9a982ac9b8b741");
```
@@ -4355,23 +9701,7 @@ await client.orders.refund("580e63e98c9a982ac9b8b741", "5e8518516e147040726cc415
-
-**order_id:** `string` — Unique identifier for an Order
-
-
-
-
-
--
-
-**request:** `Webflow.OrdersRefundRequest`
-
-
-
-
-
--
-
-**requestOptions:** `OrdersClient.RequestOptions`
+**requestOptions:** `PlansClient.RequestOptions`
@@ -4383,8 +9713,8 @@ await client.orders.refund("580e63e98c9a982ac9b8b741", "5e8518516e147040726cc415
-## Inventory
-client.inventory.list(sku_collection_id, sku_id) -> Webflow.InventoryItem
+## Sites RobotsTxt
+client.sites.robotsTxt.get(site_id) -> Webflow.Robots
-
@@ -4396,9 +9726,11 @@ await client.orders.refund("580e63e98c9a982ac9b8b741", "5e8518516e147040726cc415
-
-List the current inventory levels for a particular SKU item.
+Retrieve the robots.txt configuration for various user agents.
+
+This endpoint requires an Enterprise workspace.
-Required scope | `ecommerce:read`
+Required scope: `site_config:read`
@@ -4413,7 +9745,7 @@ Required scope | `ecommerce:read`
-
```typescript
-await client.inventory.list("6377a7c4b7a79608c34a46f7", "5e8518516e147040726cc415");
+await client.sites.robotsTxt.get("580e63e98c9a982ac9b8b741");
```
@@ -4429,15 +9761,7 @@ await client.inventory.list("6377a7c4b7a79608c34a46f7", "5e8518516e147040726cc41
-
-**sku_collection_id:** `string` — Unique identifier for a SKU collection. Use the List Collections API to find this ID.
-
-
-
-
-
--
-
-**sku_id:** `string` — Unique identifier for a SKU
+**site_id:** `string` — Unique identifier for a Site
@@ -4445,7 +9769,7 @@ await client.inventory.list("6377a7c4b7a79608c34a46f7", "5e8518516e147040726cc41
-
-**requestOptions:** `InventoryClient.RequestOptions`
+**requestOptions:** `RobotsTxtClient.RequestOptions`
@@ -4457,7 +9781,7 @@ await client.inventory.list("6377a7c4b7a79608c34a46f7", "5e8518516e147040726cc41
-client.inventory.update(sku_collection_id, sku_id, { ...params }) -> Webflow.InventoryItem
+client.sites.robotsTxt.put(site_id, { ...params }) -> Webflow.Robots
-
@@ -4469,13 +9793,11 @@ await client.inventory.list("6377a7c4b7a79608c34a46f7", "5e8518516e147040726cc41
-
-Updates the current inventory levels for a particular SKU item.
+Replace the `robots.txt` configuration for various user agents.
-Updates may be given in one or two methods, absolutely or incrementally.
-- Absolute updates are done by setting `quantity` directly.
-- Incremental updates are by specifying the inventory delta in `updateQuantity` which is then added to the `quantity` stored on the server.
+This endpoint requires an Enterprise workspace.
-Required scope | `ecommerce:write`
+Required scope | `site_config:write`
@@ -4490,8 +9812,13 @@ Required scope | `ecommerce:write`
-
```typescript
-await client.inventory.update("6377a7c4b7a79608c34a46f7", "5e8518516e147040726cc415", {
- inventoryType: "infinite"
+await client.sites.robotsTxt.put("580e63e98c9a982ac9b8b741", {
+ rules: [{
+ userAgent: "googlebot",
+ allows: ["/public"],
+ disallows: ["/vogon-poetry", "/total-perspective-vortex"]
+ }],
+ sitemap: "https://heartofgold.ship/sitemap.xml"
});
```
@@ -4508,15 +9835,7 @@ await client.inventory.update("6377a7c4b7a79608c34a46f7", "5e8518516e147040726cc
-
-**sku_collection_id:** `string` — Unique identifier for a SKU collection. Use the List Collections API to find this ID.
-
-
-
-
-
--
-
-**sku_id:** `string` — Unique identifier for a SKU
+**site_id:** `string` — Unique identifier for a Site
@@ -4524,7 +9843,7 @@ await client.inventory.update("6377a7c4b7a79608c34a46f7", "5e8518516e147040726cc
-
-**request:** `Webflow.InventoryUpdateRequest`
+**request:** `Webflow.Robots`
@@ -4532,7 +9851,7 @@ await client.inventory.update("6377a7c4b7a79608c34a46f7", "5e8518516e147040726cc
-
-**requestOptions:** `InventoryClient.RequestOptions`
+**requestOptions:** `RobotsTxtClient.RequestOptions`
@@ -4544,8 +9863,7 @@ await client.inventory.update("6377a7c4b7a79608c34a46f7", "5e8518516e147040726cc
-## Ecommerce
-client.ecommerce.getSettings(site_id) -> Webflow.EcommerceSettings
+client.sites.robotsTxt.delete(site_id, { ...params }) -> Webflow.Robots
-
@@ -4557,9 +9875,13 @@ await client.inventory.update("6377a7c4b7a79608c34a46f7", "5e8518516e147040726cc
-
-Retrieve ecommerce settings for a site.
+Remove specific rules for a user-agent in your `robots.txt` file. To delete all rules for a user-agent, provide an empty rule set. This will remove the user-agent's entry entirely, leaving it subject to your site's default crawling behavior.
-Required scope | `ecommerce:read`
+**Note:** Deleting a user-agent with no rules will make the user-agent's access unrestricted unless other directives apply.
+
+This endpoint requires an Enterprise workspace.
+
+Required scope: `site_config:write`
@@ -4574,7 +9896,13 @@ Required scope | `ecommerce:read`
-
```typescript
-await client.ecommerce.getSettings("580e63e98c9a982ac9b8b741");
+await client.sites.robotsTxt.delete("580e63e98c9a982ac9b8b741", {
+ rules: [{
+ userAgent: "*",
+ allows: ["/public"],
+ disallows: ["/bubbles"]
+ }]
+});
```
@@ -4598,7 +9926,15 @@ await client.ecommerce.getSettings("580e63e98c9a982ac9b8b741");
-
-**requestOptions:** `EcommerceClient.RequestOptions`
+**request:** `Webflow.Robots`
+
+
+
+
+
+-
+
+**requestOptions:** `RobotsTxtClient.RequestOptions`
@@ -4610,8 +9946,7 @@ await client.ecommerce.getSettings("580e63e98c9a982ac9b8b741");
-## Collections Fields
-client.collections.fields.create(collection_id, { ...params }) -> Webflow.FieldCreate
+client.sites.robotsTxt.patch(site_id, { ...params }) -> Webflow.Robots
-
@@ -4623,13 +9958,11 @@ await client.ecommerce.getSettings("580e63e98c9a982ac9b8b741");
-
-Create a custom field in a collection.
-
-Field validation is currently not available through the API.
+Update the `robots.txt` configuration for various user agents.
-Bulk creation of fields is not supported with this endpoint. To add multiple fields at once, include them when you [create the collection.](/data/v2.0.0/reference/cms/collections/create)
+This endpoint requires an Enterprise workspace.
-Required scope | `cms:write`
+Required scope | `site_config:write`
@@ -4644,13 +9977,13 @@ Required scope | `cms:write`
-
```typescript
-await client.collections.fields.create("580e63fc8c9a982ac9b8b745", {
- id: "562ac0395358780a1f5e6fbc",
- isEditable: true,
- isRequired: false,
- type: "RichText",
- displayName: "Post Body",
- helpText: "Add the body of your post here"
+await client.sites.robotsTxt.patch("580e63e98c9a982ac9b8b741", {
+ rules: [{
+ userAgent: "googlebot",
+ allows: ["/public"],
+ disallows: ["/vogon-poetry", "/total-perspective-vortex"]
+ }],
+ sitemap: "https://heartofgold.ship/sitemap.xml"
});
```
@@ -4667,7 +10000,7 @@ await client.collections.fields.create("580e63fc8c9a982ac9b8b745", {
-
-**collection_id:** `string` — Unique identifier for a Collection
+**site_id:** `string` — Unique identifier for a Site
@@ -4675,7 +10008,7 @@ await client.collections.fields.create("580e63fc8c9a982ac9b8b745", {
-
-**request:** `Webflow.FieldCreate`
+**request:** `Webflow.Robots`
@@ -4683,7 +10016,7 @@ await client.collections.fields.create("580e63fc8c9a982ac9b8b745", {
-
-**requestOptions:** `FieldsClient.RequestOptions`
+**requestOptions:** `RobotsTxtClient.RequestOptions`
@@ -4695,7 +10028,8 @@ await client.collections.fields.create("580e63fc8c9a982ac9b8b745", {
-client.collections.fields.delete(collection_id, field_id) -> void
+## Sites WellKnown
+client.sites.wellKnown.put(site_id, { ...params }) -> void
-
@@ -4707,9 +10041,20 @@ await client.collections.fields.create("580e63fc8c9a982ac9b8b745", {
-
-Delete a custom field in a collection. This endpoint does not currently support bulk deletion.
+Upload a supported well-known file to a site.
-Required scope | `cms:write`
+The current restrictions on well-known files are as follows:
+ - Each file must be smaller than 100kb
+ - Less than 30 total files
+ - Have one of the following file extensions (or no extension): `.txt`, `.json`, `.noext`
+
+
+ `.noext` is a special file extension that removes other extensions. For example, `apple-app-site-association.noext.txt` will be uploaded as `apple-app-site-association`. Use this extension for tools that have trouble uploading extensionless files.
+
+
+This endpoint requires an Enterprise workspace.
+
+Required scope: `site_config:write`
@@ -4724,7 +10069,11 @@ Required scope | `cms:write`
-
```typescript
-await client.collections.fields.delete("580e63fc8c9a982ac9b8b745", "580e63fc8c9a982ac9b8b745");
+await client.sites.wellKnown.put("580e63e98c9a982ac9b8b741", {
+ fileName: "apple-app-site-association.txt",
+ fileData: "{\n \"applinks\": {\n \"apps\": [],\n \"details\": [\n {\n \"appID\": \"ABCDE12345.com.example.app\",\n \"paths\": [ \"/*\", \"/some/path/*\" ]\n }\n ]\n }\n}\n",
+ contentType: "application/json"
+});
```
@@ -4740,7 +10089,7 @@ await client.collections.fields.delete("580e63fc8c9a982ac9b8b745", "580e63fc8c9a
-
-**collection_id:** `string` — Unique identifier for a Collection
+**site_id:** `string` — Unique identifier for a Site
@@ -4748,7 +10097,7 @@ await client.collections.fields.delete("580e63fc8c9a982ac9b8b745", "580e63fc8c9a
-
-**field_id:** `string` — Unique identifier for a Field in a collection
+**request:** `Webflow.sites.WellKnownFile`
@@ -4756,7 +10105,7 @@ await client.collections.fields.delete("580e63fc8c9a982ac9b8b745", "580e63fc8c9a
-
-**requestOptions:** `FieldsClient.RequestOptions`
+**requestOptions:** `WellKnownClient.RequestOptions`
@@ -4768,7 +10117,7 @@ await client.collections.fields.delete("580e63fc8c9a982ac9b8b745", "580e63fc8c9a
-client.collections.fields.update(collection_id, field_id, { ...params }) -> Webflow.Field
+client.sites.wellKnown.delete(site_id, { ...params }) -> void
-
@@ -4780,9 +10129,11 @@ await client.collections.fields.delete("580e63fc8c9a982ac9b8b745", "580e63fc8c9a
-
-Update a custom field in a collection.
+Delete existing well-known files from a site.
-Required scope | `cms:write`
+This endpoint requires an Enterprise workspace.
+
+Required scope: `site_config:write`
@@ -4797,11 +10148,7 @@ Required scope | `cms:write`
-
```typescript
-await client.collections.fields.update("580e63fc8c9a982ac9b8b745", "580e63fc8c9a982ac9b8b745", {
- isRequired: false,
- displayName: "Post Body",
- helpText: "Add the body of your post here"
-});
+await client.sites.wellKnown.delete("580e63e98c9a982ac9b8b741");
```
@@ -4817,15 +10164,7 @@ await client.collections.fields.update("580e63fc8c9a982ac9b8b745", "580e63fc8c9a
-
-**collection_id:** `string` — Unique identifier for a Collection
-
-
-
-
-
--
-
-**field_id:** `string` — Unique identifier for a Field in a collection
+**site_id:** `string` — Unique identifier for a Site
@@ -4833,7 +10172,7 @@ await client.collections.fields.update("580e63fc8c9a982ac9b8b745", "580e63fc8c9a
-
-**request:** `Webflow.collections.FieldUpdate`
+**request:** `Webflow.sites.WellKnownDeleteRequest`
@@ -4841,7 +10180,7 @@ await client.collections.fields.update("580e63fc8c9a982ac9b8b745", "580e63fc8c9a
-
-**requestOptions:** `FieldsClient.RequestOptions`
+**requestOptions:** `WellKnownClient.RequestOptions`
@@ -4853,8 +10192,8 @@ await client.collections.fields.update("580e63fc8c9a982ac9b8b745", "580e63fc8c9a
-## Collections Items
-client.collections.items.listItems(collection_id, { ...params }) -> Webflow.CollectionItemList
+## Sites GoogleTag
+client.sites.googleTag.list(site_id) -> Webflow.GoogleTagIds
-
@@ -4866,9 +10205,9 @@ await client.collections.fields.update("580e63fc8c9a982ac9b8b745", "580e63fc8c9a
-
-List of all Items within a Collection.
+List all Google Tag IDs configured for a site, sorted by order.
-Required scope | `CMS:read`
+Required scope: `sites:read`
@@ -4883,15 +10222,7 @@ Required scope | `CMS:read`
-
```typescript
-await client.collections.items.listItems("580e63fc8c9a982ac9b8b745", {
- cmsLocaleId: "cmsLocaleId",
- offset: 1,
- limit: 1,
- name: "name",
- slug: "slug",
- sortBy: "createdOn",
- sortOrder: "asc"
-});
+await client.sites.googleTag.list("580e63e98c9a982ac9b8b741");
```
@@ -4907,15 +10238,7 @@ await client.collections.items.listItems("580e63fc8c9a982ac9b8b745", {
-
-**collection_id:** `string` — Unique identifier for a Collection
-
-
-
-
-
--
-
-**request:** `Webflow.collections.ItemsListItemsRequest`
+**site_id:** `string` — Unique identifier for a Site
@@ -4923,7 +10246,7 @@ await client.collections.items.listItems("580e63fc8c9a982ac9b8b745", {
-
-**requestOptions:** `ItemsClient.RequestOptions`
+**requestOptions:** `GoogleTagClient.RequestOptions`
@@ -4935,7 +10258,7 @@ await client.collections.items.listItems("580e63fc8c9a982ac9b8b745", {
-client.collections.items.createItem(collection_id, { ...params }) -> Webflow.CollectionItem
+client.sites.googleTag.deleteAll(site_id) -> void
-
@@ -4947,12 +10270,9 @@ await client.collections.items.listItems("580e63fc8c9a982ac9b8b745", {
-
-Create Item(s) in a Collection.
-
+Delete all Google Tag IDs from a site.
-To create items across multiple locales, please use [this endpoint.](/data/reference/cms/collection-items/staged-items/create-items)
-
-Required scope | `CMS:write`
+Required scope: `sites:write`
@@ -4967,51 +10287,7 @@ Required scope | `CMS:write`
-
```typescript
-await client.collections.items.createItem("580e63fc8c9a982ac9b8b745", {
- skipInvalidFiles: true,
- body: {
- isArchived: false,
- isDraft: false,
- fieldData: {
- name: "The Hitchhiker's Guide to the Galaxy",
- slug: "hitchhikers-guide-to-the-galaxy",
- "plain-text": "Don't Panic.",
- "rich-text": "
A Guide to Interstellar Travel
A towel is about the most massively useful thing an interstellar hitchhiker can have. Don't forget yours!
",
- "main-image": {
- "fileId": "62b720ef280c7a7a3be8cabe",
- "url": "/files/62b720ef280c7a7a3be8cabe_image.png"
- },
- "image-gallery": [
- {
- "fileId": "62b720ef280c7a7a3be8cabd",
- "url": "/files/62b720ef280c7a7a3be8cabd_image.png"
- },
- {
- "fileId": "62b720ef280c7a7a3be8cabe",
- "url": "/files/62b720ef280c7a7a3be8cabe_image.png"
- }
- ],
- "intro-video": "https://www.youtube.com/watch?v=aJ83KAggd-4",
- "official-site": "https://hitchhikers.fandom.com/wiki/The_Hitchhiker%27s_Guide_to_the_Galaxy",
- "contact-email": "zaphod.beeblebrox@heartofgold.gov",
- "support-phone": "424-242-4242",
- "answer-to-everything": 42,
- "release-date": "1979-10-12T00:00:00.000Z",
- "is-featured": true,
- "brand-color": "#000000",
- category: "62b720ef280c7a7a3be8cabf",
- author: "62b720ef280c7a7a3be8cab0",
- tags: [
- "62b720ef280c7a7a3be8cab1",
- "62b720ef280c7a7a3be8cab2"
- ],
- "downloadable-asset": {
- "fileId": "62b720ef280c7a7a3be8cab3",
- "url": "/files/62b720ef280c7a7a3be8cab3_document.pdf"
- }
- }
- }
-});
+await client.sites.googleTag.deleteAll("580e63e98c9a982ac9b8b741");
```
@@ -5021,21 +10297,13 @@ await client.collections.items.createItem("580e63fc8c9a982ac9b8b745", {
#### ⚙️ Parameters
-
--
-
-
--
-
-**collection_id:** `string` — Unique identifier for a Collection
-
-
-
+
+-
-
-**request:** `Webflow.collections.ItemsCreateItemRequest`
+**site_id:** `string` — Unique identifier for a Site
@@ -5043,7 +10311,7 @@ await client.collections.items.createItem("580e63fc8c9a982ac9b8b745", {
-
-**requestOptions:** `ItemsClient.RequestOptions`
+**requestOptions:** `GoogleTagClient.RequestOptions`
@@ -5055,7 +10323,7 @@ await client.collections.items.createItem("580e63fc8c9a982ac9b8b745", {
-client.collections.items.deleteItems(collection_id, { ...params }) -> void
+client.sites.googleTag.upsert(site_id, { ...params }) -> Webflow.GoogleTagIds
-
@@ -5067,11 +10335,11 @@ await client.collections.items.createItem("580e63fc8c9a982ac9b8b745", {
-
-Delete Items from a Collection.
+Add or update Google Tag IDs for a site. Existing tags not referenced in the request are preserved. A site may have a maximum of 25 tags total.
-Items will only be deleted in the primary locale unless a `cmsLocaleId` is included in the request.
+`order` is optional on input — it is auto-assigned for new tags and returned on all tags in the response.
-Required scope | `CMS:write`
+Required scope: `sites:write`
@@ -5086,9 +10354,11 @@ Required scope | `CMS:write`
-
```typescript
-await client.collections.items.deleteItems("580e63fc8c9a982ac9b8b745", {
- items: [{
- id: "580e64008c9a982ac9b8b754"
+await client.sites.googleTag.upsert("580e63e98c9a982ac9b8b741", {
+ googleTagIds: [{
+ order: 0,
+ displayName: "Main Analytics Tag",
+ tagId: "G-1234567890"
}]
});
@@ -5106,7 +10376,7 @@ await client.collections.items.deleteItems("580e63fc8c9a982ac9b8b745", {
-
-**collection_id:** `string` — Unique identifier for a Collection
+**site_id:** `string` — Unique identifier for a Site
@@ -5114,7 +10384,7 @@ await client.collections.items.deleteItems("580e63fc8c9a982ac9b8b745", {
-
-**request:** `Webflow.collections.ItemsDeleteItemsRequest`
+**request:** `Webflow.GoogleTagIds`
@@ -5122,7 +10392,7 @@ await client.collections.items.deleteItems("580e63fc8c9a982ac9b8b745", {
-
-**requestOptions:** `ItemsClient.RequestOptions`
+**requestOptions:** `GoogleTagClient.RequestOptions`
@@ -5134,7 +10404,7 @@ await client.collections.items.deleteItems("580e63fc8c9a982ac9b8b745", {
-client.collections.items.updateItems(collection_id, { ...params }) -> Webflow.ItemsUpdateItemsResponse
+client.sites.googleTag.delete(site_id, tag_id) -> Webflow.GoogleTagIds
-
@@ -5146,13 +10416,9 @@ await client.collections.items.deleteItems("580e63fc8c9a982ac9b8b745", {
-
-Update a single item or multiple items in a Collection.
-
-The limit for this endpoint is 100 items.
-
-Items will only be updated in the primary locale, unless a `cmsLocaleId` is included in the request.
+Delete a single Google Tag ID from a site. The `order` values of the remaining tags are renormalized after deletion.
-Required scope | `CMS:write`
+Required scope: `sites:write`
@@ -5167,42 +10433,7 @@ Required scope | `CMS:write`
-
```typescript
-await client.collections.items.updateItems("580e63fc8c9a982ac9b8b745", {
- skipInvalidFiles: true,
- items: [{
- id: "66f6ed9576ddacf3149d5ea6",
- cmsLocaleId: "66f6e966c9e1dc700a857ca5",
- fieldData: {
- name: "Ne Paniquez Pas",
- slug: "ne-paniquez-pas",
- featured: false
- }
- }, {
- id: "66f6ed9576ddacf3149d5ea6",
- cmsLocaleId: "66f6e966c9e1dc700a857ca4",
- fieldData: {
- name: "No Entrar en P\u00E1nico",
- slug: "no-entrar-en-panico",
- featured: false
- }
- }, {
- id: "66f6ed9576ddacf3149d5eaa",
- cmsLocaleId: "66f6e966c9e1dc700a857ca5",
- fieldData: {
- name: "Au Revoir et Merci pour Tous les Poissons",
- slug: "au-revoir-et-merci",
- featured: false
- }
- }, {
- id: "66f6ed9576ddacf3149d5eaa",
- cmsLocaleId: "66f6e966c9e1dc700a857ca4",
- fieldData: {
- name: "Hasta Luego y Gracias por Todo el Pescado",
- slug: "hasta-luego-y-gracias",
- featured: false
- }
- }]
-});
+await client.sites.googleTag.delete("580e63e98c9a982ac9b8b741", "G-XXXXXXXXXX");
```
@@ -5218,7 +10449,7 @@ await client.collections.items.updateItems("580e63fc8c9a982ac9b8b745", {
-
-**collection_id:** `string` — Unique identifier for a Collection
+**site_id:** `string` — Unique identifier for a Site
@@ -5226,7 +10457,7 @@ await client.collections.items.updateItems("580e63fc8c9a982ac9b8b745", {
-
-**request:** `Webflow.collections.ItemsUpdateItemsRequest`
+**tag_id:** `string` — The Google Tag ID (e.g. G-XXXXXXXXXX)
@@ -5234,7 +10465,7 @@ await client.collections.items.updateItems("580e63fc8c9a982ac9b8b745", {
-
-**requestOptions:** `ItemsClient.RequestOptions`
+**requestOptions:** `GoogleTagClient.RequestOptions`
@@ -5246,7 +10477,8 @@ await client.collections.items.updateItems("580e63fc8c9a982ac9b8b745", {
-client.collections.items.listItemsLive(collection_id, { ...params }) -> Webflow.CollectionItemList
+## Sites Members
+client.sites.members.listMembers(site_id, { ...params }) -> Webflow.SiteMembersResponse
-
@@ -5258,13 +10490,11 @@ await client.collections.items.updateItems("580e63fc8c9a982ac9b8b745", {
-
-List all published items in a collection.
+List the members of a site and the role each holds.
-
- Serving data to applications in real-time? Use the Content Delivery API at `api-cdn.webflow.com` for better performance. The CDN-backed endpoint is optimized for high-volume reads, while the Data API is designed for writes and management operations.
-
+This endpoint requires an Enterprise workspace.
-Required scope | `CMS:read`
+Required scope | `site_access:read`
@@ -5279,14 +10509,10 @@ Required scope | `CMS:read`
-
```typescript
-await client.collections.items.listItemsLive("580e63fc8c9a982ac9b8b745", {
- cmsLocaleId: "cmsLocaleId",
- offset: 1,
+await client.sites.members.listMembers("580e63e98c9a982ac9b8b741", {
limit: 1,
- name: "name",
- slug: "slug",
- sortBy: "createdOn",
- sortOrder: "asc"
+ email: "email",
+ cursor: "cursor"
});
```
@@ -5303,7 +10529,7 @@ await client.collections.items.listItemsLive("580e63fc8c9a982ac9b8b745", {
-
-**collection_id:** `string` — Unique identifier for a Collection
+**site_id:** `string` — Unique identifier for a Site
@@ -5311,7 +10537,7 @@ await client.collections.items.listItemsLive("580e63fc8c9a982ac9b8b745", {
-
-**request:** `Webflow.collections.ItemsListItemsLiveRequest`
+**request:** `Webflow.sites.MembersListMembersRequest`
@@ -5319,7 +10545,7 @@ await client.collections.items.listItemsLive("580e63fc8c9a982ac9b8b745", {
-
-**requestOptions:** `ItemsClient.RequestOptions`
+**requestOptions:** `MembersClient.RequestOptions`
@@ -5331,7 +10557,7 @@ await client.collections.items.listItemsLive("580e63fc8c9a982ac9b8b745", {
-client.collections.items.createItemLive(collection_id, { ...params }) -> Webflow.CollectionItem
+client.sites.members.addMember(site_id, { ...params }) -> Webflow.SiteMember
-
@@ -5343,13 +10569,13 @@ await client.collections.items.listItemsLive("580e63fc8c9a982ac9b8b745", {
-
-Create item(s) in a collection that will be immediately published to the live site.
-
+Grant a workspace member access to a site, named by `email` or `memberId`.
-To create items across multiple locales, [please use this endpoint.](/data/reference/cms/collection-items/staged-items/create-items)
+This creates access — it does not change an existing grant. A member who already has access to this site is refused with `member_already_has_access`; use `PATCH` to change their Site Role instead.
+This endpoint requires an Enterprise workspace.
-Required scope | `CMS:write`
+Required scope | `site_access:write`
@@ -5364,50 +10590,9 @@ Required scope | `CMS:write`
-
```typescript
-await client.collections.items.createItemLive("580e63fc8c9a982ac9b8b745", {
- skipInvalidFiles: true,
- body: {
- isArchived: false,
- isDraft: false,
- fieldData: {
- name: "The Hitchhiker's Guide to the Galaxy",
- slug: "hitchhikers-guide-to-the-galaxy",
- "plain-text": "Don't Panic.",
- "rich-text": "
A Guide to Interstellar Travel
A towel is about the most massively useful thing an interstellar hitchhiker can have. Don't forget yours!
",
- "main-image": {
- "fileId": "62b720ef280c7a7a3be8cabe",
- "url": "/files/62b720ef280c7a7a3be8cabe_image.png"
- },
- "image-gallery": [
- {
- "fileId": "62b720ef280c7a7a3be8cabd",
- "url": "/files/62b720ef280c7a7a3be8cabd_image.png"
- },
- {
- "fileId": "62b720ef280c7a7a3be8cabe",
- "url": "/files/62b720ef280c7a7a3be8cabe_image.png"
- }
- ],
- "intro-video": "https://www.youtube.com/watch?v=aJ83KAggd-4",
- "official-site": "https://hitchhikers.fandom.com/wiki/The_Hitchhiker%27s_Guide_to_the_Galaxy",
- "contact-email": "zaphod.beeblebrox@heartofgold.gov",
- "support-phone": "424-242-4242",
- "answer-to-everything": 42,
- "release-date": "1979-10-12T00:00:00.000Z",
- "is-featured": true,
- "brand-color": "#000000",
- category: "62b720ef280c7a7a3be8cabf",
- author: "62b720ef280c7a7a3be8cab0",
- tags: [
- "62b720ef280c7a7a3be8cab1",
- "62b720ef280c7a7a3be8cab2"
- ],
- "downloadable-asset": {
- "fileId": "62b720ef280c7a7a3be8cab3",
- "url": "/files/62b720ef280c7a7a3be8cab3_document.pdf"
- }
- }
- }
+await client.sites.members.addMember("580e63e98c9a982ac9b8b741", {
+ email: "waylon.dalton@example.com",
+ siteRole: "designer"
});
```
@@ -5424,7 +10609,7 @@ await client.collections.items.createItemLive("580e63fc8c9a982ac9b8b745", {
-
-**collection_id:** `string` — Unique identifier for a Collection
+**site_id:** `string` — Unique identifier for a Site
@@ -5432,7 +10617,7 @@ await client.collections.items.createItemLive("580e63fc8c9a982ac9b8b745", {
-
-**request:** `Webflow.collections.ItemsCreateItemLiveRequest`
+**request:** `Webflow.sites.GrantSiteMemberRequestBody`
@@ -5440,7 +10625,7 @@ await client.collections.items.createItemLive("580e63fc8c9a982ac9b8b745", {
-
-**requestOptions:** `ItemsClient.RequestOptions`
+**requestOptions:** `MembersClient.RequestOptions`
@@ -5452,7 +10637,7 @@ await client.collections.items.createItemLive("580e63fc8c9a982ac9b8b745", {
-client.collections.items.deleteItemsLive(collection_id, { ...params }) -> void
+client.sites.members.removeMemberByEmail(site_id, { ...params }) -> void
-
@@ -5464,11 +10649,15 @@ await client.collections.items.createItemLive("580e63fc8c9a982ac9b8b745", {
-
-Unpublish up to 100 items from the live site and set the `isDraft` property to `true`.
+Remove a member's access to a site, identifying them by email address.
-Items will only be unpublished in the primary locale unless a `cmsLocaleId` is included in the request.
+Idempotent on a member who already holds no access to this site — nothing is revoked and this reports success. Not idempotent on someone who isn't a workspace member at all, which returns a `404`.
-Required scope | `CMS:write`
+Equivalent to [Revoke Site Access](/data/reference/enterprise/site-access/remove-member), which identifies the member by ID instead.
+
+This endpoint requires an Enterprise workspace.
+
+Required scope | `site_access:write`
@@ -5483,10 +10672,8 @@ Required scope | `CMS:write`
-
```typescript
-await client.collections.items.deleteItemsLive("580e63fc8c9a982ac9b8b745", {
- items: [{
- id: "580e64008c9a982ac9b8b754"
- }]
+await client.sites.members.removeMemberByEmail("580e63e98c9a982ac9b8b741", {
+ email: "email"
});
```
@@ -5503,7 +10690,7 @@ await client.collections.items.deleteItemsLive("580e63fc8c9a982ac9b8b745", {
-
-**collection_id:** `string` — Unique identifier for a Collection
+**site_id:** `string` — Unique identifier for a Site
@@ -5511,7 +10698,7 @@ await client.collections.items.deleteItemsLive("580e63fc8c9a982ac9b8b745", {
-
-**request:** `Webflow.collections.ItemsDeleteItemsLiveRequest`
+**request:** `Webflow.sites.MembersRemoveMemberByEmailRequest`
@@ -5519,7 +10706,7 @@ await client.collections.items.deleteItemsLive("580e63fc8c9a982ac9b8b745", {
-
-**requestOptions:** `ItemsClient.RequestOptions`
+**requestOptions:** `MembersClient.RequestOptions`
@@ -5531,7 +10718,7 @@ await client.collections.items.deleteItemsLive("580e63fc8c9a982ac9b8b745", {
-client.collections.items.updateItemsLive(collection_id, { ...params }) -> Webflow.CollectionItemListNoPagination
+client.sites.members.updateMemberRoleByEmail(site_id, { ...params }) -> Webflow.SiteMember
-
@@ -5543,11 +10730,15 @@ await client.collections.items.deleteItemsLive("580e63fc8c9a982ac9b8b745", {
-
-Update a single published item or multiple published items (up to 100) in a Collection
+Update a site member's role, identifying them by email address.
-Items will only be updated in the primary locale, unless a `cmsLocaleId` is included in the request.
+On a site with Site-specific access enabled, the member must already hold access to this site — grant it first with `POST`. On a site open to the whole workspace, this call sets a per-site role for the first time.
-Required scope | `CMS:write`
+Equivalent to [Update Site Member Role](/data/reference/enterprise/site-access/update-member-role), which identifies the member by ID instead.
+
+This endpoint requires an Enterprise workspace.
+
+Required scope | `site_access:write`
@@ -5562,41 +10753,11 @@ Required scope | `CMS:write`
-
```typescript
-await client.collections.items.updateItemsLive("580e63fc8c9a982ac9b8b745", {
- skipInvalidFiles: true,
- items: [{
- id: "66f6ed9576ddacf3149d5ea6",
- cmsLocaleId: "66f6e966c9e1dc700a857ca5",
- fieldData: {
- name: "Ne Paniquez Pas",
- slug: "ne-paniquez-pas",
- featured: false
- }
- }, {
- id: "66f6ed9576ddacf3149d5ea6",
- cmsLocaleId: "66f6e966c9e1dc700a857ca4",
- fieldData: {
- name: "No Entrar en P\u00E1nico",
- slug: "no-entrar-en-panico",
- featured: false
- }
- }, {
- id: "66f6ed9576ddacf3149d5eaa",
- cmsLocaleId: "66f6e966c9e1dc700a857ca5",
- fieldData: {
- name: "Au Revoir et Merci pour Tous les Poissons",
- slug: "au-revoir-et-merci",
- featured: false
- }
- }, {
- id: "66f6ed9576ddacf3149d5eaa",
- cmsLocaleId: "66f6e966c9e1dc700a857ca4",
- fieldData: {
- name: "Hasta Luego y Gracias por Todo el Pescado",
- slug: "hasta-luego-y-gracias",
- featured: false
- }
- }]
+await client.sites.members.updateMemberRoleByEmail("580e63e98c9a982ac9b8b741", {
+ email: "email",
+ body: {
+ siteRole: "content_editor"
+ }
});
```
@@ -5613,7 +10774,7 @@ await client.collections.items.updateItemsLive("580e63fc8c9a982ac9b8b745", {
-
-**collection_id:** `string` — Unique identifier for a Collection
+**site_id:** `string` — Unique identifier for a Site
@@ -5621,7 +10782,7 @@ await client.collections.items.updateItemsLive("580e63fc8c9a982ac9b8b745", {
-
-**request:** `Webflow.collections.ItemsUpdateItemsLiveRequest`
+**request:** `Webflow.sites.MembersUpdateMemberRoleByEmailRequest`
@@ -5629,7 +10790,7 @@ await client.collections.items.updateItemsLive("580e63fc8c9a982ac9b8b745", {
-
-**requestOptions:** `ItemsClient.RequestOptions`
+**requestOptions:** `MembersClient.RequestOptions`
@@ -5641,7 +10802,7 @@ await client.collections.items.updateItemsLive("580e63fc8c9a982ac9b8b745", {
-client.collections.items.createItems(collection_id, { ...params }) -> Webflow.BulkCollectionItem
+client.sites.members.removeMember(site_id, member_id) -> void
-
@@ -5653,14 +10814,15 @@ await client.collections.items.updateItemsLive("580e63fc8c9a982ac9b8b745", {
-
-Create an item or multiple items in a CMS Collection across multiple corresponding locales.
+Remove a member's access to a site.
-
- - This endpoint can create up to 100 items in a request.
- - If the `cmsLocaleIds` parameter is not included in the request, an item will only be created in the primary locale.
-
+Idempotent on a member who already holds no access to this site — nothing is revoked and this reports success. Not idempotent on someone who isn't a workspace member at all, which returns a `404`.
-Required scope | `CMS:write`
+To revoke by email address instead of by ID, see [Revoke Site Access (by email)](/data/reference/enterprise/site-access/remove-member-by-email).
+
+This endpoint requires an Enterprise workspace.
+
+Required scope | `site_access:write`
@@ -5675,16 +10837,7 @@ Required scope | `CMS:write`
-
```typescript
-await client.collections.items.createItems("580e63fc8c9a982ac9b8b745", {
- skipInvalidFiles: true,
- cmsLocaleIds: ["66f6e966c9e1dc700a857ca3", "66f6e966c9e1dc700a857ca4", "66f6e966c9e1dc700a857ca5"],
- isArchived: false,
- isDraft: false,
- fieldData: {
- name: "Don\u2019t Panic",
- slug: "dont-panic"
- }
-});
+await client.sites.members.removeMember("580e63e98c9a982ac9b8b741", "62fa5e47f6b8256f4641c5bd");
```
@@ -5700,7 +10853,7 @@ await client.collections.items.createItems("580e63fc8c9a982ac9b8b745", {
-
-**collection_id:** `string` — Unique identifier for a Collection
+**site_id:** `string` — Unique identifier for a Site
@@ -5708,7 +10861,7 @@ await client.collections.items.createItems("580e63fc8c9a982ac9b8b745", {
-
-**request:** `Webflow.collections.CreateBulkCollectionItemRequestBody`
+**member_id:** `string` — Unique identifier for a Member
@@ -5716,7 +10869,7 @@ await client.collections.items.createItems("580e63fc8c9a982ac9b8b745", {
-
-**requestOptions:** `ItemsClient.RequestOptions`
+**requestOptions:** `MembersClient.RequestOptions`
@@ -5728,7 +10881,7 @@ await client.collections.items.createItems("580e63fc8c9a982ac9b8b745", {
-client.collections.items.getItem(collection_id, item_id, { ...params }) -> Webflow.CollectionItem
+client.sites.members.updateMemberRole(site_id, member_id, { ...params }) -> Webflow.SiteMember
-
@@ -5740,9 +10893,15 @@ await client.collections.items.createItems("580e63fc8c9a982ac9b8b745", {
-
-Get details of a selected Collection Item.
+Update a site member's role.
-Required scope | `CMS:read`
+On a site with Site-specific access enabled, the member must already hold access to this site — grant it first with `POST`. On a site open to the whole workspace, this call sets a per-site role for the first time.
+
+To update by email address instead of by ID, see [Update Site Member Role (by email)](/data/reference/enterprise/site-access/update-member-role-by-email).
+
+This endpoint requires an Enterprise workspace.
+
+Required scope | `site_access:write`
@@ -5757,8 +10916,8 @@ Required scope | `CMS:read`
-
```typescript
-await client.collections.items.getItem("580e63fc8c9a982ac9b8b745", "580e64008c9a982ac9b8b754", {
- cmsLocaleId: "cmsLocaleId"
+await client.sites.members.updateMemberRole("580e63e98c9a982ac9b8b741", "62fa5e47f6b8256f4641c5bd", {
+ siteRole: "content_editor"
});
```
@@ -5775,7 +10934,7 @@ await client.collections.items.getItem("580e63fc8c9a982ac9b8b745", "580e64008c9a
-
-**collection_id:** `string` — Unique identifier for a Collection
+**site_id:** `string` — Unique identifier for a Site
@@ -5783,7 +10942,7 @@ await client.collections.items.getItem("580e63fc8c9a982ac9b8b745", "580e64008c9a
-
-**item_id:** `string` — Unique identifier for an Item
+**member_id:** `string` — Unique identifier for a Member
@@ -5791,7 +10950,7 @@ await client.collections.items.getItem("580e63fc8c9a982ac9b8b745", "580e64008c9a
-
-**request:** `Webflow.collections.ItemsGetItemRequest`
+**request:** `Webflow.UpdateSiteMemberRoleRequestBody`
@@ -5799,7 +10958,7 @@ await client.collections.items.getItem("580e63fc8c9a982ac9b8b745", "580e64008c9a
-
-**requestOptions:** `ItemsClient.RequestOptions`
+**requestOptions:** `MembersClient.RequestOptions`
@@ -5811,7 +10970,8 @@ await client.collections.items.getItem("580e63fc8c9a982ac9b8b745", "580e64008c9a
-client.collections.items.deleteItem(collection_id, item_id, { ...params }) -> void
+## Sites ActivityLogs
+client.sites.activityLogs.list(site_id, { ...params }) -> Webflow.SiteActivityLogResponse
-
@@ -5823,9 +10983,11 @@ await client.collections.items.getItem("580e63fc8c9a982ac9b8b745", "580e64008c9a
-
-Delete an item from a collection.
+Retrieve Activity Logs for a specific Site.
-Required scope | `CMS:write`
+This endpoint requires an Enterprise workspace.
+
+Required scope: `site_activity:read`
@@ -5840,8 +11002,9 @@ Required scope | `CMS:write`
-
```typescript
-await client.collections.items.deleteItem("580e63fc8c9a982ac9b8b745", "580e64008c9a982ac9b8b754", {
- cmsLocaleId: "cmsLocaleId"
+await client.sites.activityLogs.list("580e63e98c9a982ac9b8b741", {
+ limit: 1,
+ offset: 1
});
```
@@ -5850,23 +11013,15 @@ await client.collections.items.deleteItem("580e63fc8c9a982ac9b8b745", "580e64008
-#### ⚙️ Parameters
-
-
--
-
+#### ⚙️ Parameters
+
-
-**collection_id:** `string` — Unique identifier for a Collection
-
-
-
-
-
-**item_id:** `string` — Unique identifier for an Item
+**site_id:** `string` — Unique identifier for a Site
@@ -5874,7 +11029,7 @@ await client.collections.items.deleteItem("580e63fc8c9a982ac9b8b745", "580e64008
-
-**request:** `Webflow.collections.ItemsDeleteItemRequest`
+**request:** `Webflow.sites.ActivityLogsListRequest`
@@ -5882,7 +11037,7 @@ await client.collections.items.deleteItem("580e63fc8c9a982ac9b8b745", "580e64008
-
-**requestOptions:** `ItemsClient.RequestOptions`
+**requestOptions:** `ActivityLogsClient.RequestOptions`
@@ -5894,7 +11049,8 @@ await client.collections.items.deleteItem("580e63fc8c9a982ac9b8b745", "580e64008
-client.collections.items.updateItem(collection_id, item_id, { ...params }) -> Webflow.CollectionItem
+## Sites Comments
+client.sites.comments.listCommentThreads(site_id, { ...params }) -> Webflow.CommentThreadList
-
@@ -5906,9 +11062,13 @@ await client.collections.items.deleteItem("580e63fc8c9a982ac9b8b745", "580e64008
-
-Update a selected Item in a Collection.
+List all comment threads for a site.
-Required scope | `CMS:write`
+
+ There may be a delay of up to 5 minutes before new comments appear in the system.
+
+
+Required scope | `comments:read`
@@ -5923,50 +11083,12 @@ Required scope | `CMS:write`
-
```typescript
-await client.collections.items.updateItem("580e63fc8c9a982ac9b8b745", "580e64008c9a982ac9b8b754", {
- skipInvalidFiles: true,
- body: {
- isArchived: false,
- isDraft: false,
- fieldData: {
- name: "The Hitchhiker's Guide to the Galaxy",
- slug: "hitchhikers-guide-to-the-galaxy",
- "plain-text": "Don't Panic.",
- "rich-text": "
A Guide to Interstellar Travel
A towel is about the most massively useful thing an interstellar hitchhiker can have. Don't forget yours!
",
- "main-image": {
- "fileId": "62b720ef280c7a7a3be8cabe",
- "url": "/files/62b720ef280c7a7a3be8cabe_image.png"
- },
- "image-gallery": [
- {
- "fileId": "62b720ef280c7a7a3be8cabd",
- "url": "/files/62b720ef280c7a7a3be8cabd_image.png"
- },
- {
- "fileId": "62b720ef280c7a7a3be8cabe",
- "url": "/files/62b720ef280c7a7a3be8cabe_image.png"
- }
- ],
- "intro-video": "https://www.youtube.com/watch?v=aJ83KAggd-4",
- "official-site": "https://hitchhikers.fandom.com/wiki/The_Hitchhiker%27s_Guide_to_the_Galaxy",
- "contact-email": "zaphod.beeblebrox@heartofgold.gov",
- "support-phone": "424-242-4242",
- "answer-to-everything": 42,
- "release-date": "1979-10-12T00:00:00.000Z",
- "is-featured": true,
- "brand-color": "#000000",
- category: "62b720ef280c7a7a3be8cabf",
- author: "62b720ef280c7a7a3be8cab0",
- tags: [
- "62b720ef280c7a7a3be8cab1",
- "62b720ef280c7a7a3be8cab2"
- ],
- "downloadable-asset": {
- "fileId": "62b720ef280c7a7a3be8cab3",
- "url": "/files/62b720ef280c7a7a3be8cab3_document.pdf"
- }
- }
- }
+await client.sites.comments.listCommentThreads("580e63e98c9a982ac9b8b741", {
+ localeId: "65427cf400e02b306eaa04a0",
+ offset: 1,
+ limit: 1,
+ sortBy: "createdOn",
+ sortOrder: "asc"
});
```
@@ -5983,15 +11105,7 @@ await client.collections.items.updateItem("580e63fc8c9a982ac9b8b745", "580e64008
-
-**collection_id:** `string` — Unique identifier for a Collection
-
-
-
-
-
--
-
-**item_id:** `string` — Unique identifier for an Item
+**site_id:** `string` — Unique identifier for a Site
@@ -5999,7 +11113,7 @@ await client.collections.items.updateItem("580e63fc8c9a982ac9b8b745", "580e64008
-
-**request:** `Webflow.collections.ItemsUpdateItemRequest`
+**request:** `Webflow.sites.CommentsListCommentThreadsRequest`
@@ -6007,7 +11121,7 @@ await client.collections.items.updateItem("580e63fc8c9a982ac9b8b745", "580e64008
-
-**requestOptions:** `ItemsClient.RequestOptions`
+**requestOptions:** `CommentsClient.RequestOptions`
@@ -6019,7 +11133,7 @@ await client.collections.items.updateItem("580e63fc8c9a982ac9b8b745", "580e64008
-client.collections.items.getItemLive(collection_id, item_id, { ...params }) -> Webflow.CollectionItem
+client.sites.comments.getCommentThread(site_id, comment_thread_id, { ...params }) -> Webflow.CommentThread
-
@@ -6031,13 +11145,13 @@ await client.collections.items.updateItem("580e63fc8c9a982ac9b8b745", "580e64008
-
-Get details of a selected Collection live Item.
+Get details of a specific comment thread.
-
- Serving data to applications in real-time? Use the Content Delivery API at `api-cdn.webflow.com` for better performance. The CDN-backed endpoint is optimized for high-volume reads, while the Data API is designed for writes and management operations.
-
+
+ There may be a delay of up to 5 minutes before new comments appear in the system.
+
-Required scope | `CMS:read`
+Required scope | `comments:read`
@@ -6052,8 +11166,12 @@ Required scope | `CMS:read`
-
```typescript
-await client.collections.items.getItemLive("580e63fc8c9a982ac9b8b745", "580e64008c9a982ac9b8b754", {
- cmsLocaleId: "cmsLocaleId"
+await client.sites.comments.getCommentThread("580e63e98c9a982ac9b8b741", "580e63e98c9a982ac9b8b741", {
+ localeId: "65427cf400e02b306eaa04a0",
+ offset: 1,
+ limit: 1,
+ sortBy: "createdOn",
+ sortOrder: "asc"
});
```
@@ -6070,7 +11188,7 @@ await client.collections.items.getItemLive("580e63fc8c9a982ac9b8b745", "580e6400
-
-**collection_id:** `string` — Unique identifier for a Collection
+**site_id:** `string` — Unique identifier for a Site
@@ -6078,7 +11196,7 @@ await client.collections.items.getItemLive("580e63fc8c9a982ac9b8b745", "580e6400
-
-**item_id:** `string` — Unique identifier for an Item
+**comment_thread_id:** `string` — Unique identifier for a Comment Thread
@@ -6086,7 +11204,7 @@ await client.collections.items.getItemLive("580e63fc8c9a982ac9b8b745", "580e6400
-
-**request:** `Webflow.collections.ItemsGetItemLiveRequest`
+**request:** `Webflow.sites.CommentsGetCommentThreadRequest`
@@ -6094,7 +11212,7 @@ await client.collections.items.getItemLive("580e63fc8c9a982ac9b8b745", "580e6400
-
-**requestOptions:** `ItemsClient.RequestOptions`
+**requestOptions:** `CommentsClient.RequestOptions`
@@ -6106,7 +11224,7 @@ await client.collections.items.getItemLive("580e63fc8c9a982ac9b8b745", "580e6400
-client.collections.items.deleteItemLive(collection_id, item_id, { ...params }) -> void
+client.sites.comments.resolveCommentThread(site_id, comment_thread_id, { ...params }) -> Webflow.CommentThread
-
@@ -6118,11 +11236,13 @@ await client.collections.items.getItemLive("580e63fc8c9a982ac9b8b745", "580e6400
-
-Unpublish a live item from the site and set the `isDraft` property to `true`.
+Resolve or unresolve a comment thread.
-For bulk unpublishing, please use [this endpoint.](/data/v2.0.0/reference/cms/collection-items/live-items/delete-items-live)
+
+ This endpoint is rate limited to 60 requests per minute per site.
+
-Required scope | `CMS:write`
+Required scope | `comments:write`
@@ -6137,8 +11257,8 @@ Required scope | `CMS:write`
-
```typescript
-await client.collections.items.deleteItemLive("580e63fc8c9a982ac9b8b745", "580e64008c9a982ac9b8b754", {
- cmsLocaleId: "cmsLocaleId"
+await client.sites.comments.resolveCommentThread("580e63e98c9a982ac9b8b741", "580e63e98c9a982ac9b8b741", {
+ resolved: true
});
```
@@ -6155,7 +11275,7 @@ await client.collections.items.deleteItemLive("580e63fc8c9a982ac9b8b745", "580e6
-
-**collection_id:** `string` — Unique identifier for a Collection
+**site_id:** `string` — Unique identifier for a Site
@@ -6163,7 +11283,7 @@ await client.collections.items.deleteItemLive("580e63fc8c9a982ac9b8b745", "580e6
-
-**item_id:** `string` — Unique identifier for an Item
+**comment_thread_id:** `string` — Unique identifier for a Comment Thread
@@ -6171,7 +11291,7 @@ await client.collections.items.deleteItemLive("580e63fc8c9a982ac9b8b745", "580e6
-
-**request:** `Webflow.collections.ItemsDeleteItemLiveRequest`
+**request:** `Webflow.sites.ResolveCommentThreadRequest`
@@ -6179,7 +11299,7 @@ await client.collections.items.deleteItemLive("580e63fc8c9a982ac9b8b745", "580e6
-
-**requestOptions:** `ItemsClient.RequestOptions`
+**requestOptions:** `CommentsClient.RequestOptions`
@@ -6191,7 +11311,7 @@ await client.collections.items.deleteItemLive("580e63fc8c9a982ac9b8b745", "580e6
-client.collections.items.updateItemLive(collection_id, item_id, { ...params }) -> Webflow.CollectionItem
+client.sites.comments.listCommentReplies(site_id, comment_thread_id, { ...params }) -> Webflow.CommentReplyList
-
@@ -6203,9 +11323,13 @@ await client.collections.items.deleteItemLive("580e63fc8c9a982ac9b8b745", "580e6
-
-Update a selected live Item in a Collection. The updates for this Item will be published to the live site.
+List all replies to a specific comment thread.
-Required scope | `CMS:write`
+
+ There may be a delay of up to 5 minutes before new comments appear in the system.
+
+
+Required scope | `comments:read`
@@ -6220,50 +11344,12 @@ Required scope | `CMS:write`
-
```typescript
-await client.collections.items.updateItemLive("580e63fc8c9a982ac9b8b745", "580e64008c9a982ac9b8b754", {
- skipInvalidFiles: true,
- body: {
- isArchived: false,
- isDraft: false,
- fieldData: {
- name: "The Hitchhiker's Guide to the Galaxy",
- slug: "hitchhikers-guide-to-the-galaxy",
- "plain-text": "Don't Panic.",
- "rich-text": "
A Guide to Interstellar Travel
A towel is about the most massively useful thing an interstellar hitchhiker can have. Don't forget yours!
",
- "main-image": {
- "fileId": "62b720ef280c7a7a3be8cabe",
- "url": "/files/62b720ef280c7a7a3be8cabe_image.png"
- },
- "image-gallery": [
- {
- "fileId": "62b720ef280c7a7a3be8cabd",
- "url": "/files/62b720ef280c7a7a3be8cabd_image.png"
- },
- {
- "fileId": "62b720ef280c7a7a3be8cabe",
- "url": "/files/62b720ef280c7a7a3be8cabe_image.png"
- }
- ],
- "intro-video": "https://www.youtube.com/watch?v=aJ83KAggd-4",
- "official-site": "https://hitchhikers.fandom.com/wiki/The_Hitchhiker%27s_Guide_to_the_Galaxy",
- "contact-email": "zaphod.beeblebrox@heartofgold.gov",
- "support-phone": "424-242-4242",
- "answer-to-everything": 42,
- "release-date": "1979-10-12T00:00:00.000Z",
- "is-featured": true,
- "brand-color": "#000000",
- category: "62b720ef280c7a7a3be8cabf",
- author: "62b720ef280c7a7a3be8cab0",
- tags: [
- "62b720ef280c7a7a3be8cab1",
- "62b720ef280c7a7a3be8cab2"
- ],
- "downloadable-asset": {
- "fileId": "62b720ef280c7a7a3be8cab3",
- "url": "/files/62b720ef280c7a7a3be8cab3_document.pdf"
- }
- }
- }
+await client.sites.comments.listCommentReplies("580e63e98c9a982ac9b8b741", "580e63e98c9a982ac9b8b741", {
+ localeId: "65427cf400e02b306eaa04a0",
+ offset: 1,
+ limit: 1,
+ sortBy: "createdOn",
+ sortOrder: "asc"
});
```
@@ -6280,7 +11366,7 @@ await client.collections.items.updateItemLive("580e63fc8c9a982ac9b8b745", "580e6
-
-**collection_id:** `string` — Unique identifier for a Collection
+**site_id:** `string` — Unique identifier for a Site
@@ -6288,7 +11374,7 @@ await client.collections.items.updateItemLive("580e63fc8c9a982ac9b8b745", "580e6
-
-**item_id:** `string` — Unique identifier for an Item
+**comment_thread_id:** `string` — Unique identifier for a Comment Thread
@@ -6296,7 +11382,7 @@ await client.collections.items.updateItemLive("580e63fc8c9a982ac9b8b745", "580e6
-
-**request:** `Webflow.collections.ItemsUpdateItemLiveRequest`
+**request:** `Webflow.sites.CommentsListCommentRepliesRequest`
@@ -6304,7 +11390,7 @@ await client.collections.items.updateItemLive("580e63fc8c9a982ac9b8b745", "580e6
-
-**requestOptions:** `ItemsClient.RequestOptions`
+**requestOptions:** `CommentsClient.RequestOptions`
@@ -6316,7 +11402,7 @@ await client.collections.items.updateItemLive("580e63fc8c9a982ac9b8b745", "580e6
-client.collections.items.publishItem(collection_id, { ...params }) -> Webflow.ItemsPublishItemResponse
+client.sites.comments.createCommentReply(site_id, comment_thread_id, { ...params }) -> Webflow.CommentReply
-
@@ -6328,9 +11414,16 @@ await client.collections.items.updateItemLive("580e63fc8c9a982ac9b8b745", "580e6
-
-Publish an item or multiple items.
+Create a reply to an existing comment thread.
-Required scope | `cms:write`
+The reply author is always the user who authorized the OAuth token.
+To @mention a user in the reply, include their user ID in double square brackets in the `content` field, as in `[[userId]]`.
+
+
+ The `comment_created` webhook fires automatically when a reply is created.
+
+
+Required scope | `comments:write`
@@ -6345,8 +11438,8 @@ Required scope | `cms:write`
-
```typescript
-await client.collections.items.publishItem("580e63fc8c9a982ac9b8b745", {
- itemIds: ["643fd856d66b6528195ee2ca", "643fd856d66b6528195ee2cb", "643fd856d66b6528195ee2cc"]
+await client.sites.comments.createCommentReply("580e63e98c9a982ac9b8b741", "580e63e98c9a982ac9b8b741", {
+ content: "Thanks for the feedback [[6287ec36a841b25637c663df]]!"
});
```
@@ -6363,7 +11456,7 @@ await client.collections.items.publishItem("580e63fc8c9a982ac9b8b745", {
-
-**collection_id:** `string` — Unique identifier for a Collection
+**site_id:** `string` — Unique identifier for a Site
@@ -6371,7 +11464,7 @@ await client.collections.items.publishItem("580e63fc8c9a982ac9b8b745", {
-
-**request:** `Webflow.ItemsPublishItemRequest`
+**comment_thread_id:** `string` — Unique identifier for a Comment Thread
@@ -6379,7 +11472,15 @@ await client.collections.items.publishItem("580e63fc8c9a982ac9b8b745", {
-
-**requestOptions:** `ItemsClient.RequestOptions`
+**request:** `Webflow.sites.CreateCommentReplyRequest`
+
+
+
+
+
+-
+
+**requestOptions:** `CommentsClient.RequestOptions`
@@ -6391,8 +11492,8 @@ await client.collections.items.publishItem("580e63fc8c9a982ac9b8b745", {
-## Pages Scripts
-client.pages.scripts.getCustomCode(page_id) -> Webflow.ScriptApplyList
+## Sites Scripts
+client.sites.scripts.getCustomCode(site_id) -> Webflow.ScriptApplyList
-
@@ -6404,7 +11505,13 @@ await client.collections.items.publishItem("580e63fc8c9a982ac9b8b745", {
-
-Get all scripts applied to a page.
+Get all scripts applied to a site by the App.
+
+
+ To apply a script to a site or page, the script must first be registered to a site via the [Register Script](/data/reference/custom-code/custom-code/register-hosted) endpoints. Once registered, the script can be applied to a Site or Page using the appropriate endpoints. See the documentation on [working with Custom Code](/data/docs/custom-code) for more information.
+
+
+Access to this endpoint requires a bearer token obtained from an [OAuth Code Grant Flow](/data/reference/oauth-app).
Required scope | `custom_code:read`
@@ -6421,7 +11528,7 @@ Required scope | `custom_code:read`
-
```typescript
-await client.pages.scripts.getCustomCode("63c720f9347c2139b248e552");
+await client.sites.scripts.getCustomCode("580e63e98c9a982ac9b8b741");
```
@@ -6437,7 +11544,7 @@ await client.pages.scripts.getCustomCode("63c720f9347c2139b248e552");
-
-**page_id:** `string` — Unique identifier for a Page
+**site_id:** `string` — Unique identifier for a Site
@@ -6457,7 +11564,7 @@ await client.pages.scripts.getCustomCode("63c720f9347c2139b248e552");
-client.pages.scripts.upsertCustomCode(page_id, { ...params }) -> Webflow.ScriptApplyList
+client.sites.scripts.upsertCustomCode(site_id, { ...params }) -> Webflow.ScriptApplyList
-
@@ -6469,12 +11576,14 @@ await client.pages.scripts.getCustomCode("63c720f9347c2139b248e552");
-
-Apply registered scripts to a page. If you have multiple scripts your App needs to apply or maintain on a page, ensure they are always included in the request body for this endpoint. To remove individual scripts, simply call this endpoint without the script in the request body.
+Apply registered scripts to a site. If you have multiple scripts your App needs to apply or maintain on a site, ensure they are always included in the request body for this endpoint. To remove individual scripts, simply call this endpoint without the script in the request body.
- To apply a script to a page, the script must first be registered to a Site via the [Register Script](/data/reference/custom-code/custom-code/register-hosted) endpoints. Once registered, the script can be applied to a Site or Page using the appropriate endpoints. See the documentation on [working with Custom Code](/data/docs/custom-code) for more information.
+ To apply a script to a site or page, the script must first be registered to a site via the [Register Script](/data/reference/custom-code/custom-code/register-hosted) endpoints. Once registered, the script can be applied to a Site or Page using the appropriate endpoints. See the documentation on [working with Custom Code](/data/docs/custom-code) for more information.
+Access to this endpoint requires a bearer token obtained from an [OAuth Code Grant Flow](/data/reference/oauth-app).
+
Required scope | `custom_code:write`
@@ -6490,7 +11599,7 @@ Required scope | `custom_code:write`
-
```typescript
-await client.pages.scripts.upsertCustomCode("63c720f9347c2139b248e552", {
+await client.sites.scripts.upsertCustomCode("580e63e98c9a982ac9b8b741", {
scripts: [{
id: "cms_slider",
location: "header",
@@ -6519,7 +11628,7 @@ await client.pages.scripts.upsertCustomCode("63c720f9347c2139b248e552", {
-
-**page_id:** `string` — Unique identifier for a Page
+**site_id:** `string` — Unique identifier for a Site
@@ -6547,7 +11656,7 @@ await client.pages.scripts.upsertCustomCode("63c720f9347c2139b248e552", {
-client.pages.scripts.deleteCustomCode(page_id) -> void
+client.sites.scripts.deleteCustomCode(site_id) -> void
-
@@ -6559,9 +11668,9 @@ await client.pages.scripts.upsertCustomCode("63c720f9347c2139b248e552", {
-
-Remove all scripts from a page applied by the App. This endpoint will not remove scripts from the site's registered scripts.
+Remove all scripts from a site applied by the App. This endpoint will not remove scripts from the site's registered scripts.
-To remove individual scripts applied by the App, use the [Add/Update Custom Code](/data/reference/custom-code/custom-code-pages/upsert-custom-code) endpoint.
+To remove individual scripts applied by the App, use the [Add/Update Custom Code](/data/reference/custom-code/custom-code-sites/upsert-custom-code) endpoint.
Access to this endpoint requires a bearer token obtained from an [OAuth Code Grant Flow](/data/reference/oauth-app).
@@ -6580,7 +11689,7 @@ Required scope | `custom_code:write`
-
```typescript
-await client.pages.scripts.deleteCustomCode("63c720f9347c2139b248e552");
+await client.sites.scripts.deleteCustomCode("580e63e98c9a982ac9b8b741");
```
@@ -6596,7 +11705,7 @@ await client.pages.scripts.deleteCustomCode("63c720f9347c2139b248e552");
-
-**page_id:** `string` — Unique identifier for a Page
+**site_id:** `string` — Unique identifier for a Site
@@ -6616,8 +11725,7 @@ await client.pages.scripts.deleteCustomCode("63c720f9347c2139b248e552");
-## Sites Redirects
-client.sites.redirects.list(site_id) -> Webflow.Redirects
+client.sites.scripts.listCustomCodeBlocks(site_id, { ...params }) -> Webflow.ListCustomCodeBlocks
-
@@ -6629,13 +11737,17 @@ await client.pages.scripts.deleteCustomCode("63c720f9347c2139b248e552");
-
-Fetch a list of all 301 redirect rules configured for a specific site.
+Get a list of scripts that have been applied to a site and/or individual pages.
-Use this endpoint to review, audit, or manage the redirection rules that control how traffic is rerouted on your site.
+
+ To apply a script to a site or page, the script must first be registered to a site via the [Register Script](/data/reference/custom-code/custom-code/register-hosted) endpoints. Once registered, the script can be applied to a Site or Page using the appropriate endpoints.
-This endpoint requires an Enterprise workspace.
+ See the documentation on [working with Custom Code](/data/docs/custom-code) for more information.
+
-Required scope: `sites:read`
+Access to this endpoint requires a bearer token obtained from an [OAuth Code Grant Flow](/data/reference/oauth-app).
+
+Required scope | `custom_code:read`
@@ -6650,7 +11762,10 @@ Required scope: `sites:read`
-
```typescript
-await client.sites.redirects.list("580e63e98c9a982ac9b8b741");
+await client.sites.scripts.listCustomCodeBlocks("580e63e98c9a982ac9b8b741", {
+ offset: 1,
+ limit: 1
+});
```
@@ -6674,7 +11789,15 @@ await client.sites.redirects.list("580e63e98c9a982ac9b8b741");
-
-**requestOptions:** `RedirectsClient.RequestOptions`
+**request:** `Webflow.sites.ScriptsListCustomCodeBlocksRequest`
+
+
+
+
+
+-
+
+**requestOptions:** `ScriptsClient.RequestOptions`
@@ -6686,7 +11809,8 @@ await client.sites.redirects.list("580e63e98c9a982ac9b8b741");
-client.sites.redirects.create(site_id, { ...params }) -> Webflow.Redirect
+## Sites Forms
+client.sites.forms.listSubmissionsBySite(site_id, { ...params }) -> Webflow.FormSubmissionList
-
@@ -6698,13 +11822,17 @@ await client.sites.redirects.list("580e63e98c9a982ac9b8b741");
-
-Add a new 301 redirection rule to a site.
+List all form submissions for a given site with the ability to filter submissions by a centralized `elementId`.
-This endpoint allows you to define a source path (`fromUrl`) and its corresponding destination path (`toUrl`), which will dictate how traffic is rerouted on your site. This is useful for managing site changes, restructuring URLs, or handling outdated links.
+Add `elementId` when you want to filter form submissions to a specific form in a site. You can get the `elementId` from the [List forms endpoint](/data/reference/forms/forms/list) (displayed as `formElementId` in the response).
-This endpoint requires an Enterprise workspace.
+
+When a form is used in a Webflow component definition, each instance of the component will yield a unique form. Adding the `elementId` in this request ensures this API response includes all submissions from that core form, wherever that form is used in instantiated components.
+
-Required scope: `sites:write`
+Use the [List Form Submissions endpoint](/data/reference/forms/form-submissions/list-submissions) to list form submissions for a given form ID.
+
+Required scope | `forms:read`
@@ -6719,10 +11847,10 @@ Required scope: `sites:write`
-
```typescript
-await client.sites.redirects.create("580e63e98c9a982ac9b8b741", {
- id: "42e1a2b7aa1a13f768a0042a",
- fromUrl: "/mostly-harmless",
- toUrl: "/earth"
+await client.sites.forms.listSubmissionsBySite("580e63e98c9a982ac9b8b741", {
+ elementId: "18259716-3e5a-646a-5f41-5dc4b9405aa0",
+ offset: 1,
+ limit: 1
});
```
@@ -6747,7 +11875,7 @@ await client.sites.redirects.create("580e63e98c9a982ac9b8b741", {
-
-**request:** `Webflow.Redirect`
+**request:** `Webflow.sites.FormsListSubmissionsBySiteRequest`
@@ -6755,7 +11883,7 @@ await client.sites.redirects.create("580e63e98c9a982ac9b8b741", {
-
-**requestOptions:** `RedirectsClient.RequestOptions`
+**requestOptions:** `FormsClient.RequestOptions`
@@ -6767,7 +11895,7 @@ await client.sites.redirects.create("580e63e98c9a982ac9b8b741", {
-client.sites.redirects.delete(site_id, redirect_id) -> Webflow.Redirects
+client.sites.forms.listSubmissions(site_id, form_id, { ...params }) -> Webflow.FormSubmissionList
-
@@ -6779,13 +11907,11 @@ await client.sites.redirects.create("580e63e98c9a982ac9b8b741", {
-
-Remove a 301 redirection rule from a site.
-
-This is useful for cleaning up outdated or unnecessary redirects, ensuring that your site's routing behavior remains efficient and up-to-date.
+List form submissions for a given form ID within a specific site.
-This endpoint requires an Enterprise workspace.
+Use the [List Form Submissions by Site endpoint](/data/reference/forms/form-submissions/list-submissions-by-site) to list form submissions for a given site with the ability to filter by a `formElementId`.
-Required scope: `sites:write`
+Required scope | `forms:read`
@@ -6800,7 +11926,10 @@ Required scope: `sites:write`
-
```typescript
-await client.sites.redirects.delete("580e63e98c9a982ac9b8b741", "66c4cb9a20cac35ed19500e6");
+await client.sites.forms.listSubmissions("580e63e98c9a982ac9b8b741", "580e63e98c9a982ac9b8b741", {
+ offset: 1,
+ limit: 1
+});
```
@@ -6824,7 +11953,7 @@ await client.sites.redirects.delete("580e63e98c9a982ac9b8b741", "66c4cb9a20cac35
-
-**redirect_id:** `string` — Unique identifier site redirect
+**form_id:** `string` — Unique identifier for a Form
@@ -6832,7 +11961,15 @@ await client.sites.redirects.delete("580e63e98c9a982ac9b8b741", "66c4cb9a20cac35
-
-**requestOptions:** `RedirectsClient.RequestOptions`
+**request:** `Webflow.sites.FormsListSubmissionsRequest`
+
+
+
+
+
+-
+
+**requestOptions:** `FormsClient.RequestOptions`
@@ -6844,7 +11981,7 @@ await client.sites.redirects.delete("580e63e98c9a982ac9b8b741", "66c4cb9a20cac35
-client.sites.redirects.update(site_id, redirect_id, { ...params }) -> Webflow.Redirect
+client.sites.forms.getSubmission(site_id, form_submission_id) -> Webflow.FormSubmission
-
@@ -6856,11 +11993,9 @@ await client.sites.redirects.delete("580e63e98c9a982ac9b8b741", "66c4cb9a20cac35
-
-Update a 301 redirection rule from a site.
-
-This endpoint requires an Enterprise workspace.
+Get information about a form submission within a specific site.
-Required scope: `sites:write`
+Required scope | `forms:read`
@@ -6875,11 +12010,7 @@ Required scope: `sites:write`
-
```typescript
-await client.sites.redirects.update("580e63e98c9a982ac9b8b741", "66c4cb9a20cac35ed19500e6", {
- id: "42e1a2b7aa1a13f768a0042a",
- fromUrl: "/mostly-harmless",
- toUrl: "/earth"
-});
+await client.sites.forms.getSubmission("580e63e98c9a982ac9b8b741", "580e63e98c9a982ac9b8b741");
```
@@ -6903,15 +12034,7 @@ await client.sites.redirects.update("580e63e98c9a982ac9b8b741", "66c4cb9a20cac35
-
-**redirect_id:** `string` — Unique identifier site redirect
-
-
-
-
-
--
-
-**request:** `Webflow.Redirect`
+**form_submission_id:** `string` — Unique identifier for a Form Submission
@@ -6919,7 +12042,7 @@ await client.sites.redirects.update("580e63e98c9a982ac9b8b741", "66c4cb9a20cac35
-
-**requestOptions:** `RedirectsClient.RequestOptions`
+**requestOptions:** `FormsClient.RequestOptions`
@@ -6931,8 +12054,7 @@ await client.sites.redirects.update("580e63e98c9a982ac9b8b741", "66c4cb9a20cac35
-## Sites Plans
-client.sites.plans.getSitePlan(site_id) -> Webflow.SitePlan
+client.sites.forms.deleteSubmission(site_id, form_submission_id) -> void
-
@@ -6944,11 +12066,9 @@ await client.sites.redirects.update("580e63e98c9a982ac9b8b741", "66c4cb9a20cac35
-
-Get site plan details for the specified Site.
-
-This endpoint requires an Enterprise workspace.
+Delete a form submission within a specific site.
-Required scope | `sites:read`
+Required scope | `forms:write`
@@ -6963,7 +12083,7 @@ Required scope | `sites:read`
-
```typescript
-await client.sites.plans.getSitePlan("580e63e98c9a982ac9b8b741");
+await client.sites.forms.deleteSubmission("580e63e98c9a982ac9b8b741", "580e63e98c9a982ac9b8b741");
```
@@ -6987,7 +12107,15 @@ await client.sites.plans.getSitePlan("580e63e98c9a982ac9b8b741");
-
-**requestOptions:** `PlansClient.RequestOptions`
+**form_submission_id:** `string` — Unique identifier for a Form Submission
+
+
+
+
+
+-
+
+**requestOptions:** `FormsClient.RequestOptions`
@@ -6999,8 +12127,7 @@ await client.sites.plans.getSitePlan("580e63e98c9a982ac9b8b741");
-## Sites RobotsTxt
-client.sites.robotsTxt.get(site_id) -> Webflow.Robots
+client.sites.forms.updateSubmission(site_id, form_submission_id, { ...params }) -> Webflow.FormSubmission
-
@@ -7012,11 +12139,9 @@ await client.sites.plans.getSitePlan("580e63e98c9a982ac9b8b741");
-
-Retrieve the robots.txt configuration for various user agents.
-
-This endpoint requires an Enterprise workspace.
+Update hidden fields on a form submission within a specific site.
-Required scope: `site_config:read`
+Required scope | `forms:write`
@@ -7031,7 +12156,7 @@ Required scope: `site_config:read`
-
```typescript
-await client.sites.robotsTxt.get("580e63e98c9a982ac9b8b741");
+await client.sites.forms.updateSubmission("580e63e98c9a982ac9b8b741", "580e63e98c9a982ac9b8b741");
```
@@ -7055,7 +12180,23 @@ await client.sites.robotsTxt.get("580e63e98c9a982ac9b8b741");
-
-**requestOptions:** `RobotsTxtClient.RequestOptions`
+**form_submission_id:** `string` — Unique identifier for a Form Submission
+
+
+
+
+
+-
+
+**request:** `Webflow.sites.FormsUpdateSubmissionRequest`
+
+
+
+
+
+-
+
+**requestOptions:** `FormsClient.RequestOptions`
@@ -7067,7 +12208,8 @@ await client.sites.robotsTxt.get("580e63e98c9a982ac9b8b741");
-client.sites.robotsTxt.put(site_id, { ...params }) -> Webflow.Robots
+## Sites Aeo Reports
+client.sites.aeo.reports.botTraffic(site_id, { ...params }) -> Webflow.AeoBotTrafficResponse
-
@@ -7079,11 +12221,15 @@ await client.sites.robotsTxt.get("580e63e98c9a982ac9b8b741");
-
-Replace the `robots.txt` configuration for various user agents.
+Returns the total number of requests made to the site by the AI bots Webflow tracks, over a time range. This counts bot requests, not visitors or page views. For visitor traffic, use the [Analyze API](/data/docs/working-with-analyze). Filter by bot provider or bot category.
-This endpoint requires an Enterprise workspace.
+Counts successful requests (HTTP `200` or `304`). Bot providers combine with OR, and `botCategory` narrows them further.
-Required scope | `site_config:write`
+This endpoint requires a site or workspace with the AEO analytics entitlement.
+
+Each access token can have one AEO request in flight at a time, across all AEO Analytics endpoints. Additional concurrent requests return `429 Too Many Requests`. Wait for your in-flight request to finish, or for the `Retry-After` interval, then retry.
+
+Required scope | `sites:read`
@@ -7098,13 +12244,11 @@ Required scope | `site_config:write`
-
```typescript
-await client.sites.robotsTxt.put("580e63e98c9a982ac9b8b741", {
- rules: [{
- userAgent: "googlebot",
- allows: ["/public"],
- disallows: ["/vogon-poetry", "/total-perspective-vortex"]
- }],
- sitemap: "https://heartofgold.ship/sitemap.xml"
+await client.sites.aeo.reports.botTraffic("580e63e98c9a982ac9b8b741", {
+ startTime: new Date("2026-09-01T00:00:00.000Z"),
+ endTime: new Date("2026-09-08T00:00:00.000Z"),
+ botProviders: ["openai"],
+ botCategory: "agent"
});
```
@@ -7129,7 +12273,7 @@ await client.sites.robotsTxt.put("580e63e98c9a982ac9b8b741", {
-
-**request:** `Webflow.Robots`
+**request:** `Webflow.sites.aeo.ReportsBotTrafficRequest`
@@ -7137,7 +12281,7 @@ await client.sites.robotsTxt.put("580e63e98c9a982ac9b8b741", {
-
-**requestOptions:** `RobotsTxtClient.RequestOptions`
+**requestOptions:** `ReportsClient.RequestOptions`
@@ -7149,7 +12293,7 @@ await client.sites.robotsTxt.put("580e63e98c9a982ac9b8b741", {
-client.sites.robotsTxt.delete(site_id, { ...params }) -> Webflow.Robots
+client.sites.aeo.reports.botTrafficPages(site_id, { ...params }) -> Webflow.AeoBotTrafficPagesResponse
-
@@ -7161,13 +12305,15 @@ await client.sites.robotsTxt.put("580e63e98c9a982ac9b8b741", {
-
-Remove specific rules for a user-agent in your `robots.txt` file. To delete all rules for a user-agent, provide an empty rule set. This will remove the user-agent's entry entirely, leaving it subject to your site's default crawling behavior.
+Returns the pages and files that the AI bots Webflow tracks requested most over a time range, with each one's request count.
-**Note:** Deleting a user-agent with no rules will make the user-agent's access unrestricted unless other directives apply.
+Results are sorted by `requestCount`, highest first, and aren't paginated. Each row is one combination of page, CMS item, and request path, so a page can appear more than once.
-This endpoint requires an Enterprise workspace.
+This endpoint requires a site or workspace with the AEO analytics entitlement.
-Required scope: `site_config:write`
+Each access token can have one AEO request in flight at a time, across all AEO Analytics endpoints. Additional concurrent requests return `429 Too Many Requests`. Wait for your in-flight request to finish, or for the `Retry-After` interval, then retry.
+
+Required scope | `sites:read`
@@ -7182,12 +12328,12 @@ Required scope: `site_config:write`
-
```typescript
-await client.sites.robotsTxt.delete("580e63e98c9a982ac9b8b741", {
- rules: [{
- userAgent: "*",
- allows: ["/public"],
- disallows: ["/bubbles"]
- }]
+await client.sites.aeo.reports.botTrafficPages("580e63e98c9a982ac9b8b741", {
+ startTime: new Date("2026-09-01T00:00:00.000Z"),
+ endTime: new Date("2026-09-08T00:00:00.000Z"),
+ botProviders: ["openai"],
+ botCategory: "agent",
+ limit: 1
});
```
@@ -7212,7 +12358,7 @@ await client.sites.robotsTxt.delete("580e63e98c9a982ac9b8b741", {
-
-**request:** `Webflow.Robots`
+**request:** `Webflow.sites.aeo.ReportsBotTrafficPagesRequest`
@@ -7220,7 +12366,7 @@ await client.sites.robotsTxt.delete("580e63e98c9a982ac9b8b741", {
-
-**requestOptions:** `RobotsTxtClient.RequestOptions`
+**requestOptions:** `ReportsClient.RequestOptions`
@@ -7232,7 +12378,7 @@ await client.sites.robotsTxt.delete("580e63e98c9a982ac9b8b741", {
-client.sites.robotsTxt.patch(site_id, { ...params }) -> Webflow.Robots
+client.sites.aeo.reports.visibility(site_id, { ...params }) -> Webflow.AeoVisibilityResponse
-
@@ -7244,11 +12390,15 @@ await client.sites.robotsTxt.delete("580e63e98c9a982ac9b8b741", {
-
-Update the `robots.txt` configuration for various user agents.
+Returns the share of answer engine responses that mention your organization, for a time range or as a daily or weekly series.
-This endpoint requires an Enterprise workspace.
+Without `timeseries`, returns one score for the whole time range. With `timeseries`, returns one score per day or week. Separate filters combine with AND, and values within one filter combine with OR. Requires an organization name in the site's Organization info.
-Required scope | `site_config:write`
+This endpoint requires a site or workspace with the AEO analytics entitlement, and Webflow AI must be enabled for the workspace.
+
+Each access token can have one AEO request in flight at a time, across all AEO Analytics endpoints. Additional concurrent requests return `429 Too Many Requests`. Wait for your in-flight request to finish, or for the `Retry-After` interval, then retry.
+
+Required scope | `sites:read`
@@ -7263,13 +12413,12 @@ Required scope | `site_config:write`
-
```typescript
-await client.sites.robotsTxt.patch("580e63e98c9a982ac9b8b741", {
- rules: [{
- userAgent: "googlebot",
- allows: ["/public"],
- disallows: ["/vogon-poetry", "/total-perspective-vortex"]
- }],
- sitemap: "https://heartofgold.ship/sitemap.xml"
+await client.sites.aeo.reports.visibility("580e63e98c9a982ac9b8b741", {
+ startTime: new Date("2026-09-01T00:00:00.000Z"),
+ endTime: new Date("2026-09-08T00:00:00.000Z"),
+ topicIds: ["68cdb4b5a699862fcd8c1a02"],
+ promptIds: ["68cdb4b5a699862fcd8c1a01"],
+ answerEngine: "chat-gpt"
});
```
@@ -7294,7 +12443,7 @@ await client.sites.robotsTxt.patch("580e63e98c9a982ac9b8b741", {
-
-**request:** `Webflow.Robots`
+**request:** `Webflow.sites.aeo.ReportsVisibilityRequest`
@@ -7302,7 +12451,7 @@ await client.sites.robotsTxt.patch("580e63e98c9a982ac9b8b741", {
-
-**requestOptions:** `RobotsTxtClient.RequestOptions`
+**requestOptions:** `ReportsClient.RequestOptions`
@@ -7314,8 +12463,7 @@ await client.sites.robotsTxt.patch("580e63e98c9a982ac9b8b741", {
-## Sites WellKnown
-client.sites.wellKnown.put(site_id, { ...params }) -> void
+client.sites.aeo.reports.visibilityBreakdown(site_id, { ...params }) -> Webflow.AeoVisibilityBreakdownResponse
-
@@ -7327,20 +12475,15 @@ await client.sites.robotsTxt.patch("580e63e98c9a982ac9b8b741", {
-
-Upload a supported well-known file to a site.
+Returns the visibility score for each topic or prompt over a time range, highest first.
-The current restrictions on well-known files are as follows:
- - Each file must be smaller than 100kb
- - Less than 30 total files
- - Have one of the following file extensions (or no extension): `.txt`, `.json`, `.noext`
+Choose `breakdown=topic` or `breakdown=prompt`. A topic or prompt appears only if it has responses in the time range. Separate filters combine with AND, and values within one filter combine with OR. Requires an organization name in the site's Organization info.
-
- `.noext` is a special file extension that removes other extensions. For example, `apple-app-site-association.noext.txt` will be uploaded as `apple-app-site-association`. Use this extension for tools that have trouble uploading extensionless files.
-
+This endpoint requires a site or workspace with the AEO analytics entitlement, and Webflow AI must be enabled for the workspace.
-This endpoint requires an Enterprise workspace.
+Each access token can have one AEO request in flight at a time, across all AEO Analytics endpoints. Additional concurrent requests return `429 Too Many Requests`. Wait for your in-flight request to finish, or for the `Retry-After` interval, then retry.
-Required scope: `site_config:write`
+Required scope | `sites:read`
@@ -7355,10 +12498,14 @@ Required scope: `site_config:write`
-
```typescript
-await client.sites.wellKnown.put("580e63e98c9a982ac9b8b741", {
- fileName: "apple-app-site-association.txt",
- fileData: "{\n \"applinks\": {\n \"apps\": [],\n \"details\": [\n {\n \"appID\": \"ABCDE12345.com.example.app\",\n \"paths\": [ \"/*\", \"/some/path/*\" ]\n }\n ]\n }\n}\n",
- contentType: "application/json"
+await client.sites.aeo.reports.visibilityBreakdown("580e63e98c9a982ac9b8b741", {
+ startTime: new Date("2026-09-01T00:00:00.000Z"),
+ endTime: new Date("2026-09-08T00:00:00.000Z"),
+ breakdown: "topic",
+ limit: 1,
+ topicIds: ["68cdb4b5a699862fcd8c1a02"],
+ promptIds: ["68cdb4b5a699862fcd8c1a01"],
+ answerEngine: "chat-gpt"
});
```
@@ -7383,7 +12530,7 @@ await client.sites.wellKnown.put("580e63e98c9a982ac9b8b741", {
-
-**request:** `Webflow.sites.WellKnownFile`
+**request:** `Webflow.sites.aeo.ReportsVisibilityBreakdownRequest`
@@ -7391,7 +12538,7 @@ await client.sites.wellKnown.put("580e63e98c9a982ac9b8b741", {
-
-**requestOptions:** `WellKnownClient.RequestOptions`
+**requestOptions:** `ReportsClient.RequestOptions`
@@ -7403,7 +12550,7 @@ await client.sites.wellKnown.put("580e63e98c9a982ac9b8b741", {
-client.sites.wellKnown.delete(site_id, { ...params }) -> void
+client.sites.aeo.reports.citationRate(site_id, { ...params }) -> Webflow.AeoCitationRateResponse
-
@@ -7415,11 +12562,15 @@ await client.sites.wellKnown.put("580e63e98c9a982ac9b8b741", {
-
-Delete existing well-known files from a site.
+Returns, for each topic or prompt, the share of responses with citations that cited one of your domains.
-This endpoint requires an Enterprise workspace.
+Your domains are your Allowed domains and your `webflow.io` subdomain, each with and without `www.`. The response lists them in `domains`. Results are sorted by `citationRate`, highest first, and aren't paginated. Separate filters combine with AND, and values within one filter combine with OR.
-Required scope: `site_config:write`
+This endpoint requires a site or workspace with the AEO analytics entitlement, and Webflow AI must be enabled for the workspace.
+
+Each access token can have one AEO request in flight at a time, across all AEO Analytics endpoints. Additional concurrent requests return `429 Too Many Requests`. Wait for your in-flight request to finish, or for the `Retry-After` interval, then retry.
+
+Required scope | `sites:read`
@@ -7434,7 +12585,14 @@ Required scope: `site_config:write`
-
```typescript
-await client.sites.wellKnown.delete("580e63e98c9a982ac9b8b741");
+await client.sites.aeo.reports.citationRate("580e63e98c9a982ac9b8b741", {
+ startTime: new Date("2026-09-01T00:00:00.000Z"),
+ endTime: new Date("2026-09-08T00:00:00.000Z"),
+ breakdown: "topic",
+ topicIds: ["68cdb4b5a699862fcd8c1a02"],
+ promptIds: ["68cdb4b5a699862fcd8c1a01"],
+ answerEngines: ["chat-gpt"]
+});
```
@@ -7458,7 +12616,7 @@ await client.sites.wellKnown.delete("580e63e98c9a982ac9b8b741");
-
-**request:** `Webflow.sites.WellKnownDeleteRequest`
+**request:** `Webflow.sites.aeo.ReportsCitationRateRequest`
@@ -7466,7 +12624,7 @@ await client.sites.wellKnown.delete("580e63e98c9a982ac9b8b741");
-
-**requestOptions:** `WellKnownClient.RequestOptions`
+**requestOptions:** `ReportsClient.RequestOptions`
@@ -7478,8 +12636,7 @@ await client.sites.wellKnown.delete("580e63e98c9a982ac9b8b741");
-## Sites ActivityLogs
-client.sites.activityLogs.list(site_id, { ...params }) -> Webflow.SiteActivityLogResponse
+client.sites.aeo.reports.topCitedDomains(site_id, { ...params }) -> Webflow.AeoTopCitedDomainsResponse
-
@@ -7491,11 +12648,15 @@ await client.sites.wellKnown.delete("580e63e98c9a982ac9b8b741");
-
-Retrieve Activity Logs for a specific Site.
+Returns the domains answer engines cited most, with each domain's share of all citations. For your domains, each row also lists its cited paths in `paths`. For other domains, `distinctPathCount` gives the approximate number of distinct cited paths.
-This endpoint requires an Enterprise workspace.
+Results are sorted by citation count, highest first. If one of your domains isn't in the top `limit`, it's added after the ranked rows, so the response can have more than `limit` rows.
-Required scope: `site_activity:read`
+This endpoint requires a site or workspace with the AEO analytics entitlement, and Webflow AI must be enabled for the workspace.
+
+Each access token can have one AEO request in flight at a time, across all AEO Analytics endpoints. Additional concurrent requests return `429 Too Many Requests`. Wait for your in-flight request to finish, or for the `Retry-After` interval, then retry.
+
+Required scope | `sites:read`
@@ -7510,9 +12671,12 @@ Required scope: `site_activity:read`
-
```typescript
-await client.sites.activityLogs.list("580e63e98c9a982ac9b8b741", {
- limit: 1,
- offset: 1
+await client.sites.aeo.reports.topCitedDomains("580e63e98c9a982ac9b8b741", {
+ startTime: new Date("2026-09-01T00:00:00.000Z"),
+ endTime: new Date("2026-09-08T00:00:00.000Z"),
+ topicIds: ["68cdb4b5a699862fcd8c1a02"],
+ answerEngines: ["chat-gpt"],
+ limit: 1
});
```
@@ -7537,7 +12701,7 @@ await client.sites.activityLogs.list("580e63e98c9a982ac9b8b741", {
-
-**request:** `Webflow.sites.ActivityLogsListRequest`
+**request:** `Webflow.sites.aeo.ReportsTopCitedDomainsRequest`
@@ -7545,7 +12709,7 @@ await client.sites.activityLogs.list("580e63e98c9a982ac9b8b741", {
-
-**requestOptions:** `ActivityLogsClient.RequestOptions`
+**requestOptions:** `ReportsClient.RequestOptions`
@@ -7557,8 +12721,7 @@ await client.sites.activityLogs.list("580e63e98c9a982ac9b8b741", {
-## Sites Comments
-client.sites.comments.listCommentThreads(site_id, { ...params }) -> Webflow.CommentThreadList
+client.sites.aeo.reports.citedDomainPaths(site_id, { ...params }) -> Webflow.AeoCitedDomainPathsResponse
-
@@ -7570,13 +12733,15 @@ await client.sites.activityLogs.list("580e63e98c9a982ac9b8b741", {
-
-List all comment threads for a site.
+Returns the cited paths on one domain, with each path's share of all citations.
-
- There may be a delay of up to 5 minutes before new comments appear in the system.
-
+`domain` can be any domain, not only yours. Results are sorted by `citationRate`, highest first, and aren't paginated.
-Required scope | `comments:read`
+This endpoint requires a site or workspace with the AEO analytics entitlement, and Webflow AI must be enabled for the workspace.
+
+Each access token can have one AEO request in flight at a time, across all AEO Analytics endpoints. Additional concurrent requests return `429 Too Many Requests`. Wait for your in-flight request to finish, or for the `Retry-After` interval, then retry.
+
+Required scope | `sites:read`
@@ -7591,12 +12756,12 @@ Required scope | `comments:read`
-
```typescript
-await client.sites.comments.listCommentThreads("580e63e98c9a982ac9b8b741", {
- localeId: "65427cf400e02b306eaa04a0",
- offset: 1,
- limit: 1,
- sortBy: "createdOn",
- sortOrder: "asc"
+await client.sites.aeo.reports.citedDomainPaths("580e63e98c9a982ac9b8b741", {
+ startTime: new Date("2026-09-01T00:00:00.000Z"),
+ endTime: new Date("2026-09-08T00:00:00.000Z"),
+ domain: "example.org",
+ topicIds: ["68cdb4b5a699862fcd8c1a02"],
+ answerEngines: ["chat-gpt"]
});
```
@@ -7621,7 +12786,7 @@ await client.sites.comments.listCommentThreads("580e63e98c9a982ac9b8b741", {
-
-**request:** `Webflow.sites.CommentsListCommentThreadsRequest`
+**request:** `Webflow.sites.aeo.ReportsCitedDomainPathsRequest`
@@ -7629,7 +12794,7 @@ await client.sites.comments.listCommentThreads("580e63e98c9a982ac9b8b741", {
-
-**requestOptions:** `CommentsClient.RequestOptions`
+**requestOptions:** `ReportsClient.RequestOptions`
@@ -7641,7 +12806,7 @@ await client.sites.comments.listCommentThreads("580e63e98c9a982ac9b8b741", {
-client.sites.comments.getCommentThread(site_id, comment_thread_id, { ...params }) -> Webflow.CommentThread
+client.sites.aeo.reports.pageCitationShare(site_id, { ...params }) -> Webflow.AeoPageCitationShareResponse
-
@@ -7653,13 +12818,15 @@ await client.sites.comments.listCommentThreads("580e63e98c9a982ac9b8b741", {
-
-Get details of a specific comment thread.
+Returns one page's share of all citations to your domains, optionally broken down by prompt.
-
- There may be a delay of up to 5 minutes before new comments appear in the system.
-
+For a CMS item, send `collectionId` and `itemSlug` along with `pageId`. With `breakdown=prompt`, returns each prompt's share of this page's citations, sorted by `citationShare`, highest first.
-Required scope | `comments:read`
+This endpoint requires a site or workspace with the AEO analytics entitlement, and Webflow AI must be enabled for the workspace.
+
+Each access token can have one AEO request in flight at a time, across all AEO Analytics endpoints. Additional concurrent requests return `429 Too Many Requests`. Wait for your in-flight request to finish, or for the `Retry-After` interval, then retry.
+
+Required scope | `sites:read`
@@ -7674,12 +12841,14 @@ Required scope | `comments:read`
-
```typescript
-await client.sites.comments.getCommentThread("580e63e98c9a982ac9b8b741", "580e63e98c9a982ac9b8b741", {
- localeId: "65427cf400e02b306eaa04a0",
- offset: 1,
- limit: 1,
- sortBy: "createdOn",
- sortOrder: "asc"
+await client.sites.aeo.reports.pageCitationShare("580e63e98c9a982ac9b8b741", {
+ startTime: new Date("2026-09-01T00:00:00.000Z"),
+ endTime: new Date("2026-09-08T00:00:00.000Z"),
+ pageId: "68cdb4b5a699862fcd8c1a30",
+ collectionId: "68cdb4b5a699862fcd8c1a40",
+ itemSlug: "dont-panic",
+ breakdown: "prompt",
+ answerEngines: ["chat-gpt"]
});
```
@@ -7704,15 +12873,7 @@ await client.sites.comments.getCommentThread("580e63e98c9a982ac9b8b741", "580e63
-
-**comment_thread_id:** `string` — Unique identifier for a Comment Thread
-
-
-
-
-
--
-
-**request:** `Webflow.sites.CommentsGetCommentThreadRequest`
+**request:** `Webflow.sites.aeo.ReportsPageCitationShareRequest`
@@ -7720,7 +12881,7 @@ await client.sites.comments.getCommentThread("580e63e98c9a982ac9b8b741", "580e63
-
-**requestOptions:** `CommentsClient.RequestOptions`
+**requestOptions:** `ReportsClient.RequestOptions`
@@ -7732,7 +12893,7 @@ await client.sites.comments.getCommentThread("580e63e98c9a982ac9b8b741", "580e63
-client.sites.comments.listCommentReplies(site_id, comment_thread_id, { ...params }) -> Webflow.CommentReplyList
+client.sites.aeo.reports.competitorCitations(site_id, { ...params }) -> Webflow.AeoCompetitorCitationsResponse
-
@@ -7744,13 +12905,15 @@ await client.sites.comments.getCommentThread("580e63e98c9a982ac9b8b741", "580e63
-
-List all replies to a specific comment thread.
+Lists the newest responses that cited a competitor's domain and none of your domains.
-
- There may be a delay of up to 5 minutes before new comments appear in the system.
-
+Competitor domains come from the competitors in the site's Organization info. Results are sorted by `timestamp`, newest first, and aren't paginated.
-Required scope | `comments:read`
+This endpoint requires a site or workspace with the AEO analytics entitlement, and Webflow AI must be enabled for the workspace.
+
+Each access token can have one AEO request in flight at a time, across all AEO Analytics endpoints. Additional concurrent requests return `429 Too Many Requests`. Wait for your in-flight request to finish, or for the `Retry-After` interval, then retry.
+
+Required scope | `sites:read`
@@ -7765,12 +12928,12 @@ Required scope | `comments:read`
-
```typescript
-await client.sites.comments.listCommentReplies("580e63e98c9a982ac9b8b741", "580e63e98c9a982ac9b8b741", {
- localeId: "65427cf400e02b306eaa04a0",
- offset: 1,
- limit: 1,
- sortBy: "createdOn",
- sortOrder: "asc"
+await client.sites.aeo.reports.competitorCitations("580e63e98c9a982ac9b8b741", {
+ startTime: new Date("2026-09-01T00:00:00.000Z"),
+ endTime: new Date("2026-09-08T00:00:00.000Z"),
+ topicIds: ["68cdb4b5a699862fcd8c1a02"],
+ answerEngines: ["chat-gpt"],
+ limit: 1
});
```
@@ -7795,15 +12958,7 @@ await client.sites.comments.listCommentReplies("580e63e98c9a982ac9b8b741", "580e
-
-**comment_thread_id:** `string` — Unique identifier for a Comment Thread
-
-
-
-
-
--
-
-**request:** `Webflow.sites.CommentsListCommentRepliesRequest`
+**request:** `Webflow.sites.aeo.ReportsCompetitorCitationsRequest`
@@ -7811,7 +12966,7 @@ await client.sites.comments.listCommentReplies("580e63e98c9a982ac9b8b741", "580e
-
-**requestOptions:** `CommentsClient.RequestOptions`
+**requestOptions:** `ReportsClient.RequestOptions`
@@ -7823,8 +12978,7 @@ await client.sites.comments.listCommentReplies("580e63e98c9a982ac9b8b741", "580e
-## Sites Scripts
-client.sites.scripts.getCustomCode(site_id) -> Webflow.ScriptApplyList
+client.sites.aeo.reports.citations(site_id, { ...params }) -> Webflow.AeoCitationsResponse
-
@@ -7836,13 +12990,15 @@ await client.sites.comments.listCommentReplies("580e63e98c9a982ac9b8b741", "580e
-
-Get all scripts applied to a site by the App.
+Lists answer engine responses over a time range, newest first, with every citation and mention in each.
-
- To apply a script to a site or page, the script must first be registered to a site via the [Register Script](/data/reference/custom-code/custom-code/register-hosted) endpoints. Once registered, the script can be applied to a Site or Page using the appropriate endpoints. See the documentation on [working with Custom Code](/data/docs/custom-code) for more information.
-
+Includes responses that cited nothing. To get the next page, set `offset` to the previous `offset` plus `limit`. Rows can shift between pages if new responses arrive in the time range.
-Required scope | `custom_code:read`
+This endpoint requires a site or workspace with the AEO analytics entitlement, and Webflow AI must be enabled for the workspace.
+
+Each access token can have one AEO request in flight at a time, across all AEO Analytics endpoints. Additional concurrent requests return `429 Too Many Requests`. Wait for your in-flight request to finish, or for the `Retry-After` interval, then retry.
+
+Required scope | `sites:read`
@@ -7857,7 +13013,15 @@ Required scope | `custom_code:read`
-
```typescript
-await client.sites.scripts.getCustomCode("580e63e98c9a982ac9b8b741");
+await client.sites.aeo.reports.citations("580e63e98c9a982ac9b8b741", {
+ startTime: new Date("2026-09-01T00:00:00.000Z"),
+ endTime: new Date("2026-09-08T00:00:00.000Z"),
+ topicIds: ["68cdb4b5a699862fcd8c1a02"],
+ promptIds: ["68cdb4b5a699862fcd8c1a01"],
+ answerEngines: ["chat-gpt"],
+ limit: 1,
+ offset: 1
+});
```
@@ -7881,7 +13045,15 @@ await client.sites.scripts.getCustomCode("580e63e98c9a982ac9b8b741");
-
-**requestOptions:** `ScriptsClient.RequestOptions`
+**request:** `Webflow.sites.aeo.ReportsCitationsRequest`
+
+
+
+
+
+-
+
+**requestOptions:** `ReportsClient.RequestOptions`
@@ -7893,7 +13065,8 @@ await client.sites.scripts.getCustomCode("580e63e98c9a982ac9b8b741");
-client.sites.scripts.upsertCustomCode(site_id, { ...params }) -> Webflow.ScriptApplyList
+## Sites Aeo Prompts
+client.sites.aeo.prompts.list(site_id, { ...params }) -> Webflow.AeoPromptListResponse
-
@@ -7905,13 +13078,15 @@ await client.sites.scripts.getCustomCode("580e63e98c9a982ac9b8b741");
-
-Apply registered scripts to a site. If you have multiple scripts your App needs to apply or maintain on a site, ensure they are always included in the request body for this endpoint. To remove individual scripts, simply call this endpoint without the script in the request body.
+Lists the site's tracked prompts, with each prompt's topic and status. By default, returns `active`, `paused`, and `pending` prompts. To include archived prompts, set `status` to `archived` or `all`.
-
- To apply a script to a site or page, the script must first be registered to a site via the [Register Script](/data/reference/custom-code/custom-code/register-hosted) endpoints. Once registered, the script can be applied to a Site or Page using the appropriate endpoints. See the documentation on [working with Custom Code](/data/docs/custom-code) for more information.
-
+Results are sorted by `createdAt`, newest first. To get the next page, pass `nextCursor` as `cursor`.
-Required scope | `custom_code:write`
+This endpoint requires a site or workspace with the AEO analytics entitlement, and Webflow AI must be enabled for the workspace.
+
+Each access token can have one AEO request in flight at a time, across all AEO Analytics endpoints. Additional concurrent requests return `429 Too Many Requests`. Wait for your in-flight request to finish, or for the `Retry-After` interval, then retry.
+
+Required scope | `sites:read`
@@ -7926,19 +13101,11 @@ Required scope | `custom_code:write`
-
```typescript
-await client.sites.scripts.upsertCustomCode("580e63e98c9a982ac9b8b741", {
- scripts: [{
- id: "cms_slider",
- location: "header",
- version: "1.0.0",
- attributes: {
- "my-attribute": "some-value"
- }
- }, {
- id: "alert",
- location: "header",
- version: "0.0.1"
- }]
+await client.sites.aeo.prompts.list("580e63e98c9a982ac9b8b741", {
+ topicId: "68cdb4b5a699862fcd8c1a02",
+ status: "active",
+ limit: 1,
+ cursor: "cursor"
});
```
@@ -7963,7 +13130,7 @@ await client.sites.scripts.upsertCustomCode("580e63e98c9a982ac9b8b741", {
-
-**request:** `Webflow.ScriptApplyList`
+**request:** `Webflow.sites.aeo.PromptsListRequest`
@@ -7971,7 +13138,7 @@ await client.sites.scripts.upsertCustomCode("580e63e98c9a982ac9b8b741", {
-
-**requestOptions:** `ScriptsClient.RequestOptions`
+**requestOptions:** `PromptsClient.RequestOptions`
@@ -7983,7 +13150,8 @@ await client.sites.scripts.upsertCustomCode("580e63e98c9a982ac9b8b741", {
-client.sites.scripts.deleteCustomCode(site_id) -> void
+## Sites Aeo PromptExecutions
+client.sites.aeo.promptExecutions.list(site_id, { ...params }) -> Webflow.AeoPromptExecutionListResponse
-
@@ -7995,13 +13163,15 @@ await client.sites.scripts.upsertCustomCode("580e63e98c9a982ac9b8b741", {
-
-Remove all scripts from a site applied by the App. This endpoint will not remove scripts from the site's registered scripts.
+Lists answer engine responses to the site's prompts, newest first, with the mentions and citations in each. Covers the last 90 days unless you set a time range.
-To remove individual scripts applied by the App, use the [Add/Update Custom Code](/data/reference/custom-code/custom-code-sites/upsert-custom-code) endpoint.
+Executions older than 90 days aren't listed. Results are sorted by `createdAt`, newest first. To get the next page, pass `nextCursor` as `cursor`.
-Access to this endpoint requires a bearer token obtained from an [OAuth Code Grant Flow](/data/reference/oauth-app).
+This endpoint requires a site or workspace with the AEO analytics entitlement, and Webflow AI must be enabled for the workspace.
-Required scope | `custom_code:write`
+Each access token can have one AEO request in flight at a time, across all AEO Analytics endpoints. Additional concurrent requests return `429 Too Many Requests`. Wait for your in-flight request to finish, or for the `Retry-After` interval, then retry.
+
+Required scope | `sites:read`
@@ -8016,7 +13186,16 @@ Required scope | `custom_code:write`
-
```typescript
-await client.sites.scripts.deleteCustomCode("580e63e98c9a982ac9b8b741");
+await client.sites.aeo.promptExecutions.list("580e63e98c9a982ac9b8b741", {
+ promptId: "68cdb4b5a699862fcd8c1a01",
+ topicId: "68cdb4b5a699862fcd8c1a02",
+ answerEngine: "chat-gpt",
+ startTime: new Date("2026-09-01T00:00:00.000Z"),
+ endTime: new Date("2026-10-01T00:00:00.000Z"),
+ includeRawResponse: true,
+ limit: 1,
+ cursor: "cursor"
+});
```
@@ -8040,7 +13219,15 @@ await client.sites.scripts.deleteCustomCode("580e63e98c9a982ac9b8b741");
-
-**requestOptions:** `ScriptsClient.RequestOptions`
+**request:** `Webflow.sites.aeo.PromptExecutionsListRequest`
+
+
+
+
+
+-
+
+**requestOptions:** `PromptExecutionsClient.RequestOptions`
@@ -8052,7 +13239,7 @@ await client.sites.scripts.deleteCustomCode("580e63e98c9a982ac9b8b741");
-client.sites.scripts.listCustomCodeBlocks(site_id, { ...params }) -> Webflow.ListCustomCodeBlocks
+client.sites.aeo.promptExecutions.get(site_id, execution_id) -> Webflow.AeoPromptExecution
-
@@ -8064,15 +13251,15 @@ await client.sites.scripts.deleteCustomCode("580e63e98c9a982ac9b8b741");
-
-Get a list of scripts that have been applied to a site and/or individual pages.
+Returns one prompt execution, including the full response text while it's still stored.
-
- To apply a script to a site or page, the script must first be registered to a site via the [Register Script](/data/reference/custom-code/custom-code/register-hosted) endpoints. Once registered, the script can be applied to a Site or Page using the appropriate endpoints.
+Executions older than 90 days are returned without `rawResponse`. Executions are deleted 120 days after they're created. This endpoint takes no query parameters.
- See the documentation on [working with Custom Code](/data/docs/custom-code) for more information.
-
+This endpoint requires a site or workspace with the AEO analytics entitlement, and Webflow AI must be enabled for the workspace.
-Required scope | `custom_code:read`
+Each access token can have one AEO request in flight at a time, across all AEO Analytics endpoints. Additional concurrent requests return `429 Too Many Requests`. Wait for your in-flight request to finish, or for the `Retry-After` interval, then retry.
+
+Required scope | `sites:read`
@@ -8087,10 +13274,7 @@ Required scope | `custom_code:read`
-
```typescript
-await client.sites.scripts.listCustomCodeBlocks("580e63e98c9a982ac9b8b741", {
- offset: 1,
- limit: 1
-});
+await client.sites.aeo.promptExecutions.get("580e63e98c9a982ac9b8b741", "68cdb4b5a699862fcd8c1a10");
```
@@ -8114,7 +13298,7 @@ await client.sites.scripts.listCustomCodeBlocks("580e63e98c9a982ac9b8b741", {
-
-**request:** `Webflow.sites.ScriptsListCustomCodeBlocksRequest`
+**execution_id:** `string` — The prompt execution ID, from [List Prompt Executions](/data/reference/aeo-analytics/list-prompt-executions).
@@ -8122,7 +13306,7 @@ await client.sites.scripts.listCustomCodeBlocks("580e63e98c9a982ac9b8b741", {
-
-**requestOptions:** `ScriptsClient.RequestOptions`
+**requestOptions:** `PromptExecutionsClient.RequestOptions`
@@ -8134,8 +13318,8 @@ await client.sites.scripts.listCustomCodeBlocks("580e63e98c9a982ac9b8b741", {
-## Sites Forms
-client.sites.forms.listSubmissionsBySite(site_id, { ...params }) -> Webflow.FormSubmissionList
+## Workspaces AuditLogs
+client.workspaces.auditLogs.getWorkspaceAuditLogs(workspace_id_or_slug, { ...params }) -> Webflow.WorkspaceAuditLogResponse
-
@@ -8147,17 +13331,11 @@ await client.sites.scripts.listCustomCodeBlocks("580e63e98c9a982ac9b8b741", {
-
-List all form submissions for a given site with the ability to filter submissions by a centralized `elementId`.
-
-Add `elementId` when you want to filter form submissions to a specific form in a site. You can get the `elementId` from the [List forms endpoint](/data/reference/forms/forms/list) (displayed as `formElementId` in the response).
-
-
-When a form is used in a Webflow component definition, each instance of the component will yield a unique form. Adding the `elementId` in this request ensures this API response includes all submissions from that core form, wherever that form is used in instantiated components.
-
+Get audit logs for a workspace.
-Use the [List Form Submissions endpoint](/data/reference/forms/form-submissions/list-submissions) to list form submissions for a given form ID.
+This endpoint requires an Enterprise workspace and a workspace token with the `workspace_activity:read` scope. Create a workspace token from your workspace dashboard integrations page to use this endpoint.
-Required scope | `forms:read`
+Required scope | `workspace_activity:read`
@@ -8172,10 +13350,13 @@ Required scope | `forms:read`
-
```typescript
-await client.sites.forms.listSubmissionsBySite("580e63e98c9a982ac9b8b741", {
- elementId: "18259716-3e5a-646a-5f41-5dc4b9405aa0",
+await client.workspaces.auditLogs.getWorkspaceAuditLogs("hitchhikers-workspace", {
+ limit: 1,
offset: 1,
- limit: 1
+ sortOrder: "asc",
+ eventType: "user_access",
+ from: new Date("2025-06-22T16:00:31.000Z"),
+ to: new Date("2025-07-22T16:00:31.000Z")
});
```
@@ -8192,7 +13373,7 @@ await client.sites.forms.listSubmissionsBySite("580e63e98c9a982ac9b8b741", {
-
-**site_id:** `string` — Unique identifier for a Site
+**workspace_id_or_slug:** `string` — Unique identifier or slug for a Workspace
@@ -8200,7 +13381,7 @@ await client.sites.forms.listSubmissionsBySite("580e63e98c9a982ac9b8b741", {
-
-**request:** `Webflow.sites.FormsListSubmissionsBySiteRequest`
+**request:** `Webflow.workspaces.AuditLogsGetWorkspaceAuditLogsRequest`
@@ -8208,7 +13389,7 @@ await client.sites.forms.listSubmissionsBySite("580e63e98c9a982ac9b8b741", {
-
-**requestOptions:** `FormsClient.RequestOptions`
+**requestOptions:** `AuditLogsClient.RequestOptions`
@@ -8220,7 +13401,8 @@ await client.sites.forms.listSubmissionsBySite("580e63e98c9a982ac9b8b741", {
-client.sites.forms.listSubmissions(site_id, form_id, { ...params }) -> Webflow.FormSubmissionList
+## Workspaces Members
+client.workspaces.members.listMembers(workspace_id, { ...params }) -> Webflow.WorkspaceMembersResponse
-
@@ -8232,11 +13414,11 @@ await client.sites.forms.listSubmissionsBySite("580e63e98c9a982ac9b8b741", {
-
-List form submissions for a given form ID within a specific site.
+List the members and invites of a workspace. `invites` includes pending, declined, and expired invites.
-Use the [List Form Submissions by Site endpoint](/data/reference/forms/form-submissions/list-submissions-by-site) to list form submissions for a given site with the ability to filter by a `formElementId`.
+This endpoint requires an Enterprise workspace.
-Required scope | `forms:read`
+Required scope | `workspace_members:read`
@@ -8251,9 +13433,11 @@ Required scope | `forms:read`
-
```typescript
-await client.sites.forms.listSubmissions("580e63e98c9a982ac9b8b741", "580e63e98c9a982ac9b8b741", {
- offset: 1,
- limit: 1
+await client.workspaces.members.listMembers("580e63e98c9a982ac9b8b741", {
+ limit: 1,
+ email: "email",
+ roles: ["owner"],
+ cursor: "cursor"
});
```
@@ -8270,15 +13454,7 @@ await client.sites.forms.listSubmissions("580e63e98c9a982ac9b8b741", "580e63e98c
-
-**site_id:** `string` — Unique identifier for a Site
-
-
-
-
-
--
-
-**form_id:** `string` — Unique identifier for a Form
+**workspace_id:** `string` — Unique identifier for a Workspace. Find it with [List Workspaces](/data/reference/enterprise/workspace-management/list) (workspace API tokens and Data Client apps), or with `authorization.authorizedTo.workspaceIds` from [Get Authorization Info](/data/reference/token/introspect). With a site token, read `workspaceId` from [Get Site](/data/reference/sites/get).
@@ -8286,7 +13462,7 @@ await client.sites.forms.listSubmissions("580e63e98c9a982ac9b8b741", "580e63e98c
-
-**request:** `Webflow.sites.FormsListSubmissionsRequest`
+**request:** `Webflow.workspaces.MembersListMembersRequest`
@@ -8294,7 +13470,7 @@ await client.sites.forms.listSubmissions("580e63e98c9a982ac9b8b741", "580e63e98c
-
-**requestOptions:** `FormsClient.RequestOptions`
+**requestOptions:** `MembersClient.RequestOptions`
@@ -8306,7 +13482,7 @@ await client.sites.forms.listSubmissions("580e63e98c9a982ac9b8b741", "580e63e98c
-client.sites.forms.getSubmission(site_id, form_submission_id) -> Webflow.FormSubmission
+client.workspaces.members.inviteMember(workspace_id, { ...params }) -> Webflow.InviteWorkspaceMemberResponseBody
-
@@ -8318,9 +13494,29 @@ await client.sites.forms.listSubmissions("580e63e98c9a982ac9b8b741", "580e63e98c
-
-Get information about a form submission within a specific site.
+Invite a user to a workspace.
-Required scope | `forms:read`
+Set `workspaceRole` to `client` to invite a collaborator client to one Site. Client invites require exactly one `siteAccess` entry. Repeat the request with another Site to extend a compatible pending client invite.
+
+Client invites create collaborator relationships only. This endpoint does not accept `sitePlan` or `canPublish`.
+
+This endpoint requires an Enterprise workspace.
+
+Required scope | `workspace_members:write`
+
+`workspaceRole` and `defaultSiteRole` together decide what the invitee can do and what role the dashboard shows for them once they accept. Submit only one of the combinations below — the dashboard's own role picker never produces any other pairing.
+
+| `workspaceRole` | `defaultSiteRole` | Shown in the dashboard as |
+|---|---|---|
+| `admin` | `site_manager` | Admin |
+| `member` | `site_manager` | Site manager |
+| `member` | `designer` | Designer |
+| `member` | `marketer` | Marketer |
+| `member` | `content_editor` | Content editor |
+| `member` | `custom` | The custom Site Role's own name. Requires `defaultSiteRoleId`. |
+| `reviewer` | `reviewer` | Reviewer |
+
+Admins always have access to every site in the workspace, so an Admin invite can't include a list of specific sites. For Member and Reviewer invites, you can either give the same role on all sites, or list specific sites. In both cases, use the pairings in the table above.
@@ -8335,7 +13531,11 @@ Required scope | `forms:read`
-
```typescript
-await client.sites.forms.getSubmission("580e63e98c9a982ac9b8b741", "580e63e98c9a982ac9b8b741");
+await client.workspaces.members.inviteMember("580e63e98c9a982ac9b8b741", {
+ email: "sam.okafor@example.com",
+ workspaceRole: "member",
+ defaultSiteRole: "designer"
+});
```
@@ -8351,7 +13551,7 @@ await client.sites.forms.getSubmission("580e63e98c9a982ac9b8b741", "580e63e98c9a
-
-**site_id:** `string` — Unique identifier for a Site
+**workspace_id:** `string` — Unique identifier for a Workspace. Find it with [List Workspaces](/data/reference/enterprise/workspace-management/list) (workspace API tokens and Data Client apps), or with `authorization.authorizedTo.workspaceIds` from [Get Authorization Info](/data/reference/token/introspect). With a site token, read `workspaceId` from [Get Site](/data/reference/sites/get).
@@ -8359,7 +13559,7 @@ await client.sites.forms.getSubmission("580e63e98c9a982ac9b8b741", "580e63e98c9a
-
-**form_submission_id:** `string` — Unique identifier for a Form Submission
+**request:** `Webflow.InviteWorkspaceMemberRequestBody`
@@ -8367,7 +13567,7 @@ await client.sites.forms.getSubmission("580e63e98c9a982ac9b8b741", "580e63e98c9a
-
-**requestOptions:** `FormsClient.RequestOptions`
+**requestOptions:** `MembersClient.RequestOptions`
@@ -8379,7 +13579,7 @@ await client.sites.forms.getSubmission("580e63e98c9a982ac9b8b741", "580e63e98c9a
-client.sites.forms.deleteSubmission(site_id, form_submission_id) -> void
+client.workspaces.members.removeMember(workspace_id, member_id) -> void
-
@@ -8391,9 +13591,11 @@ await client.sites.forms.getSubmission("580e63e98c9a982ac9b8b741", "580e63e98c9a
-
-Delete a form submission within a specific site.
+Remove a member from a workspace.
-Required scope | `forms:write`
+This endpoint requires an Enterprise workspace.
+
+Required scope | `workspace_members:write`
@@ -8408,7 +13610,7 @@ Required scope | `forms:write`
-
```typescript
-await client.sites.forms.deleteSubmission("580e63e98c9a982ac9b8b741", "580e63e98c9a982ac9b8b741");
+await client.workspaces.members.removeMember("580e63e98c9a982ac9b8b741", "62fa5e47f6b8256f4641c5bd");
```
@@ -8424,7 +13626,7 @@ await client.sites.forms.deleteSubmission("580e63e98c9a982ac9b8b741", "580e63e98
-
-**site_id:** `string` — Unique identifier for a Site
+**workspace_id:** `string` — Unique identifier for a Workspace. Find it with [List Workspaces](/data/reference/enterprise/workspace-management/list) (workspace API tokens and Data Client apps), or with `authorization.authorizedTo.workspaceIds` from [Get Authorization Info](/data/reference/token/introspect). With a site token, read `workspaceId` from [Get Site](/data/reference/sites/get).
@@ -8432,7 +13634,7 @@ await client.sites.forms.deleteSubmission("580e63e98c9a982ac9b8b741", "580e63e98
-
-**form_submission_id:** `string` — Unique identifier for a Form Submission
+**member_id:** `string` — Unique identifier for a Member
@@ -8440,7 +13642,7 @@ await client.sites.forms.deleteSubmission("580e63e98c9a982ac9b8b741", "580e63e98
-
-**requestOptions:** `FormsClient.RequestOptions`
+**requestOptions:** `MembersClient.RequestOptions`
@@ -8452,7 +13654,7 @@ await client.sites.forms.deleteSubmission("580e63e98c9a982ac9b8b741", "580e63e98
-client.sites.forms.updateSubmission(site_id, form_submission_id, { ...params }) -> Webflow.FormSubmission
+client.workspaces.members.updateMemberRole(workspace_id, member_id, { ...params }) -> Webflow.WorkspaceMember
-
@@ -8464,9 +13666,23 @@ await client.sites.forms.deleteSubmission("580e63e98c9a982ac9b8b741", "580e63e98
-
-Update hidden fields on a form submission within a specific site.
+Update a workspace member's role.
-Required scope | `forms:write`
+This endpoint requires an Enterprise workspace.
+
+Required scope | `workspace_members:write`
+
+`role` and `defaultSiteRole` together decide what the member can do and what role the dashboard shows for them. Submit only one of the combinations below — the dashboard's own role picker never produces any other pairing.
+
+| `role` | `defaultSiteRole` | Shown in the dashboard as |
+|---|---|---|
+| `admin` | `site_manager` | Admin |
+| `member` | `site_manager` | Site manager |
+| `member` | `designer` | Designer |
+| `member` | `marketer` | Marketer |
+| `member` | `content_editor` | Content editor |
+| `member` | `custom` | The custom Site Role's own name. Requires `defaultSiteRoleId`. |
+| `reviewer` | `reviewer` | Reviewer |
@@ -8481,7 +13697,10 @@ Required scope | `forms:write`
-
```typescript
-await client.sites.forms.updateSubmission("580e63e98c9a982ac9b8b741", "580e63e98c9a982ac9b8b741");
+await client.workspaces.members.updateMemberRole("580e63e98c9a982ac9b8b741", "62fa5e47f6b8256f4641c5bd", {
+ role: "admin",
+ defaultSiteRole: "site_manager"
+});
```
@@ -8497,7 +13716,7 @@ await client.sites.forms.updateSubmission("580e63e98c9a982ac9b8b741", "580e63e98
-
-**site_id:** `string` — Unique identifier for a Site
+**workspace_id:** `string` — Unique identifier for a Workspace. Find it with [List Workspaces](/data/reference/enterprise/workspace-management/list) (workspace API tokens and Data Client apps), or with `authorization.authorizedTo.workspaceIds` from [Get Authorization Info](/data/reference/token/introspect). With a site token, read `workspaceId` from [Get Site](/data/reference/sites/get).
@@ -8505,7 +13724,7 @@ await client.sites.forms.updateSubmission("580e63e98c9a982ac9b8b741", "580e63e98
-
-**form_submission_id:** `string` — Unique identifier for a Form Submission
+**member_id:** `string` — Unique identifier for a Member
@@ -8513,7 +13732,7 @@ await client.sites.forms.updateSubmission("580e63e98c9a982ac9b8b741", "580e63e98
-
-**request:** `Webflow.sites.FormsUpdateSubmissionRequest`
+**request:** `Webflow.workspaces.UpdateWorkspaceMemberRoleRequestBody`
@@ -8521,7 +13740,7 @@ await client.sites.forms.updateSubmission("580e63e98c9a982ac9b8b741", "580e63e98
-
-**requestOptions:** `FormsClient.RequestOptions`
+**requestOptions:** `MembersClient.RequestOptions`
@@ -8533,8 +13752,7 @@ await client.sites.forms.updateSubmission("580e63e98c9a982ac9b8b741", "580e63e98
-## Workspaces AuditLogs
-client.workspaces.auditLogs.getWorkspaceAuditLogs(workspace_id_or_slug, { ...params }) -> Webflow.WorkspaceAuditLogResponse
+client.workspaces.members.bulkUpdateMemberRoles(workspace_id, { ...params }) -> Webflow.WorkspaceBulkRoleChangeResponse
-
@@ -8546,11 +13764,25 @@ await client.sites.forms.updateSubmission("580e63e98c9a982ac9b8b741", "580e63e98
-
-Get audit logs for a workspace.
+Update the role of multiple workspace members and invites in one request. An invite can be updated regardless of status — pending, declined, or expired.
-This endpoint requires an Enterprise workspace and a workspace token with the `workspace_activity:read` scope. Create a workspace token from your workspace dashboard integrations page to use this endpoint.
+This answers `200` once the batch is applied, even when every item failed — a per-item problem is reported in `results` rather than failing the whole request. IDs are deduplicated before processing, so `results` can be shorter than the request; match a result back to your input by `id`, not by position.
-Required scope | `workspace_activity:read`
+This endpoint requires an Enterprise workspace.
+
+Required scope | `workspace_members:write`
+
+`role` and `defaultSiteRole` together decide what every id in the batch can do and what role the dashboard shows for them. Submit only one of the combinations below — the dashboard's own role picker never produces any other pairing.
+
+| `role` | `defaultSiteRole` | Shown in the dashboard as |
+|---|---|---|
+| `admin` | `site_manager` | Admin |
+| `member` | `site_manager` | Site manager |
+| `member` | `designer` | Designer |
+| `member` | `marketer` | Marketer |
+| `member` | `content_editor` | Content editor |
+| `member` | `custom` | The custom Site Role's own name. Requires `defaultSiteRoleId`. |
+| `reviewer` | `reviewer` | Reviewer |
@@ -8565,13 +13797,11 @@ Required scope | `workspace_activity:read`
-
```typescript
-await client.workspaces.auditLogs.getWorkspaceAuditLogs("hitchhikers-workspace", {
- limit: 1,
- offset: 1,
- sortOrder: "asc",
- eventType: "user_access",
- from: new Date("2025-06-22T16:00:31.000Z"),
- to: new Date("2025-07-22T16:00:31.000Z")
+await client.workspaces.members.bulkUpdateMemberRoles("580e63e98c9a982ac9b8b741", {
+ memberIds: ["62fa5e47f6b8256f4641c5bd", "62fa5e47f6b8256f4641c5be"],
+ inviteIds: ["63fa5e47f6b8256f4641c5bf"],
+ role: "member",
+ defaultSiteRole: "designer"
});
```
@@ -8588,7 +13818,7 @@ await client.workspaces.auditLogs.getWorkspaceAuditLogs("hitchhikers-workspace",
-
-**workspace_id_or_slug:** `string` — Unique identifier or slug for a Workspace
+**workspace_id:** `string` — Unique identifier for a Workspace. Find it with [List Workspaces](/data/reference/enterprise/workspace-management/list) (workspace API tokens and Data Client apps), or with `authorization.authorizedTo.workspaceIds` from [Get Authorization Info](/data/reference/token/introspect). With a site token, read `workspaceId` from [Get Site](/data/reference/sites/get).
@@ -8596,7 +13826,7 @@ await client.workspaces.auditLogs.getWorkspaceAuditLogs("hitchhikers-workspace",
-
-**request:** `Webflow.workspaces.AuditLogsGetWorkspaceAuditLogsRequest`
+**request:** `Webflow.workspaces.BulkUpdateWorkspaceMemberRolesRequestBody`
@@ -8604,7 +13834,7 @@ await client.workspaces.auditLogs.getWorkspaceAuditLogs("hitchhikers-workspace",
-
-**requestOptions:** `AuditLogsClient.RequestOptions`
+**requestOptions:** `MembersClient.RequestOptions`
diff --git a/src/Client.ts b/src/Client.ts
index 1f973607..7c40e529 100644
--- a/src/Client.ts
+++ b/src/Client.ts
@@ -1,11 +1,14 @@
// This file was auto-generated by Fern from our API Definition.
+import { AnalyzeClient } from "./api/resources/analyze/client/Client";
import { AssetsClient } from "./api/resources/assets/client/Client";
import { CollectionsClient } from "./api/resources/collections/client/Client";
import { ComponentsClient } from "./api/resources/components/client/Client";
+import { CustomFontsClient } from "./api/resources/customFonts/client/Client";
import { EcommerceClient } from "./api/resources/ecommerce/client/Client";
import { FormsClient } from "./api/resources/forms/client/Client";
import { InventoryClient } from "./api/resources/inventory/client/Client";
+import { OptimizeClient } from "./api/resources/optimize/client/Client";
import { OrdersClient } from "./api/resources/orders/client/Client";
import { PagesClient } from "./api/resources/pages/client/Client";
import { ProductsClient } from "./api/resources/products/client/Client";
@@ -26,19 +29,22 @@ export declare namespace WebflowClient {
export class WebflowClient {
protected readonly _options: NormalizedClientOptionsWithAuth;
protected _token: TokenClient | undefined;
+ protected _workspaces: WorkspacesClient | undefined;
protected _sites: SitesClient | undefined;
+ protected _optimize: OptimizeClient | undefined;
protected _collections: CollectionsClient | undefined;
protected _pages: PagesClient | undefined;
protected _components: ComponentsClient | undefined;
protected _scripts: ScriptsClient | undefined;
protected _assets: AssetsClient | undefined;
+ protected _customFonts: CustomFontsClient | undefined;
protected _webhooks: WebhooksClient | undefined;
protected _forms: FormsClient | undefined;
protected _products: ProductsClient | undefined;
protected _orders: OrdersClient | undefined;
protected _inventory: InventoryClient | undefined;
protected _ecommerce: EcommerceClient | undefined;
- protected _workspaces: WorkspacesClient | undefined;
+ protected _analyze: AnalyzeClient | undefined;
constructor(options: WebflowClient.Options) {
this._options = normalizeClientOptionsWithAuth(options);
@@ -48,10 +54,18 @@ export class WebflowClient {
return (this._token ??= new TokenClient(this._options));
}
+ public get workspaces(): WorkspacesClient {
+ return (this._workspaces ??= new WorkspacesClient(this._options));
+ }
+
public get sites(): SitesClient {
return (this._sites ??= new SitesClient(this._options));
}
+ public get optimize(): OptimizeClient {
+ return (this._optimize ??= new OptimizeClient(this._options));
+ }
+
public get collections(): CollectionsClient {
return (this._collections ??= new CollectionsClient(this._options));
}
@@ -72,6 +86,10 @@ export class WebflowClient {
return (this._assets ??= new AssetsClient(this._options));
}
+ public get customFonts(): CustomFontsClient {
+ return (this._customFonts ??= new CustomFontsClient(this._options));
+ }
+
public get webhooks(): WebhooksClient {
return (this._webhooks ??= new WebhooksClient(this._options));
}
@@ -96,7 +114,7 @@ export class WebflowClient {
return (this._ecommerce ??= new EcommerceClient(this._options));
}
- public get workspaces(): WorkspacesClient {
- return (this._workspaces ??= new WorkspacesClient(this._options));
+ public get analyze(): AnalyzeClient {
+ return (this._analyze ??= new AnalyzeClient(this._options));
}
}
diff --git a/src/api/errors/ServiceUnavailableError.ts b/src/api/errors/ServiceUnavailableError.ts
new file mode 100644
index 00000000..c8b2993c
--- /dev/null
+++ b/src/api/errors/ServiceUnavailableError.ts
@@ -0,0 +1,22 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as core from "../../core";
+import * as errors from "../../errors/index";
+import type * as Webflow from "../index";
+
+export class ServiceUnavailableError extends errors.WebflowError {
+ constructor(body: Webflow.Error_, rawResponse?: core.RawResponse) {
+ super({
+ message: "ServiceUnavailableError",
+ statusCode: 503,
+ body: body,
+ rawResponse: rawResponse,
+ });
+ Object.setPrototypeOf(this, new.target.prototype);
+ if (Error.captureStackTrace) {
+ Error.captureStackTrace(this, this.constructor);
+ }
+
+ this.name = this.constructor.name;
+ }
+}
diff --git a/src/api/errors/index.ts b/src/api/errors/index.ts
index fc45046b..3b80a3fa 100644
--- a/src/api/errors/index.ts
+++ b/src/api/errors/index.ts
@@ -3,5 +3,6 @@ export * from "./ConflictError";
export * from "./ForbiddenError";
export * from "./InternalServerError";
export * from "./NotFoundError";
+export * from "./ServiceUnavailableError";
export * from "./TooManyRequestsError";
export * from "./UnauthorizedError";
diff --git a/src/api/resources/analyze/client/Client.ts b/src/api/resources/analyze/client/Client.ts
new file mode 100644
index 00000000..ca9b4b3a
--- /dev/null
+++ b/src/api/resources/analyze/client/Client.ts
@@ -0,0 +1,28 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type { BaseClientOptions } from "../../../../BaseClient";
+import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../BaseClient";
+import { GoalsClient } from "../resources/goals/client/Client";
+import { ReportsClient } from "../resources/reports/client/Client";
+
+export declare namespace AnalyzeClient {
+ export type Options = BaseClientOptions;
+}
+
+export class AnalyzeClient {
+ protected readonly _options: NormalizedClientOptionsWithAuth;
+ protected _reports: ReportsClient | undefined;
+ protected _goals: GoalsClient | undefined;
+
+ constructor(options: AnalyzeClient.Options) {
+ this._options = normalizeClientOptionsWithAuth(options);
+ }
+
+ public get reports(): ReportsClient {
+ return (this._reports ??= new ReportsClient(this._options));
+ }
+
+ public get goals(): GoalsClient {
+ return (this._goals ??= new GoalsClient(this._options));
+ }
+}
diff --git a/src/api/resources/analyze/client/index.ts b/src/api/resources/analyze/client/index.ts
new file mode 100644
index 00000000..cb0ff5c3
--- /dev/null
+++ b/src/api/resources/analyze/client/index.ts
@@ -0,0 +1 @@
+export {};
diff --git a/src/api/resources/analyze/exports.ts b/src/api/resources/analyze/exports.ts
new file mode 100644
index 00000000..6bfa4f0e
--- /dev/null
+++ b/src/api/resources/analyze/exports.ts
@@ -0,0 +1,5 @@
+// This file was auto-generated by Fern from our API Definition.
+
+export { AnalyzeClient } from "./client/Client";
+export * from "./client/index";
+export * from "./resources/index";
diff --git a/src/api/resources/analyze/index.ts b/src/api/resources/analyze/index.ts
new file mode 100644
index 00000000..33a87f10
--- /dev/null
+++ b/src/api/resources/analyze/index.ts
@@ -0,0 +1,2 @@
+export * from "./client";
+export * from "./resources";
diff --git a/src/api/resources/analyze/resources/goals/client/Client.ts b/src/api/resources/analyze/resources/goals/client/Client.ts
new file mode 100644
index 00000000..c5ddd54a
--- /dev/null
+++ b/src/api/resources/analyze/resources/goals/client/Client.ts
@@ -0,0 +1,365 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient";
+import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient";
+import * as core from "../../../../../../core";
+import { mergeHeaders } from "../../../../../../core/headers";
+import * as environments from "../../../../../../environments";
+import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError";
+import * as errors from "../../../../../../errors/index";
+import * as serializers from "../../../../../../serialization/index";
+import * as Webflow from "../../../../../index";
+
+export declare namespace GoalsClient {
+ export type Options = BaseClientOptions;
+
+ export interface RequestOptions extends BaseRequestOptions {}
+}
+
+export class GoalsClient {
+ protected readonly _options: NormalizedClientOptionsWithAuth;
+
+ constructor(options: GoalsClient.Options) {
+ this._options = normalizeClientOptionsWithAuth(options);
+ }
+
+ /**
+ * Returns the goals configured for a site. This endpoint returns a list of goals, not a report. It takes no time window, filters, or other query parameters, and unknown query parameters return `400 analyze_input_validation`.
+ *
+ * Each goal includes its type (`goalType`) and whether it's a site goal (`isSiteGoal`). Integration goals also include `integrationSource`, and HubSpot or Marketo form goals include the `formId`. Use a goal's `goalId` with [Get Goal Performance](/data/reference/analyze/goal-performance) to get its daily conversions.
+ *
+ * This endpoint requires a workspace with the Analyze add-on.
+ *
+ * Each access token can have one Analyze request in flight at a time, across all Analyze endpoints. Additional concurrent requests return `429 Too Many Requests`. Wait for your in-flight request to finish, or for the `Retry-After` interval, then retry.
+ *
+ * Required scope | `sites:read`
+ *
+ * @param {string} site_id - Unique identifier for a Site
+ * @param {GoalsClient.RequestOptions} requestOptions - Request-specific configuration.
+ *
+ * @throws {@link Webflow.BadRequestError}
+ * @throws {@link Webflow.UnauthorizedError}
+ * @throws {@link Webflow.ForbiddenError}
+ * @throws {@link Webflow.NotFoundError}
+ * @throws {@link Webflow.TooManyRequestsError}
+ * @throws {@link Webflow.InternalServerError}
+ *
+ * @example
+ * await client.analyze.goals.listGoals("580e63e98c9a982ac9b8b741")
+ */
+ public listGoals(
+ site_id: string,
+ requestOptions?: GoalsClient.RequestOptions,
+ ): core.HttpResponsePromise {
+ return core.HttpResponsePromise.fromPromise(this.__listGoals(site_id, requestOptions));
+ }
+
+ private async __listGoals(
+ site_id: string,
+ requestOptions?: GoalsClient.RequestOptions,
+ ): Promise> {
+ const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest();
+ const _headers: core.Fetcher.Args["headers"] = mergeHeaders(
+ _authRequest.headers,
+ this._options?.headers,
+ requestOptions?.headers,
+ );
+ const _response = await core.fetcher({
+ url: core.url.join(
+ (await core.Supplier.get(this._options.baseUrl)) ??
+ ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi)
+ .base,
+ `sites/${core.url.encodePathParam(site_id)}/analyze/goals`,
+ ),
+ method: "GET",
+ headers: _headers,
+ queryParameters: requestOptions?.queryParams,
+ timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000,
+ maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries,
+ abortSignal: requestOptions?.abortSignal,
+ fetchFn: this._options?.fetch,
+ logging: this._options.logging,
+ });
+ if (_response.ok) {
+ return {
+ data: serializers.GoalsResponse.parseOrThrow(_response.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ rawResponse: _response.rawResponse,
+ };
+ }
+
+ if (_response.error.reason === "status-code") {
+ switch (_response.error.statusCode) {
+ case 400:
+ throw new Webflow.BadRequestError(_response.error.body, _response.rawResponse);
+ case 401:
+ throw new Webflow.UnauthorizedError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 403:
+ throw new Webflow.ForbiddenError(_response.error.body, _response.rawResponse);
+ case 404:
+ throw new Webflow.NotFoundError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 429:
+ throw new Webflow.TooManyRequestsError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 500:
+ throw new Webflow.InternalServerError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ default:
+ throw new errors.WebflowError({
+ statusCode: _response.error.statusCode,
+ body: _response.error.body,
+ rawResponse: _response.rawResponse,
+ });
+ }
+ }
+
+ return handleNonStatusCodeError(
+ _response.error,
+ _response.rawResponse,
+ "GET",
+ "/sites/{site_id}/analyze/goals",
+ );
+ }
+
+ /**
+ * Returns daily conversion counts for one goal over a time window, together with the goal's configuration (the same object [List Goals](/data/reference/analyze/list-goals) returns). Conversions are always counted as unique conversions.
+ *
+ * Days are bucketed in `bucketTimeZone`, which defaults to `UTC`. An unknown `goal_id` returns `404`. A goal with no conversions in the window returns an empty `data` array. Filter the report with top-level query parameters (`country`, `deviceType`, `pagePath`, etc.) or via the `filter` parameter for multi-value and negation matching.
+ *
+ * This endpoint requires a workspace with the Analyze add-on.
+ *
+ * Each access token can have one Analyze request in flight at a time, across all Analyze endpoints. Additional concurrent requests return `429 Too Many Requests`. Wait for your in-flight request to finish, or for the `Retry-After` interval, then retry.
+ *
+ * Required scope | `sites:read`
+ *
+ * @param {string} site_id - Unique identifier for a Site
+ * @param {string} goal_id - Identifier of the goal, from `goalId` in [List Goals](/data/reference/analyze/list-goals). A numeric string, not a Webflow object ID.
+ * @param {Webflow.analyze.GoalsGoalPerformanceRequest} request
+ * @param {GoalsClient.RequestOptions} requestOptions - Request-specific configuration.
+ *
+ * @throws {@link Webflow.BadRequestError}
+ * @throws {@link Webflow.UnauthorizedError}
+ * @throws {@link Webflow.ForbiddenError}
+ * @throws {@link Webflow.NotFoundError}
+ * @throws {@link Webflow.TooManyRequestsError}
+ * @throws {@link Webflow.InternalServerError}
+ *
+ * @example
+ * await client.analyze.goals.goalPerformance("580e63e98c9a982ac9b8b741", "198020177", {
+ * startTime: new Date("2026-04-01T00:00:00.000Z"),
+ * endTime: new Date("2026-04-08T00:00:00.000Z"),
+ * bucketTimeZone: "America/New_York",
+ * deviceType: "desktop",
+ * country: "US",
+ * pagePath: "/towels",
+ * trafficSource: "SO",
+ * referrer: "google.com",
+ * browser: "Chrome",
+ * utmCampaign: "dont-panic-2026",
+ * utmMedium: "email",
+ * utmSource: "hitchhikers-guide"
+ * })
+ */
+ public goalPerformance(
+ site_id: string,
+ goal_id: string,
+ request: Webflow.analyze.GoalsGoalPerformanceRequest,
+ requestOptions?: GoalsClient.RequestOptions,
+ ): core.HttpResponsePromise {
+ return core.HttpResponsePromise.fromPromise(this.__goalPerformance(site_id, goal_id, request, requestOptions));
+ }
+
+ private async __goalPerformance(
+ site_id: string,
+ goal_id: string,
+ request: Webflow.analyze.GoalsGoalPerformanceRequest,
+ requestOptions?: GoalsClient.RequestOptions,
+ ): Promise> {
+ const {
+ startTime,
+ endTime,
+ bucketTimeZone,
+ deviceType,
+ country,
+ pagePath,
+ trafficSource,
+ referrer,
+ browser,
+ utmCampaign,
+ utmMedium,
+ utmSource,
+ filter,
+ } = request;
+ const _queryParams: Record = {
+ startTime: startTime.toISOString(),
+ endTime: endTime.toISOString(),
+ bucketTimeZone,
+ deviceType:
+ deviceType != null
+ ? serializers.analyze.GoalsGoalPerformanceRequestDeviceType.jsonOrThrow(deviceType, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ omitUndefined: true,
+ })
+ : undefined,
+ country,
+ pagePath,
+ trafficSource,
+ referrer,
+ browser,
+ utmCampaign,
+ utmMedium,
+ utmSource,
+ filter:
+ filter != null
+ ? serializers.GoalPerformanceFilter.jsonOrThrow(filter, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ omitUndefined: true,
+ breadcrumbsPrefix: ["request", "filter"],
+ })
+ : filter,
+ };
+ const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest();
+ const _headers: core.Fetcher.Args["headers"] = mergeHeaders(
+ _authRequest.headers,
+ this._options?.headers,
+ requestOptions?.headers,
+ );
+ const _response = await core.fetcher({
+ url: core.url.join(
+ (await core.Supplier.get(this._options.baseUrl)) ??
+ ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi)
+ .base,
+ `sites/${core.url.encodePathParam(site_id)}/analyze/goals/${core.url.encodePathParam(goal_id)}/performance`,
+ ),
+ method: "GET",
+ headers: _headers,
+ queryParameters: { ..._queryParams, ...requestOptions?.queryParams },
+ timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000,
+ maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries,
+ abortSignal: requestOptions?.abortSignal,
+ fetchFn: this._options?.fetch,
+ logging: this._options.logging,
+ });
+ if (_response.ok) {
+ return {
+ data: serializers.GoalPerformanceResponse.parseOrThrow(_response.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ rawResponse: _response.rawResponse,
+ };
+ }
+
+ if (_response.error.reason === "status-code") {
+ switch (_response.error.statusCode) {
+ case 400:
+ throw new Webflow.BadRequestError(_response.error.body, _response.rawResponse);
+ case 401:
+ throw new Webflow.UnauthorizedError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 403:
+ throw new Webflow.ForbiddenError(_response.error.body, _response.rawResponse);
+ case 404:
+ throw new Webflow.NotFoundError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 429:
+ throw new Webflow.TooManyRequestsError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 500:
+ throw new Webflow.InternalServerError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ default:
+ throw new errors.WebflowError({
+ statusCode: _response.error.statusCode,
+ body: _response.error.body,
+ rawResponse: _response.rawResponse,
+ });
+ }
+ }
+
+ return handleNonStatusCodeError(
+ _response.error,
+ _response.rawResponse,
+ "GET",
+ "/sites/{site_id}/analyze/goals/{goal_id}/performance",
+ );
+ }
+}
diff --git a/src/api/resources/analyze/resources/goals/client/index.ts b/src/api/resources/analyze/resources/goals/client/index.ts
new file mode 100644
index 00000000..415726b7
--- /dev/null
+++ b/src/api/resources/analyze/resources/goals/client/index.ts
@@ -0,0 +1 @@
+export * from "./requests";
diff --git a/src/api/resources/analyze/resources/goals/client/requests/GoalsGoalPerformanceRequest.ts b/src/api/resources/analyze/resources/goals/client/requests/GoalsGoalPerformanceRequest.ts
new file mode 100644
index 00000000..d7f945fc
--- /dev/null
+++ b/src/api/resources/analyze/resources/goals/client/requests/GoalsGoalPerformanceRequest.ts
@@ -0,0 +1,52 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../../../../../index";
+
+/**
+ * @example
+ * {
+ * startTime: new Date("2026-04-01T00:00:00.000Z"),
+ * endTime: new Date("2026-04-08T00:00:00.000Z"),
+ * bucketTimeZone: "America/New_York",
+ * deviceType: "desktop",
+ * country: "US",
+ * pagePath: "/towels",
+ * trafficSource: "SO",
+ * referrer: "google.com",
+ * browser: "Chrome",
+ * utmCampaign: "dont-panic-2026",
+ * utmMedium: "email",
+ * utmSource: "hitchhikers-guide"
+ * }
+ */
+export interface GoalsGoalPerformanceRequest {
+ /** Inclusive start of the reporting window. Must be a UTC timestamp in ISO 8601 / RFC 3339 format ending in `Z` (for example, `2026-04-01T00:00:00Z`); numeric offsets such as `-04:00` or `+00:00` are not accepted. Must be on or after `2025-04-09T00:00:00Z`. */
+ startTime: Date;
+ /** Exclusive end of the reporting window. Must be a UTC timestamp in ISO 8601 / RFC 3339 format ending in `Z` (for example, `2026-04-08T00:00:00Z`); numeric offsets such as `-04:00` or `+00:00` are not accepted. Must be greater than `startTime` and within 100 days of it. */
+ endTime: Date;
+ /** IANA time zone used to align daily bucket boundaries. Defaults to `UTC`. */
+ bucketTimeZone?: Webflow.AnalyzeBucketTimeZone;
+ /** Restrict the report to a single device type. */
+ deviceType?: Webflow.analyze.GoalsGoalPerformanceRequestDeviceType;
+ /** Restrict the report to a single country. ISO 3166-1 alpha-2 (two letters, normalized to uppercase). */
+ country?: string;
+ /** Restrict the report to a single page path. */
+ pagePath?: string;
+ /** Restrict the report to a single traffic source code (for example, `SO` for Organic Search). */
+ trafficSource?: string;
+ /** Restrict the report to a single referrer domain. */
+ referrer?: string;
+ /** Restrict the report to a single browser. */
+ browser?: string;
+ /** Restrict the report to a single `utm_campaign` value. */
+ utmCampaign?: string;
+ /** Restrict the report to a single `utm_medium` value. */
+ utmMedium?: string;
+ /** Restrict the report to a single `utm_source` value. */
+ utmSource?: string;
+ /**
+ * Filter the report by dimension. Use bracket notation. Scalars take a single value (`filter[country][eq]=US`, `filter[country][ne]=US`). Arrays use indexed brackets (`filter[country][in][0]=US&filter[country][in][1]=CA`, `filter[country][nin][0]=US&filter[country][nin][1]=CA`).
+ * Each dimension entry takes at least one of `eq`, `in`, `ne`, or `nin`. Filter a given dimension in one place — either a top-level query parameter or a `filter` entry. See the `GoalPerformanceFilter` schema for the full list of supported dimensions.
+ */
+ filter?: Webflow.GoalPerformanceFilter;
+}
diff --git a/src/api/resources/analyze/resources/goals/client/requests/index.ts b/src/api/resources/analyze/resources/goals/client/requests/index.ts
new file mode 100644
index 00000000..561d30f1
--- /dev/null
+++ b/src/api/resources/analyze/resources/goals/client/requests/index.ts
@@ -0,0 +1 @@
+export type { GoalsGoalPerformanceRequest } from "./GoalsGoalPerformanceRequest";
diff --git a/src/api/resources/analyze/resources/goals/exports.ts b/src/api/resources/analyze/resources/goals/exports.ts
new file mode 100644
index 00000000..205ed004
--- /dev/null
+++ b/src/api/resources/analyze/resources/goals/exports.ts
@@ -0,0 +1,4 @@
+// This file was auto-generated by Fern from our API Definition.
+
+export { GoalsClient } from "./client/Client";
+export * from "./client/index";
diff --git a/src/api/resources/analyze/resources/goals/index.ts b/src/api/resources/analyze/resources/goals/index.ts
new file mode 100644
index 00000000..d2ec2302
--- /dev/null
+++ b/src/api/resources/analyze/resources/goals/index.ts
@@ -0,0 +1,2 @@
+export * from "./client";
+export * from "./types";
diff --git a/src/api/resources/analyze/resources/goals/types/GoalsGoalPerformanceRequestDeviceType.ts b/src/api/resources/analyze/resources/goals/types/GoalsGoalPerformanceRequestDeviceType.ts
new file mode 100644
index 00000000..e01dac60
--- /dev/null
+++ b/src/api/resources/analyze/resources/goals/types/GoalsGoalPerformanceRequestDeviceType.ts
@@ -0,0 +1,9 @@
+// This file was auto-generated by Fern from our API Definition.
+
+export const GoalsGoalPerformanceRequestDeviceType = {
+ Desktop: "desktop",
+ Mobile: "mobile",
+ Tablet: "tablet",
+} as const;
+export type GoalsGoalPerformanceRequestDeviceType =
+ (typeof GoalsGoalPerformanceRequestDeviceType)[keyof typeof GoalsGoalPerformanceRequestDeviceType];
diff --git a/src/api/resources/analyze/resources/goals/types/index.ts b/src/api/resources/analyze/resources/goals/types/index.ts
new file mode 100644
index 00000000..687f9638
--- /dev/null
+++ b/src/api/resources/analyze/resources/goals/types/index.ts
@@ -0,0 +1 @@
+export * from "./GoalsGoalPerformanceRequestDeviceType";
diff --git a/src/api/resources/analyze/resources/index.ts b/src/api/resources/analyze/resources/index.ts
new file mode 100644
index 00000000..f26bc2be
--- /dev/null
+++ b/src/api/resources/analyze/resources/index.ts
@@ -0,0 +1,6 @@
+export * as goals from "./goals";
+export * from "./goals/client/requests";
+export * from "./goals/types";
+export * as reports from "./reports";
+export * from "./reports/client/requests";
+export * from "./reports/types";
diff --git a/src/api/resources/analyze/resources/reports/client/Client.ts b/src/api/resources/analyze/resources/reports/client/Client.ts
new file mode 100644
index 00000000..c415670e
--- /dev/null
+++ b/src/api/resources/analyze/resources/reports/client/Client.ts
@@ -0,0 +1,1718 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient";
+import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient";
+import * as core from "../../../../../../core";
+import { mergeHeaders } from "../../../../../../core/headers";
+import * as environments from "../../../../../../environments";
+import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError";
+import * as errors from "../../../../../../errors/index";
+import * as serializers from "../../../../../../serialization/index";
+import * as Webflow from "../../../../../index";
+
+export declare namespace ReportsClient {
+ export type Options = BaseClientOptions;
+
+ export interface RequestOptions extends BaseRequestOptions {}
+}
+
+export class ReportsClient {
+ protected readonly _options: NormalizedClientOptionsWithAuth;
+
+ constructor(options: ReportsClient.Options) {
+ this._options = normalizeClientOptionsWithAuth(options);
+ }
+
+ /**
+ * Returns a daily time series of a single metric — sessions, users, or page views — over a time window.
+ *
+ * Filter the report with top-level query parameters (`country`, `deviceType`, `pagePath`, etc.) or via the `filter` parameter for multi-value and negation matching.
+ *
+ * This endpoint requires a workspace with the Analyze add-on.
+ *
+ * Each access token can have one Analyze request in flight at a time, across all Analyze endpoints. Additional concurrent requests return `429 Too Many Requests`. Wait for your in-flight request to finish, or for the `Retry-After` interval, then retry.
+ *
+ * Required scope | `sites:read`
+ *
+ * @param {string} site_id - Unique identifier for a Site
+ * @param {Webflow.analyze.ReportsTrafficRequest} request
+ * @param {ReportsClient.RequestOptions} requestOptions - Request-specific configuration.
+ *
+ * @throws {@link Webflow.BadRequestError}
+ * @throws {@link Webflow.UnauthorizedError}
+ * @throws {@link Webflow.ForbiddenError}
+ * @throws {@link Webflow.NotFoundError}
+ * @throws {@link Webflow.TooManyRequestsError}
+ * @throws {@link Webflow.InternalServerError}
+ *
+ * @example
+ * await client.analyze.reports.traffic("580e63e98c9a982ac9b8b741", {
+ * startTime: new Date("2026-04-01T00:00:00.000Z"),
+ * endTime: new Date("2026-04-08T00:00:00.000Z"),
+ * metricScope: "session",
+ * bucketTimeZone: "America/New_York",
+ * deviceType: "desktop",
+ * country: "US",
+ * pagePath: "/towels",
+ * trafficSource: "SO",
+ * referrer: "google.com",
+ * browser: "Chrome",
+ * utmCampaign: "dont-panic-2026",
+ * utmMedium: "email",
+ * utmSource: "hitchhikers-guide"
+ * })
+ */
+ public traffic(
+ site_id: string,
+ request: Webflow.analyze.ReportsTrafficRequest,
+ requestOptions?: ReportsClient.RequestOptions,
+ ): core.HttpResponsePromise {
+ return core.HttpResponsePromise.fromPromise(this.__traffic(site_id, request, requestOptions));
+ }
+
+ private async __traffic(
+ site_id: string,
+ request: Webflow.analyze.ReportsTrafficRequest,
+ requestOptions?: ReportsClient.RequestOptions,
+ ): Promise> {
+ const {
+ startTime,
+ endTime,
+ metricScope,
+ bucketTimeZone,
+ deviceType,
+ country,
+ pagePath,
+ trafficSource,
+ referrer,
+ browser,
+ utmCampaign,
+ utmMedium,
+ utmSource,
+ filter,
+ } = request;
+ const _queryParams: Record = {
+ startTime: startTime.toISOString(),
+ endTime: endTime.toISOString(),
+ metricScope: serializers.TrafficMetricScope.jsonOrThrow(metricScope, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ omitUndefined: true,
+ }),
+ bucketTimeZone,
+ deviceType:
+ deviceType != null
+ ? serializers.analyze.ReportsTrafficRequestDeviceType.jsonOrThrow(deviceType, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ omitUndefined: true,
+ })
+ : undefined,
+ country,
+ pagePath,
+ trafficSource,
+ referrer,
+ browser,
+ utmCampaign,
+ utmMedium,
+ utmSource,
+ filter:
+ filter != null
+ ? serializers.TrafficFilter.jsonOrThrow(filter, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ omitUndefined: true,
+ breadcrumbsPrefix: ["request", "filter"],
+ })
+ : filter,
+ };
+ const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest();
+ const _headers: core.Fetcher.Args["headers"] = mergeHeaders(
+ _authRequest.headers,
+ this._options?.headers,
+ requestOptions?.headers,
+ );
+ const _response = await core.fetcher({
+ url: core.url.join(
+ (await core.Supplier.get(this._options.baseUrl)) ??
+ ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi)
+ .base,
+ `sites/${core.url.encodePathParam(site_id)}/analyze/reports/traffic`,
+ ),
+ method: "GET",
+ headers: _headers,
+ queryParameters: { ..._queryParams, ...requestOptions?.queryParams },
+ timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000,
+ maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries,
+ abortSignal: requestOptions?.abortSignal,
+ fetchFn: this._options?.fetch,
+ logging: this._options.logging,
+ });
+ if (_response.ok) {
+ return {
+ data: serializers.TrafficResponse.parseOrThrow(_response.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ rawResponse: _response.rawResponse,
+ };
+ }
+
+ if (_response.error.reason === "status-code") {
+ switch (_response.error.statusCode) {
+ case 400:
+ throw new Webflow.BadRequestError(_response.error.body, _response.rawResponse);
+ case 401:
+ throw new Webflow.UnauthorizedError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 403:
+ throw new Webflow.ForbiddenError(_response.error.body, _response.rawResponse);
+ case 404:
+ throw new Webflow.NotFoundError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 429:
+ throw new Webflow.TooManyRequestsError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 500:
+ throw new Webflow.InternalServerError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ default:
+ throw new errors.WebflowError({
+ statusCode: _response.error.statusCode,
+ body: _response.error.body,
+ rawResponse: _response.rawResponse,
+ });
+ }
+ }
+
+ return handleNonStatusCodeError(
+ _response.error,
+ _response.rawResponse,
+ "GET",
+ "/sites/{site_id}/analyze/reports/traffic",
+ );
+ }
+
+ /**
+ * Returns the most-visited pages over a time window, ranked by `sortBy` (sessions, users, or page views).
+ *
+ * Each row carries all three scope counts; `sortBy` only governs ordering. Filter the report with top-level query parameters (`country`, `deviceType`, `pagePath`, etc.) or via the `filter` parameter for multi-value and negation matching.
+ *
+ * Set `timeseries[bucketTimeZone]` to attach a daily page view `timeseries` to each row. Bucket counts are always page views regardless of `sortBy`. Row-level counts honor the requested sort, but the timeseries does not.
+ *
+ * This endpoint requires a workspace with the Analyze add-on.
+ *
+ * Each access token can have one Analyze request in flight at a time, across all Analyze endpoints. Additional concurrent requests return `429 Too Many Requests`. Wait for your in-flight request to finish, or for the `Retry-After` interval, then retry.
+ *
+ * Required scope | `sites:read`
+ *
+ * @param {string} site_id - Unique identifier for a Site
+ * @param {Webflow.analyze.ReportsTopPagesRequest} request
+ * @param {ReportsClient.RequestOptions} requestOptions - Request-specific configuration.
+ *
+ * @throws {@link Webflow.BadRequestError}
+ * @throws {@link Webflow.UnauthorizedError}
+ * @throws {@link Webflow.ForbiddenError}
+ * @throws {@link Webflow.NotFoundError}
+ * @throws {@link Webflow.TooManyRequestsError}
+ * @throws {@link Webflow.InternalServerError}
+ *
+ * @example
+ * await client.analyze.reports.topPages("580e63e98c9a982ac9b8b741", {
+ * startTime: new Date("2026-04-01T00:00:00.000Z"),
+ * endTime: new Date("2026-04-08T00:00:00.000Z"),
+ * sortBy: "session",
+ * limit: 1,
+ * deviceType: "desktop",
+ * country: "US",
+ * pagePath: "/towels",
+ * trafficSource: "SO",
+ * referrer: "google.com",
+ * browser: "Chrome",
+ * utmCampaign: "dont-panic-2026",
+ * utmMedium: "email",
+ * utmSource: "hitchhikers-guide"
+ * })
+ */
+ public topPages(
+ site_id: string,
+ request: Webflow.analyze.ReportsTopPagesRequest,
+ requestOptions?: ReportsClient.RequestOptions,
+ ): core.HttpResponsePromise {
+ return core.HttpResponsePromise.fromPromise(this.__topPages(site_id, request, requestOptions));
+ }
+
+ private async __topPages(
+ site_id: string,
+ request: Webflow.analyze.ReportsTopPagesRequest,
+ requestOptions?: ReportsClient.RequestOptions,
+ ): Promise> {
+ const {
+ startTime,
+ endTime,
+ sortBy,
+ limit,
+ timeseries,
+ deviceType,
+ country,
+ pagePath,
+ trafficSource,
+ referrer,
+ browser,
+ utmCampaign,
+ utmMedium,
+ utmSource,
+ filter,
+ } = request;
+ const _queryParams: Record = {
+ startTime: startTime.toISOString(),
+ endTime: endTime.toISOString(),
+ sortBy:
+ sortBy != null
+ ? serializers.TopPagesSortBy.jsonOrThrow(sortBy, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ omitUndefined: true,
+ })
+ : undefined,
+ limit,
+ timeseries:
+ timeseries != null
+ ? serializers.AnalyzeDailyTimeseriesQuery.jsonOrThrow(timeseries, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ omitUndefined: true,
+ breadcrumbsPrefix: ["request", "timeseries"],
+ })
+ : timeseries,
+ deviceType:
+ deviceType != null
+ ? serializers.analyze.ReportsTopPagesRequestDeviceType.jsonOrThrow(deviceType, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ omitUndefined: true,
+ })
+ : undefined,
+ country,
+ pagePath,
+ trafficSource,
+ referrer,
+ browser,
+ utmCampaign,
+ utmMedium,
+ utmSource,
+ filter:
+ filter != null
+ ? serializers.TopPagesFilter.jsonOrThrow(filter, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ omitUndefined: true,
+ breadcrumbsPrefix: ["request", "filter"],
+ })
+ : filter,
+ };
+ const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest();
+ const _headers: core.Fetcher.Args["headers"] = mergeHeaders(
+ _authRequest.headers,
+ this._options?.headers,
+ requestOptions?.headers,
+ );
+ const _response = await core.fetcher({
+ url: core.url.join(
+ (await core.Supplier.get(this._options.baseUrl)) ??
+ ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi)
+ .base,
+ `sites/${core.url.encodePathParam(site_id)}/analyze/reports/top_pages`,
+ ),
+ method: "GET",
+ headers: _headers,
+ queryParameters: { ..._queryParams, ...requestOptions?.queryParams },
+ timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000,
+ maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries,
+ abortSignal: requestOptions?.abortSignal,
+ fetchFn: this._options?.fetch,
+ logging: this._options.logging,
+ });
+ if (_response.ok) {
+ return {
+ data: serializers.TopPagesResponse.parseOrThrow(_response.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ rawResponse: _response.rawResponse,
+ };
+ }
+
+ if (_response.error.reason === "status-code") {
+ switch (_response.error.statusCode) {
+ case 400:
+ throw new Webflow.BadRequestError(_response.error.body, _response.rawResponse);
+ case 401:
+ throw new Webflow.UnauthorizedError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 403:
+ throw new Webflow.ForbiddenError(_response.error.body, _response.rawResponse);
+ case 404:
+ throw new Webflow.NotFoundError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 429:
+ throw new Webflow.TooManyRequestsError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 500:
+ throw new Webflow.InternalServerError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ default:
+ throw new errors.WebflowError({
+ statusCode: _response.error.statusCode,
+ body: _response.error.body,
+ rawResponse: _response.rawResponse,
+ });
+ }
+ }
+
+ return handleNonStatusCodeError(
+ _response.error,
+ _response.rawResponse,
+ "GET",
+ "/sites/{site_id}/analyze/reports/top_pages",
+ );
+ }
+
+ /**
+ * Returns the top values within a chosen `dimension` — top countries, top traffic sources, top campaigns, top audiences, and so on — over a time window, ranked by sessions or users.
+ *
+ * Filter the report with top-level query parameters (`country`, `deviceType`, `pagePath`, etc.) or via the `filter` parameter for multi-value and negation matching.
+ *
+ * This endpoint requires a workspace with the Analyze add-on.
+ *
+ * Each access token can have one Analyze request in flight at a time, across all Analyze endpoints. Additional concurrent requests return `429 Too Many Requests`. Wait for your in-flight request to finish, or for the `Retry-After` interval, then retry.
+ *
+ * Required scope | `sites:read`
+ *
+ * @param {string} site_id - Unique identifier for a Site
+ * @param {Webflow.analyze.ReportsTopDimensionsRequest} request
+ * @param {ReportsClient.RequestOptions} requestOptions - Request-specific configuration.
+ *
+ * @throws {@link Webflow.BadRequestError}
+ * @throws {@link Webflow.UnauthorizedError}
+ * @throws {@link Webflow.ForbiddenError}
+ * @throws {@link Webflow.NotFoundError}
+ * @throws {@link Webflow.TooManyRequestsError}
+ * @throws {@link Webflow.InternalServerError}
+ *
+ * @example
+ * await client.analyze.reports.topDimensions("580e63e98c9a982ac9b8b741", {
+ * startTime: new Date("2026-04-01T00:00:00.000Z"),
+ * endTime: new Date("2026-04-08T00:00:00.000Z"),
+ * dimension: "country",
+ * metricScope: "session",
+ * limit: 1,
+ * deviceType: "desktop",
+ * country: "US",
+ * pagePath: "/towels",
+ * trafficSource: "SO",
+ * referrer: "google.com",
+ * browser: "Chrome",
+ * utmCampaign: "dont-panic-2026",
+ * utmMedium: "email",
+ * utmSource: "hitchhikers-guide"
+ * })
+ */
+ public topDimensions(
+ site_id: string,
+ request: Webflow.analyze.ReportsTopDimensionsRequest,
+ requestOptions?: ReportsClient.RequestOptions,
+ ): core.HttpResponsePromise {
+ return core.HttpResponsePromise.fromPromise(this.__topDimensions(site_id, request, requestOptions));
+ }
+
+ private async __topDimensions(
+ site_id: string,
+ request: Webflow.analyze.ReportsTopDimensionsRequest,
+ requestOptions?: ReportsClient.RequestOptions,
+ ): Promise> {
+ const {
+ startTime,
+ endTime,
+ dimension,
+ metricScope,
+ limit,
+ deviceType,
+ country,
+ pagePath,
+ trafficSource,
+ referrer,
+ browser,
+ utmCampaign,
+ utmMedium,
+ utmSource,
+ filter,
+ } = request;
+ const _queryParams: Record = {
+ startTime: startTime.toISOString(),
+ endTime: endTime.toISOString(),
+ dimension: serializers.TopDimensionsDimension.jsonOrThrow(dimension, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ omitUndefined: true,
+ }),
+ metricScope: serializers.TopDimensionsMetricScope.jsonOrThrow(metricScope, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ omitUndefined: true,
+ }),
+ limit,
+ deviceType:
+ deviceType != null
+ ? serializers.analyze.ReportsTopDimensionsRequestDeviceType.jsonOrThrow(deviceType, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ omitUndefined: true,
+ })
+ : undefined,
+ country,
+ pagePath,
+ trafficSource,
+ referrer,
+ browser,
+ utmCampaign,
+ utmMedium,
+ utmSource,
+ filter:
+ filter != null
+ ? serializers.TopDimensionsFilter.jsonOrThrow(filter, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ omitUndefined: true,
+ breadcrumbsPrefix: ["request", "filter"],
+ })
+ : filter,
+ };
+ const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest();
+ const _headers: core.Fetcher.Args["headers"] = mergeHeaders(
+ _authRequest.headers,
+ this._options?.headers,
+ requestOptions?.headers,
+ );
+ const _response = await core.fetcher({
+ url: core.url.join(
+ (await core.Supplier.get(this._options.baseUrl)) ??
+ ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi)
+ .base,
+ `sites/${core.url.encodePathParam(site_id)}/analyze/reports/top_dimensions`,
+ ),
+ method: "GET",
+ headers: _headers,
+ queryParameters: { ..._queryParams, ...requestOptions?.queryParams },
+ timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000,
+ maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries,
+ abortSignal: requestOptions?.abortSignal,
+ fetchFn: this._options?.fetch,
+ logging: this._options.logging,
+ });
+ if (_response.ok) {
+ return {
+ data: serializers.TopDimensionsResponse.parseOrThrow(_response.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ rawResponse: _response.rawResponse,
+ };
+ }
+
+ if (_response.error.reason === "status-code") {
+ switch (_response.error.statusCode) {
+ case 400:
+ throw new Webflow.BadRequestError(_response.error.body, _response.rawResponse);
+ case 401:
+ throw new Webflow.UnauthorizedError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 403:
+ throw new Webflow.ForbiddenError(_response.error.body, _response.rawResponse);
+ case 404:
+ throw new Webflow.NotFoundError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 429:
+ throw new Webflow.TooManyRequestsError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 500:
+ throw new Webflow.InternalServerError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ default:
+ throw new errors.WebflowError({
+ statusCode: _response.error.statusCode,
+ body: _response.error.body,
+ rawResponse: _response.rawResponse,
+ });
+ }
+ }
+
+ return handleNonStatusCodeError(
+ _response.error,
+ _response.rawResponse,
+ "GET",
+ "/sites/{site_id}/analyze/reports/top_dimensions",
+ );
+ }
+
+ /**
+ * Returns the top events over a time window, ranked by how often they occurred.
+ *
+ * Events are counted individually, not rolled up into sessions, users, or page views — so this report has no `metricScope`. Each row's `count` is how many times the event occurred. Filter the report with top-level query parameters (`country`, `deviceType`, `pagePath`, etc.) or via the `filter` parameter for multi-value and negation matching.
+ *
+ * Set `timeseries[bucketTimeZone]` to attach a daily event count `timeseries` to each row.
+ *
+ * This endpoint requires a workspace with the Analyze add-on.
+ *
+ * Each access token can have one Analyze request in flight at a time, across all Analyze endpoints. Additional concurrent requests return `429 Too Many Requests`. Wait for your in-flight request to finish, or for the `Retry-After` interval, then retry.
+ *
+ * Required scope | `sites:read`
+ *
+ * @param {string} site_id - Unique identifier for a Site
+ * @param {Webflow.analyze.ReportsTopEventsRequest} request
+ * @param {ReportsClient.RequestOptions} requestOptions - Request-specific configuration.
+ *
+ * @throws {@link Webflow.BadRequestError}
+ * @throws {@link Webflow.UnauthorizedError}
+ * @throws {@link Webflow.ForbiddenError}
+ * @throws {@link Webflow.NotFoundError}
+ * @throws {@link Webflow.TooManyRequestsError}
+ * @throws {@link Webflow.InternalServerError}
+ *
+ * @example
+ * await client.analyze.reports.topEvents("580e63e98c9a982ac9b8b741", {
+ * startTime: new Date("2026-04-01T00:00:00.000Z"),
+ * endTime: new Date("2026-04-08T00:00:00.000Z"),
+ * limit: 1,
+ * deviceType: "desktop",
+ * country: "US",
+ * pagePath: "/towels",
+ * trafficSource: "SO",
+ * browser: "Chrome",
+ * utmCampaign: "dont-panic-2026",
+ * utmMedium: "email",
+ * utmSource: "hitchhikers-guide"
+ * })
+ */
+ public topEvents(
+ site_id: string,
+ request: Webflow.analyze.ReportsTopEventsRequest,
+ requestOptions?: ReportsClient.RequestOptions,
+ ): core.HttpResponsePromise {
+ return core.HttpResponsePromise.fromPromise(this.__topEvents(site_id, request, requestOptions));
+ }
+
+ private async __topEvents(
+ site_id: string,
+ request: Webflow.analyze.ReportsTopEventsRequest,
+ requestOptions?: ReportsClient.RequestOptions,
+ ): Promise> {
+ const {
+ startTime,
+ endTime,
+ limit,
+ timeseries,
+ deviceType,
+ country,
+ pagePath,
+ trafficSource,
+ browser,
+ utmCampaign,
+ utmMedium,
+ utmSource,
+ filter,
+ } = request;
+ const _queryParams: Record = {
+ startTime: startTime.toISOString(),
+ endTime: endTime.toISOString(),
+ limit,
+ timeseries:
+ timeseries != null
+ ? serializers.AnalyzeDailyTimeseriesQuery.jsonOrThrow(timeseries, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ omitUndefined: true,
+ breadcrumbsPrefix: ["request", "timeseries"],
+ })
+ : timeseries,
+ deviceType:
+ deviceType != null
+ ? serializers.analyze.ReportsTopEventsRequestDeviceType.jsonOrThrow(deviceType, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ omitUndefined: true,
+ })
+ : undefined,
+ country,
+ pagePath,
+ trafficSource,
+ browser,
+ utmCampaign,
+ utmMedium,
+ utmSource,
+ filter:
+ filter != null
+ ? serializers.TopEventsFilter.jsonOrThrow(filter, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ omitUndefined: true,
+ breadcrumbsPrefix: ["request", "filter"],
+ })
+ : filter,
+ };
+ const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest();
+ const _headers: core.Fetcher.Args["headers"] = mergeHeaders(
+ _authRequest.headers,
+ this._options?.headers,
+ requestOptions?.headers,
+ );
+ const _response = await core.fetcher({
+ url: core.url.join(
+ (await core.Supplier.get(this._options.baseUrl)) ??
+ ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi)
+ .base,
+ `sites/${core.url.encodePathParam(site_id)}/analyze/reports/top_events`,
+ ),
+ method: "GET",
+ headers: _headers,
+ queryParameters: { ..._queryParams, ...requestOptions?.queryParams },
+ timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000,
+ maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries,
+ abortSignal: requestOptions?.abortSignal,
+ fetchFn: this._options?.fetch,
+ logging: this._options.logging,
+ });
+ if (_response.ok) {
+ return {
+ data: serializers.TopEventsResponse.parseOrThrow(_response.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ rawResponse: _response.rawResponse,
+ };
+ }
+
+ if (_response.error.reason === "status-code") {
+ switch (_response.error.statusCode) {
+ case 400:
+ throw new Webflow.BadRequestError(_response.error.body, _response.rawResponse);
+ case 401:
+ throw new Webflow.UnauthorizedError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 403:
+ throw new Webflow.ForbiddenError(_response.error.body, _response.rawResponse);
+ case 404:
+ throw new Webflow.NotFoundError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 429:
+ throw new Webflow.TooManyRequestsError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 500:
+ throw new Webflow.InternalServerError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ default:
+ throw new errors.WebflowError({
+ statusCode: _response.error.statusCode,
+ body: _response.error.body,
+ rawResponse: _response.rawResponse,
+ });
+ }
+ }
+
+ return handleNonStatusCodeError(
+ _response.error,
+ _response.rawResponse,
+ "GET",
+ "/sites/{site_id}/analyze/reports/top_events",
+ );
+ }
+
+ /**
+ * Returns the average time on page over a time window — as a single aggregate value, or bucketed by day or week when `timeseries` is supplied.
+ *
+ * Choose how the average is computed with `metricScope` (per session, user, or page view). Filter the report with top-level query parameters (`country`, `deviceType`, `pagePath`, etc.) or via the `filter` parameter for multi-value and negation matching.
+ *
+ * This endpoint requires a workspace with the Analyze add-on.
+ *
+ * Each access token can have one Analyze request in flight at a time, across all Analyze endpoints. Additional concurrent requests return `429 Too Many Requests`. Wait for your in-flight request to finish, or for the `Retry-After` interval, then retry.
+ *
+ * Required scope | `sites:read`
+ *
+ * @param {string} site_id - Unique identifier for a Site
+ * @param {Webflow.analyze.ReportsTimeOnPageRequest} request
+ * @param {ReportsClient.RequestOptions} requestOptions - Request-specific configuration.
+ *
+ * @throws {@link Webflow.BadRequestError}
+ * @throws {@link Webflow.UnauthorizedError}
+ * @throws {@link Webflow.ForbiddenError}
+ * @throws {@link Webflow.NotFoundError}
+ * @throws {@link Webflow.TooManyRequestsError}
+ * @throws {@link Webflow.InternalServerError}
+ *
+ * @example
+ * await client.analyze.reports.timeOnPage("580e63e98c9a982ac9b8b741", {
+ * startTime: new Date("2026-04-01T00:00:00.000Z"),
+ * endTime: new Date("2026-04-08T00:00:00.000Z"),
+ * metricScope: "session",
+ * deviceType: "desktop",
+ * country: "US",
+ * pagePath: "/towels",
+ * trafficSource: "SO",
+ * referrer: "google.com",
+ * browser: "Chrome",
+ * utmCampaign: "dont-panic-2026",
+ * utmMedium: "email",
+ * utmSource: "hitchhikers-guide"
+ * })
+ */
+ public timeOnPage(
+ site_id: string,
+ request: Webflow.analyze.ReportsTimeOnPageRequest,
+ requestOptions?: ReportsClient.RequestOptions,
+ ): core.HttpResponsePromise {
+ return core.HttpResponsePromise.fromPromise(this.__timeOnPage(site_id, request, requestOptions));
+ }
+
+ private async __timeOnPage(
+ site_id: string,
+ request: Webflow.analyze.ReportsTimeOnPageRequest,
+ requestOptions?: ReportsClient.RequestOptions,
+ ): Promise> {
+ const {
+ startTime,
+ endTime,
+ metricScope,
+ timeseries,
+ deviceType,
+ country,
+ pagePath,
+ trafficSource,
+ referrer,
+ browser,
+ utmCampaign,
+ utmMedium,
+ utmSource,
+ filter,
+ } = request;
+ const _queryParams: Record = {
+ startTime: startTime.toISOString(),
+ endTime: endTime.toISOString(),
+ metricScope: serializers.TimeOnPageMetricScope.jsonOrThrow(metricScope, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ omitUndefined: true,
+ }),
+ timeseries:
+ timeseries != null
+ ? serializers.TimeOnPageTimeseriesQuery.jsonOrThrow(timeseries, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ omitUndefined: true,
+ breadcrumbsPrefix: ["request", "timeseries"],
+ })
+ : timeseries,
+ deviceType:
+ deviceType != null
+ ? serializers.analyze.ReportsTimeOnPageRequestDeviceType.jsonOrThrow(deviceType, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ omitUndefined: true,
+ })
+ : undefined,
+ country,
+ pagePath,
+ trafficSource,
+ referrer,
+ browser,
+ utmCampaign,
+ utmMedium,
+ utmSource,
+ filter:
+ filter != null
+ ? serializers.TimeOnPageFilter.jsonOrThrow(filter, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ omitUndefined: true,
+ breadcrumbsPrefix: ["request", "filter"],
+ })
+ : filter,
+ };
+ const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest();
+ const _headers: core.Fetcher.Args["headers"] = mergeHeaders(
+ _authRequest.headers,
+ this._options?.headers,
+ requestOptions?.headers,
+ );
+ const _response = await core.fetcher({
+ url: core.url.join(
+ (await core.Supplier.get(this._options.baseUrl)) ??
+ ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi)
+ .base,
+ `sites/${core.url.encodePathParam(site_id)}/analyze/reports/time_on_page`,
+ ),
+ method: "GET",
+ headers: _headers,
+ queryParameters: { ..._queryParams, ...requestOptions?.queryParams },
+ timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000,
+ maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries,
+ abortSignal: requestOptions?.abortSignal,
+ fetchFn: this._options?.fetch,
+ logging: this._options.logging,
+ });
+ if (_response.ok) {
+ return {
+ data: serializers.TimeOnPageResponse.parseOrThrow(_response.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ rawResponse: _response.rawResponse,
+ };
+ }
+
+ if (_response.error.reason === "status-code") {
+ switch (_response.error.statusCode) {
+ case 400:
+ throw new Webflow.BadRequestError(_response.error.body, _response.rawResponse);
+ case 401:
+ throw new Webflow.UnauthorizedError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 403:
+ throw new Webflow.ForbiddenError(_response.error.body, _response.rawResponse);
+ case 404:
+ throw new Webflow.NotFoundError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 429:
+ throw new Webflow.TooManyRequestsError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 500:
+ throw new Webflow.InternalServerError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ default:
+ throw new errors.WebflowError({
+ statusCode: _response.error.statusCode,
+ body: _response.error.body,
+ rawResponse: _response.rawResponse,
+ });
+ }
+ }
+
+ return handleNonStatusCodeError(
+ _response.error,
+ _response.rawResponse,
+ "GET",
+ "/sites/{site_id}/analyze/reports/time_on_page",
+ );
+ }
+
+ /**
+ * Returns the scroll-depth distribution for the site over a time window. Each row reports the scroll depth (in pixels) that a share of page views reached, at fixed breakpoints of 75%, 50%, and 25% of page views.
+ *
+ * Filter the report with top-level query parameters (`country`, `deviceType`, `pagePath`, etc.) or via the `filter` parameter for multi-value and negation matching. Omit `deviceType` to include all devices.
+ *
+ * This endpoint requires a workspace with the Analyze add-on.
+ *
+ * Each access token can have one Analyze request in flight at a time, across all Analyze endpoints. Additional concurrent requests return `429 Too Many Requests`. Wait for your in-flight request to finish, or for the `Retry-After` interval, then retry.
+ *
+ * Required scope | `sites:read`
+ *
+ * @param {string} site_id - Unique identifier for a Site
+ * @param {Webflow.analyze.ReportsScrollDepthRequest} request
+ * @param {ReportsClient.RequestOptions} requestOptions - Request-specific configuration.
+ *
+ * @throws {@link Webflow.BadRequestError}
+ * @throws {@link Webflow.UnauthorizedError}
+ * @throws {@link Webflow.ForbiddenError}
+ * @throws {@link Webflow.NotFoundError}
+ * @throws {@link Webflow.TooManyRequestsError}
+ * @throws {@link Webflow.InternalServerError}
+ *
+ * @example
+ * await client.analyze.reports.scrollDepth("580e63e98c9a982ac9b8b741", {
+ * startTime: new Date("2026-04-01T00:00:00.000Z"),
+ * endTime: new Date("2026-04-08T00:00:00.000Z"),
+ * deviceType: "desktop",
+ * country: "US",
+ * pagePath: "/towels",
+ * trafficSource: "SO",
+ * referrer: "google.com",
+ * browser: "Chrome",
+ * utmCampaign: "dont-panic-2026",
+ * utmMedium: "email",
+ * utmSource: "hitchhikers-guide"
+ * })
+ */
+ public scrollDepth(
+ site_id: string,
+ request: Webflow.analyze.ReportsScrollDepthRequest,
+ requestOptions?: ReportsClient.RequestOptions,
+ ): core.HttpResponsePromise {
+ return core.HttpResponsePromise.fromPromise(this.__scrollDepth(site_id, request, requestOptions));
+ }
+
+ private async __scrollDepth(
+ site_id: string,
+ request: Webflow.analyze.ReportsScrollDepthRequest,
+ requestOptions?: ReportsClient.RequestOptions,
+ ): Promise> {
+ const {
+ startTime,
+ endTime,
+ deviceType,
+ country,
+ pagePath,
+ trafficSource,
+ referrer,
+ browser,
+ utmCampaign,
+ utmMedium,
+ utmSource,
+ filter,
+ } = request;
+ const _queryParams: Record = {
+ startTime: startTime.toISOString(),
+ endTime: endTime.toISOString(),
+ deviceType:
+ deviceType != null
+ ? serializers.analyze.ReportsScrollDepthRequestDeviceType.jsonOrThrow(deviceType, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ omitUndefined: true,
+ })
+ : undefined,
+ country,
+ pagePath,
+ trafficSource,
+ referrer,
+ browser,
+ utmCampaign,
+ utmMedium,
+ utmSource,
+ filter:
+ filter != null
+ ? serializers.ScrollDepthFilter.jsonOrThrow(filter, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ omitUndefined: true,
+ breadcrumbsPrefix: ["request", "filter"],
+ })
+ : filter,
+ };
+ const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest();
+ const _headers: core.Fetcher.Args["headers"] = mergeHeaders(
+ _authRequest.headers,
+ this._options?.headers,
+ requestOptions?.headers,
+ );
+ const _response = await core.fetcher({
+ url: core.url.join(
+ (await core.Supplier.get(this._options.baseUrl)) ??
+ ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi)
+ .base,
+ `sites/${core.url.encodePathParam(site_id)}/analyze/reports/scroll_depth`,
+ ),
+ method: "GET",
+ headers: _headers,
+ queryParameters: { ..._queryParams, ...requestOptions?.queryParams },
+ timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000,
+ maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries,
+ abortSignal: requestOptions?.abortSignal,
+ fetchFn: this._options?.fetch,
+ logging: this._options.logging,
+ });
+ if (_response.ok) {
+ return {
+ data: serializers.ScrollDepthResponse.parseOrThrow(_response.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ rawResponse: _response.rawResponse,
+ };
+ }
+
+ if (_response.error.reason === "status-code") {
+ switch (_response.error.statusCode) {
+ case 400:
+ throw new Webflow.BadRequestError(_response.error.body, _response.rawResponse);
+ case 401:
+ throw new Webflow.UnauthorizedError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 403:
+ throw new Webflow.ForbiddenError(_response.error.body, _response.rawResponse);
+ case 404:
+ throw new Webflow.NotFoundError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 429:
+ throw new Webflow.TooManyRequestsError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 500:
+ throw new Webflow.InternalServerError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ default:
+ throw new errors.WebflowError({
+ statusCode: _response.error.statusCode,
+ body: _response.error.body,
+ rawResponse: _response.rawResponse,
+ });
+ }
+ }
+
+ return handleNonStatusCodeError(
+ _response.error,
+ _response.rawResponse,
+ "GET",
+ "/sites/{site_id}/analyze/reports/scroll_depth",
+ );
+ }
+
+ /**
+ * Returns the average browser window height (in CSS pixels) for the site over a time window. The response wraps the single aggregate in a one-element `data` array for SDK uniformity with other Analyze reports.
+ *
+ * Filter the report with top-level query parameters (`country`, `deviceType`, `pagePath`, etc.) or via the `filter` parameter for multi-value and negation matching. Omit `deviceType` to include all devices.
+ *
+ * This endpoint requires a workspace with the Analyze add-on.
+ *
+ * Each access token can have one Analyze request in flight at a time, across all Analyze endpoints. Additional concurrent requests return `429 Too Many Requests`. Wait for your in-flight request to finish, or for the `Retry-After` interval, then retry.
+ *
+ * Required scope | `sites:read`
+ *
+ * @param {string} site_id - Unique identifier for a Site
+ * @param {Webflow.analyze.ReportsBrowserWindowHeightRequest} request
+ * @param {ReportsClient.RequestOptions} requestOptions - Request-specific configuration.
+ *
+ * @throws {@link Webflow.BadRequestError}
+ * @throws {@link Webflow.UnauthorizedError}
+ * @throws {@link Webflow.ForbiddenError}
+ * @throws {@link Webflow.NotFoundError}
+ * @throws {@link Webflow.TooManyRequestsError}
+ * @throws {@link Webflow.InternalServerError}
+ *
+ * @example
+ * await client.analyze.reports.browserWindowHeight("580e63e98c9a982ac9b8b741", {
+ * startTime: new Date("2026-04-01T00:00:00.000Z"),
+ * endTime: new Date("2026-04-08T00:00:00.000Z"),
+ * deviceType: "desktop",
+ * country: "US",
+ * pagePath: "/towels",
+ * trafficSource: "SO",
+ * referrer: "google.com",
+ * browser: "Chrome",
+ * utmCampaign: "dont-panic-2026",
+ * utmMedium: "email",
+ * utmSource: "hitchhikers-guide"
+ * })
+ */
+ public browserWindowHeight(
+ site_id: string,
+ request: Webflow.analyze.ReportsBrowserWindowHeightRequest,
+ requestOptions?: ReportsClient.RequestOptions,
+ ): core.HttpResponsePromise {
+ return core.HttpResponsePromise.fromPromise(this.__browserWindowHeight(site_id, request, requestOptions));
+ }
+
+ private async __browserWindowHeight(
+ site_id: string,
+ request: Webflow.analyze.ReportsBrowserWindowHeightRequest,
+ requestOptions?: ReportsClient.RequestOptions,
+ ): Promise> {
+ const {
+ startTime,
+ endTime,
+ deviceType,
+ country,
+ pagePath,
+ trafficSource,
+ referrer,
+ browser,
+ utmCampaign,
+ utmMedium,
+ utmSource,
+ filter,
+ } = request;
+ const _queryParams: Record = {
+ startTime: startTime.toISOString(),
+ endTime: endTime.toISOString(),
+ deviceType:
+ deviceType != null
+ ? serializers.analyze.ReportsBrowserWindowHeightRequestDeviceType.jsonOrThrow(deviceType, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ omitUndefined: true,
+ })
+ : undefined,
+ country,
+ pagePath,
+ trafficSource,
+ referrer,
+ browser,
+ utmCampaign,
+ utmMedium,
+ utmSource,
+ filter:
+ filter != null
+ ? serializers.BrowserWindowHeightFilter.jsonOrThrow(filter, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ omitUndefined: true,
+ breadcrumbsPrefix: ["request", "filter"],
+ })
+ : filter,
+ };
+ const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest();
+ const _headers: core.Fetcher.Args["headers"] = mergeHeaders(
+ _authRequest.headers,
+ this._options?.headers,
+ requestOptions?.headers,
+ );
+ const _response = await core.fetcher({
+ url: core.url.join(
+ (await core.Supplier.get(this._options.baseUrl)) ??
+ ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi)
+ .base,
+ `sites/${core.url.encodePathParam(site_id)}/analyze/reports/browser_window_height`,
+ ),
+ method: "GET",
+ headers: _headers,
+ queryParameters: { ..._queryParams, ...requestOptions?.queryParams },
+ timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000,
+ maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries,
+ abortSignal: requestOptions?.abortSignal,
+ fetchFn: this._options?.fetch,
+ logging: this._options.logging,
+ });
+ if (_response.ok) {
+ return {
+ data: serializers.BrowserWindowHeightResponse.parseOrThrow(_response.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ rawResponse: _response.rawResponse,
+ };
+ }
+
+ if (_response.error.reason === "status-code") {
+ switch (_response.error.statusCode) {
+ case 400:
+ throw new Webflow.BadRequestError(_response.error.body, _response.rawResponse);
+ case 401:
+ throw new Webflow.UnauthorizedError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 403:
+ throw new Webflow.ForbiddenError(_response.error.body, _response.rawResponse);
+ case 404:
+ throw new Webflow.NotFoundError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 429:
+ throw new Webflow.TooManyRequestsError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 500:
+ throw new Webflow.InternalServerError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ default:
+ throw new errors.WebflowError({
+ statusCode: _response.error.statusCode,
+ body: _response.error.body,
+ rawResponse: _response.rawResponse,
+ });
+ }
+ }
+
+ return handleNonStatusCodeError(
+ _response.error,
+ _response.rawResponse,
+ "GET",
+ "/sites/{site_id}/analyze/reports/browser_window_height",
+ );
+ }
+
+ /**
+ * Returns the pages visitors viewed immediately before or after a required anchor page over a time window, ranked by sessions, users, or page views.
+ *
+ * For a CMS template instance, provide both `collectionId` and `itemSlug` with `pageId`. Filter the report with top-level query parameters (`country`, `deviceType`, `pagePath`, etc.) or via the `filter` parameter for multi-value and negation matching.
+ *
+ * This endpoint requires a workspace with the Analyze add-on.
+ *
+ * Each access token can have one Analyze request in flight at a time, across all Analyze endpoints. Additional concurrent requests return `429 Too Many Requests`. Wait for your in-flight request to finish, or for the `Retry-After` interval, then retry.
+ *
+ * Required scope | `sites:read`
+ *
+ * @param {string} site_id - Unique identifier for a Site
+ * @param {Webflow.analyze.ReportsPageFlowRequest} request
+ * @param {ReportsClient.RequestOptions} requestOptions - Request-specific configuration.
+ *
+ * @throws {@link Webflow.BadRequestError}
+ * @throws {@link Webflow.UnauthorizedError}
+ * @throws {@link Webflow.ForbiddenError}
+ * @throws {@link Webflow.NotFoundError}
+ * @throws {@link Webflow.TooManyRequestsError}
+ * @throws {@link Webflow.InternalServerError}
+ *
+ * @example
+ * await client.analyze.reports.pageFlow("580e63e98c9a982ac9b8b741", {
+ * startTime: new Date("2026-04-01T00:00:00.000Z"),
+ * endTime: new Date("2026-04-08T00:00:00.000Z"),
+ * direction: "previous",
+ * metricScope: "session",
+ * pageId: "65f1b2c4a8d3e5f7a9c1b2d3",
+ * collectionId: "66abc1234567890abcdef012",
+ * itemSlug: "anchor-post",
+ * limit: 1,
+ * deviceType: "desktop",
+ * country: "US",
+ * pagePath: "/towels",
+ * trafficSource: "SO",
+ * referrer: "google.com",
+ * browser: "Chrome",
+ * utmCampaign: "dont-panic-2026",
+ * utmMedium: "email",
+ * utmSource: "hitchhikers-guide"
+ * })
+ */
+ public pageFlow(
+ site_id: string,
+ request: Webflow.analyze.ReportsPageFlowRequest,
+ requestOptions?: ReportsClient.RequestOptions,
+ ): core.HttpResponsePromise {
+ return core.HttpResponsePromise.fromPromise(this.__pageFlow(site_id, request, requestOptions));
+ }
+
+ private async __pageFlow(
+ site_id: string,
+ request: Webflow.analyze.ReportsPageFlowRequest,
+ requestOptions?: ReportsClient.RequestOptions,
+ ): Promise> {
+ const {
+ startTime,
+ endTime,
+ direction,
+ metricScope,
+ pageId,
+ collectionId,
+ itemSlug,
+ limit,
+ deviceType,
+ country,
+ pagePath,
+ trafficSource,
+ referrer,
+ browser,
+ utmCampaign,
+ utmMedium,
+ utmSource,
+ filter,
+ } = request;
+ const _queryParams: Record = {
+ startTime: startTime.toISOString(),
+ endTime: endTime.toISOString(),
+ direction: serializers.PageFlowDirection.jsonOrThrow(direction, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ omitUndefined: true,
+ }),
+ metricScope: serializers.PageFlowMetricScope.jsonOrThrow(metricScope, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ omitUndefined: true,
+ }),
+ pageId,
+ collectionId,
+ itemSlug,
+ limit,
+ deviceType:
+ deviceType != null
+ ? serializers.analyze.ReportsPageFlowRequestDeviceType.jsonOrThrow(deviceType, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ omitUndefined: true,
+ })
+ : undefined,
+ country,
+ pagePath,
+ trafficSource,
+ referrer,
+ browser,
+ utmCampaign,
+ utmMedium,
+ utmSource,
+ filter:
+ filter != null
+ ? serializers.PageFlowFilter.jsonOrThrow(filter, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ omitUndefined: true,
+ breadcrumbsPrefix: ["request", "filter"],
+ })
+ : filter,
+ };
+ const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest();
+ const _headers: core.Fetcher.Args["headers"] = mergeHeaders(
+ _authRequest.headers,
+ this._options?.headers,
+ requestOptions?.headers,
+ );
+ const _response = await core.fetcher({
+ url: core.url.join(
+ (await core.Supplier.get(this._options.baseUrl)) ??
+ ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi)
+ .base,
+ `sites/${core.url.encodePathParam(site_id)}/analyze/reports/page_flow`,
+ ),
+ method: "GET",
+ headers: _headers,
+ queryParameters: { ..._queryParams, ...requestOptions?.queryParams },
+ timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000,
+ maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries,
+ abortSignal: requestOptions?.abortSignal,
+ fetchFn: this._options?.fetch,
+ logging: this._options.logging,
+ });
+ if (_response.ok) {
+ return {
+ data: serializers.PageFlowResponse.parseOrThrow(_response.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ rawResponse: _response.rawResponse,
+ };
+ }
+
+ if (_response.error.reason === "status-code") {
+ switch (_response.error.statusCode) {
+ case 400:
+ throw new Webflow.BadRequestError(_response.error.body, _response.rawResponse);
+ case 401:
+ throw new Webflow.UnauthorizedError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 403:
+ throw new Webflow.ForbiddenError(_response.error.body, _response.rawResponse);
+ case 404:
+ throw new Webflow.NotFoundError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 429:
+ throw new Webflow.TooManyRequestsError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 500:
+ throw new Webflow.InternalServerError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ default:
+ throw new errors.WebflowError({
+ statusCode: _response.error.statusCode,
+ body: _response.error.body,
+ rawResponse: _response.rawResponse,
+ });
+ }
+ }
+
+ return handleNonStatusCodeError(
+ _response.error,
+ _response.rawResponse,
+ "GET",
+ "/sites/{site_id}/analyze/reports/page_flow",
+ );
+ }
+}
diff --git a/src/api/resources/analyze/resources/reports/client/index.ts b/src/api/resources/analyze/resources/reports/client/index.ts
new file mode 100644
index 00000000..415726b7
--- /dev/null
+++ b/src/api/resources/analyze/resources/reports/client/index.ts
@@ -0,0 +1 @@
+export * from "./requests";
diff --git a/src/api/resources/analyze/resources/reports/client/requests/ReportsBrowserWindowHeightRequest.ts b/src/api/resources/analyze/resources/reports/client/requests/ReportsBrowserWindowHeightRequest.ts
new file mode 100644
index 00000000..d4bfc209
--- /dev/null
+++ b/src/api/resources/analyze/resources/reports/client/requests/ReportsBrowserWindowHeightRequest.ts
@@ -0,0 +1,49 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../../../../../index";
+
+/**
+ * @example
+ * {
+ * startTime: new Date("2026-04-01T00:00:00.000Z"),
+ * endTime: new Date("2026-04-08T00:00:00.000Z"),
+ * deviceType: "desktop",
+ * country: "US",
+ * pagePath: "/towels",
+ * trafficSource: "SO",
+ * referrer: "google.com",
+ * browser: "Chrome",
+ * utmCampaign: "dont-panic-2026",
+ * utmMedium: "email",
+ * utmSource: "hitchhikers-guide"
+ * }
+ */
+export interface ReportsBrowserWindowHeightRequest {
+ /** Inclusive start of the reporting window. Must be a UTC timestamp in ISO 8601 / RFC 3339 format ending in `Z` (for example, `2026-04-01T00:00:00Z`); numeric offsets such as `-04:00` or `+00:00` are not accepted. Must be on or after `2025-04-09T00:00:00Z`. */
+ startTime: Date;
+ /** Exclusive end of the reporting window. Must be a UTC timestamp in ISO 8601 / RFC 3339 format ending in `Z` (for example, `2026-04-08T00:00:00Z`); numeric offsets such as `-04:00` or `+00:00` are not accepted. Must be greater than `startTime` and within 100 days of it. */
+ endTime: Date;
+ /** Restrict the report to a single device type. */
+ deviceType?: Webflow.analyze.ReportsBrowserWindowHeightRequestDeviceType;
+ /** Restrict the report to a single country. ISO 3166-1 alpha-2 (two letters, normalized to uppercase). */
+ country?: string;
+ /** Restrict the report to a single page path. */
+ pagePath?: string;
+ /** Restrict the report to a single traffic source code (for example, `SO` for Organic Search). */
+ trafficSource?: string;
+ /** Restrict the report to a single referrer domain. */
+ referrer?: string;
+ /** Restrict the report to a single browser. */
+ browser?: string;
+ /** Restrict the report to a single `utm_campaign` value. */
+ utmCampaign?: string;
+ /** Restrict the report to a single `utm_medium` value. */
+ utmMedium?: string;
+ /** Restrict the report to a single `utm_source` value. */
+ utmSource?: string;
+ /**
+ * Filter the report by dimension. Use bracket notation. Scalars take a single value (`filter[country][eq]=US`, `filter[country][ne]=US`). Arrays use indexed brackets (`filter[country][in][0]=US&filter[country][in][1]=CA`, `filter[country][nin][0]=US&filter[country][nin][1]=CA`).
+ * Each dimension entry takes at least one of `eq`, `in`, `ne`, or `nin`. Filter a given dimension in one place — either a top-level query parameter or a `filter` entry. See the `BrowserWindowHeightFilter` schema for the full list of supported dimensions.
+ */
+ filter?: Webflow.BrowserWindowHeightFilter;
+}
diff --git a/src/api/resources/analyze/resources/reports/client/requests/ReportsPageFlowRequest.ts b/src/api/resources/analyze/resources/reports/client/requests/ReportsPageFlowRequest.ts
new file mode 100644
index 00000000..42fa80ba
--- /dev/null
+++ b/src/api/resources/analyze/resources/reports/client/requests/ReportsPageFlowRequest.ts
@@ -0,0 +1,67 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../../../../../index";
+
+/**
+ * @example
+ * {
+ * startTime: new Date("2026-04-01T00:00:00.000Z"),
+ * endTime: new Date("2026-04-08T00:00:00.000Z"),
+ * direction: "previous",
+ * metricScope: "session",
+ * pageId: "65f1b2c4a8d3e5f7a9c1b2d3",
+ * collectionId: "66abc1234567890abcdef012",
+ * itemSlug: "anchor-post",
+ * limit: 1,
+ * deviceType: "desktop",
+ * country: "US",
+ * pagePath: "/towels",
+ * trafficSource: "SO",
+ * referrer: "google.com",
+ * browser: "Chrome",
+ * utmCampaign: "dont-panic-2026",
+ * utmMedium: "email",
+ * utmSource: "hitchhikers-guide"
+ * }
+ */
+export interface ReportsPageFlowRequest {
+ /** Inclusive start of the reporting window. Must be a UTC timestamp in ISO 8601 / RFC 3339 format ending in `Z` (for example, `2026-04-01T00:00:00Z`); numeric offsets such as `-04:00` or `+00:00` are not accepted. Must be on or after `2025-04-09T00:00:00Z`. */
+ startTime: Date;
+ /** Exclusive end of the reporting window. Must be a UTC timestamp in ISO 8601 / RFC 3339 format ending in `Z` (for example, `2026-04-08T00:00:00Z`); numeric offsets such as `-04:00` or `+00:00` are not accepted. Must be greater than `startTime` and within 100 days of it. */
+ endTime: Date;
+ /** Whether to return pages viewed immediately before or after the anchor page. */
+ direction: Webflow.PageFlowDirection;
+ /** The unit each row's `count` is measured in. */
+ metricScope: Webflow.PageFlowMetricScope;
+ /** Identifier of the anchor Webflow page. */
+ pageId: string;
+ /** Identifier of the CMS collection for an anchor template-page instance. Must be provided together with `itemSlug`, or both must be omitted. */
+ collectionId?: string;
+ /** Slug of the CMS item for an anchor template-page instance. Must be provided together with `collectionId`, or both must be omitted. */
+ itemSlug?: string;
+ /** Maximum number of rows to return. Defaults to `10`, up to a maximum of `100`. */
+ limit?: number;
+ /** Restrict the report to a single device type. */
+ deviceType?: Webflow.analyze.ReportsPageFlowRequestDeviceType;
+ /** Restrict the report to a single country. ISO 3166-1 alpha-2 (two letters, normalized to uppercase). */
+ country?: string;
+ /** Restrict the report to a single page path. */
+ pagePath?: string;
+ /** Restrict the report to a single traffic source code (for example, `SO` for Organic Search). */
+ trafficSource?: string;
+ /** Restrict the report to a single referrer domain. */
+ referrer?: string;
+ /** Restrict the report to a single browser. */
+ browser?: string;
+ /** Restrict the report to a single `utm_campaign` value. */
+ utmCampaign?: string;
+ /** Restrict the report to a single `utm_medium` value. */
+ utmMedium?: string;
+ /** Restrict the report to a single `utm_source` value. */
+ utmSource?: string;
+ /**
+ * Filter the report by dimension. Use bracket notation. Scalars take a single value (`filter[country][eq]=US`, `filter[country][ne]=US`). Arrays use indexed brackets (`filter[country][in][0]=US&filter[country][in][1]=CA`, `filter[country][nin][0]=US&filter[country][nin][1]=CA`).
+ * Each dimension entry takes at least one of `eq`, `in`, `ne`, or `nin`. Filter a given dimension in one place — either a top-level query parameter or a `filter` entry. See the `PageFlowFilter` schema for the full list of supported dimensions.
+ */
+ filter?: Webflow.PageFlowFilter;
+}
diff --git a/src/api/resources/analyze/resources/reports/client/requests/ReportsScrollDepthRequest.ts b/src/api/resources/analyze/resources/reports/client/requests/ReportsScrollDepthRequest.ts
new file mode 100644
index 00000000..0c0de055
--- /dev/null
+++ b/src/api/resources/analyze/resources/reports/client/requests/ReportsScrollDepthRequest.ts
@@ -0,0 +1,49 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../../../../../index";
+
+/**
+ * @example
+ * {
+ * startTime: new Date("2026-04-01T00:00:00.000Z"),
+ * endTime: new Date("2026-04-08T00:00:00.000Z"),
+ * deviceType: "desktop",
+ * country: "US",
+ * pagePath: "/towels",
+ * trafficSource: "SO",
+ * referrer: "google.com",
+ * browser: "Chrome",
+ * utmCampaign: "dont-panic-2026",
+ * utmMedium: "email",
+ * utmSource: "hitchhikers-guide"
+ * }
+ */
+export interface ReportsScrollDepthRequest {
+ /** Inclusive start of the reporting window. Must be a UTC timestamp in ISO 8601 / RFC 3339 format ending in `Z` (for example, `2026-04-01T00:00:00Z`); numeric offsets such as `-04:00` or `+00:00` are not accepted. Must be on or after `2025-04-09T00:00:00Z`. */
+ startTime: Date;
+ /** Exclusive end of the reporting window. Must be a UTC timestamp in ISO 8601 / RFC 3339 format ending in `Z` (for example, `2026-04-08T00:00:00Z`); numeric offsets such as `-04:00` or `+00:00` are not accepted. Must be greater than `startTime` and within 100 days of it. */
+ endTime: Date;
+ /** Restrict the report to a single device type. */
+ deviceType?: Webflow.analyze.ReportsScrollDepthRequestDeviceType;
+ /** Restrict the report to a single country. ISO 3166-1 alpha-2 (two letters, normalized to uppercase). */
+ country?: string;
+ /** Restrict the report to a single page path. */
+ pagePath?: string;
+ /** Restrict the report to a single traffic source code (for example, `SO` for Organic Search). */
+ trafficSource?: string;
+ /** Restrict the report to a single referrer domain. */
+ referrer?: string;
+ /** Restrict the report to a single browser. */
+ browser?: string;
+ /** Restrict the report to a single `utm_campaign` value. */
+ utmCampaign?: string;
+ /** Restrict the report to a single `utm_medium` value. */
+ utmMedium?: string;
+ /** Restrict the report to a single `utm_source` value. */
+ utmSource?: string;
+ /**
+ * Filter the report by dimension. Use bracket notation. Scalars take a single value (`filter[country][eq]=US`, `filter[country][ne]=US`). Arrays use indexed brackets (`filter[country][in][0]=US&filter[country][in][1]=CA`, `filter[country][nin][0]=US&filter[country][nin][1]=CA`).
+ * Each dimension entry takes at least one of `eq`, `in`, `ne`, or `nin`. Filter a given dimension in one place — either a top-level query parameter or a `filter` entry. See the `ScrollDepthFilter` schema for the full list of supported dimensions.
+ */
+ filter?: Webflow.ScrollDepthFilter;
+}
diff --git a/src/api/resources/analyze/resources/reports/client/requests/ReportsTimeOnPageRequest.ts b/src/api/resources/analyze/resources/reports/client/requests/ReportsTimeOnPageRequest.ts
new file mode 100644
index 00000000..81595f95
--- /dev/null
+++ b/src/api/resources/analyze/resources/reports/client/requests/ReportsTimeOnPageRequest.ts
@@ -0,0 +1,54 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../../../../../index";
+
+/**
+ * @example
+ * {
+ * startTime: new Date("2026-04-01T00:00:00.000Z"),
+ * endTime: new Date("2026-04-08T00:00:00.000Z"),
+ * metricScope: "session",
+ * deviceType: "desktop",
+ * country: "US",
+ * pagePath: "/towels",
+ * trafficSource: "SO",
+ * referrer: "google.com",
+ * browser: "Chrome",
+ * utmCampaign: "dont-panic-2026",
+ * utmMedium: "email",
+ * utmSource: "hitchhikers-guide"
+ * }
+ */
+export interface ReportsTimeOnPageRequest {
+ /** Inclusive start of the reporting window. Must be a UTC timestamp in ISO 8601 / RFC 3339 format ending in `Z` (for example, `2026-04-01T00:00:00Z`); numeric offsets such as `-04:00` or `+00:00` are not accepted. Must be on or after `2025-04-09T00:00:00Z`. */
+ startTime: Date;
+ /** Exclusive end of the reporting window. Must be a UTC timestamp in ISO 8601 / RFC 3339 format ending in `Z` (for example, `2026-04-08T00:00:00Z`); numeric offsets such as `-04:00` or `+00:00` are not accepted. Must be greater than `startTime` and within 100 days of it. */
+ endTime: Date;
+ /** How the average time on page is computed — per session, user, or page view. */
+ metricScope: Webflow.TimeOnPageMetricScope;
+ /** Include bucketed average time data using the supplied granularity and IANA time zone. Omit this parameter to return a single aggregate value for the requested window. */
+ timeseries?: Webflow.TimeOnPageTimeseriesQuery;
+ /** Restrict the report to a single device type. */
+ deviceType?: Webflow.analyze.ReportsTimeOnPageRequestDeviceType;
+ /** Restrict the report to a single country. ISO 3166-1 alpha-2 (two letters, normalized to uppercase). */
+ country?: string;
+ /** Restrict the report to a single page path. */
+ pagePath?: string;
+ /** Restrict the report to a single traffic source code (for example, `SO` for Organic Search). */
+ trafficSource?: string;
+ /** Restrict the report to a single referrer domain. */
+ referrer?: string;
+ /** Restrict the report to a single browser. */
+ browser?: string;
+ /** Restrict the report to a single `utm_campaign` value. */
+ utmCampaign?: string;
+ /** Restrict the report to a single `utm_medium` value. */
+ utmMedium?: string;
+ /** Restrict the report to a single `utm_source` value. */
+ utmSource?: string;
+ /**
+ * Filter the report by dimension. Use bracket notation. Scalars take a single value (`filter[country][eq]=US`, `filter[country][ne]=US`). Arrays use indexed brackets (`filter[country][in][0]=US&filter[country][in][1]=CA`, `filter[country][nin][0]=US&filter[country][nin][1]=CA`).
+ * Each dimension entry takes at least one of `eq`, `in`, `ne`, or `nin`. Filter a given dimension in one place — either a top-level query parameter or a `filter` entry. See the `TimeOnPageFilter` schema for the full list of supported dimensions.
+ */
+ filter?: Webflow.TimeOnPageFilter;
+}
diff --git a/src/api/resources/analyze/resources/reports/client/requests/ReportsTopDimensionsRequest.ts b/src/api/resources/analyze/resources/reports/client/requests/ReportsTopDimensionsRequest.ts
new file mode 100644
index 00000000..2b908a77
--- /dev/null
+++ b/src/api/resources/analyze/resources/reports/client/requests/ReportsTopDimensionsRequest.ts
@@ -0,0 +1,58 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../../../../../index";
+
+/**
+ * @example
+ * {
+ * startTime: new Date("2026-04-01T00:00:00.000Z"),
+ * endTime: new Date("2026-04-08T00:00:00.000Z"),
+ * dimension: "country",
+ * metricScope: "session",
+ * limit: 1,
+ * deviceType: "desktop",
+ * country: "US",
+ * pagePath: "/towels",
+ * trafficSource: "SO",
+ * referrer: "google.com",
+ * browser: "Chrome",
+ * utmCampaign: "dont-panic-2026",
+ * utmMedium: "email",
+ * utmSource: "hitchhikers-guide"
+ * }
+ */
+export interface ReportsTopDimensionsRequest {
+ /** Inclusive start of the reporting window. Must be a UTC timestamp in ISO 8601 / RFC 3339 format ending in `Z` (for example, `2026-04-01T00:00:00Z`); numeric offsets such as `-04:00` or `+00:00` are not accepted. Must be on or after `2025-04-09T00:00:00Z`. */
+ startTime: Date;
+ /** Exclusive end of the reporting window. Must be a UTC timestamp in ISO 8601 / RFC 3339 format ending in `Z` (for example, `2026-04-08T00:00:00Z`); numeric offsets such as `-04:00` or `+00:00` are not accepted. Must be greater than `startTime` and within 100 days of it. */
+ endTime: Date;
+ /** The dimension whose top values are ranked. See `TopDimensionsDimension` for the supported values. */
+ dimension: Webflow.TopDimensionsDimension;
+ /** The unit each row's `count` is measured in — sessions or users. */
+ metricScope: Webflow.TopDimensionsMetricScope;
+ /** Maximum number of rows to return. Defaults to `25`, up to a maximum of `100`. */
+ limit?: number;
+ /** Restrict the report to a single device type. */
+ deviceType?: Webflow.analyze.ReportsTopDimensionsRequestDeviceType;
+ /** Restrict the report to a single country. ISO 3166-1 alpha-2 (two letters, normalized to uppercase). */
+ country?: string;
+ /** Restrict the report to a single page path. */
+ pagePath?: string;
+ /** Restrict the report to a single traffic source code (for example, `SO` for Organic Search). */
+ trafficSource?: string;
+ /** Restrict the report to a single referrer domain. */
+ referrer?: string;
+ /** Restrict the report to a single browser. */
+ browser?: string;
+ /** Restrict the report to a single `utm_campaign` value. */
+ utmCampaign?: string;
+ /** Restrict the report to a single `utm_medium` value. */
+ utmMedium?: string;
+ /** Restrict the report to a single `utm_source` value. */
+ utmSource?: string;
+ /**
+ * Filter the report by dimension. Use bracket notation. Scalars take a single value (`filter[country][eq]=US`, `filter[country][ne]=US`). Arrays use indexed brackets (`filter[country][in][0]=US&filter[country][in][1]=CA`, `filter[country][nin][0]=US&filter[country][nin][1]=CA`).
+ * Each dimension entry takes at least one of `eq`, `in`, `ne`, or `nin`. Filter a given dimension in one place — either a top-level query parameter or a `filter` entry. See the `TopDimensionsFilter` schema for the full list of supported dimensions.
+ */
+ filter?: Webflow.TopDimensionsFilter;
+}
diff --git a/src/api/resources/analyze/resources/reports/client/requests/ReportsTopEventsRequest.ts b/src/api/resources/analyze/resources/reports/client/requests/ReportsTopEventsRequest.ts
new file mode 100644
index 00000000..2485523c
--- /dev/null
+++ b/src/api/resources/analyze/resources/reports/client/requests/ReportsTopEventsRequest.ts
@@ -0,0 +1,51 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../../../../../index";
+
+/**
+ * @example
+ * {
+ * startTime: new Date("2026-04-01T00:00:00.000Z"),
+ * endTime: new Date("2026-04-08T00:00:00.000Z"),
+ * limit: 1,
+ * deviceType: "desktop",
+ * country: "US",
+ * pagePath: "/towels",
+ * trafficSource: "SO",
+ * browser: "Chrome",
+ * utmCampaign: "dont-panic-2026",
+ * utmMedium: "email",
+ * utmSource: "hitchhikers-guide"
+ * }
+ */
+export interface ReportsTopEventsRequest {
+ /** Inclusive start of the reporting window. Must be a UTC timestamp in ISO 8601 / RFC 3339 format ending in `Z` (for example, `2026-04-01T00:00:00Z`); numeric offsets such as `-04:00` or `+00:00` are not accepted. Must be on or after `2025-04-09T00:00:00Z`. */
+ startTime: Date;
+ /** Exclusive end of the reporting window. Must be a UTC timestamp in ISO 8601 / RFC 3339 format ending in `Z` (for example, `2026-04-08T00:00:00Z`); numeric offsets such as `-04:00` or `+00:00` are not accepted. Must be greater than `startTime` and within 100 days of it. */
+ endTime: Date;
+ /** Maximum number of rows to return. Defaults to `25`, up to a maximum of `250`. */
+ limit?: number;
+ /** Include a daily event count `timeseries` for each row, bucketed in the supplied IANA time zone. Omit this parameter to return ranked rows without per-event timeseries data. */
+ timeseries?: Webflow.AnalyzeDailyTimeseriesQuery;
+ /** Restrict the report to a single device type. */
+ deviceType?: Webflow.analyze.ReportsTopEventsRequestDeviceType;
+ /** Restrict the report to a single country. ISO 3166-1 alpha-2 (two letters, normalized to uppercase). */
+ country?: string;
+ /** Restrict the report to a single page path. */
+ pagePath?: string;
+ /** Restrict the report to a single traffic source code (for example, `SO` for Organic Search). */
+ trafficSource?: string;
+ /** Restrict the report to a single browser. */
+ browser?: string;
+ /** Restrict the report to a single `utm_campaign` value. */
+ utmCampaign?: string;
+ /** Restrict the report to a single `utm_medium` value. */
+ utmMedium?: string;
+ /** Restrict the report to a single `utm_source` value. */
+ utmSource?: string;
+ /**
+ * Filter the report by dimension. Use bracket notation. Scalars take a single value (`filter[country][eq]=US`, `filter[country][ne]=US`). Arrays use indexed brackets (`filter[country][in][0]=US&filter[country][in][1]=CA`, `filter[country][nin][0]=US&filter[country][nin][1]=CA`).
+ * Each dimension entry takes at least one of `eq`, `in`, `ne`, or `nin`. Filter a given dimension in one place — either a top-level query parameter or a `filter` entry. See the `TopEventsFilter` schema for the full list of supported dimensions.
+ */
+ filter?: Webflow.TopEventsFilter;
+}
diff --git a/src/api/resources/analyze/resources/reports/client/requests/ReportsTopPagesRequest.ts b/src/api/resources/analyze/resources/reports/client/requests/ReportsTopPagesRequest.ts
new file mode 100644
index 00000000..d353be23
--- /dev/null
+++ b/src/api/resources/analyze/resources/reports/client/requests/ReportsTopPagesRequest.ts
@@ -0,0 +1,57 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../../../../../index";
+
+/**
+ * @example
+ * {
+ * startTime: new Date("2026-04-01T00:00:00.000Z"),
+ * endTime: new Date("2026-04-08T00:00:00.000Z"),
+ * sortBy: "session",
+ * limit: 1,
+ * deviceType: "desktop",
+ * country: "US",
+ * pagePath: "/towels",
+ * trafficSource: "SO",
+ * referrer: "google.com",
+ * browser: "Chrome",
+ * utmCampaign: "dont-panic-2026",
+ * utmMedium: "email",
+ * utmSource: "hitchhikers-guide"
+ * }
+ */
+export interface ReportsTopPagesRequest {
+ /** Inclusive start of the reporting window. Must be a UTC timestamp in ISO 8601 / RFC 3339 format ending in `Z` (for example, `2026-04-01T00:00:00Z`); numeric offsets such as `-04:00` or `+00:00` are not accepted. Must be on or after `2025-04-09T00:00:00Z`. */
+ startTime: Date;
+ /** Exclusive end of the reporting window. Must be a UTC timestamp in ISO 8601 / RFC 3339 format ending in `Z` (for example, `2026-04-08T00:00:00Z`); numeric offsets such as `-04:00` or `+00:00` are not accepted. Must be greater than `startTime` and within 100 days of it. */
+ endTime: Date;
+ /** Metric used to rank rows in the response, descending. Defaults to `session`. */
+ sortBy?: Webflow.TopPagesSortBy;
+ /** Maximum number of rows to return. Defaults to `25`, up to a maximum of `250`. */
+ limit?: number;
+ /** Include a daily page view `timeseries` for each row, bucketed in the supplied IANA time zone. Omit this parameter to return ranked rows without per-page timeseries data. */
+ timeseries?: Webflow.AnalyzeDailyTimeseriesQuery;
+ /** Restrict the report to a single device type. */
+ deviceType?: Webflow.analyze.ReportsTopPagesRequestDeviceType;
+ /** Restrict the report to a single country. ISO 3166-1 alpha-2 (two letters, normalized to uppercase). */
+ country?: string;
+ /** Restrict the report to a single page path. */
+ pagePath?: string;
+ /** Restrict the report to a single traffic source code (for example, `SO` for Organic Search). */
+ trafficSource?: string;
+ /** Restrict the report to a single referrer domain. */
+ referrer?: string;
+ /** Restrict the report to a single browser. */
+ browser?: string;
+ /** Restrict the report to a single `utm_campaign` value. */
+ utmCampaign?: string;
+ /** Restrict the report to a single `utm_medium` value. */
+ utmMedium?: string;
+ /** Restrict the report to a single `utm_source` value. */
+ utmSource?: string;
+ /**
+ * Filter the report by dimension. Use bracket notation. Scalars take a single value (`filter[country][eq]=US`, `filter[country][ne]=US`). Arrays use indexed brackets (`filter[country][in][0]=US&filter[country][in][1]=CA`, `filter[country][nin][0]=US&filter[country][nin][1]=CA`).
+ * Each dimension entry takes at least one of `eq`, `in`, `ne`, or `nin`. Filter a given dimension in one place — either a top-level query parameter or a `filter` entry. See the `TopPagesFilter` schema for the full list of supported dimensions.
+ */
+ filter?: Webflow.TopPagesFilter;
+}
diff --git a/src/api/resources/analyze/resources/reports/client/requests/ReportsTrafficRequest.ts b/src/api/resources/analyze/resources/reports/client/requests/ReportsTrafficRequest.ts
new file mode 100644
index 00000000..3a94566d
--- /dev/null
+++ b/src/api/resources/analyze/resources/reports/client/requests/ReportsTrafficRequest.ts
@@ -0,0 +1,55 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../../../../../index";
+
+/**
+ * @example
+ * {
+ * startTime: new Date("2026-04-01T00:00:00.000Z"),
+ * endTime: new Date("2026-04-08T00:00:00.000Z"),
+ * metricScope: "session",
+ * bucketTimeZone: "America/New_York",
+ * deviceType: "desktop",
+ * country: "US",
+ * pagePath: "/towels",
+ * trafficSource: "SO",
+ * referrer: "google.com",
+ * browser: "Chrome",
+ * utmCampaign: "dont-panic-2026",
+ * utmMedium: "email",
+ * utmSource: "hitchhikers-guide"
+ * }
+ */
+export interface ReportsTrafficRequest {
+ /** Inclusive start of the reporting window. Must be a UTC timestamp in ISO 8601 / RFC 3339 format ending in `Z` (for example, `2026-04-01T00:00:00Z`); numeric offsets such as `-04:00` or `+00:00` are not accepted. Must be on or after `2025-04-09T00:00:00Z`. */
+ startTime: Date;
+ /** Exclusive end of the reporting window. Must be a UTC timestamp in ISO 8601 / RFC 3339 format ending in `Z` (for example, `2026-04-08T00:00:00Z`); numeric offsets such as `-04:00` or `+00:00` are not accepted. Must be greater than `startTime` and within 100 days of it. */
+ endTime: Date;
+ /** The unit each `count` data point is measured in. */
+ metricScope: Webflow.TrafficMetricScope;
+ /** IANA time zone used to align daily bucket boundaries. */
+ bucketTimeZone: Webflow.AnalyzeBucketTimeZone;
+ /** Restrict the report to a single device type. */
+ deviceType?: Webflow.analyze.ReportsTrafficRequestDeviceType;
+ /** Restrict the report to a single country. ISO 3166-1 alpha-2 (two letters, normalized to uppercase). */
+ country?: string;
+ /** Restrict the report to a single page path. */
+ pagePath?: string;
+ /** Restrict the report to a single traffic source code (for example, `SO` for Organic Search). */
+ trafficSource?: string;
+ /** Restrict the report to a single referrer domain. */
+ referrer?: string;
+ /** Restrict the report to a single browser. */
+ browser?: string;
+ /** Restrict the report to a single `utm_campaign` value. */
+ utmCampaign?: string;
+ /** Restrict the report to a single `utm_medium` value. */
+ utmMedium?: string;
+ /** Restrict the report to a single `utm_source` value. */
+ utmSource?: string;
+ /**
+ * Filter the report by dimension. Use bracket notation. Scalars take a single value (`filter[country][eq]=US`, `filter[country][ne]=US`). Arrays use indexed brackets (`filter[country][in][0]=US&filter[country][in][1]=CA`, `filter[country][nin][0]=US&filter[country][nin][1]=CA`).
+ * Each dimension entry takes at least one of `eq`, `in`, `ne`, or `nin`. Filter a given dimension in one place — either a top-level query parameter or a `filter` entry. See the `TrafficFilter` schema for the full list of supported dimensions.
+ */
+ filter?: Webflow.TrafficFilter;
+}
diff --git a/src/api/resources/analyze/resources/reports/client/requests/index.ts b/src/api/resources/analyze/resources/reports/client/requests/index.ts
new file mode 100644
index 00000000..f94b314f
--- /dev/null
+++ b/src/api/resources/analyze/resources/reports/client/requests/index.ts
@@ -0,0 +1,8 @@
+export type { ReportsBrowserWindowHeightRequest } from "./ReportsBrowserWindowHeightRequest";
+export type { ReportsPageFlowRequest } from "./ReportsPageFlowRequest";
+export type { ReportsScrollDepthRequest } from "./ReportsScrollDepthRequest";
+export type { ReportsTimeOnPageRequest } from "./ReportsTimeOnPageRequest";
+export type { ReportsTopDimensionsRequest } from "./ReportsTopDimensionsRequest";
+export type { ReportsTopEventsRequest } from "./ReportsTopEventsRequest";
+export type { ReportsTopPagesRequest } from "./ReportsTopPagesRequest";
+export type { ReportsTrafficRequest } from "./ReportsTrafficRequest";
diff --git a/src/api/resources/analyze/resources/reports/exports.ts b/src/api/resources/analyze/resources/reports/exports.ts
new file mode 100644
index 00000000..476ee9ab
--- /dev/null
+++ b/src/api/resources/analyze/resources/reports/exports.ts
@@ -0,0 +1,4 @@
+// This file was auto-generated by Fern from our API Definition.
+
+export { ReportsClient } from "./client/Client";
+export * from "./client/index";
diff --git a/src/api/resources/analyze/resources/reports/index.ts b/src/api/resources/analyze/resources/reports/index.ts
new file mode 100644
index 00000000..d2ec2302
--- /dev/null
+++ b/src/api/resources/analyze/resources/reports/index.ts
@@ -0,0 +1,2 @@
+export * from "./client";
+export * from "./types";
diff --git a/src/api/resources/analyze/resources/reports/types/ReportsBrowserWindowHeightRequestDeviceType.ts b/src/api/resources/analyze/resources/reports/types/ReportsBrowserWindowHeightRequestDeviceType.ts
new file mode 100644
index 00000000..ca9813a8
--- /dev/null
+++ b/src/api/resources/analyze/resources/reports/types/ReportsBrowserWindowHeightRequestDeviceType.ts
@@ -0,0 +1,9 @@
+// This file was auto-generated by Fern from our API Definition.
+
+export const ReportsBrowserWindowHeightRequestDeviceType = {
+ Desktop: "desktop",
+ Mobile: "mobile",
+ Tablet: "tablet",
+} as const;
+export type ReportsBrowserWindowHeightRequestDeviceType =
+ (typeof ReportsBrowserWindowHeightRequestDeviceType)[keyof typeof ReportsBrowserWindowHeightRequestDeviceType];
diff --git a/src/api/resources/analyze/resources/reports/types/ReportsPageFlowRequestDeviceType.ts b/src/api/resources/analyze/resources/reports/types/ReportsPageFlowRequestDeviceType.ts
new file mode 100644
index 00000000..baec961a
--- /dev/null
+++ b/src/api/resources/analyze/resources/reports/types/ReportsPageFlowRequestDeviceType.ts
@@ -0,0 +1,9 @@
+// This file was auto-generated by Fern from our API Definition.
+
+export const ReportsPageFlowRequestDeviceType = {
+ Desktop: "desktop",
+ Mobile: "mobile",
+ Tablet: "tablet",
+} as const;
+export type ReportsPageFlowRequestDeviceType =
+ (typeof ReportsPageFlowRequestDeviceType)[keyof typeof ReportsPageFlowRequestDeviceType];
diff --git a/src/api/resources/analyze/resources/reports/types/ReportsScrollDepthRequestDeviceType.ts b/src/api/resources/analyze/resources/reports/types/ReportsScrollDepthRequestDeviceType.ts
new file mode 100644
index 00000000..be245ac2
--- /dev/null
+++ b/src/api/resources/analyze/resources/reports/types/ReportsScrollDepthRequestDeviceType.ts
@@ -0,0 +1,9 @@
+// This file was auto-generated by Fern from our API Definition.
+
+export const ReportsScrollDepthRequestDeviceType = {
+ Desktop: "desktop",
+ Mobile: "mobile",
+ Tablet: "tablet",
+} as const;
+export type ReportsScrollDepthRequestDeviceType =
+ (typeof ReportsScrollDepthRequestDeviceType)[keyof typeof ReportsScrollDepthRequestDeviceType];
diff --git a/src/api/resources/analyze/resources/reports/types/ReportsTimeOnPageRequestDeviceType.ts b/src/api/resources/analyze/resources/reports/types/ReportsTimeOnPageRequestDeviceType.ts
new file mode 100644
index 00000000..a7d696e3
--- /dev/null
+++ b/src/api/resources/analyze/resources/reports/types/ReportsTimeOnPageRequestDeviceType.ts
@@ -0,0 +1,9 @@
+// This file was auto-generated by Fern from our API Definition.
+
+export const ReportsTimeOnPageRequestDeviceType = {
+ Desktop: "desktop",
+ Mobile: "mobile",
+ Tablet: "tablet",
+} as const;
+export type ReportsTimeOnPageRequestDeviceType =
+ (typeof ReportsTimeOnPageRequestDeviceType)[keyof typeof ReportsTimeOnPageRequestDeviceType];
diff --git a/src/api/resources/analyze/resources/reports/types/ReportsTopDimensionsRequestDeviceType.ts b/src/api/resources/analyze/resources/reports/types/ReportsTopDimensionsRequestDeviceType.ts
new file mode 100644
index 00000000..4a211e3d
--- /dev/null
+++ b/src/api/resources/analyze/resources/reports/types/ReportsTopDimensionsRequestDeviceType.ts
@@ -0,0 +1,9 @@
+// This file was auto-generated by Fern from our API Definition.
+
+export const ReportsTopDimensionsRequestDeviceType = {
+ Desktop: "desktop",
+ Mobile: "mobile",
+ Tablet: "tablet",
+} as const;
+export type ReportsTopDimensionsRequestDeviceType =
+ (typeof ReportsTopDimensionsRequestDeviceType)[keyof typeof ReportsTopDimensionsRequestDeviceType];
diff --git a/src/api/resources/analyze/resources/reports/types/ReportsTopEventsRequestDeviceType.ts b/src/api/resources/analyze/resources/reports/types/ReportsTopEventsRequestDeviceType.ts
new file mode 100644
index 00000000..3ae8caf9
--- /dev/null
+++ b/src/api/resources/analyze/resources/reports/types/ReportsTopEventsRequestDeviceType.ts
@@ -0,0 +1,9 @@
+// This file was auto-generated by Fern from our API Definition.
+
+export const ReportsTopEventsRequestDeviceType = {
+ Desktop: "desktop",
+ Mobile: "mobile",
+ Tablet: "tablet",
+} as const;
+export type ReportsTopEventsRequestDeviceType =
+ (typeof ReportsTopEventsRequestDeviceType)[keyof typeof ReportsTopEventsRequestDeviceType];
diff --git a/src/api/resources/analyze/resources/reports/types/ReportsTopPagesRequestDeviceType.ts b/src/api/resources/analyze/resources/reports/types/ReportsTopPagesRequestDeviceType.ts
new file mode 100644
index 00000000..9bd378e3
--- /dev/null
+++ b/src/api/resources/analyze/resources/reports/types/ReportsTopPagesRequestDeviceType.ts
@@ -0,0 +1,9 @@
+// This file was auto-generated by Fern from our API Definition.
+
+export const ReportsTopPagesRequestDeviceType = {
+ Desktop: "desktop",
+ Mobile: "mobile",
+ Tablet: "tablet",
+} as const;
+export type ReportsTopPagesRequestDeviceType =
+ (typeof ReportsTopPagesRequestDeviceType)[keyof typeof ReportsTopPagesRequestDeviceType];
diff --git a/src/api/resources/analyze/resources/reports/types/ReportsTrafficRequestDeviceType.ts b/src/api/resources/analyze/resources/reports/types/ReportsTrafficRequestDeviceType.ts
new file mode 100644
index 00000000..128537db
--- /dev/null
+++ b/src/api/resources/analyze/resources/reports/types/ReportsTrafficRequestDeviceType.ts
@@ -0,0 +1,9 @@
+// This file was auto-generated by Fern from our API Definition.
+
+export const ReportsTrafficRequestDeviceType = {
+ Desktop: "desktop",
+ Mobile: "mobile",
+ Tablet: "tablet",
+} as const;
+export type ReportsTrafficRequestDeviceType =
+ (typeof ReportsTrafficRequestDeviceType)[keyof typeof ReportsTrafficRequestDeviceType];
diff --git a/src/api/resources/analyze/resources/reports/types/index.ts b/src/api/resources/analyze/resources/reports/types/index.ts
new file mode 100644
index 00000000..75377b8c
--- /dev/null
+++ b/src/api/resources/analyze/resources/reports/types/index.ts
@@ -0,0 +1,8 @@
+export * from "./ReportsBrowserWindowHeightRequestDeviceType";
+export * from "./ReportsPageFlowRequestDeviceType";
+export * from "./ReportsScrollDepthRequestDeviceType";
+export * from "./ReportsTimeOnPageRequestDeviceType";
+export * from "./ReportsTopDimensionsRequestDeviceType";
+export * from "./ReportsTopEventsRequestDeviceType";
+export * from "./ReportsTopPagesRequestDeviceType";
+export * from "./ReportsTrafficRequestDeviceType";
diff --git a/src/api/resources/assets/client/Client.ts b/src/api/resources/assets/client/Client.ts
index 81e28116..0bc7c9b7 100644
--- a/src/api/resources/assets/client/Client.ts
+++ b/src/api/resources/assets/client/Client.ts
@@ -45,7 +45,8 @@ export class AssetsClient {
* await client.assets.list("580e63e98c9a982ac9b8b741", {
* localeId: "65427cf400e02b306eaa04a0",
* offset: 1,
- * limit: 1
+ * limit: 1,
+ * folderId: "folderId"
* })
*/
public list(
@@ -61,11 +62,12 @@ export class AssetsClient {
request: Webflow.AssetsListRequest = {},
requestOptions?: AssetsClient.RequestOptions,
): Promise> {
- const { localeId, offset, limit } = request;
+ const { localeId, offset, limit, folderId } = request;
const _queryParams: Record = {
localeId,
offset,
limit,
+ folderId,
};
const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest();
const _headers: core.Fetcher.Args["headers"] = mergeHeaders(
diff --git a/src/api/resources/assets/client/requests/AssetsListRequest.ts b/src/api/resources/assets/client/requests/AssetsListRequest.ts
index d5ca41c6..d0619ab0 100644
--- a/src/api/resources/assets/client/requests/AssetsListRequest.ts
+++ b/src/api/resources/assets/client/requests/AssetsListRequest.ts
@@ -5,7 +5,8 @@
* {
* localeId: "65427cf400e02b306eaa04a0",
* offset: 1,
- * limit: 1
+ * limit: 1,
+ * folderId: "folderId"
* }
*/
export interface AssetsListRequest {
@@ -19,4 +20,9 @@ export interface AssetsListRequest {
offset?: number;
/** Maximum number of records to be returned (max limit: 100) */
limit?: number;
+ /**
+ * Filter assets to those in the specified folder and all descendant folders.
+ * Must be a 24-character hex ObjectId.
+ */
+ folderId?: string;
}
diff --git a/src/api/resources/branches/exports.ts b/src/api/resources/branches/exports.ts
new file mode 100644
index 00000000..4aaf2fd6
--- /dev/null
+++ b/src/api/resources/branches/exports.ts
@@ -0,0 +1,3 @@
+// This file was auto-generated by Fern from our API Definition.
+
+export * from "./index";
diff --git a/src/api/resources/branches/index.ts b/src/api/resources/branches/index.ts
new file mode 100644
index 00000000..cb0ff5c3
--- /dev/null
+++ b/src/api/resources/branches/index.ts
@@ -0,0 +1 @@
+export {};
diff --git a/src/api/resources/collections/client/Client.ts b/src/api/resources/collections/client/Client.ts
index 4f52633b..68de1849 100644
--- a/src/api/resources/collections/client/Client.ts
+++ b/src/api/resources/collections/client/Client.ts
@@ -564,4 +564,149 @@ export class CollectionsClient {
"/collections/{collection_id}",
);
}
+
+ /**
+ * Update a collection's display name, singular name, slug, or field groups.
+ *
+ * **Field group rules:**
+ * - A collection can have a maximum of 50 field groups
+ * - Each `displayName` must be unique across all field groups in the collection
+ * - Each `fieldId` must be unique across all field groups in the collection
+ * - Ecommerce collections do not support field groups
+ *
+ * Required scope | `cms:write`
+ *
+ * @param {string} collection_id - Unique identifier for a Collection
+ * @param {Webflow.PatchCollectionRequest} request
+ * @param {CollectionsClient.RequestOptions} requestOptions - Request-specific configuration.
+ *
+ * @throws {@link Webflow.BadRequestError}
+ * @throws {@link Webflow.UnauthorizedError}
+ * @throws {@link Webflow.NotFoundError}
+ * @throws {@link Webflow.TooManyRequestsError}
+ * @throws {@link Webflow.InternalServerError}
+ *
+ * @example
+ * await client.collections.patch("580e63fc8c9a982ac9b8b745")
+ */
+ public patch(
+ collection_id: string,
+ request: Webflow.PatchCollectionRequest = {},
+ requestOptions?: CollectionsClient.RequestOptions,
+ ): core.HttpResponsePromise {
+ return core.HttpResponsePromise.fromPromise(this.__patch(collection_id, request, requestOptions));
+ }
+
+ private async __patch(
+ collection_id: string,
+ request: Webflow.PatchCollectionRequest = {},
+ requestOptions?: CollectionsClient.RequestOptions,
+ ): Promise> {
+ const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest();
+ const _headers: core.Fetcher.Args["headers"] = mergeHeaders(
+ _authRequest.headers,
+ this._options?.headers,
+ requestOptions?.headers,
+ );
+ const _response = await core.fetcher({
+ url: core.url.join(
+ (await core.Supplier.get(this._options.baseUrl)) ??
+ ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi)
+ .base,
+ `collections/${core.url.encodePathParam(collection_id)}`,
+ ),
+ method: "PATCH",
+ headers: _headers,
+ contentType: "application/json",
+ queryParameters: requestOptions?.queryParams,
+ requestType: "json",
+ body: serializers.PatchCollectionRequest.jsonOrThrow(request, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ omitUndefined: true,
+ }),
+ timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000,
+ maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries,
+ abortSignal: requestOptions?.abortSignal,
+ fetchFn: this._options?.fetch,
+ logging: this._options.logging,
+ });
+ if (_response.ok) {
+ return {
+ data: serializers.Collection.parseOrThrow(_response.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ rawResponse: _response.rawResponse,
+ };
+ }
+
+ if (_response.error.reason === "status-code") {
+ switch (_response.error.statusCode) {
+ case 400:
+ throw new Webflow.BadRequestError(_response.error.body, _response.rawResponse);
+ case 401:
+ throw new Webflow.UnauthorizedError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 404:
+ throw new Webflow.NotFoundError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 429:
+ throw new Webflow.TooManyRequestsError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 500:
+ throw new Webflow.InternalServerError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ default:
+ throw new errors.WebflowError({
+ statusCode: _response.error.statusCode,
+ body: _response.error.body,
+ rawResponse: _response.rawResponse,
+ });
+ }
+ }
+
+ return handleNonStatusCodeError(
+ _response.error,
+ _response.rawResponse,
+ "PATCH",
+ "/collections/{collection_id}",
+ );
+ }
}
diff --git a/src/api/resources/collections/client/requests/PatchCollectionRequest.ts b/src/api/resources/collections/client/requests/PatchCollectionRequest.ts
new file mode 100644
index 00000000..74046dd6
--- /dev/null
+++ b/src/api/resources/collections/client/requests/PatchCollectionRequest.ts
@@ -0,0 +1,18 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../../../index";
+
+/**
+ * @example
+ * {}
+ */
+export interface PatchCollectionRequest {
+ /** Name given to the Collection */
+ displayName?: string;
+ /** The name of one Item in Collection (e.g. ”Blog Post” if the Collection is called “Blog Posts”) */
+ singularName?: string;
+ /** Slug of Collection in Site URL structure */
+ slug?: string;
+ /** The list of field groups in the Collection. Replaces the existing field groups. */
+ fieldGroups?: Webflow.FieldGroup[];
+}
diff --git a/src/api/resources/collections/client/requests/index.ts b/src/api/resources/collections/client/requests/index.ts
index 00a158e5..db03337c 100644
--- a/src/api/resources/collections/client/requests/index.ts
+++ b/src/api/resources/collections/client/requests/index.ts
@@ -1 +1,2 @@
export type { CollectionsCreateRequest } from "./CollectionsCreateRequest";
+export type { PatchCollectionRequest } from "./PatchCollectionRequest";
diff --git a/src/api/resources/collections/resources/items/client/Client.ts b/src/api/resources/collections/resources/items/client/Client.ts
index 3f9e9186..cf122a0f 100644
--- a/src/api/resources/collections/resources/items/client/Client.ts
+++ b/src/api/resources/collections/resources/items/client/Client.ts
@@ -4,6 +4,7 @@ import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../Ba
import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient";
import * as core from "../../../../../../core";
import { mergeHeaders } from "../../../../../../core/headers";
+import { toJson } from "../../../../../../core/json";
import * as environments from "../../../../../../environments";
import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError";
import * as errors from "../../../../../../errors/index";
@@ -24,8 +25,19 @@ export class ItemsClient {
}
/**
+ *
+ * Rich Text field values can contain Webflow component instances as `` markup — see [Components in Rich Text](/data/docs/working-with-the-cms/components-in-rich-text) for the markup grammar, how to find component and property IDs, and the write constraints.
+ *
+ *
* List of all Items within a Collection.
*
+ *
+ * This endpoint supports:
+ *
+ * - Custom `filter[...]` queries support up to 10 filter terms and 2 text-search terms per request.
+ * - Custom `sort[...]` queries support up to 3 sort fields per request.
+ *
+ *
* Required scope | `CMS:read`
*
* @param {string} collection_id - Unique identifier for a Collection
@@ -46,7 +58,8 @@ export class ItemsClient {
* name: "name",
* slug: "slug",
* sortBy: "createdOn",
- * sortOrder: "asc"
+ * sortOrder: "asc",
+ * translatable: "65427cf400e02b306eaa04a0"
* })
*/
public listItems(
@@ -62,8 +75,21 @@ export class ItemsClient {
request: Webflow.collections.ItemsListItemsRequest = {},
requestOptions?: ItemsClient.RequestOptions,
): Promise> {
- const { cmsLocaleId, offset, limit, name, slug, createdOn, lastPublished, lastUpdated, sortBy, sortOrder } =
- request;
+ const {
+ cmsLocaleId,
+ offset,
+ limit,
+ name,
+ slug,
+ createdOn,
+ lastPublished,
+ lastUpdated,
+ filter,
+ sortBy,
+ sortOrder,
+ sort,
+ translatable,
+ } = request;
const _queryParams: Record = {
cmsLocaleId,
offset,
@@ -100,6 +126,7 @@ export class ItemsClient {
breadcrumbsPrefix: ["request", "lastUpdated"],
})
: lastUpdated,
+ filter: filter != null ? toJson(filter) : undefined,
sortBy:
sortBy != null
? serializers.collections.ItemsListItemsRequestSortBy.jsonOrThrow(sortBy, {
@@ -118,6 +145,8 @@ export class ItemsClient {
omitUndefined: true,
})
: undefined,
+ sort: sort != null ? toJson(sort) : undefined,
+ translatable,
};
const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest();
const _headers: core.Fetcher.Args["headers"] = mergeHeaders(
@@ -220,10 +249,47 @@ export class ItemsClient {
}
/**
+ *
+ * Rich Text field values can contain Webflow component instances as `` markup — see [Components in Rich Text](/data/docs/working-with-the-cms/components-in-rich-text) for the markup grammar, how to find component and property IDs, and the write constraints.
+ *
+ *
* Create Item(s) in a Collection.
*
+ *
+ * This endpoint remains supported. New integrations should use [Create Items](/data/reference/cms/collection-items/staged-items/create-items), which accepts both request shapes below and can create an item in several locales under one ID. [This guide to creating items](/data/docs/working-with-the-cms/create-items) shows how each shape maps.
+ *
*
- * To create items across multiple locales, please use [this endpoint.](/data/reference/cms/collection-items/staged-items/create-items)
+ * This endpoint accepts two request shapes, and a request must use one or the other:
+ *
+ * - **Single item** — send `fieldData` at the top level. Set `cmsLocaleId` to create the item in a specific locale.
+ * - **Multiple items** — send an `items` array with at least one entry. Each entry needs its own `fieldData`, and can set its own `cmsLocaleId`, `isDraft`, and `isArchived`. The API ignores any other property on an entry.
+ *
+ * ```json
+ * {
+ * "items": [
+ * {
+ * "isArchived": false,
+ * "isDraft": false,
+ * "fieldData": {
+ * "name": "Senior Data Analyst",
+ * "slug": "senior-data-analyst"
+ * }
+ * },
+ * {
+ * "isArchived": false,
+ * "isDraft": false,
+ * "fieldData": {
+ * "name": "Product Manager",
+ * "slug": "product-manager"
+ * }
+ * }
+ * ]
+ * }
+ * ```
+ *
+ * A request that carries both `fieldData` and `items` returns a `400`.
+ *
+ * To create an item in several locales under one ID, use [Create Items](/data/reference/cms/collection-items/staged-items/create-items).
*
* Required scope | `CMS:write`
*
@@ -283,32 +349,6 @@ export class ItemsClient {
* }
* }
* })
- *
- * @example
- * await client.collections.items.createItem("580e63fc8c9a982ac9b8b745", {
- * skipInvalidFiles: true,
- * body: {
- * items: [{
- * isArchived: false,
- * isDraft: false,
- * fieldData: {
- * name: "Senior Data Analyst",
- * slug: "senior-data-analyst",
- * url: "https://boards.greenhouse.io/webflow/jobs/26567701",
- * department: "Data"
- * }
- * }, {
- * isArchived: false,
- * isDraft: false,
- * fieldData: {
- * name: "Product Manager",
- * slug: "product-manager",
- * url: "https://boards.greenhouse.io/webflow/jobs/31234567",
- * department: "Product"
- * }
- * }]
- * }
- * })
*/
public createItem(
collection_id: string,
@@ -575,12 +615,25 @@ export class ItemsClient {
}
/**
+ *
+ * Rich Text field values can contain Webflow component instances as `` markup — see [Components in Rich Text](/data/docs/working-with-the-cms/components-in-rich-text) for the markup grammar, how to find component and property IDs, and the write constraints.
+ *
+ *
* Update a single item or multiple items in a Collection.
*
* The limit for this endpoint is 100 items.
*
* Items will only be updated in the primary locale, unless a `cmsLocaleId` is included in the request.
*
+ *
+ * `isDraft: true` doesn't unpublish an item. The resulting status depends on whether the item has been published before:
+ *
+ * - **Item that has never been published:** the item gets a `Draft` status.
+ * - **Already-published item:** the item gets a `Changes in draft` status. The live item stays published, and your changes are held back until you publish them.
+ *
+ * Setting `isDraft: false` queues the item to publish on the next site publish. To remove an item from the live site, use [Unpublish Live Collection Items](/data/reference/cms/collection-items/live-items/delete-items-live). For the full status mapping, see [Publishing with the CMS API](/data/docs/working-with-the-cms/publishing).
+ *
+ *
* Required scope | `CMS:write`
*
* @param {string} collection_id - Unique identifier for a Collection
@@ -783,12 +836,23 @@ export class ItemsClient {
}
/**
+ *
+ * Rich Text field values can contain Webflow component instances as `` markup — see [Components in Rich Text](/data/docs/working-with-the-cms/components-in-rich-text) for the markup grammar, how to find component and property IDs, and the write constraints.
+ *
+ *
* List all published items in a collection.
*
*
* Serving data to applications in real-time? Use the Content Delivery API at `api-cdn.webflow.com` for better performance. The CDN-backed endpoint is optimized for high-volume reads, while the Data API is designed for writes and management operations.
*
*
+ *
+ * This endpoint supports:
+ *
+ * - Custom `filter[...]` queries support up to 10 filter terms and 2 text-search terms per request.
+ * - Custom `sort[...]` queries support up to 3 sort fields per request.
+ *
+ *
* Required scope | `CMS:read`
*
* @param {string} collection_id - Unique identifier for a Collection
@@ -809,7 +873,8 @@ export class ItemsClient {
* name: "name",
* slug: "slug",
* sortBy: "createdOn",
- * sortOrder: "asc"
+ * sortOrder: "asc",
+ * translatable: "65427cf400e02b306eaa04a0"
* })
*/
public listItemsLive(
@@ -825,8 +890,21 @@ export class ItemsClient {
request: Webflow.collections.ItemsListItemsLiveRequest = {},
requestOptions?: ItemsClient.RequestOptions,
): Promise> {
- const { cmsLocaleId, offset, limit, name, slug, createdOn, lastPublished, lastUpdated, sortBy, sortOrder } =
- request;
+ const {
+ cmsLocaleId,
+ offset,
+ limit,
+ name,
+ slug,
+ createdOn,
+ lastPublished,
+ lastUpdated,
+ filter,
+ sortBy,
+ sortOrder,
+ sort,
+ translatable,
+ } = request;
const _queryParams: Record = {
cmsLocaleId,
offset,
@@ -863,6 +941,7 @@ export class ItemsClient {
breadcrumbsPrefix: ["request", "lastUpdated"],
})
: lastUpdated,
+ filter: filter != null ? toJson(filter) : undefined,
sortBy:
sortBy != null
? serializers.collections.ItemsListItemsLiveRequestSortBy.jsonOrThrow(sortBy, {
@@ -881,6 +960,8 @@ export class ItemsClient {
omitUndefined: true,
})
: undefined,
+ sort: sort != null ? toJson(sort) : undefined,
+ translatable,
};
const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest();
const _headers: core.Fetcher.Args["headers"] = mergeHeaders(
@@ -983,11 +1064,43 @@ export class ItemsClient {
}
/**
- * Create item(s) in a collection that will be immediately published to the live site.
- *
+ *
+ * Rich Text field values can contain Webflow component instances as `` markup — see [Components in Rich Text](/data/docs/working-with-the-cms/components-in-rich-text) for the markup grammar, how to find component and property IDs, and the write constraints.
+ *
*
- * To create items across multiple locales, [please use this endpoint.](/data/reference/cms/collection-items/staged-items/create-items)
+ * Create item(s) in a collection that will be immediately published to the live site.
*
+ * This endpoint accepts two request shapes, and a request must use one or the other:
+ *
+ * - **Single item** — send `fieldData` at the top level. Set `cmsLocaleId` to create the item in a specific locale.
+ * - **Multiple items** — send an `items` array with at least one entry. Each entry needs its own `fieldData`, and can set its own `cmsLocaleId`, `isDraft`, and `isArchived`. The API ignores any other property on an entry.
+ *
+ * ```json
+ * {
+ * "items": [
+ * {
+ * "isArchived": false,
+ * "isDraft": false,
+ * "fieldData": {
+ * "name": "Senior Data Analyst",
+ * "slug": "senior-data-analyst"
+ * }
+ * },
+ * {
+ * "isArchived": false,
+ * "isDraft": false,
+ * "fieldData": {
+ * "name": "Product Manager",
+ * "slug": "product-manager"
+ * }
+ * }
+ * ]
+ * }
+ * ```
+ *
+ * A request that carries both `fieldData` and `items` returns a `400`.
+ *
+ * To create items in several locales, use [Create Items](/data/reference/cms/collection-items/staged-items/create-items) and then [Publish Collection Item(s)](/data/reference/cms/collection-items/staged-items/publish-item). Create Items writes staged content only.
*
* Required scope | `CMS:write`
*
@@ -1047,32 +1160,6 @@ export class ItemsClient {
* }
* }
* })
- *
- * @example
- * await client.collections.items.createItemLive("580e63fc8c9a982ac9b8b745", {
- * skipInvalidFiles: true,
- * body: {
- * items: [{
- * isArchived: false,
- * isDraft: false,
- * fieldData: {
- * name: "Senior Data Analyst",
- * slug: "senior-data-analyst",
- * url: "https://boards.greenhouse.io/webflow/jobs/26567701",
- * department: "Data"
- * }
- * }, {
- * isArchived: false,
- * isDraft: false,
- * fieldData: {
- * name: "Product Manager",
- * slug: "product-manager",
- * url: "https://boards.greenhouse.io/webflow/jobs/31234567",
- * department: "Product"
- * }
- * }]
- * }
- * })
*/
public createItemLive(
collection_id: string,
@@ -1336,6 +1423,10 @@ export class ItemsClient {
}
/**
+ *
+ * Rich Text field values can contain Webflow component instances as `` markup — see [Components in Rich Text](/data/docs/working-with-the-cms/components-in-rich-text) for the markup grammar, how to find component and property IDs, and the write constraints.
+ *
+ *
* Update a single published item or multiple published items (up to 100) in a Collection
*
* Items will only be updated in the primary locale, unless a `cmsLocaleId` is included in the request.
@@ -1545,8 +1636,16 @@ export class ItemsClient {
}
/**
+ *
+ * Rich Text field values can contain Webflow component instances as `` markup — see [Components in Rich Text](/data/docs/working-with-the-cms/components-in-rich-text) for the markup grammar, how to find component and property IDs, and the write constraints.
+ *
+ *
* Create an item or multiple items in a CMS Collection across multiple corresponding locales.
*
+ *
+ * This endpoint remains supported. New integrations should use [Create Items](/data/reference/cms/collection-items/staged-items/create-items), which does everything this endpoint does and can also add locale variants to an existing item. [This guide to creating items](/data/docs/working-with-the-cms/create-items) shows how the request shape maps.
+ *
+ *
*
* - This endpoint can create up to 100 items in a request.
* - If the `cmsLocaleIds` parameter is not included in the request, an item will only be created in the primary locale.
@@ -1717,6 +1816,283 @@ export class ItemsClient {
}
/**
+ * Create one or more staged items in a CMS Collection.
+ *
+ * Send an `items` array with `fieldData` for each item. By default, new items are created in the primary locale. To choose other locales or add variants to an existing item, expand the options below.
+ *
+ * - **Publishing:** Set `isDraft: false` to queue an item for the next site publish. Items are created as drafts (`isDraft: true`) by default. To publish individual items, use [Publish Collection Item(s)](/data/reference/cms/collection-items/staged-items/publish-item).
+ * - **Request limit:** Up to 100 items, counting every locale variant across all entries. One item in three locales counts as three; an item in the primary locale only counts as one.
+ *
+ * Required scope | `cms:write`
+ *
+ *
+ *
+ * Each new item gets one ID. Its locale variants share that ID and the same `fieldData`.
+ *
+ * - **Selected locales:** Set `cmsLocaleIds` to the locale IDs you want to create the item in.
+ * - **All site locales:** Set `allCmsLocales: true` to include every current site locale, including the primary locale, without listing IDs.
+ * - **Primary locale only:** Omit both `cmsLocaleIds` and `allCmsLocales`.
+ *
+ * Use only one locale selector per entry. `allCmsLocales` is available only for new items and accepts only `true`; omit it instead of sending `false`.
+ *
+ *
+ *
+ * Set `id` to an existing item's ID and provide the new locales in `cmsLocaleIds`. The variants reuse that ID. The item must exist and must not already have a variant in any requested locale.
+ *
+ * Send the source content in `fieldData` as a starting point for translators. To provide different content per locale, send multiple entries with the same `id`, each with one locale in `cmsLocaleIds` and its own `fieldData`.
+ *
+ *
+ *
+ * These requests return a `400`:
+ *
+ * - Combining `allCmsLocales` with `cmsLocaleIds` (even an empty array) or `id`.
+ * - Setting `allCmsLocales` to `false`, a string, or `null`.
+ * - Sending unrecognized properties, including singular `cmsLocaleId`. Use `cmsLocaleIds` (plural).
+ * - Repeating a locale within one entry, or the same `id`/locale pair across entries.
+ *
+ * Check the response's `message` and `details` for validation errors. Some errors identify an entry, such as `items[2].cmsLocaleIds`. Invalid locale selector combinations return a message with an empty `details` array.
+ *
+ *
+ *
+ * Moving from `POST /items` or `POST /items/bulk`? See [Creating collection items](/data/docs/working-with-the-cms/create-items) for request mappings.
+ *
+ * Rich Text fields can include Webflow components. See [Components in Rich Text](/data/docs/working-with-the-cms/components-in-rich-text) for markup and constraints.
+ *
+ * @param {string} collection_id - Unique identifier for a Collection
+ * @param {Webflow.collections.InsertCollectionItemsRequestBody} request
+ * @param {ItemsClient.RequestOptions} requestOptions - Request-specific configuration.
+ *
+ * @throws {@link Webflow.BadRequestError}
+ * @throws {@link Webflow.UnauthorizedError}
+ * @throws {@link Webflow.NotFoundError}
+ * @throws {@link Webflow.ConflictError}
+ * @throws {@link Webflow.TooManyRequestsError}
+ * @throws {@link Webflow.InternalServerError}
+ *
+ * @example
+ * await client.collections.items.insertItems("580e63fc8c9a982ac9b8b745", {
+ * skipInvalidFiles: true,
+ * items: [{
+ * fieldData: {
+ * name: "Mostly Harmless",
+ * slug: "mostly-harmless"
+ * }
+ * }]
+ * })
+ *
+ * @example
+ * await client.collections.items.insertItems("580e63fc8c9a982ac9b8b745", {
+ * skipInvalidFiles: true,
+ * items: [{
+ * cmsLocaleIds: ["66f6e966c9e1dc700a857ca3", "66f6e966c9e1dc700a857ca4"],
+ * fieldData: {
+ * name: "Mostly Harmless",
+ * slug: "mostly-harmless"
+ * }
+ * }]
+ * })
+ *
+ * @example
+ * await client.collections.items.insertItems("580e63fc8c9a982ac9b8b745", {
+ * skipInvalidFiles: true,
+ * items: [{
+ * allCmsLocales: true,
+ * fieldData: {
+ * name: "Mostly Harmless",
+ * slug: "mostly-harmless"
+ * }
+ * }]
+ * })
+ *
+ * @example
+ * await client.collections.items.insertItems("580e63fc8c9a982ac9b8b745", {
+ * skipInvalidFiles: true,
+ * items: [{
+ * id: "66f6ed9576ddacf3149d5ea6",
+ * cmsLocaleIds: ["66f6e966c9e1dc700a857ca4", "66f6e966c9e1dc700a857ca5"],
+ * fieldData: {
+ * name: "Don\u2019t Panic",
+ * slug: "dont-panic"
+ * }
+ * }]
+ * })
+ *
+ * @example
+ * await client.collections.items.insertItems("580e63fc8c9a982ac9b8b745", {
+ * skipInvalidFiles: true,
+ * items: [{
+ * id: "66f6ed9576ddacf3149d5ea6",
+ * cmsLocaleIds: ["66f6e966c9e1dc700a857ca4"],
+ * fieldData: {
+ * name: "Pas de panique",
+ * slug: "pas-de-panique"
+ * }
+ * }, {
+ * id: "66f6ed9576ddacf3149d5ea6",
+ * cmsLocaleIds: ["66f6e966c9e1dc700a857ca5"],
+ * fieldData: {
+ * name: "Keine Panik",
+ * slug: "keine-panik"
+ * }
+ * }]
+ * })
+ *
+ * @example
+ * await client.collections.items.insertItems("580e63fc8c9a982ac9b8b745", {
+ * skipInvalidFiles: true,
+ * items: [{
+ * cmsLocaleIds: ["66f6e966c9e1dc700a857ca3", "66f6e966c9e1dc700a857ca4"],
+ * fieldData: {
+ * name: "So Long and Thanks for All the Fish",
+ * slug: "so-long-and-thanks"
+ * }
+ * }, {
+ * fieldData: {
+ * name: "Life, the Universe and Everything",
+ * slug: "life-universe-everything"
+ * }
+ * }, {
+ * id: "66f6ed9576ddacf3149d5ea6",
+ * cmsLocaleIds: ["66f6e966c9e1dc700a857ca5"],
+ * fieldData: {
+ * name: "Keine Panik",
+ * slug: "keine-panik"
+ * }
+ * }]
+ * })
+ */
+ public insertItems(
+ collection_id: string,
+ request: Webflow.collections.InsertCollectionItemsRequestBody,
+ requestOptions?: ItemsClient.RequestOptions,
+ ): core.HttpResponsePromise {
+ return core.HttpResponsePromise.fromPromise(this.__insertItems(collection_id, request, requestOptions));
+ }
+
+ private async __insertItems(
+ collection_id: string,
+ request: Webflow.collections.InsertCollectionItemsRequestBody,
+ requestOptions?: ItemsClient.RequestOptions,
+ ): Promise> {
+ const { skipInvalidFiles, ..._body } = request;
+ const _queryParams: Record = {
+ skipInvalidFiles,
+ };
+ const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest();
+ const _headers: core.Fetcher.Args["headers"] = mergeHeaders(
+ _authRequest.headers,
+ this._options?.headers,
+ requestOptions?.headers,
+ );
+ const _response = await core.fetcher({
+ url: core.url.join(
+ (await core.Supplier.get(this._options.baseUrl)) ??
+ ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi)
+ .base,
+ `collections/${core.url.encodePathParam(collection_id)}/items/insert`,
+ ),
+ method: "POST",
+ headers: _headers,
+ contentType: "application/json",
+ queryParameters: { ..._queryParams, ...requestOptions?.queryParams },
+ requestType: "json",
+ body: serializers.collections.InsertCollectionItemsRequestBody.jsonOrThrow(_body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ omitUndefined: true,
+ }),
+ timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000,
+ maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries,
+ abortSignal: requestOptions?.abortSignal,
+ fetchFn: this._options?.fetch,
+ logging: this._options.logging,
+ });
+ if (_response.ok) {
+ return {
+ data: serializers.collections.ItemsInsertItemsResponse.parseOrThrow(_response.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ rawResponse: _response.rawResponse,
+ };
+ }
+
+ if (_response.error.reason === "status-code") {
+ switch (_response.error.statusCode) {
+ case 400:
+ throw new Webflow.BadRequestError(_response.error.body, _response.rawResponse);
+ case 401:
+ throw new Webflow.UnauthorizedError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 404:
+ throw new Webflow.NotFoundError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 409:
+ throw new Webflow.ConflictError(_response.error.body, _response.rawResponse);
+ case 429:
+ throw new Webflow.TooManyRequestsError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 500:
+ throw new Webflow.InternalServerError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ default:
+ throw new errors.WebflowError({
+ statusCode: _response.error.statusCode,
+ body: _response.error.body,
+ rawResponse: _response.rawResponse,
+ });
+ }
+ }
+
+ return handleNonStatusCodeError(
+ _response.error,
+ _response.rawResponse,
+ "POST",
+ "/collections/{collection_id}/items/insert",
+ );
+ }
+
+ /**
+ *
+ * Rich Text field values can contain Webflow component instances as `` markup — see [Components in Rich Text](/data/docs/working-with-the-cms/components-in-rich-text) for the markup grammar, how to find component and property IDs, and the write constraints.
+ *
+ *
* Get details of a selected Collection Item.
*
* Required scope | `CMS:read`
@@ -1734,7 +2110,8 @@ export class ItemsClient {
*
* @example
* await client.collections.items.getItem("580e63fc8c9a982ac9b8b745", "580e64008c9a982ac9b8b754", {
- * cmsLocaleId: "cmsLocaleId"
+ * cmsLocaleId: "cmsLocaleId",
+ * translatable: "65427cf400e02b306eaa04a0"
* })
*/
public getItem(
@@ -1752,9 +2129,10 @@ export class ItemsClient {
request: Webflow.collections.ItemsGetItemRequest = {},
requestOptions?: ItemsClient.RequestOptions,
): Promise> {
- const { cmsLocaleId } = request;
+ const { cmsLocaleId, translatable } = request;
const _queryParams: Record = {
cmsLocaleId,
+ translatable,
};
const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest();
const _headers: core.Fetcher.Args["headers"] = mergeHeaders(
@@ -1988,8 +2366,21 @@ export class ItemsClient {
}
/**
+ *
+ * Rich Text field values can contain Webflow component instances as `` markup — see [Components in Rich Text](/data/docs/working-with-the-cms/components-in-rich-text) for the markup grammar, how to find component and property IDs, and the write constraints.
+ *
+ *
* Update a selected Item in a Collection.
*
+ *
+ * `isDraft: true` doesn't unpublish an item. The resulting status depends on whether the item has been published before:
+ *
+ * - **Item that has never been published:** the item gets a `Draft` status.
+ * - **Already-published item:** the item gets a `Changes in draft` status. The live item stays published, and your changes are held back until you publish them.
+ *
+ * Setting `isDraft: false` queues the item to publish on the next site publish. To remove an item from the live site, use [Unpublish Live Collection Items](/data/reference/cms/collection-items/live-items/delete-items-live). For the full status mapping, see [Publishing with the CMS API](/data/docs/working-with-the-cms/publishing).
+ *
+ *
* Required scope | `CMS:write`
*
* @param {string} collection_id - Unique identifier for a Collection
@@ -2178,6 +2569,10 @@ export class ItemsClient {
}
/**
+ *
+ * Rich Text field values can contain Webflow component instances as `` markup — see [Components in Rich Text](/data/docs/working-with-the-cms/components-in-rich-text) for the markup grammar, how to find component and property IDs, and the write constraints.
+ *
+ *
* Get details of a selected Collection live Item.
*
*
@@ -2199,7 +2594,8 @@ export class ItemsClient {
*
* @example
* await client.collections.items.getItemLive("580e63fc8c9a982ac9b8b745", "580e64008c9a982ac9b8b754", {
- * cmsLocaleId: "cmsLocaleId"
+ * cmsLocaleId: "cmsLocaleId",
+ * translatable: "65427cf400e02b306eaa04a0"
* })
*/
public getItemLive(
@@ -2219,9 +2615,10 @@ export class ItemsClient {
request: Webflow.collections.ItemsGetItemLiveRequest = {},
requestOptions?: ItemsClient.RequestOptions,
): Promise> {
- const { cmsLocaleId } = request;
+ const { cmsLocaleId, translatable } = request;
const _queryParams: Record = {
cmsLocaleId,
+ translatable,
};
const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest();
const _headers: core.Fetcher.Args["headers"] = mergeHeaders(
@@ -2459,6 +2856,10 @@ export class ItemsClient {
}
/**
+ *
+ * Rich Text field values can contain Webflow component instances as `` markup — see [Components in Rich Text](/data/docs/working-with-the-cms/components-in-rich-text) for the markup grammar, how to find component and property IDs, and the write constraints.
+ *
+ *
* Update a selected live Item in a Collection. The updates for this Item will be published to the live site.
*
* Required scope | `CMS:write`
@@ -2656,6 +3057,9 @@ export class ItemsClient {
/**
* Publish an item or multiple items.
*
+ * Publishing a draft item automatically sets `isDraft` to `false`.
+ * You don't need to update the item's draft status before calling this endpoint.
+ *
* Required scope | `cms:write`
*
* @param {string} collection_id - Unique identifier for a Collection
diff --git a/src/api/resources/collections/resources/items/client/requests/InsertCollectionItemsRequestBody.ts b/src/api/resources/collections/resources/items/client/requests/InsertCollectionItemsRequestBody.ts
new file mode 100644
index 00000000..640ff998
--- /dev/null
+++ b/src/api/resources/collections/resources/items/client/requests/InsertCollectionItemsRequestBody.ts
@@ -0,0 +1,103 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../../../../../index";
+
+/**
+ * @example
+ * {
+ * skipInvalidFiles: true,
+ * items: [{
+ * fieldData: {
+ * name: "Mostly Harmless",
+ * slug: "mostly-harmless"
+ * }
+ * }]
+ * }
+ *
+ * @example
+ * {
+ * skipInvalidFiles: true,
+ * items: [{
+ * cmsLocaleIds: ["66f6e966c9e1dc700a857ca3", "66f6e966c9e1dc700a857ca4"],
+ * fieldData: {
+ * name: "Mostly Harmless",
+ * slug: "mostly-harmless"
+ * }
+ * }]
+ * }
+ *
+ * @example
+ * {
+ * skipInvalidFiles: true,
+ * items: [{
+ * allCmsLocales: true,
+ * fieldData: {
+ * name: "Mostly Harmless",
+ * slug: "mostly-harmless"
+ * }
+ * }]
+ * }
+ *
+ * @example
+ * {
+ * skipInvalidFiles: true,
+ * items: [{
+ * id: "66f6ed9576ddacf3149d5ea6",
+ * cmsLocaleIds: ["66f6e966c9e1dc700a857ca4", "66f6e966c9e1dc700a857ca5"],
+ * fieldData: {
+ * name: "Don\u2019t Panic",
+ * slug: "dont-panic"
+ * }
+ * }]
+ * }
+ *
+ * @example
+ * {
+ * skipInvalidFiles: true,
+ * items: [{
+ * id: "66f6ed9576ddacf3149d5ea6",
+ * cmsLocaleIds: ["66f6e966c9e1dc700a857ca4"],
+ * fieldData: {
+ * name: "Pas de panique",
+ * slug: "pas-de-panique"
+ * }
+ * }, {
+ * id: "66f6ed9576ddacf3149d5ea6",
+ * cmsLocaleIds: ["66f6e966c9e1dc700a857ca5"],
+ * fieldData: {
+ * name: "Keine Panik",
+ * slug: "keine-panik"
+ * }
+ * }]
+ * }
+ *
+ * @example
+ * {
+ * skipInvalidFiles: true,
+ * items: [{
+ * cmsLocaleIds: ["66f6e966c9e1dc700a857ca3", "66f6e966c9e1dc700a857ca4"],
+ * fieldData: {
+ * name: "So Long and Thanks for All the Fish",
+ * slug: "so-long-and-thanks"
+ * }
+ * }, {
+ * fieldData: {
+ * name: "Life, the Universe and Everything",
+ * slug: "life-universe-everything"
+ * }
+ * }, {
+ * id: "66f6ed9576ddacf3149d5ea6",
+ * cmsLocaleIds: ["66f6e966c9e1dc700a857ca5"],
+ * fieldData: {
+ * name: "Keine Panik",
+ * slug: "keine-panik"
+ * }
+ * }]
+ * }
+ */
+export interface InsertCollectionItemsRequestBody {
+ /** When true, invalid files are skipped and processing continues. When false, the entire request fails if any file is invalid. */
+ skipInvalidFiles?: boolean;
+ /** The items to create. A request can create up to 100 items, counted as the sum of the locales across every entry. An `allCmsLocales: true` entry counts once per current site locale; a new-item entry with neither locale selector counts as one. */
+ items: Webflow.InsertCollectionItem[];
+}
diff --git a/src/api/resources/collections/resources/items/client/requests/ItemsCreateItemLiveRequest.ts b/src/api/resources/collections/resources/items/client/requests/ItemsCreateItemLiveRequest.ts
index 40e21ced..de16a9d5 100644
--- a/src/api/resources/collections/resources/items/client/requests/ItemsCreateItemLiveRequest.ts
+++ b/src/api/resources/collections/resources/items/client/requests/ItemsCreateItemLiveRequest.ts
@@ -49,32 +49,6 @@ import type * as Webflow from "../../../../../../index";
* }
* }
* }
- *
- * @example
- * {
- * skipInvalidFiles: true,
- * body: {
- * items: [{
- * isArchived: false,
- * isDraft: false,
- * fieldData: {
- * name: "Senior Data Analyst",
- * slug: "senior-data-analyst",
- * url: "https://boards.greenhouse.io/webflow/jobs/26567701",
- * department: "Data"
- * }
- * }, {
- * isArchived: false,
- * isDraft: false,
- * fieldData: {
- * name: "Product Manager",
- * slug: "product-manager",
- * url: "https://boards.greenhouse.io/webflow/jobs/31234567",
- * department: "Product"
- * }
- * }]
- * }
- * }
*/
export interface ItemsCreateItemLiveRequest {
/** When true, invalid files are skipped and processing continues. When false, the entire request fails if any file is invalid. */
diff --git a/src/api/resources/collections/resources/items/client/requests/ItemsCreateItemRequest.ts b/src/api/resources/collections/resources/items/client/requests/ItemsCreateItemRequest.ts
index 4f47afe0..dda29088 100644
--- a/src/api/resources/collections/resources/items/client/requests/ItemsCreateItemRequest.ts
+++ b/src/api/resources/collections/resources/items/client/requests/ItemsCreateItemRequest.ts
@@ -49,32 +49,6 @@ import type * as Webflow from "../../../../../../index";
* }
* }
* }
- *
- * @example
- * {
- * skipInvalidFiles: true,
- * body: {
- * items: [{
- * isArchived: false,
- * isDraft: false,
- * fieldData: {
- * name: "Senior Data Analyst",
- * slug: "senior-data-analyst",
- * url: "https://boards.greenhouse.io/webflow/jobs/26567701",
- * department: "Data"
- * }
- * }, {
- * isArchived: false,
- * isDraft: false,
- * fieldData: {
- * name: "Product Manager",
- * slug: "product-manager",
- * url: "https://boards.greenhouse.io/webflow/jobs/31234567",
- * department: "Product"
- * }
- * }]
- * }
- * }
*/
export interface ItemsCreateItemRequest {
/** When true, invalid files are skipped and processing continues. When false, the entire request fails if any file is invalid. */
diff --git a/src/api/resources/collections/resources/items/client/requests/ItemsGetItemLiveRequest.ts b/src/api/resources/collections/resources/items/client/requests/ItemsGetItemLiveRequest.ts
index 9db7bd09..8176cfb4 100644
--- a/src/api/resources/collections/resources/items/client/requests/ItemsGetItemLiveRequest.ts
+++ b/src/api/resources/collections/resources/items/client/requests/ItemsGetItemLiveRequest.ts
@@ -3,10 +3,25 @@
/**
* @example
* {
- * cmsLocaleId: "cmsLocaleId"
+ * cmsLocaleId: "cmsLocaleId",
+ * translatable: "65427cf400e02b306eaa04a0"
* }
*/
export interface ItemsGetItemLiveRequest {
- /** Unique identifier for a CMS Locale. This UID is different from the Site locale identifier and is listed as `cmsLocaleId` in the Sites response. To query multiple locales, input a comma separated string. */
+ /** Unique identifier for a CMS Locale. This UID is different from the Site locale identifier and is listed as `cmsLocaleId` in the Sites response. This endpoint returns a single item, so it accepts one locale. To retrieve an item in several locales, use [List Collection Items](/data/reference/cms/collection-items/staged-items/list-items) with `filter[id][eq]` and a comma separated `cmsLocaleId`. */
cmsLocaleId?: string;
+ /**
+ * Unique identifier for the secondary Locale you're translating **into**. Returns only content that hasn't been excluded from translation for that locale.
+ *
+ * This is independent of `localeId`, which selects which version of the content is returned. To fetch the source text to translate, request the primary locale's content and set `translatable` to the locale you're translating into:
+ *
+ * `?localeId={primary locale id}&translatable={target locale id}`
+ *
+ * Only exclusion rules scoped to manual translation are respected — rules scoped only to automatic translation don't affect this parameter's response.
+ *
+ * Omitting `translatable` returns the same response as if this parameter didn't exist. The value must be the id of one of the site's secondary locales — the primary locale id, or any other value, returns a `400` error. Requires translation exclusions to be enabled for the site; if they aren't, the request returns a `403` error.
+ *
+ * [Learn more about localization.](/data/v2.0.0/docs/working-with-localization)
+ */
+ translatable?: string;
}
diff --git a/src/api/resources/collections/resources/items/client/requests/ItemsGetItemRequest.ts b/src/api/resources/collections/resources/items/client/requests/ItemsGetItemRequest.ts
index 1bc89dbc..bb7ebfee 100644
--- a/src/api/resources/collections/resources/items/client/requests/ItemsGetItemRequest.ts
+++ b/src/api/resources/collections/resources/items/client/requests/ItemsGetItemRequest.ts
@@ -3,10 +3,25 @@
/**
* @example
* {
- * cmsLocaleId: "cmsLocaleId"
+ * cmsLocaleId: "cmsLocaleId",
+ * translatable: "65427cf400e02b306eaa04a0"
* }
*/
export interface ItemsGetItemRequest {
- /** Unique identifier for a CMS Locale. This UID is different from the Site locale identifier and is listed as `cmsLocaleId` in the Sites response. To query multiple locales, input a comma separated string. */
+ /** Unique identifier for a CMS Locale. This UID is different from the Site locale identifier and is listed as `cmsLocaleId` in the Sites response. This endpoint returns a single item, so it accepts one locale. To retrieve an item in several locales, use [List Collection Items](/data/reference/cms/collection-items/staged-items/list-items) with `filter[id][eq]` and a comma separated `cmsLocaleId`. */
cmsLocaleId?: string;
+ /**
+ * Unique identifier for the secondary Locale you're translating **into**. Returns only content that hasn't been excluded from translation for that locale.
+ *
+ * This is independent of `localeId`, which selects which version of the content is returned. To fetch the source text to translate, request the primary locale's content and set `translatable` to the locale you're translating into:
+ *
+ * `?localeId={primary locale id}&translatable={target locale id}`
+ *
+ * Only exclusion rules scoped to manual translation are respected — rules scoped only to automatic translation don't affect this parameter's response.
+ *
+ * Omitting `translatable` returns the same response as if this parameter didn't exist. The value must be the id of one of the site's secondary locales — the primary locale id, or any other value, returns a `400` error. Requires translation exclusions to be enabled for the site; if they aren't, the request returns a `403` error.
+ *
+ * [Learn more about localization.](/data/v2.0.0/docs/working-with-localization)
+ */
+ translatable?: string;
}
diff --git a/src/api/resources/collections/resources/items/client/requests/ItemsListItemsLiveRequest.ts b/src/api/resources/collections/resources/items/client/requests/ItemsListItemsLiveRequest.ts
index 9dc47f76..92111d16 100644
--- a/src/api/resources/collections/resources/items/client/requests/ItemsListItemsLiveRequest.ts
+++ b/src/api/resources/collections/resources/items/client/requests/ItemsListItemsLiveRequest.ts
@@ -11,7 +11,8 @@ import type * as Webflow from "../../../../../../index";
* name: "name",
* slug: "slug",
* sortBy: "createdOn",
- * sortOrder: "asc"
+ * sortOrder: "asc",
+ * translatable: "65427cf400e02b306eaa04a0"
* }
*/
export interface ItemsListItemsLiveRequest {
@@ -31,8 +32,74 @@ export interface ItemsListItemsLiveRequest {
lastPublished?: Webflow.ItemsListItemsLiveRequestLastPublished;
/** Filter by the last updated date of the item(s) */
lastUpdated?: Webflow.ItemsListItemsLiveRequestLastUpdated;
+ /**
+ * Filter collection items by custom field values. Use bracket notation:
+ * `filter[][]=`.
+ *
+ * Example: `filter[price][gte]=10&filter[price][lte]=100&filter[name][contains]=shirt`.
+ *
+ * Filters are combined with AND. You can combine custom field filters with top-level filters such as `name`, `slug`, `createdOn`, `lastPublished`, and `lastUpdated`. OR logic and nested filter groups are not supported on GET requests.
+ *
+ * More filter terms can increase request latency.
+ *
+ * Supported operators by field type:
+ *
+ * | Field type | Supported operators |
+ * | --- | --- |
+ * | `id` | `eq`, `ne`, `in`, `nin` |
+ * | `PlainText` | `eq`, `ne`, `in`, `nin`, `contains`, `ncontains`, `exists` |
+ * | `Number` | `eq`, `ne`, `gt`, `gte`, `lt`, `lte`, `in`, `nin`, `exists` |
+ * | `Switch` | `eq`, `ne`, `in`, `nin`, `exists` |
+ * | `DateTime` | `eq`, `ne`, `gt`, `gte`, `lt`, `lte`, `in`, `nin`, `exists` |
+ * | `Email`, `Phone`, `Link` | `eq`, `ne`, `in`, `nin`, `contains`, `ncontains`, `exists` |
+ * | `Color` | `eq`, `ne`, `in`, `nin`, `exists` |
+ * | `Reference` | `eq`, `ne`, `in`, `nin`, `exists` |
+ * | `Option` | `eq`, `ne`, `in`, `nin` |
+ * | `RichText`, `Image`, `MultiImage`, `VideoLink`, `MultiReference` | `exists` |
+ *
+ * `contains` and `ncontains` are case-insensitive. `ncontains` also matches items where the field is empty or not set.
+ *
+ * `exists=true` matches items where the field has a value. `exists=false` matches items where the field is missing or null. For `Switch` fields, `false` is still a set value.
+ *
+ * Value formats:
+ *
+ * | Field type | Value format |
+ * | --- | --- |
+ * | `Number` | A valid number, such as `10` or `12.5` |
+ * | `Switch` | `true` or `false` |
+ * | `DateTime` | ISO 8601 date-time string |
+ * | `id`, `Reference` | 24-character item ID |
+ * | `Option` | Option ID |
+ * | `in`, `nin` | Comma-separated list, up to 100 values |
+ *
+ * Invalid fields, invalid values, and operators that do not apply to a field type return a `400 BadArgument` response.
+ */
+ filter?: Record;
/** Sort results by the provided value */
sortBy?: Webflow.collections.ItemsListItemsLiveRequestSortBy;
/** Sorts the results by asc or desc */
sortOrder?: Webflow.collections.ItemsListItemsLiveRequestSortOrder;
+ /**
+ * Sort collection items by custom fields using bracket notation: `sort[]=`.
+ *
+ * - Example: `sort[price]=desc`
+ * - Multiple sort fields are applied in query-string order. When `sort[...]` is provided, it takes precedence over `sortBy` and `sortOrder`.
+ * - Sortable field types: `PlainText`, `Email`, `Phone`, `Number`, `DateTime`, and `Switch`.
+ * - Unknown fields, invalid sort directions, and non-sortable field types return a `400 BadArgument` response.
+ */
+ sort?: Record;
+ /**
+ * Unique identifier for the secondary Locale you're translating **into**. Returns only content that hasn't been excluded from translation for that locale.
+ *
+ * This is independent of `localeId`, which selects which version of the content is returned. To fetch the source text to translate, request the primary locale's content and set `translatable` to the locale you're translating into:
+ *
+ * `?localeId={primary locale id}&translatable={target locale id}`
+ *
+ * Only exclusion rules scoped to manual translation are respected — rules scoped only to automatic translation don't affect this parameter's response.
+ *
+ * Omitting `translatable` returns the same response as if this parameter didn't exist. The value must be the id of one of the site's secondary locales — the primary locale id, or any other value, returns a `400` error. Requires translation exclusions to be enabled for the site; if they aren't, the request returns a `403` error.
+ *
+ * [Learn more about localization.](/data/v2.0.0/docs/working-with-localization)
+ */
+ translatable?: string;
}
diff --git a/src/api/resources/collections/resources/items/client/requests/ItemsListItemsRequest.ts b/src/api/resources/collections/resources/items/client/requests/ItemsListItemsRequest.ts
index af6c474b..18e99c3e 100644
--- a/src/api/resources/collections/resources/items/client/requests/ItemsListItemsRequest.ts
+++ b/src/api/resources/collections/resources/items/client/requests/ItemsListItemsRequest.ts
@@ -11,7 +11,8 @@ import type * as Webflow from "../../../../../../index";
* name: "name",
* slug: "slug",
* sortBy: "createdOn",
- * sortOrder: "asc"
+ * sortOrder: "asc",
+ * translatable: "65427cf400e02b306eaa04a0"
* }
*/
export interface ItemsListItemsRequest {
@@ -31,8 +32,74 @@ export interface ItemsListItemsRequest {
lastPublished?: Webflow.ItemsListItemsRequestLastPublished;
/** Filter by the last updated date of the item(s) */
lastUpdated?: Webflow.ItemsListItemsRequestLastUpdated;
+ /**
+ * Filter collection items by custom field values. Use bracket notation:
+ * `filter[][]=`.
+ *
+ * Example: `filter[price][gte]=10&filter[price][lte]=100&filter[name][contains]=shirt`.
+ *
+ * Filters are combined with AND. You can combine custom field filters with top-level filters such as `name`, `slug`, `createdOn`, `lastPublished`, and `lastUpdated`. OR logic and nested filter groups are not supported on GET requests.
+ *
+ * More filter terms can increase request latency.
+ *
+ * Supported operators by field type:
+ *
+ * | Field type | Supported operators |
+ * | --- | --- |
+ * | `id` | `eq`, `ne`, `in`, `nin` |
+ * | `PlainText` | `eq`, `ne`, `in`, `nin`, `contains`, `ncontains`, `exists` |
+ * | `Number` | `eq`, `ne`, `gt`, `gte`, `lt`, `lte`, `in`, `nin`, `exists` |
+ * | `Switch` | `eq`, `ne`, `in`, `nin`, `exists` |
+ * | `DateTime` | `eq`, `ne`, `gt`, `gte`, `lt`, `lte`, `in`, `nin`, `exists` |
+ * | `Email`, `Phone`, `Link` | `eq`, `ne`, `in`, `nin`, `contains`, `ncontains`, `exists` |
+ * | `Color` | `eq`, `ne`, `in`, `nin`, `exists` |
+ * | `Reference` | `eq`, `ne`, `in`, `nin`, `exists` |
+ * | `Option` | `eq`, `ne`, `in`, `nin` |
+ * | `RichText`, `Image`, `MultiImage`, `VideoLink`, `MultiReference` | `exists` |
+ *
+ * `contains` and `ncontains` are case-insensitive. `ncontains` also matches items where the field is empty or not set.
+ *
+ * `exists=true` matches items where the field has a value. `exists=false` matches items where the field is missing or null. For `Switch` fields, `false` is still a set value.
+ *
+ * Value formats:
+ *
+ * | Field type | Value format |
+ * | --- | --- |
+ * | `Number` | A valid number, such as `10` or `12.5` |
+ * | `Switch` | `true` or `false` |
+ * | `DateTime` | ISO 8601 date-time string |
+ * | `id`, `Reference` | 24-character item ID |
+ * | `Option` | Option ID |
+ * | `in`, `nin` | Comma-separated list, up to 100 values |
+ *
+ * Invalid fields, invalid values, and operators that do not apply to a field type return a `400 BadArgument` response.
+ */
+ filter?: Record;
/** Sort results by the provided value */
sortBy?: Webflow.collections.ItemsListItemsRequestSortBy;
/** Sorts the results by asc or desc */
sortOrder?: Webflow.collections.ItemsListItemsRequestSortOrder;
+ /**
+ * Sort collection items by custom fields using bracket notation: `sort[]=`.
+ *
+ * - Example: `sort[price]=desc`
+ * - Multiple sort fields are applied in query-string order. When `sort[...]` is provided, it takes precedence over `sortBy` and `sortOrder`.
+ * - Sortable field types: `PlainText`, `Email`, `Phone`, `Number`, `DateTime`, and `Switch`.
+ * - Unknown fields, invalid sort directions, and non-sortable field types return a `400 BadArgument` response.
+ */
+ sort?: Record;
+ /**
+ * Unique identifier for the secondary Locale you're translating **into**. Returns only content that hasn't been excluded from translation for that locale.
+ *
+ * This is independent of `localeId`, which selects which version of the content is returned. To fetch the source text to translate, request the primary locale's content and set `translatable` to the locale you're translating into:
+ *
+ * `?localeId={primary locale id}&translatable={target locale id}`
+ *
+ * Only exclusion rules scoped to manual translation are respected — rules scoped only to automatic translation don't affect this parameter's response.
+ *
+ * Omitting `translatable` returns the same response as if this parameter didn't exist. The value must be the id of one of the site's secondary locales — the primary locale id, or any other value, returns a `400` error. Requires translation exclusions to be enabled for the site; if they aren't, the request returns a `403` error.
+ *
+ * [Learn more about localization.](/data/v2.0.0/docs/working-with-localization)
+ */
+ translatable?: string;
}
diff --git a/src/api/resources/collections/resources/items/client/requests/index.ts b/src/api/resources/collections/resources/items/client/requests/index.ts
index 4bb198d5..a05147a3 100644
--- a/src/api/resources/collections/resources/items/client/requests/index.ts
+++ b/src/api/resources/collections/resources/items/client/requests/index.ts
@@ -1,4 +1,5 @@
export type { CreateBulkCollectionItemRequestBody } from "./CreateBulkCollectionItemRequestBody";
+export type { InsertCollectionItemsRequestBody } from "./InsertCollectionItemsRequestBody";
export type { ItemsCreateItemLiveRequest } from "./ItemsCreateItemLiveRequest";
export type { ItemsCreateItemRequest } from "./ItemsCreateItemRequest";
export type { ItemsDeleteItemLiveRequest } from "./ItemsDeleteItemLiveRequest";
diff --git a/src/api/resources/collections/resources/items/types/ItemsDeleteItemsLiveRequestItemsItem.ts b/src/api/resources/collections/resources/items/types/ItemsDeleteItemsLiveRequestItemsItem.ts
index 807c8179..35930651 100644
--- a/src/api/resources/collections/resources/items/types/ItemsDeleteItemsLiveRequestItemsItem.ts
+++ b/src/api/resources/collections/resources/items/types/ItemsDeleteItemsLiveRequestItemsItem.ts
@@ -3,6 +3,6 @@
export interface ItemsDeleteItemsLiveRequestItemsItem {
/** Unique identifier for the Item */
id: string;
- /** Array of identifiers for the locales where the item will be created */
+ /** Array of identifiers for the locales where the item will be unpublished */
cmsLocaleIds?: string[];
}
diff --git a/src/api/resources/collections/resources/items/types/ItemsDeleteItemsRequestItemsItem.ts b/src/api/resources/collections/resources/items/types/ItemsDeleteItemsRequestItemsItem.ts
index 6739ee64..8cc5536b 100644
--- a/src/api/resources/collections/resources/items/types/ItemsDeleteItemsRequestItemsItem.ts
+++ b/src/api/resources/collections/resources/items/types/ItemsDeleteItemsRequestItemsItem.ts
@@ -3,6 +3,6 @@
export interface ItemsDeleteItemsRequestItemsItem {
/** Unique identifier for the Item */
id: string;
- /** Array of identifiers for the locales where the item will be created */
+ /** Array of identifiers for the locales where the item will be deleted */
cmsLocaleIds?: string[];
}
diff --git a/src/api/resources/collections/resources/items/types/ItemsInsertItemsResponse.ts b/src/api/resources/collections/resources/items/types/ItemsInsertItemsResponse.ts
new file mode 100644
index 00000000..cd0dedbd
--- /dev/null
+++ b/src/api/resources/collections/resources/items/types/ItemsInsertItemsResponse.ts
@@ -0,0 +1,8 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../../../../index";
+
+export interface ItemsInsertItemsResponse {
+ /** The created items. Locale variants of the same item share an `id` and differ by `cmsLocaleId`. */
+ items: Webflow.InsertedCollectionItem[];
+}
diff --git a/src/api/resources/collections/resources/items/types/ItemsListItemsLiveRequestFilterValue.ts b/src/api/resources/collections/resources/items/types/ItemsListItemsLiveRequestFilterValue.ts
new file mode 100644
index 00000000..b3031bbd
--- /dev/null
+++ b/src/api/resources/collections/resources/items/types/ItemsListItemsLiveRequestFilterValue.ts
@@ -0,0 +1,17 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../../../../index";
+
+export interface ItemsListItemsLiveRequestFilterValue {
+ eq?: string;
+ ne?: string;
+ gt?: string;
+ gte?: string;
+ lt?: string;
+ lte?: string;
+ in?: Webflow.collections.ItemsListItemsLiveRequestFilterValueIn;
+ nin?: Webflow.collections.ItemsListItemsLiveRequestFilterValueNin;
+ contains?: string;
+ ncontains?: string;
+ exists?: Webflow.collections.ItemsListItemsLiveRequestFilterValueExists;
+}
diff --git a/src/api/resources/collections/resources/items/types/ItemsListItemsLiveRequestFilterValueExists.ts b/src/api/resources/collections/resources/items/types/ItemsListItemsLiveRequestFilterValueExists.ts
new file mode 100644
index 00000000..11032aba
--- /dev/null
+++ b/src/api/resources/collections/resources/items/types/ItemsListItemsLiveRequestFilterValueExists.ts
@@ -0,0 +1,8 @@
+// This file was auto-generated by Fern from our API Definition.
+
+export const ItemsListItemsLiveRequestFilterValueExists = {
+ True: "true",
+ False: "false",
+} as const;
+export type ItemsListItemsLiveRequestFilterValueExists =
+ (typeof ItemsListItemsLiveRequestFilterValueExists)[keyof typeof ItemsListItemsLiveRequestFilterValueExists];
diff --git a/src/api/resources/collections/resources/items/types/ItemsListItemsLiveRequestFilterValueIn.ts b/src/api/resources/collections/resources/items/types/ItemsListItemsLiveRequestFilterValueIn.ts
new file mode 100644
index 00000000..043ab89f
--- /dev/null
+++ b/src/api/resources/collections/resources/items/types/ItemsListItemsLiveRequestFilterValueIn.ts
@@ -0,0 +1,3 @@
+// This file was auto-generated by Fern from our API Definition.
+
+export type ItemsListItemsLiveRequestFilterValueIn = string | string[];
diff --git a/src/api/resources/collections/resources/items/types/ItemsListItemsLiveRequestFilterValueNin.ts b/src/api/resources/collections/resources/items/types/ItemsListItemsLiveRequestFilterValueNin.ts
new file mode 100644
index 00000000..47de5f42
--- /dev/null
+++ b/src/api/resources/collections/resources/items/types/ItemsListItemsLiveRequestFilterValueNin.ts
@@ -0,0 +1,3 @@
+// This file was auto-generated by Fern from our API Definition.
+
+export type ItemsListItemsLiveRequestFilterValueNin = string | string[];
diff --git a/src/api/resources/collections/resources/items/types/ItemsListItemsLiveRequestSortValue.ts b/src/api/resources/collections/resources/items/types/ItemsListItemsLiveRequestSortValue.ts
new file mode 100644
index 00000000..5a12b280
--- /dev/null
+++ b/src/api/resources/collections/resources/items/types/ItemsListItemsLiveRequestSortValue.ts
@@ -0,0 +1,8 @@
+// This file was auto-generated by Fern from our API Definition.
+
+export const ItemsListItemsLiveRequestSortValue = {
+ Asc: "asc",
+ Desc: "desc",
+} as const;
+export type ItemsListItemsLiveRequestSortValue =
+ (typeof ItemsListItemsLiveRequestSortValue)[keyof typeof ItemsListItemsLiveRequestSortValue];
diff --git a/src/api/resources/collections/resources/items/types/ItemsListItemsRequestFilterValue.ts b/src/api/resources/collections/resources/items/types/ItemsListItemsRequestFilterValue.ts
new file mode 100644
index 00000000..ff011429
--- /dev/null
+++ b/src/api/resources/collections/resources/items/types/ItemsListItemsRequestFilterValue.ts
@@ -0,0 +1,17 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../../../../index";
+
+export interface ItemsListItemsRequestFilterValue {
+ eq?: string;
+ ne?: string;
+ gt?: string;
+ gte?: string;
+ lt?: string;
+ lte?: string;
+ in?: Webflow.collections.ItemsListItemsRequestFilterValueIn;
+ nin?: Webflow.collections.ItemsListItemsRequestFilterValueNin;
+ contains?: string;
+ ncontains?: string;
+ exists?: Webflow.collections.ItemsListItemsRequestFilterValueExists;
+}
diff --git a/src/api/resources/collections/resources/items/types/ItemsListItemsRequestFilterValueExists.ts b/src/api/resources/collections/resources/items/types/ItemsListItemsRequestFilterValueExists.ts
new file mode 100644
index 00000000..a9ae70f0
--- /dev/null
+++ b/src/api/resources/collections/resources/items/types/ItemsListItemsRequestFilterValueExists.ts
@@ -0,0 +1,8 @@
+// This file was auto-generated by Fern from our API Definition.
+
+export const ItemsListItemsRequestFilterValueExists = {
+ True: "true",
+ False: "false",
+} as const;
+export type ItemsListItemsRequestFilterValueExists =
+ (typeof ItemsListItemsRequestFilterValueExists)[keyof typeof ItemsListItemsRequestFilterValueExists];
diff --git a/src/api/resources/collections/resources/items/types/ItemsListItemsRequestFilterValueIn.ts b/src/api/resources/collections/resources/items/types/ItemsListItemsRequestFilterValueIn.ts
new file mode 100644
index 00000000..f7ff63ee
--- /dev/null
+++ b/src/api/resources/collections/resources/items/types/ItemsListItemsRequestFilterValueIn.ts
@@ -0,0 +1,3 @@
+// This file was auto-generated by Fern from our API Definition.
+
+export type ItemsListItemsRequestFilterValueIn = string | string[];
diff --git a/src/api/resources/collections/resources/items/types/ItemsListItemsRequestFilterValueNin.ts b/src/api/resources/collections/resources/items/types/ItemsListItemsRequestFilterValueNin.ts
new file mode 100644
index 00000000..b6c1b6ff
--- /dev/null
+++ b/src/api/resources/collections/resources/items/types/ItemsListItemsRequestFilterValueNin.ts
@@ -0,0 +1,3 @@
+// This file was auto-generated by Fern from our API Definition.
+
+export type ItemsListItemsRequestFilterValueNin = string | string[];
diff --git a/src/api/resources/collections/resources/items/types/ItemsListItemsRequestSortValue.ts b/src/api/resources/collections/resources/items/types/ItemsListItemsRequestSortValue.ts
new file mode 100644
index 00000000..ee0186dc
--- /dev/null
+++ b/src/api/resources/collections/resources/items/types/ItemsListItemsRequestSortValue.ts
@@ -0,0 +1,8 @@
+// This file was auto-generated by Fern from our API Definition.
+
+export const ItemsListItemsRequestSortValue = {
+ Asc: "asc",
+ Desc: "desc",
+} as const;
+export type ItemsListItemsRequestSortValue =
+ (typeof ItemsListItemsRequestSortValue)[keyof typeof ItemsListItemsRequestSortValue];
diff --git a/src/api/resources/collections/resources/items/types/MultipleItems.ts b/src/api/resources/collections/resources/items/types/MultipleItems.ts
index d1dca68c..48e352e0 100644
--- a/src/api/resources/collections/resources/items/types/MultipleItems.ts
+++ b/src/api/resources/collections/resources/items/types/MultipleItems.ts
@@ -3,6 +3,6 @@
import type * as Webflow from "../../../../../index";
export interface MultipleItems {
- /** An array of items to create */
+ /** The items to create. Each entry needs its own `fieldData`. Don't send a top-level `fieldData` with this shape. */
items?: Webflow.CollectionItemPostSingle[];
}
diff --git a/src/api/resources/collections/resources/items/types/MultipleLiveItems.ts b/src/api/resources/collections/resources/items/types/MultipleLiveItems.ts
index cfec53db..bac4527d 100644
--- a/src/api/resources/collections/resources/items/types/MultipleLiveItems.ts
+++ b/src/api/resources/collections/resources/items/types/MultipleLiveItems.ts
@@ -3,6 +3,6 @@
import type * as Webflow from "../../../../../index";
export interface MultipleLiveItems {
- /** List of collection items to create */
+ /** The items to create. Each entry needs its own `fieldData`. Don't send a top-level `fieldData` with this shape. */
items?: Webflow.CollectionItem[];
}
diff --git a/src/api/resources/collections/resources/items/types/index.ts b/src/api/resources/collections/resources/items/types/index.ts
index d9675efd..edf3ffdf 100644
--- a/src/api/resources/collections/resources/items/types/index.ts
+++ b/src/api/resources/collections/resources/items/types/index.ts
@@ -6,10 +6,21 @@ export * from "./ItemsCreateItemLiveRequestBody";
export * from "./ItemsCreateItemRequestBody";
export * from "./ItemsDeleteItemsLiveRequestItemsItem";
export * from "./ItemsDeleteItemsRequestItemsItem";
+export * from "./ItemsInsertItemsResponse";
+export * from "./ItemsListItemsLiveRequestFilterValue";
+export * from "./ItemsListItemsLiveRequestFilterValueExists";
+export * from "./ItemsListItemsLiveRequestFilterValueIn";
+export * from "./ItemsListItemsLiveRequestFilterValueNin";
export * from "./ItemsListItemsLiveRequestSortBy";
export * from "./ItemsListItemsLiveRequestSortOrder";
+export * from "./ItemsListItemsLiveRequestSortValue";
+export * from "./ItemsListItemsRequestFilterValue";
+export * from "./ItemsListItemsRequestFilterValueExists";
+export * from "./ItemsListItemsRequestFilterValueIn";
+export * from "./ItemsListItemsRequestFilterValueNin";
export * from "./ItemsListItemsRequestSortBy";
export * from "./ItemsListItemsRequestSortOrder";
+export * from "./ItemsListItemsRequestSortValue";
export * from "./ItemsPublishItemRequest";
export * from "./ItemsPublishItemRequestItemsItemsItem";
export * from "./ItemsPublishItemResponse";
diff --git a/src/api/resources/components/client/Client.ts b/src/api/resources/components/client/Client.ts
index 4b876713..82865382 100644
--- a/src/api/resources/components/client/Client.ts
+++ b/src/api/resources/components/client/Client.ts
@@ -183,7 +183,8 @@ export class ComponentsClient {
* localeId: "65427cf400e02b306eaa04a0",
* branchId: "68026fa68ef6dc744c75b833",
* limit: 1,
- * offset: 1
+ * offset: 1,
+ * translatable: "65427cf400e02b306eaa04a0"
* })
*/
public getContent(
@@ -201,12 +202,13 @@ export class ComponentsClient {
request: Webflow.ComponentsGetContentRequest = {},
requestOptions?: ComponentsClient.RequestOptions,
): Promise> {
- const { localeId, branchId, limit, offset } = request;
+ const { localeId, branchId, limit, offset, translatable } = request;
const _queryParams: Record = {
localeId,
branchId,
limit,
offset,
+ translatable,
};
const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest();
const _headers: core.Fetcher.Args["headers"] = mergeHeaders(
@@ -527,7 +529,8 @@ export class ComponentsClient {
* localeId: "65427cf400e02b306eaa04a0",
* branchId: "68026fa68ef6dc744c75b833",
* limit: 1,
- * offset: 1
+ * offset: 1,
+ * translatable: "65427cf400e02b306eaa04a0"
* })
*/
public getProperties(
@@ -547,12 +550,13 @@ export class ComponentsClient {
request: Webflow.ComponentsGetPropertiesRequest = {},
requestOptions?: ComponentsClient.RequestOptions,
): Promise> {
- const { localeId, branchId, limit, offset } = request;
+ const { localeId, branchId, limit, offset, translatable } = request;
const _queryParams: Record = {
localeId,
branchId,
limit,
offset,
+ translatable,
};
const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest();
const _headers: core.Fetcher.Args["headers"] = mergeHeaders(
diff --git a/src/api/resources/components/client/requests/ComponentsGetContentRequest.ts b/src/api/resources/components/client/requests/ComponentsGetContentRequest.ts
index eed1fe70..21b91d32 100644
--- a/src/api/resources/components/client/requests/ComponentsGetContentRequest.ts
+++ b/src/api/resources/components/client/requests/ComponentsGetContentRequest.ts
@@ -6,7 +6,8 @@
* localeId: "65427cf400e02b306eaa04a0",
* branchId: "68026fa68ef6dc744c75b833",
* limit: 1,
- * offset: 1
+ * offset: 1,
+ * translatable: "65427cf400e02b306eaa04a0"
* }
*/
export interface ComponentsGetContentRequest {
@@ -22,4 +23,18 @@ export interface ComponentsGetContentRequest {
limit?: number;
/** Offset used for pagination if the results have more than limit records */
offset?: number;
+ /**
+ * Unique identifier for the secondary Locale you're translating **into**. Returns only content that hasn't been excluded from translation for that locale.
+ *
+ * This is independent of `localeId`, which selects which version of the content is returned. To fetch the source text to translate, request the primary locale's content and set `translatable` to the locale you're translating into:
+ *
+ * `?localeId={primary locale id}&translatable={target locale id}`
+ *
+ * Only exclusion rules scoped to manual translation are respected — rules scoped only to automatic translation don't affect this parameter's response.
+ *
+ * Omitting `translatable` returns the same response as if this parameter didn't exist. The value must be the id of one of the site's secondary locales — the primary locale id, or any other value, returns a `400` error. Requires translation exclusions to be enabled for the site; if they aren't, the request returns a `403` error.
+ *
+ * [Learn more about localization.](/data/v2.0.0/docs/working-with-localization)
+ */
+ translatable?: string;
}
diff --git a/src/api/resources/components/client/requests/ComponentsGetPropertiesRequest.ts b/src/api/resources/components/client/requests/ComponentsGetPropertiesRequest.ts
index 17220f20..90bf8195 100644
--- a/src/api/resources/components/client/requests/ComponentsGetPropertiesRequest.ts
+++ b/src/api/resources/components/client/requests/ComponentsGetPropertiesRequest.ts
@@ -6,7 +6,8 @@
* localeId: "65427cf400e02b306eaa04a0",
* branchId: "68026fa68ef6dc744c75b833",
* limit: 1,
- * offset: 1
+ * offset: 1,
+ * translatable: "65427cf400e02b306eaa04a0"
* }
*/
export interface ComponentsGetPropertiesRequest {
@@ -22,4 +23,18 @@ export interface ComponentsGetPropertiesRequest {
limit?: number;
/** Offset used for pagination if the results have more than limit records */
offset?: number;
+ /**
+ * Unique identifier for the secondary Locale you're translating **into**. Returns only content that hasn't been excluded from translation for that locale.
+ *
+ * This is independent of `localeId`, which selects which version of the content is returned. To fetch the source text to translate, request the primary locale's content and set `translatable` to the locale you're translating into:
+ *
+ * `?localeId={primary locale id}&translatable={target locale id}`
+ *
+ * Only exclusion rules scoped to manual translation are respected — rules scoped only to automatic translation don't affect this parameter's response.
+ *
+ * Omitting `translatable` returns the same response as if this parameter didn't exist. The value must be the id of one of the site's secondary locales — the primary locale id, or any other value, returns a `400` error. Requires translation exclusions to be enabled for the site; if they aren't, the request returns a `403` error.
+ *
+ * [Learn more about localization.](/data/v2.0.0/docs/working-with-localization)
+ */
+ translatable?: string;
}
diff --git a/src/api/resources/customFonts/client/Client.ts b/src/api/resources/customFonts/client/Client.ts
new file mode 100644
index 00000000..0656631f
--- /dev/null
+++ b/src/api/resources/customFonts/client/Client.ts
@@ -0,0 +1,1223 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type { BaseClientOptions, BaseRequestOptions } from "../../../../BaseClient";
+import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../BaseClient";
+import * as core from "../../../../core";
+import { mergeHeaders } from "../../../../core/headers";
+import * as environments from "../../../../environments";
+import { handleNonStatusCodeError } from "../../../../errors/handleNonStatusCodeError";
+import * as errors from "../../../../errors/index";
+import * as serializers from "../../../../serialization/index";
+import * as Webflow from "../../../index";
+
+export declare namespace CustomFontsClient {
+ export type Options = BaseClientOptions;
+
+ export interface RequestOptions extends BaseRequestOptions {}
+}
+
+/**
+ * Custom fonts are font files that are uploaded to a Webflow site.
+ */
+export class CustomFontsClient {
+ protected readonly _options: NormalizedClientOptionsWithAuth;
+
+ constructor(options: CustomFontsClient.Options) {
+ this._options = normalizeClientOptionsWithAuth(options);
+ }
+
+ /**
+ * List the custom fonts uploaded to a site.
+ *
+ * Required scope | `sites:read`
+ *
+ * @param {string} site_id - Unique identifier for a Site
+ * @param {Webflow.CustomFontsListRequest} request
+ * @param {CustomFontsClient.RequestOptions} requestOptions - Request-specific configuration.
+ *
+ * @throws {@link Webflow.BadRequestError}
+ * @throws {@link Webflow.UnauthorizedError}
+ * @throws {@link Webflow.ForbiddenError}
+ * @throws {@link Webflow.NotFoundError}
+ * @throws {@link Webflow.TooManyRequestsError}
+ * @throws {@link Webflow.InternalServerError}
+ *
+ * @example
+ * await client.customFonts.list("580e63e98c9a982ac9b8b741", {
+ * offset: 1,
+ * limit: 1
+ * })
+ */
+ public list(
+ site_id: string,
+ request: Webflow.CustomFontsListRequest = {},
+ requestOptions?: CustomFontsClient.RequestOptions,
+ ): core.HttpResponsePromise {
+ return core.HttpResponsePromise.fromPromise(this.__list(site_id, request, requestOptions));
+ }
+
+ private async __list(
+ site_id: string,
+ request: Webflow.CustomFontsListRequest = {},
+ requestOptions?: CustomFontsClient.RequestOptions,
+ ): Promise> {
+ const { offset, limit } = request;
+ const _queryParams: Record = {
+ offset,
+ limit,
+ };
+ const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest();
+ const _headers: core.Fetcher.Args["headers"] = mergeHeaders(
+ _authRequest.headers,
+ this._options?.headers,
+ requestOptions?.headers,
+ );
+ const _response = await core.fetcher({
+ url: core.url.join(
+ (await core.Supplier.get(this._options.baseUrl)) ??
+ ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi)
+ .base,
+ `sites/${core.url.encodePathParam(site_id)}/custom_fonts`,
+ ),
+ method: "GET",
+ headers: _headers,
+ queryParameters: { ..._queryParams, ...requestOptions?.queryParams },
+ timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000,
+ maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries,
+ abortSignal: requestOptions?.abortSignal,
+ fetchFn: this._options?.fetch,
+ logging: this._options.logging,
+ });
+ if (_response.ok) {
+ return {
+ data: serializers.CustomFonts.parseOrThrow(_response.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ rawResponse: _response.rawResponse,
+ };
+ }
+
+ if (_response.error.reason === "status-code") {
+ switch (_response.error.statusCode) {
+ case 400:
+ throw new Webflow.BadRequestError(_response.error.body, _response.rawResponse);
+ case 401:
+ throw new Webflow.UnauthorizedError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 403:
+ throw new Webflow.ForbiddenError(_response.error.body, _response.rawResponse);
+ case 404:
+ throw new Webflow.NotFoundError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 429:
+ throw new Webflow.TooManyRequestsError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 500:
+ throw new Webflow.InternalServerError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ default:
+ throw new errors.WebflowError({
+ statusCode: _response.error.statusCode,
+ body: _response.error.body,
+ rawResponse: _response.rawResponse,
+ });
+ }
+ }
+
+ return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/sites/{site_id}/custom_fonts");
+ }
+
+ /**
+ * Register a custom font on a site and get a presigned S3 URL to upload the font binary.
+ *
+ * The response includes a `customFont` object and an `upload` object. Use the `upload.url` and `upload.fields`
+ * to POST the font binary directly to S3 as `multipart/form-data`. The binary must go in a field named `file`
+ * and must be the last field in the form (an AWS S3 requirement). S3 returns `201 Created` on a successful upload.
+ *
+ * To learn more, see [Custom fonts](/data/docs/custom-fonts).
+ *
+ * Required scope | `sites:write`
+ *
+ * @param {string} site_id - Unique identifier for a Site
+ * @param {Webflow.CustomFontsCreateRequest} request
+ * @param {CustomFontsClient.RequestOptions} requestOptions - Request-specific configuration.
+ *
+ * @throws {@link Webflow.BadRequestError}
+ * @throws {@link Webflow.UnauthorizedError}
+ * @throws {@link Webflow.ForbiddenError}
+ * @throws {@link Webflow.NotFoundError}
+ * @throws {@link Webflow.ConflictError}
+ * @throws {@link Webflow.TooManyRequestsError}
+ * @throws {@link Webflow.InternalServerError}
+ * @throws {@link Webflow.ServiceUnavailableError}
+ *
+ * @example
+ * await client.customFonts.create("580e63e98c9a982ac9b8b741", {
+ * fileName: "AcmeSans-Regular.woff2",
+ * fileHash: "3c7d87c9575702bc3b1e991f4d3c638e",
+ * fontFamily: "Acme Sans",
+ * weight: 400,
+ * italic: false,
+ * fontDisplay: "auto"
+ * })
+ */
+ public create(
+ site_id: string,
+ request: Webflow.CustomFontsCreateRequest,
+ requestOptions?: CustomFontsClient.RequestOptions,
+ ): core.HttpResponsePromise {
+ return core.HttpResponsePromise.fromPromise(this.__create(site_id, request, requestOptions));
+ }
+
+ private async __create(
+ site_id: string,
+ request: Webflow.CustomFontsCreateRequest,
+ requestOptions?: CustomFontsClient.RequestOptions,
+ ): Promise> {
+ const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest();
+ const _headers: core.Fetcher.Args["headers"] = mergeHeaders(
+ _authRequest.headers,
+ this._options?.headers,
+ requestOptions?.headers,
+ );
+ const _response = await core.fetcher({
+ url: core.url.join(
+ (await core.Supplier.get(this._options.baseUrl)) ??
+ ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi)
+ .base,
+ `sites/${core.url.encodePathParam(site_id)}/custom_fonts`,
+ ),
+ method: "POST",
+ headers: _headers,
+ contentType: "application/json",
+ queryParameters: requestOptions?.queryParams,
+ requestType: "json",
+ body: serializers.CustomFontsCreateRequest.jsonOrThrow(request, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ omitUndefined: true,
+ }),
+ timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000,
+ maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries,
+ abortSignal: requestOptions?.abortSignal,
+ fetchFn: this._options?.fetch,
+ logging: this._options.logging,
+ });
+ if (_response.ok) {
+ return {
+ data: serializers.CustomFontCreateResponse.parseOrThrow(_response.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ rawResponse: _response.rawResponse,
+ };
+ }
+
+ if (_response.error.reason === "status-code") {
+ switch (_response.error.statusCode) {
+ case 400:
+ throw new Webflow.BadRequestError(_response.error.body, _response.rawResponse);
+ case 401:
+ throw new Webflow.UnauthorizedError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 403:
+ throw new Webflow.ForbiddenError(_response.error.body, _response.rawResponse);
+ case 404:
+ throw new Webflow.NotFoundError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 409:
+ throw new Webflow.ConflictError(_response.error.body, _response.rawResponse);
+ case 429:
+ throw new Webflow.TooManyRequestsError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 500:
+ throw new Webflow.InternalServerError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 503:
+ throw new Webflow.ServiceUnavailableError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ default:
+ throw new errors.WebflowError({
+ statusCode: _response.error.statusCode,
+ body: _response.error.body,
+ rawResponse: _response.rawResponse,
+ });
+ }
+ }
+
+ return handleNonStatusCodeError(
+ _response.error,
+ _response.rawResponse,
+ "POST",
+ "/sites/{site_id}/custom_fonts",
+ );
+ }
+
+ /**
+ * Get details about a custom font on a site.
+ *
+ * Required scope | `sites:read`
+ *
+ * @param {string} site_id - Unique identifier for a Site
+ * @param {string} font_id - Unique identifier for a custom font on a site
+ * @param {CustomFontsClient.RequestOptions} requestOptions - Request-specific configuration.
+ *
+ * @throws {@link Webflow.BadRequestError}
+ * @throws {@link Webflow.UnauthorizedError}
+ * @throws {@link Webflow.ForbiddenError}
+ * @throws {@link Webflow.NotFoundError}
+ * @throws {@link Webflow.TooManyRequestsError}
+ * @throws {@link Webflow.InternalServerError}
+ *
+ * @example
+ * await client.customFonts.get("580e63e98c9a982ac9b8b741", "66f3a1b2c4d5e6f7a8b9c0d1")
+ */
+ public get(
+ site_id: string,
+ font_id: string,
+ requestOptions?: CustomFontsClient.RequestOptions,
+ ): core.HttpResponsePromise {
+ return core.HttpResponsePromise.fromPromise(this.__get(site_id, font_id, requestOptions));
+ }
+
+ private async __get(
+ site_id: string,
+ font_id: string,
+ requestOptions?: CustomFontsClient.RequestOptions,
+ ): Promise> {
+ const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest();
+ const _headers: core.Fetcher.Args["headers"] = mergeHeaders(
+ _authRequest.headers,
+ this._options?.headers,
+ requestOptions?.headers,
+ );
+ const _response = await core.fetcher({
+ url: core.url.join(
+ (await core.Supplier.get(this._options.baseUrl)) ??
+ ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi)
+ .base,
+ `sites/${core.url.encodePathParam(site_id)}/custom_fonts/${core.url.encodePathParam(font_id)}`,
+ ),
+ method: "GET",
+ headers: _headers,
+ queryParameters: requestOptions?.queryParams,
+ timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000,
+ maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries,
+ abortSignal: requestOptions?.abortSignal,
+ fetchFn: this._options?.fetch,
+ logging: this._options.logging,
+ });
+ if (_response.ok) {
+ return {
+ data: serializers.CustomFontsGetResponse.parseOrThrow(_response.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ rawResponse: _response.rawResponse,
+ };
+ }
+
+ if (_response.error.reason === "status-code") {
+ switch (_response.error.statusCode) {
+ case 400:
+ throw new Webflow.BadRequestError(_response.error.body, _response.rawResponse);
+ case 401:
+ throw new Webflow.UnauthorizedError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 403:
+ throw new Webflow.ForbiddenError(_response.error.body, _response.rawResponse);
+ case 404:
+ throw new Webflow.NotFoundError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 429:
+ throw new Webflow.TooManyRequestsError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 500:
+ throw new Webflow.InternalServerError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ default:
+ throw new errors.WebflowError({
+ statusCode: _response.error.statusCode,
+ body: _response.error.body,
+ rawResponse: _response.rawResponse,
+ });
+ }
+ }
+
+ return handleNonStatusCodeError(
+ _response.error,
+ _response.rawResponse,
+ "GET",
+ "/sites/{site_id}/custom_fonts/{font_id}",
+ );
+ }
+
+ /**
+ * Delete a custom font from a site.
+ *
+ * Required scope | `sites:write`
+ *
+ * @param {string} site_id - Unique identifier for a Site
+ * @param {string} font_id - Unique identifier for a custom font on a site
+ * @param {CustomFontsClient.RequestOptions} requestOptions - Request-specific configuration.
+ *
+ * @throws {@link Webflow.BadRequestError}
+ * @throws {@link Webflow.UnauthorizedError}
+ * @throws {@link Webflow.ForbiddenError}
+ * @throws {@link Webflow.NotFoundError}
+ * @throws {@link Webflow.TooManyRequestsError}
+ * @throws {@link Webflow.InternalServerError}
+ *
+ * @example
+ * await client.customFonts.delete("580e63e98c9a982ac9b8b741", "66f3a1b2c4d5e6f7a8b9c0d1")
+ */
+ public delete(
+ site_id: string,
+ font_id: string,
+ requestOptions?: CustomFontsClient.RequestOptions,
+ ): core.HttpResponsePromise {
+ return core.HttpResponsePromise.fromPromise(this.__delete(site_id, font_id, requestOptions));
+ }
+
+ private async __delete(
+ site_id: string,
+ font_id: string,
+ requestOptions?: CustomFontsClient.RequestOptions,
+ ): Promise> {
+ const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest();
+ const _headers: core.Fetcher.Args["headers"] = mergeHeaders(
+ _authRequest.headers,
+ this._options?.headers,
+ requestOptions?.headers,
+ );
+ const _response = await core.fetcher({
+ url: core.url.join(
+ (await core.Supplier.get(this._options.baseUrl)) ??
+ ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi)
+ .base,
+ `sites/${core.url.encodePathParam(site_id)}/custom_fonts/${core.url.encodePathParam(font_id)}`,
+ ),
+ method: "DELETE",
+ headers: _headers,
+ queryParameters: requestOptions?.queryParams,
+ timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000,
+ maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries,
+ abortSignal: requestOptions?.abortSignal,
+ fetchFn: this._options?.fetch,
+ logging: this._options.logging,
+ });
+ if (_response.ok) {
+ return { data: undefined, rawResponse: _response.rawResponse };
+ }
+
+ if (_response.error.reason === "status-code") {
+ switch (_response.error.statusCode) {
+ case 400:
+ throw new Webflow.BadRequestError(_response.error.body, _response.rawResponse);
+ case 401:
+ throw new Webflow.UnauthorizedError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 403:
+ throw new Webflow.ForbiddenError(_response.error.body, _response.rawResponse);
+ case 404:
+ throw new Webflow.NotFoundError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 429:
+ throw new Webflow.TooManyRequestsError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 500:
+ throw new Webflow.InternalServerError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ default:
+ throw new errors.WebflowError({
+ statusCode: _response.error.statusCode,
+ body: _response.error.body,
+ rawResponse: _response.rawResponse,
+ });
+ }
+ }
+
+ return handleNonStatusCodeError(
+ _response.error,
+ _response.rawResponse,
+ "DELETE",
+ "/sites/{site_id}/custom_fonts/{font_id}",
+ );
+ }
+
+ /**
+ * Update the metadata of a custom font. The font binary is not changed by this endpoint.
+ * To replace the binary, use [Replace custom font file](#operation/replace-custom-font-file).
+ *
+ * The request body must include at least one of `fontFamily`, `weight`, `italic`, or `fontDisplay`.
+ *
+ * Required scope | `sites:write`
+ *
+ * @param {string} site_id - Unique identifier for a Site
+ * @param {string} font_id - Unique identifier for a custom font on a site
+ * @param {Webflow.CustomFontsUpdateRequest} request
+ * @param {CustomFontsClient.RequestOptions} requestOptions - Request-specific configuration.
+ *
+ * @throws {@link Webflow.BadRequestError}
+ * @throws {@link Webflow.UnauthorizedError}
+ * @throws {@link Webflow.ForbiddenError}
+ * @throws {@link Webflow.NotFoundError}
+ * @throws {@link Webflow.TooManyRequestsError}
+ * @throws {@link Webflow.InternalServerError}
+ *
+ * @example
+ * await client.customFonts.update("580e63e98c9a982ac9b8b741", "66f3a1b2c4d5e6f7a8b9c0d1")
+ */
+ public update(
+ site_id: string,
+ font_id: string,
+ request: Webflow.CustomFontsUpdateRequest = {},
+ requestOptions?: CustomFontsClient.RequestOptions,
+ ): core.HttpResponsePromise {
+ return core.HttpResponsePromise.fromPromise(this.__update(site_id, font_id, request, requestOptions));
+ }
+
+ private async __update(
+ site_id: string,
+ font_id: string,
+ request: Webflow.CustomFontsUpdateRequest = {},
+ requestOptions?: CustomFontsClient.RequestOptions,
+ ): Promise> {
+ const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest();
+ const _headers: core.Fetcher.Args["headers"] = mergeHeaders(
+ _authRequest.headers,
+ this._options?.headers,
+ requestOptions?.headers,
+ );
+ const _response = await core.fetcher({
+ url: core.url.join(
+ (await core.Supplier.get(this._options.baseUrl)) ??
+ ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi)
+ .base,
+ `sites/${core.url.encodePathParam(site_id)}/custom_fonts/${core.url.encodePathParam(font_id)}`,
+ ),
+ method: "PATCH",
+ headers: _headers,
+ contentType: "application/json",
+ queryParameters: requestOptions?.queryParams,
+ requestType: "json",
+ body: serializers.CustomFontsUpdateRequest.jsonOrThrow(request, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ omitUndefined: true,
+ }),
+ timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000,
+ maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries,
+ abortSignal: requestOptions?.abortSignal,
+ fetchFn: this._options?.fetch,
+ logging: this._options.logging,
+ });
+ if (_response.ok) {
+ return {
+ data: serializers.CustomFontsUpdateResponse.parseOrThrow(_response.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ rawResponse: _response.rawResponse,
+ };
+ }
+
+ if (_response.error.reason === "status-code") {
+ switch (_response.error.statusCode) {
+ case 400:
+ throw new Webflow.BadRequestError(_response.error.body, _response.rawResponse);
+ case 401:
+ throw new Webflow.UnauthorizedError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 403:
+ throw new Webflow.ForbiddenError(_response.error.body, _response.rawResponse);
+ case 404:
+ throw new Webflow.NotFoundError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 429:
+ throw new Webflow.TooManyRequestsError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 500:
+ throw new Webflow.InternalServerError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ default:
+ throw new errors.WebflowError({
+ statusCode: _response.error.statusCode,
+ body: _response.error.body,
+ rawResponse: _response.rawResponse,
+ });
+ }
+ }
+
+ return handleNonStatusCodeError(
+ _response.error,
+ _response.rawResponse,
+ "PATCH",
+ "/sites/{site_id}/custom_fonts/{font_id}",
+ );
+ }
+
+ /**
+ * Replace the binary of an existing custom font while preserving its ID and any references to it.
+ * The upload handshake is identical to [Create custom font](#operation/create-custom-font).
+ *
+ * If the existing font has a non-empty `axes` array (a variable font), you must include an `axes` field
+ * in the request. Send `axes: []` to declare that the new binary is a static font, or send the new variable
+ * axes to declare it is still variable. Omitting `axes` when the existing font is variable returns `400`.
+ *
+ * Required scope | `sites:write`
+ *
+ * @param {string} site_id - Unique identifier for a Site
+ * @param {string} font_id - Unique identifier for a custom font on a site
+ * @param {Webflow.CustomFontsReplaceFileRequest} request
+ * @param {CustomFontsClient.RequestOptions} requestOptions - Request-specific configuration.
+ *
+ * @throws {@link Webflow.BadRequestError}
+ * @throws {@link Webflow.UnauthorizedError}
+ * @throws {@link Webflow.ForbiddenError}
+ * @throws {@link Webflow.NotFoundError}
+ * @throws {@link Webflow.TooManyRequestsError}
+ * @throws {@link Webflow.InternalServerError}
+ *
+ * @example
+ * await client.customFonts.replaceFile("580e63e98c9a982ac9b8b741", "66f3a1b2c4d5e6f7a8b9c0d1", {
+ * fileName: "AcmeSans-Regular-v2.woff2",
+ * fileHash: "3c7d87c9575702bc3b1e991f4d3c638e"
+ * })
+ */
+ public replaceFile(
+ site_id: string,
+ font_id: string,
+ request: Webflow.CustomFontsReplaceFileRequest,
+ requestOptions?: CustomFontsClient.RequestOptions,
+ ): core.HttpResponsePromise {
+ return core.HttpResponsePromise.fromPromise(this.__replaceFile(site_id, font_id, request, requestOptions));
+ }
+
+ private async __replaceFile(
+ site_id: string,
+ font_id: string,
+ request: Webflow.CustomFontsReplaceFileRequest,
+ requestOptions?: CustomFontsClient.RequestOptions,
+ ): Promise> {
+ const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest();
+ const _headers: core.Fetcher.Args["headers"] = mergeHeaders(
+ _authRequest.headers,
+ this._options?.headers,
+ requestOptions?.headers,
+ );
+ const _response = await core.fetcher({
+ url: core.url.join(
+ (await core.Supplier.get(this._options.baseUrl)) ??
+ ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi)
+ .base,
+ `sites/${core.url.encodePathParam(site_id)}/custom_fonts/${core.url.encodePathParam(font_id)}/file`,
+ ),
+ method: "PUT",
+ headers: _headers,
+ contentType: "application/json",
+ queryParameters: requestOptions?.queryParams,
+ requestType: "json",
+ body: serializers.CustomFontsReplaceFileRequest.jsonOrThrow(request, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ omitUndefined: true,
+ }),
+ timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000,
+ maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries,
+ abortSignal: requestOptions?.abortSignal,
+ fetchFn: this._options?.fetch,
+ logging: this._options.logging,
+ });
+ if (_response.ok) {
+ return {
+ data: serializers.CustomFontCreateResponse.parseOrThrow(_response.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ rawResponse: _response.rawResponse,
+ };
+ }
+
+ if (_response.error.reason === "status-code") {
+ switch (_response.error.statusCode) {
+ case 400:
+ throw new Webflow.BadRequestError(_response.error.body, _response.rawResponse);
+ case 401:
+ throw new Webflow.UnauthorizedError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 403:
+ throw new Webflow.ForbiddenError(_response.error.body, _response.rawResponse);
+ case 404:
+ throw new Webflow.NotFoundError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 429:
+ throw new Webflow.TooManyRequestsError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 500:
+ throw new Webflow.InternalServerError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ default:
+ throw new errors.WebflowError({
+ statusCode: _response.error.statusCode,
+ body: _response.error.body,
+ rawResponse: _response.rawResponse,
+ });
+ }
+ }
+
+ return handleNonStatusCodeError(
+ _response.error,
+ _response.rawResponse,
+ "PUT",
+ "/sites/{site_id}/custom_fonts/{font_id}/file",
+ );
+ }
+
+ /**
+ * Register 1–25 custom fonts in a single request and get a presigned S3 URL for each one.
+ * This collapses the registration step for a whole font family (for example, Regular, Bold,
+ * Italic, and Bold Italic) into one rate-limited request.
+ *
+ * Registration is batched, but the binary uploads are not: the response contains one `upload`
+ * object per registered font, and you must POST each font binary to its own presigned S3 URL
+ * exactly as you would for [Create custom font](#operation/create-custom-font). The Webflow API
+ * server never receives the raw font bytes.
+ *
+ * The response is `200 OK` for a valid request body. Per-font results are reported in the
+ * `created` and `failed` arrays. If the site's font limit is reached partway through the batch,
+ * the fonts that still fit are registered and returned in `created`, while the rest appear in
+ * `failed` with `name: "FontLimitReached"` — valid fonts are never discarded because a later
+ * font in the same batch could not be registered. Each presigned URL expires approximately
+ * 15 minutes after issuance, so upload the binaries promptly.
+ *
+ * Required scope | `sites:write`
+ *
+ * @param {string} site_id - Unique identifier for a Site
+ * @param {Webflow.CustomFontBatchCreateRequest} request
+ * @param {CustomFontsClient.RequestOptions} requestOptions - Request-specific configuration.
+ *
+ * @throws {@link Webflow.BadRequestError}
+ * @throws {@link Webflow.UnauthorizedError}
+ * @throws {@link Webflow.ForbiddenError}
+ * @throws {@link Webflow.NotFoundError}
+ * @throws {@link Webflow.TooManyRequestsError}
+ * @throws {@link Webflow.InternalServerError}
+ * @throws {@link Webflow.ServiceUnavailableError}
+ *
+ * @example
+ * await client.customFonts.batchCreate("580e63e98c9a982ac9b8b741", {
+ * items: [{
+ * fileName: "AcmeSans-Regular.woff2",
+ * fileHash: "3c7d87c9575702bc3b1e991f4d3c638e",
+ * fontFamily: "Acme Sans",
+ * weight: 400,
+ * italic: false,
+ * fontDisplay: "auto"
+ * }]
+ * })
+ */
+ public batchCreate(
+ site_id: string,
+ request: Webflow.CustomFontBatchCreateRequest,
+ requestOptions?: CustomFontsClient.RequestOptions,
+ ): core.HttpResponsePromise {
+ return core.HttpResponsePromise.fromPromise(this.__batchCreate(site_id, request, requestOptions));
+ }
+
+ private async __batchCreate(
+ site_id: string,
+ request: Webflow.CustomFontBatchCreateRequest,
+ requestOptions?: CustomFontsClient.RequestOptions,
+ ): Promise> {
+ const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest();
+ const _headers: core.Fetcher.Args["headers"] = mergeHeaders(
+ _authRequest.headers,
+ this._options?.headers,
+ requestOptions?.headers,
+ );
+ const _response = await core.fetcher({
+ url: core.url.join(
+ (await core.Supplier.get(this._options.baseUrl)) ??
+ ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi)
+ .base,
+ `sites/${core.url.encodePathParam(site_id)}/custom_fonts/batchCreate`,
+ ),
+ method: "POST",
+ headers: _headers,
+ contentType: "application/json",
+ queryParameters: requestOptions?.queryParams,
+ requestType: "json",
+ body: serializers.CustomFontBatchCreateRequest.jsonOrThrow(request, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ omitUndefined: true,
+ }),
+ timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000,
+ maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries,
+ abortSignal: requestOptions?.abortSignal,
+ fetchFn: this._options?.fetch,
+ logging: this._options.logging,
+ });
+ if (_response.ok) {
+ return {
+ data: serializers.CustomFontBatchCreateResponse.parseOrThrow(_response.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ rawResponse: _response.rawResponse,
+ };
+ }
+
+ if (_response.error.reason === "status-code") {
+ switch (_response.error.statusCode) {
+ case 400:
+ throw new Webflow.BadRequestError(_response.error.body, _response.rawResponse);
+ case 401:
+ throw new Webflow.UnauthorizedError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 403:
+ throw new Webflow.ForbiddenError(_response.error.body, _response.rawResponse);
+ case 404:
+ throw new Webflow.NotFoundError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 429:
+ throw new Webflow.TooManyRequestsError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 500:
+ throw new Webflow.InternalServerError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 503:
+ throw new Webflow.ServiceUnavailableError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ default:
+ throw new errors.WebflowError({
+ statusCode: _response.error.statusCode,
+ body: _response.error.body,
+ rawResponse: _response.rawResponse,
+ });
+ }
+ }
+
+ return handleNonStatusCodeError(
+ _response.error,
+ _response.rawResponse,
+ "POST",
+ "/sites/{site_id}/custom_fonts/batchCreate",
+ );
+ }
+
+ /**
+ * Delete 1-100 custom fonts in a single request. The response is always `200 OK` for a valid request body.
+ * Per-font results are reported in the `deleted` and `failed` arrays.
+ *
+ * The endpoint is idempotent: fonts that do not exist appear in `failed` with `name: "NotFound"` rather than
+ * failing the entire request. You can safely retry a partial failure by re-sending only the IDs that did not
+ * appear in `deleted`.
+ *
+ * Required scope | `sites:write`
+ *
+ * @param {string} site_id - Unique identifier for a Site
+ * @param {Webflow.CustomFontBatchDeleteRequest} request
+ * @param {CustomFontsClient.RequestOptions} requestOptions - Request-specific configuration.
+ *
+ * @throws {@link Webflow.BadRequestError}
+ * @throws {@link Webflow.UnauthorizedError}
+ * @throws {@link Webflow.ForbiddenError}
+ * @throws {@link Webflow.NotFoundError}
+ * @throws {@link Webflow.TooManyRequestsError}
+ * @throws {@link Webflow.InternalServerError}
+ *
+ * @example
+ * await client.customFonts.batchDelete("580e63e98c9a982ac9b8b741", {
+ * items: [{
+ * id: "66f3a1b2c4d5e6f7a8b9c0d1"
+ * }]
+ * })
+ */
+ public batchDelete(
+ site_id: string,
+ request: Webflow.CustomFontBatchDeleteRequest,
+ requestOptions?: CustomFontsClient.RequestOptions,
+ ): core.HttpResponsePromise {
+ return core.HttpResponsePromise.fromPromise(this.__batchDelete(site_id, request, requestOptions));
+ }
+
+ private async __batchDelete(
+ site_id: string,
+ request: Webflow.CustomFontBatchDeleteRequest,
+ requestOptions?: CustomFontsClient.RequestOptions,
+ ): Promise> {
+ const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest();
+ const _headers: core.Fetcher.Args["headers"] = mergeHeaders(
+ _authRequest.headers,
+ this._options?.headers,
+ requestOptions?.headers,
+ );
+ const _response = await core.fetcher({
+ url: core.url.join(
+ (await core.Supplier.get(this._options.baseUrl)) ??
+ ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi)
+ .base,
+ `sites/${core.url.encodePathParam(site_id)}/custom_fonts/batchDelete`,
+ ),
+ method: "POST",
+ headers: _headers,
+ contentType: "application/json",
+ queryParameters: requestOptions?.queryParams,
+ requestType: "json",
+ body: serializers.CustomFontBatchDeleteRequest.jsonOrThrow(request, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ omitUndefined: true,
+ }),
+ timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000,
+ maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries,
+ abortSignal: requestOptions?.abortSignal,
+ fetchFn: this._options?.fetch,
+ logging: this._options.logging,
+ });
+ if (_response.ok) {
+ return {
+ data: serializers.CustomFontBatchDeleteResponse.parseOrThrow(_response.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ rawResponse: _response.rawResponse,
+ };
+ }
+
+ if (_response.error.reason === "status-code") {
+ switch (_response.error.statusCode) {
+ case 400:
+ throw new Webflow.BadRequestError(_response.error.body, _response.rawResponse);
+ case 401:
+ throw new Webflow.UnauthorizedError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 403:
+ throw new Webflow.ForbiddenError(_response.error.body, _response.rawResponse);
+ case 404:
+ throw new Webflow.NotFoundError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 429:
+ throw new Webflow.TooManyRequestsError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 500:
+ throw new Webflow.InternalServerError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ default:
+ throw new errors.WebflowError({
+ statusCode: _response.error.statusCode,
+ body: _response.error.body,
+ rawResponse: _response.rawResponse,
+ });
+ }
+ }
+
+ return handleNonStatusCodeError(
+ _response.error,
+ _response.rawResponse,
+ "POST",
+ "/sites/{site_id}/custom_fonts/batchDelete",
+ );
+ }
+}
diff --git a/src/api/resources/customFonts/client/index.ts b/src/api/resources/customFonts/client/index.ts
new file mode 100644
index 00000000..415726b7
--- /dev/null
+++ b/src/api/resources/customFonts/client/index.ts
@@ -0,0 +1 @@
+export * from "./requests";
diff --git a/src/api/resources/customFonts/client/requests/CustomFontBatchCreateRequest.ts b/src/api/resources/customFonts/client/requests/CustomFontBatchCreateRequest.ts
new file mode 100644
index 00000000..af118aba
--- /dev/null
+++ b/src/api/resources/customFonts/client/requests/CustomFontBatchCreateRequest.ts
@@ -0,0 +1,21 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../../../index";
+
+/**
+ * @example
+ * {
+ * items: [{
+ * fileName: "AcmeSans-Regular.woff2",
+ * fileHash: "3c7d87c9575702bc3b1e991f4d3c638e",
+ * fontFamily: "Acme Sans",
+ * weight: 400,
+ * italic: false,
+ * fontDisplay: "auto"
+ * }]
+ * }
+ */
+export interface CustomFontBatchCreateRequest {
+ /** The custom fonts to register. Each item uses the same shape as the single-font create request. */
+ items: Webflow.CustomFontBatchCreateRequestItemsItem[];
+}
diff --git a/src/api/resources/customFonts/client/requests/CustomFontBatchDeleteRequest.ts b/src/api/resources/customFonts/client/requests/CustomFontBatchDeleteRequest.ts
new file mode 100644
index 00000000..3cefdd92
--- /dev/null
+++ b/src/api/resources/customFonts/client/requests/CustomFontBatchDeleteRequest.ts
@@ -0,0 +1,15 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../../../index";
+
+/**
+ * @example
+ * {
+ * items: [{
+ * id: "66f3a1b2c4d5e6f7a8b9c0d1"
+ * }]
+ * }
+ */
+export interface CustomFontBatchDeleteRequest {
+ items: Webflow.CustomFontBatchDeleteRequestItemsItem[];
+}
diff --git a/src/api/resources/customFonts/client/requests/CustomFontsCreateRequest.ts b/src/api/resources/customFonts/client/requests/CustomFontsCreateRequest.ts
new file mode 100644
index 00000000..c002cd65
--- /dev/null
+++ b/src/api/resources/customFonts/client/requests/CustomFontsCreateRequest.ts
@@ -0,0 +1,31 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../../../index";
+
+/**
+ * @example
+ * {
+ * fileName: "AcmeSans-Regular.woff2",
+ * fileHash: "3c7d87c9575702bc3b1e991f4d3c638e",
+ * fontFamily: "Acme Sans",
+ * weight: 400,
+ * italic: false,
+ * fontDisplay: "auto"
+ * }
+ */
+export interface CustomFontsCreateRequest {
+ /** File name including extension. Accepted extensions are `.woff2`, `.woff`, `.ttf`, `.otf`, and `.eot`. Maximum 256 characters. */
+ fileName: string;
+ /** Lowercase hex MD5 hash of the font binary (exactly 32 characters) */
+ fileHash: string;
+ /** The CSS font-family name (1-256 characters). Commas are stripped server-side. */
+ fontFamily: string;
+ /** CSS font-weight value (1-1000) */
+ weight: number;
+ /** Whether the font is italic */
+ italic: boolean;
+ /** CSS font-display value */
+ fontDisplay: Webflow.CustomFontsCreateRequestFontDisplay;
+ /** Variable font axes. Omit or pass an empty array for static fonts. */
+ axes?: Webflow.CustomFontAxis[];
+}
diff --git a/src/api/resources/customFonts/client/requests/CustomFontsListRequest.ts b/src/api/resources/customFonts/client/requests/CustomFontsListRequest.ts
new file mode 100644
index 00000000..2c2740d9
--- /dev/null
+++ b/src/api/resources/customFonts/client/requests/CustomFontsListRequest.ts
@@ -0,0 +1,15 @@
+// This file was auto-generated by Fern from our API Definition.
+
+/**
+ * @example
+ * {
+ * offset: 1,
+ * limit: 1
+ * }
+ */
+export interface CustomFontsListRequest {
+ /** Offset used for pagination if the results have more than limit records */
+ offset?: number;
+ /** Maximum number of records to be returned (max limit: 100) */
+ limit?: number;
+}
diff --git a/src/api/resources/customFonts/client/requests/CustomFontsReplaceFileRequest.ts b/src/api/resources/customFonts/client/requests/CustomFontsReplaceFileRequest.ts
new file mode 100644
index 00000000..6c73a2e9
--- /dev/null
+++ b/src/api/resources/customFonts/client/requests/CustomFontsReplaceFileRequest.ts
@@ -0,0 +1,19 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../../../index";
+
+/**
+ * @example
+ * {
+ * fileName: "AcmeSans-Regular-v2.woff2",
+ * fileHash: "3c7d87c9575702bc3b1e991f4d3c638e"
+ * }
+ */
+export interface CustomFontsReplaceFileRequest {
+ /** File name including extension. Accepted extensions are `.woff2`, `.woff`, `.ttf`, `.otf`, and `.eot`. Maximum 256 characters. */
+ fileName: string;
+ /** Lowercase hex MD5 hash of the font binary (exactly 32 characters) */
+ fileHash: string;
+ /** Variable font axes for the replacement binary. Required when the existing font has a non-empty `axes` array. */
+ axes?: Webflow.CustomFontAxis[];
+}
diff --git a/src/api/resources/customFonts/client/requests/CustomFontsUpdateRequest.ts b/src/api/resources/customFonts/client/requests/CustomFontsUpdateRequest.ts
new file mode 100644
index 00000000..12ba184c
--- /dev/null
+++ b/src/api/resources/customFonts/client/requests/CustomFontsUpdateRequest.ts
@@ -0,0 +1,18 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../../../index";
+
+/**
+ * @example
+ * {}
+ */
+export interface CustomFontsUpdateRequest {
+ /** The CSS font-family name (1-256 characters) */
+ fontFamily?: string;
+ /** CSS font-weight value (1-1000) */
+ weight?: number;
+ /** Whether the font is italic */
+ italic?: boolean;
+ /** CSS font-display value */
+ fontDisplay?: Webflow.CustomFontsUpdateRequestFontDisplay;
+}
diff --git a/src/api/resources/customFonts/client/requests/index.ts b/src/api/resources/customFonts/client/requests/index.ts
new file mode 100644
index 00000000..1b656573
--- /dev/null
+++ b/src/api/resources/customFonts/client/requests/index.ts
@@ -0,0 +1,6 @@
+export type { CustomFontBatchCreateRequest } from "./CustomFontBatchCreateRequest";
+export type { CustomFontBatchDeleteRequest } from "./CustomFontBatchDeleteRequest";
+export type { CustomFontsCreateRequest } from "./CustomFontsCreateRequest";
+export type { CustomFontsListRequest } from "./CustomFontsListRequest";
+export type { CustomFontsReplaceFileRequest } from "./CustomFontsReplaceFileRequest";
+export type { CustomFontsUpdateRequest } from "./CustomFontsUpdateRequest";
diff --git a/src/api/resources/customFonts/exports.ts b/src/api/resources/customFonts/exports.ts
new file mode 100644
index 00000000..b7858273
--- /dev/null
+++ b/src/api/resources/customFonts/exports.ts
@@ -0,0 +1,4 @@
+// This file was auto-generated by Fern from our API Definition.
+
+export { CustomFontsClient } from "./client/Client";
+export * from "./client/index";
diff --git a/src/api/resources/customFonts/index.ts b/src/api/resources/customFonts/index.ts
new file mode 100644
index 00000000..d2ec2302
--- /dev/null
+++ b/src/api/resources/customFonts/index.ts
@@ -0,0 +1,2 @@
+export * from "./client";
+export * from "./types";
diff --git a/src/api/resources/customFonts/types/CustomFontBatchCreateRequestItemsItem.ts b/src/api/resources/customFonts/types/CustomFontBatchCreateRequestItemsItem.ts
new file mode 100644
index 00000000..7fead5b8
--- /dev/null
+++ b/src/api/resources/customFonts/types/CustomFontBatchCreateRequestItemsItem.ts
@@ -0,0 +1,20 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../../index";
+
+export interface CustomFontBatchCreateRequestItemsItem {
+ /** File name including extension. Accepted extensions are `.woff2`, `.woff`, `.ttf`, `.otf`, and `.eot`. Maximum 256 characters. */
+ fileName: string;
+ /** Lowercase hex MD5 hash of the font binary (exactly 32 characters) */
+ fileHash: string;
+ /** The CSS font-family name (1-256 characters). Commas are stripped server-side. */
+ fontFamily: string;
+ /** CSS font-weight value (1-1000) */
+ weight: number;
+ /** Whether the font is italic */
+ italic: boolean;
+ /** CSS font-display value */
+ fontDisplay: Webflow.CustomFontBatchCreateRequestItemsItemFontDisplay;
+ /** Variable font axes. Omit or pass an empty array for static fonts. */
+ axes?: Webflow.CustomFontAxis[];
+}
diff --git a/src/api/resources/customFonts/types/CustomFontBatchCreateRequestItemsItemFontDisplay.ts b/src/api/resources/customFonts/types/CustomFontBatchCreateRequestItemsItemFontDisplay.ts
new file mode 100644
index 00000000..e0e5dbb3
--- /dev/null
+++ b/src/api/resources/customFonts/types/CustomFontBatchCreateRequestItemsItemFontDisplay.ts
@@ -0,0 +1,12 @@
+// This file was auto-generated by Fern from our API Definition.
+
+/** CSS font-display value */
+export const CustomFontBatchCreateRequestItemsItemFontDisplay = {
+ Auto: "auto",
+ Block: "block",
+ Swap: "swap",
+ Fallback: "fallback",
+ Optional: "optional",
+} as const;
+export type CustomFontBatchCreateRequestItemsItemFontDisplay =
+ (typeof CustomFontBatchCreateRequestItemsItemFontDisplay)[keyof typeof CustomFontBatchCreateRequestItemsItemFontDisplay];
diff --git a/src/api/resources/customFonts/types/CustomFontBatchDeleteRequestItemsItem.ts b/src/api/resources/customFonts/types/CustomFontBatchDeleteRequestItemsItem.ts
new file mode 100644
index 00000000..b7910e86
--- /dev/null
+++ b/src/api/resources/customFonts/types/CustomFontBatchDeleteRequestItemsItem.ts
@@ -0,0 +1,6 @@
+// This file was auto-generated by Fern from our API Definition.
+
+export interface CustomFontBatchDeleteRequestItemsItem {
+ /** The ID of the custom font to delete */
+ id: string;
+}
diff --git a/src/api/resources/customFonts/types/CustomFontsCreateRequestFontDisplay.ts b/src/api/resources/customFonts/types/CustomFontsCreateRequestFontDisplay.ts
new file mode 100644
index 00000000..0715f832
--- /dev/null
+++ b/src/api/resources/customFonts/types/CustomFontsCreateRequestFontDisplay.ts
@@ -0,0 +1,12 @@
+// This file was auto-generated by Fern from our API Definition.
+
+/** CSS font-display value */
+export const CustomFontsCreateRequestFontDisplay = {
+ Auto: "auto",
+ Block: "block",
+ Swap: "swap",
+ Fallback: "fallback",
+ Optional: "optional",
+} as const;
+export type CustomFontsCreateRequestFontDisplay =
+ (typeof CustomFontsCreateRequestFontDisplay)[keyof typeof CustomFontsCreateRequestFontDisplay];
diff --git a/src/api/resources/customFonts/types/CustomFontsGetResponse.ts b/src/api/resources/customFonts/types/CustomFontsGetResponse.ts
new file mode 100644
index 00000000..6ac4539a
--- /dev/null
+++ b/src/api/resources/customFonts/types/CustomFontsGetResponse.ts
@@ -0,0 +1,7 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../../index";
+
+export interface CustomFontsGetResponse {
+ customFont: Webflow.CustomFont;
+}
diff --git a/src/api/resources/customFonts/types/CustomFontsUpdateRequestFontDisplay.ts b/src/api/resources/customFonts/types/CustomFontsUpdateRequestFontDisplay.ts
new file mode 100644
index 00000000..90afbcca
--- /dev/null
+++ b/src/api/resources/customFonts/types/CustomFontsUpdateRequestFontDisplay.ts
@@ -0,0 +1,12 @@
+// This file was auto-generated by Fern from our API Definition.
+
+/** CSS font-display value */
+export const CustomFontsUpdateRequestFontDisplay = {
+ Auto: "auto",
+ Block: "block",
+ Swap: "swap",
+ Fallback: "fallback",
+ Optional: "optional",
+} as const;
+export type CustomFontsUpdateRequestFontDisplay =
+ (typeof CustomFontsUpdateRequestFontDisplay)[keyof typeof CustomFontsUpdateRequestFontDisplay];
diff --git a/src/api/resources/customFonts/types/CustomFontsUpdateResponse.ts b/src/api/resources/customFonts/types/CustomFontsUpdateResponse.ts
new file mode 100644
index 00000000..db9c6658
--- /dev/null
+++ b/src/api/resources/customFonts/types/CustomFontsUpdateResponse.ts
@@ -0,0 +1,7 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../../index";
+
+export interface CustomFontsUpdateResponse {
+ customFont: Webflow.CustomFont;
+}
diff --git a/src/api/resources/customFonts/types/index.ts b/src/api/resources/customFonts/types/index.ts
new file mode 100644
index 00000000..dd135680
--- /dev/null
+++ b/src/api/resources/customFonts/types/index.ts
@@ -0,0 +1,7 @@
+export * from "./CustomFontBatchCreateRequestItemsItem";
+export * from "./CustomFontBatchCreateRequestItemsItemFontDisplay";
+export * from "./CustomFontBatchDeleteRequestItemsItem";
+export * from "./CustomFontsCreateRequestFontDisplay";
+export * from "./CustomFontsGetResponse";
+export * from "./CustomFontsUpdateRequestFontDisplay";
+export * from "./CustomFontsUpdateResponse";
diff --git a/src/api/resources/index.ts b/src/api/resources/index.ts
index be03645d..ec4e951f 100644
--- a/src/api/resources/index.ts
+++ b/src/api/resources/index.ts
@@ -1,11 +1,16 @@
+export * as analyze from "./analyze";
export * as assets from "./assets";
export * from "./assets/client/requests";
+export * as branches from "./branches";
export * as collections from "./collections";
export * from "./collections/client/requests";
export * as comments from "./comments";
export * as components from "./components";
export * from "./components/client/requests";
export * from "./components/types";
+export * as customFonts from "./customFonts";
+export * from "./customFonts/client/requests";
+export * from "./customFonts/types";
export * as ecommerce from "./ecommerce";
export * as forms from "./forms";
export * from "./forms/client/requests";
@@ -13,6 +18,7 @@ export * as inventory from "./inventory";
export * from "./inventory/client/requests";
export * from "./inventory/types";
export * as items from "./items";
+export * as optimize from "./optimize";
export * as orders from "./orders";
export * from "./orders/client/requests";
export * from "./orders/types";
diff --git a/src/api/resources/optimize/client/Client.ts b/src/api/resources/optimize/client/Client.ts
new file mode 100644
index 00000000..818ac039
--- /dev/null
+++ b/src/api/resources/optimize/client/Client.ts
@@ -0,0 +1,162 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type { BaseClientOptions, BaseRequestOptions } from "../../../../BaseClient";
+import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../BaseClient";
+import * as core from "../../../../core";
+import { mergeHeaders } from "../../../../core/headers";
+import * as environments from "../../../../environments";
+import { handleNonStatusCodeError } from "../../../../errors/handleNonStatusCodeError";
+import * as errors from "../../../../errors/index";
+import * as serializers from "../../../../serialization/index";
+import * as Webflow from "../../../index";
+import { OptimizationsClient } from "../resources/optimizations/client/Client";
+
+export declare namespace OptimizeClient {
+ export type Options = BaseClientOptions;
+
+ export interface RequestOptions extends BaseRequestOptions {}
+}
+
+/**
+ * Optimize reports provide read-only optimization results.
+ */
+export class OptimizeClient {
+ protected readonly _options: NormalizedClientOptionsWithAuth;
+ protected _optimizations: OptimizationsClient | undefined;
+
+ constructor(options: OptimizeClient.Options) {
+ this._options = normalizeClientOptionsWithAuth(options);
+ }
+
+ public get optimizations(): OptimizationsClient {
+ return (this._optimizations ??= new OptimizationsClient(this._options));
+ }
+
+ /**
+ * Lists the `optimizeId` values the provided access token can access, and the resource each one comes from, such as a Webflow site or a non-Webflow site. Use an `optimizeId` with the other Optimize endpoints.
+ *
+ * Results are sorted by `optimizeId` and aren't paginated.
+ *
+ * Webflow sites accept OAuth app tokens and Site API tokens. Non-Webflow sites that use Optimize accept only OAuth app tokens, including tokens authorized for a whole workspace.
+ *
+ * This endpoint requires a Webflow site with the Optimize add-on, or a non-Webflow site that uses Optimize.
+ *
+ * Each access token can have one Optimize request in flight at a time, across all Optimize endpoints. Additional concurrent requests return `429 Too Many Requests`. Wait for your in-flight request to finish, or for the `Retry-After` interval, then retry.
+ *
+ * Required scope | `sites:read`
+ *
+ * @param {OptimizeClient.RequestOptions} requestOptions - Request-specific configuration.
+ *
+ * @throws {@link Webflow.UnauthorizedError}
+ * @throws {@link Webflow.ForbiddenError}
+ * @throws {@link Webflow.NotFoundError}
+ * @throws {@link Webflow.TooManyRequestsError}
+ * @throws {@link Webflow.InternalServerError}
+ *
+ * @example
+ * await client.optimize.list()
+ */
+ public list(
+ requestOptions?: OptimizeClient.RequestOptions,
+ ): core.HttpResponsePromise {
+ return core.HttpResponsePromise.fromPromise(this.__list(requestOptions));
+ }
+
+ private async __list(
+ requestOptions?: OptimizeClient.RequestOptions,
+ ): Promise> {
+ const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest();
+ const _headers: core.Fetcher.Args["headers"] = mergeHeaders(
+ _authRequest.headers,
+ this._options?.headers,
+ requestOptions?.headers,
+ );
+ const _response = await core.fetcher({
+ url: core.url.join(
+ (await core.Supplier.get(this._options.baseUrl)) ??
+ ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi)
+ .base,
+ "optimize",
+ ),
+ method: "GET",
+ headers: _headers,
+ queryParameters: requestOptions?.queryParams,
+ timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000,
+ maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries,
+ abortSignal: requestOptions?.abortSignal,
+ fetchFn: this._options?.fetch,
+ logging: this._options.logging,
+ });
+ if (_response.ok) {
+ return {
+ data: serializers.OptimizeReferenceListResponse.parseOrThrow(_response.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ rawResponse: _response.rawResponse,
+ };
+ }
+
+ if (_response.error.reason === "status-code") {
+ switch (_response.error.statusCode) {
+ case 401:
+ throw new Webflow.UnauthorizedError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 403:
+ throw new Webflow.ForbiddenError(_response.error.body, _response.rawResponse);
+ case 404:
+ throw new Webflow.NotFoundError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 429:
+ throw new Webflow.TooManyRequestsError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 500:
+ throw new Webflow.InternalServerError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ default:
+ throw new errors.WebflowError({
+ statusCode: _response.error.statusCode,
+ body: _response.error.body,
+ rawResponse: _response.rawResponse,
+ });
+ }
+ }
+
+ return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/optimize");
+ }
+}
diff --git a/src/api/resources/optimize/client/index.ts b/src/api/resources/optimize/client/index.ts
new file mode 100644
index 00000000..cb0ff5c3
--- /dev/null
+++ b/src/api/resources/optimize/client/index.ts
@@ -0,0 +1 @@
+export {};
diff --git a/src/api/resources/optimize/exports.ts b/src/api/resources/optimize/exports.ts
new file mode 100644
index 00000000..38db9e96
--- /dev/null
+++ b/src/api/resources/optimize/exports.ts
@@ -0,0 +1,5 @@
+// This file was auto-generated by Fern from our API Definition.
+
+export { OptimizeClient } from "./client/Client";
+export * from "./client/index";
+export * from "./resources/index";
diff --git a/src/api/resources/optimize/index.ts b/src/api/resources/optimize/index.ts
new file mode 100644
index 00000000..33a87f10
--- /dev/null
+++ b/src/api/resources/optimize/index.ts
@@ -0,0 +1,2 @@
+export * from "./client";
+export * from "./resources";
diff --git a/src/api/resources/optimize/resources/index.ts b/src/api/resources/optimize/resources/index.ts
new file mode 100644
index 00000000..c9ac863c
--- /dev/null
+++ b/src/api/resources/optimize/resources/index.ts
@@ -0,0 +1,2 @@
+export * as optimizations from "./optimizations";
+export * from "./optimizations/client/requests";
diff --git a/src/api/resources/optimize/resources/optimizations/client/Client.ts b/src/api/resources/optimize/resources/optimizations/client/Client.ts
new file mode 100644
index 00000000..20757cdf
--- /dev/null
+++ b/src/api/resources/optimize/resources/optimizations/client/Client.ts
@@ -0,0 +1,727 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient";
+import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient";
+import * as core from "../../../../../../core";
+import { mergeHeaders } from "../../../../../../core/headers";
+import { toJson } from "../../../../../../core/json";
+import * as environments from "../../../../../../environments";
+import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError";
+import * as errors from "../../../../../../errors/index";
+import * as serializers from "../../../../../../serialization/index";
+import * as Webflow from "../../../../../index";
+import { DimensionsClient } from "../resources/dimensions/client/Client";
+import { GoalsClient } from "../resources/goals/client/Client";
+
+export declare namespace OptimizationsClient {
+ export type Options = BaseClientOptions;
+
+ export interface RequestOptions extends BaseRequestOptions {}
+}
+
+export class OptimizationsClient {
+ protected readonly _options: NormalizedClientOptionsWithAuth;
+ protected _goals: GoalsClient | undefined;
+ protected _dimensions: DimensionsClient | undefined;
+
+ constructor(options: OptimizationsClient.Options) {
+ this._options = normalizeClientOptionsWithAuth(options);
+ }
+
+ public get goals(): GoalsClient {
+ return (this._goals ??= new GoalsClient(this._options));
+ }
+
+ public get dimensions(): DimensionsClient {
+ return (this._dimensions ??= new DimensionsClient(this._options));
+ }
+
+ /**
+ * Lists the optimizations for an `optimizeId`, with each one's type, status, intervals, and current goals. Returns live and draft optimizations unless you set `status`.
+ *
+ * Each report covers a date range within a single interval of an optimization. Use an interval's `start` and `end` to choose a report's `intervalStart` and `intervalEnd`.
+ *
+ * Each interval lists its goals as they were when it started. `currentGoals` lists the optimization's goals as they're set up now, and each goal's `source` shows where it comes from. A report accepts a `goalId` from either list.
+ *
+ * Results are sorted by `optimizationId`, and each optimization's intervals are listed oldest first. To get the next page, pass `nextCursor` as `cursor`.
+ *
+ * This endpoint requires a Webflow site with the Optimize add-on, or a non-Webflow site that uses Optimize.
+ *
+ * Each access token can have one Optimize request in flight at a time, across all Optimize endpoints. Additional concurrent requests return `429 Too Many Requests`. Wait for your in-flight request to finish, or for the `Retry-After` interval, then retry.
+ *
+ * Required scope | `sites:read`
+ *
+ * @param {string} optimize_id - The Optimize ID, from [List Optimize IDs](/data/reference/optimize/list-optimize-ids).
+ * @param {Webflow.optimize.OptimizationsListRequest} request
+ * @param {OptimizationsClient.RequestOptions} requestOptions - Request-specific configuration.
+ *
+ * @throws {@link Webflow.BadRequestError}
+ * @throws {@link Webflow.UnauthorizedError}
+ * @throws {@link Webflow.ForbiddenError}
+ * @throws {@link Webflow.NotFoundError}
+ * @throws {@link Webflow.ConflictError}
+ * @throws {@link Webflow.TooManyRequestsError}
+ * @throws {@link Webflow.InternalServerError}
+ *
+ * @example
+ * await client.optimize.optimizations.list("117420042", {
+ * status: ["live", "draft"],
+ * pageSize: 1,
+ * cursor: "c2xhcnRpYmFydGZhc3Q"
+ * })
+ */
+ public list(
+ optimize_id: string,
+ request: Webflow.optimize.OptimizationsListRequest = {},
+ requestOptions?: OptimizationsClient.RequestOptions,
+ ): core.HttpResponsePromise {
+ return core.HttpResponsePromise.fromPromise(this.__list(optimize_id, request, requestOptions));
+ }
+
+ private async __list(
+ optimize_id: string,
+ request: Webflow.optimize.OptimizationsListRequest = {},
+ requestOptions?: OptimizationsClient.RequestOptions,
+ ): Promise> {
+ const { status, pageSize, cursor } = request;
+ const _queryParams: Record = {
+ status: Array.isArray(status)
+ ? status.map((item) =>
+ serializers.OptimizationStatus.jsonOrThrow(item, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ omitUndefined: true,
+ }),
+ )
+ : status != null
+ ? serializers.OptimizationStatus.jsonOrThrow(status, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ omitUndefined: true,
+ })
+ : undefined,
+ pageSize,
+ cursor,
+ };
+ const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest();
+ const _headers: core.Fetcher.Args["headers"] = mergeHeaders(
+ _authRequest.headers,
+ this._options?.headers,
+ requestOptions?.headers,
+ );
+ const _response = await core.fetcher({
+ url: core.url.join(
+ (await core.Supplier.get(this._options.baseUrl)) ??
+ ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi)
+ .base,
+ `optimize/${core.url.encodePathParam(optimize_id)}/optimizations`,
+ ),
+ method: "GET",
+ headers: _headers,
+ queryParameters: { ..._queryParams, ...requestOptions?.queryParams },
+ timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000,
+ maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries,
+ abortSignal: requestOptions?.abortSignal,
+ fetchFn: this._options?.fetch,
+ logging: this._options.logging,
+ });
+ if (_response.ok) {
+ return {
+ data: serializers.OptimizationListResponse.parseOrThrow(_response.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ rawResponse: _response.rawResponse,
+ };
+ }
+
+ if (_response.error.reason === "status-code") {
+ switch (_response.error.statusCode) {
+ case 400:
+ throw new Webflow.BadRequestError(_response.error.body, _response.rawResponse);
+ case 401:
+ throw new Webflow.UnauthorizedError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 403:
+ throw new Webflow.ForbiddenError(_response.error.body, _response.rawResponse);
+ case 404:
+ throw new Webflow.NotFoundError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 409:
+ throw new Webflow.ConflictError(_response.error.body, _response.rawResponse);
+ case 429:
+ throw new Webflow.TooManyRequestsError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 500:
+ throw new Webflow.InternalServerError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ default:
+ throw new errors.WebflowError({
+ statusCode: _response.error.statusCode,
+ body: _response.error.body,
+ rawResponse: _response.rawResponse,
+ });
+ }
+ }
+
+ return handleNonStatusCodeError(
+ _response.error,
+ _response.rawResponse,
+ "GET",
+ "/optimize/{optimize_id}/optimizations",
+ );
+ }
+
+ /**
+ * Returns each variation's sessions, users, conversions, and conversion rate for one goal, over a date range within one interval. Traditional tests and AI-optimized optimizations also include each variation's comparison with the base variation.
+ *
+ * Value goals also include each variation's total value and average conversion value. Choose the goal with `goalId`, and narrow the results with `filter`.
+ *
+ * This endpoint requires a Webflow site with the Optimize add-on, or a non-Webflow site that uses Optimize.
+ *
+ * Each access token can have one Optimize request in flight at a time, across all Optimize endpoints. Additional concurrent requests return `429 Too Many Requests`. Wait for your in-flight request to finish, or for the `Retry-After` interval, then retry.
+ *
+ * Required scope | `sites:read`
+ *
+ * @param {string} optimize_id - The Optimize ID, from [List Optimize IDs](/data/reference/optimize/list-optimize-ids).
+ * @param {string} optimization_id - The optimization ID, from [List Optimizations](/data/reference/optimize/list-optimizations).
+ * @param {Webflow.optimize.OptimizationsSummaryRequest} request
+ * @param {OptimizationsClient.RequestOptions} requestOptions - Request-specific configuration.
+ *
+ * @throws {@link Webflow.BadRequestError}
+ * @throws {@link Webflow.UnauthorizedError}
+ * @throws {@link Webflow.ForbiddenError}
+ * @throws {@link Webflow.NotFoundError}
+ * @throws {@link Webflow.ConflictError}
+ * @throws {@link Webflow.TooManyRequestsError}
+ * @throws {@link Webflow.InternalServerError}
+ *
+ * @example
+ * await client.optimize.optimizations.summary("117420042", "417200971", {
+ * intervalStart: new Date("2026-09-01T00:00:00.000Z"),
+ * intervalEnd: new Date("2026-09-15T00:00:00.000Z"),
+ * goalId: "198042421"
+ * })
+ */
+ public summary(
+ optimize_id: string,
+ optimization_id: string,
+ request: Webflow.optimize.OptimizationsSummaryRequest,
+ requestOptions?: OptimizationsClient.RequestOptions,
+ ): core.HttpResponsePromise {
+ return core.HttpResponsePromise.fromPromise(
+ this.__summary(optimize_id, optimization_id, request, requestOptions),
+ );
+ }
+
+ private async __summary(
+ optimize_id: string,
+ optimization_id: string,
+ request: Webflow.optimize.OptimizationsSummaryRequest,
+ requestOptions?: OptimizationsClient.RequestOptions,
+ ): Promise> {
+ const { intervalStart, intervalEnd, goalId, filter } = request;
+ const _queryParams: Record = {
+ intervalStart: intervalStart.toISOString(),
+ intervalEnd: intervalEnd.toISOString(),
+ goalId,
+ filter:
+ filter != null
+ ? toJson(
+ serializers.OptimizeFilter.jsonOrThrow(filter, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ omitUndefined: true,
+ }),
+ )
+ : undefined,
+ };
+ const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest();
+ const _headers: core.Fetcher.Args["headers"] = mergeHeaders(
+ _authRequest.headers,
+ this._options?.headers,
+ requestOptions?.headers,
+ );
+ const _response = await core.fetcher({
+ url: core.url.join(
+ (await core.Supplier.get(this._options.baseUrl)) ??
+ ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi)
+ .base,
+ `optimize/${core.url.encodePathParam(optimize_id)}/optimizations/${core.url.encodePathParam(optimization_id)}/summary`,
+ ),
+ method: "GET",
+ headers: _headers,
+ queryParameters: { ..._queryParams, ...requestOptions?.queryParams },
+ timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000,
+ maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries,
+ abortSignal: requestOptions?.abortSignal,
+ fetchFn: this._options?.fetch,
+ logging: this._options.logging,
+ });
+ if (_response.ok) {
+ return {
+ data: serializers.OptimizationSummaryResponse.parseOrThrow(_response.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ rawResponse: _response.rawResponse,
+ };
+ }
+
+ if (_response.error.reason === "status-code") {
+ switch (_response.error.statusCode) {
+ case 400:
+ throw new Webflow.BadRequestError(_response.error.body, _response.rawResponse);
+ case 401:
+ throw new Webflow.UnauthorizedError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 403:
+ throw new Webflow.ForbiddenError(_response.error.body, _response.rawResponse);
+ case 404:
+ throw new Webflow.NotFoundError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 409:
+ throw new Webflow.ConflictError(_response.error.body, _response.rawResponse);
+ case 429:
+ throw new Webflow.TooManyRequestsError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 500:
+ throw new Webflow.InternalServerError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ default:
+ throw new errors.WebflowError({
+ statusCode: _response.error.statusCode,
+ body: _response.error.body,
+ rawResponse: _response.rawResponse,
+ });
+ }
+ }
+
+ return handleNonStatusCodeError(
+ _response.error,
+ _response.rawResponse,
+ "GET",
+ "/optimize/{optimize_id}/optimizations/{optimization_id}/summary",
+ );
+ }
+
+ /**
+ * Returns each variation's sessions, users, conversions, and conversion rate for each segment of one dimension, for one goal over a date range within one interval. Choose the dimension with `groupBy`.
+ *
+ * Each segment also shows how the variation is trending against the base variation in that segment, and how confident that trend is. Choose the goal with `goalId`, and narrow the results with `filter`.
+ *
+ * This endpoint requires a Webflow site with the Optimize add-on, or a non-Webflow site that uses Optimize.
+ *
+ * Each access token can have one Optimize request in flight at a time, across all Optimize endpoints. Additional concurrent requests return `429 Too Many Requests`. Wait for your in-flight request to finish, or for the `Retry-After` interval, then retry.
+ *
+ * Required scope | `sites:read`
+ *
+ * @param {string} optimize_id - The Optimize ID, from [List Optimize IDs](/data/reference/optimize/list-optimize-ids).
+ * @param {string} optimization_id - The optimization ID, from [List Optimizations](/data/reference/optimize/list-optimizations).
+ * @param {Webflow.optimize.OptimizationsAudienceInsightsRequest} request
+ * @param {OptimizationsClient.RequestOptions} requestOptions - Request-specific configuration.
+ *
+ * @throws {@link Webflow.BadRequestError}
+ * @throws {@link Webflow.UnauthorizedError}
+ * @throws {@link Webflow.ForbiddenError}
+ * @throws {@link Webflow.NotFoundError}
+ * @throws {@link Webflow.ConflictError}
+ * @throws {@link Webflow.TooManyRequestsError}
+ * @throws {@link Webflow.InternalServerError}
+ *
+ * @example
+ * await client.optimize.optimizations.audienceInsights("117420042", "417200971", {
+ * intervalStart: new Date("2026-09-01T00:00:00.000Z"),
+ * intervalEnd: new Date("2026-09-15T00:00:00.000Z"),
+ * groupBy: "country",
+ * goalId: "198042421"
+ * })
+ */
+ public audienceInsights(
+ optimize_id: string,
+ optimization_id: string,
+ request: Webflow.optimize.OptimizationsAudienceInsightsRequest,
+ requestOptions?: OptimizationsClient.RequestOptions,
+ ): core.HttpResponsePromise {
+ return core.HttpResponsePromise.fromPromise(
+ this.__audienceInsights(optimize_id, optimization_id, request, requestOptions),
+ );
+ }
+
+ private async __audienceInsights(
+ optimize_id: string,
+ optimization_id: string,
+ request: Webflow.optimize.OptimizationsAudienceInsightsRequest,
+ requestOptions?: OptimizationsClient.RequestOptions,
+ ): Promise> {
+ const { intervalStart, intervalEnd, groupBy, goalId, filter } = request;
+ const _queryParams: Record = {
+ intervalStart: intervalStart.toISOString(),
+ intervalEnd: intervalEnd.toISOString(),
+ groupBy,
+ goalId,
+ filter:
+ filter != null
+ ? toJson(
+ serializers.OptimizeFilter.jsonOrThrow(filter, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ omitUndefined: true,
+ }),
+ )
+ : undefined,
+ };
+ const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest();
+ const _headers: core.Fetcher.Args["headers"] = mergeHeaders(
+ _authRequest.headers,
+ this._options?.headers,
+ requestOptions?.headers,
+ );
+ const _response = await core.fetcher({
+ url: core.url.join(
+ (await core.Supplier.get(this._options.baseUrl)) ??
+ ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi)
+ .base,
+ `optimize/${core.url.encodePathParam(optimize_id)}/optimizations/${core.url.encodePathParam(optimization_id)}/audience-insights`,
+ ),
+ method: "GET",
+ headers: _headers,
+ queryParameters: { ..._queryParams, ...requestOptions?.queryParams },
+ timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000,
+ maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries,
+ abortSignal: requestOptions?.abortSignal,
+ fetchFn: this._options?.fetch,
+ logging: this._options.logging,
+ });
+ if (_response.ok) {
+ return {
+ data: serializers.OptimizationAudienceInsightsResponse.parseOrThrow(_response.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ rawResponse: _response.rawResponse,
+ };
+ }
+
+ if (_response.error.reason === "status-code") {
+ switch (_response.error.statusCode) {
+ case 400:
+ throw new Webflow.BadRequestError(_response.error.body, _response.rawResponse);
+ case 401:
+ throw new Webflow.UnauthorizedError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 403:
+ throw new Webflow.ForbiddenError(_response.error.body, _response.rawResponse);
+ case 404:
+ throw new Webflow.NotFoundError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 409:
+ throw new Webflow.ConflictError(_response.error.body, _response.rawResponse);
+ case 429:
+ throw new Webflow.TooManyRequestsError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 500:
+ throw new Webflow.InternalServerError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ default:
+ throw new errors.WebflowError({
+ statusCode: _response.error.statusCode,
+ body: _response.error.body,
+ rawResponse: _response.rawResponse,
+ });
+ }
+ }
+
+ return handleNonStatusCodeError(
+ _response.error,
+ _response.rawResponse,
+ "GET",
+ "/optimize/{optimize_id}/optimizations/{optimization_id}/audience-insights",
+ );
+ }
+
+ /**
+ * Returns each variation's sessions, users, conversions, and conversion rate by day or week, for one goal over a date range within one interval. Traditional tests and AI-optimized optimizations also include each variation's comparison with the base variation.
+ *
+ * Buckets use the account's time zone, returned as `timeZone`. For AI-optimized optimizations, `strength` covers the whole date range and is the same in every bucket. Choose the goal with `goalId`, and narrow the results with `filter`.
+ *
+ * This endpoint requires a Webflow site with the Optimize add-on, or a non-Webflow site that uses Optimize.
+ *
+ * Each access token can have one Optimize request in flight at a time, across all Optimize endpoints. Additional concurrent requests return `429 Too Many Requests`. Wait for your in-flight request to finish, or for the `Retry-After` interval, then retry.
+ *
+ * Required scope | `sites:read`
+ *
+ * @param {string} optimize_id - The Optimize ID, from [List Optimize IDs](/data/reference/optimize/list-optimize-ids).
+ * @param {string} optimization_id - The optimization ID, from [List Optimizations](/data/reference/optimize/list-optimizations).
+ * @param {Webflow.optimize.OptimizationsTrendRequest} request
+ * @param {OptimizationsClient.RequestOptions} requestOptions - Request-specific configuration.
+ *
+ * @throws {@link Webflow.BadRequestError}
+ * @throws {@link Webflow.UnauthorizedError}
+ * @throws {@link Webflow.ForbiddenError}
+ * @throws {@link Webflow.NotFoundError}
+ * @throws {@link Webflow.ConflictError}
+ * @throws {@link Webflow.TooManyRequestsError}
+ * @throws {@link Webflow.InternalServerError}
+ *
+ * @example
+ * await client.optimize.optimizations.trend("117420042", "417200971", {
+ * intervalStart: new Date("2026-09-01T00:00:00.000Z"),
+ * intervalEnd: new Date("2026-09-15T00:00:00.000Z"),
+ * granularity: "daily",
+ * goalId: "198042421"
+ * })
+ */
+ public trend(
+ optimize_id: string,
+ optimization_id: string,
+ request: Webflow.optimize.OptimizationsTrendRequest,
+ requestOptions?: OptimizationsClient.RequestOptions,
+ ): core.HttpResponsePromise {
+ return core.HttpResponsePromise.fromPromise(
+ this.__trend(optimize_id, optimization_id, request, requestOptions),
+ );
+ }
+
+ private async __trend(
+ optimize_id: string,
+ optimization_id: string,
+ request: Webflow.optimize.OptimizationsTrendRequest,
+ requestOptions?: OptimizationsClient.RequestOptions,
+ ): Promise> {
+ const { intervalStart, intervalEnd, granularity, goalId, filter } = request;
+ const _queryParams: Record = {
+ intervalStart: intervalStart.toISOString(),
+ intervalEnd: intervalEnd.toISOString(),
+ granularity: serializers.OptimizeTrendGranularity.jsonOrThrow(granularity, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ omitUndefined: true,
+ }),
+ goalId,
+ filter:
+ filter != null
+ ? toJson(
+ serializers.OptimizeFilter.jsonOrThrow(filter, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ omitUndefined: true,
+ }),
+ )
+ : undefined,
+ };
+ const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest();
+ const _headers: core.Fetcher.Args["headers"] = mergeHeaders(
+ _authRequest.headers,
+ this._options?.headers,
+ requestOptions?.headers,
+ );
+ const _response = await core.fetcher({
+ url: core.url.join(
+ (await core.Supplier.get(this._options.baseUrl)) ??
+ ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi)
+ .base,
+ `optimize/${core.url.encodePathParam(optimize_id)}/optimizations/${core.url.encodePathParam(optimization_id)}/trend`,
+ ),
+ method: "GET",
+ headers: _headers,
+ queryParameters: { ..._queryParams, ...requestOptions?.queryParams },
+ timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000,
+ maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries,
+ abortSignal: requestOptions?.abortSignal,
+ fetchFn: this._options?.fetch,
+ logging: this._options.logging,
+ });
+ if (_response.ok) {
+ return {
+ data: serializers.OptimizationTrendResponse.parseOrThrow(_response.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ rawResponse: _response.rawResponse,
+ };
+ }
+
+ if (_response.error.reason === "status-code") {
+ switch (_response.error.statusCode) {
+ case 400:
+ throw new Webflow.BadRequestError(_response.error.body, _response.rawResponse);
+ case 401:
+ throw new Webflow.UnauthorizedError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 403:
+ throw new Webflow.ForbiddenError(_response.error.body, _response.rawResponse);
+ case 404:
+ throw new Webflow.NotFoundError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 409:
+ throw new Webflow.ConflictError(_response.error.body, _response.rawResponse);
+ case 429:
+ throw new Webflow.TooManyRequestsError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 500:
+ throw new Webflow.InternalServerError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ default:
+ throw new errors.WebflowError({
+ statusCode: _response.error.statusCode,
+ body: _response.error.body,
+ rawResponse: _response.rawResponse,
+ });
+ }
+ }
+
+ return handleNonStatusCodeError(
+ _response.error,
+ _response.rawResponse,
+ "GET",
+ "/optimize/{optimize_id}/optimizations/{optimization_id}/trend",
+ );
+ }
+}
diff --git a/src/api/resources/optimize/resources/optimizations/client/index.ts b/src/api/resources/optimize/resources/optimizations/client/index.ts
new file mode 100644
index 00000000..415726b7
--- /dev/null
+++ b/src/api/resources/optimize/resources/optimizations/client/index.ts
@@ -0,0 +1 @@
+export * from "./requests";
diff --git a/src/api/resources/optimize/resources/optimizations/client/requests/OptimizationsAudienceInsightsRequest.ts b/src/api/resources/optimize/resources/optimizations/client/requests/OptimizationsAudienceInsightsRequest.ts
new file mode 100644
index 00000000..b3c1272f
--- /dev/null
+++ b/src/api/resources/optimize/resources/optimizations/client/requests/OptimizationsAudienceInsightsRequest.ts
@@ -0,0 +1,33 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../../../../../index";
+
+/**
+ * @example
+ * {
+ * intervalStart: new Date("2026-09-01T00:00:00.000Z"),
+ * intervalEnd: new Date("2026-09-15T00:00:00.000Z"),
+ * groupBy: "country",
+ * goalId: "198042421"
+ * }
+ */
+export interface OptimizationsAudienceInsightsRequest {
+ /** Start of the date range. Must be a UTC timestamp ending in `Z`, such as `2026-09-01T00:00:00Z`. Offsets and date-only values aren't accepted. Seconds and milliseconds are optional. The date range must fall within a single interval of the optimization. A range that crosses from one interval into the next is rejected. Use an interval's `start` and `end` from [List Optimizations](/data/reference/optimize/list-optimizations). Can't be earlier than 18 months ago. */
+ intervalStart: Date;
+ /** End of the date range. Must be a UTC timestamp ending in `Z`, such as `2026-09-15T00:00:00Z`, and later than `intervalStart`. Offsets and date-only values aren't accepted. Seconds and milliseconds are optional. */
+ intervalEnd: Date;
+ /** The dimension to split results by, from [List Dimensions](/data/reference/optimize/list-dimensions). Accepts any dimension except `urlParameter`. */
+ groupBy: string;
+ /**
+ * The goal to measure. Defaults to the interval's first target goal, or its first goal if it has no target goal. Use a `goalId` from the interval's `goals` or from the optimization's `currentGoals`. See [List Optimization Goals](/data/reference/optimize/list-optimization-goals).
+ *
+ * If the goal is in both lists, the report uses the interval's version. A goal from `currentGoals` is measured with its current settings over the whole date range, including dates before it was added to the optimization.
+ */
+ goalId?: string;
+ /**
+ * Narrow the results to visitors who match dimension values. Use bracket notation with `in` or `nin` and indexed arrays, for example `filter[country][in][0]=US&filter[country][in][1]=GB&filter[customAttribute:towel][nin][0]=forgotten`.
+ *
+ * Keys are dimension `id` values from [List Dimensions](/data/reference/optimize/list-dimensions), and values are raw `value` values from [List Dimension Values](/data/reference/optimize/list-dimension-values). Separate dimensions combine with AND. Values within one dimension combine with OR. A filter can name at most 20 dimensions, with at most 50 values per operator and 500 values in total.
+ */
+ filter?: Webflow.OptimizeFilter;
+}
diff --git a/src/api/resources/optimize/resources/optimizations/client/requests/OptimizationsListRequest.ts b/src/api/resources/optimize/resources/optimizations/client/requests/OptimizationsListRequest.ts
new file mode 100644
index 00000000..4b0ddc81
--- /dev/null
+++ b/src/api/resources/optimize/resources/optimizations/client/requests/OptimizationsListRequest.ts
@@ -0,0 +1,24 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../../../../../index";
+
+/**
+ * @example
+ * {
+ * status: ["live", "draft"],
+ * pageSize: 1,
+ * cursor: "c2xhcnRpYmFydGZhc3Q"
+ * }
+ */
+export interface OptimizationsListRequest {
+ /**
+ * The statuses to include. Defaults to `live` and `draft`. Pass repeated values (`status=live&status=draft`) or a comma-separated list (`status=live,draft`).
+ *
+ * A `cursor` keeps the statuses it was created with. When you pass a `cursor`, omit `status` or send the same statuses.
+ */
+ status?: Webflow.OptimizationStatus | Webflow.OptimizationStatus[];
+ /** The maximum number of results to return. Defaults to `100`, up to `200`. */
+ pageSize?: number;
+ /** The `nextCursor` from a previous response, to get the next page. */
+ cursor?: string;
+}
diff --git a/src/api/resources/optimize/resources/optimizations/client/requests/OptimizationsSummaryRequest.ts b/src/api/resources/optimize/resources/optimizations/client/requests/OptimizationsSummaryRequest.ts
new file mode 100644
index 00000000..3f0ea209
--- /dev/null
+++ b/src/api/resources/optimize/resources/optimizations/client/requests/OptimizationsSummaryRequest.ts
@@ -0,0 +1,30 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../../../../../index";
+
+/**
+ * @example
+ * {
+ * intervalStart: new Date("2026-09-01T00:00:00.000Z"),
+ * intervalEnd: new Date("2026-09-15T00:00:00.000Z"),
+ * goalId: "198042421"
+ * }
+ */
+export interface OptimizationsSummaryRequest {
+ /** Start of the date range. Must be a UTC timestamp ending in `Z`, such as `2026-09-01T00:00:00Z`. Offsets and date-only values aren't accepted. Seconds and milliseconds are optional. The date range must fall within a single interval of the optimization. A range that crosses from one interval into the next is rejected. Use an interval's `start` and `end` from [List Optimizations](/data/reference/optimize/list-optimizations). Can't be earlier than 18 months ago. */
+ intervalStart: Date;
+ /** End of the date range. Must be a UTC timestamp ending in `Z`, such as `2026-09-15T00:00:00Z`, and later than `intervalStart`. Offsets and date-only values aren't accepted. Seconds and milliseconds are optional. */
+ intervalEnd: Date;
+ /**
+ * The goal to measure. Defaults to the interval's first target goal, or its first goal if it has no target goal. Use a `goalId` from the interval's `goals` or from the optimization's `currentGoals`. See [List Optimization Goals](/data/reference/optimize/list-optimization-goals).
+ *
+ * If the goal is in both lists, the report uses the interval's version. A goal from `currentGoals` is measured with its current settings over the whole date range, including dates before it was added to the optimization.
+ */
+ goalId?: string;
+ /**
+ * Narrow the results to visitors who match dimension values. Use bracket notation with `in` or `nin` and indexed arrays, for example `filter[country][in][0]=US&filter[country][in][1]=GB&filter[customAttribute:towel][nin][0]=forgotten`.
+ *
+ * Keys are dimension `id` values from [List Dimensions](/data/reference/optimize/list-dimensions), and values are raw `value` values from [List Dimension Values](/data/reference/optimize/list-dimension-values). Separate dimensions combine with AND. Values within one dimension combine with OR. A filter can name at most 20 dimensions, with at most 50 values per operator and 500 values in total.
+ */
+ filter?: Webflow.OptimizeFilter;
+}
diff --git a/src/api/resources/optimize/resources/optimizations/client/requests/OptimizationsTrendRequest.ts b/src/api/resources/optimize/resources/optimizations/client/requests/OptimizationsTrendRequest.ts
new file mode 100644
index 00000000..43c50f58
--- /dev/null
+++ b/src/api/resources/optimize/resources/optimizations/client/requests/OptimizationsTrendRequest.ts
@@ -0,0 +1,33 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../../../../../index";
+
+/**
+ * @example
+ * {
+ * intervalStart: new Date("2026-09-01T00:00:00.000Z"),
+ * intervalEnd: new Date("2026-09-15T00:00:00.000Z"),
+ * granularity: "daily",
+ * goalId: "198042421"
+ * }
+ */
+export interface OptimizationsTrendRequest {
+ /** Start of the date range. Must be a UTC timestamp ending in `Z`, such as `2026-09-01T00:00:00Z`. Offsets and date-only values aren't accepted. Seconds and milliseconds are optional. The date range must fall within a single interval of the optimization. A range that crosses from one interval into the next is rejected. Use an interval's `start` and `end` from [List Optimizations](/data/reference/optimize/list-optimizations). Can't be earlier than 18 months ago. */
+ intervalStart: Date;
+ /** End of the date range. Must be a UTC timestamp ending in `Z`, such as `2026-09-15T00:00:00Z`, and later than `intervalStart`. Offsets and date-only values aren't accepted. Seconds and milliseconds are optional. */
+ intervalEnd: Date;
+ /** Whether to bucket results by day or by week. */
+ granularity: Webflow.OptimizeTrendGranularity;
+ /**
+ * The goal to measure. Defaults to the interval's first target goal, or its first goal if it has no target goal. Use a `goalId` from the interval's `goals` or from the optimization's `currentGoals`. See [List Optimization Goals](/data/reference/optimize/list-optimization-goals).
+ *
+ * If the goal is in both lists, the report uses the interval's version. A goal from `currentGoals` is measured with its current settings over the whole date range, including dates before it was added to the optimization.
+ */
+ goalId?: string;
+ /**
+ * Narrow the results to visitors who match dimension values. Use bracket notation with `in` or `nin` and indexed arrays, for example `filter[country][in][0]=US&filter[country][in][1]=GB&filter[customAttribute:towel][nin][0]=forgotten`.
+ *
+ * Keys are dimension `id` values from [List Dimensions](/data/reference/optimize/list-dimensions), and values are raw `value` values from [List Dimension Values](/data/reference/optimize/list-dimension-values). Separate dimensions combine with AND. Values within one dimension combine with OR. A filter can name at most 20 dimensions, with at most 50 values per operator and 500 values in total.
+ */
+ filter?: Webflow.OptimizeFilter;
+}
diff --git a/src/api/resources/optimize/resources/optimizations/client/requests/index.ts b/src/api/resources/optimize/resources/optimizations/client/requests/index.ts
new file mode 100644
index 00000000..f5cacecc
--- /dev/null
+++ b/src/api/resources/optimize/resources/optimizations/client/requests/index.ts
@@ -0,0 +1,4 @@
+export type { OptimizationsAudienceInsightsRequest } from "./OptimizationsAudienceInsightsRequest";
+export type { OptimizationsListRequest } from "./OptimizationsListRequest";
+export type { OptimizationsSummaryRequest } from "./OptimizationsSummaryRequest";
+export type { OptimizationsTrendRequest } from "./OptimizationsTrendRequest";
diff --git a/src/api/resources/optimize/resources/optimizations/exports.ts b/src/api/resources/optimize/resources/optimizations/exports.ts
new file mode 100644
index 00000000..442e750a
--- /dev/null
+++ b/src/api/resources/optimize/resources/optimizations/exports.ts
@@ -0,0 +1,5 @@
+// This file was auto-generated by Fern from our API Definition.
+
+export { OptimizationsClient } from "./client/Client";
+export * from "./client/index";
+export * from "./resources/index";
diff --git a/src/api/resources/optimize/resources/optimizations/index.ts b/src/api/resources/optimize/resources/optimizations/index.ts
new file mode 100644
index 00000000..33a87f10
--- /dev/null
+++ b/src/api/resources/optimize/resources/optimizations/index.ts
@@ -0,0 +1,2 @@
+export * from "./client";
+export * from "./resources";
diff --git a/src/api/resources/optimize/resources/optimizations/resources/dimensions/client/Client.ts b/src/api/resources/optimize/resources/optimizations/resources/dimensions/client/Client.ts
new file mode 100644
index 00000000..b08be4de
--- /dev/null
+++ b/src/api/resources/optimize/resources/optimizations/resources/dimensions/client/Client.ts
@@ -0,0 +1,355 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../../../BaseClient";
+import {
+ type NormalizedClientOptionsWithAuth,
+ normalizeClientOptionsWithAuth,
+} from "../../../../../../../../BaseClient";
+import * as core from "../../../../../../../../core";
+import { mergeHeaders } from "../../../../../../../../core/headers";
+import { toJson } from "../../../../../../../../core/json";
+import * as environments from "../../../../../../../../environments";
+import { handleNonStatusCodeError } from "../../../../../../../../errors/handleNonStatusCodeError";
+import * as errors from "../../../../../../../../errors/index";
+import * as serializers from "../../../../../../../../serialization/index";
+import * as Webflow from "../../../../../../../index";
+
+export declare namespace DimensionsClient {
+ export type Options = BaseClientOptions;
+
+ export interface RequestOptions extends BaseRequestOptions {}
+}
+
+export class DimensionsClient {
+ protected readonly _options: NormalizedClientOptionsWithAuth;
+
+ constructor(options: DimensionsClient.Options) {
+ this._options = normalizeClientOptionsWithAuth(options);
+ }
+
+ /**
+ * Lists the dimensions you can group or filter an optimization's reports by, for a date range within one interval. Use a dimension's `id` in `groupBy`, in `filter`, or to list its values.
+ *
+ * This endpoint requires a Webflow site with the Optimize add-on, or a non-Webflow site that uses Optimize.
+ *
+ * Each access token can have one Optimize request in flight at a time, across all Optimize endpoints. Additional concurrent requests return `429 Too Many Requests`. Wait for your in-flight request to finish, or for the `Retry-After` interval, then retry.
+ *
+ * Required scope | `sites:read`
+ *
+ * @param {string} optimize_id - The Optimize ID, from [List Optimize IDs](/data/reference/optimize/list-optimize-ids).
+ * @param {string} optimization_id - The optimization ID, from [List Optimizations](/data/reference/optimize/list-optimizations).
+ * @param {Webflow.optimize.optimizations.DimensionsListRequest} request
+ * @param {DimensionsClient.RequestOptions} requestOptions - Request-specific configuration.
+ *
+ * @throws {@link Webflow.BadRequestError}
+ * @throws {@link Webflow.UnauthorizedError}
+ * @throws {@link Webflow.ForbiddenError}
+ * @throws {@link Webflow.NotFoundError}
+ * @throws {@link Webflow.ConflictError}
+ * @throws {@link Webflow.TooManyRequestsError}
+ * @throws {@link Webflow.InternalServerError}
+ *
+ * @example
+ * await client.optimize.optimizations.dimensions.list("117420042", "417200971", {
+ * intervalStart: new Date("2026-09-01T00:00:00.000Z"),
+ * intervalEnd: new Date("2026-09-15T00:00:00.000Z")
+ * })
+ */
+ public list(
+ optimize_id: string,
+ optimization_id: string,
+ request: Webflow.optimize.optimizations.DimensionsListRequest,
+ requestOptions?: DimensionsClient.RequestOptions,
+ ): core.HttpResponsePromise {
+ return core.HttpResponsePromise.fromPromise(this.__list(optimize_id, optimization_id, request, requestOptions));
+ }
+
+ private async __list(
+ optimize_id: string,
+ optimization_id: string,
+ request: Webflow.optimize.optimizations.DimensionsListRequest,
+ requestOptions?: DimensionsClient.RequestOptions,
+ ): Promise> {
+ const { intervalStart, intervalEnd } = request;
+ const _queryParams: Record = {
+ intervalStart: intervalStart.toISOString(),
+ intervalEnd: intervalEnd.toISOString(),
+ };
+ const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest();
+ const _headers: core.Fetcher.Args["headers"] = mergeHeaders(
+ _authRequest.headers,
+ this._options?.headers,
+ requestOptions?.headers,
+ );
+ const _response = await core.fetcher({
+ url: core.url.join(
+ (await core.Supplier.get(this._options.baseUrl)) ??
+ ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi)
+ .base,
+ `optimize/${core.url.encodePathParam(optimize_id)}/optimizations/${core.url.encodePathParam(optimization_id)}/dimensions`,
+ ),
+ method: "GET",
+ headers: _headers,
+ queryParameters: { ..._queryParams, ...requestOptions?.queryParams },
+ timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000,
+ maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries,
+ abortSignal: requestOptions?.abortSignal,
+ fetchFn: this._options?.fetch,
+ logging: this._options.logging,
+ });
+ if (_response.ok) {
+ return {
+ data: serializers.OptimizationDimensionsResponse.parseOrThrow(_response.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ rawResponse: _response.rawResponse,
+ };
+ }
+
+ if (_response.error.reason === "status-code") {
+ switch (_response.error.statusCode) {
+ case 400:
+ throw new Webflow.BadRequestError(_response.error.body, _response.rawResponse);
+ case 401:
+ throw new Webflow.UnauthorizedError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 403:
+ throw new Webflow.ForbiddenError(_response.error.body, _response.rawResponse);
+ case 404:
+ throw new Webflow.NotFoundError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 409:
+ throw new Webflow.ConflictError(_response.error.body, _response.rawResponse);
+ case 429:
+ throw new Webflow.TooManyRequestsError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 500:
+ throw new Webflow.InternalServerError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ default:
+ throw new errors.WebflowError({
+ statusCode: _response.error.statusCode,
+ body: _response.error.body,
+ rawResponse: _response.rawResponse,
+ });
+ }
+ }
+
+ return handleNonStatusCodeError(
+ _response.error,
+ _response.rawResponse,
+ "GET",
+ "/optimize/{optimize_id}/optimizations/{optimization_id}/dimensions",
+ );
+ }
+
+ /**
+ * Lists the values seen for one dimension over a date range within one interval, with how often each appeared. Use a `value` in `filter` to narrow a report.
+ *
+ * Values are sorted by `eventCount`, highest first. To get the next page, pass `nextCursor` as `cursor`. Counts can change between requests, so a value can move to a different page while you page through the list.
+ *
+ * This endpoint requires a Webflow site with the Optimize add-on, or a non-Webflow site that uses Optimize.
+ *
+ * Each access token can have one Optimize request in flight at a time, across all Optimize endpoints. Additional concurrent requests return `429 Too Many Requests`. Wait for your in-flight request to finish, or for the `Retry-After` interval, then retry.
+ *
+ * Required scope | `sites:read`
+ *
+ * @param {string} optimize_id - The Optimize ID, from [List Optimize IDs](/data/reference/optimize/list-optimize-ids).
+ * @param {string} optimization_id - The optimization ID, from [List Optimizations](/data/reference/optimize/list-optimizations).
+ * @param {string} dimension_id - The dimension `id`, from [List Dimensions](/data/reference/optimize/list-dimensions). URL-encode it, because dimension IDs can contain `:`, `.`, and spaces. Unlike `groupBy`, this accepts `urlParameter`.
+ * @param {Webflow.optimize.optimizations.DimensionsListValuesRequest} request
+ * @param {DimensionsClient.RequestOptions} requestOptions - Request-specific configuration.
+ *
+ * @throws {@link Webflow.BadRequestError}
+ * @throws {@link Webflow.UnauthorizedError}
+ * @throws {@link Webflow.ForbiddenError}
+ * @throws {@link Webflow.NotFoundError}
+ * @throws {@link Webflow.ConflictError}
+ * @throws {@link Webflow.TooManyRequestsError}
+ * @throws {@link Webflow.InternalServerError}
+ *
+ * @example
+ * await client.optimize.optimizations.dimensions.listValues("117420042", "417200971", "country", {
+ * intervalStart: new Date("2026-09-01T00:00:00.000Z"),
+ * intervalEnd: new Date("2026-09-15T00:00:00.000Z"),
+ * pageSize: 1,
+ * cursor: "ZmpvcmRz"
+ * })
+ */
+ public listValues(
+ optimize_id: string,
+ optimization_id: string,
+ dimension_id: string,
+ request: Webflow.optimize.optimizations.DimensionsListValuesRequest,
+ requestOptions?: DimensionsClient.RequestOptions,
+ ): core.HttpResponsePromise {
+ return core.HttpResponsePromise.fromPromise(
+ this.__listValues(optimize_id, optimization_id, dimension_id, request, requestOptions),
+ );
+ }
+
+ private async __listValues(
+ optimize_id: string,
+ optimization_id: string,
+ dimension_id: string,
+ request: Webflow.optimize.optimizations.DimensionsListValuesRequest,
+ requestOptions?: DimensionsClient.RequestOptions,
+ ): Promise> {
+ const { intervalStart, intervalEnd, filter, pageSize, cursor } = request;
+ const _queryParams: Record = {
+ intervalStart: intervalStart.toISOString(),
+ intervalEnd: intervalEnd.toISOString(),
+ filter:
+ filter != null
+ ? toJson(
+ serializers.OptimizeFilter.jsonOrThrow(filter, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ omitUndefined: true,
+ }),
+ )
+ : undefined,
+ pageSize,
+ cursor,
+ };
+ const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest();
+ const _headers: core.Fetcher.Args["headers"] = mergeHeaders(
+ _authRequest.headers,
+ this._options?.headers,
+ requestOptions?.headers,
+ );
+ const _response = await core.fetcher({
+ url: core.url.join(
+ (await core.Supplier.get(this._options.baseUrl)) ??
+ ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi)
+ .base,
+ `optimize/${core.url.encodePathParam(optimize_id)}/optimizations/${core.url.encodePathParam(optimization_id)}/dimensions/${core.url.encodePathParam(dimension_id)}/values`,
+ ),
+ method: "GET",
+ headers: _headers,
+ queryParameters: { ..._queryParams, ...requestOptions?.queryParams },
+ timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000,
+ maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries,
+ abortSignal: requestOptions?.abortSignal,
+ fetchFn: this._options?.fetch,
+ logging: this._options.logging,
+ });
+ if (_response.ok) {
+ return {
+ data: serializers.OptimizationDimensionValuesResponse.parseOrThrow(_response.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ rawResponse: _response.rawResponse,
+ };
+ }
+
+ if (_response.error.reason === "status-code") {
+ switch (_response.error.statusCode) {
+ case 400:
+ throw new Webflow.BadRequestError(_response.error.body, _response.rawResponse);
+ case 401:
+ throw new Webflow.UnauthorizedError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 403:
+ throw new Webflow.ForbiddenError(_response.error.body, _response.rawResponse);
+ case 404:
+ throw new Webflow.NotFoundError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 409:
+ throw new Webflow.ConflictError(_response.error.body, _response.rawResponse);
+ case 429:
+ throw new Webflow.TooManyRequestsError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 500:
+ throw new Webflow.InternalServerError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ default:
+ throw new errors.WebflowError({
+ statusCode: _response.error.statusCode,
+ body: _response.error.body,
+ rawResponse: _response.rawResponse,
+ });
+ }
+ }
+
+ return handleNonStatusCodeError(
+ _response.error,
+ _response.rawResponse,
+ "GET",
+ "/optimize/{optimize_id}/optimizations/{optimization_id}/dimensions/{dimension_id}/values",
+ );
+ }
+}
diff --git a/src/api/resources/optimize/resources/optimizations/resources/dimensions/client/index.ts b/src/api/resources/optimize/resources/optimizations/resources/dimensions/client/index.ts
new file mode 100644
index 00000000..415726b7
--- /dev/null
+++ b/src/api/resources/optimize/resources/optimizations/resources/dimensions/client/index.ts
@@ -0,0 +1 @@
+export * from "./requests";
diff --git a/src/api/resources/optimize/resources/optimizations/resources/dimensions/client/requests/DimensionsListRequest.ts b/src/api/resources/optimize/resources/optimizations/resources/dimensions/client/requests/DimensionsListRequest.ts
new file mode 100644
index 00000000..e86df340
--- /dev/null
+++ b/src/api/resources/optimize/resources/optimizations/resources/dimensions/client/requests/DimensionsListRequest.ts
@@ -0,0 +1,15 @@
+// This file was auto-generated by Fern from our API Definition.
+
+/**
+ * @example
+ * {
+ * intervalStart: new Date("2026-09-01T00:00:00.000Z"),
+ * intervalEnd: new Date("2026-09-15T00:00:00.000Z")
+ * }
+ */
+export interface DimensionsListRequest {
+ /** Start of the date range. Must be a UTC timestamp ending in `Z`, such as `2026-09-01T00:00:00Z`. Offsets and date-only values aren't accepted. Seconds and milliseconds are optional. The date range must fall within a single interval of the optimization. A range that crosses from one interval into the next is rejected. Use an interval's `start` and `end` from [List Optimizations](/data/reference/optimize/list-optimizations). Can't be earlier than 18 months ago. */
+ intervalStart: Date;
+ /** End of the date range. Must be a UTC timestamp ending in `Z`, such as `2026-09-15T00:00:00Z`, and later than `intervalStart`. Offsets and date-only values aren't accepted. Seconds and milliseconds are optional. */
+ intervalEnd: Date;
+}
diff --git a/src/api/resources/optimize/resources/optimizations/resources/dimensions/client/requests/DimensionsListValuesRequest.ts b/src/api/resources/optimize/resources/optimizations/resources/dimensions/client/requests/DimensionsListValuesRequest.ts
new file mode 100644
index 00000000..4c2e70b9
--- /dev/null
+++ b/src/api/resources/optimize/resources/optimizations/resources/dimensions/client/requests/DimensionsListValuesRequest.ts
@@ -0,0 +1,29 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../../../../../../../index";
+
+/**
+ * @example
+ * {
+ * intervalStart: new Date("2026-09-01T00:00:00.000Z"),
+ * intervalEnd: new Date("2026-09-15T00:00:00.000Z"),
+ * pageSize: 1,
+ * cursor: "ZmpvcmRz"
+ * }
+ */
+export interface DimensionsListValuesRequest {
+ /** Start of the date range. Must be a UTC timestamp ending in `Z`, such as `2026-09-01T00:00:00Z`. Offsets and date-only values aren't accepted. Seconds and milliseconds are optional. The date range must fall within a single interval of the optimization. A range that crosses from one interval into the next is rejected. Use an interval's `start` and `end` from [List Optimizations](/data/reference/optimize/list-optimizations). Can't be earlier than 18 months ago. */
+ intervalStart: Date;
+ /** End of the date range. Must be a UTC timestamp ending in `Z`, such as `2026-09-15T00:00:00Z`, and later than `intervalStart`. Offsets and date-only values aren't accepted. Seconds and milliseconds are optional. */
+ intervalEnd: Date;
+ /**
+ * Narrow the results to visitors who match dimension values. Use bracket notation with `in` or `nin` and indexed arrays, for example `filter[country][in][0]=US&filter[country][in][1]=GB&filter[customAttribute:towel][nin][0]=forgotten`.
+ *
+ * Keys are dimension `id` values from [List Dimensions](/data/reference/optimize/list-dimensions), and values are raw `value` values from [List Dimension Values](/data/reference/optimize/list-dimension-values). Separate dimensions combine with AND. Values within one dimension combine with OR. A filter can name at most 20 dimensions, with at most 50 values per operator and 500 values in total.
+ */
+ filter?: Webflow.OptimizeFilter;
+ /** The maximum number of results to return. Defaults to `100`, up to `200`. */
+ pageSize?: number;
+ /** The `nextCursor` from a previous response, to get the next page. Send the same dimension, `intervalStart`, `intervalEnd`, and `filter` as the original request. Note that `pageSize` can differ between requests. */
+ cursor?: string;
+}
diff --git a/src/api/resources/optimize/resources/optimizations/resources/dimensions/client/requests/index.ts b/src/api/resources/optimize/resources/optimizations/resources/dimensions/client/requests/index.ts
new file mode 100644
index 00000000..9014863c
--- /dev/null
+++ b/src/api/resources/optimize/resources/optimizations/resources/dimensions/client/requests/index.ts
@@ -0,0 +1,2 @@
+export type { DimensionsListRequest } from "./DimensionsListRequest";
+export type { DimensionsListValuesRequest } from "./DimensionsListValuesRequest";
diff --git a/src/api/resources/optimize/resources/optimizations/resources/dimensions/exports.ts b/src/api/resources/optimize/resources/optimizations/resources/dimensions/exports.ts
new file mode 100644
index 00000000..83718e4d
--- /dev/null
+++ b/src/api/resources/optimize/resources/optimizations/resources/dimensions/exports.ts
@@ -0,0 +1,4 @@
+// This file was auto-generated by Fern from our API Definition.
+
+export { DimensionsClient } from "./client/Client";
+export * from "./client/index";
diff --git a/src/api/resources/optimize/resources/optimizations/resources/dimensions/index.ts b/src/api/resources/optimize/resources/optimizations/resources/dimensions/index.ts
new file mode 100644
index 00000000..5ec76921
--- /dev/null
+++ b/src/api/resources/optimize/resources/optimizations/resources/dimensions/index.ts
@@ -0,0 +1 @@
+export * from "./client";
diff --git a/src/api/resources/optimize/resources/optimizations/resources/goals/client/Client.ts b/src/api/resources/optimize/resources/optimizations/resources/goals/client/Client.ts
new file mode 100644
index 00000000..6e524ac0
--- /dev/null
+++ b/src/api/resources/optimize/resources/optimizations/resources/goals/client/Client.ts
@@ -0,0 +1,180 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../../../BaseClient";
+import {
+ type NormalizedClientOptionsWithAuth,
+ normalizeClientOptionsWithAuth,
+} from "../../../../../../../../BaseClient";
+import * as core from "../../../../../../../../core";
+import { mergeHeaders } from "../../../../../../../../core/headers";
+import * as environments from "../../../../../../../../environments";
+import { handleNonStatusCodeError } from "../../../../../../../../errors/handleNonStatusCodeError";
+import * as errors from "../../../../../../../../errors/index";
+import * as serializers from "../../../../../../../../serialization/index";
+import * as Webflow from "../../../../../../../index";
+
+export declare namespace GoalsClient {
+ export type Options = BaseClientOptions;
+
+ export interface RequestOptions extends BaseRequestOptions {}
+}
+
+export class GoalsClient {
+ protected readonly _options: NormalizedClientOptionsWithAuth;
+
+ constructor(options: GoalsClient.Options) {
+ this._options = normalizeClientOptionsWithAuth(options);
+ }
+
+ /**
+ * Lists an optimization's goals in two lists. `goals` holds the goals of the interval that contains the requested date range, as they were when it started, with its target goals marked. `currentGoals` holds the optimization's goals as they're set up now, with where each comes from. Use a `goalId` from either list to choose the goal a report measures.
+ *
+ * This endpoint requires a Webflow site with the Optimize add-on, or a non-Webflow site that uses Optimize.
+ *
+ * Each access token can have one Optimize request in flight at a time, across all Optimize endpoints. Additional concurrent requests return `429 Too Many Requests`. Wait for your in-flight request to finish, or for the `Retry-After` interval, then retry.
+ *
+ * Required scope | `sites:read`
+ *
+ * @param {string} optimize_id - The Optimize ID, from [List Optimize IDs](/data/reference/optimize/list-optimize-ids).
+ * @param {string} optimization_id - The optimization ID, from [List Optimizations](/data/reference/optimize/list-optimizations).
+ * @param {Webflow.optimize.optimizations.GoalsListRequest} request
+ * @param {GoalsClient.RequestOptions} requestOptions - Request-specific configuration.
+ *
+ * @throws {@link Webflow.BadRequestError}
+ * @throws {@link Webflow.UnauthorizedError}
+ * @throws {@link Webflow.ForbiddenError}
+ * @throws {@link Webflow.NotFoundError}
+ * @throws {@link Webflow.ConflictError}
+ * @throws {@link Webflow.TooManyRequestsError}
+ * @throws {@link Webflow.InternalServerError}
+ *
+ * @example
+ * await client.optimize.optimizations.goals.list("117420042", "417200971", {
+ * intervalStart: new Date("2026-09-01T00:00:00.000Z"),
+ * intervalEnd: new Date("2026-09-15T00:00:00.000Z")
+ * })
+ */
+ public list(
+ optimize_id: string,
+ optimization_id: string,
+ request: Webflow.optimize.optimizations.GoalsListRequest,
+ requestOptions?: GoalsClient.RequestOptions,
+ ): core.HttpResponsePromise {
+ return core.HttpResponsePromise.fromPromise(this.__list(optimize_id, optimization_id, request, requestOptions));
+ }
+
+ private async __list(
+ optimize_id: string,
+ optimization_id: string,
+ request: Webflow.optimize.optimizations.GoalsListRequest,
+ requestOptions?: GoalsClient.RequestOptions,
+ ): Promise> {
+ const { intervalStart, intervalEnd } = request;
+ const _queryParams: Record = {
+ intervalStart: intervalStart.toISOString(),
+ intervalEnd: intervalEnd.toISOString(),
+ };
+ const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest();
+ const _headers: core.Fetcher.Args["headers"] = mergeHeaders(
+ _authRequest.headers,
+ this._options?.headers,
+ requestOptions?.headers,
+ );
+ const _response = await core.fetcher({
+ url: core.url.join(
+ (await core.Supplier.get(this._options.baseUrl)) ??
+ ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi)
+ .base,
+ `optimize/${core.url.encodePathParam(optimize_id)}/optimizations/${core.url.encodePathParam(optimization_id)}/goals`,
+ ),
+ method: "GET",
+ headers: _headers,
+ queryParameters: { ..._queryParams, ...requestOptions?.queryParams },
+ timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000,
+ maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries,
+ abortSignal: requestOptions?.abortSignal,
+ fetchFn: this._options?.fetch,
+ logging: this._options.logging,
+ });
+ if (_response.ok) {
+ return {
+ data: serializers.OptimizationGoalsResponse.parseOrThrow(_response.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ rawResponse: _response.rawResponse,
+ };
+ }
+
+ if (_response.error.reason === "status-code") {
+ switch (_response.error.statusCode) {
+ case 400:
+ throw new Webflow.BadRequestError(_response.error.body, _response.rawResponse);
+ case 401:
+ throw new Webflow.UnauthorizedError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 403:
+ throw new Webflow.ForbiddenError(_response.error.body, _response.rawResponse);
+ case 404:
+ throw new Webflow.NotFoundError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 409:
+ throw new Webflow.ConflictError(_response.error.body, _response.rawResponse);
+ case 429:
+ throw new Webflow.TooManyRequestsError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 500:
+ throw new Webflow.InternalServerError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ default:
+ throw new errors.WebflowError({
+ statusCode: _response.error.statusCode,
+ body: _response.error.body,
+ rawResponse: _response.rawResponse,
+ });
+ }
+ }
+
+ return handleNonStatusCodeError(
+ _response.error,
+ _response.rawResponse,
+ "GET",
+ "/optimize/{optimize_id}/optimizations/{optimization_id}/goals",
+ );
+ }
+}
diff --git a/src/api/resources/optimize/resources/optimizations/resources/goals/client/index.ts b/src/api/resources/optimize/resources/optimizations/resources/goals/client/index.ts
new file mode 100644
index 00000000..415726b7
--- /dev/null
+++ b/src/api/resources/optimize/resources/optimizations/resources/goals/client/index.ts
@@ -0,0 +1 @@
+export * from "./requests";
diff --git a/src/api/resources/optimize/resources/optimizations/resources/goals/client/requests/GoalsListRequest.ts b/src/api/resources/optimize/resources/optimizations/resources/goals/client/requests/GoalsListRequest.ts
new file mode 100644
index 00000000..b0d48174
--- /dev/null
+++ b/src/api/resources/optimize/resources/optimizations/resources/goals/client/requests/GoalsListRequest.ts
@@ -0,0 +1,15 @@
+// This file was auto-generated by Fern from our API Definition.
+
+/**
+ * @example
+ * {
+ * intervalStart: new Date("2026-09-01T00:00:00.000Z"),
+ * intervalEnd: new Date("2026-09-15T00:00:00.000Z")
+ * }
+ */
+export interface GoalsListRequest {
+ /** Start of the date range. Must be a UTC timestamp ending in `Z`, such as `2026-09-01T00:00:00Z`. Offsets and date-only values aren't accepted. Seconds and milliseconds are optional. The date range must fall within a single interval of the optimization. A range that crosses from one interval into the next is rejected. Use an interval's `start` and `end` from [List Optimizations](/data/reference/optimize/list-optimizations). Unlike the report endpoints, this endpoint has no 18-month limit. */
+ intervalStart: Date;
+ /** End of the date range. Must be a UTC timestamp ending in `Z`, such as `2026-09-15T00:00:00Z`, and later than `intervalStart`. Offsets and date-only values aren't accepted. Seconds and milliseconds are optional. */
+ intervalEnd: Date;
+}
diff --git a/src/api/resources/optimize/resources/optimizations/resources/goals/client/requests/index.ts b/src/api/resources/optimize/resources/optimizations/resources/goals/client/requests/index.ts
new file mode 100644
index 00000000..d9e56b2b
--- /dev/null
+++ b/src/api/resources/optimize/resources/optimizations/resources/goals/client/requests/index.ts
@@ -0,0 +1 @@
+export type { GoalsListRequest } from "./GoalsListRequest";
diff --git a/src/api/resources/optimize/resources/optimizations/resources/goals/exports.ts b/src/api/resources/optimize/resources/optimizations/resources/goals/exports.ts
new file mode 100644
index 00000000..205ed004
--- /dev/null
+++ b/src/api/resources/optimize/resources/optimizations/resources/goals/exports.ts
@@ -0,0 +1,4 @@
+// This file was auto-generated by Fern from our API Definition.
+
+export { GoalsClient } from "./client/Client";
+export * from "./client/index";
diff --git a/src/api/resources/optimize/resources/optimizations/resources/goals/index.ts b/src/api/resources/optimize/resources/optimizations/resources/goals/index.ts
new file mode 100644
index 00000000..5ec76921
--- /dev/null
+++ b/src/api/resources/optimize/resources/optimizations/resources/goals/index.ts
@@ -0,0 +1 @@
+export * from "./client";
diff --git a/src/api/resources/optimize/resources/optimizations/resources/index.ts b/src/api/resources/optimize/resources/optimizations/resources/index.ts
new file mode 100644
index 00000000..79708cae
--- /dev/null
+++ b/src/api/resources/optimize/resources/optimizations/resources/index.ts
@@ -0,0 +1,4 @@
+export * as dimensions from "./dimensions";
+export * from "./dimensions/client/requests";
+export * as goals from "./goals";
+export * from "./goals/client/requests";
diff --git a/src/api/resources/pages/client/Client.ts b/src/api/resources/pages/client/Client.ts
index 859d08b3..43d25d8f 100644
--- a/src/api/resources/pages/client/Client.ts
+++ b/src/api/resources/pages/client/Client.ts
@@ -185,7 +185,8 @@ export class PagesClient {
*
* @example
* await client.pages.getMetadata("63c720f9347c2139b248e552", {
- * localeId: "65427cf400e02b306eaa04a0"
+ * localeId: "65427cf400e02b306eaa04a0",
+ * translatable: "65427cf400e02b306eaa04a0"
* })
*/
public getMetadata(
@@ -201,9 +202,10 @@ export class PagesClient {
request: Webflow.PagesGetMetadataRequest = {},
requestOptions?: PagesClient.RequestOptions,
): Promise> {
- const { localeId } = request;
+ const { localeId, translatable } = request;
const _queryParams: Record = {
localeId,
+ translatable,
};
const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest();
const _headers: core.Fetcher.Args["headers"] = mergeHeaders(
@@ -474,7 +476,8 @@ export class PagesClient {
* await client.pages.getContent("63c720f9347c2139b248e552", {
* localeId: "65427cf400e02b306eaa04a0",
* limit: 1,
- * offset: 1
+ * offset: 1,
+ * translatable: "65427cf400e02b306eaa04a0"
* })
*/
public getContent(
@@ -490,11 +493,12 @@ export class PagesClient {
request: Webflow.PagesGetContentRequest = {},
requestOptions?: PagesClient.RequestOptions,
): Promise> {
- const { localeId, limit, offset } = request;
+ const { localeId, limit, offset, translatable } = request;
const _queryParams: Record = {
localeId,
limit,
offset,
+ translatable,
};
const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest();
const _headers: core.Fetcher.Args["headers"] = mergeHeaders(
diff --git a/src/api/resources/pages/client/requests/PageMetadataWrite.ts b/src/api/resources/pages/client/requests/PageMetadataWrite.ts
index 6e6709e5..da750242 100644
--- a/src/api/resources/pages/client/requests/PageMetadataWrite.ts
+++ b/src/api/resources/pages/client/requests/PageMetadataWrite.ts
@@ -32,8 +32,9 @@ export interface PageMetadataWrite {
/**
* Slug for the page.
*
- *
- * **Note:** Updating slugs in secondary locales is only supported in Advanced and Enterprise localization add-on plans.
+ * **Note:** The slug field is ignored in the following cases — all other fields in the same request still apply:
+ * - The site's home page, collection template pages, and utility pages (e.g. 404, password, search).
+ * - For secondary locales, updating the slug requires an Advanced or Enterprise localization add-on plan.
*/
slug?: string;
/** SEO-related fields for the Page */
diff --git a/src/api/resources/pages/client/requests/PagesGetContentRequest.ts b/src/api/resources/pages/client/requests/PagesGetContentRequest.ts
index 3cca99e3..bbd01883 100644
--- a/src/api/resources/pages/client/requests/PagesGetContentRequest.ts
+++ b/src/api/resources/pages/client/requests/PagesGetContentRequest.ts
@@ -5,7 +5,8 @@
* {
* localeId: "65427cf400e02b306eaa04a0",
* limit: 1,
- * offset: 1
+ * offset: 1,
+ * translatable: "65427cf400e02b306eaa04a0"
* }
*/
export interface PagesGetContentRequest {
@@ -19,4 +20,18 @@ export interface PagesGetContentRequest {
limit?: number;
/** Offset used for pagination if the results have more than limit records */
offset?: number;
+ /**
+ * Unique identifier for the secondary Locale you're translating **into**. Returns only content that hasn't been excluded from translation for that locale.
+ *
+ * This is independent of `localeId`, which selects which version of the content is returned. To fetch the source text to translate, request the primary locale's content and set `translatable` to the locale you're translating into:
+ *
+ * `?localeId={primary locale id}&translatable={target locale id}`
+ *
+ * Only exclusion rules scoped to manual translation are respected — rules scoped only to automatic translation don't affect this parameter's response.
+ *
+ * Omitting `translatable` returns the same response as if this parameter didn't exist. The value must be the id of one of the site's secondary locales — the primary locale id, or any other value, returns a `400` error. Requires translation exclusions to be enabled for the site; if they aren't, the request returns a `403` error.
+ *
+ * [Learn more about localization.](/data/v2.0.0/docs/working-with-localization)
+ */
+ translatable?: string;
}
diff --git a/src/api/resources/pages/client/requests/PagesGetMetadataRequest.ts b/src/api/resources/pages/client/requests/PagesGetMetadataRequest.ts
index 3f907cb7..cc534a96 100644
--- a/src/api/resources/pages/client/requests/PagesGetMetadataRequest.ts
+++ b/src/api/resources/pages/client/requests/PagesGetMetadataRequest.ts
@@ -3,7 +3,8 @@
/**
* @example
* {
- * localeId: "65427cf400e02b306eaa04a0"
+ * localeId: "65427cf400e02b306eaa04a0",
+ * translatable: "65427cf400e02b306eaa04a0"
* }
*/
export interface PagesGetMetadataRequest {
@@ -13,4 +14,18 @@ export interface PagesGetMetadataRequest {
* [Learn more about localization.](/data/v2.0.0/docs/working-with-localization)
*/
localeId?: string;
+ /**
+ * Unique identifier for the secondary Locale you're translating **into**. Returns only content that hasn't been excluded from translation for that locale.
+ *
+ * This is independent of `localeId`, which selects which version of the content is returned. To fetch the source text to translate, request the primary locale's content and set `translatable` to the locale you're translating into:
+ *
+ * `?localeId={primary locale id}&translatable={target locale id}`
+ *
+ * Only exclusion rules scoped to manual translation are respected — rules scoped only to automatic translation don't affect this parameter's response.
+ *
+ * Omitting `translatable` returns the same response as if this parameter didn't exist. The value must be the id of one of the site's secondary locales — the primary locale id, or any other value, returns a `400` error. Requires translation exclusions to be enabled for the site; if they aren't, the request returns a `403` error.
+ *
+ * [Learn more about localization.](/data/v2.0.0/docs/working-with-localization)
+ */
+ translatable?: string;
}
diff --git a/src/api/resources/pages/resources/scripts/client/Client.ts b/src/api/resources/pages/resources/scripts/client/Client.ts
index f95d33e9..f5ef2c4f 100644
--- a/src/api/resources/pages/resources/scripts/client/Client.ts
+++ b/src/api/resources/pages/resources/scripts/client/Client.ts
@@ -26,6 +26,8 @@ export class ScriptsClient {
/**
* Get all scripts applied to a page.
*
+ * Access to this endpoint requires a bearer token obtained from an [OAuth Code Grant Flow](/data/reference/oauth-app).
+ *
* Required scope | `custom_code:read`
*
* @param {string} page_id - Unique identifier for a Page
@@ -153,6 +155,8 @@ export class ScriptsClient {
* To apply a script to a page, the script must first be registered to a Site via the [Register Script](/data/reference/custom-code/custom-code/register-hosted) endpoints. Once registered, the script can be applied to a Site or Page using the appropriate endpoints. See the documentation on [working with Custom Code](/data/docs/custom-code) for more information.
*
*
+ * Access to this endpoint requires a bearer token obtained from an [OAuth Code Grant Flow](/data/reference/oauth-app).
+ *
* Required scope | `custom_code:write`
*
* @param {string} page_id - Unique identifier for a Page
diff --git a/src/api/resources/scripts/client/Client.ts b/src/api/resources/scripts/client/Client.ts
index ae91477b..f4652e45 100644
--- a/src/api/resources/scripts/client/Client.ts
+++ b/src/api/resources/scripts/client/Client.ts
@@ -30,6 +30,8 @@ export class ScriptsClient {
* To apply a script to a site or page, the script must first be registered to a site via the [Register Script](/data/reference/custom-code/custom-code/register-hosted) endpoints. Once registered, the script can be applied to a Site or Page using the appropriate endpoints. See the documentation on [working with Custom Code](/data/docs/custom-code) for more information.
*
*
+ * Access to this endpoint requires a bearer token obtained from an [OAuth Code Grant Flow](/data/reference/oauth-app).
+ *
* Required scope | `custom_code:read`
*
* @param {string} site_id - Unique identifier for a Site
@@ -162,6 +164,8 @@ export class ScriptsClient {
* To apply a script to a site or page, the script must first be registered to a site via the [Register Script](/data/reference/custom-code/custom-code/register-hosted) endpoints. Once registered, the script can be applied to a Site or Page using the appropriate endpoints. See the documentation on [working with Custom Code](/data/docs/custom-code) for more information.
*
*
+ * Access to this endpoint requires a bearer token obtained from an [OAuth Code Grant Flow](/data/reference/oauth-app).
+ *
* Required scope | `custom_code:write`
*
* @param {string} site_id - Unique identifier for a Site
@@ -310,6 +314,8 @@ export class ScriptsClient {
* To apply a script to a site or page, the script must first be registered to a site via the [Register Script](/data/reference/custom-code/custom-code/register-hosted) endpoints. Once registered, the script can be applied to a Site or Page using the appropriate endpoints. See the documentation on [working with Custom Code](/data/docs/custom-code) for more information.
*
*
+ * Access to this endpoint requires a bearer token obtained from an [OAuth Code Grant Flow](/data/reference/oauth-app).
+ *
* Required scope | `custom_code:write`
*
* @param {string} site_id - Unique identifier for a Site
diff --git a/src/api/resources/sites/client/Client.ts b/src/api/resources/sites/client/Client.ts
index ae2ebd17..0b29596d 100644
--- a/src/api/resources/sites/client/Client.ts
+++ b/src/api/resources/sites/client/Client.ts
@@ -10,8 +10,11 @@ import * as errors from "../../../../errors/index";
import * as serializers from "../../../../serialization/index";
import * as Webflow from "../../../index";
import { ActivityLogsClient } from "../resources/activityLogs/client/Client";
+import { AeoClient } from "../resources/aeo/client/Client";
import { CommentsClient } from "../resources/comments/client/Client";
import { FormsClient } from "../resources/forms/client/Client";
+import { GoogleTagClient } from "../resources/googleTag/client/Client";
+import { MembersClient } from "../resources/members/client/Client";
import { PlansClient } from "../resources/plans/client/Client";
import { RedirectsClient } from "../resources/redirects/client/Client";
import { RobotsTxtClient } from "../resources/robotsTxt/client/Client";
@@ -33,10 +36,13 @@ export class SitesClient {
protected _plans: PlansClient | undefined;
protected _robotsTxt: RobotsTxtClient | undefined;
protected _wellKnown: WellKnownClient | undefined;
+ protected _googleTag: GoogleTagClient | undefined;
+ protected _members: MembersClient | undefined;
protected _activityLogs: ActivityLogsClient | undefined;
protected _comments: CommentsClient | undefined;
protected _scripts: ScriptsClient | undefined;
protected _forms: FormsClient | undefined;
+ protected _aeo: AeoClient | undefined;
constructor(options: SitesClient.Options) {
this._options = normalizeClientOptionsWithAuth(options);
@@ -58,6 +64,14 @@ export class SitesClient {
return (this._wellKnown ??= new WellKnownClient(this._options));
}
+ public get googleTag(): GoogleTagClient {
+ return (this._googleTag ??= new GoogleTagClient(this._options));
+ }
+
+ public get members(): MembersClient {
+ return (this._members ??= new MembersClient(this._options));
+ }
+
public get activityLogs(): ActivityLogsClient {
return (this._activityLogs ??= new ActivityLogsClient(this._options));
}
@@ -74,6 +88,10 @@ export class SitesClient {
return (this._forms ??= new FormsClient(this._options));
}
+ public get aeo(): AeoClient {
+ return (this._aeo ??= new AeoClient(this._options));
+ }
+
/**
* Create a site.
*
@@ -81,7 +99,7 @@ export class SitesClient {
*
* Required scope | `workspace:write`
*
- * @param {string} workspace_id - Unique identifier for a Workspace
+ * @param {string} workspace_id - Unique identifier for a Workspace. Find it with [List Workspaces](/data/reference/enterprise/workspace-management/list) (workspace API tokens and Data Client apps), or with `authorization.authorizedTo.workspaceIds` from [Get Authorization Info](/data/reference/token/introspect). With a site token, read `workspaceId` from [Get Site](/data/reference/sites/get).
* @param {Webflow.SitesCreateRequest} request
* @param {SitesClient.RequestOptions} requestOptions - Request-specific configuration.
*
@@ -825,12 +843,15 @@ export class SitesClient {
}
/**
- * Publishes a site to one or more more domains.
+ * Publishes a site or an individual page to one or more domains.
+ * If multiple individual pages are published to staging, publishing from staging to production publishes all staged changes.
*
* To publish to a specific custom domain, use the domain IDs from the [Get Custom Domains](/data/reference/sites/get-custom-domain) endpoint.
*
* You must include at least one of the `customDomains` or `publishToWebflowSubdomain` properties in the request body.
*
+ * To publish an individual page instead of the entire site, provide the ID of the page in the `pageId` parameter.
+ *
* This endpoint has a specific rate limit of one successful publish queue per minute.
*
* Required scope | `sites:write`
diff --git a/src/api/resources/sites/client/requests/SitesPublishRequest.ts b/src/api/resources/sites/client/requests/SitesPublishRequest.ts
index 55b7a596..1ab6b1d2 100644
--- a/src/api/resources/sites/client/requests/SitesPublishRequest.ts
+++ b/src/api/resources/sites/client/requests/SitesPublishRequest.ts
@@ -12,4 +12,6 @@ export interface SitesPublishRequest {
customDomains?: string[];
/** Choice of whether to publish to the default Webflow Subdomain */
publishToWebflowSubdomain?: boolean;
+ /** The ID of the page to publish */
+ pageId?: string;
}
diff --git a/src/api/resources/sites/resources/aeo/client/Client.ts b/src/api/resources/sites/resources/aeo/client/Client.ts
new file mode 100644
index 00000000..d525636b
--- /dev/null
+++ b/src/api/resources/sites/resources/aeo/client/Client.ts
@@ -0,0 +1,34 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type { BaseClientOptions } from "../../../../../../BaseClient";
+import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient";
+import { PromptExecutionsClient } from "../resources/promptExecutions/client/Client";
+import { PromptsClient } from "../resources/prompts/client/Client";
+import { ReportsClient } from "../resources/reports/client/Client";
+
+export declare namespace AeoClient {
+ export type Options = BaseClientOptions;
+}
+
+export class AeoClient {
+ protected readonly _options: NormalizedClientOptionsWithAuth;
+ protected _reports: ReportsClient | undefined;
+ protected _prompts: PromptsClient | undefined;
+ protected _promptExecutions: PromptExecutionsClient | undefined;
+
+ constructor(options: AeoClient.Options) {
+ this._options = normalizeClientOptionsWithAuth(options);
+ }
+
+ public get reports(): ReportsClient {
+ return (this._reports ??= new ReportsClient(this._options));
+ }
+
+ public get prompts(): PromptsClient {
+ return (this._prompts ??= new PromptsClient(this._options));
+ }
+
+ public get promptExecutions(): PromptExecutionsClient {
+ return (this._promptExecutions ??= new PromptExecutionsClient(this._options));
+ }
+}
diff --git a/src/api/resources/sites/resources/aeo/client/index.ts b/src/api/resources/sites/resources/aeo/client/index.ts
new file mode 100644
index 00000000..cb0ff5c3
--- /dev/null
+++ b/src/api/resources/sites/resources/aeo/client/index.ts
@@ -0,0 +1 @@
+export {};
diff --git a/src/api/resources/sites/resources/aeo/exports.ts b/src/api/resources/sites/resources/aeo/exports.ts
new file mode 100644
index 00000000..534416b9
--- /dev/null
+++ b/src/api/resources/sites/resources/aeo/exports.ts
@@ -0,0 +1,5 @@
+// This file was auto-generated by Fern from our API Definition.
+
+export { AeoClient } from "./client/Client";
+export * from "./client/index";
+export * from "./resources/index";
diff --git a/src/api/resources/sites/resources/aeo/index.ts b/src/api/resources/sites/resources/aeo/index.ts
new file mode 100644
index 00000000..33a87f10
--- /dev/null
+++ b/src/api/resources/sites/resources/aeo/index.ts
@@ -0,0 +1,2 @@
+export * from "./client";
+export * from "./resources";
diff --git a/src/api/resources/sites/resources/aeo/resources/index.ts b/src/api/resources/sites/resources/aeo/resources/index.ts
new file mode 100644
index 00000000..081371c8
--- /dev/null
+++ b/src/api/resources/sites/resources/aeo/resources/index.ts
@@ -0,0 +1,8 @@
+export * as promptExecutions from "./promptExecutions";
+export * from "./promptExecutions/client/requests";
+export * as prompts from "./prompts";
+export * from "./prompts/client/requests";
+export * from "./prompts/types";
+export * as reports from "./reports";
+export * from "./reports/client/requests";
+export * from "./reports/types";
diff --git a/src/api/resources/sites/resources/aeo/resources/promptExecutions/client/Client.ts b/src/api/resources/sites/resources/aeo/resources/promptExecutions/client/Client.ts
new file mode 100644
index 00000000..66392b07
--- /dev/null
+++ b/src/api/resources/sites/resources/aeo/resources/promptExecutions/client/Client.ts
@@ -0,0 +1,336 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../../../BaseClient";
+import {
+ type NormalizedClientOptionsWithAuth,
+ normalizeClientOptionsWithAuth,
+} from "../../../../../../../../BaseClient";
+import * as core from "../../../../../../../../core";
+import { mergeHeaders } from "../../../../../../../../core/headers";
+import * as environments from "../../../../../../../../environments";
+import { handleNonStatusCodeError } from "../../../../../../../../errors/handleNonStatusCodeError";
+import * as errors from "../../../../../../../../errors/index";
+import * as serializers from "../../../../../../../../serialization/index";
+import * as Webflow from "../../../../../../../index";
+
+export declare namespace PromptExecutionsClient {
+ export type Options = BaseClientOptions;
+
+ export interface RequestOptions extends BaseRequestOptions {}
+}
+
+export class PromptExecutionsClient {
+ protected readonly _options: NormalizedClientOptionsWithAuth;
+
+ constructor(options: PromptExecutionsClient.Options) {
+ this._options = normalizeClientOptionsWithAuth(options);
+ }
+
+ /**
+ * Lists answer engine responses to the site's prompts, newest first, with the mentions and citations in each. Covers the last 90 days unless you set a time range.
+ *
+ * Executions older than 90 days aren't listed. Results are sorted by `createdAt`, newest first. To get the next page, pass `nextCursor` as `cursor`.
+ *
+ * This endpoint requires a site or workspace with the AEO analytics entitlement, and Webflow AI must be enabled for the workspace.
+ *
+ * Each access token can have one AEO request in flight at a time, across all AEO Analytics endpoints. Additional concurrent requests return `429 Too Many Requests`. Wait for your in-flight request to finish, or for the `Retry-After` interval, then retry.
+ *
+ * Required scope | `sites:read`
+ *
+ * @param {string} site_id - Unique identifier for a Site
+ * @param {Webflow.sites.aeo.PromptExecutionsListRequest} request
+ * @param {PromptExecutionsClient.RequestOptions} requestOptions - Request-specific configuration.
+ *
+ * @throws {@link Webflow.BadRequestError}
+ * @throws {@link Webflow.UnauthorizedError}
+ * @throws {@link Webflow.ForbiddenError}
+ * @throws {@link Webflow.NotFoundError}
+ * @throws {@link Webflow.TooManyRequestsError}
+ * @throws {@link Webflow.InternalServerError}
+ *
+ * @example
+ * await client.sites.aeo.promptExecutions.list("580e63e98c9a982ac9b8b741", {
+ * promptId: "68cdb4b5a699862fcd8c1a01",
+ * topicId: "68cdb4b5a699862fcd8c1a02",
+ * answerEngine: "chat-gpt",
+ * startTime: new Date("2026-09-01T00:00:00.000Z"),
+ * endTime: new Date("2026-10-01T00:00:00.000Z"),
+ * includeRawResponse: true,
+ * limit: 1,
+ * cursor: "cursor"
+ * })
+ */
+ public list(
+ site_id: string,
+ request: Webflow.sites.aeo.PromptExecutionsListRequest = {},
+ requestOptions?: PromptExecutionsClient.RequestOptions,
+ ): core.HttpResponsePromise {
+ return core.HttpResponsePromise.fromPromise(this.__list(site_id, request, requestOptions));
+ }
+
+ private async __list(
+ site_id: string,
+ request: Webflow.sites.aeo.PromptExecutionsListRequest = {},
+ requestOptions?: PromptExecutionsClient.RequestOptions,
+ ): Promise> {
+ const { promptId, topicId, answerEngine, startTime, endTime, includeRawResponse, limit, cursor } = request;
+ const _queryParams: Record = {
+ promptId,
+ topicId,
+ answerEngine:
+ answerEngine != null
+ ? serializers.AeoAnswerEngineKey.jsonOrThrow(answerEngine, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ omitUndefined: true,
+ })
+ : undefined,
+ startTime: startTime != null ? startTime?.toISOString() : undefined,
+ endTime: endTime != null ? endTime?.toISOString() : undefined,
+ includeRawResponse,
+ limit,
+ cursor,
+ };
+ const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest();
+ const _headers: core.Fetcher.Args["headers"] = mergeHeaders(
+ _authRequest.headers,
+ this._options?.headers,
+ requestOptions?.headers,
+ );
+ const _response = await core.fetcher({
+ url: core.url.join(
+ (await core.Supplier.get(this._options.baseUrl)) ??
+ ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi)
+ .base,
+ `sites/${core.url.encodePathParam(site_id)}/aeo/prompt_executions`,
+ ),
+ method: "GET",
+ headers: _headers,
+ queryParameters: { ..._queryParams, ...requestOptions?.queryParams },
+ timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000,
+ maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries,
+ abortSignal: requestOptions?.abortSignal,
+ fetchFn: this._options?.fetch,
+ logging: this._options.logging,
+ });
+ if (_response.ok) {
+ return {
+ data: serializers.AeoPromptExecutionListResponse.parseOrThrow(_response.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ rawResponse: _response.rawResponse,
+ };
+ }
+
+ if (_response.error.reason === "status-code") {
+ switch (_response.error.statusCode) {
+ case 400:
+ throw new Webflow.BadRequestError(_response.error.body, _response.rawResponse);
+ case 401:
+ throw new Webflow.UnauthorizedError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 403:
+ throw new Webflow.ForbiddenError(_response.error.body, _response.rawResponse);
+ case 404:
+ throw new Webflow.NotFoundError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 429:
+ throw new Webflow.TooManyRequestsError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 500:
+ throw new Webflow.InternalServerError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ default:
+ throw new errors.WebflowError({
+ statusCode: _response.error.statusCode,
+ body: _response.error.body,
+ rawResponse: _response.rawResponse,
+ });
+ }
+ }
+
+ return handleNonStatusCodeError(
+ _response.error,
+ _response.rawResponse,
+ "GET",
+ "/sites/{site_id}/aeo/prompt_executions",
+ );
+ }
+
+ /**
+ * Returns one prompt execution, including the full response text while it's still stored.
+ *
+ * Executions older than 90 days are returned without `rawResponse`. Executions are deleted 120 days after they're created. This endpoint takes no query parameters.
+ *
+ * This endpoint requires a site or workspace with the AEO analytics entitlement, and Webflow AI must be enabled for the workspace.
+ *
+ * Each access token can have one AEO request in flight at a time, across all AEO Analytics endpoints. Additional concurrent requests return `429 Too Many Requests`. Wait for your in-flight request to finish, or for the `Retry-After` interval, then retry.
+ *
+ * Required scope | `sites:read`
+ *
+ * @param {string} site_id - Unique identifier for a Site
+ * @param {string} execution_id - The prompt execution ID, from [List Prompt Executions](/data/reference/aeo-analytics/list-prompt-executions).
+ * @param {PromptExecutionsClient.RequestOptions} requestOptions - Request-specific configuration.
+ *
+ * @throws {@link Webflow.BadRequestError}
+ * @throws {@link Webflow.UnauthorizedError}
+ * @throws {@link Webflow.ForbiddenError}
+ * @throws {@link Webflow.NotFoundError}
+ * @throws {@link Webflow.TooManyRequestsError}
+ * @throws {@link Webflow.InternalServerError}
+ *
+ * @example
+ * await client.sites.aeo.promptExecutions.get("580e63e98c9a982ac9b8b741", "68cdb4b5a699862fcd8c1a10")
+ */
+ public get(
+ site_id: string,
+ execution_id: string,
+ requestOptions?: PromptExecutionsClient.RequestOptions,
+ ): core.HttpResponsePromise {
+ return core.HttpResponsePromise.fromPromise(this.__get(site_id, execution_id, requestOptions));
+ }
+
+ private async __get(
+ site_id: string,
+ execution_id: string,
+ requestOptions?: PromptExecutionsClient.RequestOptions,
+ ): Promise> {
+ const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest();
+ const _headers: core.Fetcher.Args["headers"] = mergeHeaders(
+ _authRequest.headers,
+ this._options?.headers,
+ requestOptions?.headers,
+ );
+ const _response = await core.fetcher({
+ url: core.url.join(
+ (await core.Supplier.get(this._options.baseUrl)) ??
+ ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi)
+ .base,
+ `sites/${core.url.encodePathParam(site_id)}/aeo/prompt_executions/${core.url.encodePathParam(execution_id)}`,
+ ),
+ method: "GET",
+ headers: _headers,
+ queryParameters: requestOptions?.queryParams,
+ timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000,
+ maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries,
+ abortSignal: requestOptions?.abortSignal,
+ fetchFn: this._options?.fetch,
+ logging: this._options.logging,
+ });
+ if (_response.ok) {
+ return {
+ data: serializers.AeoPromptExecution.parseOrThrow(_response.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ rawResponse: _response.rawResponse,
+ };
+ }
+
+ if (_response.error.reason === "status-code") {
+ switch (_response.error.statusCode) {
+ case 400:
+ throw new Webflow.BadRequestError(_response.error.body, _response.rawResponse);
+ case 401:
+ throw new Webflow.UnauthorizedError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 403:
+ throw new Webflow.ForbiddenError(_response.error.body, _response.rawResponse);
+ case 404:
+ throw new Webflow.NotFoundError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 429:
+ throw new Webflow.TooManyRequestsError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 500:
+ throw new Webflow.InternalServerError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ default:
+ throw new errors.WebflowError({
+ statusCode: _response.error.statusCode,
+ body: _response.error.body,
+ rawResponse: _response.rawResponse,
+ });
+ }
+ }
+
+ return handleNonStatusCodeError(
+ _response.error,
+ _response.rawResponse,
+ "GET",
+ "/sites/{site_id}/aeo/prompt_executions/{execution_id}",
+ );
+ }
+}
diff --git a/src/api/resources/sites/resources/aeo/resources/promptExecutions/client/index.ts b/src/api/resources/sites/resources/aeo/resources/promptExecutions/client/index.ts
new file mode 100644
index 00000000..415726b7
--- /dev/null
+++ b/src/api/resources/sites/resources/aeo/resources/promptExecutions/client/index.ts
@@ -0,0 +1 @@
+export * from "./requests";
diff --git a/src/api/resources/sites/resources/aeo/resources/promptExecutions/client/requests/PromptExecutionsListRequest.ts b/src/api/resources/sites/resources/aeo/resources/promptExecutions/client/requests/PromptExecutionsListRequest.ts
new file mode 100644
index 00000000..eb2ef7ac
--- /dev/null
+++ b/src/api/resources/sites/resources/aeo/resources/promptExecutions/client/requests/PromptExecutionsListRequest.ts
@@ -0,0 +1,35 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../../../../../../../index";
+
+/**
+ * @example
+ * {
+ * promptId: "68cdb4b5a699862fcd8c1a01",
+ * topicId: "68cdb4b5a699862fcd8c1a02",
+ * answerEngine: "chat-gpt",
+ * startTime: new Date("2026-09-01T00:00:00.000Z"),
+ * endTime: new Date("2026-10-01T00:00:00.000Z"),
+ * includeRawResponse: true,
+ * limit: 1,
+ * cursor: "cursor"
+ * }
+ */
+export interface PromptExecutionsListRequest {
+ /** Include only executions of this prompt. Can't be sent with `topicId`. */
+ promptId?: string;
+ /** Include only executions of prompts in this topic. Can't be sent with `promptId`. */
+ topicId?: string;
+ /** Include only responses from this answer engine. */
+ answerEngine?: Webflow.AeoAnswerEngineKey;
+ /** Include only executions created at or after this time. Must be a UTC timestamp ending in `Z`. Defaults to 90 days before `endTime`. */
+ startTime?: Date;
+ /** Include only executions created before this time. Must be a UTC timestamp ending in `Z`. Defaults to now. The range can be at most 90 days. */
+ endTime?: Date;
+ /** Set to `true` to include each execution's full response text in `rawResponse`. */
+ includeRawResponse?: boolean;
+ /** Maximum number of executions to return. Defaults to `25`, which is also the maximum. */
+ limit?: number;
+ /** The `nextCursor` from the previous page. */
+ cursor?: string;
+}
diff --git a/src/api/resources/sites/resources/aeo/resources/promptExecutions/client/requests/index.ts b/src/api/resources/sites/resources/aeo/resources/promptExecutions/client/requests/index.ts
new file mode 100644
index 00000000..a8ab01f6
--- /dev/null
+++ b/src/api/resources/sites/resources/aeo/resources/promptExecutions/client/requests/index.ts
@@ -0,0 +1 @@
+export type { PromptExecutionsListRequest } from "./PromptExecutionsListRequest";
diff --git a/src/api/resources/sites/resources/aeo/resources/promptExecutions/exports.ts b/src/api/resources/sites/resources/aeo/resources/promptExecutions/exports.ts
new file mode 100644
index 00000000..ffb2e01a
--- /dev/null
+++ b/src/api/resources/sites/resources/aeo/resources/promptExecutions/exports.ts
@@ -0,0 +1,4 @@
+// This file was auto-generated by Fern from our API Definition.
+
+export { PromptExecutionsClient } from "./client/Client";
+export * from "./client/index";
diff --git a/src/api/resources/sites/resources/aeo/resources/promptExecutions/index.ts b/src/api/resources/sites/resources/aeo/resources/promptExecutions/index.ts
new file mode 100644
index 00000000..5ec76921
--- /dev/null
+++ b/src/api/resources/sites/resources/aeo/resources/promptExecutions/index.ts
@@ -0,0 +1 @@
+export * from "./client";
diff --git a/src/api/resources/sites/resources/aeo/resources/prompts/client/Client.ts b/src/api/resources/sites/resources/aeo/resources/prompts/client/Client.ts
new file mode 100644
index 00000000..1fe54f60
--- /dev/null
+++ b/src/api/resources/sites/resources/aeo/resources/prompts/client/Client.ts
@@ -0,0 +1,183 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../../../BaseClient";
+import {
+ type NormalizedClientOptionsWithAuth,
+ normalizeClientOptionsWithAuth,
+} from "../../../../../../../../BaseClient";
+import * as core from "../../../../../../../../core";
+import { mergeHeaders } from "../../../../../../../../core/headers";
+import * as environments from "../../../../../../../../environments";
+import { handleNonStatusCodeError } from "../../../../../../../../errors/handleNonStatusCodeError";
+import * as errors from "../../../../../../../../errors/index";
+import * as serializers from "../../../../../../../../serialization/index";
+import * as Webflow from "../../../../../../../index";
+
+export declare namespace PromptsClient {
+ export type Options = BaseClientOptions;
+
+ export interface RequestOptions extends BaseRequestOptions {}
+}
+
+export class PromptsClient {
+ protected readonly _options: NormalizedClientOptionsWithAuth;
+
+ constructor(options: PromptsClient.Options) {
+ this._options = normalizeClientOptionsWithAuth(options);
+ }
+
+ /**
+ * Lists the site's tracked prompts, with each prompt's topic and status. By default, returns `active`, `paused`, and `pending` prompts. To include archived prompts, set `status` to `archived` or `all`.
+ *
+ * Results are sorted by `createdAt`, newest first. To get the next page, pass `nextCursor` as `cursor`.
+ *
+ * This endpoint requires a site or workspace with the AEO analytics entitlement, and Webflow AI must be enabled for the workspace.
+ *
+ * Each access token can have one AEO request in flight at a time, across all AEO Analytics endpoints. Additional concurrent requests return `429 Too Many Requests`. Wait for your in-flight request to finish, or for the `Retry-After` interval, then retry.
+ *
+ * Required scope | `sites:read`
+ *
+ * @param {string} site_id - Unique identifier for a Site
+ * @param {Webflow.sites.aeo.PromptsListRequest} request
+ * @param {PromptsClient.RequestOptions} requestOptions - Request-specific configuration.
+ *
+ * @throws {@link Webflow.BadRequestError}
+ * @throws {@link Webflow.UnauthorizedError}
+ * @throws {@link Webflow.ForbiddenError}
+ * @throws {@link Webflow.NotFoundError}
+ * @throws {@link Webflow.TooManyRequestsError}
+ * @throws {@link Webflow.InternalServerError}
+ *
+ * @example
+ * await client.sites.aeo.prompts.list("580e63e98c9a982ac9b8b741", {
+ * topicId: "68cdb4b5a699862fcd8c1a02",
+ * status: "active",
+ * limit: 1,
+ * cursor: "cursor"
+ * })
+ */
+ public list(
+ site_id: string,
+ request: Webflow.sites.aeo.PromptsListRequest = {},
+ requestOptions?: PromptsClient.RequestOptions,
+ ): core.HttpResponsePromise {
+ return core.HttpResponsePromise.fromPromise(this.__list(site_id, request, requestOptions));
+ }
+
+ private async __list(
+ site_id: string,
+ request: Webflow.sites.aeo.PromptsListRequest = {},
+ requestOptions?: PromptsClient.RequestOptions,
+ ): Promise> {
+ const { topicId, status, limit, cursor } = request;
+ const _queryParams: Record = {
+ topicId,
+ status:
+ status != null
+ ? serializers.sites.aeo.PromptsListRequestStatus.jsonOrThrow(status, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ omitUndefined: true,
+ })
+ : undefined,
+ limit,
+ cursor,
+ };
+ const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest();
+ const _headers: core.Fetcher.Args["headers"] = mergeHeaders(
+ _authRequest.headers,
+ this._options?.headers,
+ requestOptions?.headers,
+ );
+ const _response = await core.fetcher({
+ url: core.url.join(
+ (await core.Supplier.get(this._options.baseUrl)) ??
+ ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi)
+ .base,
+ `sites/${core.url.encodePathParam(site_id)}/aeo/prompts`,
+ ),
+ method: "GET",
+ headers: _headers,
+ queryParameters: { ..._queryParams, ...requestOptions?.queryParams },
+ timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000,
+ maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries,
+ abortSignal: requestOptions?.abortSignal,
+ fetchFn: this._options?.fetch,
+ logging: this._options.logging,
+ });
+ if (_response.ok) {
+ return {
+ data: serializers.AeoPromptListResponse.parseOrThrow(_response.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ rawResponse: _response.rawResponse,
+ };
+ }
+
+ if (_response.error.reason === "status-code") {
+ switch (_response.error.statusCode) {
+ case 400:
+ throw new Webflow.BadRequestError(_response.error.body, _response.rawResponse);
+ case 401:
+ throw new Webflow.UnauthorizedError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 403:
+ throw new Webflow.ForbiddenError(_response.error.body, _response.rawResponse);
+ case 404:
+ throw new Webflow.NotFoundError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 429:
+ throw new Webflow.TooManyRequestsError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 500:
+ throw new Webflow.InternalServerError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ default:
+ throw new errors.WebflowError({
+ statusCode: _response.error.statusCode,
+ body: _response.error.body,
+ rawResponse: _response.rawResponse,
+ });
+ }
+ }
+
+ return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/sites/{site_id}/aeo/prompts");
+ }
+}
diff --git a/src/api/resources/sites/resources/aeo/resources/prompts/client/index.ts b/src/api/resources/sites/resources/aeo/resources/prompts/client/index.ts
new file mode 100644
index 00000000..415726b7
--- /dev/null
+++ b/src/api/resources/sites/resources/aeo/resources/prompts/client/index.ts
@@ -0,0 +1 @@
+export * from "./requests";
diff --git a/src/api/resources/sites/resources/aeo/resources/prompts/client/requests/PromptsListRequest.ts b/src/api/resources/sites/resources/aeo/resources/prompts/client/requests/PromptsListRequest.ts
new file mode 100644
index 00000000..41806743
--- /dev/null
+++ b/src/api/resources/sites/resources/aeo/resources/prompts/client/requests/PromptsListRequest.ts
@@ -0,0 +1,23 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../../../../../../../index";
+
+/**
+ * @example
+ * {
+ * topicId: "68cdb4b5a699862fcd8c1a02",
+ * status: "active",
+ * limit: 1,
+ * cursor: "cursor"
+ * }
+ */
+export interface PromptsListRequest {
+ /** Include only prompts in this topic. A topic that isn't on this site returns no prompts. */
+ topicId?: string;
+ /** Include only prompts with this status. `all` includes every status. Omit it to include `active`, `paused`, and `pending` prompts. */
+ status?: Webflow.sites.aeo.PromptsListRequestStatus;
+ /** Maximum number of prompts to return. Defaults to `50`, up to a maximum of `100`. */
+ limit?: number;
+ /** The `nextCursor` from the previous page. */
+ cursor?: string;
+}
diff --git a/src/api/resources/sites/resources/aeo/resources/prompts/client/requests/index.ts b/src/api/resources/sites/resources/aeo/resources/prompts/client/requests/index.ts
new file mode 100644
index 00000000..789ce998
--- /dev/null
+++ b/src/api/resources/sites/resources/aeo/resources/prompts/client/requests/index.ts
@@ -0,0 +1 @@
+export type { PromptsListRequest } from "./PromptsListRequest";
diff --git a/src/api/resources/sites/resources/aeo/resources/prompts/exports.ts b/src/api/resources/sites/resources/aeo/resources/prompts/exports.ts
new file mode 100644
index 00000000..067b8b73
--- /dev/null
+++ b/src/api/resources/sites/resources/aeo/resources/prompts/exports.ts
@@ -0,0 +1,4 @@
+// This file was auto-generated by Fern from our API Definition.
+
+export { PromptsClient } from "./client/Client";
+export * from "./client/index";
diff --git a/src/api/resources/sites/resources/aeo/resources/prompts/index.ts b/src/api/resources/sites/resources/aeo/resources/prompts/index.ts
new file mode 100644
index 00000000..d2ec2302
--- /dev/null
+++ b/src/api/resources/sites/resources/aeo/resources/prompts/index.ts
@@ -0,0 +1,2 @@
+export * from "./client";
+export * from "./types";
diff --git a/src/api/resources/sites/resources/aeo/resources/prompts/types/PromptsListRequestStatus.ts b/src/api/resources/sites/resources/aeo/resources/prompts/types/PromptsListRequestStatus.ts
new file mode 100644
index 00000000..5f435dc1
--- /dev/null
+++ b/src/api/resources/sites/resources/aeo/resources/prompts/types/PromptsListRequestStatus.ts
@@ -0,0 +1,10 @@
+// This file was auto-generated by Fern from our API Definition.
+
+export const PromptsListRequestStatus = {
+ Active: "active",
+ Paused: "paused",
+ Pending: "pending",
+ Archived: "archived",
+ All: "all",
+} as const;
+export type PromptsListRequestStatus = (typeof PromptsListRequestStatus)[keyof typeof PromptsListRequestStatus];
diff --git a/src/api/resources/sites/resources/aeo/resources/prompts/types/index.ts b/src/api/resources/sites/resources/aeo/resources/prompts/types/index.ts
new file mode 100644
index 00000000..8b13890e
--- /dev/null
+++ b/src/api/resources/sites/resources/aeo/resources/prompts/types/index.ts
@@ -0,0 +1 @@
+export * from "./PromptsListRequestStatus";
diff --git a/src/api/resources/sites/resources/aeo/resources/reports/client/Client.ts b/src/api/resources/sites/resources/aeo/resources/reports/client/Client.ts
new file mode 100644
index 00000000..94e41a6f
--- /dev/null
+++ b/src/api/resources/sites/resources/aeo/resources/reports/client/Client.ts
@@ -0,0 +1,1760 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../../../BaseClient";
+import {
+ type NormalizedClientOptionsWithAuth,
+ normalizeClientOptionsWithAuth,
+} from "../../../../../../../../BaseClient";
+import * as core from "../../../../../../../../core";
+import { mergeHeaders } from "../../../../../../../../core/headers";
+import * as environments from "../../../../../../../../environments";
+import { handleNonStatusCodeError } from "../../../../../../../../errors/handleNonStatusCodeError";
+import * as errors from "../../../../../../../../errors/index";
+import * as serializers from "../../../../../../../../serialization/index";
+import * as Webflow from "../../../../../../../index";
+
+export declare namespace ReportsClient {
+ export type Options = BaseClientOptions;
+
+ export interface RequestOptions extends BaseRequestOptions {}
+}
+
+export class ReportsClient {
+ protected readonly _options: NormalizedClientOptionsWithAuth;
+
+ constructor(options: ReportsClient.Options) {
+ this._options = normalizeClientOptionsWithAuth(options);
+ }
+
+ /**
+ * Returns the total number of requests made to the site by the AI bots Webflow tracks, over a time range. This counts bot requests, not visitors or page views. For visitor traffic, use the [Analyze API](/data/docs/working-with-analyze). Filter by bot provider or bot category.
+ *
+ * Counts successful requests (HTTP `200` or `304`). Bot providers combine with OR, and `botCategory` narrows them further.
+ *
+ * This endpoint requires a site or workspace with the AEO analytics entitlement.
+ *
+ * Each access token can have one AEO request in flight at a time, across all AEO Analytics endpoints. Additional concurrent requests return `429 Too Many Requests`. Wait for your in-flight request to finish, or for the `Retry-After` interval, then retry.
+ *
+ * Required scope | `sites:read`
+ *
+ * @param {string} site_id - Unique identifier for a Site
+ * @param {Webflow.sites.aeo.ReportsBotTrafficRequest} request
+ * @param {ReportsClient.RequestOptions} requestOptions - Request-specific configuration.
+ *
+ * @throws {@link Webflow.BadRequestError}
+ * @throws {@link Webflow.UnauthorizedError}
+ * @throws {@link Webflow.ForbiddenError}
+ * @throws {@link Webflow.NotFoundError}
+ * @throws {@link Webflow.TooManyRequestsError}
+ * @throws {@link Webflow.InternalServerError}
+ *
+ * @example
+ * await client.sites.aeo.reports.botTraffic("580e63e98c9a982ac9b8b741", {
+ * startTime: new Date("2026-09-01T00:00:00.000Z"),
+ * endTime: new Date("2026-09-08T00:00:00.000Z"),
+ * botProviders: ["openai"],
+ * botCategory: "agent"
+ * })
+ */
+ public botTraffic(
+ site_id: string,
+ request: Webflow.sites.aeo.ReportsBotTrafficRequest,
+ requestOptions?: ReportsClient.RequestOptions,
+ ): core.HttpResponsePromise {
+ return core.HttpResponsePromise.fromPromise(this.__botTraffic(site_id, request, requestOptions));
+ }
+
+ private async __botTraffic(
+ site_id: string,
+ request: Webflow.sites.aeo.ReportsBotTrafficRequest,
+ requestOptions?: ReportsClient.RequestOptions,
+ ): Promise> {
+ const { startTime, endTime, botProviders, botCategory } = request;
+ const _queryParams: Record = {
+ startTime: startTime.toISOString(),
+ endTime: endTime.toISOString(),
+ botProviders: Array.isArray(botProviders)
+ ? botProviders.map((item) =>
+ serializers.AeoBotProvider.jsonOrThrow(item, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ omitUndefined: true,
+ }),
+ )
+ : botProviders != null
+ ? serializers.AeoBotProvider.jsonOrThrow(botProviders, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ omitUndefined: true,
+ })
+ : undefined,
+ botCategory:
+ botCategory != null
+ ? serializers.AeoBotCategory.jsonOrThrow(botCategory, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ omitUndefined: true,
+ })
+ : undefined,
+ };
+ const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest();
+ const _headers: core.Fetcher.Args["headers"] = mergeHeaders(
+ _authRequest.headers,
+ this._options?.headers,
+ requestOptions?.headers,
+ );
+ const _response = await core.fetcher({
+ url: core.url.join(
+ (await core.Supplier.get(this._options.baseUrl)) ??
+ ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi)
+ .base,
+ `sites/${core.url.encodePathParam(site_id)}/aeo/reports/bot_traffic`,
+ ),
+ method: "GET",
+ headers: _headers,
+ queryParameters: { ..._queryParams, ...requestOptions?.queryParams },
+ timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000,
+ maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries,
+ abortSignal: requestOptions?.abortSignal,
+ fetchFn: this._options?.fetch,
+ logging: this._options.logging,
+ });
+ if (_response.ok) {
+ return {
+ data: serializers.AeoBotTrafficResponse.parseOrThrow(_response.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ rawResponse: _response.rawResponse,
+ };
+ }
+
+ if (_response.error.reason === "status-code") {
+ switch (_response.error.statusCode) {
+ case 400:
+ throw new Webflow.BadRequestError(_response.error.body, _response.rawResponse);
+ case 401:
+ throw new Webflow.UnauthorizedError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 403:
+ throw new Webflow.ForbiddenError(_response.error.body, _response.rawResponse);
+ case 404:
+ throw new Webflow.NotFoundError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 429:
+ throw new Webflow.TooManyRequestsError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 500:
+ throw new Webflow.InternalServerError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ default:
+ throw new errors.WebflowError({
+ statusCode: _response.error.statusCode,
+ body: _response.error.body,
+ rawResponse: _response.rawResponse,
+ });
+ }
+ }
+
+ return handleNonStatusCodeError(
+ _response.error,
+ _response.rawResponse,
+ "GET",
+ "/sites/{site_id}/aeo/reports/bot_traffic",
+ );
+ }
+
+ /**
+ * Returns the pages and files that the AI bots Webflow tracks requested most over a time range, with each one's request count.
+ *
+ * Results are sorted by `requestCount`, highest first, and aren't paginated. Each row is one combination of page, CMS item, and request path, so a page can appear more than once.
+ *
+ * This endpoint requires a site or workspace with the AEO analytics entitlement.
+ *
+ * Each access token can have one AEO request in flight at a time, across all AEO Analytics endpoints. Additional concurrent requests return `429 Too Many Requests`. Wait for your in-flight request to finish, or for the `Retry-After` interval, then retry.
+ *
+ * Required scope | `sites:read`
+ *
+ * @param {string} site_id - Unique identifier for a Site
+ * @param {Webflow.sites.aeo.ReportsBotTrafficPagesRequest} request
+ * @param {ReportsClient.RequestOptions} requestOptions - Request-specific configuration.
+ *
+ * @throws {@link Webflow.BadRequestError}
+ * @throws {@link Webflow.UnauthorizedError}
+ * @throws {@link Webflow.ForbiddenError}
+ * @throws {@link Webflow.NotFoundError}
+ * @throws {@link Webflow.TooManyRequestsError}
+ * @throws {@link Webflow.InternalServerError}
+ *
+ * @example
+ * await client.sites.aeo.reports.botTrafficPages("580e63e98c9a982ac9b8b741", {
+ * startTime: new Date("2026-09-01T00:00:00.000Z"),
+ * endTime: new Date("2026-09-08T00:00:00.000Z"),
+ * botProviders: ["openai"],
+ * botCategory: "agent",
+ * limit: 1
+ * })
+ */
+ public botTrafficPages(
+ site_id: string,
+ request: Webflow.sites.aeo.ReportsBotTrafficPagesRequest,
+ requestOptions?: ReportsClient.RequestOptions,
+ ): core.HttpResponsePromise {
+ return core.HttpResponsePromise.fromPromise(this.__botTrafficPages(site_id, request, requestOptions));
+ }
+
+ private async __botTrafficPages(
+ site_id: string,
+ request: Webflow.sites.aeo.ReportsBotTrafficPagesRequest,
+ requestOptions?: ReportsClient.RequestOptions,
+ ): Promise> {
+ const { startTime, endTime, botProviders, botCategory, limit } = request;
+ const _queryParams: Record = {
+ startTime: startTime.toISOString(),
+ endTime: endTime.toISOString(),
+ botProviders: Array.isArray(botProviders)
+ ? botProviders.map((item) =>
+ serializers.AeoBotProvider.jsonOrThrow(item, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ omitUndefined: true,
+ }),
+ )
+ : botProviders != null
+ ? serializers.AeoBotProvider.jsonOrThrow(botProviders, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ omitUndefined: true,
+ })
+ : undefined,
+ botCategory:
+ botCategory != null
+ ? serializers.AeoBotCategory.jsonOrThrow(botCategory, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ omitUndefined: true,
+ })
+ : undefined,
+ limit,
+ };
+ const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest();
+ const _headers: core.Fetcher.Args["headers"] = mergeHeaders(
+ _authRequest.headers,
+ this._options?.headers,
+ requestOptions?.headers,
+ );
+ const _response = await core.fetcher({
+ url: core.url.join(
+ (await core.Supplier.get(this._options.baseUrl)) ??
+ ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi)
+ .base,
+ `sites/${core.url.encodePathParam(site_id)}/aeo/reports/bot_traffic_pages`,
+ ),
+ method: "GET",
+ headers: _headers,
+ queryParameters: { ..._queryParams, ...requestOptions?.queryParams },
+ timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000,
+ maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries,
+ abortSignal: requestOptions?.abortSignal,
+ fetchFn: this._options?.fetch,
+ logging: this._options.logging,
+ });
+ if (_response.ok) {
+ return {
+ data: serializers.AeoBotTrafficPagesResponse.parseOrThrow(_response.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ rawResponse: _response.rawResponse,
+ };
+ }
+
+ if (_response.error.reason === "status-code") {
+ switch (_response.error.statusCode) {
+ case 400:
+ throw new Webflow.BadRequestError(_response.error.body, _response.rawResponse);
+ case 401:
+ throw new Webflow.UnauthorizedError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 403:
+ throw new Webflow.ForbiddenError(_response.error.body, _response.rawResponse);
+ case 404:
+ throw new Webflow.NotFoundError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 429:
+ throw new Webflow.TooManyRequestsError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 500:
+ throw new Webflow.InternalServerError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ default:
+ throw new errors.WebflowError({
+ statusCode: _response.error.statusCode,
+ body: _response.error.body,
+ rawResponse: _response.rawResponse,
+ });
+ }
+ }
+
+ return handleNonStatusCodeError(
+ _response.error,
+ _response.rawResponse,
+ "GET",
+ "/sites/{site_id}/aeo/reports/bot_traffic_pages",
+ );
+ }
+
+ /**
+ * Returns the share of answer engine responses that mention your organization, for a time range or as a daily or weekly series.
+ *
+ * Without `timeseries`, returns one score for the whole time range. With `timeseries`, returns one score per day or week. Separate filters combine with AND, and values within one filter combine with OR. Requires an organization name in the site's Organization info.
+ *
+ * This endpoint requires a site or workspace with the AEO analytics entitlement, and Webflow AI must be enabled for the workspace.
+ *
+ * Each access token can have one AEO request in flight at a time, across all AEO Analytics endpoints. Additional concurrent requests return `429 Too Many Requests`. Wait for your in-flight request to finish, or for the `Retry-After` interval, then retry.
+ *
+ * Required scope | `sites:read`
+ *
+ * @param {string} site_id - Unique identifier for a Site
+ * @param {Webflow.sites.aeo.ReportsVisibilityRequest} request
+ * @param {ReportsClient.RequestOptions} requestOptions - Request-specific configuration.
+ *
+ * @throws {@link Webflow.BadRequestError}
+ * @throws {@link Webflow.UnauthorizedError}
+ * @throws {@link Webflow.ForbiddenError}
+ * @throws {@link Webflow.NotFoundError}
+ * @throws {@link Webflow.TooManyRequestsError}
+ * @throws {@link Webflow.InternalServerError}
+ *
+ * @example
+ * await client.sites.aeo.reports.visibility("580e63e98c9a982ac9b8b741", {
+ * startTime: new Date("2026-09-01T00:00:00.000Z"),
+ * endTime: new Date("2026-09-08T00:00:00.000Z"),
+ * topicIds: ["68cdb4b5a699862fcd8c1a02"],
+ * promptIds: ["68cdb4b5a699862fcd8c1a01"],
+ * answerEngine: "chat-gpt"
+ * })
+ */
+ public visibility(
+ site_id: string,
+ request: Webflow.sites.aeo.ReportsVisibilityRequest,
+ requestOptions?: ReportsClient.RequestOptions,
+ ): core.HttpResponsePromise {
+ return core.HttpResponsePromise.fromPromise(this.__visibility(site_id, request, requestOptions));
+ }
+
+ private async __visibility(
+ site_id: string,
+ request: Webflow.sites.aeo.ReportsVisibilityRequest,
+ requestOptions?: ReportsClient.RequestOptions,
+ ): Promise> {
+ const { startTime, endTime, topicIds, promptIds, answerEngine, timeseries } = request;
+ const _queryParams: Record = {
+ startTime: startTime.toISOString(),
+ endTime: endTime.toISOString(),
+ topicIds,
+ promptIds,
+ answerEngine:
+ answerEngine != null
+ ? serializers.AeoAnswerEngineKey.jsonOrThrow(answerEngine, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ omitUndefined: true,
+ })
+ : undefined,
+ timeseries:
+ timeseries != null
+ ? serializers.AeoTimeseries.jsonOrThrow(timeseries, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ omitUndefined: true,
+ breadcrumbsPrefix: ["request", "timeseries"],
+ })
+ : timeseries,
+ };
+ const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest();
+ const _headers: core.Fetcher.Args["headers"] = mergeHeaders(
+ _authRequest.headers,
+ this._options?.headers,
+ requestOptions?.headers,
+ );
+ const _response = await core.fetcher({
+ url: core.url.join(
+ (await core.Supplier.get(this._options.baseUrl)) ??
+ ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi)
+ .base,
+ `sites/${core.url.encodePathParam(site_id)}/aeo/reports/visibility`,
+ ),
+ method: "GET",
+ headers: _headers,
+ queryParameters: { ..._queryParams, ...requestOptions?.queryParams },
+ timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000,
+ maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries,
+ abortSignal: requestOptions?.abortSignal,
+ fetchFn: this._options?.fetch,
+ logging: this._options.logging,
+ });
+ if (_response.ok) {
+ return {
+ data: serializers.AeoVisibilityResponse.parseOrThrow(_response.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ rawResponse: _response.rawResponse,
+ };
+ }
+
+ if (_response.error.reason === "status-code") {
+ switch (_response.error.statusCode) {
+ case 400:
+ throw new Webflow.BadRequestError(_response.error.body, _response.rawResponse);
+ case 401:
+ throw new Webflow.UnauthorizedError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 403:
+ throw new Webflow.ForbiddenError(_response.error.body, _response.rawResponse);
+ case 404:
+ throw new Webflow.NotFoundError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 429:
+ throw new Webflow.TooManyRequestsError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 500:
+ throw new Webflow.InternalServerError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ default:
+ throw new errors.WebflowError({
+ statusCode: _response.error.statusCode,
+ body: _response.error.body,
+ rawResponse: _response.rawResponse,
+ });
+ }
+ }
+
+ return handleNonStatusCodeError(
+ _response.error,
+ _response.rawResponse,
+ "GET",
+ "/sites/{site_id}/aeo/reports/visibility",
+ );
+ }
+
+ /**
+ * Returns the visibility score for each topic or prompt over a time range, highest first.
+ *
+ * Choose `breakdown=topic` or `breakdown=prompt`. A topic or prompt appears only if it has responses in the time range. Separate filters combine with AND, and values within one filter combine with OR. Requires an organization name in the site's Organization info.
+ *
+ * This endpoint requires a site or workspace with the AEO analytics entitlement, and Webflow AI must be enabled for the workspace.
+ *
+ * Each access token can have one AEO request in flight at a time, across all AEO Analytics endpoints. Additional concurrent requests return `429 Too Many Requests`. Wait for your in-flight request to finish, or for the `Retry-After` interval, then retry.
+ *
+ * Required scope | `sites:read`
+ *
+ * @param {string} site_id - Unique identifier for a Site
+ * @param {Webflow.sites.aeo.ReportsVisibilityBreakdownRequest} request
+ * @param {ReportsClient.RequestOptions} requestOptions - Request-specific configuration.
+ *
+ * @throws {@link Webflow.BadRequestError}
+ * @throws {@link Webflow.UnauthorizedError}
+ * @throws {@link Webflow.ForbiddenError}
+ * @throws {@link Webflow.NotFoundError}
+ * @throws {@link Webflow.TooManyRequestsError}
+ * @throws {@link Webflow.InternalServerError}
+ *
+ * @example
+ * await client.sites.aeo.reports.visibilityBreakdown("580e63e98c9a982ac9b8b741", {
+ * startTime: new Date("2026-09-01T00:00:00.000Z"),
+ * endTime: new Date("2026-09-08T00:00:00.000Z"),
+ * breakdown: "topic",
+ * limit: 1,
+ * topicIds: ["68cdb4b5a699862fcd8c1a02"],
+ * promptIds: ["68cdb4b5a699862fcd8c1a01"],
+ * answerEngine: "chat-gpt"
+ * })
+ */
+ public visibilityBreakdown(
+ site_id: string,
+ request: Webflow.sites.aeo.ReportsVisibilityBreakdownRequest,
+ requestOptions?: ReportsClient.RequestOptions,
+ ): core.HttpResponsePromise {
+ return core.HttpResponsePromise.fromPromise(this.__visibilityBreakdown(site_id, request, requestOptions));
+ }
+
+ private async __visibilityBreakdown(
+ site_id: string,
+ request: Webflow.sites.aeo.ReportsVisibilityBreakdownRequest,
+ requestOptions?: ReportsClient.RequestOptions,
+ ): Promise> {
+ const { startTime, endTime, breakdown, limit, topicIds, promptIds, answerEngine } = request;
+ const _queryParams: Record = {
+ startTime: startTime.toISOString(),
+ endTime: endTime.toISOString(),
+ breakdown: serializers.sites.aeo.ReportsVisibilityBreakdownRequestBreakdown.jsonOrThrow(breakdown, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ omitUndefined: true,
+ }),
+ limit,
+ topicIds,
+ promptIds,
+ answerEngine:
+ answerEngine != null
+ ? serializers.AeoAnswerEngineKey.jsonOrThrow(answerEngine, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ omitUndefined: true,
+ })
+ : undefined,
+ };
+ const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest();
+ const _headers: core.Fetcher.Args["headers"] = mergeHeaders(
+ _authRequest.headers,
+ this._options?.headers,
+ requestOptions?.headers,
+ );
+ const _response = await core.fetcher({
+ url: core.url.join(
+ (await core.Supplier.get(this._options.baseUrl)) ??
+ ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi)
+ .base,
+ `sites/${core.url.encodePathParam(site_id)}/aeo/reports/visibility_breakdown`,
+ ),
+ method: "GET",
+ headers: _headers,
+ queryParameters: { ..._queryParams, ...requestOptions?.queryParams },
+ timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000,
+ maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries,
+ abortSignal: requestOptions?.abortSignal,
+ fetchFn: this._options?.fetch,
+ logging: this._options.logging,
+ });
+ if (_response.ok) {
+ return {
+ data: serializers.AeoVisibilityBreakdownResponse.parseOrThrow(_response.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ rawResponse: _response.rawResponse,
+ };
+ }
+
+ if (_response.error.reason === "status-code") {
+ switch (_response.error.statusCode) {
+ case 400:
+ throw new Webflow.BadRequestError(_response.error.body, _response.rawResponse);
+ case 401:
+ throw new Webflow.UnauthorizedError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 403:
+ throw new Webflow.ForbiddenError(_response.error.body, _response.rawResponse);
+ case 404:
+ throw new Webflow.NotFoundError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 429:
+ throw new Webflow.TooManyRequestsError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 500:
+ throw new Webflow.InternalServerError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ default:
+ throw new errors.WebflowError({
+ statusCode: _response.error.statusCode,
+ body: _response.error.body,
+ rawResponse: _response.rawResponse,
+ });
+ }
+ }
+
+ return handleNonStatusCodeError(
+ _response.error,
+ _response.rawResponse,
+ "GET",
+ "/sites/{site_id}/aeo/reports/visibility_breakdown",
+ );
+ }
+
+ /**
+ * Returns, for each topic or prompt, the share of responses with citations that cited one of your domains.
+ *
+ * Your domains are your Allowed domains and your `webflow.io` subdomain, each with and without `www.`. The response lists them in `domains`. Results are sorted by `citationRate`, highest first, and aren't paginated. Separate filters combine with AND, and values within one filter combine with OR.
+ *
+ * This endpoint requires a site or workspace with the AEO analytics entitlement, and Webflow AI must be enabled for the workspace.
+ *
+ * Each access token can have one AEO request in flight at a time, across all AEO Analytics endpoints. Additional concurrent requests return `429 Too Many Requests`. Wait for your in-flight request to finish, or for the `Retry-After` interval, then retry.
+ *
+ * Required scope | `sites:read`
+ *
+ * @param {string} site_id - Unique identifier for a Site
+ * @param {Webflow.sites.aeo.ReportsCitationRateRequest} request
+ * @param {ReportsClient.RequestOptions} requestOptions - Request-specific configuration.
+ *
+ * @throws {@link Webflow.BadRequestError}
+ * @throws {@link Webflow.UnauthorizedError}
+ * @throws {@link Webflow.ForbiddenError}
+ * @throws {@link Webflow.NotFoundError}
+ * @throws {@link Webflow.TooManyRequestsError}
+ * @throws {@link Webflow.InternalServerError}
+ *
+ * @example
+ * await client.sites.aeo.reports.citationRate("580e63e98c9a982ac9b8b741", {
+ * startTime: new Date("2026-09-01T00:00:00.000Z"),
+ * endTime: new Date("2026-09-08T00:00:00.000Z"),
+ * breakdown: "topic",
+ * topicIds: ["68cdb4b5a699862fcd8c1a02"],
+ * promptIds: ["68cdb4b5a699862fcd8c1a01"],
+ * answerEngines: ["chat-gpt"]
+ * })
+ */
+ public citationRate(
+ site_id: string,
+ request: Webflow.sites.aeo.ReportsCitationRateRequest,
+ requestOptions?: ReportsClient.RequestOptions,
+ ): core.HttpResponsePromise {
+ return core.HttpResponsePromise.fromPromise(this.__citationRate(site_id, request, requestOptions));
+ }
+
+ private async __citationRate(
+ site_id: string,
+ request: Webflow.sites.aeo.ReportsCitationRateRequest,
+ requestOptions?: ReportsClient.RequestOptions,
+ ): Promise> {
+ const { startTime, endTime, breakdown, topicIds, promptIds, answerEngines } = request;
+ const _queryParams: Record = {
+ startTime: startTime.toISOString(),
+ endTime: endTime.toISOString(),
+ breakdown: serializers.sites.aeo.ReportsCitationRateRequestBreakdown.jsonOrThrow(breakdown, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ omitUndefined: true,
+ }),
+ topicIds,
+ promptIds,
+ answerEngines: Array.isArray(answerEngines)
+ ? answerEngines.map((item) =>
+ serializers.AeoAnswerEngineKey.jsonOrThrow(item, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ omitUndefined: true,
+ }),
+ )
+ : answerEngines != null
+ ? serializers.AeoAnswerEngineKey.jsonOrThrow(answerEngines, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ omitUndefined: true,
+ })
+ : undefined,
+ };
+ const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest();
+ const _headers: core.Fetcher.Args["headers"] = mergeHeaders(
+ _authRequest.headers,
+ this._options?.headers,
+ requestOptions?.headers,
+ );
+ const _response = await core.fetcher({
+ url: core.url.join(
+ (await core.Supplier.get(this._options.baseUrl)) ??
+ ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi)
+ .base,
+ `sites/${core.url.encodePathParam(site_id)}/aeo/reports/citation_rate`,
+ ),
+ method: "GET",
+ headers: _headers,
+ queryParameters: { ..._queryParams, ...requestOptions?.queryParams },
+ timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000,
+ maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries,
+ abortSignal: requestOptions?.abortSignal,
+ fetchFn: this._options?.fetch,
+ logging: this._options.logging,
+ });
+ if (_response.ok) {
+ return {
+ data: serializers.AeoCitationRateResponse.parseOrThrow(_response.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ rawResponse: _response.rawResponse,
+ };
+ }
+
+ if (_response.error.reason === "status-code") {
+ switch (_response.error.statusCode) {
+ case 400:
+ throw new Webflow.BadRequestError(_response.error.body, _response.rawResponse);
+ case 401:
+ throw new Webflow.UnauthorizedError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 403:
+ throw new Webflow.ForbiddenError(_response.error.body, _response.rawResponse);
+ case 404:
+ throw new Webflow.NotFoundError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 429:
+ throw new Webflow.TooManyRequestsError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 500:
+ throw new Webflow.InternalServerError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ default:
+ throw new errors.WebflowError({
+ statusCode: _response.error.statusCode,
+ body: _response.error.body,
+ rawResponse: _response.rawResponse,
+ });
+ }
+ }
+
+ return handleNonStatusCodeError(
+ _response.error,
+ _response.rawResponse,
+ "GET",
+ "/sites/{site_id}/aeo/reports/citation_rate",
+ );
+ }
+
+ /**
+ * Returns the domains answer engines cited most, with each domain's share of all citations. For your domains, each row also lists its cited paths in `paths`. For other domains, `distinctPathCount` gives the approximate number of distinct cited paths.
+ *
+ * Results are sorted by citation count, highest first. If one of your domains isn't in the top `limit`, it's added after the ranked rows, so the response can have more than `limit` rows.
+ *
+ * This endpoint requires a site or workspace with the AEO analytics entitlement, and Webflow AI must be enabled for the workspace.
+ *
+ * Each access token can have one AEO request in flight at a time, across all AEO Analytics endpoints. Additional concurrent requests return `429 Too Many Requests`. Wait for your in-flight request to finish, or for the `Retry-After` interval, then retry.
+ *
+ * Required scope | `sites:read`
+ *
+ * @param {string} site_id - Unique identifier for a Site
+ * @param {Webflow.sites.aeo.ReportsTopCitedDomainsRequest} request
+ * @param {ReportsClient.RequestOptions} requestOptions - Request-specific configuration.
+ *
+ * @throws {@link Webflow.BadRequestError}
+ * @throws {@link Webflow.UnauthorizedError}
+ * @throws {@link Webflow.ForbiddenError}
+ * @throws {@link Webflow.NotFoundError}
+ * @throws {@link Webflow.TooManyRequestsError}
+ * @throws {@link Webflow.InternalServerError}
+ *
+ * @example
+ * await client.sites.aeo.reports.topCitedDomains("580e63e98c9a982ac9b8b741", {
+ * startTime: new Date("2026-09-01T00:00:00.000Z"),
+ * endTime: new Date("2026-09-08T00:00:00.000Z"),
+ * topicIds: ["68cdb4b5a699862fcd8c1a02"],
+ * answerEngines: ["chat-gpt"],
+ * limit: 1
+ * })
+ */
+ public topCitedDomains(
+ site_id: string,
+ request: Webflow.sites.aeo.ReportsTopCitedDomainsRequest,
+ requestOptions?: ReportsClient.RequestOptions,
+ ): core.HttpResponsePromise {
+ return core.HttpResponsePromise.fromPromise(this.__topCitedDomains(site_id, request, requestOptions));
+ }
+
+ private async __topCitedDomains(
+ site_id: string,
+ request: Webflow.sites.aeo.ReportsTopCitedDomainsRequest,
+ requestOptions?: ReportsClient.RequestOptions,
+ ): Promise> {
+ const { startTime, endTime, topicIds, answerEngines, limit } = request;
+ const _queryParams: Record = {
+ startTime: startTime.toISOString(),
+ endTime: endTime.toISOString(),
+ topicIds,
+ answerEngines: Array.isArray(answerEngines)
+ ? answerEngines.map((item) =>
+ serializers.AeoAnswerEngineKey.jsonOrThrow(item, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ omitUndefined: true,
+ }),
+ )
+ : answerEngines != null
+ ? serializers.AeoAnswerEngineKey.jsonOrThrow(answerEngines, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ omitUndefined: true,
+ })
+ : undefined,
+ limit,
+ };
+ const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest();
+ const _headers: core.Fetcher.Args["headers"] = mergeHeaders(
+ _authRequest.headers,
+ this._options?.headers,
+ requestOptions?.headers,
+ );
+ const _response = await core.fetcher({
+ url: core.url.join(
+ (await core.Supplier.get(this._options.baseUrl)) ??
+ ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi)
+ .base,
+ `sites/${core.url.encodePathParam(site_id)}/aeo/reports/top_cited_domains`,
+ ),
+ method: "GET",
+ headers: _headers,
+ queryParameters: { ..._queryParams, ...requestOptions?.queryParams },
+ timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000,
+ maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries,
+ abortSignal: requestOptions?.abortSignal,
+ fetchFn: this._options?.fetch,
+ logging: this._options.logging,
+ });
+ if (_response.ok) {
+ return {
+ data: serializers.AeoTopCitedDomainsResponse.parseOrThrow(_response.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ rawResponse: _response.rawResponse,
+ };
+ }
+
+ if (_response.error.reason === "status-code") {
+ switch (_response.error.statusCode) {
+ case 400:
+ throw new Webflow.BadRequestError(_response.error.body, _response.rawResponse);
+ case 401:
+ throw new Webflow.UnauthorizedError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 403:
+ throw new Webflow.ForbiddenError(_response.error.body, _response.rawResponse);
+ case 404:
+ throw new Webflow.NotFoundError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 429:
+ throw new Webflow.TooManyRequestsError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 500:
+ throw new Webflow.InternalServerError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ default:
+ throw new errors.WebflowError({
+ statusCode: _response.error.statusCode,
+ body: _response.error.body,
+ rawResponse: _response.rawResponse,
+ });
+ }
+ }
+
+ return handleNonStatusCodeError(
+ _response.error,
+ _response.rawResponse,
+ "GET",
+ "/sites/{site_id}/aeo/reports/top_cited_domains",
+ );
+ }
+
+ /**
+ * Returns the cited paths on one domain, with each path's share of all citations.
+ *
+ * `domain` can be any domain, not only yours. Results are sorted by `citationRate`, highest first, and aren't paginated.
+ *
+ * This endpoint requires a site or workspace with the AEO analytics entitlement, and Webflow AI must be enabled for the workspace.
+ *
+ * Each access token can have one AEO request in flight at a time, across all AEO Analytics endpoints. Additional concurrent requests return `429 Too Many Requests`. Wait for your in-flight request to finish, or for the `Retry-After` interval, then retry.
+ *
+ * Required scope | `sites:read`
+ *
+ * @param {string} site_id - Unique identifier for a Site
+ * @param {Webflow.sites.aeo.ReportsCitedDomainPathsRequest} request
+ * @param {ReportsClient.RequestOptions} requestOptions - Request-specific configuration.
+ *
+ * @throws {@link Webflow.BadRequestError}
+ * @throws {@link Webflow.UnauthorizedError}
+ * @throws {@link Webflow.ForbiddenError}
+ * @throws {@link Webflow.NotFoundError}
+ * @throws {@link Webflow.TooManyRequestsError}
+ * @throws {@link Webflow.InternalServerError}
+ *
+ * @example
+ * await client.sites.aeo.reports.citedDomainPaths("580e63e98c9a982ac9b8b741", {
+ * startTime: new Date("2026-09-01T00:00:00.000Z"),
+ * endTime: new Date("2026-09-08T00:00:00.000Z"),
+ * domain: "example.org",
+ * topicIds: ["68cdb4b5a699862fcd8c1a02"],
+ * answerEngines: ["chat-gpt"]
+ * })
+ */
+ public citedDomainPaths(
+ site_id: string,
+ request: Webflow.sites.aeo.ReportsCitedDomainPathsRequest,
+ requestOptions?: ReportsClient.RequestOptions,
+ ): core.HttpResponsePromise {
+ return core.HttpResponsePromise.fromPromise(this.__citedDomainPaths(site_id, request, requestOptions));
+ }
+
+ private async __citedDomainPaths(
+ site_id: string,
+ request: Webflow.sites.aeo.ReportsCitedDomainPathsRequest,
+ requestOptions?: ReportsClient.RequestOptions,
+ ): Promise> {
+ const { startTime, endTime, domain, topicIds, answerEngines } = request;
+ const _queryParams: Record = {
+ startTime: startTime.toISOString(),
+ endTime: endTime.toISOString(),
+ domain,
+ topicIds,
+ answerEngines: Array.isArray(answerEngines)
+ ? answerEngines.map((item) =>
+ serializers.AeoAnswerEngineKey.jsonOrThrow(item, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ omitUndefined: true,
+ }),
+ )
+ : answerEngines != null
+ ? serializers.AeoAnswerEngineKey.jsonOrThrow(answerEngines, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ omitUndefined: true,
+ })
+ : undefined,
+ };
+ const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest();
+ const _headers: core.Fetcher.Args["headers"] = mergeHeaders(
+ _authRequest.headers,
+ this._options?.headers,
+ requestOptions?.headers,
+ );
+ const _response = await core.fetcher({
+ url: core.url.join(
+ (await core.Supplier.get(this._options.baseUrl)) ??
+ ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi)
+ .base,
+ `sites/${core.url.encodePathParam(site_id)}/aeo/reports/cited_domain_paths`,
+ ),
+ method: "GET",
+ headers: _headers,
+ queryParameters: { ..._queryParams, ...requestOptions?.queryParams },
+ timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000,
+ maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries,
+ abortSignal: requestOptions?.abortSignal,
+ fetchFn: this._options?.fetch,
+ logging: this._options.logging,
+ });
+ if (_response.ok) {
+ return {
+ data: serializers.AeoCitedDomainPathsResponse.parseOrThrow(_response.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ rawResponse: _response.rawResponse,
+ };
+ }
+
+ if (_response.error.reason === "status-code") {
+ switch (_response.error.statusCode) {
+ case 400:
+ throw new Webflow.BadRequestError(_response.error.body, _response.rawResponse);
+ case 401:
+ throw new Webflow.UnauthorizedError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 403:
+ throw new Webflow.ForbiddenError(_response.error.body, _response.rawResponse);
+ case 404:
+ throw new Webflow.NotFoundError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 429:
+ throw new Webflow.TooManyRequestsError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 500:
+ throw new Webflow.InternalServerError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ default:
+ throw new errors.WebflowError({
+ statusCode: _response.error.statusCode,
+ body: _response.error.body,
+ rawResponse: _response.rawResponse,
+ });
+ }
+ }
+
+ return handleNonStatusCodeError(
+ _response.error,
+ _response.rawResponse,
+ "GET",
+ "/sites/{site_id}/aeo/reports/cited_domain_paths",
+ );
+ }
+
+ /**
+ * Returns one page's share of all citations to your domains, optionally broken down by prompt.
+ *
+ * For a CMS item, send `collectionId` and `itemSlug` along with `pageId`. With `breakdown=prompt`, returns each prompt's share of this page's citations, sorted by `citationShare`, highest first.
+ *
+ * This endpoint requires a site or workspace with the AEO analytics entitlement, and Webflow AI must be enabled for the workspace.
+ *
+ * Each access token can have one AEO request in flight at a time, across all AEO Analytics endpoints. Additional concurrent requests return `429 Too Many Requests`. Wait for your in-flight request to finish, or for the `Retry-After` interval, then retry.
+ *
+ * Required scope | `sites:read`
+ *
+ * @param {string} site_id - Unique identifier for a Site
+ * @param {Webflow.sites.aeo.ReportsPageCitationShareRequest} request
+ * @param {ReportsClient.RequestOptions} requestOptions - Request-specific configuration.
+ *
+ * @throws {@link Webflow.BadRequestError}
+ * @throws {@link Webflow.UnauthorizedError}
+ * @throws {@link Webflow.ForbiddenError}
+ * @throws {@link Webflow.NotFoundError}
+ * @throws {@link Webflow.TooManyRequestsError}
+ * @throws {@link Webflow.InternalServerError}
+ *
+ * @example
+ * await client.sites.aeo.reports.pageCitationShare("580e63e98c9a982ac9b8b741", {
+ * startTime: new Date("2026-09-01T00:00:00.000Z"),
+ * endTime: new Date("2026-09-08T00:00:00.000Z"),
+ * pageId: "68cdb4b5a699862fcd8c1a30",
+ * collectionId: "68cdb4b5a699862fcd8c1a40",
+ * itemSlug: "dont-panic",
+ * breakdown: "prompt",
+ * answerEngines: ["chat-gpt"]
+ * })
+ */
+ public pageCitationShare(
+ site_id: string,
+ request: Webflow.sites.aeo.ReportsPageCitationShareRequest,
+ requestOptions?: ReportsClient.RequestOptions,
+ ): core.HttpResponsePromise {
+ return core.HttpResponsePromise.fromPromise(this.__pageCitationShare(site_id, request, requestOptions));
+ }
+
+ private async __pageCitationShare(
+ site_id: string,
+ request: Webflow.sites.aeo.ReportsPageCitationShareRequest,
+ requestOptions?: ReportsClient.RequestOptions,
+ ): Promise> {
+ const { startTime, endTime, pageId, collectionId, itemSlug, breakdown, answerEngines } = request;
+ const _queryParams: Record = {
+ startTime: startTime.toISOString(),
+ endTime: endTime.toISOString(),
+ pageId,
+ collectionId,
+ itemSlug,
+ breakdown: breakdown != null ? breakdown : undefined,
+ answerEngines: Array.isArray(answerEngines)
+ ? answerEngines.map((item) =>
+ serializers.AeoAnswerEngineKey.jsonOrThrow(item, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ omitUndefined: true,
+ }),
+ )
+ : answerEngines != null
+ ? serializers.AeoAnswerEngineKey.jsonOrThrow(answerEngines, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ omitUndefined: true,
+ })
+ : undefined,
+ };
+ const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest();
+ const _headers: core.Fetcher.Args["headers"] = mergeHeaders(
+ _authRequest.headers,
+ this._options?.headers,
+ requestOptions?.headers,
+ );
+ const _response = await core.fetcher({
+ url: core.url.join(
+ (await core.Supplier.get(this._options.baseUrl)) ??
+ ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi)
+ .base,
+ `sites/${core.url.encodePathParam(site_id)}/aeo/reports/page_citation_share`,
+ ),
+ method: "GET",
+ headers: _headers,
+ queryParameters: { ..._queryParams, ...requestOptions?.queryParams },
+ timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000,
+ maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries,
+ abortSignal: requestOptions?.abortSignal,
+ fetchFn: this._options?.fetch,
+ logging: this._options.logging,
+ });
+ if (_response.ok) {
+ return {
+ data: serializers.AeoPageCitationShareResponse.parseOrThrow(_response.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ rawResponse: _response.rawResponse,
+ };
+ }
+
+ if (_response.error.reason === "status-code") {
+ switch (_response.error.statusCode) {
+ case 400:
+ throw new Webflow.BadRequestError(_response.error.body, _response.rawResponse);
+ case 401:
+ throw new Webflow.UnauthorizedError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 403:
+ throw new Webflow.ForbiddenError(_response.error.body, _response.rawResponse);
+ case 404:
+ throw new Webflow.NotFoundError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 429:
+ throw new Webflow.TooManyRequestsError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 500:
+ throw new Webflow.InternalServerError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ default:
+ throw new errors.WebflowError({
+ statusCode: _response.error.statusCode,
+ body: _response.error.body,
+ rawResponse: _response.rawResponse,
+ });
+ }
+ }
+
+ return handleNonStatusCodeError(
+ _response.error,
+ _response.rawResponse,
+ "GET",
+ "/sites/{site_id}/aeo/reports/page_citation_share",
+ );
+ }
+
+ /**
+ * Lists the newest responses that cited a competitor's domain and none of your domains.
+ *
+ * Competitor domains come from the competitors in the site's Organization info. Results are sorted by `timestamp`, newest first, and aren't paginated.
+ *
+ * This endpoint requires a site or workspace with the AEO analytics entitlement, and Webflow AI must be enabled for the workspace.
+ *
+ * Each access token can have one AEO request in flight at a time, across all AEO Analytics endpoints. Additional concurrent requests return `429 Too Many Requests`. Wait for your in-flight request to finish, or for the `Retry-After` interval, then retry.
+ *
+ * Required scope | `sites:read`
+ *
+ * @param {string} site_id - Unique identifier for a Site
+ * @param {Webflow.sites.aeo.ReportsCompetitorCitationsRequest} request
+ * @param {ReportsClient.RequestOptions} requestOptions - Request-specific configuration.
+ *
+ * @throws {@link Webflow.BadRequestError}
+ * @throws {@link Webflow.UnauthorizedError}
+ * @throws {@link Webflow.ForbiddenError}
+ * @throws {@link Webflow.NotFoundError}
+ * @throws {@link Webflow.TooManyRequestsError}
+ * @throws {@link Webflow.InternalServerError}
+ *
+ * @example
+ * await client.sites.aeo.reports.competitorCitations("580e63e98c9a982ac9b8b741", {
+ * startTime: new Date("2026-09-01T00:00:00.000Z"),
+ * endTime: new Date("2026-09-08T00:00:00.000Z"),
+ * topicIds: ["68cdb4b5a699862fcd8c1a02"],
+ * answerEngines: ["chat-gpt"],
+ * limit: 1
+ * })
+ */
+ public competitorCitations(
+ site_id: string,
+ request: Webflow.sites.aeo.ReportsCompetitorCitationsRequest,
+ requestOptions?: ReportsClient.RequestOptions,
+ ): core.HttpResponsePromise {
+ return core.HttpResponsePromise.fromPromise(this.__competitorCitations(site_id, request, requestOptions));
+ }
+
+ private async __competitorCitations(
+ site_id: string,
+ request: Webflow.sites.aeo.ReportsCompetitorCitationsRequest,
+ requestOptions?: ReportsClient.RequestOptions,
+ ): Promise> {
+ const { startTime, endTime, topicIds, answerEngines, limit } = request;
+ const _queryParams: Record = {
+ startTime: startTime.toISOString(),
+ endTime: endTime.toISOString(),
+ topicIds,
+ answerEngines: Array.isArray(answerEngines)
+ ? answerEngines.map((item) =>
+ serializers.AeoAnswerEngineKey.jsonOrThrow(item, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ omitUndefined: true,
+ }),
+ )
+ : answerEngines != null
+ ? serializers.AeoAnswerEngineKey.jsonOrThrow(answerEngines, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ omitUndefined: true,
+ })
+ : undefined,
+ limit,
+ };
+ const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest();
+ const _headers: core.Fetcher.Args["headers"] = mergeHeaders(
+ _authRequest.headers,
+ this._options?.headers,
+ requestOptions?.headers,
+ );
+ const _response = await core.fetcher({
+ url: core.url.join(
+ (await core.Supplier.get(this._options.baseUrl)) ??
+ ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi)
+ .base,
+ `sites/${core.url.encodePathParam(site_id)}/aeo/reports/competitor_citations`,
+ ),
+ method: "GET",
+ headers: _headers,
+ queryParameters: { ..._queryParams, ...requestOptions?.queryParams },
+ timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000,
+ maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries,
+ abortSignal: requestOptions?.abortSignal,
+ fetchFn: this._options?.fetch,
+ logging: this._options.logging,
+ });
+ if (_response.ok) {
+ return {
+ data: serializers.AeoCompetitorCitationsResponse.parseOrThrow(_response.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ rawResponse: _response.rawResponse,
+ };
+ }
+
+ if (_response.error.reason === "status-code") {
+ switch (_response.error.statusCode) {
+ case 400:
+ throw new Webflow.BadRequestError(_response.error.body, _response.rawResponse);
+ case 401:
+ throw new Webflow.UnauthorizedError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 403:
+ throw new Webflow.ForbiddenError(_response.error.body, _response.rawResponse);
+ case 404:
+ throw new Webflow.NotFoundError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 429:
+ throw new Webflow.TooManyRequestsError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 500:
+ throw new Webflow.InternalServerError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ default:
+ throw new errors.WebflowError({
+ statusCode: _response.error.statusCode,
+ body: _response.error.body,
+ rawResponse: _response.rawResponse,
+ });
+ }
+ }
+
+ return handleNonStatusCodeError(
+ _response.error,
+ _response.rawResponse,
+ "GET",
+ "/sites/{site_id}/aeo/reports/competitor_citations",
+ );
+ }
+
+ /**
+ * Lists answer engine responses over a time range, newest first, with every citation and mention in each.
+ *
+ * Includes responses that cited nothing. To get the next page, set `offset` to the previous `offset` plus `limit`. Rows can shift between pages if new responses arrive in the time range.
+ *
+ * This endpoint requires a site or workspace with the AEO analytics entitlement, and Webflow AI must be enabled for the workspace.
+ *
+ * Each access token can have one AEO request in flight at a time, across all AEO Analytics endpoints. Additional concurrent requests return `429 Too Many Requests`. Wait for your in-flight request to finish, or for the `Retry-After` interval, then retry.
+ *
+ * Required scope | `sites:read`
+ *
+ * @param {string} site_id - Unique identifier for a Site
+ * @param {Webflow.sites.aeo.ReportsCitationsRequest} request
+ * @param {ReportsClient.RequestOptions} requestOptions - Request-specific configuration.
+ *
+ * @throws {@link Webflow.BadRequestError}
+ * @throws {@link Webflow.UnauthorizedError}
+ * @throws {@link Webflow.ForbiddenError}
+ * @throws {@link Webflow.NotFoundError}
+ * @throws {@link Webflow.TooManyRequestsError}
+ * @throws {@link Webflow.InternalServerError}
+ *
+ * @example
+ * await client.sites.aeo.reports.citations("580e63e98c9a982ac9b8b741", {
+ * startTime: new Date("2026-09-01T00:00:00.000Z"),
+ * endTime: new Date("2026-09-08T00:00:00.000Z"),
+ * topicIds: ["68cdb4b5a699862fcd8c1a02"],
+ * promptIds: ["68cdb4b5a699862fcd8c1a01"],
+ * answerEngines: ["chat-gpt"],
+ * limit: 1,
+ * offset: 1
+ * })
+ */
+ public citations(
+ site_id: string,
+ request: Webflow.sites.aeo.ReportsCitationsRequest,
+ requestOptions?: ReportsClient.RequestOptions,
+ ): core.HttpResponsePromise {
+ return core.HttpResponsePromise.fromPromise(this.__citations(site_id, request, requestOptions));
+ }
+
+ private async __citations(
+ site_id: string,
+ request: Webflow.sites.aeo.ReportsCitationsRequest,
+ requestOptions?: ReportsClient.RequestOptions,
+ ): Promise> {
+ const { startTime, endTime, topicIds, promptIds, answerEngines, limit, offset } = request;
+ const _queryParams: Record = {
+ startTime: startTime.toISOString(),
+ endTime: endTime.toISOString(),
+ topicIds,
+ promptIds,
+ answerEngines: Array.isArray(answerEngines)
+ ? answerEngines.map((item) =>
+ serializers.AeoAnswerEngineKey.jsonOrThrow(item, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ omitUndefined: true,
+ }),
+ )
+ : answerEngines != null
+ ? serializers.AeoAnswerEngineKey.jsonOrThrow(answerEngines, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ omitUndefined: true,
+ })
+ : undefined,
+ limit,
+ offset,
+ };
+ const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest();
+ const _headers: core.Fetcher.Args["headers"] = mergeHeaders(
+ _authRequest.headers,
+ this._options?.headers,
+ requestOptions?.headers,
+ );
+ const _response = await core.fetcher({
+ url: core.url.join(
+ (await core.Supplier.get(this._options.baseUrl)) ??
+ ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi)
+ .base,
+ `sites/${core.url.encodePathParam(site_id)}/aeo/reports/citations`,
+ ),
+ method: "GET",
+ headers: _headers,
+ queryParameters: { ..._queryParams, ...requestOptions?.queryParams },
+ timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000,
+ maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries,
+ abortSignal: requestOptions?.abortSignal,
+ fetchFn: this._options?.fetch,
+ logging: this._options.logging,
+ });
+ if (_response.ok) {
+ return {
+ data: serializers.AeoCitationsResponse.parseOrThrow(_response.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ rawResponse: _response.rawResponse,
+ };
+ }
+
+ if (_response.error.reason === "status-code") {
+ switch (_response.error.statusCode) {
+ case 400:
+ throw new Webflow.BadRequestError(_response.error.body, _response.rawResponse);
+ case 401:
+ throw new Webflow.UnauthorizedError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 403:
+ throw new Webflow.ForbiddenError(_response.error.body, _response.rawResponse);
+ case 404:
+ throw new Webflow.NotFoundError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 429:
+ throw new Webflow.TooManyRequestsError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 500:
+ throw new Webflow.InternalServerError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ default:
+ throw new errors.WebflowError({
+ statusCode: _response.error.statusCode,
+ body: _response.error.body,
+ rawResponse: _response.rawResponse,
+ });
+ }
+ }
+
+ return handleNonStatusCodeError(
+ _response.error,
+ _response.rawResponse,
+ "GET",
+ "/sites/{site_id}/aeo/reports/citations",
+ );
+ }
+}
diff --git a/src/api/resources/sites/resources/aeo/resources/reports/client/index.ts b/src/api/resources/sites/resources/aeo/resources/reports/client/index.ts
new file mode 100644
index 00000000..415726b7
--- /dev/null
+++ b/src/api/resources/sites/resources/aeo/resources/reports/client/index.ts
@@ -0,0 +1 @@
+export * from "./requests";
diff --git a/src/api/resources/sites/resources/aeo/resources/reports/client/requests/ReportsBotTrafficPagesRequest.ts b/src/api/resources/sites/resources/aeo/resources/reports/client/requests/ReportsBotTrafficPagesRequest.ts
new file mode 100644
index 00000000..92a82f4c
--- /dev/null
+++ b/src/api/resources/sites/resources/aeo/resources/reports/client/requests/ReportsBotTrafficPagesRequest.ts
@@ -0,0 +1,26 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../../../../../../../index";
+
+/**
+ * @example
+ * {
+ * startTime: new Date("2026-09-01T00:00:00.000Z"),
+ * endTime: new Date("2026-09-08T00:00:00.000Z"),
+ * botProviders: ["openai"],
+ * botCategory: "agent",
+ * limit: 1
+ * }
+ */
+export interface ReportsBotTrafficPagesRequest {
+ /** Inclusive start of the time range. Must be a UTC timestamp ending in `Z`, such as `2026-09-01T00:00:00Z`. Offsets and date-only values aren't accepted. Seconds and milliseconds are optional. */
+ startTime: Date;
+ /** Exclusive end of the time range. Must be a UTC timestamp ending in `Z`, and later than `startTime`. The range can be at most 100 days. Can't be later than the start of the current UTC day, because today's data isn't available yet. */
+ endTime: Date;
+ /** Count only bots from these providers. Repeat the parameter for more than one, such as `botProviders=openai&botProviders=anthropic`. Comma-separated values aren't accepted. */
+ botProviders?: Webflow.AeoBotProvider | Webflow.AeoBotProvider[];
+ /** Count only bots in this category. */
+ botCategory?: Webflow.AeoBotCategory;
+ /** Maximum number of rows to return. Defaults to `100`, which is also the maximum. */
+ limit?: number;
+}
diff --git a/src/api/resources/sites/resources/aeo/resources/reports/client/requests/ReportsBotTrafficRequest.ts b/src/api/resources/sites/resources/aeo/resources/reports/client/requests/ReportsBotTrafficRequest.ts
new file mode 100644
index 00000000..ccf75a31
--- /dev/null
+++ b/src/api/resources/sites/resources/aeo/resources/reports/client/requests/ReportsBotTrafficRequest.ts
@@ -0,0 +1,23 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../../../../../../../index";
+
+/**
+ * @example
+ * {
+ * startTime: new Date("2026-09-01T00:00:00.000Z"),
+ * endTime: new Date("2026-09-08T00:00:00.000Z"),
+ * botProviders: ["openai"],
+ * botCategory: "agent"
+ * }
+ */
+export interface ReportsBotTrafficRequest {
+ /** Inclusive start of the time range. Must be a UTC timestamp ending in `Z`, such as `2026-09-01T00:00:00Z`. Offsets and date-only values aren't accepted. Seconds and milliseconds are optional. */
+ startTime: Date;
+ /** Exclusive end of the time range. Must be a UTC timestamp ending in `Z`, and later than `startTime`. The range can be at most 100 days. Can't be later than the start of the current UTC day, because today's data isn't available yet. */
+ endTime: Date;
+ /** Count only bots from these providers. Repeat the parameter for more than one, such as `botProviders=openai&botProviders=anthropic`. Comma-separated values aren't accepted. */
+ botProviders?: Webflow.AeoBotProvider | Webflow.AeoBotProvider[];
+ /** Count only bots in this category. */
+ botCategory?: Webflow.AeoBotCategory;
+}
diff --git a/src/api/resources/sites/resources/aeo/resources/reports/client/requests/ReportsCitationRateRequest.ts b/src/api/resources/sites/resources/aeo/resources/reports/client/requests/ReportsCitationRateRequest.ts
new file mode 100644
index 00000000..34bee03c
--- /dev/null
+++ b/src/api/resources/sites/resources/aeo/resources/reports/client/requests/ReportsCitationRateRequest.ts
@@ -0,0 +1,29 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../../../../../../../index";
+
+/**
+ * @example
+ * {
+ * startTime: new Date("2026-09-01T00:00:00.000Z"),
+ * endTime: new Date("2026-09-08T00:00:00.000Z"),
+ * breakdown: "topic",
+ * topicIds: ["68cdb4b5a699862fcd8c1a02"],
+ * promptIds: ["68cdb4b5a699862fcd8c1a01"],
+ * answerEngines: ["chat-gpt"]
+ * }
+ */
+export interface ReportsCitationRateRequest {
+ /** Inclusive start of the time range. Must be a UTC timestamp ending in `Z`, such as `2026-09-01T00:00:00Z`. Offsets and date-only values aren't accepted. Seconds and milliseconds are optional. */
+ startTime: Date;
+ /** Exclusive end of the time range. Must be a UTC timestamp ending in `Z`, and later than `startTime`. The range can be at most 100 days. */
+ endTime: Date;
+ /** Return one row per `topic` or per `prompt`. */
+ breakdown: Webflow.sites.aeo.ReportsCitationRateRequestBreakdown;
+ /** Include only these topics. Get topic IDs from [List Prompts](/data/reference/aeo-analytics/list-prompts). Repeat the parameter for more than one, up to 50. */
+ topicIds?: string | string[];
+ /** Include only these prompts. Get prompt IDs from [List Prompts](/data/reference/aeo-analytics/list-prompts). Repeat the parameter for more than one, up to 50. */
+ promptIds?: string | string[];
+ /** Include only responses from these answer engines. Repeat the parameter for more than one, such as `answerEngines=chat-gpt&answerEngines=claude`. */
+ answerEngines?: Webflow.AeoAnswerEngineKey | Webflow.AeoAnswerEngineKey[];
+}
diff --git a/src/api/resources/sites/resources/aeo/resources/reports/client/requests/ReportsCitationsRequest.ts b/src/api/resources/sites/resources/aeo/resources/reports/client/requests/ReportsCitationsRequest.ts
new file mode 100644
index 00000000..27ba1226
--- /dev/null
+++ b/src/api/resources/sites/resources/aeo/resources/reports/client/requests/ReportsCitationsRequest.ts
@@ -0,0 +1,32 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../../../../../../../index";
+
+/**
+ * @example
+ * {
+ * startTime: new Date("2026-09-01T00:00:00.000Z"),
+ * endTime: new Date("2026-09-08T00:00:00.000Z"),
+ * topicIds: ["68cdb4b5a699862fcd8c1a02"],
+ * promptIds: ["68cdb4b5a699862fcd8c1a01"],
+ * answerEngines: ["chat-gpt"],
+ * limit: 1,
+ * offset: 1
+ * }
+ */
+export interface ReportsCitationsRequest {
+ /** Inclusive start of the time range. Must be a UTC timestamp ending in `Z`, such as `2026-09-01T00:00:00Z`. Offsets and date-only values aren't accepted. Seconds and milliseconds are optional. */
+ startTime: Date;
+ /** Exclusive end of the time range. Must be a UTC timestamp ending in `Z`, and later than `startTime`. The range can be at most 100 days. */
+ endTime: Date;
+ /** Include only these topics. Get topic IDs from [List Prompts](/data/reference/aeo-analytics/list-prompts). Repeat the parameter for more than one, up to 50. */
+ topicIds?: string | string[];
+ /** Include only these prompts. Get prompt IDs from [List Prompts](/data/reference/aeo-analytics/list-prompts). Repeat the parameter for more than one, up to 50. */
+ promptIds?: string | string[];
+ /** Include only responses from these answer engines. Repeat the parameter for more than one, such as `answerEngines=chat-gpt&answerEngines=claude`. */
+ answerEngines?: Webflow.AeoAnswerEngineKey | Webflow.AeoAnswerEngineKey[];
+ /** Maximum number of responses to return. Defaults to `100`, up to a maximum of `1000`. */
+ limit?: number;
+ /** Number of responses to skip. Defaults to `0`. */
+ offset?: number;
+}
diff --git a/src/api/resources/sites/resources/aeo/resources/reports/client/requests/ReportsCitedDomainPathsRequest.ts b/src/api/resources/sites/resources/aeo/resources/reports/client/requests/ReportsCitedDomainPathsRequest.ts
new file mode 100644
index 00000000..d2ee676a
--- /dev/null
+++ b/src/api/resources/sites/resources/aeo/resources/reports/client/requests/ReportsCitedDomainPathsRequest.ts
@@ -0,0 +1,26 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../../../../../../../index";
+
+/**
+ * @example
+ * {
+ * startTime: new Date("2026-09-01T00:00:00.000Z"),
+ * endTime: new Date("2026-09-08T00:00:00.000Z"),
+ * domain: "example.org",
+ * topicIds: ["68cdb4b5a699862fcd8c1a02"],
+ * answerEngines: ["chat-gpt"]
+ * }
+ */
+export interface ReportsCitedDomainPathsRequest {
+ /** Inclusive start of the time range. Must be a UTC timestamp ending in `Z`, such as `2026-09-01T00:00:00Z`. Offsets and date-only values aren't accepted. Seconds and milliseconds are optional. */
+ startTime: Date;
+ /** Exclusive end of the time range. Must be a UTC timestamp ending in `Z`, and later than `startTime`. The range can be at most 100 days. */
+ endTime: Date;
+ /** The domain, as a bare hostname such as `example.com`, with no scheme, path, or port. Matched exactly, so `www.example.com` is a different domain. Send internationalized domains in punycode. */
+ domain: string;
+ /** Include only these topics. Get topic IDs from [List Prompts](/data/reference/aeo-analytics/list-prompts). Repeat the parameter for more than one, up to 50. */
+ topicIds?: string | string[];
+ /** Include only responses from these answer engines. Repeat the parameter for more than one, such as `answerEngines=chat-gpt&answerEngines=claude`. */
+ answerEngines?: Webflow.AeoAnswerEngineKey | Webflow.AeoAnswerEngineKey[];
+}
diff --git a/src/api/resources/sites/resources/aeo/resources/reports/client/requests/ReportsCompetitorCitationsRequest.ts b/src/api/resources/sites/resources/aeo/resources/reports/client/requests/ReportsCompetitorCitationsRequest.ts
new file mode 100644
index 00000000..38d8c9c5
--- /dev/null
+++ b/src/api/resources/sites/resources/aeo/resources/reports/client/requests/ReportsCompetitorCitationsRequest.ts
@@ -0,0 +1,26 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../../../../../../../index";
+
+/**
+ * @example
+ * {
+ * startTime: new Date("2026-09-01T00:00:00.000Z"),
+ * endTime: new Date("2026-09-08T00:00:00.000Z"),
+ * topicIds: ["68cdb4b5a699862fcd8c1a02"],
+ * answerEngines: ["chat-gpt"],
+ * limit: 1
+ * }
+ */
+export interface ReportsCompetitorCitationsRequest {
+ /** Inclusive start of the time range. Must be a UTC timestamp ending in `Z`, such as `2026-09-01T00:00:00Z`. Offsets and date-only values aren't accepted. Seconds and milliseconds are optional. */
+ startTime: Date;
+ /** Exclusive end of the time range. Must be a UTC timestamp ending in `Z`, and later than `startTime`. The range can be at most 100 days. */
+ endTime: Date;
+ /** Include only these topics. Get topic IDs from [List Prompts](/data/reference/aeo-analytics/list-prompts). Repeat the parameter for more than one, up to 50. */
+ topicIds?: string | string[];
+ /** Include only responses from these answer engines. Repeat the parameter for more than one, such as `answerEngines=chat-gpt&answerEngines=claude`. */
+ answerEngines?: Webflow.AeoAnswerEngineKey | Webflow.AeoAnswerEngineKey[];
+ /** Maximum number of responses to return. Defaults to `10`, up to a maximum of `1000`. */
+ limit?: number;
+}
diff --git a/src/api/resources/sites/resources/aeo/resources/reports/client/requests/ReportsPageCitationShareRequest.ts b/src/api/resources/sites/resources/aeo/resources/reports/client/requests/ReportsPageCitationShareRequest.ts
new file mode 100644
index 00000000..1997adf2
--- /dev/null
+++ b/src/api/resources/sites/resources/aeo/resources/reports/client/requests/ReportsPageCitationShareRequest.ts
@@ -0,0 +1,32 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../../../../../../../index";
+
+/**
+ * @example
+ * {
+ * startTime: new Date("2026-09-01T00:00:00.000Z"),
+ * endTime: new Date("2026-09-08T00:00:00.000Z"),
+ * pageId: "68cdb4b5a699862fcd8c1a30",
+ * collectionId: "68cdb4b5a699862fcd8c1a40",
+ * itemSlug: "dont-panic",
+ * breakdown: "prompt",
+ * answerEngines: ["chat-gpt"]
+ * }
+ */
+export interface ReportsPageCitationShareRequest {
+ /** Inclusive start of the time range. Must be a UTC timestamp ending in `Z`, such as `2026-09-01T00:00:00Z`. Offsets and date-only values aren't accepted. Seconds and milliseconds are optional. */
+ startTime: Date;
+ /** Exclusive end of the time range. Must be a UTC timestamp ending in `Z`, and later than `startTime`. The range can be at most 100 days. */
+ endTime: Date;
+ /** The page ID. For a CMS item, the ID of its template page. */
+ pageId: string;
+ /** The CMS collection ID, for a CMS item. Send it with `itemSlug`. */
+ collectionId?: string;
+ /** The CMS item's slug, for a CMS item. Send it with `collectionId`. */
+ itemSlug?: string;
+ /** Set to `prompt` to return one row per prompt that cited the page. */
+ breakdown?: "prompt";
+ /** Include only responses from these answer engines. Repeat the parameter for more than one, such as `answerEngines=chat-gpt&answerEngines=claude`. */
+ answerEngines?: Webflow.AeoAnswerEngineKey | Webflow.AeoAnswerEngineKey[];
+}
diff --git a/src/api/resources/sites/resources/aeo/resources/reports/client/requests/ReportsTopCitedDomainsRequest.ts b/src/api/resources/sites/resources/aeo/resources/reports/client/requests/ReportsTopCitedDomainsRequest.ts
new file mode 100644
index 00000000..8975d8ea
--- /dev/null
+++ b/src/api/resources/sites/resources/aeo/resources/reports/client/requests/ReportsTopCitedDomainsRequest.ts
@@ -0,0 +1,26 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../../../../../../../index";
+
+/**
+ * @example
+ * {
+ * startTime: new Date("2026-09-01T00:00:00.000Z"),
+ * endTime: new Date("2026-09-08T00:00:00.000Z"),
+ * topicIds: ["68cdb4b5a699862fcd8c1a02"],
+ * answerEngines: ["chat-gpt"],
+ * limit: 1
+ * }
+ */
+export interface ReportsTopCitedDomainsRequest {
+ /** Inclusive start of the time range. Must be a UTC timestamp ending in `Z`, such as `2026-09-01T00:00:00Z`. Offsets and date-only values aren't accepted. Seconds and milliseconds are optional. */
+ startTime: Date;
+ /** Exclusive end of the time range. Must be a UTC timestamp ending in `Z`, and later than `startTime`. The range can be at most 100 days. */
+ endTime: Date;
+ /** Include only these topics. Get topic IDs from [List Prompts](/data/reference/aeo-analytics/list-prompts). Repeat the parameter for more than one, up to 50. */
+ topicIds?: string | string[];
+ /** Include only responses from these answer engines. Repeat the parameter for more than one, such as `answerEngines=chat-gpt&answerEngines=claude`. */
+ answerEngines?: Webflow.AeoAnswerEngineKey | Webflow.AeoAnswerEngineKey[];
+ /** Number of top domains to return. Defaults to `5`, up to a maximum of `100`. */
+ limit?: number;
+}
diff --git a/src/api/resources/sites/resources/aeo/resources/reports/client/requests/ReportsVisibilityBreakdownRequest.ts b/src/api/resources/sites/resources/aeo/resources/reports/client/requests/ReportsVisibilityBreakdownRequest.ts
new file mode 100644
index 00000000..9abb2b05
--- /dev/null
+++ b/src/api/resources/sites/resources/aeo/resources/reports/client/requests/ReportsVisibilityBreakdownRequest.ts
@@ -0,0 +1,32 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../../../../../../../index";
+
+/**
+ * @example
+ * {
+ * startTime: new Date("2026-09-01T00:00:00.000Z"),
+ * endTime: new Date("2026-09-08T00:00:00.000Z"),
+ * breakdown: "topic",
+ * limit: 1,
+ * topicIds: ["68cdb4b5a699862fcd8c1a02"],
+ * promptIds: ["68cdb4b5a699862fcd8c1a01"],
+ * answerEngine: "chat-gpt"
+ * }
+ */
+export interface ReportsVisibilityBreakdownRequest {
+ /** Inclusive start of the time range. Must be a UTC timestamp ending in `Z`, such as `2026-09-01T00:00:00Z`. Offsets and date-only values aren't accepted. Seconds and milliseconds are optional. */
+ startTime: Date;
+ /** Exclusive end of the time range. Must be a UTC timestamp ending in `Z`, and later than `startTime`. The range can be at most 100 days. */
+ endTime: Date;
+ /** Return one row per `topic` or per `prompt`. */
+ breakdown: Webflow.sites.aeo.ReportsVisibilityBreakdownRequestBreakdown;
+ /** Maximum number of rows to return, up to `100`. Omit it to return every row. */
+ limit?: number;
+ /** Include only these topics. Get topic IDs from [List Prompts](/data/reference/aeo-analytics/list-prompts). Repeat the parameter for more than one, up to 50. */
+ topicIds?: string | string[];
+ /** Include only these prompts. Get prompt IDs from [List Prompts](/data/reference/aeo-analytics/list-prompts). Repeat the parameter for more than one, up to 50. */
+ promptIds?: string | string[];
+ /** Include only responses from this answer engine. */
+ answerEngine?: Webflow.AeoAnswerEngineKey;
+}
diff --git a/src/api/resources/sites/resources/aeo/resources/reports/client/requests/ReportsVisibilityRequest.ts b/src/api/resources/sites/resources/aeo/resources/reports/client/requests/ReportsVisibilityRequest.ts
new file mode 100644
index 00000000..679e75fc
--- /dev/null
+++ b/src/api/resources/sites/resources/aeo/resources/reports/client/requests/ReportsVisibilityRequest.ts
@@ -0,0 +1,28 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../../../../../../../index";
+
+/**
+ * @example
+ * {
+ * startTime: new Date("2026-09-01T00:00:00.000Z"),
+ * endTime: new Date("2026-09-08T00:00:00.000Z"),
+ * topicIds: ["68cdb4b5a699862fcd8c1a02"],
+ * promptIds: ["68cdb4b5a699862fcd8c1a01"],
+ * answerEngine: "chat-gpt"
+ * }
+ */
+export interface ReportsVisibilityRequest {
+ /** Inclusive start of the time range. Must be a UTC timestamp ending in `Z`, such as `2026-09-01T00:00:00Z`. Offsets and date-only values aren't accepted. Seconds and milliseconds are optional. */
+ startTime: Date;
+ /** Exclusive end of the time range. Must be a UTC timestamp ending in `Z`, and later than `startTime`. The range can be at most 100 days. */
+ endTime: Date;
+ /** Include only these topics. Get topic IDs from [List Prompts](/data/reference/aeo-analytics/list-prompts). Repeat the parameter for more than one, up to 50. */
+ topicIds?: string | string[];
+ /** Include only these prompts. Get prompt IDs from [List Prompts](/data/reference/aeo-analytics/list-prompts). Repeat the parameter for more than one, up to 50. */
+ promptIds?: string | string[];
+ /** Include only responses from this answer engine. */
+ answerEngine?: Webflow.AeoAnswerEngineKey;
+ /** Return one score per day or week. Send both fields in bracket notation, such as `timeseries[granularityPeriod]=day×eries[bucketTimeZone]=America/New_York`. */
+ timeseries?: Webflow.AeoTimeseries;
+}
diff --git a/src/api/resources/sites/resources/aeo/resources/reports/client/requests/index.ts b/src/api/resources/sites/resources/aeo/resources/reports/client/requests/index.ts
new file mode 100644
index 00000000..87d8592a
--- /dev/null
+++ b/src/api/resources/sites/resources/aeo/resources/reports/client/requests/index.ts
@@ -0,0 +1,10 @@
+export type { ReportsBotTrafficPagesRequest } from "./ReportsBotTrafficPagesRequest";
+export type { ReportsBotTrafficRequest } from "./ReportsBotTrafficRequest";
+export type { ReportsCitationRateRequest } from "./ReportsCitationRateRequest";
+export type { ReportsCitationsRequest } from "./ReportsCitationsRequest";
+export type { ReportsCitedDomainPathsRequest } from "./ReportsCitedDomainPathsRequest";
+export type { ReportsCompetitorCitationsRequest } from "./ReportsCompetitorCitationsRequest";
+export type { ReportsPageCitationShareRequest } from "./ReportsPageCitationShareRequest";
+export type { ReportsTopCitedDomainsRequest } from "./ReportsTopCitedDomainsRequest";
+export type { ReportsVisibilityBreakdownRequest } from "./ReportsVisibilityBreakdownRequest";
+export type { ReportsVisibilityRequest } from "./ReportsVisibilityRequest";
diff --git a/src/api/resources/sites/resources/aeo/resources/reports/exports.ts b/src/api/resources/sites/resources/aeo/resources/reports/exports.ts
new file mode 100644
index 00000000..476ee9ab
--- /dev/null
+++ b/src/api/resources/sites/resources/aeo/resources/reports/exports.ts
@@ -0,0 +1,4 @@
+// This file was auto-generated by Fern from our API Definition.
+
+export { ReportsClient } from "./client/Client";
+export * from "./client/index";
diff --git a/src/api/resources/sites/resources/aeo/resources/reports/index.ts b/src/api/resources/sites/resources/aeo/resources/reports/index.ts
new file mode 100644
index 00000000..d2ec2302
--- /dev/null
+++ b/src/api/resources/sites/resources/aeo/resources/reports/index.ts
@@ -0,0 +1,2 @@
+export * from "./client";
+export * from "./types";
diff --git a/src/api/resources/sites/resources/aeo/resources/reports/types/ReportsCitationRateRequestBreakdown.ts b/src/api/resources/sites/resources/aeo/resources/reports/types/ReportsCitationRateRequestBreakdown.ts
new file mode 100644
index 00000000..bdebc40d
--- /dev/null
+++ b/src/api/resources/sites/resources/aeo/resources/reports/types/ReportsCitationRateRequestBreakdown.ts
@@ -0,0 +1,8 @@
+// This file was auto-generated by Fern from our API Definition.
+
+export const ReportsCitationRateRequestBreakdown = {
+ Topic: "topic",
+ Prompt: "prompt",
+} as const;
+export type ReportsCitationRateRequestBreakdown =
+ (typeof ReportsCitationRateRequestBreakdown)[keyof typeof ReportsCitationRateRequestBreakdown];
diff --git a/src/api/resources/sites/resources/aeo/resources/reports/types/ReportsVisibilityBreakdownRequestBreakdown.ts b/src/api/resources/sites/resources/aeo/resources/reports/types/ReportsVisibilityBreakdownRequestBreakdown.ts
new file mode 100644
index 00000000..e4ef1514
--- /dev/null
+++ b/src/api/resources/sites/resources/aeo/resources/reports/types/ReportsVisibilityBreakdownRequestBreakdown.ts
@@ -0,0 +1,8 @@
+// This file was auto-generated by Fern from our API Definition.
+
+export const ReportsVisibilityBreakdownRequestBreakdown = {
+ Topic: "topic",
+ Prompt: "prompt",
+} as const;
+export type ReportsVisibilityBreakdownRequestBreakdown =
+ (typeof ReportsVisibilityBreakdownRequestBreakdown)[keyof typeof ReportsVisibilityBreakdownRequestBreakdown];
diff --git a/src/api/resources/sites/resources/aeo/resources/reports/types/index.ts b/src/api/resources/sites/resources/aeo/resources/reports/types/index.ts
new file mode 100644
index 00000000..44c19d7d
--- /dev/null
+++ b/src/api/resources/sites/resources/aeo/resources/reports/types/index.ts
@@ -0,0 +1,2 @@
+export * from "./ReportsCitationRateRequestBreakdown";
+export * from "./ReportsVisibilityBreakdownRequestBreakdown";
diff --git a/src/api/resources/sites/resources/comments/client/Client.ts b/src/api/resources/sites/resources/comments/client/Client.ts
index 381f866a..de0d5496 100644
--- a/src/api/resources/sites/resources/comments/client/Client.ts
+++ b/src/api/resources/sites/resources/comments/client/Client.ts
@@ -353,6 +353,156 @@ export class CommentsClient {
);
}
+ /**
+ * Resolve or unresolve a comment thread.
+ *
+ *
+ * This endpoint is rate limited to 60 requests per minute per site.
+ *
+ *
+ * Required scope | `comments:write`
+ *
+ * @param {string} site_id - Unique identifier for a Site
+ * @param {string} comment_thread_id - Unique identifier for a Comment Thread
+ * @param {Webflow.sites.ResolveCommentThreadRequest} request
+ * @param {CommentsClient.RequestOptions} requestOptions - Request-specific configuration.
+ *
+ * @throws {@link Webflow.BadRequestError}
+ * @throws {@link Webflow.UnauthorizedError}
+ * @throws {@link Webflow.NotFoundError}
+ * @throws {@link Webflow.TooManyRequestsError}
+ * @throws {@link Webflow.InternalServerError}
+ *
+ * @example
+ * await client.sites.comments.resolveCommentThread("580e63e98c9a982ac9b8b741", "580e63e98c9a982ac9b8b741", {
+ * resolved: true
+ * })
+ */
+ public resolveCommentThread(
+ site_id: string,
+ comment_thread_id: string,
+ request: Webflow.sites.ResolveCommentThreadRequest,
+ requestOptions?: CommentsClient.RequestOptions,
+ ): core.HttpResponsePromise {
+ return core.HttpResponsePromise.fromPromise(
+ this.__resolveCommentThread(site_id, comment_thread_id, request, requestOptions),
+ );
+ }
+
+ private async __resolveCommentThread(
+ site_id: string,
+ comment_thread_id: string,
+ request: Webflow.sites.ResolveCommentThreadRequest,
+ requestOptions?: CommentsClient.RequestOptions,
+ ): Promise> {
+ const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest();
+ const _headers: core.Fetcher.Args["headers"] = mergeHeaders(
+ _authRequest.headers,
+ this._options?.headers,
+ requestOptions?.headers,
+ );
+ const _response = await core.fetcher({
+ url: core.url.join(
+ (await core.Supplier.get(this._options.baseUrl)) ??
+ ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi)
+ .base,
+ `sites/${core.url.encodePathParam(site_id)}/comments/${core.url.encodePathParam(comment_thread_id)}`,
+ ),
+ method: "PATCH",
+ headers: _headers,
+ contentType: "application/json",
+ queryParameters: requestOptions?.queryParams,
+ requestType: "json",
+ body: serializers.sites.ResolveCommentThreadRequest.jsonOrThrow(request, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ omitUndefined: true,
+ }),
+ timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000,
+ maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries,
+ abortSignal: requestOptions?.abortSignal,
+ fetchFn: this._options?.fetch,
+ logging: this._options.logging,
+ });
+ if (_response.ok) {
+ return {
+ data: serializers.CommentThread.parseOrThrow(_response.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ rawResponse: _response.rawResponse,
+ };
+ }
+
+ if (_response.error.reason === "status-code") {
+ switch (_response.error.statusCode) {
+ case 400:
+ throw new Webflow.BadRequestError(_response.error.body, _response.rawResponse);
+ case 401:
+ throw new Webflow.UnauthorizedError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 404:
+ throw new Webflow.NotFoundError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 429:
+ throw new Webflow.TooManyRequestsError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 500:
+ throw new Webflow.InternalServerError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ default:
+ throw new errors.WebflowError({
+ statusCode: _response.error.statusCode,
+ body: _response.error.body,
+ rawResponse: _response.rawResponse,
+ });
+ }
+ }
+
+ return handleNonStatusCodeError(
+ _response.error,
+ _response.rawResponse,
+ "PATCH",
+ "/sites/{site_id}/comments/{comment_thread_id}",
+ );
+ }
+
/**
* List all replies to a specific comment thread.
*
@@ -522,4 +672,157 @@ export class CommentsClient {
"/sites/{site_id}/comments/{comment_thread_id}/replies",
);
}
+
+ /**
+ * Create a reply to an existing comment thread.
+ *
+ * The reply author is always the user who authorized the OAuth token.
+ * To @mention a user in the reply, include their user ID in double square brackets in the `content` field, as in `[[userId]]`.
+ *
+ *
+ * The `comment_created` webhook fires automatically when a reply is created.
+ *
+ *
+ * Required scope | `comments:write`
+ *
+ * @param {string} site_id - Unique identifier for a Site
+ * @param {string} comment_thread_id - Unique identifier for a Comment Thread
+ * @param {Webflow.sites.CreateCommentReplyRequest} request
+ * @param {CommentsClient.RequestOptions} requestOptions - Request-specific configuration.
+ *
+ * @throws {@link Webflow.BadRequestError}
+ * @throws {@link Webflow.UnauthorizedError}
+ * @throws {@link Webflow.NotFoundError}
+ * @throws {@link Webflow.TooManyRequestsError}
+ * @throws {@link Webflow.InternalServerError}
+ *
+ * @example
+ * await client.sites.comments.createCommentReply("580e63e98c9a982ac9b8b741", "580e63e98c9a982ac9b8b741", {
+ * content: "Thanks for the feedback [[6287ec36a841b25637c663df]]!"
+ * })
+ */
+ public createCommentReply(
+ site_id: string,
+ comment_thread_id: string,
+ request: Webflow.sites.CreateCommentReplyRequest,
+ requestOptions?: CommentsClient.RequestOptions,
+ ): core.HttpResponsePromise {
+ return core.HttpResponsePromise.fromPromise(
+ this.__createCommentReply(site_id, comment_thread_id, request, requestOptions),
+ );
+ }
+
+ private async __createCommentReply(
+ site_id: string,
+ comment_thread_id: string,
+ request: Webflow.sites.CreateCommentReplyRequest,
+ requestOptions?: CommentsClient.RequestOptions,
+ ): Promise> {
+ const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest();
+ const _headers: core.Fetcher.Args["headers"] = mergeHeaders(
+ _authRequest.headers,
+ this._options?.headers,
+ requestOptions?.headers,
+ );
+ const _response = await core.fetcher({
+ url: core.url.join(
+ (await core.Supplier.get(this._options.baseUrl)) ??
+ ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi)
+ .base,
+ `sites/${core.url.encodePathParam(site_id)}/comments/${core.url.encodePathParam(comment_thread_id)}/replies`,
+ ),
+ method: "POST",
+ headers: _headers,
+ contentType: "application/json",
+ queryParameters: requestOptions?.queryParams,
+ requestType: "json",
+ body: serializers.sites.CreateCommentReplyRequest.jsonOrThrow(request, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ omitUndefined: true,
+ }),
+ timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000,
+ maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries,
+ abortSignal: requestOptions?.abortSignal,
+ fetchFn: this._options?.fetch,
+ logging: this._options.logging,
+ });
+ if (_response.ok) {
+ return {
+ data: serializers.CommentReply.parseOrThrow(_response.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ rawResponse: _response.rawResponse,
+ };
+ }
+
+ if (_response.error.reason === "status-code") {
+ switch (_response.error.statusCode) {
+ case 400:
+ throw new Webflow.BadRequestError(_response.error.body, _response.rawResponse);
+ case 401:
+ throw new Webflow.UnauthorizedError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 404:
+ throw new Webflow.NotFoundError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 429:
+ throw new Webflow.TooManyRequestsError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 500:
+ throw new Webflow.InternalServerError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ default:
+ throw new errors.WebflowError({
+ statusCode: _response.error.statusCode,
+ body: _response.error.body,
+ rawResponse: _response.rawResponse,
+ });
+ }
+ }
+
+ return handleNonStatusCodeError(
+ _response.error,
+ _response.rawResponse,
+ "POST",
+ "/sites/{site_id}/comments/{comment_thread_id}/replies",
+ );
+ }
}
diff --git a/src/api/resources/sites/resources/comments/client/requests/CreateCommentReplyRequest.ts b/src/api/resources/sites/resources/comments/client/requests/CreateCommentReplyRequest.ts
new file mode 100644
index 00000000..26283320
--- /dev/null
+++ b/src/api/resources/sites/resources/comments/client/requests/CreateCommentReplyRequest.ts
@@ -0,0 +1,12 @@
+// This file was auto-generated by Fern from our API Definition.
+
+/**
+ * @example
+ * {
+ * content: "Thanks for the feedback [[6287ec36a841b25637c663df]]!"
+ * }
+ */
+export interface CreateCommentReplyRequest {
+ /** The text content of the reply. To @mention a user, include their user ID in double square brackets, as in `[[userId]]`. */
+ content: string;
+}
diff --git a/src/api/resources/sites/resources/comments/client/requests/ResolveCommentThreadRequest.ts b/src/api/resources/sites/resources/comments/client/requests/ResolveCommentThreadRequest.ts
new file mode 100644
index 00000000..2d8ecc77
--- /dev/null
+++ b/src/api/resources/sites/resources/comments/client/requests/ResolveCommentThreadRequest.ts
@@ -0,0 +1,12 @@
+// This file was auto-generated by Fern from our API Definition.
+
+/**
+ * @example
+ * {
+ * resolved: true
+ * }
+ */
+export interface ResolveCommentThreadRequest {
+ /** Set to `true` to resolve the thread, or `false` to unresolve it */
+ resolved: boolean;
+}
diff --git a/src/api/resources/sites/resources/comments/client/requests/index.ts b/src/api/resources/sites/resources/comments/client/requests/index.ts
index 28bcd5b9..f18484ca 100644
--- a/src/api/resources/sites/resources/comments/client/requests/index.ts
+++ b/src/api/resources/sites/resources/comments/client/requests/index.ts
@@ -1,3 +1,5 @@
export type { CommentsGetCommentThreadRequest } from "./CommentsGetCommentThreadRequest";
export type { CommentsListCommentRepliesRequest } from "./CommentsListCommentRepliesRequest";
export type { CommentsListCommentThreadsRequest } from "./CommentsListCommentThreadsRequest";
+export type { CreateCommentReplyRequest } from "./CreateCommentReplyRequest";
+export type { ResolveCommentThreadRequest } from "./ResolveCommentThreadRequest";
diff --git a/src/api/resources/sites/resources/googleTag/client/Client.ts b/src/api/resources/sites/resources/googleTag/client/Client.ts
new file mode 100644
index 00000000..accb68de
--- /dev/null
+++ b/src/api/resources/sites/resources/googleTag/client/Client.ts
@@ -0,0 +1,547 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient";
+import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient";
+import * as core from "../../../../../../core";
+import { mergeHeaders } from "../../../../../../core/headers";
+import * as environments from "../../../../../../environments";
+import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError";
+import * as errors from "../../../../../../errors/index";
+import * as serializers from "../../../../../../serialization/index";
+import * as Webflow from "../../../../../index";
+
+export declare namespace GoogleTagClient {
+ export type Options = BaseClientOptions;
+
+ export interface RequestOptions extends BaseRequestOptions {}
+}
+
+export class GoogleTagClient {
+ protected readonly _options: NormalizedClientOptionsWithAuth;
+
+ constructor(options: GoogleTagClient.Options) {
+ this._options = normalizeClientOptionsWithAuth(options);
+ }
+
+ /**
+ * List all Google Tag IDs configured for a site, sorted by order.
+ *
+ * Required scope: `sites:read`
+ *
+ * @param {string} site_id - Unique identifier for a Site
+ * @param {GoogleTagClient.RequestOptions} requestOptions - Request-specific configuration.
+ *
+ * @throws {@link Webflow.BadRequestError}
+ * @throws {@link Webflow.UnauthorizedError}
+ * @throws {@link Webflow.NotFoundError}
+ * @throws {@link Webflow.TooManyRequestsError}
+ * @throws {@link Webflow.InternalServerError}
+ *
+ * @example
+ * await client.sites.googleTag.list("580e63e98c9a982ac9b8b741")
+ */
+ public list(
+ site_id: string,
+ requestOptions?: GoogleTagClient.RequestOptions,
+ ): core.HttpResponsePromise {
+ return core.HttpResponsePromise.fromPromise(this.__list(site_id, requestOptions));
+ }
+
+ private async __list(
+ site_id: string,
+ requestOptions?: GoogleTagClient.RequestOptions,
+ ): Promise> {
+ const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest();
+ const _headers: core.Fetcher.Args["headers"] = mergeHeaders(
+ _authRequest.headers,
+ this._options?.headers,
+ requestOptions?.headers,
+ );
+ const _response = await core.fetcher({
+ url: core.url.join(
+ (await core.Supplier.get(this._options.baseUrl)) ??
+ ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi)
+ .base,
+ `sites/${core.url.encodePathParam(site_id)}/integrations/google_tags`,
+ ),
+ method: "GET",
+ headers: _headers,
+ queryParameters: requestOptions?.queryParams,
+ timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000,
+ maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries,
+ abortSignal: requestOptions?.abortSignal,
+ fetchFn: this._options?.fetch,
+ logging: this._options.logging,
+ });
+ if (_response.ok) {
+ return {
+ data: serializers.GoogleTagIds.parseOrThrow(_response.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ rawResponse: _response.rawResponse,
+ };
+ }
+
+ if (_response.error.reason === "status-code") {
+ switch (_response.error.statusCode) {
+ case 400:
+ throw new Webflow.BadRequestError(_response.error.body, _response.rawResponse);
+ case 401:
+ throw new Webflow.UnauthorizedError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 404:
+ throw new Webflow.NotFoundError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 429:
+ throw new Webflow.TooManyRequestsError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 500:
+ throw new Webflow.InternalServerError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ default:
+ throw new errors.WebflowError({
+ statusCode: _response.error.statusCode,
+ body: _response.error.body,
+ rawResponse: _response.rawResponse,
+ });
+ }
+ }
+
+ return handleNonStatusCodeError(
+ _response.error,
+ _response.rawResponse,
+ "GET",
+ "/sites/{site_id}/integrations/google_tags",
+ );
+ }
+
+ /**
+ * Delete all Google Tag IDs from a site.
+ *
+ * Required scope: `sites:write`
+ *
+ * @param {string} site_id - Unique identifier for a Site
+ * @param {GoogleTagClient.RequestOptions} requestOptions - Request-specific configuration.
+ *
+ * @throws {@link Webflow.BadRequestError}
+ * @throws {@link Webflow.UnauthorizedError}
+ * @throws {@link Webflow.NotFoundError}
+ * @throws {@link Webflow.TooManyRequestsError}
+ * @throws {@link Webflow.InternalServerError}
+ *
+ * @example
+ * await client.sites.googleTag.deleteAll("580e63e98c9a982ac9b8b741")
+ */
+ public deleteAll(site_id: string, requestOptions?: GoogleTagClient.RequestOptions): core.HttpResponsePromise {
+ return core.HttpResponsePromise.fromPromise(this.__deleteAll(site_id, requestOptions));
+ }
+
+ private async __deleteAll(
+ site_id: string,
+ requestOptions?: GoogleTagClient.RequestOptions,
+ ): Promise> {
+ const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest();
+ const _headers: core.Fetcher.Args["headers"] = mergeHeaders(
+ _authRequest.headers,
+ this._options?.headers,
+ requestOptions?.headers,
+ );
+ const _response = await core.fetcher({
+ url: core.url.join(
+ (await core.Supplier.get(this._options.baseUrl)) ??
+ ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi)
+ .base,
+ `sites/${core.url.encodePathParam(site_id)}/integrations/google_tags`,
+ ),
+ method: "DELETE",
+ headers: _headers,
+ queryParameters: requestOptions?.queryParams,
+ timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000,
+ maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries,
+ abortSignal: requestOptions?.abortSignal,
+ fetchFn: this._options?.fetch,
+ logging: this._options.logging,
+ });
+ if (_response.ok) {
+ return { data: undefined, rawResponse: _response.rawResponse };
+ }
+
+ if (_response.error.reason === "status-code") {
+ switch (_response.error.statusCode) {
+ case 400:
+ throw new Webflow.BadRequestError(_response.error.body, _response.rawResponse);
+ case 401:
+ throw new Webflow.UnauthorizedError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 404:
+ throw new Webflow.NotFoundError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 429:
+ throw new Webflow.TooManyRequestsError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 500:
+ throw new Webflow.InternalServerError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ default:
+ throw new errors.WebflowError({
+ statusCode: _response.error.statusCode,
+ body: _response.error.body,
+ rawResponse: _response.rawResponse,
+ });
+ }
+ }
+
+ return handleNonStatusCodeError(
+ _response.error,
+ _response.rawResponse,
+ "DELETE",
+ "/sites/{site_id}/integrations/google_tags",
+ );
+ }
+
+ /**
+ * Add or update Google Tag IDs for a site. Existing tags not referenced in the request are preserved. A site may have a maximum of 25 tags total.
+ *
+ * `order` is optional on input — it is auto-assigned for new tags and returned on all tags in the response.
+ *
+ * Required scope: `sites:write`
+ *
+ * @param {string} site_id - Unique identifier for a Site
+ * @param {Webflow.GoogleTagIds} request
+ * @param {GoogleTagClient.RequestOptions} requestOptions - Request-specific configuration.
+ *
+ * @throws {@link Webflow.BadRequestError}
+ * @throws {@link Webflow.UnauthorizedError}
+ * @throws {@link Webflow.NotFoundError}
+ * @throws {@link Webflow.TooManyRequestsError}
+ * @throws {@link Webflow.InternalServerError}
+ *
+ * @example
+ * await client.sites.googleTag.upsert("580e63e98c9a982ac9b8b741", {
+ * googleTagIds: [{
+ * order: 0,
+ * displayName: "Main Analytics Tag",
+ * tagId: "G-1234567890"
+ * }]
+ * })
+ */
+ public upsert(
+ site_id: string,
+ request: Webflow.GoogleTagIds,
+ requestOptions?: GoogleTagClient.RequestOptions,
+ ): core.HttpResponsePromise {
+ return core.HttpResponsePromise.fromPromise(this.__upsert(site_id, request, requestOptions));
+ }
+
+ private async __upsert(
+ site_id: string,
+ request: Webflow.GoogleTagIds,
+ requestOptions?: GoogleTagClient.RequestOptions,
+ ): Promise> {
+ const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest();
+ const _headers: core.Fetcher.Args["headers"] = mergeHeaders(
+ _authRequest.headers,
+ this._options?.headers,
+ requestOptions?.headers,
+ );
+ const _response = await core.fetcher({
+ url: core.url.join(
+ (await core.Supplier.get(this._options.baseUrl)) ??
+ ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi)
+ .base,
+ `sites/${core.url.encodePathParam(site_id)}/integrations/google_tags`,
+ ),
+ method: "PATCH",
+ headers: _headers,
+ contentType: "application/json",
+ queryParameters: requestOptions?.queryParams,
+ requestType: "json",
+ body: serializers.GoogleTagIds.jsonOrThrow(request, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ omitUndefined: true,
+ }),
+ timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000,
+ maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries,
+ abortSignal: requestOptions?.abortSignal,
+ fetchFn: this._options?.fetch,
+ logging: this._options.logging,
+ });
+ if (_response.ok) {
+ return {
+ data: serializers.GoogleTagIds.parseOrThrow(_response.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ rawResponse: _response.rawResponse,
+ };
+ }
+
+ if (_response.error.reason === "status-code") {
+ switch (_response.error.statusCode) {
+ case 400:
+ throw new Webflow.BadRequestError(_response.error.body, _response.rawResponse);
+ case 401:
+ throw new Webflow.UnauthorizedError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 404:
+ throw new Webflow.NotFoundError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 429:
+ throw new Webflow.TooManyRequestsError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 500:
+ throw new Webflow.InternalServerError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ default:
+ throw new errors.WebflowError({
+ statusCode: _response.error.statusCode,
+ body: _response.error.body,
+ rawResponse: _response.rawResponse,
+ });
+ }
+ }
+
+ return handleNonStatusCodeError(
+ _response.error,
+ _response.rawResponse,
+ "PATCH",
+ "/sites/{site_id}/integrations/google_tags",
+ );
+ }
+
+ /**
+ * Delete a single Google Tag ID from a site. The `order` values of the remaining tags are renormalized after deletion.
+ *
+ * Required scope: `sites:write`
+ *
+ * @param {string} site_id - Unique identifier for a Site
+ * @param {string} tag_id - The Google Tag ID (e.g. G-XXXXXXXXXX)
+ * @param {GoogleTagClient.RequestOptions} requestOptions - Request-specific configuration.
+ *
+ * @throws {@link Webflow.BadRequestError}
+ * @throws {@link Webflow.UnauthorizedError}
+ * @throws {@link Webflow.NotFoundError}
+ * @throws {@link Webflow.TooManyRequestsError}
+ * @throws {@link Webflow.InternalServerError}
+ *
+ * @example
+ * await client.sites.googleTag.delete("580e63e98c9a982ac9b8b741", "G-XXXXXXXXXX")
+ */
+ public delete(
+ site_id: string,
+ tag_id: string,
+ requestOptions?: GoogleTagClient.RequestOptions,
+ ): core.HttpResponsePromise {
+ return core.HttpResponsePromise.fromPromise(this.__delete(site_id, tag_id, requestOptions));
+ }
+
+ private async __delete(
+ site_id: string,
+ tag_id: string,
+ requestOptions?: GoogleTagClient.RequestOptions,
+ ): Promise> {
+ const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest();
+ const _headers: core.Fetcher.Args["headers"] = mergeHeaders(
+ _authRequest.headers,
+ this._options?.headers,
+ requestOptions?.headers,
+ );
+ const _response = await core.fetcher({
+ url: core.url.join(
+ (await core.Supplier.get(this._options.baseUrl)) ??
+ ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi)
+ .base,
+ `sites/${core.url.encodePathParam(site_id)}/integrations/google_tags/${core.url.encodePathParam(tag_id)}`,
+ ),
+ method: "DELETE",
+ headers: _headers,
+ queryParameters: requestOptions?.queryParams,
+ timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000,
+ maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries,
+ abortSignal: requestOptions?.abortSignal,
+ fetchFn: this._options?.fetch,
+ logging: this._options.logging,
+ });
+ if (_response.ok) {
+ return {
+ data: serializers.GoogleTagIds.parseOrThrow(_response.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ rawResponse: _response.rawResponse,
+ };
+ }
+
+ if (_response.error.reason === "status-code") {
+ switch (_response.error.statusCode) {
+ case 400:
+ throw new Webflow.BadRequestError(_response.error.body, _response.rawResponse);
+ case 401:
+ throw new Webflow.UnauthorizedError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 404:
+ throw new Webflow.NotFoundError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 429:
+ throw new Webflow.TooManyRequestsError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 500:
+ throw new Webflow.InternalServerError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ default:
+ throw new errors.WebflowError({
+ statusCode: _response.error.statusCode,
+ body: _response.error.body,
+ rawResponse: _response.rawResponse,
+ });
+ }
+ }
+
+ return handleNonStatusCodeError(
+ _response.error,
+ _response.rawResponse,
+ "DELETE",
+ "/sites/{site_id}/integrations/google_tags/{tag_id}",
+ );
+ }
+}
diff --git a/src/api/resources/sites/resources/googleTag/client/index.ts b/src/api/resources/sites/resources/googleTag/client/index.ts
new file mode 100644
index 00000000..cb0ff5c3
--- /dev/null
+++ b/src/api/resources/sites/resources/googleTag/client/index.ts
@@ -0,0 +1 @@
+export {};
diff --git a/src/api/resources/sites/resources/googleTag/exports.ts b/src/api/resources/sites/resources/googleTag/exports.ts
new file mode 100644
index 00000000..26cfd817
--- /dev/null
+++ b/src/api/resources/sites/resources/googleTag/exports.ts
@@ -0,0 +1,4 @@
+// This file was auto-generated by Fern from our API Definition.
+
+export { GoogleTagClient } from "./client/Client";
+export * from "./client/index";
diff --git a/src/api/resources/sites/resources/googleTag/index.ts b/src/api/resources/sites/resources/googleTag/index.ts
new file mode 100644
index 00000000..5ec76921
--- /dev/null
+++ b/src/api/resources/sites/resources/googleTag/index.ts
@@ -0,0 +1 @@
+export * from "./client";
diff --git a/src/api/resources/sites/resources/index.ts b/src/api/resources/sites/resources/index.ts
index 61f7706e..80bac2ac 100644
--- a/src/api/resources/sites/resources/index.ts
+++ b/src/api/resources/sites/resources/index.ts
@@ -1,10 +1,15 @@
export * as activityLogs from "./activityLogs";
export * from "./activityLogs/client/requests";
+export * as aeo from "./aeo";
export * as comments from "./comments";
export * from "./comments/client/requests";
export * from "./comments/types";
export * as forms from "./forms";
export * from "./forms/client/requests";
+export * as googleTag from "./googleTag";
+export * as members from "./members";
+export * from "./members/client/requests";
+export * from "./members/types";
export * as plans from "./plans";
export * as redirects from "./redirects";
export * as robotsTxt from "./robotsTxt";
diff --git a/src/api/resources/sites/resources/members/client/Client.ts b/src/api/resources/sites/resources/members/client/Client.ts
new file mode 100644
index 00000000..bd757021
--- /dev/null
+++ b/src/api/resources/sites/resources/members/client/Client.ts
@@ -0,0 +1,902 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient";
+import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient";
+import * as core from "../../../../../../core";
+import { mergeHeaders } from "../../../../../../core/headers";
+import * as environments from "../../../../../../environments";
+import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError";
+import * as errors from "../../../../../../errors/index";
+import * as serializers from "../../../../../../serialization/index";
+import * as Webflow from "../../../../../index";
+
+export declare namespace MembersClient {
+ export type Options = BaseClientOptions;
+
+ export interface RequestOptions extends BaseRequestOptions {}
+}
+
+export class MembersClient {
+ protected readonly _options: NormalizedClientOptionsWithAuth;
+
+ constructor(options: MembersClient.Options) {
+ this._options = normalizeClientOptionsWithAuth(options);
+ }
+
+ /**
+ * List the members of a site and the role each holds.
+ *
+ * This endpoint requires an Enterprise workspace.
+ *
+ * Required scope | `site_access:read`
+ *
+ * @param {string} site_id - Unique identifier for a Site
+ * @param {Webflow.sites.MembersListMembersRequest} request
+ * @param {MembersClient.RequestOptions} requestOptions - Request-specific configuration.
+ *
+ * @throws {@link Webflow.BadRequestError}
+ * @throws {@link Webflow.UnauthorizedError}
+ * @throws {@link Webflow.ForbiddenError}
+ * @throws {@link Webflow.NotFoundError}
+ * @throws {@link Webflow.TooManyRequestsError}
+ * @throws {@link Webflow.InternalServerError}
+ *
+ * @example
+ * await client.sites.members.listMembers("580e63e98c9a982ac9b8b741", {
+ * limit: 1,
+ * email: "email",
+ * cursor: "cursor"
+ * })
+ */
+ public listMembers(
+ site_id: string,
+ request: Webflow.sites.MembersListMembersRequest = {},
+ requestOptions?: MembersClient.RequestOptions,
+ ): core.HttpResponsePromise {
+ return core.HttpResponsePromise.fromPromise(this.__listMembers(site_id, request, requestOptions));
+ }
+
+ private async __listMembers(
+ site_id: string,
+ request: Webflow.sites.MembersListMembersRequest = {},
+ requestOptions?: MembersClient.RequestOptions,
+ ): Promise> {
+ const { limit, email, cursor } = request;
+ const _queryParams: Record = {
+ limit,
+ email,
+ cursor,
+ };
+ const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest();
+ const _headers: core.Fetcher.Args["headers"] = mergeHeaders(
+ _authRequest.headers,
+ this._options?.headers,
+ requestOptions?.headers,
+ );
+ const _response = await core.fetcher({
+ url: core.url.join(
+ (await core.Supplier.get(this._options.baseUrl)) ??
+ ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi)
+ .base,
+ `sites/${core.url.encodePathParam(site_id)}/members`,
+ ),
+ method: "GET",
+ headers: _headers,
+ queryParameters: { ..._queryParams, ...requestOptions?.queryParams },
+ timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000,
+ maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries,
+ abortSignal: requestOptions?.abortSignal,
+ fetchFn: this._options?.fetch,
+ logging: this._options.logging,
+ });
+ if (_response.ok) {
+ return {
+ data: serializers.SiteMembersResponse.parseOrThrow(_response.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ rawResponse: _response.rawResponse,
+ };
+ }
+
+ if (_response.error.reason === "status-code") {
+ switch (_response.error.statusCode) {
+ case 400:
+ throw new Webflow.BadRequestError(_response.error.body, _response.rawResponse);
+ case 401:
+ throw new Webflow.UnauthorizedError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 403:
+ throw new Webflow.ForbiddenError(_response.error.body, _response.rawResponse);
+ case 404:
+ throw new Webflow.NotFoundError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 429:
+ throw new Webflow.TooManyRequestsError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 500:
+ throw new Webflow.InternalServerError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ default:
+ throw new errors.WebflowError({
+ statusCode: _response.error.statusCode,
+ body: _response.error.body,
+ rawResponse: _response.rawResponse,
+ });
+ }
+ }
+
+ return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/sites/{site_id}/members");
+ }
+
+ /**
+ * Grant a workspace member access to a site, named by `email` or `memberId`.
+ *
+ * This creates access — it does not change an existing grant. A member who already has access to this site is refused with `member_already_has_access`; use `PATCH` to change their Site Role instead.
+ *
+ * This endpoint requires an Enterprise workspace.
+ *
+ * Required scope | `site_access:write`
+ *
+ * @param {string} site_id - Unique identifier for a Site
+ * @param {Webflow.sites.GrantSiteMemberRequestBody} request
+ * @param {MembersClient.RequestOptions} requestOptions - Request-specific configuration.
+ *
+ * @throws {@link Webflow.BadRequestError}
+ * @throws {@link Webflow.UnauthorizedError}
+ * @throws {@link Webflow.ForbiddenError}
+ * @throws {@link Webflow.NotFoundError}
+ * @throws {@link Webflow.ConflictError}
+ * @throws {@link Webflow.TooManyRequestsError}
+ * @throws {@link Webflow.InternalServerError}
+ *
+ * @example
+ * await client.sites.members.addMember("580e63e98c9a982ac9b8b741", {
+ * email: "waylon.dalton@example.com",
+ * siteRole: "designer"
+ * })
+ *
+ * @example
+ * await client.sites.members.addMember("580e63e98c9a982ac9b8b741", {
+ * memberId: "62fa5e47f6b8256f4641c5bd",
+ * siteRole: "custom",
+ * siteRoleId: "72fa5e47f6b8256f4641c5bd"
+ * })
+ */
+ public addMember(
+ site_id: string,
+ request: Webflow.sites.GrantSiteMemberRequestBody,
+ requestOptions?: MembersClient.RequestOptions,
+ ): core.HttpResponsePromise {
+ return core.HttpResponsePromise.fromPromise(this.__addMember(site_id, request, requestOptions));
+ }
+
+ private async __addMember(
+ site_id: string,
+ request: Webflow.sites.GrantSiteMemberRequestBody,
+ requestOptions?: MembersClient.RequestOptions,
+ ): Promise> {
+ const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest();
+ const _headers: core.Fetcher.Args["headers"] = mergeHeaders(
+ _authRequest.headers,
+ this._options?.headers,
+ requestOptions?.headers,
+ );
+ const _response = await core.fetcher({
+ url: core.url.join(
+ (await core.Supplier.get(this._options.baseUrl)) ??
+ ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi)
+ .base,
+ `sites/${core.url.encodePathParam(site_id)}/members`,
+ ),
+ method: "POST",
+ headers: _headers,
+ contentType: "application/json",
+ queryParameters: requestOptions?.queryParams,
+ requestType: "json",
+ body: serializers.sites.GrantSiteMemberRequestBody.jsonOrThrow(request, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ omitUndefined: true,
+ }),
+ timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000,
+ maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries,
+ abortSignal: requestOptions?.abortSignal,
+ fetchFn: this._options?.fetch,
+ logging: this._options.logging,
+ });
+ if (_response.ok) {
+ return {
+ data: serializers.SiteMember.parseOrThrow(_response.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ rawResponse: _response.rawResponse,
+ };
+ }
+
+ if (_response.error.reason === "status-code") {
+ switch (_response.error.statusCode) {
+ case 400:
+ throw new Webflow.BadRequestError(_response.error.body, _response.rawResponse);
+ case 401:
+ throw new Webflow.UnauthorizedError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 403:
+ throw new Webflow.ForbiddenError(_response.error.body, _response.rawResponse);
+ case 404:
+ throw new Webflow.NotFoundError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 409:
+ throw new Webflow.ConflictError(_response.error.body, _response.rawResponse);
+ case 429:
+ throw new Webflow.TooManyRequestsError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 500:
+ throw new Webflow.InternalServerError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ default:
+ throw new errors.WebflowError({
+ statusCode: _response.error.statusCode,
+ body: _response.error.body,
+ rawResponse: _response.rawResponse,
+ });
+ }
+ }
+
+ return handleNonStatusCodeError(_response.error, _response.rawResponse, "POST", "/sites/{site_id}/members");
+ }
+
+ /**
+ * Remove a member's access to a site, identifying them by email address.
+ *
+ * Idempotent on a member who already holds no access to this site — nothing is revoked and this reports success. Not idempotent on someone who isn't a workspace member at all, which returns a `404`.
+ *
+ * Equivalent to [Revoke Site Access](/data/reference/enterprise/site-access/remove-member), which identifies the member by ID instead.
+ *
+ * This endpoint requires an Enterprise workspace.
+ *
+ * Required scope | `site_access:write`
+ *
+ * @param {string} site_id - Unique identifier for a Site
+ * @param {Webflow.sites.MembersRemoveMemberByEmailRequest} request
+ * @param {MembersClient.RequestOptions} requestOptions - Request-specific configuration.
+ *
+ * @throws {@link Webflow.BadRequestError}
+ * @throws {@link Webflow.UnauthorizedError}
+ * @throws {@link Webflow.ForbiddenError}
+ * @throws {@link Webflow.NotFoundError}
+ * @throws {@link Webflow.ConflictError}
+ * @throws {@link Webflow.TooManyRequestsError}
+ * @throws {@link Webflow.InternalServerError}
+ *
+ * @example
+ * await client.sites.members.removeMemberByEmail("580e63e98c9a982ac9b8b741", {
+ * email: "email"
+ * })
+ */
+ public removeMemberByEmail(
+ site_id: string,
+ request: Webflow.sites.MembersRemoveMemberByEmailRequest,
+ requestOptions?: MembersClient.RequestOptions,
+ ): core.HttpResponsePromise {
+ return core.HttpResponsePromise.fromPromise(this.__removeMemberByEmail(site_id, request, requestOptions));
+ }
+
+ private async __removeMemberByEmail(
+ site_id: string,
+ request: Webflow.sites.MembersRemoveMemberByEmailRequest,
+ requestOptions?: MembersClient.RequestOptions,
+ ): Promise> {
+ const { email } = request;
+ const _queryParams: Record = {
+ email,
+ };
+ const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest();
+ const _headers: core.Fetcher.Args["headers"] = mergeHeaders(
+ _authRequest.headers,
+ this._options?.headers,
+ requestOptions?.headers,
+ );
+ const _response = await core.fetcher({
+ url: core.url.join(
+ (await core.Supplier.get(this._options.baseUrl)) ??
+ ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi)
+ .base,
+ `sites/${core.url.encodePathParam(site_id)}/members`,
+ ),
+ method: "DELETE",
+ headers: _headers,
+ queryParameters: { ..._queryParams, ...requestOptions?.queryParams },
+ timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000,
+ maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries,
+ abortSignal: requestOptions?.abortSignal,
+ fetchFn: this._options?.fetch,
+ logging: this._options.logging,
+ });
+ if (_response.ok) {
+ return { data: undefined, rawResponse: _response.rawResponse };
+ }
+
+ if (_response.error.reason === "status-code") {
+ switch (_response.error.statusCode) {
+ case 400:
+ throw new Webflow.BadRequestError(_response.error.body, _response.rawResponse);
+ case 401:
+ throw new Webflow.UnauthorizedError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 403:
+ throw new Webflow.ForbiddenError(_response.error.body, _response.rawResponse);
+ case 404:
+ throw new Webflow.NotFoundError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 409:
+ throw new Webflow.ConflictError(_response.error.body, _response.rawResponse);
+ case 429:
+ throw new Webflow.TooManyRequestsError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 500:
+ throw new Webflow.InternalServerError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ default:
+ throw new errors.WebflowError({
+ statusCode: _response.error.statusCode,
+ body: _response.error.body,
+ rawResponse: _response.rawResponse,
+ });
+ }
+ }
+
+ return handleNonStatusCodeError(_response.error, _response.rawResponse, "DELETE", "/sites/{site_id}/members");
+ }
+
+ /**
+ * Update a site member's role, identifying them by email address.
+ *
+ * On a site with Site-specific access enabled, the member must already hold access to this site — grant it first with `POST`. On a site open to the whole workspace, this call sets a per-site role for the first time.
+ *
+ * Equivalent to [Update Site Member Role](/data/reference/enterprise/site-access/update-member-role), which identifies the member by ID instead.
+ *
+ * This endpoint requires an Enterprise workspace.
+ *
+ * Required scope | `site_access:write`
+ *
+ * @param {string} site_id - Unique identifier for a Site
+ * @param {Webflow.sites.MembersUpdateMemberRoleByEmailRequest} request
+ * @param {MembersClient.RequestOptions} requestOptions - Request-specific configuration.
+ *
+ * @throws {@link Webflow.BadRequestError}
+ * @throws {@link Webflow.UnauthorizedError}
+ * @throws {@link Webflow.ForbiddenError}
+ * @throws {@link Webflow.NotFoundError}
+ * @throws {@link Webflow.ConflictError}
+ * @throws {@link Webflow.TooManyRequestsError}
+ * @throws {@link Webflow.InternalServerError}
+ *
+ * @example
+ * await client.sites.members.updateMemberRoleByEmail("580e63e98c9a982ac9b8b741", {
+ * email: "email",
+ * body: {
+ * siteRole: "content_editor"
+ * }
+ * })
+ */
+ public updateMemberRoleByEmail(
+ site_id: string,
+ request: Webflow.sites.MembersUpdateMemberRoleByEmailRequest,
+ requestOptions?: MembersClient.RequestOptions,
+ ): core.HttpResponsePromise {
+ return core.HttpResponsePromise.fromPromise(this.__updateMemberRoleByEmail(site_id, request, requestOptions));
+ }
+
+ private async __updateMemberRoleByEmail(
+ site_id: string,
+ request: Webflow.sites.MembersUpdateMemberRoleByEmailRequest,
+ requestOptions?: MembersClient.RequestOptions,
+ ): Promise> {
+ const { email, body: _body } = request;
+ const _queryParams: Record = {
+ email,
+ };
+ const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest();
+ const _headers: core.Fetcher.Args["headers"] = mergeHeaders(
+ _authRequest.headers,
+ this._options?.headers,
+ requestOptions?.headers,
+ );
+ const _response = await core.fetcher({
+ url: core.url.join(
+ (await core.Supplier.get(this._options.baseUrl)) ??
+ ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi)
+ .base,
+ `sites/${core.url.encodePathParam(site_id)}/members`,
+ ),
+ method: "PATCH",
+ headers: _headers,
+ contentType: "application/json",
+ queryParameters: { ..._queryParams, ...requestOptions?.queryParams },
+ requestType: "json",
+ body: serializers.UpdateSiteMemberRoleRequestBody.jsonOrThrow(_body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ omitUndefined: true,
+ }),
+ timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000,
+ maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries,
+ abortSignal: requestOptions?.abortSignal,
+ fetchFn: this._options?.fetch,
+ logging: this._options.logging,
+ });
+ if (_response.ok) {
+ return {
+ data: serializers.SiteMember.parseOrThrow(_response.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ rawResponse: _response.rawResponse,
+ };
+ }
+
+ if (_response.error.reason === "status-code") {
+ switch (_response.error.statusCode) {
+ case 400:
+ throw new Webflow.BadRequestError(_response.error.body, _response.rawResponse);
+ case 401:
+ throw new Webflow.UnauthorizedError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 403:
+ throw new Webflow.ForbiddenError(_response.error.body, _response.rawResponse);
+ case 404:
+ throw new Webflow.NotFoundError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 409:
+ throw new Webflow.ConflictError(_response.error.body, _response.rawResponse);
+ case 429:
+ throw new Webflow.TooManyRequestsError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 500:
+ throw new Webflow.InternalServerError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ default:
+ throw new errors.WebflowError({
+ statusCode: _response.error.statusCode,
+ body: _response.error.body,
+ rawResponse: _response.rawResponse,
+ });
+ }
+ }
+
+ return handleNonStatusCodeError(_response.error, _response.rawResponse, "PATCH", "/sites/{site_id}/members");
+ }
+
+ /**
+ * Remove a member's access to a site.
+ *
+ * Idempotent on a member who already holds no access to this site — nothing is revoked and this reports success. Not idempotent on someone who isn't a workspace member at all, which returns a `404`.
+ *
+ * To revoke by email address instead of by ID, see [Revoke Site Access (by email)](/data/reference/enterprise/site-access/remove-member-by-email).
+ *
+ * This endpoint requires an Enterprise workspace.
+ *
+ * Required scope | `site_access:write`
+ *
+ * @param {string} site_id - Unique identifier for a Site
+ * @param {string} member_id - Unique identifier for a Member
+ * @param {MembersClient.RequestOptions} requestOptions - Request-specific configuration.
+ *
+ * @throws {@link Webflow.BadRequestError}
+ * @throws {@link Webflow.UnauthorizedError}
+ * @throws {@link Webflow.ForbiddenError}
+ * @throws {@link Webflow.NotFoundError}
+ * @throws {@link Webflow.ConflictError}
+ * @throws {@link Webflow.TooManyRequestsError}
+ * @throws {@link Webflow.InternalServerError}
+ *
+ * @example
+ * await client.sites.members.removeMember("580e63e98c9a982ac9b8b741", "62fa5e47f6b8256f4641c5bd")
+ */
+ public removeMember(
+ site_id: string,
+ member_id: string,
+ requestOptions?: MembersClient.RequestOptions,
+ ): core.HttpResponsePromise {
+ return core.HttpResponsePromise.fromPromise(this.__removeMember(site_id, member_id, requestOptions));
+ }
+
+ private async __removeMember(
+ site_id: string,
+ member_id: string,
+ requestOptions?: MembersClient.RequestOptions,
+ ): Promise> {
+ const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest();
+ const _headers: core.Fetcher.Args["headers"] = mergeHeaders(
+ _authRequest.headers,
+ this._options?.headers,
+ requestOptions?.headers,
+ );
+ const _response = await core.fetcher({
+ url: core.url.join(
+ (await core.Supplier.get(this._options.baseUrl)) ??
+ ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi)
+ .base,
+ `sites/${core.url.encodePathParam(site_id)}/members/${core.url.encodePathParam(member_id)}`,
+ ),
+ method: "DELETE",
+ headers: _headers,
+ queryParameters: requestOptions?.queryParams,
+ timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000,
+ maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries,
+ abortSignal: requestOptions?.abortSignal,
+ fetchFn: this._options?.fetch,
+ logging: this._options.logging,
+ });
+ if (_response.ok) {
+ return { data: undefined, rawResponse: _response.rawResponse };
+ }
+
+ if (_response.error.reason === "status-code") {
+ switch (_response.error.statusCode) {
+ case 400:
+ throw new Webflow.BadRequestError(_response.error.body, _response.rawResponse);
+ case 401:
+ throw new Webflow.UnauthorizedError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 403:
+ throw new Webflow.ForbiddenError(_response.error.body, _response.rawResponse);
+ case 404:
+ throw new Webflow.NotFoundError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 409:
+ throw new Webflow.ConflictError(_response.error.body, _response.rawResponse);
+ case 429:
+ throw new Webflow.TooManyRequestsError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 500:
+ throw new Webflow.InternalServerError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ default:
+ throw new errors.WebflowError({
+ statusCode: _response.error.statusCode,
+ body: _response.error.body,
+ rawResponse: _response.rawResponse,
+ });
+ }
+ }
+
+ return handleNonStatusCodeError(
+ _response.error,
+ _response.rawResponse,
+ "DELETE",
+ "/sites/{site_id}/members/{member_id}",
+ );
+ }
+
+ /**
+ * Update a site member's role.
+ *
+ * On a site with Site-specific access enabled, the member must already hold access to this site — grant it first with `POST`. On a site open to the whole workspace, this call sets a per-site role for the first time.
+ *
+ * To update by email address instead of by ID, see [Update Site Member Role (by email)](/data/reference/enterprise/site-access/update-member-role-by-email).
+ *
+ * This endpoint requires an Enterprise workspace.
+ *
+ * Required scope | `site_access:write`
+ *
+ * @param {string} site_id - Unique identifier for a Site
+ * @param {string} member_id - Unique identifier for a Member
+ * @param {Webflow.UpdateSiteMemberRoleRequestBody} request
+ * @param {MembersClient.RequestOptions} requestOptions - Request-specific configuration.
+ *
+ * @throws {@link Webflow.BadRequestError}
+ * @throws {@link Webflow.UnauthorizedError}
+ * @throws {@link Webflow.ForbiddenError}
+ * @throws {@link Webflow.NotFoundError}
+ * @throws {@link Webflow.ConflictError}
+ * @throws {@link Webflow.TooManyRequestsError}
+ * @throws {@link Webflow.InternalServerError}
+ *
+ * @example
+ * await client.sites.members.updateMemberRole("580e63e98c9a982ac9b8b741", "62fa5e47f6b8256f4641c5bd", {
+ * siteRole: "content_editor"
+ * })
+ */
+ public updateMemberRole(
+ site_id: string,
+ member_id: string,
+ request: Webflow.UpdateSiteMemberRoleRequestBody,
+ requestOptions?: MembersClient.RequestOptions,
+ ): core.HttpResponsePromise {
+ return core.HttpResponsePromise.fromPromise(
+ this.__updateMemberRole(site_id, member_id, request, requestOptions),
+ );
+ }
+
+ private async __updateMemberRole(
+ site_id: string,
+ member_id: string,
+ request: Webflow.UpdateSiteMemberRoleRequestBody,
+ requestOptions?: MembersClient.RequestOptions,
+ ): Promise> {
+ const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest();
+ const _headers: core.Fetcher.Args["headers"] = mergeHeaders(
+ _authRequest.headers,
+ this._options?.headers,
+ requestOptions?.headers,
+ );
+ const _response = await core.fetcher({
+ url: core.url.join(
+ (await core.Supplier.get(this._options.baseUrl)) ??
+ ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi)
+ .base,
+ `sites/${core.url.encodePathParam(site_id)}/members/${core.url.encodePathParam(member_id)}`,
+ ),
+ method: "PATCH",
+ headers: _headers,
+ contentType: "application/json",
+ queryParameters: requestOptions?.queryParams,
+ requestType: "json",
+ body: serializers.UpdateSiteMemberRoleRequestBody.jsonOrThrow(request, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ omitUndefined: true,
+ }),
+ timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000,
+ maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries,
+ abortSignal: requestOptions?.abortSignal,
+ fetchFn: this._options?.fetch,
+ logging: this._options.logging,
+ });
+ if (_response.ok) {
+ return {
+ data: serializers.SiteMember.parseOrThrow(_response.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ rawResponse: _response.rawResponse,
+ };
+ }
+
+ if (_response.error.reason === "status-code") {
+ switch (_response.error.statusCode) {
+ case 400:
+ throw new Webflow.BadRequestError(_response.error.body, _response.rawResponse);
+ case 401:
+ throw new Webflow.UnauthorizedError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 403:
+ throw new Webflow.ForbiddenError(_response.error.body, _response.rawResponse);
+ case 404:
+ throw new Webflow.NotFoundError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 409:
+ throw new Webflow.ConflictError(_response.error.body, _response.rawResponse);
+ case 429:
+ throw new Webflow.TooManyRequestsError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 500:
+ throw new Webflow.InternalServerError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ default:
+ throw new errors.WebflowError({
+ statusCode: _response.error.statusCode,
+ body: _response.error.body,
+ rawResponse: _response.rawResponse,
+ });
+ }
+ }
+
+ return handleNonStatusCodeError(
+ _response.error,
+ _response.rawResponse,
+ "PATCH",
+ "/sites/{site_id}/members/{member_id}",
+ );
+ }
+}
diff --git a/src/api/resources/sites/resources/members/client/index.ts b/src/api/resources/sites/resources/members/client/index.ts
new file mode 100644
index 00000000..415726b7
--- /dev/null
+++ b/src/api/resources/sites/resources/members/client/index.ts
@@ -0,0 +1 @@
+export * from "./requests";
diff --git a/src/api/resources/sites/resources/members/client/requests/GrantSiteMemberRequestBody.ts b/src/api/resources/sites/resources/members/client/requests/GrantSiteMemberRequestBody.ts
new file mode 100644
index 00000000..e636bfc0
--- /dev/null
+++ b/src/api/resources/sites/resources/members/client/requests/GrantSiteMemberRequestBody.ts
@@ -0,0 +1,28 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../../../../../index";
+
+/**
+ * @example
+ * {
+ * email: "waylon.dalton@example.com",
+ * siteRole: "designer"
+ * }
+ *
+ * @example
+ * {
+ * memberId: "62fa5e47f6b8256f4641c5bd",
+ * siteRole: "custom",
+ * siteRoleId: "72fa5e47f6b8256f4641c5bd"
+ * }
+ */
+export interface GrantSiteMemberRequestBody {
+ /** Email address of the Workspace Member to grant access to. Provide either `email` or `memberId`, not both. */
+ email?: string;
+ /** ID of the Workspace Member to grant access to. Provide either `email` or `memberId`, not both. */
+ memberId?: string;
+ /** The Site Role to grant */
+ siteRole: Webflow.sites.GrantSiteMemberRequestBodySiteRole;
+ /** ID of the custom Site Role to grant. Required when `siteRole` is `custom`, and rejected with any other `siteRole`. Rejected if the id doesn't name a custom Site Role belonging to this workspace. */
+ siteRoleId?: string;
+}
diff --git a/src/api/resources/sites/resources/members/client/requests/MembersListMembersRequest.ts b/src/api/resources/sites/resources/members/client/requests/MembersListMembersRequest.ts
new file mode 100644
index 00000000..c6c04449
--- /dev/null
+++ b/src/api/resources/sites/resources/members/client/requests/MembersListMembersRequest.ts
@@ -0,0 +1,18 @@
+// This file was auto-generated by Fern from our API Definition.
+
+/**
+ * @example
+ * {
+ * limit: 1,
+ * email: "email",
+ * cursor: "cursor"
+ * }
+ */
+export interface MembersListMembersRequest {
+ /** Maximum number of records to return. Defaults to `50`, up to a maximum of `100`. */
+ limit?: number;
+ /** Filter to the Site Member with this email address */
+ email?: string;
+ /** Cursor returned in `pagination.nextCursor` of the previous response */
+ cursor?: string;
+}
diff --git a/src/api/resources/sites/resources/members/client/requests/MembersRemoveMemberByEmailRequest.ts b/src/api/resources/sites/resources/members/client/requests/MembersRemoveMemberByEmailRequest.ts
new file mode 100644
index 00000000..d8c82c70
--- /dev/null
+++ b/src/api/resources/sites/resources/members/client/requests/MembersRemoveMemberByEmailRequest.ts
@@ -0,0 +1,12 @@
+// This file was auto-generated by Fern from our API Definition.
+
+/**
+ * @example
+ * {
+ * email: "email"
+ * }
+ */
+export interface MembersRemoveMemberByEmailRequest {
+ /** Email address of the Site Member to revoke access from */
+ email: string;
+}
diff --git a/src/api/resources/sites/resources/members/client/requests/MembersUpdateMemberRoleByEmailRequest.ts b/src/api/resources/sites/resources/members/client/requests/MembersUpdateMemberRoleByEmailRequest.ts
new file mode 100644
index 00000000..7d81f1e1
--- /dev/null
+++ b/src/api/resources/sites/resources/members/client/requests/MembersUpdateMemberRoleByEmailRequest.ts
@@ -0,0 +1,18 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../../../../../index";
+
+/**
+ * @example
+ * {
+ * email: "email",
+ * body: {
+ * siteRole: "content_editor"
+ * }
+ * }
+ */
+export interface MembersUpdateMemberRoleByEmailRequest {
+ /** Email address of the Site Member whose role to change */
+ email: string;
+ body: Webflow.UpdateSiteMemberRoleRequestBody;
+}
diff --git a/src/api/resources/sites/resources/members/client/requests/index.ts b/src/api/resources/sites/resources/members/client/requests/index.ts
new file mode 100644
index 00000000..21cd6f52
--- /dev/null
+++ b/src/api/resources/sites/resources/members/client/requests/index.ts
@@ -0,0 +1,4 @@
+export type { GrantSiteMemberRequestBody } from "./GrantSiteMemberRequestBody";
+export type { MembersListMembersRequest } from "./MembersListMembersRequest";
+export type { MembersRemoveMemberByEmailRequest } from "./MembersRemoveMemberByEmailRequest";
+export type { MembersUpdateMemberRoleByEmailRequest } from "./MembersUpdateMemberRoleByEmailRequest";
diff --git a/src/api/resources/sites/resources/members/exports.ts b/src/api/resources/sites/resources/members/exports.ts
new file mode 100644
index 00000000..61a12642
--- /dev/null
+++ b/src/api/resources/sites/resources/members/exports.ts
@@ -0,0 +1,4 @@
+// This file was auto-generated by Fern from our API Definition.
+
+export { MembersClient } from "./client/Client";
+export * from "./client/index";
diff --git a/src/api/resources/sites/resources/members/index.ts b/src/api/resources/sites/resources/members/index.ts
new file mode 100644
index 00000000..d2ec2302
--- /dev/null
+++ b/src/api/resources/sites/resources/members/index.ts
@@ -0,0 +1,2 @@
+export * from "./client";
+export * from "./types";
diff --git a/src/api/resources/sites/resources/members/types/GrantSiteMemberRequestBodySiteRole.ts b/src/api/resources/sites/resources/members/types/GrantSiteMemberRequestBodySiteRole.ts
new file mode 100644
index 00000000..37e912c8
--- /dev/null
+++ b/src/api/resources/sites/resources/members/types/GrantSiteMemberRequestBodySiteRole.ts
@@ -0,0 +1,13 @@
+// This file was auto-generated by Fern from our API Definition.
+
+/** The Site Role to grant */
+export const GrantSiteMemberRequestBodySiteRole = {
+ SiteManager: "site_manager",
+ Designer: "designer",
+ Marketer: "marketer",
+ ContentEditor: "content_editor",
+ Reviewer: "reviewer",
+ Custom: "custom",
+} as const;
+export type GrantSiteMemberRequestBodySiteRole =
+ (typeof GrantSiteMemberRequestBodySiteRole)[keyof typeof GrantSiteMemberRequestBodySiteRole];
diff --git a/src/api/resources/sites/resources/members/types/index.ts b/src/api/resources/sites/resources/members/types/index.ts
new file mode 100644
index 00000000..39e18d76
--- /dev/null
+++ b/src/api/resources/sites/resources/members/types/index.ts
@@ -0,0 +1 @@
+export * from "./GrantSiteMemberRequestBodySiteRole";
diff --git a/src/api/resources/sites/resources/scripts/client/Client.ts b/src/api/resources/sites/resources/scripts/client/Client.ts
index df0f7072..87faf953 100644
--- a/src/api/resources/sites/resources/scripts/client/Client.ts
+++ b/src/api/resources/sites/resources/scripts/client/Client.ts
@@ -30,6 +30,8 @@ export class ScriptsClient {
* To apply a script to a site or page, the script must first be registered to a site via the [Register Script](/data/reference/custom-code/custom-code/register-hosted) endpoints. Once registered, the script can be applied to a Site or Page using the appropriate endpoints. See the documentation on [working with Custom Code](/data/docs/custom-code) for more information.
*
*
+ * Access to this endpoint requires a bearer token obtained from an [OAuth Code Grant Flow](/data/reference/oauth-app).
+ *
* Required scope | `custom_code:read`
*
* @param {string} site_id - Unique identifier for a Site
@@ -157,6 +159,8 @@ export class ScriptsClient {
* To apply a script to a site or page, the script must first be registered to a site via the [Register Script](/data/reference/custom-code/custom-code/register-hosted) endpoints. Once registered, the script can be applied to a Site or Page using the appropriate endpoints. See the documentation on [working with Custom Code](/data/docs/custom-code) for more information.
*
*
+ * Access to this endpoint requires a bearer token obtained from an [OAuth Code Grant Flow](/data/reference/oauth-app).
+ *
* Required scope | `custom_code:write`
*
* @param {string} site_id - Unique identifier for a Site
@@ -433,6 +437,8 @@ export class ScriptsClient {
* See the documentation on [working with Custom Code](/data/docs/custom-code) for more information.
*
*
+ * Access to this endpoint requires a bearer token obtained from an [OAuth Code Grant Flow](/data/reference/oauth-app).
+ *
* Required scope | `custom_code:read`
*
* @param {string} site_id - Unique identifier for a Site
diff --git a/src/api/resources/sites/types/SitesPublishResponse.ts b/src/api/resources/sites/types/SitesPublishResponse.ts
index 4b7bb2fb..d613b992 100644
--- a/src/api/resources/sites/types/SitesPublishResponse.ts
+++ b/src/api/resources/sites/types/SitesPublishResponse.ts
@@ -7,4 +7,6 @@ export interface SitesPublishResponse {
customDomains?: Webflow.Domain[];
/** Flag for publishing to webflow.io subdomain */
publishToWebflowSubdomain?: boolean;
+ /** Whether the site or an individual page was published */
+ publishScope?: Webflow.SitesPublishResponsePublishScope;
}
diff --git a/src/api/resources/sites/types/SitesPublishResponsePublishScope.ts b/src/api/resources/sites/types/SitesPublishResponsePublishScope.ts
new file mode 100644
index 00000000..c10855d8
--- /dev/null
+++ b/src/api/resources/sites/types/SitesPublishResponsePublishScope.ts
@@ -0,0 +1,9 @@
+// This file was auto-generated by Fern from our API Definition.
+
+/** Whether the site or an individual page was published */
+export const SitesPublishResponsePublishScope = {
+ Site: "site",
+ Page: "page",
+} as const;
+export type SitesPublishResponsePublishScope =
+ (typeof SitesPublishResponsePublishScope)[keyof typeof SitesPublishResponsePublishScope];
diff --git a/src/api/resources/sites/types/index.ts b/src/api/resources/sites/types/index.ts
index 7708da86..e8d16a61 100644
--- a/src/api/resources/sites/types/index.ts
+++ b/src/api/resources/sites/types/index.ts
@@ -1 +1,2 @@
export * from "./SitesPublishResponse";
+export * from "./SitesPublishResponsePublishScope";
diff --git a/src/api/resources/token/client/Client.ts b/src/api/resources/token/client/Client.ts
index 87f22111..cf555bd5 100644
--- a/src/api/resources/token/client/Client.ts
+++ b/src/api/resources/token/client/Client.ts
@@ -108,7 +108,9 @@ export class TokenClient {
/**
* Information about the authorization token
*
- * Access to this endpoint requires a bearer token from a [Data Client App](/data/docs/getting-started-data-clients).
+ * Access to this endpoint requires a bearer token from either a [Data Client App](/data/docs/data-clients/getting-started), a [Workspace token](/data/reference/authentication/workspace-token), or a [Site token](/data/reference/authentication/site-token).
+ *
+ * The `application` object is only returned for tokens issued to an OAuth app. For tokens without an OAuth app, such as Site and Workspace API tokens (`grantType: client_credentials`), the response omits `application`.
*
* @param {TokenClient.RequestOptions} requestOptions - Request-specific configuration.
*
diff --git a/src/api/resources/webhooks/client/Client.ts b/src/api/resources/webhooks/client/Client.ts
index f6534024..8d52f9fe 100644
--- a/src/api/resources/webhooks/client/Client.ts
+++ b/src/api/resources/webhooks/client/Client.ts
@@ -154,7 +154,7 @@ export class WebhooksClient {
*
* Limit of 75 registrations per `triggerType`, per site.
*
- * Access to this endpoint requires a bearer token from a [Data Client App](/data/docs/getting-started-data-clients).
+ * Access to this endpoint requires a bearer token from a [Data Client App](/data/docs/data-clients/getting-started).
* Required scope | `sites:write`
*
* @param {string} site_id - Unique identifier for a Site
diff --git a/src/api/resources/workspaces/client/Client.ts b/src/api/resources/workspaces/client/Client.ts
index 0abb0ee2..1734d067 100644
--- a/src/api/resources/workspaces/client/Client.ts
+++ b/src/api/resources/workspaces/client/Client.ts
@@ -1,16 +1,27 @@
// This file was auto-generated by Fern from our API Definition.
-import type { BaseClientOptions } from "../../../../BaseClient";
+import type { BaseClientOptions, BaseRequestOptions } from "../../../../BaseClient";
import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../BaseClient";
+import * as core from "../../../../core";
+import { mergeHeaders } from "../../../../core/headers";
+import * as environments from "../../../../environments";
+import { handleNonStatusCodeError } from "../../../../errors/handleNonStatusCodeError";
+import * as errors from "../../../../errors/index";
+import * as serializers from "../../../../serialization/index";
+import * as Webflow from "../../../index";
import { AuditLogsClient } from "../resources/auditLogs/client/Client";
+import { MembersClient } from "../resources/members/client/Client";
export declare namespace WorkspacesClient {
export type Options = BaseClientOptions;
+
+ export interface RequestOptions extends BaseRequestOptions {}
}
export class WorkspacesClient {
protected readonly _options: NormalizedClientOptionsWithAuth;
protected _auditLogs: AuditLogsClient | undefined;
+ protected _members: MembersClient | undefined;
constructor(options: WorkspacesClient.Options) {
this._options = normalizeClientOptionsWithAuth(options);
@@ -19,4 +30,118 @@ export class WorkspacesClient {
public get auditLogs(): AuditLogsClient {
return (this._auditLogs ??= new AuditLogsClient(this._options));
}
+
+ public get members(): MembersClient {
+ return (this._members ??= new MembersClient(this._options));
+ }
+
+ /**
+ * List the workspaces the token can access, including each workspace's ID. Use this endpoint to find the `workspace_id` that other workspace endpoints require.
+ *
+ * The response includes the workspaces granted to the token, plus the workspace that owns each site granted to the token. It returns only active workspaces (not archived, deleted, or draft) and isn't paginated.
+ *
+ * This endpoint supports workspace API tokens and Data Client apps.
+ *
+ * Required scope | `workspace:read`
+ *
+ * @param {WorkspacesClient.RequestOptions} requestOptions - Request-specific configuration.
+ *
+ * @throws {@link Webflow.UnauthorizedError}
+ * @throws {@link Webflow.ForbiddenError}
+ * @throws {@link Webflow.TooManyRequestsError}
+ * @throws {@link Webflow.InternalServerError}
+ *
+ * @example
+ * await client.workspaces.list()
+ */
+ public list(requestOptions?: WorkspacesClient.RequestOptions): core.HttpResponsePromise {
+ return core.HttpResponsePromise.fromPromise(this.__list(requestOptions));
+ }
+
+ private async __list(
+ requestOptions?: WorkspacesClient.RequestOptions,
+ ): Promise> {
+ const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest();
+ const _headers: core.Fetcher.Args["headers"] = mergeHeaders(
+ _authRequest.headers,
+ this._options?.headers,
+ requestOptions?.headers,
+ );
+ const _response = await core.fetcher({
+ url: core.url.join(
+ (await core.Supplier.get(this._options.baseUrl)) ??
+ ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi)
+ .base,
+ "workspaces",
+ ),
+ method: "GET",
+ headers: _headers,
+ queryParameters: requestOptions?.queryParams,
+ timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000,
+ maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries,
+ abortSignal: requestOptions?.abortSignal,
+ fetchFn: this._options?.fetch,
+ logging: this._options.logging,
+ });
+ if (_response.ok) {
+ return {
+ data: serializers.Workspaces.parseOrThrow(_response.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ rawResponse: _response.rawResponse,
+ };
+ }
+
+ if (_response.error.reason === "status-code") {
+ switch (_response.error.statusCode) {
+ case 401:
+ throw new Webflow.UnauthorizedError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 403:
+ throw new Webflow.ForbiddenError(_response.error.body, _response.rawResponse);
+ case 429:
+ throw new Webflow.TooManyRequestsError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 500:
+ throw new Webflow.InternalServerError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ default:
+ throw new errors.WebflowError({
+ statusCode: _response.error.statusCode,
+ body: _response.error.body,
+ rawResponse: _response.rawResponse,
+ });
+ }
+ }
+
+ return handleNonStatusCodeError(_response.error, _response.rawResponse, "GET", "/workspaces");
+ }
}
diff --git a/src/api/resources/workspaces/resources/index.ts b/src/api/resources/workspaces/resources/index.ts
index da3e9fbf..ccc4540a 100644
--- a/src/api/resources/workspaces/resources/index.ts
+++ b/src/api/resources/workspaces/resources/index.ts
@@ -1,3 +1,6 @@
export * as auditLogs from "./auditLogs";
export * from "./auditLogs/client/requests";
export * from "./auditLogs/types";
+export * as members from "./members";
+export * from "./members/client/requests";
+export * from "./members/types";
diff --git a/src/api/resources/workspaces/resources/members/client/Client.ts b/src/api/resources/workspaces/resources/members/client/Client.ts
new file mode 100644
index 00000000..8de20bcb
--- /dev/null
+++ b/src/api/resources/workspaces/resources/members/client/Client.ts
@@ -0,0 +1,846 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type { BaseClientOptions, BaseRequestOptions } from "../../../../../../BaseClient";
+import { type NormalizedClientOptionsWithAuth, normalizeClientOptionsWithAuth } from "../../../../../../BaseClient";
+import * as core from "../../../../../../core";
+import { mergeHeaders } from "../../../../../../core/headers";
+import * as environments from "../../../../../../environments";
+import { handleNonStatusCodeError } from "../../../../../../errors/handleNonStatusCodeError";
+import * as errors from "../../../../../../errors/index";
+import * as serializers from "../../../../../../serialization/index";
+import * as Webflow from "../../../../../index";
+
+export declare namespace MembersClient {
+ export type Options = BaseClientOptions;
+
+ export interface RequestOptions extends BaseRequestOptions {}
+}
+
+export class MembersClient {
+ protected readonly _options: NormalizedClientOptionsWithAuth;
+
+ constructor(options: MembersClient.Options) {
+ this._options = normalizeClientOptionsWithAuth(options);
+ }
+
+ /**
+ * List the members and invites of a workspace. `invites` includes pending, declined, and expired invites.
+ *
+ * This endpoint requires an Enterprise workspace.
+ *
+ * Required scope | `workspace_members:read`
+ *
+ * @param {string} workspace_id - Unique identifier for a Workspace. Find it with [List Workspaces](/data/reference/enterprise/workspace-management/list) (workspace API tokens and Data Client apps), or with `authorization.authorizedTo.workspaceIds` from [Get Authorization Info](/data/reference/token/introspect). With a site token, read `workspaceId` from [Get Site](/data/reference/sites/get).
+ * @param {Webflow.workspaces.MembersListMembersRequest} request
+ * @param {MembersClient.RequestOptions} requestOptions - Request-specific configuration.
+ *
+ * @throws {@link Webflow.BadRequestError}
+ * @throws {@link Webflow.UnauthorizedError}
+ * @throws {@link Webflow.ForbiddenError}
+ * @throws {@link Webflow.NotFoundError}
+ * @throws {@link Webflow.TooManyRequestsError}
+ * @throws {@link Webflow.InternalServerError}
+ *
+ * @example
+ * await client.workspaces.members.listMembers("580e63e98c9a982ac9b8b741", {
+ * limit: 1,
+ * email: "email",
+ * roles: ["owner"],
+ * cursor: "cursor"
+ * })
+ */
+ public listMembers(
+ workspace_id: string,
+ request: Webflow.workspaces.MembersListMembersRequest = {},
+ requestOptions?: MembersClient.RequestOptions,
+ ): core.HttpResponsePromise {
+ return core.HttpResponsePromise.fromPromise(this.__listMembers(workspace_id, request, requestOptions));
+ }
+
+ private async __listMembers(
+ workspace_id: string,
+ request: Webflow.workspaces.MembersListMembersRequest = {},
+ requestOptions?: MembersClient.RequestOptions,
+ ): Promise> {
+ const { limit, email, roles, cursor } = request;
+ const _queryParams: Record = {
+ limit,
+ email,
+ roles: Array.isArray(roles)
+ ? roles.map((item) =>
+ serializers.workspaces.MembersListMembersRequestRolesItem.jsonOrThrow(item, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ omitUndefined: true,
+ }),
+ )
+ : roles != null
+ ? serializers.workspaces.MembersListMembersRequestRolesItem.jsonOrThrow(roles, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ omitUndefined: true,
+ })
+ : undefined,
+ cursor,
+ };
+ const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest();
+ const _headers: core.Fetcher.Args["headers"] = mergeHeaders(
+ _authRequest.headers,
+ this._options?.headers,
+ requestOptions?.headers,
+ );
+ const _response = await core.fetcher({
+ url: core.url.join(
+ (await core.Supplier.get(this._options.baseUrl)) ??
+ ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi)
+ .base,
+ `workspaces/${core.url.encodePathParam(workspace_id)}/members`,
+ ),
+ method: "GET",
+ headers: _headers,
+ queryParameters: { ..._queryParams, ...requestOptions?.queryParams },
+ timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000,
+ maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries,
+ abortSignal: requestOptions?.abortSignal,
+ fetchFn: this._options?.fetch,
+ logging: this._options.logging,
+ });
+ if (_response.ok) {
+ return {
+ data: serializers.WorkspaceMembersResponse.parseOrThrow(_response.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ rawResponse: _response.rawResponse,
+ };
+ }
+
+ if (_response.error.reason === "status-code") {
+ switch (_response.error.statusCode) {
+ case 400:
+ throw new Webflow.BadRequestError(_response.error.body, _response.rawResponse);
+ case 401:
+ throw new Webflow.UnauthorizedError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 403:
+ throw new Webflow.ForbiddenError(_response.error.body, _response.rawResponse);
+ case 404:
+ throw new Webflow.NotFoundError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 429:
+ throw new Webflow.TooManyRequestsError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 500:
+ throw new Webflow.InternalServerError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ default:
+ throw new errors.WebflowError({
+ statusCode: _response.error.statusCode,
+ body: _response.error.body,
+ rawResponse: _response.rawResponse,
+ });
+ }
+ }
+
+ return handleNonStatusCodeError(
+ _response.error,
+ _response.rawResponse,
+ "GET",
+ "/workspaces/{workspace_id}/members",
+ );
+ }
+
+ /**
+ * Invite a user to a workspace.
+ *
+ * Set `workspaceRole` to `client` to invite a collaborator client to one Site. Client invites require exactly one `siteAccess` entry. Repeat the request with another Site to extend a compatible pending client invite.
+ *
+ * Client invites create collaborator relationships only. This endpoint does not accept `sitePlan` or `canPublish`.
+ *
+ * This endpoint requires an Enterprise workspace.
+ *
+ * Required scope | `workspace_members:write`
+ *
+ * `workspaceRole` and `defaultSiteRole` together decide what the invitee can do and what role the dashboard shows for them once they accept. Submit only one of the combinations below — the dashboard's own role picker never produces any other pairing.
+ *
+ * | `workspaceRole` | `defaultSiteRole` | Shown in the dashboard as |
+ * |---|---|---|
+ * | `admin` | `site_manager` | Admin |
+ * | `member` | `site_manager` | Site manager |
+ * | `member` | `designer` | Designer |
+ * | `member` | `marketer` | Marketer |
+ * | `member` | `content_editor` | Content editor |
+ * | `member` | `custom` | The custom Site Role's own name. Requires `defaultSiteRoleId`. |
+ * | `reviewer` | `reviewer` | Reviewer |
+ *
+ * Admins always have access to every site in the workspace, so an Admin invite can't include a list of specific sites. For Member and Reviewer invites, you can either give the same role on all sites, or list specific sites. In both cases, use the pairings in the table above.
+ *
+ * @param {string} workspace_id - Unique identifier for a Workspace. Find it with [List Workspaces](/data/reference/enterprise/workspace-management/list) (workspace API tokens and Data Client apps), or with `authorization.authorizedTo.workspaceIds` from [Get Authorization Info](/data/reference/token/introspect). With a site token, read `workspaceId` from [Get Site](/data/reference/sites/get).
+ * @param {Webflow.InviteWorkspaceMemberRequestBody} request
+ * @param {MembersClient.RequestOptions} requestOptions - Request-specific configuration.
+ *
+ * @throws {@link Webflow.BadRequestError}
+ * @throws {@link Webflow.UnauthorizedError}
+ * @throws {@link Webflow.ForbiddenError}
+ * @throws {@link Webflow.NotFoundError}
+ * @throws {@link Webflow.ConflictError}
+ * @throws {@link Webflow.TooManyRequestsError}
+ * @throws {@link Webflow.InternalServerError}
+ *
+ * @example
+ * await client.workspaces.members.inviteMember("580e63e98c9a982ac9b8b741", {
+ * email: "sam.okafor@example.com",
+ * workspaceRole: "member",
+ * defaultSiteRole: "designer"
+ * })
+ *
+ * @example
+ * await client.workspaces.members.inviteMember("580e63e98c9a982ac9b8b741", {
+ * email: "sam.okafor@example.com",
+ * workspaceRole: "member",
+ * siteAccess: [{
+ * siteId: "62fa5e47f6b8256f4641c5bd",
+ * siteRole: "content_editor"
+ * }, {
+ * siteId: "62fa5e47f6b8256f4641c5be",
+ * siteRole: "content_editor"
+ * }]
+ * })
+ *
+ * @example
+ * await client.workspaces.members.inviteMember("580e63e98c9a982ac9b8b741", {
+ * email: "client@example.com",
+ * workspaceRole: "client",
+ * siteAccess: [{
+ * siteId: "62fa5e47f6b8256f4641c5bd",
+ * siteRole: "content_editor"
+ * }]
+ * })
+ */
+ public inviteMember(
+ workspace_id: string,
+ request: Webflow.InviteWorkspaceMemberRequestBody,
+ requestOptions?: MembersClient.RequestOptions,
+ ): core.HttpResponsePromise {
+ return core.HttpResponsePromise.fromPromise(this.__inviteMember(workspace_id, request, requestOptions));
+ }
+
+ private async __inviteMember(
+ workspace_id: string,
+ request: Webflow.InviteWorkspaceMemberRequestBody,
+ requestOptions?: MembersClient.RequestOptions,
+ ): Promise> {
+ const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest();
+ const _headers: core.Fetcher.Args["headers"] = mergeHeaders(
+ _authRequest.headers,
+ this._options?.headers,
+ requestOptions?.headers,
+ );
+ const _response = await core.fetcher({
+ url: core.url.join(
+ (await core.Supplier.get(this._options.baseUrl)) ??
+ ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi)
+ .base,
+ `workspaces/${core.url.encodePathParam(workspace_id)}/members`,
+ ),
+ method: "POST",
+ headers: _headers,
+ contentType: "application/json",
+ queryParameters: requestOptions?.queryParams,
+ requestType: "json",
+ body: serializers.InviteWorkspaceMemberRequestBody.jsonOrThrow(request, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ omitUndefined: true,
+ }),
+ timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000,
+ maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries,
+ abortSignal: requestOptions?.abortSignal,
+ fetchFn: this._options?.fetch,
+ logging: this._options.logging,
+ });
+ if (_response.ok) {
+ return {
+ data: serializers.InviteWorkspaceMemberResponseBody.parseOrThrow(_response.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ rawResponse: _response.rawResponse,
+ };
+ }
+
+ if (_response.error.reason === "status-code") {
+ switch (_response.error.statusCode) {
+ case 400:
+ throw new Webflow.BadRequestError(_response.error.body, _response.rawResponse);
+ case 401:
+ throw new Webflow.UnauthorizedError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 403:
+ throw new Webflow.ForbiddenError(_response.error.body, _response.rawResponse);
+ case 404:
+ throw new Webflow.NotFoundError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 409:
+ throw new Webflow.ConflictError(_response.error.body, _response.rawResponse);
+ case 429:
+ throw new Webflow.TooManyRequestsError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 500:
+ throw new Webflow.InternalServerError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ default:
+ throw new errors.WebflowError({
+ statusCode: _response.error.statusCode,
+ body: _response.error.body,
+ rawResponse: _response.rawResponse,
+ });
+ }
+ }
+
+ return handleNonStatusCodeError(
+ _response.error,
+ _response.rawResponse,
+ "POST",
+ "/workspaces/{workspace_id}/members",
+ );
+ }
+
+ /**
+ * Remove a member from a workspace.
+ *
+ * This endpoint requires an Enterprise workspace.
+ *
+ * Required scope | `workspace_members:write`
+ *
+ * @param {string} workspace_id - Unique identifier for a Workspace. Find it with [List Workspaces](/data/reference/enterprise/workspace-management/list) (workspace API tokens and Data Client apps), or with `authorization.authorizedTo.workspaceIds` from [Get Authorization Info](/data/reference/token/introspect). With a site token, read `workspaceId` from [Get Site](/data/reference/sites/get).
+ * @param {string} member_id - Unique identifier for a Member
+ * @param {MembersClient.RequestOptions} requestOptions - Request-specific configuration.
+ *
+ * @throws {@link Webflow.BadRequestError}
+ * @throws {@link Webflow.UnauthorizedError}
+ * @throws {@link Webflow.ForbiddenError}
+ * @throws {@link Webflow.NotFoundError}
+ * @throws {@link Webflow.ConflictError}
+ * @throws {@link Webflow.TooManyRequestsError}
+ * @throws {@link Webflow.InternalServerError}
+ *
+ * @example
+ * await client.workspaces.members.removeMember("580e63e98c9a982ac9b8b741", "62fa5e47f6b8256f4641c5bd")
+ */
+ public removeMember(
+ workspace_id: string,
+ member_id: string,
+ requestOptions?: MembersClient.RequestOptions,
+ ): core.HttpResponsePromise {
+ return core.HttpResponsePromise.fromPromise(this.__removeMember(workspace_id, member_id, requestOptions));
+ }
+
+ private async __removeMember(
+ workspace_id: string,
+ member_id: string,
+ requestOptions?: MembersClient.RequestOptions,
+ ): Promise> {
+ const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest();
+ const _headers: core.Fetcher.Args["headers"] = mergeHeaders(
+ _authRequest.headers,
+ this._options?.headers,
+ requestOptions?.headers,
+ );
+ const _response = await core.fetcher({
+ url: core.url.join(
+ (await core.Supplier.get(this._options.baseUrl)) ??
+ ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi)
+ .base,
+ `workspaces/${core.url.encodePathParam(workspace_id)}/members/${core.url.encodePathParam(member_id)}`,
+ ),
+ method: "DELETE",
+ headers: _headers,
+ queryParameters: requestOptions?.queryParams,
+ timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000,
+ maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries,
+ abortSignal: requestOptions?.abortSignal,
+ fetchFn: this._options?.fetch,
+ logging: this._options.logging,
+ });
+ if (_response.ok) {
+ return { data: undefined, rawResponse: _response.rawResponse };
+ }
+
+ if (_response.error.reason === "status-code") {
+ switch (_response.error.statusCode) {
+ case 400:
+ throw new Webflow.BadRequestError(_response.error.body, _response.rawResponse);
+ case 401:
+ throw new Webflow.UnauthorizedError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 403:
+ throw new Webflow.ForbiddenError(_response.error.body, _response.rawResponse);
+ case 404:
+ throw new Webflow.NotFoundError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 409:
+ throw new Webflow.ConflictError(_response.error.body, _response.rawResponse);
+ case 429:
+ throw new Webflow.TooManyRequestsError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 500:
+ throw new Webflow.InternalServerError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ default:
+ throw new errors.WebflowError({
+ statusCode: _response.error.statusCode,
+ body: _response.error.body,
+ rawResponse: _response.rawResponse,
+ });
+ }
+ }
+
+ return handleNonStatusCodeError(
+ _response.error,
+ _response.rawResponse,
+ "DELETE",
+ "/workspaces/{workspace_id}/members/{member_id}",
+ );
+ }
+
+ /**
+ * Update a workspace member's role.
+ *
+ * This endpoint requires an Enterprise workspace.
+ *
+ * Required scope | `workspace_members:write`
+ *
+ * `role` and `defaultSiteRole` together decide what the member can do and what role the dashboard shows for them. Submit only one of the combinations below — the dashboard's own role picker never produces any other pairing.
+ *
+ * | `role` | `defaultSiteRole` | Shown in the dashboard as |
+ * |---|---|---|
+ * | `admin` | `site_manager` | Admin |
+ * | `member` | `site_manager` | Site manager |
+ * | `member` | `designer` | Designer |
+ * | `member` | `marketer` | Marketer |
+ * | `member` | `content_editor` | Content editor |
+ * | `member` | `custom` | The custom Site Role's own name. Requires `defaultSiteRoleId`. |
+ * | `reviewer` | `reviewer` | Reviewer |
+ *
+ * @param {string} workspace_id - Unique identifier for a Workspace. Find it with [List Workspaces](/data/reference/enterprise/workspace-management/list) (workspace API tokens and Data Client apps), or with `authorization.authorizedTo.workspaceIds` from [Get Authorization Info](/data/reference/token/introspect). With a site token, read `workspaceId` from [Get Site](/data/reference/sites/get).
+ * @param {string} member_id - Unique identifier for a Member
+ * @param {Webflow.workspaces.UpdateWorkspaceMemberRoleRequestBody} request
+ * @param {MembersClient.RequestOptions} requestOptions - Request-specific configuration.
+ *
+ * @throws {@link Webflow.BadRequestError}
+ * @throws {@link Webflow.UnauthorizedError}
+ * @throws {@link Webflow.ForbiddenError}
+ * @throws {@link Webflow.NotFoundError}
+ * @throws {@link Webflow.ConflictError}
+ * @throws {@link Webflow.TooManyRequestsError}
+ * @throws {@link Webflow.InternalServerError}
+ *
+ * @example
+ * await client.workspaces.members.updateMemberRole("580e63e98c9a982ac9b8b741", "62fa5e47f6b8256f4641c5bd", {
+ * role: "admin",
+ * defaultSiteRole: "site_manager"
+ * })
+ */
+ public updateMemberRole(
+ workspace_id: string,
+ member_id: string,
+ request: Webflow.workspaces.UpdateWorkspaceMemberRoleRequestBody,
+ requestOptions?: MembersClient.RequestOptions,
+ ): core.HttpResponsePromise {
+ return core.HttpResponsePromise.fromPromise(
+ this.__updateMemberRole(workspace_id, member_id, request, requestOptions),
+ );
+ }
+
+ private async __updateMemberRole(
+ workspace_id: string,
+ member_id: string,
+ request: Webflow.workspaces.UpdateWorkspaceMemberRoleRequestBody,
+ requestOptions?: MembersClient.RequestOptions,
+ ): Promise> {
+ const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest();
+ const _headers: core.Fetcher.Args["headers"] = mergeHeaders(
+ _authRequest.headers,
+ this._options?.headers,
+ requestOptions?.headers,
+ );
+ const _response = await core.fetcher({
+ url: core.url.join(
+ (await core.Supplier.get(this._options.baseUrl)) ??
+ ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi)
+ .base,
+ `workspaces/${core.url.encodePathParam(workspace_id)}/members/${core.url.encodePathParam(member_id)}`,
+ ),
+ method: "PATCH",
+ headers: _headers,
+ contentType: "application/json",
+ queryParameters: requestOptions?.queryParams,
+ requestType: "json",
+ body: serializers.workspaces.UpdateWorkspaceMemberRoleRequestBody.jsonOrThrow(request, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ omitUndefined: true,
+ }),
+ timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000,
+ maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries,
+ abortSignal: requestOptions?.abortSignal,
+ fetchFn: this._options?.fetch,
+ logging: this._options.logging,
+ });
+ if (_response.ok) {
+ return {
+ data: serializers.WorkspaceMember.parseOrThrow(_response.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ rawResponse: _response.rawResponse,
+ };
+ }
+
+ if (_response.error.reason === "status-code") {
+ switch (_response.error.statusCode) {
+ case 400:
+ throw new Webflow.BadRequestError(_response.error.body, _response.rawResponse);
+ case 401:
+ throw new Webflow.UnauthorizedError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 403:
+ throw new Webflow.ForbiddenError(_response.error.body, _response.rawResponse);
+ case 404:
+ throw new Webflow.NotFoundError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 409:
+ throw new Webflow.ConflictError(_response.error.body, _response.rawResponse);
+ case 429:
+ throw new Webflow.TooManyRequestsError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 500:
+ throw new Webflow.InternalServerError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ default:
+ throw new errors.WebflowError({
+ statusCode: _response.error.statusCode,
+ body: _response.error.body,
+ rawResponse: _response.rawResponse,
+ });
+ }
+ }
+
+ return handleNonStatusCodeError(
+ _response.error,
+ _response.rawResponse,
+ "PATCH",
+ "/workspaces/{workspace_id}/members/{member_id}",
+ );
+ }
+
+ /**
+ * Update the role of multiple workspace members and invites in one request. An invite can be updated regardless of status — pending, declined, or expired.
+ *
+ * This answers `200` once the batch is applied, even when every item failed — a per-item problem is reported in `results` rather than failing the whole request. IDs are deduplicated before processing, so `results` can be shorter than the request; match a result back to your input by `id`, not by position.
+ *
+ * This endpoint requires an Enterprise workspace.
+ *
+ * Required scope | `workspace_members:write`
+ *
+ * `role` and `defaultSiteRole` together decide what every id in the batch can do and what role the dashboard shows for them. Submit only one of the combinations below — the dashboard's own role picker never produces any other pairing.
+ *
+ * | `role` | `defaultSiteRole` | Shown in the dashboard as |
+ * |---|---|---|
+ * | `admin` | `site_manager` | Admin |
+ * | `member` | `site_manager` | Site manager |
+ * | `member` | `designer` | Designer |
+ * | `member` | `marketer` | Marketer |
+ * | `member` | `content_editor` | Content editor |
+ * | `member` | `custom` | The custom Site Role's own name. Requires `defaultSiteRoleId`. |
+ * | `reviewer` | `reviewer` | Reviewer |
+ *
+ * @param {string} workspace_id - Unique identifier for a Workspace. Find it with [List Workspaces](/data/reference/enterprise/workspace-management/list) (workspace API tokens and Data Client apps), or with `authorization.authorizedTo.workspaceIds` from [Get Authorization Info](/data/reference/token/introspect). With a site token, read `workspaceId` from [Get Site](/data/reference/sites/get).
+ * @param {Webflow.workspaces.BulkUpdateWorkspaceMemberRolesRequestBody} request
+ * @param {MembersClient.RequestOptions} requestOptions - Request-specific configuration.
+ *
+ * @throws {@link Webflow.BadRequestError}
+ * @throws {@link Webflow.UnauthorizedError}
+ * @throws {@link Webflow.ForbiddenError}
+ * @throws {@link Webflow.NotFoundError}
+ * @throws {@link Webflow.ConflictError}
+ * @throws {@link Webflow.TooManyRequestsError}
+ * @throws {@link Webflow.InternalServerError}
+ *
+ * @example
+ * await client.workspaces.members.bulkUpdateMemberRoles("580e63e98c9a982ac9b8b741", {
+ * memberIds: ["62fa5e47f6b8256f4641c5bd", "62fa5e47f6b8256f4641c5be"],
+ * inviteIds: ["63fa5e47f6b8256f4641c5bf"],
+ * role: "member",
+ * defaultSiteRole: "designer"
+ * })
+ */
+ public bulkUpdateMemberRoles(
+ workspace_id: string,
+ request: Webflow.workspaces.BulkUpdateWorkspaceMemberRolesRequestBody,
+ requestOptions?: MembersClient.RequestOptions,
+ ): core.HttpResponsePromise {
+ return core.HttpResponsePromise.fromPromise(
+ this.__bulkUpdateMemberRoles(workspace_id, request, requestOptions),
+ );
+ }
+
+ private async __bulkUpdateMemberRoles(
+ workspace_id: string,
+ request: Webflow.workspaces.BulkUpdateWorkspaceMemberRolesRequestBody,
+ requestOptions?: MembersClient.RequestOptions,
+ ): Promise> {
+ const _authRequest: core.AuthRequest = await this._options.authProvider.getAuthRequest();
+ const _headers: core.Fetcher.Args["headers"] = mergeHeaders(
+ _authRequest.headers,
+ this._options?.headers,
+ requestOptions?.headers,
+ );
+ const _response = await core.fetcher({
+ url: core.url.join(
+ (await core.Supplier.get(this._options.baseUrl)) ??
+ ((await core.Supplier.get(this._options.environment)) ?? environments.WebflowEnvironment.DataApi)
+ .base,
+ `workspaces/${core.url.encodePathParam(workspace_id)}/members/bulk`,
+ ),
+ method: "POST",
+ headers: _headers,
+ contentType: "application/json",
+ queryParameters: requestOptions?.queryParams,
+ requestType: "json",
+ body: serializers.workspaces.BulkUpdateWorkspaceMemberRolesRequestBody.jsonOrThrow(request, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ omitUndefined: true,
+ }),
+ timeoutMs: (requestOptions?.timeoutInSeconds ?? this._options?.timeoutInSeconds ?? 60) * 1000,
+ maxRetries: requestOptions?.maxRetries ?? this._options?.maxRetries,
+ abortSignal: requestOptions?.abortSignal,
+ fetchFn: this._options?.fetch,
+ logging: this._options.logging,
+ });
+ if (_response.ok) {
+ return {
+ data: serializers.WorkspaceBulkRoleChangeResponse.parseOrThrow(_response.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ rawResponse: _response.rawResponse,
+ };
+ }
+
+ if (_response.error.reason === "status-code") {
+ switch (_response.error.statusCode) {
+ case 400:
+ throw new Webflow.BadRequestError(_response.error.body, _response.rawResponse);
+ case 401:
+ throw new Webflow.UnauthorizedError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 403:
+ throw new Webflow.ForbiddenError(_response.error.body, _response.rawResponse);
+ case 404:
+ throw new Webflow.NotFoundError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 409:
+ throw new Webflow.ConflictError(_response.error.body, _response.rawResponse);
+ case 429:
+ throw new Webflow.TooManyRequestsError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ case 500:
+ throw new Webflow.InternalServerError(
+ serializers.Error_.parseOrThrow(_response.error.body, {
+ unrecognizedObjectKeys: "passthrough",
+ allowUnrecognizedUnionMembers: true,
+ allowUnrecognizedEnumValues: true,
+ skipValidation: true,
+ breadcrumbsPrefix: ["response"],
+ }),
+ _response.rawResponse,
+ );
+ default:
+ throw new errors.WebflowError({
+ statusCode: _response.error.statusCode,
+ body: _response.error.body,
+ rawResponse: _response.rawResponse,
+ });
+ }
+ }
+
+ return handleNonStatusCodeError(
+ _response.error,
+ _response.rawResponse,
+ "POST",
+ "/workspaces/{workspace_id}/members/bulk",
+ );
+ }
+}
diff --git a/src/api/resources/workspaces/resources/members/client/index.ts b/src/api/resources/workspaces/resources/members/client/index.ts
new file mode 100644
index 00000000..415726b7
--- /dev/null
+++ b/src/api/resources/workspaces/resources/members/client/index.ts
@@ -0,0 +1 @@
+export * from "./requests";
diff --git a/src/api/resources/workspaces/resources/members/client/requests/BulkUpdateWorkspaceMemberRolesRequestBody.ts b/src/api/resources/workspaces/resources/members/client/requests/BulkUpdateWorkspaceMemberRolesRequestBody.ts
new file mode 100644
index 00000000..0659026d
--- /dev/null
+++ b/src/api/resources/workspaces/resources/members/client/requests/BulkUpdateWorkspaceMemberRolesRequestBody.ts
@@ -0,0 +1,25 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../../../../../index";
+
+/**
+ * @example
+ * {
+ * memberIds: ["62fa5e47f6b8256f4641c5bd", "62fa5e47f6b8256f4641c5be"],
+ * inviteIds: ["63fa5e47f6b8256f4641c5bf"],
+ * role: "member",
+ * defaultSiteRole: "designer"
+ * }
+ */
+export interface BulkUpdateWorkspaceMemberRolesRequestBody {
+ /** IDs of active Members to update */
+ memberIds?: string[];
+ /** IDs of invites to update, regardless of status */
+ inviteIds?: string[];
+ /** The Workspace Role to assign to every id in the batch */
+ role: Webflow.workspaces.BulkUpdateWorkspaceMemberRolesRequestBodyRole;
+ /** The default Site Role to assign to every id in the batch */
+ defaultSiteRole: Webflow.workspaces.BulkUpdateWorkspaceMemberRolesRequestBodyDefaultSiteRole;
+ /** ID of the custom Site Role named by `defaultSiteRole`. Requires `defaultSiteRole` to be `custom`, and rejected with any other `defaultSiteRole`. Rejected if the id doesn't name a custom Site Role belonging to this workspace. */
+ defaultSiteRoleId?: string;
+}
diff --git a/src/api/resources/workspaces/resources/members/client/requests/MembersListMembersRequest.ts b/src/api/resources/workspaces/resources/members/client/requests/MembersListMembersRequest.ts
new file mode 100644
index 00000000..89300b62
--- /dev/null
+++ b/src/api/resources/workspaces/resources/members/client/requests/MembersListMembersRequest.ts
@@ -0,0 +1,25 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../../../../../index";
+
+/**
+ * @example
+ * {
+ * limit: 1,
+ * email: "email",
+ * roles: ["owner"],
+ * cursor: "cursor"
+ * }
+ */
+export interface MembersListMembersRequest {
+ /** Maximum number of records to return. Defaults to `50`, up to a maximum of `100`. */
+ limit?: number;
+ /** Filter to the Member or invite with this email address */
+ email?: string;
+ /** Comma-separated Workspace Roles to filter Members and invites by */
+ roles?:
+ | Webflow.workspaces.MembersListMembersRequestRolesItem
+ | Webflow.workspaces.MembersListMembersRequestRolesItem[];
+ /** Cursor returned in `pagination.nextCursor` of the previous response */
+ cursor?: string;
+}
diff --git a/src/api/resources/workspaces/resources/members/client/requests/UpdateWorkspaceMemberRoleRequestBody.ts b/src/api/resources/workspaces/resources/members/client/requests/UpdateWorkspaceMemberRoleRequestBody.ts
new file mode 100644
index 00000000..1f573421
--- /dev/null
+++ b/src/api/resources/workspaces/resources/members/client/requests/UpdateWorkspaceMemberRoleRequestBody.ts
@@ -0,0 +1,19 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../../../../../index";
+
+/**
+ * @example
+ * {
+ * role: "admin",
+ * defaultSiteRole: "site_manager"
+ * }
+ */
+export interface UpdateWorkspaceMemberRoleRequestBody {
+ /** The Workspace Role to assign */
+ role: Webflow.workspaces.UpdateWorkspaceMemberRoleRequestBodyRole;
+ /** The Member's default Site Role. Required on every request — unlike the dashboard's own role editor, this endpoint never derives it from the Member's current role. */
+ defaultSiteRole: Webflow.workspaces.UpdateWorkspaceMemberRoleRequestBodyDefaultSiteRole;
+ /** ID of the custom Site Role named by `defaultSiteRole`. Requires `defaultSiteRole` to be `custom`, and rejected with any other `defaultSiteRole`. Rejected if the id doesn't name a custom Site Role belonging to this workspace. */
+ defaultSiteRoleId?: string;
+}
diff --git a/src/api/resources/workspaces/resources/members/client/requests/index.ts b/src/api/resources/workspaces/resources/members/client/requests/index.ts
new file mode 100644
index 00000000..cdac9f27
--- /dev/null
+++ b/src/api/resources/workspaces/resources/members/client/requests/index.ts
@@ -0,0 +1,3 @@
+export type { BulkUpdateWorkspaceMemberRolesRequestBody } from "./BulkUpdateWorkspaceMemberRolesRequestBody";
+export type { MembersListMembersRequest } from "./MembersListMembersRequest";
+export type { UpdateWorkspaceMemberRoleRequestBody } from "./UpdateWorkspaceMemberRoleRequestBody";
diff --git a/src/api/resources/workspaces/resources/members/exports.ts b/src/api/resources/workspaces/resources/members/exports.ts
new file mode 100644
index 00000000..61a12642
--- /dev/null
+++ b/src/api/resources/workspaces/resources/members/exports.ts
@@ -0,0 +1,4 @@
+// This file was auto-generated by Fern from our API Definition.
+
+export { MembersClient } from "./client/Client";
+export * from "./client/index";
diff --git a/src/api/resources/workspaces/resources/members/index.ts b/src/api/resources/workspaces/resources/members/index.ts
new file mode 100644
index 00000000..d2ec2302
--- /dev/null
+++ b/src/api/resources/workspaces/resources/members/index.ts
@@ -0,0 +1,2 @@
+export * from "./client";
+export * from "./types";
diff --git a/src/api/resources/workspaces/resources/members/types/BulkUpdateWorkspaceMemberRolesRequestBodyDefaultSiteRole.ts b/src/api/resources/workspaces/resources/members/types/BulkUpdateWorkspaceMemberRolesRequestBodyDefaultSiteRole.ts
new file mode 100644
index 00000000..470c2cb8
--- /dev/null
+++ b/src/api/resources/workspaces/resources/members/types/BulkUpdateWorkspaceMemberRolesRequestBodyDefaultSiteRole.ts
@@ -0,0 +1,13 @@
+// This file was auto-generated by Fern from our API Definition.
+
+/** The default Site Role to assign to every id in the batch */
+export const BulkUpdateWorkspaceMemberRolesRequestBodyDefaultSiteRole = {
+ SiteManager: "site_manager",
+ Designer: "designer",
+ Marketer: "marketer",
+ ContentEditor: "content_editor",
+ Reviewer: "reviewer",
+ Custom: "custom",
+} as const;
+export type BulkUpdateWorkspaceMemberRolesRequestBodyDefaultSiteRole =
+ (typeof BulkUpdateWorkspaceMemberRolesRequestBodyDefaultSiteRole)[keyof typeof BulkUpdateWorkspaceMemberRolesRequestBodyDefaultSiteRole];
diff --git a/src/api/resources/workspaces/resources/members/types/BulkUpdateWorkspaceMemberRolesRequestBodyRole.ts b/src/api/resources/workspaces/resources/members/types/BulkUpdateWorkspaceMemberRolesRequestBodyRole.ts
new file mode 100644
index 00000000..371a0bc8
--- /dev/null
+++ b/src/api/resources/workspaces/resources/members/types/BulkUpdateWorkspaceMemberRolesRequestBodyRole.ts
@@ -0,0 +1,10 @@
+// This file was auto-generated by Fern from our API Definition.
+
+/** The Workspace Role to assign to every id in the batch */
+export const BulkUpdateWorkspaceMemberRolesRequestBodyRole = {
+ Admin: "admin",
+ Member: "member",
+ Reviewer: "reviewer",
+} as const;
+export type BulkUpdateWorkspaceMemberRolesRequestBodyRole =
+ (typeof BulkUpdateWorkspaceMemberRolesRequestBodyRole)[keyof typeof BulkUpdateWorkspaceMemberRolesRequestBodyRole];
diff --git a/src/api/resources/workspaces/resources/members/types/MembersListMembersRequestRolesItem.ts b/src/api/resources/workspaces/resources/members/types/MembersListMembersRequestRolesItem.ts
new file mode 100644
index 00000000..5622b920
--- /dev/null
+++ b/src/api/resources/workspaces/resources/members/types/MembersListMembersRequestRolesItem.ts
@@ -0,0 +1,12 @@
+// This file was auto-generated by Fern from our API Definition.
+
+export const MembersListMembersRequestRolesItem = {
+ Owner: "owner",
+ Admin: "admin",
+ Member: "member",
+ Guest: "guest",
+ Reviewer: "reviewer",
+ Client: "client",
+} as const;
+export type MembersListMembersRequestRolesItem =
+ (typeof MembersListMembersRequestRolesItem)[keyof typeof MembersListMembersRequestRolesItem];
diff --git a/src/api/resources/workspaces/resources/members/types/UpdateWorkspaceMemberRoleRequestBodyDefaultSiteRole.ts b/src/api/resources/workspaces/resources/members/types/UpdateWorkspaceMemberRoleRequestBodyDefaultSiteRole.ts
new file mode 100644
index 00000000..d98a877c
--- /dev/null
+++ b/src/api/resources/workspaces/resources/members/types/UpdateWorkspaceMemberRoleRequestBodyDefaultSiteRole.ts
@@ -0,0 +1,13 @@
+// This file was auto-generated by Fern from our API Definition.
+
+/** The Member's default Site Role. Required on every request — unlike the dashboard's own role editor, this endpoint never derives it from the Member's current role. */
+export const UpdateWorkspaceMemberRoleRequestBodyDefaultSiteRole = {
+ SiteManager: "site_manager",
+ Designer: "designer",
+ Marketer: "marketer",
+ ContentEditor: "content_editor",
+ Reviewer: "reviewer",
+ Custom: "custom",
+} as const;
+export type UpdateWorkspaceMemberRoleRequestBodyDefaultSiteRole =
+ (typeof UpdateWorkspaceMemberRoleRequestBodyDefaultSiteRole)[keyof typeof UpdateWorkspaceMemberRoleRequestBodyDefaultSiteRole];
diff --git a/src/api/resources/workspaces/resources/members/types/UpdateWorkspaceMemberRoleRequestBodyRole.ts b/src/api/resources/workspaces/resources/members/types/UpdateWorkspaceMemberRoleRequestBodyRole.ts
new file mode 100644
index 00000000..0bee54df
--- /dev/null
+++ b/src/api/resources/workspaces/resources/members/types/UpdateWorkspaceMemberRoleRequestBodyRole.ts
@@ -0,0 +1,10 @@
+// This file was auto-generated by Fern from our API Definition.
+
+/** The Workspace Role to assign */
+export const UpdateWorkspaceMemberRoleRequestBodyRole = {
+ Admin: "admin",
+ Member: "member",
+ Reviewer: "reviewer",
+} as const;
+export type UpdateWorkspaceMemberRoleRequestBodyRole =
+ (typeof UpdateWorkspaceMemberRoleRequestBodyRole)[keyof typeof UpdateWorkspaceMemberRoleRequestBodyRole];
diff --git a/src/api/resources/workspaces/resources/members/types/index.ts b/src/api/resources/workspaces/resources/members/types/index.ts
new file mode 100644
index 00000000..98e9f30a
--- /dev/null
+++ b/src/api/resources/workspaces/resources/members/types/index.ts
@@ -0,0 +1,5 @@
+export * from "./BulkUpdateWorkspaceMemberRolesRequestBodyDefaultSiteRole";
+export * from "./BulkUpdateWorkspaceMemberRolesRequestBodyRole";
+export * from "./MembersListMembersRequestRolesItem";
+export * from "./UpdateWorkspaceMemberRoleRequestBodyDefaultSiteRole";
+export * from "./UpdateWorkspaceMemberRoleRequestBodyRole";
diff --git a/src/api/types/AeoAnswerEngine.ts b/src/api/types/AeoAnswerEngine.ts
new file mode 100644
index 00000000..b05d3a43
--- /dev/null
+++ b/src/api/types/AeoAnswerEngine.ts
@@ -0,0 +1,11 @@
+// This file was auto-generated by Fern from our API Definition.
+
+/**
+ * The answer engine that produced the response.
+ */
+export interface AeoAnswerEngine {
+ /** The answer engine's ID, such as `chat-gpt`, `gemini`, `claude`, or `perplexity`. */
+ key: string;
+ /** The answer engine's display name, such as `ChatGPT`. */
+ name: string;
+}
diff --git a/src/api/types/AeoAnswerEngineKey.ts b/src/api/types/AeoAnswerEngineKey.ts
new file mode 100644
index 00000000..ccb1ac4c
--- /dev/null
+++ b/src/api/types/AeoAnswerEngineKey.ts
@@ -0,0 +1,16 @@
+// This file was auto-generated by Fern from our API Definition.
+
+/**
+ * An answer engine:
+ * - `chat-gpt` — ChatGPT
+ * - `gemini` — Gemini
+ * - `claude` — Claude
+ * - `perplexity` — Perplexity
+ */
+export const AeoAnswerEngineKey = {
+ ChatGpt: "chat-gpt",
+ Gemini: "gemini",
+ Claude: "claude",
+ Perplexity: "perplexity",
+} as const;
+export type AeoAnswerEngineKey = (typeof AeoAnswerEngineKey)[keyof typeof AeoAnswerEngineKey];
diff --git a/src/api/types/AeoAnswerEnginesFilter.ts b/src/api/types/AeoAnswerEnginesFilter.ts
new file mode 100644
index 00000000..c5e7c8ef
--- /dev/null
+++ b/src/api/types/AeoAnswerEnginesFilter.ts
@@ -0,0 +1,8 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../index";
+
+/**
+ * The answer engines the results were filtered to.
+ */
+export type AeoAnswerEnginesFilter = Webflow.AeoAnswerEngineKey[];
diff --git a/src/api/types/AeoBotCategory.ts b/src/api/types/AeoBotCategory.ts
new file mode 100644
index 00000000..ee033779
--- /dev/null
+++ b/src/api/types/AeoBotCategory.ts
@@ -0,0 +1,16 @@
+// This file was auto-generated by Fern from our API Definition.
+
+/**
+ * A bot category:
+ * - `agent` — Bots that request live content from your site to support AI-assisted experiences, such as answering a user's question.
+ * - `indexer` — Bots that crawl pages to discover, map, or refresh content that AI tools may use for retrieval.
+ * - `training` — Bots that collect or review web content for AI model development and related data pipelines.
+ * - `multiple` — Bots with more than one type of activity, or that can't be confidently attributed to a single purpose.
+ */
+export const AeoBotCategory = {
+ Agent: "agent",
+ Indexer: "indexer",
+ Multiple: "multiple",
+ Training: "training",
+} as const;
+export type AeoBotCategory = (typeof AeoBotCategory)[keyof typeof AeoBotCategory];
diff --git a/src/api/types/AeoBotProvider.ts b/src/api/types/AeoBotProvider.ts
new file mode 100644
index 00000000..3e411ace
--- /dev/null
+++ b/src/api/types/AeoBotProvider.ts
@@ -0,0 +1,34 @@
+// This file was auto-generated by Fern from our API Definition.
+
+/**
+ * A bot provider:
+ * - `ai2` — Allen Institute for AI (AI2)
+ * - `amazon` — Amazon
+ * - `anthropic` — Anthropic
+ * - `apple` — Apple
+ * - `bytedance` — ByteDance
+ * - `common-crawl` — Common Crawl
+ * - `duckduckgo` — DuckDuckGo
+ * - `google` — Google
+ * - `meta` — Meta
+ * - `microsoft` — Microsoft
+ * - `mistral` — Mistral AI
+ * - `openai` — OpenAI
+ * - `perplexity` — Perplexity
+ */
+export const AeoBotProvider = {
+ Ai2: "ai2",
+ Amazon: "amazon",
+ Anthropic: "anthropic",
+ Apple: "apple",
+ Bytedance: "bytedance",
+ CommonCrawl: "common-crawl",
+ Duckduckgo: "duckduckgo",
+ Google: "google",
+ Meta: "meta",
+ Microsoft: "microsoft",
+ Mistral: "mistral",
+ Openai: "openai",
+ Perplexity: "perplexity",
+} as const;
+export type AeoBotProvider = (typeof AeoBotProvider)[keyof typeof AeoBotProvider];
diff --git a/src/api/types/AeoBotTrafficFilter.ts b/src/api/types/AeoBotTrafficFilter.ts
new file mode 100644
index 00000000..dd1e1f96
--- /dev/null
+++ b/src/api/types/AeoBotTrafficFilter.ts
@@ -0,0 +1,12 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../index";
+
+/**
+ * The filters the report used. Present only when a filter was sent.
+ */
+export interface AeoBotTrafficFilter {
+ /** The bot providers the report was filtered to, in the order sent. */
+ botProviders?: string[];
+ botCategory?: Webflow.AeoBotCategory;
+}
diff --git a/src/api/types/AeoBotTrafficPage.ts b/src/api/types/AeoBotTrafficPage.ts
new file mode 100644
index 00000000..c670ab22
--- /dev/null
+++ b/src/api/types/AeoBotTrafficPage.ts
@@ -0,0 +1,10 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../index";
+
+export interface AeoBotTrafficPage {
+ /** The number of successful requests that the AI bots Webflow tracks made to this page or file. */
+ requestCount: number;
+ /** The Webflow page or CMS item requested. A file with no page, such as `/sitemap.xml`, has only `title`, set to its path. Omitted when the row has neither a page nor a path. */
+ page?: Webflow.AeoPage;
+}
diff --git a/src/api/types/AeoBotTrafficPagesResponse.ts b/src/api/types/AeoBotTrafficPagesResponse.ts
new file mode 100644
index 00000000..04f5e022
--- /dev/null
+++ b/src/api/types/AeoBotTrafficPagesResponse.ts
@@ -0,0 +1,12 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../index";
+
+export interface AeoBotTrafficPagesResponse {
+ /** The report type. */
+ report: "bot_traffic_pages";
+ window: Webflow.AeoWindow;
+ /** The pages and files bots requested most, sorted by `requestCount`, highest first. */
+ data: Webflow.AeoBotTrafficPage[];
+ filter?: Webflow.AeoBotTrafficFilter;
+}
diff --git a/src/api/types/AeoBotTrafficResponse.ts b/src/api/types/AeoBotTrafficResponse.ts
new file mode 100644
index 00000000..579914eb
--- /dev/null
+++ b/src/api/types/AeoBotTrafficResponse.ts
@@ -0,0 +1,12 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../index";
+
+export interface AeoBotTrafficResponse {
+ /** The report type. */
+ report: "bot_traffic";
+ window: Webflow.AeoWindow;
+ /** The number of successful requests (HTTP `200` or `304`) that the AI bots Webflow tracks made to the site's pages and files. */
+ totalRequestCount: number;
+ filter?: Webflow.AeoBotTrafficFilter;
+}
diff --git a/src/api/types/AeoBrandNames.ts b/src/api/types/AeoBrandNames.ts
new file mode 100644
index 00000000..f7b8ab9b
--- /dev/null
+++ b/src/api/types/AeoBrandNames.ts
@@ -0,0 +1,6 @@
+// This file was auto-generated by Fern from our API Definition.
+
+/**
+ * Your organization name, then its aliases, from Organization info.
+ */
+export type AeoBrandNames = string[];
diff --git a/src/api/types/AeoCitationFilter.ts b/src/api/types/AeoCitationFilter.ts
new file mode 100644
index 00000000..b55b6c6c
--- /dev/null
+++ b/src/api/types/AeoCitationFilter.ts
@@ -0,0 +1,12 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../index";
+
+/**
+ * The filters the report used. Present only when a filter was sent.
+ */
+export interface AeoCitationFilter {
+ topicIds?: Webflow.AeoTopicIdsFilter;
+ promptIds?: Webflow.AeoPromptIdsFilter;
+ answerEngines?: Webflow.AeoAnswerEnginesFilter;
+}
diff --git a/src/api/types/AeoCitationRateResponse.ts b/src/api/types/AeoCitationRateResponse.ts
new file mode 100644
index 00000000..39dc6ee0
--- /dev/null
+++ b/src/api/types/AeoCitationRateResponse.ts
@@ -0,0 +1,16 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../index";
+
+export interface AeoCitationRateResponse {
+ /** The report type. */
+ report: "citation_rate";
+ window: Webflow.AeoWindow;
+ /** Whether each row is a topic or a prompt. */
+ breakdown: Webflow.AeoCitationRateResponseBreakdown;
+ /** Your domains, which count as citations of your site. These are your Allowed domains and your `webflow.io` subdomain, each with and without `www.`. */
+ domains: string[];
+ /** The topics or prompts, sorted by `citationRate`, highest first. */
+ data: Webflow.AeoCitationRateResponseDataItem[];
+ filter?: Webflow.AeoCitationFilter;
+}
diff --git a/src/api/types/AeoCitationRateResponseBreakdown.ts b/src/api/types/AeoCitationRateResponseBreakdown.ts
new file mode 100644
index 00000000..70c70bf9
--- /dev/null
+++ b/src/api/types/AeoCitationRateResponseBreakdown.ts
@@ -0,0 +1,9 @@
+// This file was auto-generated by Fern from our API Definition.
+
+/** Whether each row is a topic or a prompt. */
+export const AeoCitationRateResponseBreakdown = {
+ Topic: "topic",
+ Prompt: "prompt",
+} as const;
+export type AeoCitationRateResponseBreakdown =
+ (typeof AeoCitationRateResponseBreakdown)[keyof typeof AeoCitationRateResponseBreakdown];
diff --git a/src/api/types/AeoCitationRateResponseDataItem.ts b/src/api/types/AeoCitationRateResponseDataItem.ts
new file mode 100644
index 00000000..4a52c4de
--- /dev/null
+++ b/src/api/types/AeoCitationRateResponseDataItem.ts
@@ -0,0 +1,12 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../index";
+
+export interface AeoCitationRateResponseDataItem {
+ /** Of the responses that cited at least one source, the share that cited one of your domains, from 0 to 1. `0.55` means 55%. */
+ citationRate: number;
+ /** The topic. Present when `breakdown` is `topic`. */
+ topic?: Webflow.AeoTopicLabel;
+ /** The prompt. Present when `breakdown` is `prompt`. */
+ prompt?: Webflow.AeoPromptLabel;
+}
diff --git a/src/api/types/AeoCitationsResponse.ts b/src/api/types/AeoCitationsResponse.ts
new file mode 100644
index 00000000..2dc7d2ae
--- /dev/null
+++ b/src/api/types/AeoCitationsResponse.ts
@@ -0,0 +1,18 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../index";
+
+export interface AeoCitationsResponse {
+ /** The report type. */
+ report: "citations";
+ window: Webflow.AeoWindow;
+ /** The responses, sorted by `timestamp`, newest first. Includes responses that cited nothing. */
+ data: Webflow.AeoCitationsResponseDataItem[];
+ /** Whether more rows exist after this page. At `limit=1000`, a full page always returns `true`, even when the next page is empty. */
+ hasMore: boolean;
+ /** The `limit` used. */
+ limit: number;
+ /** The `offset` used. */
+ offset: number;
+ filter?: Webflow.AeoCitationFilter;
+}
diff --git a/src/api/types/AeoCitationsResponseDataItem.ts b/src/api/types/AeoCitationsResponseDataItem.ts
new file mode 100644
index 00000000..3c87cd69
--- /dev/null
+++ b/src/api/types/AeoCitationsResponseDataItem.ts
@@ -0,0 +1,19 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../index";
+
+export interface AeoCitationsResponseDataItem {
+ /** When the response was recorded, in UTC. */
+ timestamp: Date;
+ topic: Webflow.AeoTopicLabel;
+ prompt: Webflow.AeoPromptLabel;
+ answerEngine: Webflow.AeoAnswerEngine;
+ /** The URLs the response cited. */
+ citations: string[];
+ /** The domains of the cited URLs. */
+ citationDomains: string[];
+ /** The paths of the cited URLs. */
+ citationPaths: string[];
+ /** The names found in the response. Get Visibility Score matches this field against your organization name and aliases. */
+ mentions: string[];
+}
diff --git a/src/api/types/AeoCitedDomainPathsResponse.ts b/src/api/types/AeoCitedDomainPathsResponse.ts
new file mode 100644
index 00000000..477890ad
--- /dev/null
+++ b/src/api/types/AeoCitedDomainPathsResponse.ts
@@ -0,0 +1,14 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../index";
+
+export interface AeoCitedDomainPathsResponse {
+ /** The report type. */
+ report: "cited_domain_paths";
+ window: Webflow.AeoWindow;
+ /** The domain, lowercased. */
+ domain: string;
+ /** The cited paths, sorted by `citationRate`, highest first. */
+ data: Webflow.AeoCitedPath[];
+ filter?: Webflow.AeoTopicEngineFilter;
+}
diff --git a/src/api/types/AeoCitedPath.ts b/src/api/types/AeoCitedPath.ts
new file mode 100644
index 00000000..41e3a646
--- /dev/null
+++ b/src/api/types/AeoCitedPath.ts
@@ -0,0 +1,8 @@
+// This file was auto-generated by Fern from our API Definition.
+
+export interface AeoCitedPath {
+ /** The cited URL's path and query string, without the host. */
+ path: string;
+ /** This path's share of all citations, from 0 to 1. */
+ citationRate: number;
+}
diff --git a/src/api/types/AeoCompetitorCitationsResponse.ts b/src/api/types/AeoCompetitorCitationsResponse.ts
new file mode 100644
index 00000000..450319dc
--- /dev/null
+++ b/src/api/types/AeoCompetitorCitationsResponse.ts
@@ -0,0 +1,14 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../index";
+
+export interface AeoCompetitorCitationsResponse {
+ /** The report type. */
+ report: "competitor_citations";
+ window: Webflow.AeoWindow;
+ /** Your competitors' domains, from Organization info, each with and without `www.`. */
+ competitorDomains: string[];
+ /** The responses that cited a competitor's domain and none of your domains, sorted by `timestamp`, newest first. */
+ data: Webflow.AeoCompetitorCitationsResponseDataItem[];
+ filter?: Webflow.AeoTopicEngineFilter;
+}
diff --git a/src/api/types/AeoCompetitorCitationsResponseDataItem.ts b/src/api/types/AeoCompetitorCitationsResponseDataItem.ts
new file mode 100644
index 00000000..61a57e9c
--- /dev/null
+++ b/src/api/types/AeoCompetitorCitationsResponseDataItem.ts
@@ -0,0 +1,13 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../index";
+
+export interface AeoCompetitorCitationsResponseDataItem {
+ /** When the response was recorded, in UTC. */
+ timestamp: Date;
+ topic: Webflow.AeoTopicLabel;
+ prompt: Webflow.AeoPromptLabel;
+ answerEngine: Webflow.AeoAnswerEngine;
+ /** Every URL the response cited, not only competitor URLs. */
+ citations: string[];
+}
diff --git a/src/api/types/AeoOwnedCitedPath.ts b/src/api/types/AeoOwnedCitedPath.ts
new file mode 100644
index 00000000..da7741dc
--- /dev/null
+++ b/src/api/types/AeoOwnedCitedPath.ts
@@ -0,0 +1,12 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../index";
+
+export interface AeoOwnedCitedPath {
+ /** The cited URL's path and query string, without the host. */
+ path: string;
+ /** This path's share of all citations, from 0 to 1. */
+ citationRate: number;
+ /** The Webflow page or CMS item the path maps to. Omitted when none is known. */
+ page?: Webflow.AeoPage;
+}
diff --git a/src/api/types/AeoPage.ts b/src/api/types/AeoPage.ts
new file mode 100644
index 00000000..28a76233
--- /dev/null
+++ b/src/api/types/AeoPage.ts
@@ -0,0 +1,15 @@
+// This file was auto-generated by Fern from our API Definition.
+
+/**
+ * The Webflow page or CMS item. Each field is present only when known.
+ */
+export interface AeoPage {
+ /** The page ID. For a CMS item, the ID of its template page. */
+ pageId?: string;
+ /** The CMS collection ID, for a CMS item. */
+ collectionId?: string;
+ /** The CMS item's slug, for a CMS item. */
+ itemSlug?: string;
+ /** The page's title, or the CMS item's name. */
+ title?: string;
+}
diff --git a/src/api/types/AeoPageCitationShareResponse.ts b/src/api/types/AeoPageCitationShareResponse.ts
new file mode 100644
index 00000000..e667081c
--- /dev/null
+++ b/src/api/types/AeoPageCitationShareResponse.ts
@@ -0,0 +1,17 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../index";
+
+export interface AeoPageCitationShareResponse {
+ /** The report type. */
+ report: "page_citation_share";
+ window: Webflow.AeoWindow;
+ /** The page, as sent. `title` is present only when the page is on this site and its title can be found. */
+ page: Webflow.AeoPageCitationShareResponsePage;
+ /** Present only when `breakdown` was sent. */
+ breakdown?: "prompt";
+ /** One row for the page, or one row per prompt when `breakdown=prompt`, sorted by `citationShare`, highest first. */
+ data: Webflow.AeoPageCitationShareResponseDataItem[];
+ /** The filters the report used. Present only when a filter was sent. */
+ filter?: Webflow.AeoPageCitationShareResponseFilter;
+}
diff --git a/src/api/types/AeoPageCitationShareResponseDataItem.ts b/src/api/types/AeoPageCitationShareResponseDataItem.ts
new file mode 100644
index 00000000..51af50f5
--- /dev/null
+++ b/src/api/types/AeoPageCitationShareResponseDataItem.ts
@@ -0,0 +1,10 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../index";
+
+export interface AeoPageCitationShareResponseDataItem {
+ /** This page's share of all citations to your domains, from 0 to 1. With `breakdown=prompt`, the prompt's share of this page's citations. `0.18` means 18%. */
+ citationShare: number;
+ /** The prompt. Present when `breakdown` is `prompt`. */
+ prompt?: Webflow.AeoPromptLabel;
+}
diff --git a/src/api/types/AeoPageCitationShareResponseFilter.ts b/src/api/types/AeoPageCitationShareResponseFilter.ts
new file mode 100644
index 00000000..d93f03fa
--- /dev/null
+++ b/src/api/types/AeoPageCitationShareResponseFilter.ts
@@ -0,0 +1,10 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../index";
+
+/**
+ * The filters the report used. Present only when a filter was sent.
+ */
+export interface AeoPageCitationShareResponseFilter {
+ answerEngines?: Webflow.AeoAnswerEnginesFilter;
+}
diff --git a/src/api/types/AeoPageCitationShareResponsePage.ts b/src/api/types/AeoPageCitationShareResponsePage.ts
new file mode 100644
index 00000000..7dccd32e
--- /dev/null
+++ b/src/api/types/AeoPageCitationShareResponsePage.ts
@@ -0,0 +1,15 @@
+// This file was auto-generated by Fern from our API Definition.
+
+/**
+ * The page, as sent. `title` is present only when the page is on this site and its title can be found.
+ */
+export interface AeoPageCitationShareResponsePage {
+ /** The page ID. */
+ pageId: string;
+ /** The CMS collection ID, for a CMS item. */
+ collectionId?: string;
+ /** The CMS item's slug, for a CMS item. */
+ itemSlug?: string;
+ /** The page's title, or the CMS item's name. */
+ title?: string;
+}
diff --git a/src/api/types/AeoPrompt.ts b/src/api/types/AeoPrompt.ts
new file mode 100644
index 00000000..9841810b
--- /dev/null
+++ b/src/api/types/AeoPrompt.ts
@@ -0,0 +1,30 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../index";
+
+/**
+ * A question you track. Webflow runs each prompt through ChatGPT, Claude, Gemini, and Perplexity once a day.
+ */
+export interface AeoPrompt {
+ /** The prompt ID. */
+ id: string;
+ /** The prompt's text. */
+ text: string;
+ /** The topic the prompt belongs to. */
+ topic: Webflow.AeoPromptTopic;
+ /** The prompt's language, if set. */
+ language?: string;
+ /** The prompt's region, if set. */
+ region?: string;
+ /** The prompt's persona, if set. */
+ persona?: string;
+ /** The prompt's tags. Prompts added with Generate with AI have `ai-generated`. Empty when there are none. */
+ tags: string[];
+ status: Webflow.AeoPromptStatus;
+ /** When the prompt was created. */
+ createdAt: Date;
+ /** When the prompt was last updated. Omitted when it hasn't been updated. */
+ updatedAt?: Date;
+ /** When the prompt last ran. Omitted when it hasn't run yet. */
+ lastRunAt?: Date;
+}
diff --git a/src/api/types/AeoPromptExecution.ts b/src/api/types/AeoPromptExecution.ts
new file mode 100644
index 00000000..5dc15a63
--- /dev/null
+++ b/src/api/types/AeoPromptExecution.ts
@@ -0,0 +1,37 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../index";
+
+/**
+ * One response from one answer engine to one prompt.
+ */
+export interface AeoPromptExecution {
+ /** The prompt execution ID. */
+ id: string;
+ /** The prompt that ran. `text` is the prompt's current text, and is omitted when the prompt no longer exists. */
+ prompt: Webflow.AeoPromptLabel;
+ /**
+ * The prompt's current status, not its status when it ran. One of the prompt statuses, or:
+ * - `deleted` — The prompt no longer exists.
+ */
+ promptStatus: Webflow.AeoPromptExecutionPromptStatus;
+ /** The topic the prompt belongs to. */
+ topic?: Webflow.AeoPromptExecutionTopic;
+ answerEngine: Webflow.AeoAnswerEngine;
+ /** Whether the run succeeded. */
+ status: Webflow.AeoPromptExecutionStatus;
+ /** Your organization name and aliases found in the response. Matching is by substring, so "Apple" also matches "Apple Watch." */
+ mentions: string[];
+ /** The URLs the response cited. */
+ citations: string[];
+ /** The prompt's tags when it ran. */
+ tags: string[];
+ /** The first 500 characters of the response. */
+ preview?: string;
+ /** When the prompt ran. */
+ createdAt: Date;
+ /** When the execution was last updated. */
+ updatedAt: Date;
+ /** The full response text. Included only while it's still stored, and on List Prompt Executions only with `includeRawResponse=true`. */
+ rawResponse?: string;
+}
diff --git a/src/api/types/AeoPromptExecutionListResponse.ts b/src/api/types/AeoPromptExecutionListResponse.ts
new file mode 100644
index 00000000..eaf8ac23
--- /dev/null
+++ b/src/api/types/AeoPromptExecutionListResponse.ts
@@ -0,0 +1,10 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../index";
+
+export interface AeoPromptExecutionListResponse {
+ /** The prompt executions, sorted by `createdAt`, newest first. */
+ items: Webflow.AeoPromptExecution[];
+ /** Pass this as `cursor` to get the next page. Present whenever the page is full, so the next page can be empty. Omitted on a page that isn't full. */
+ nextCursor?: string;
+}
diff --git a/src/api/types/AeoPromptExecutionPromptStatus.ts b/src/api/types/AeoPromptExecutionPromptStatus.ts
new file mode 100644
index 00000000..ee6e6a29
--- /dev/null
+++ b/src/api/types/AeoPromptExecutionPromptStatus.ts
@@ -0,0 +1,15 @@
+// This file was auto-generated by Fern from our API Definition.
+
+/**
+ * The prompt's current status, not its status when it ran. One of the prompt statuses, or:
+ * - `deleted` — The prompt no longer exists.
+ */
+export const AeoPromptExecutionPromptStatus = {
+ Active: "active",
+ Paused: "paused",
+ Pending: "pending",
+ Archived: "archived",
+ Deleted: "deleted",
+} as const;
+export type AeoPromptExecutionPromptStatus =
+ (typeof AeoPromptExecutionPromptStatus)[keyof typeof AeoPromptExecutionPromptStatus];
diff --git a/src/api/types/AeoPromptExecutionStatus.ts b/src/api/types/AeoPromptExecutionStatus.ts
new file mode 100644
index 00000000..6ac65cfe
--- /dev/null
+++ b/src/api/types/AeoPromptExecutionStatus.ts
@@ -0,0 +1,8 @@
+// This file was auto-generated by Fern from our API Definition.
+
+/** Whether the run succeeded. */
+export const AeoPromptExecutionStatus = {
+ Completed: "completed",
+ Failed: "failed",
+} as const;
+export type AeoPromptExecutionStatus = (typeof AeoPromptExecutionStatus)[keyof typeof AeoPromptExecutionStatus];
diff --git a/src/api/types/AeoPromptExecutionTopic.ts b/src/api/types/AeoPromptExecutionTopic.ts
new file mode 100644
index 00000000..0b47653a
--- /dev/null
+++ b/src/api/types/AeoPromptExecutionTopic.ts
@@ -0,0 +1,11 @@
+// This file was auto-generated by Fern from our API Definition.
+
+/**
+ * The topic the prompt belongs to.
+ */
+export interface AeoPromptExecutionTopic {
+ /** The topic ID. */
+ id: string;
+ /** The topic's name. Empty when the topic no longer exists. */
+ name: string;
+}
diff --git a/src/api/types/AeoPromptIdsFilter.ts b/src/api/types/AeoPromptIdsFilter.ts
new file mode 100644
index 00000000..8048b7ec
--- /dev/null
+++ b/src/api/types/AeoPromptIdsFilter.ts
@@ -0,0 +1,6 @@
+// This file was auto-generated by Fern from our API Definition.
+
+/**
+ * The prompt IDs the results were filtered to.
+ */
+export type AeoPromptIdsFilter = string[];
diff --git a/src/api/types/AeoPromptLabel.ts b/src/api/types/AeoPromptLabel.ts
new file mode 100644
index 00000000..d033f5c3
--- /dev/null
+++ b/src/api/types/AeoPromptLabel.ts
@@ -0,0 +1,11 @@
+// This file was auto-generated by Fern from our API Definition.
+
+/**
+ * A prompt, which is a question you track.
+ */
+export interface AeoPromptLabel {
+ /** The prompt ID. */
+ id: string;
+ /** The prompt's text. Omitted when the prompt can't be found. */
+ text?: string;
+}
diff --git a/src/api/types/AeoPromptListResponse.ts b/src/api/types/AeoPromptListResponse.ts
new file mode 100644
index 00000000..f2e421b1
--- /dev/null
+++ b/src/api/types/AeoPromptListResponse.ts
@@ -0,0 +1,10 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../index";
+
+export interface AeoPromptListResponse {
+ /** The prompts, sorted by `createdAt`, newest first. */
+ items: Webflow.AeoPrompt[];
+ /** Pass this as `cursor` to get the next page. Present whenever the page is full, so the next page can be empty. Omitted on a page that isn't full. */
+ nextCursor?: string;
+}
diff --git a/src/api/types/AeoPromptStatus.ts b/src/api/types/AeoPromptStatus.ts
new file mode 100644
index 00000000..ad6cefc4
--- /dev/null
+++ b/src/api/types/AeoPromptStatus.ts
@@ -0,0 +1,14 @@
+// This file was auto-generated by Fern from our API Definition.
+
+/**
+ * The prompt's status:
+ * - `active` — The prompt runs on its daily schedule.
+ * - `archived` — The prompt was deleted. It no longer runs, but its past results remain.
+ */
+export const AeoPromptStatus = {
+ Active: "active",
+ Paused: "paused",
+ Pending: "pending",
+ Archived: "archived",
+} as const;
+export type AeoPromptStatus = (typeof AeoPromptStatus)[keyof typeof AeoPromptStatus];
diff --git a/src/api/types/AeoPromptTopic.ts b/src/api/types/AeoPromptTopic.ts
new file mode 100644
index 00000000..af93f74e
--- /dev/null
+++ b/src/api/types/AeoPromptTopic.ts
@@ -0,0 +1,11 @@
+// This file was auto-generated by Fern from our API Definition.
+
+/**
+ * The topic the prompt belongs to.
+ */
+export interface AeoPromptTopic {
+ /** The topic ID. */
+ id: string;
+ /** The topic's name. */
+ name: string;
+}
diff --git a/src/api/types/AeoTimeseries.ts b/src/api/types/AeoTimeseries.ts
new file mode 100644
index 00000000..ae5c7297
--- /dev/null
+++ b/src/api/types/AeoTimeseries.ts
@@ -0,0 +1,10 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../index";
+
+export interface AeoTimeseries {
+ /** `day` returns one value per day, and `week` returns one value per week, starting on Sunday. */
+ granularityPeriod: Webflow.AeoTimeseriesGranularityPeriod;
+ /** The IANA time zone that day and week boundaries are aligned to, such as `UTC` or `America/New_York`. */
+ bucketTimeZone: string;
+}
diff --git a/src/api/types/AeoTimeseriesGranularityPeriod.ts b/src/api/types/AeoTimeseriesGranularityPeriod.ts
new file mode 100644
index 00000000..9c06208c
--- /dev/null
+++ b/src/api/types/AeoTimeseriesGranularityPeriod.ts
@@ -0,0 +1,9 @@
+// This file was auto-generated by Fern from our API Definition.
+
+/** `day` returns one value per day, and `week` returns one value per week, starting on Sunday. */
+export const AeoTimeseriesGranularityPeriod = {
+ Day: "day",
+ Week: "week",
+} as const;
+export type AeoTimeseriesGranularityPeriod =
+ (typeof AeoTimeseriesGranularityPeriod)[keyof typeof AeoTimeseriesGranularityPeriod];
diff --git a/src/api/types/AeoTopCitedDomainsResponse.ts b/src/api/types/AeoTopCitedDomainsResponse.ts
new file mode 100644
index 00000000..6c751b2f
--- /dev/null
+++ b/src/api/types/AeoTopCitedDomainsResponse.ts
@@ -0,0 +1,12 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../index";
+
+export interface AeoTopCitedDomainsResponse {
+ /** The report type. */
+ report: "top_cited_domains";
+ window: Webflow.AeoWindow;
+ /** The most cited domains, sorted by citation count, highest first. Your domains outside the top `limit` are added after the ranked rows. */
+ data: Webflow.AeoTopCitedDomainsResponseDataItem[];
+ filter?: Webflow.AeoTopicEngineFilter;
+}
diff --git a/src/api/types/AeoTopCitedDomainsResponseDataItem.ts b/src/api/types/AeoTopCitedDomainsResponseDataItem.ts
new file mode 100644
index 00000000..901f31e0
--- /dev/null
+++ b/src/api/types/AeoTopCitedDomainsResponseDataItem.ts
@@ -0,0 +1,14 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../index";
+
+export interface AeoTopCitedDomainsResponseDataItem {
+ /** The cited domain. `example.com` and `www.example.com` are separate rows. */
+ domain: string;
+ /** This domain's share of all citations, from 0 to 1. `0.4` means 40%. */
+ citationRate: number;
+ /** Your cited paths on this domain, by citation count, highest first. Present only for your domains. */
+ paths?: Webflow.AeoOwnedCitedPath[];
+ /** The approximate number of distinct cited paths on this domain. `0` when only the home page was cited. Present only for domains that aren't yours. */
+ distinctPathCount?: number;
+}
diff --git a/src/api/types/AeoTopicEngineFilter.ts b/src/api/types/AeoTopicEngineFilter.ts
new file mode 100644
index 00000000..3a18558a
--- /dev/null
+++ b/src/api/types/AeoTopicEngineFilter.ts
@@ -0,0 +1,11 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../index";
+
+/**
+ * The filters the report used. Present only when a filter was sent.
+ */
+export interface AeoTopicEngineFilter {
+ topicIds?: Webflow.AeoTopicIdsFilter;
+ answerEngines?: Webflow.AeoAnswerEnginesFilter;
+}
diff --git a/src/api/types/AeoTopicIdsFilter.ts b/src/api/types/AeoTopicIdsFilter.ts
new file mode 100644
index 00000000..d2badbb7
--- /dev/null
+++ b/src/api/types/AeoTopicIdsFilter.ts
@@ -0,0 +1,6 @@
+// This file was auto-generated by Fern from our API Definition.
+
+/**
+ * The topic IDs the results were filtered to.
+ */
+export type AeoTopicIdsFilter = string[];
diff --git a/src/api/types/AeoTopicLabel.ts b/src/api/types/AeoTopicLabel.ts
new file mode 100644
index 00000000..6645c23f
--- /dev/null
+++ b/src/api/types/AeoTopicLabel.ts
@@ -0,0 +1,11 @@
+// This file was auto-generated by Fern from our API Definition.
+
+/**
+ * A topic, which groups related prompts.
+ */
+export interface AeoTopicLabel {
+ /** The topic ID. */
+ id: string;
+ /** The topic's name. Omitted when the topic can't be found. */
+ name?: string;
+}
diff --git a/src/api/types/AeoVisibilityBreakdownResponse.ts b/src/api/types/AeoVisibilityBreakdownResponse.ts
new file mode 100644
index 00000000..16120a4f
--- /dev/null
+++ b/src/api/types/AeoVisibilityBreakdownResponse.ts
@@ -0,0 +1,17 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../index";
+
+export interface AeoVisibilityBreakdownResponse {
+ /** The report type. */
+ report: "visibility_breakdown";
+ window: Webflow.AeoWindow;
+ /** Whether each row is a topic or a prompt. */
+ breakdown: Webflow.AeoVisibilityBreakdownResponseBreakdown;
+ brandNames: Webflow.AeoBrandNames;
+ /** The `limit` sent. Present only when `limit` was sent. */
+ limit?: number;
+ /** The topics or prompts, sorted by `visibilityScore`, highest first. */
+ data: Webflow.AeoVisibilityBreakdownResponseDataItem[];
+ filter?: Webflow.AeoVisibilityFilter;
+}
diff --git a/src/api/types/AeoVisibilityBreakdownResponseBreakdown.ts b/src/api/types/AeoVisibilityBreakdownResponseBreakdown.ts
new file mode 100644
index 00000000..4e9061b3
--- /dev/null
+++ b/src/api/types/AeoVisibilityBreakdownResponseBreakdown.ts
@@ -0,0 +1,9 @@
+// This file was auto-generated by Fern from our API Definition.
+
+/** Whether each row is a topic or a prompt. */
+export const AeoVisibilityBreakdownResponseBreakdown = {
+ Topic: "topic",
+ Prompt: "prompt",
+} as const;
+export type AeoVisibilityBreakdownResponseBreakdown =
+ (typeof AeoVisibilityBreakdownResponseBreakdown)[keyof typeof AeoVisibilityBreakdownResponseBreakdown];
diff --git a/src/api/types/AeoVisibilityBreakdownResponseDataItem.ts b/src/api/types/AeoVisibilityBreakdownResponseDataItem.ts
new file mode 100644
index 00000000..503ed624
--- /dev/null
+++ b/src/api/types/AeoVisibilityBreakdownResponseDataItem.ts
@@ -0,0 +1,11 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../index";
+
+export interface AeoVisibilityBreakdownResponseDataItem {
+ visibilityScore: Webflow.AeoVisibilityScore;
+ /** The topic. Present when `breakdown` is `topic`. */
+ topic?: Webflow.AeoTopicLabel;
+ /** The prompt. Present when `breakdown` is `prompt`. */
+ prompt?: Webflow.AeoPromptLabel;
+}
diff --git a/src/api/types/AeoVisibilityFilter.ts b/src/api/types/AeoVisibilityFilter.ts
new file mode 100644
index 00000000..abe84ed6
--- /dev/null
+++ b/src/api/types/AeoVisibilityFilter.ts
@@ -0,0 +1,12 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../index";
+
+/**
+ * The filters the report used. Present only when a filter was sent.
+ */
+export interface AeoVisibilityFilter {
+ topicIds?: Webflow.AeoTopicIdsFilter;
+ promptIds?: Webflow.AeoPromptIdsFilter;
+ answerEngine?: Webflow.AeoAnswerEngineKey;
+}
diff --git a/src/api/types/AeoVisibilityResponse.ts b/src/api/types/AeoVisibilityResponse.ts
new file mode 100644
index 00000000..bf9bb68f
--- /dev/null
+++ b/src/api/types/AeoVisibilityResponse.ts
@@ -0,0 +1,15 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../index";
+
+export interface AeoVisibilityResponse {
+ /** The report type. */
+ report: "visibility";
+ window: Webflow.AeoWindow;
+ brandNames: Webflow.AeoBrandNames;
+ /** The `timeseries` settings used. Present only when `timeseries` was sent. */
+ bucketing?: Webflow.AeoTimeseries;
+ /** One point for the whole time range, or one point per day or week when `timeseries` is sent, oldest first. */
+ data: Webflow.AeoVisibilityResponseDataItem[];
+ filter?: Webflow.AeoVisibilityFilter;
+}
diff --git a/src/api/types/AeoVisibilityResponseDataItem.ts b/src/api/types/AeoVisibilityResponseDataItem.ts
new file mode 100644
index 00000000..64908b23
--- /dev/null
+++ b/src/api/types/AeoVisibilityResponseDataItem.ts
@@ -0,0 +1,9 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../index";
+
+export interface AeoVisibilityResponseDataItem {
+ /** The start of the time range, or the start of the day or week, in UTC. */
+ timestamp: Date;
+ visibilityScore: Webflow.AeoVisibilityScore;
+}
diff --git a/src/api/types/AeoVisibilityScore.ts b/src/api/types/AeoVisibilityScore.ts
new file mode 100644
index 00000000..5d43e9b3
--- /dev/null
+++ b/src/api/types/AeoVisibilityScore.ts
@@ -0,0 +1,6 @@
+// This file was auto-generated by Fern from our API Definition.
+
+/**
+ * The share of responses to your tracked prompts that mention your organization name or one of its aliases, from 0 to 1. `0.42` means 42%.
+ */
+export type AeoVisibilityScore = number;
diff --git a/src/api/types/AeoWindow.ts b/src/api/types/AeoWindow.ts
new file mode 100644
index 00000000..1ae4e0c3
--- /dev/null
+++ b/src/api/types/AeoWindow.ts
@@ -0,0 +1,11 @@
+// This file was auto-generated by Fern from our API Definition.
+
+/**
+ * The time range of the report, echoed exactly as sent.
+ */
+export interface AeoWindow {
+ /** Inclusive start of the time range. */
+ startTime: Date;
+ /** Exclusive end of the time range. */
+ endTime: Date;
+}
diff --git a/src/api/types/AnalyzeBucketTimeZone.ts b/src/api/types/AnalyzeBucketTimeZone.ts
new file mode 100644
index 00000000..ef160973
--- /dev/null
+++ b/src/api/types/AnalyzeBucketTimeZone.ts
@@ -0,0 +1,6 @@
+// This file was auto-generated by Fern from our API Definition.
+
+/**
+ * Valid IANA time zone used to align time bucket boundaries. Use canonical names such as `UTC` or `America/New_York`. Bucket timestamps are returned as UTC instants for local bucket starts in this time zone; for example, `America/New_York` local midnight on April 1, 2026 is returned as `2026-04-01T04:00:00.000Z`.
+ */
+export type AnalyzeBucketTimeZone = string;
diff --git a/src/api/types/AnalyzeDailyBucketing.ts b/src/api/types/AnalyzeDailyBucketing.ts
new file mode 100644
index 00000000..f9d244f2
--- /dev/null
+++ b/src/api/types/AnalyzeDailyBucketing.ts
@@ -0,0 +1,12 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../index";
+
+/**
+ * Daily bucketing applied to a response.
+ */
+export interface AnalyzeDailyBucketing {
+ /** Bucket size used for this response. */
+ granularityPeriod: "day";
+ bucketTimeZone: Webflow.AnalyzeBucketTimeZone;
+}
diff --git a/src/api/types/AnalyzeDailyTimeseriesQuery.ts b/src/api/types/AnalyzeDailyTimeseriesQuery.ts
new file mode 100644
index 00000000..58075686
--- /dev/null
+++ b/src/api/types/AnalyzeDailyTimeseriesQuery.ts
@@ -0,0 +1,10 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../index";
+
+/**
+ * Options that opt a report into daily timeseries data.
+ */
+export interface AnalyzeDailyTimeseriesQuery {
+ bucketTimeZone: Webflow.AnalyzeBucketTimeZone;
+}
diff --git a/src/api/types/AnalyzeFilterOperators.ts b/src/api/types/AnalyzeFilterOperators.ts
new file mode 100644
index 00000000..bf6447ad
--- /dev/null
+++ b/src/api/types/AnalyzeFilterOperators.ts
@@ -0,0 +1,15 @@
+// This file was auto-generated by Fern from our API Definition.
+
+/**
+ * Operators for filtering a single dimension. Specify at least one of `eq`, `in`, `ne`, or `nin`.
+ */
+export interface AnalyzeFilterOperators {
+ /** Match values exactly equal to the provided value. */
+ eq?: string;
+ /** Match values in the provided list. Use indexed bracket notation — `filter[][in][0]=value1&filter[][in][1]=value2`. Comma-separated values (for example, `filter[][in]=value1,value2`) are not supported. */
+ in?: string[];
+ /** Exclude values exactly equal to the provided value. */
+ ne?: string;
+ /** Exclude values in the provided list. Use indexed bracket notation — `filter[][nin][0]=value1&filter[][nin][1]=value2`. Comma-separated values (for example, `filter[][nin]=value1,value2`) are not supported. */
+ nin?: string[];
+}
diff --git a/src/api/types/AnalyzeTimeOnPageBucketing.ts b/src/api/types/AnalyzeTimeOnPageBucketing.ts
new file mode 100644
index 00000000..9e739c6f
--- /dev/null
+++ b/src/api/types/AnalyzeTimeOnPageBucketing.ts
@@ -0,0 +1,11 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../index";
+
+/**
+ * Bucketing applied to a time on page response.
+ */
+export interface AnalyzeTimeOnPageBucketing {
+ granularityPeriod: Webflow.TimeOnPageGranularityPeriod;
+ bucketTimeZone: Webflow.AnalyzeBucketTimeZone;
+}
diff --git a/src/api/types/AnalyzeWindow.ts b/src/api/types/AnalyzeWindow.ts
new file mode 100644
index 00000000..ec7864dd
--- /dev/null
+++ b/src/api/types/AnalyzeWindow.ts
@@ -0,0 +1,11 @@
+// This file was auto-generated by Fern from our API Definition.
+
+/**
+ * A reporting time window. `endTime` must be greater than `startTime`.
+ */
+export interface AnalyzeWindow {
+ /** Inclusive start of the reporting window, in ISO 8601 / RFC 3339 format. */
+ startTime: Date;
+ /** Exclusive end of the reporting window, in ISO 8601 / RFC 3339 format. */
+ endTime: Date;
+}
diff --git a/src/api/types/Asset.ts b/src/api/types/Asset.ts
index 3346e95f..4e66f2ae 100644
--- a/src/api/types/Asset.ts
+++ b/src/api/types/Asset.ts
@@ -28,4 +28,9 @@ export interface Asset {
variants: Webflow.AssetVariant[];
/** The visual description of the asset */
altText?: string;
+ /**
+ * The ID of the folder the asset belongs to, or `null` if the asset is at the site root.
+ * This field is present only in list responses (`GET /sites/{site_id}/assets`).
+ */
+ folderId?: string;
}
diff --git a/src/api/types/Authorization.ts b/src/api/types/Authorization.ts
index 62dbdc81..c326bce0 100644
--- a/src/api/types/Authorization.ts
+++ b/src/api/types/Authorization.ts
@@ -5,5 +5,6 @@ import type * as Webflow from "../index";
export interface Authorization {
/** The Authorization object */
authorization?: Webflow.AuthorizationAuthorization;
+ /** Details of the OAuth app the token belongs to. Present only for tokens issued to an OAuth app. Omitted for `client_credentials` tokens without an OAuth app, such as Site and Workspace API tokens. */
application?: Webflow.Application;
}
diff --git a/src/api/types/BranchCreatedWebhook.ts b/src/api/types/BranchCreatedWebhook.ts
new file mode 100644
index 00000000..39ac70ee
--- /dev/null
+++ b/src/api/types/BranchCreatedWebhook.ts
@@ -0,0 +1,11 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../index";
+
+/**
+ * The Webhook payload for when a branch is created
+ */
+export interface BranchCreatedWebhook {
+ triggerType?: string;
+ payload?: Webflow.BranchCreatedWebhookPayload;
+}
diff --git a/src/api/types/BranchCreatedWebhookPayload.ts b/src/api/types/BranchCreatedWebhookPayload.ts
new file mode 100644
index 00000000..52929c8c
--- /dev/null
+++ b/src/api/types/BranchCreatedWebhookPayload.ts
@@ -0,0 +1,13 @@
+// This file was auto-generated by Fern from our API Definition.
+
+export interface BranchCreatedWebhookPayload {
+ siteId?: string;
+ branchId?: string;
+ /** ID of the branch page (the duplicate page). */
+ pageId?: string;
+ /** ID of the original page branched from, or an empty string for standalone branches. */
+ parentPageId?: string;
+ pageName?: string;
+ createdBy?: string;
+ createdOn?: Date;
+}
diff --git a/src/api/types/BranchDeletedWebhook.ts b/src/api/types/BranchDeletedWebhook.ts
new file mode 100644
index 00000000..cfea03f7
--- /dev/null
+++ b/src/api/types/BranchDeletedWebhook.ts
@@ -0,0 +1,11 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../index";
+
+/**
+ * The Webhook payload for when a branch is explicitly deleted
+ */
+export interface BranchDeletedWebhook {
+ triggerType?: string;
+ payload?: Webflow.BranchDeletedWebhookPayload;
+}
diff --git a/src/api/types/BranchDeletedWebhookPayload.ts b/src/api/types/BranchDeletedWebhookPayload.ts
new file mode 100644
index 00000000..476e607c
--- /dev/null
+++ b/src/api/types/BranchDeletedWebhookPayload.ts
@@ -0,0 +1,11 @@
+// This file was auto-generated by Fern from our API Definition.
+
+export interface BranchDeletedWebhookPayload {
+ siteId?: string;
+ branchId?: string;
+ pageId?: string;
+ parentPageId?: string;
+ pageName?: string;
+ deletedBy?: string;
+ deletedOn?: Date;
+}
diff --git a/src/api/types/BranchMergedWebhook.ts b/src/api/types/BranchMergedWebhook.ts
new file mode 100644
index 00000000..b24e70a0
--- /dev/null
+++ b/src/api/types/BranchMergedWebhook.ts
@@ -0,0 +1,11 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../index";
+
+/**
+ * The Webhook payload for when a branch is merged into main
+ */
+export interface BranchMergedWebhook {
+ triggerType?: string;
+ payload?: Webflow.BranchMergedWebhookPayload;
+}
diff --git a/src/api/types/BranchMergedWebhookPayload.ts b/src/api/types/BranchMergedWebhookPayload.ts
new file mode 100644
index 00000000..9ed31587
--- /dev/null
+++ b/src/api/types/BranchMergedWebhookPayload.ts
@@ -0,0 +1,11 @@
+// This file was auto-generated by Fern from our API Definition.
+
+export interface BranchMergedWebhookPayload {
+ siteId?: string;
+ branchId?: string;
+ pageId?: string;
+ parentPageId?: string;
+ pageName?: string;
+ mergedBy?: string;
+ mergedOn?: Date;
+}
diff --git a/src/api/types/BrowserWindowHeightDataPoint.ts b/src/api/types/BrowserWindowHeightDataPoint.ts
new file mode 100644
index 00000000..faa85f92
--- /dev/null
+++ b/src/api/types/BrowserWindowHeightDataPoint.ts
@@ -0,0 +1,9 @@
+// This file was auto-generated by Fern from our API Definition.
+
+/**
+ * A single average browser window height data point. Wrapped in a one-element `data` array for SDK uniformity with other Analyze reports.
+ */
+export interface BrowserWindowHeightDataPoint {
+ /** Average browser window height over the requested window, in CSS pixels. */
+ averageBrowserWindowHeightPixels: number;
+}
diff --git a/src/api/types/BrowserWindowHeightFilter.ts b/src/api/types/BrowserWindowHeightFilter.ts
new file mode 100644
index 00000000..3351e3d5
--- /dev/null
+++ b/src/api/types/BrowserWindowHeightFilter.ts
@@ -0,0 +1,40 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../index";
+
+/**
+ * Filter the browser window height report by dimension. Each property is an optional set of `AnalyzeFilterOperators` (`eq`, `in`, `ne`, `nin`) applied to the named dimension. Filter a given dimension in one place — either inside `filter` or as a top-level query parameter.
+ */
+export interface BrowserWindowHeightFilter {
+ audienceIds?: Webflow.AnalyzeFilterOperators;
+ browser?: Webflow.AnalyzeFilterOperators;
+ collectionId?: Webflow.AnalyzeFilterOperators;
+ country?: Webflow.AnalyzeFilterOperators;
+ dayOfWeek?: Webflow.AnalyzeFilterOperators;
+ deviceBrand?: Webflow.AnalyzeFilterOperators;
+ deviceType?: Webflow.AnalyzeFilterOperators;
+ domain?: Webflow.AnalyzeFilterOperators;
+ itemSlug?: Webflow.AnalyzeFilterOperators;
+ language?: Webflow.AnalyzeFilterOperators;
+ locale?: Webflow.AnalyzeFilterOperators;
+ nextCollectionId?: Webflow.AnalyzeFilterOperators;
+ nextItemSlug?: Webflow.AnalyzeFilterOperators;
+ nextPageId?: Webflow.AnalyzeFilterOperators;
+ os?: Webflow.AnalyzeFilterOperators;
+ pageId?: Webflow.AnalyzeFilterOperators;
+ pagePath?: Webflow.AnalyzeFilterOperators;
+ previousCollectionId?: Webflow.AnalyzeFilterOperators;
+ previousItemSlug?: Webflow.AnalyzeFilterOperators;
+ previousPageId?: Webflow.AnalyzeFilterOperators;
+ referrer?: Webflow.AnalyzeFilterOperators;
+ region?: Webflow.AnalyzeFilterOperators;
+ timeOfDay?: Webflow.AnalyzeFilterOperators;
+ timezone?: Webflow.AnalyzeFilterOperators;
+ trafficSource?: Webflow.AnalyzeFilterOperators;
+ utmCampaign?: Webflow.AnalyzeFilterOperators;
+ utmContent?: Webflow.AnalyzeFilterOperators;
+ utmMedium?: Webflow.AnalyzeFilterOperators;
+ utmSource?: Webflow.AnalyzeFilterOperators;
+ utmTerm?: Webflow.AnalyzeFilterOperators;
+ visitStatus?: Webflow.AnalyzeFilterOperators;
+}
diff --git a/src/api/types/BrowserWindowHeightResponse.ts b/src/api/types/BrowserWindowHeightResponse.ts
new file mode 100644
index 00000000..fc0265df
--- /dev/null
+++ b/src/api/types/BrowserWindowHeightResponse.ts
@@ -0,0 +1,15 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../index";
+
+/**
+ * Response payload for the browser window height report.
+ */
+export interface BrowserWindowHeightResponse {
+ /** Discriminator identifying the report type. */
+ report: "browser_window_height";
+ window: Webflow.AnalyzeWindow;
+ /** Average browser window height for the window. Typically contains one row, but may be empty when upstream data is sparse. */
+ data: Webflow.BrowserWindowHeightDataPoint[];
+ filter?: Webflow.BrowserWindowHeightFilter;
+}
diff --git a/src/api/types/BulkCollectionItem.ts b/src/api/types/BulkCollectionItem.ts
index ecccc63e..3eaa3fc3 100644
--- a/src/api/types/BulkCollectionItem.ts
+++ b/src/api/types/BulkCollectionItem.ts
@@ -18,7 +18,7 @@ export interface BulkCollectionItem {
createdOn?: string;
/** Boolean determining if the Item is set to archived */
isArchived?: boolean;
- /** Boolean determining if the Item is set to draft */
+ /** Whether the item is in a draft state. `true` unless the request set `isDraft: false`. */
isDraft?: boolean;
fieldData?: Webflow.BulkCollectionItemFieldData;
}
diff --git a/src/api/types/CollaboratorClientInvite.ts b/src/api/types/CollaboratorClientInvite.ts
new file mode 100644
index 00000000..204bf267
--- /dev/null
+++ b/src/api/types/CollaboratorClientInvite.ts
@@ -0,0 +1,11 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../index";
+
+export interface CollaboratorClientInvite {
+ email: string;
+ /** The Workspace Role to invite the person as */
+ workspaceRole: "client";
+ /** The one Site where the collaborator client receives access. */
+ siteAccess: Webflow.InviteWorkspaceMemberRequestBodyEmailSiteAccessItem[];
+}
diff --git a/src/api/types/Collection.ts b/src/api/types/Collection.ts
index 28f37449..b047723e 100644
--- a/src/api/types/Collection.ts
+++ b/src/api/types/Collection.ts
@@ -20,4 +20,6 @@ export interface Collection {
lastUpdated?: Date;
/** The list of fields in the Collection */
fields: Webflow.Field[];
+ /** The list of field groups in the Collection */
+ fieldGroups?: Webflow.FieldGroup[];
}
diff --git a/src/api/types/CollectionItem.ts b/src/api/types/CollectionItem.ts
index 5d17d886..6deb150b 100644
--- a/src/api/types/CollectionItem.ts
+++ b/src/api/types/CollectionItem.ts
@@ -22,7 +22,7 @@ export interface CollectionItem {
createdOn?: string;
/** Boolean determining if the Item is set to archived */
isArchived?: boolean;
- /** Boolean determining if the Item is set to draft */
+ /** Whether the item is in a draft state. Together with `lastPublished`, this determines the status shown in the Webflow UI. See [Publishing with the CMS API](/data/docs/working-with-the-cms/publishing) for the full mapping. */
isDraft?: boolean;
fieldData: Webflow.CollectionItemFieldData;
}
diff --git a/src/api/types/CollectionItemPatchSingle.ts b/src/api/types/CollectionItemPatchSingle.ts
index 72fa3fdb..6ef5173a 100644
--- a/src/api/types/CollectionItemPatchSingle.ts
+++ b/src/api/types/CollectionItemPatchSingle.ts
@@ -18,7 +18,14 @@ export interface CollectionItemPatchSingle {
createdOn?: string;
/** Boolean determining if the Item is set to archived */
isArchived?: boolean;
- /** Boolean determining if the Item is set to draft */
+ /**
+ * Sets the item's draft state. The resulting status depends on whether the item has been published before:
+ *
+ * - **Item that has never been published:** `isDraft: true` results in a `Draft` status.
+ * - **Already-published item:** `isDraft: true` results in a `Changes in draft` status. The live item stays published, and your changes are held back until you publish them.
+ *
+ * Setting `isDraft: true` never unpublishes an item. To remove an item from the live site, use [Unpublish Live Collection Items](/data/reference/cms/collection-items/live-items/delete-items-live).
+ */
isDraft?: boolean;
fieldData?: Webflow.CollectionItemPatchSingleFieldData;
}
diff --git a/src/api/types/CollectionItemPostSingle.ts b/src/api/types/CollectionItemPostSingle.ts
index 19ca4778..a56e06c6 100644
--- a/src/api/types/CollectionItemPostSingle.ts
+++ b/src/api/types/CollectionItemPostSingle.ts
@@ -22,7 +22,7 @@ export interface CollectionItemPostSingle {
createdOn?: string;
/** Boolean determining if the Item is in an archived state. */
isArchived?: boolean;
- /** Boolean determining if the Item is in a draft state. */
+ /** Whether the item is created in a draft state. A new item has never been published, so `isDraft: true` gives it a `Draft` status. Set `isDraft: false` to queue the item to publish on the next site publish. */
isDraft?: boolean;
fieldData: Webflow.CollectionItemPostSingleFieldData;
}
diff --git a/src/api/types/CollectionItemWithIdInput.ts b/src/api/types/CollectionItemWithIdInput.ts
index 55399e5c..a5bbc238 100644
--- a/src/api/types/CollectionItemWithIdInput.ts
+++ b/src/api/types/CollectionItemWithIdInput.ts
@@ -18,7 +18,14 @@ export interface CollectionItemWithIdInput {
createdOn?: string;
/** Boolean determining if the Item is set to archived */
isArchived?: boolean;
- /** Boolean determining if the Item is set to draft */
+ /**
+ * Sets the item's draft state. The resulting status depends on whether the item has been published before:
+ *
+ * - **Item that has never been published:** `isDraft: true` results in a `Draft` status.
+ * - **Already-published item:** `isDraft: true` results in a `Changes in draft` status. The live item stays published, and your changes are held back until you publish them.
+ *
+ * Setting `isDraft: true` never unpublishes an item. To remove an item from the live site, use [Unpublish Live Collection Items](/data/reference/cms/collection-items/live-items/delete-items-live).
+ */
isDraft?: boolean;
fieldData?: Webflow.CollectionItemWithIdInputFieldData;
}
diff --git a/src/api/types/CommentPayload.ts b/src/api/types/CommentPayload.ts
index d6479d79..bda396c1 100644
--- a/src/api/types/CommentPayload.ts
+++ b/src/api/types/CommentPayload.ts
@@ -10,8 +10,8 @@ export interface CommentPayload {
threadId?: string;
/** Unique identifier for the comment reply */
commentId?: string;
- /** The type of comment payload */
- type?: string;
+ /** The type of comment payload. `new_comment` indicates a new thread; `reply` indicates a reply to an existing thread. */
+ type?: Webflow.CommentPayloadType;
/** The site unique identifier */
siteId?: string;
/** The page unique identifier, or for CMS item comments, the template page ID */
diff --git a/src/api/types/CommentPayloadType.ts b/src/api/types/CommentPayloadType.ts
new file mode 100644
index 00000000..3df24c0e
--- /dev/null
+++ b/src/api/types/CommentPayloadType.ts
@@ -0,0 +1,8 @@
+// This file was auto-generated by Fern from our API Definition.
+
+/** The type of comment payload. `new_comment` indicates a new thread; `reply` indicates a reply to an existing thread. */
+export const CommentPayloadType = {
+ NewComment: "new_comment",
+ Reply: "reply",
+} as const;
+export type CommentPayloadType = (typeof CommentPayloadType)[keyof typeof CommentPayloadType];
diff --git a/src/api/types/CustomFont.ts b/src/api/types/CustomFont.ts
new file mode 100644
index 00000000..b5aa1eaa
--- /dev/null
+++ b/src/api/types/CustomFont.ts
@@ -0,0 +1,27 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../index";
+
+/**
+ * A custom font uploaded to a Webflow site
+ */
+export interface CustomFont {
+ /** Unique identifier for the custom font */
+ id?: string;
+ /** The CSS font-family name. Commas are stripped server-side. */
+ fontFamily: string;
+ /** The font file format, derived from the file extension. The value `svg` represents read-only legacy data; new SVG font uploads are not accepted. */
+ format?: Webflow.CustomFontFormat;
+ /** The file name supplied at upload time */
+ fileName?: string;
+ /** The CSS font-weight value (1–1000) */
+ weight: number;
+ /** Whether the font is italic */
+ italic: boolean;
+ /** The CSS font-display value */
+ fontDisplay: Webflow.CustomFontFontDisplay;
+ /** Variable font axes. An empty array indicates a static font. */
+ axes: Webflow.CustomFontAxis[];
+ /** CDN URL for the font binary */
+ hostedUrl?: string;
+}
diff --git a/src/api/types/CustomFontAxis.ts b/src/api/types/CustomFontAxis.ts
new file mode 100644
index 00000000..5bfa8869
--- /dev/null
+++ b/src/api/types/CustomFontAxis.ts
@@ -0,0 +1,17 @@
+// This file was auto-generated by Fern from our API Definition.
+
+/**
+ * A variable font axis definition
+ */
+export interface CustomFontAxis {
+ /** The four-character OpenType axis tag, consisting of exactly 4 printable ASCII characters (for example, `wght`, `opsz`, `slnt`, `wdth`) */
+ tag: string;
+ /** Optional human-readable label for the axis */
+ name?: string;
+ /** Minimum value for the axis */
+ min: number;
+ /** Maximum value for the axis */
+ max: number;
+ /** Default value for the axis. Must be between `min` and `max` (inclusive). Violating this constraint returns `400 BadArgument` with an error prefixed `fontMetadata.axes`. */
+ defaultValue: number;
+}
diff --git a/src/api/types/CustomFontBatchCreateResponse.ts b/src/api/types/CustomFontBatchCreateResponse.ts
new file mode 100644
index 00000000..099a0d28
--- /dev/null
+++ b/src/api/types/CustomFontBatchCreateResponse.ts
@@ -0,0 +1,13 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../index";
+
+/**
+ * Per-item result of a bulk-create operation
+ */
+export interface CustomFontBatchCreateResponse {
+ /** Successfully registered fonts, each with its own presigned S3 upload details. */
+ created: Webflow.CustomFontBatchCreateResponseCreatedItem[];
+ /** Requested fonts that could not be registered. Valid fonts elsewhere in the batch are still registered. */
+ failed: Webflow.CustomFontBatchCreateResponseFailedItem[];
+}
diff --git a/src/api/types/CustomFontBatchCreateResponseCreatedItem.ts b/src/api/types/CustomFontBatchCreateResponseCreatedItem.ts
new file mode 100644
index 00000000..60de2686
--- /dev/null
+++ b/src/api/types/CustomFontBatchCreateResponseCreatedItem.ts
@@ -0,0 +1,8 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../index";
+
+export interface CustomFontBatchCreateResponseCreatedItem {
+ customFont: Webflow.CustomFont;
+ upload: Webflow.CustomFontUpload;
+}
diff --git a/src/api/types/CustomFontBatchCreateResponseFailedItem.ts b/src/api/types/CustomFontBatchCreateResponseFailedItem.ts
new file mode 100644
index 00000000..cb9083e7
--- /dev/null
+++ b/src/api/types/CustomFontBatchCreateResponseFailedItem.ts
@@ -0,0 +1,12 @@
+// This file was auto-generated by Fern from our API Definition.
+
+export interface CustomFontBatchCreateResponseFailedItem {
+ /** Zero-based position of the font in the request `items` array */
+ index: number;
+ /** The `fileName` of the font that could not be registered */
+ fileName: string;
+ /** Error name. `FontLimitReached` indicates the site's custom font limit was reached before this font could be registered. */
+ name: string;
+ /** Human-readable error message */
+ msg: string;
+}
diff --git a/src/api/types/CustomFontBatchDeleteResponse.ts b/src/api/types/CustomFontBatchDeleteResponse.ts
new file mode 100644
index 00000000..eebbbdd2
--- /dev/null
+++ b/src/api/types/CustomFontBatchDeleteResponse.ts
@@ -0,0 +1,11 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../index";
+
+/**
+ * Per-item result of a bulk-delete operation
+ */
+export interface CustomFontBatchDeleteResponse {
+ deleted: Webflow.CustomFontBatchDeleteResponseDeletedItem[];
+ failed: Webflow.CustomFontBatchDeleteResponseFailedItem[];
+}
diff --git a/src/api/types/CustomFontBatchDeleteResponseDeletedItem.ts b/src/api/types/CustomFontBatchDeleteResponseDeletedItem.ts
new file mode 100644
index 00000000..82cf8e5b
--- /dev/null
+++ b/src/api/types/CustomFontBatchDeleteResponseDeletedItem.ts
@@ -0,0 +1,6 @@
+// This file was auto-generated by Fern from our API Definition.
+
+export interface CustomFontBatchDeleteResponseDeletedItem {
+ /** The ID of a successfully deleted custom font */
+ id: string;
+}
diff --git a/src/api/types/CustomFontBatchDeleteResponseFailedItem.ts b/src/api/types/CustomFontBatchDeleteResponseFailedItem.ts
new file mode 100644
index 00000000..1604d95e
--- /dev/null
+++ b/src/api/types/CustomFontBatchDeleteResponseFailedItem.ts
@@ -0,0 +1,10 @@
+// This file was auto-generated by Fern from our API Definition.
+
+export interface CustomFontBatchDeleteResponseFailedItem {
+ /** The ID of a custom font that could not be deleted */
+ id: string;
+ /** Error name */
+ name: string;
+ /** Human-readable error message */
+ msg: string;
+}
diff --git a/src/api/types/CustomFontCreateResponse.ts b/src/api/types/CustomFontCreateResponse.ts
new file mode 100644
index 00000000..442067b7
--- /dev/null
+++ b/src/api/types/CustomFontCreateResponse.ts
@@ -0,0 +1,11 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../index";
+
+/**
+ * The response to a successful custom font creation or file replacement request
+ */
+export interface CustomFontCreateResponse {
+ customFont: Webflow.CustomFont;
+ upload: Webflow.CustomFontUpload;
+}
diff --git a/src/api/types/CustomFontFontDisplay.ts b/src/api/types/CustomFontFontDisplay.ts
new file mode 100644
index 00000000..3d5a189e
--- /dev/null
+++ b/src/api/types/CustomFontFontDisplay.ts
@@ -0,0 +1,11 @@
+// This file was auto-generated by Fern from our API Definition.
+
+/** The CSS font-display value */
+export const CustomFontFontDisplay = {
+ Auto: "auto",
+ Block: "block",
+ Swap: "swap",
+ Fallback: "fallback",
+ Optional: "optional",
+} as const;
+export type CustomFontFontDisplay = (typeof CustomFontFontDisplay)[keyof typeof CustomFontFontDisplay];
diff --git a/src/api/types/CustomFontFormat.ts b/src/api/types/CustomFontFormat.ts
new file mode 100644
index 00000000..cf68a83d
--- /dev/null
+++ b/src/api/types/CustomFontFormat.ts
@@ -0,0 +1,12 @@
+// This file was auto-generated by Fern from our API Definition.
+
+/** The font file format, derived from the file extension. The value `svg` represents read-only legacy data; new SVG font uploads are not accepted. */
+export const CustomFontFormat = {
+ Woff2: "woff2",
+ Woff: "woff",
+ Truetype: "truetype",
+ Opentype: "opentype",
+ EmbeddedOpentype: "embedded-opentype",
+ Svg: "svg",
+} as const;
+export type CustomFontFormat = (typeof CustomFontFormat)[keyof typeof CustomFontFormat];
diff --git a/src/api/types/CustomFontUpload.ts b/src/api/types/CustomFontUpload.ts
new file mode 100644
index 00000000..080d0a52
--- /dev/null
+++ b/src/api/types/CustomFontUpload.ts
@@ -0,0 +1,14 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../index";
+
+/**
+ * Presigned S3 upload details. Post the font binary to `url` as `multipart/form-data`, including every key from `fields` plus the binary itself in a field named `file`. The `file` field must be the last field in the form.
+ */
+export interface CustomFontUpload {
+ /** The S3 endpoint to POST the font binary to */
+ url: string;
+ fields: Webflow.CustomFontUploadFields;
+ /** ISO 8601 timestamp after which the presigned URL expires (approximately 15 minutes from issuance) */
+ expiresAt: Date;
+}
diff --git a/src/api/types/CustomFontUploadFields.ts b/src/api/types/CustomFontUploadFields.ts
new file mode 100644
index 00000000..d96edf86
--- /dev/null
+++ b/src/api/types/CustomFontUploadFields.ts
@@ -0,0 +1,33 @@
+// This file was auto-generated by Fern from our API Definition.
+
+/**
+ * Form fields to include in the S3 multipart POST. Every key must be sent as a form field before the `file` field.
+ */
+export interface CustomFontUploadFields {
+ /** The S3 bucket name */
+ bucket: string;
+ /** The S3 object key */
+ key: string;
+ /** Base64-encoded S3 policy document */
+ policy: string;
+ /** AWS Signature Version 4 algorithm identifier */
+ xAmzAlgorithm: string;
+ /** AWS credential string */
+ xAmzCredential: string;
+ /** Request date in ISO 8601 basic format */
+ xAmzDate: string;
+ /** AWS Signature Version 4 signature */
+ xAmzSignature: string;
+ /** AWS security token (included when temporary credentials are used) */
+ xAmzSecurityToken?: string;
+ /** Base64-encoded MD5 hash of the file binary, derived from the `fileHash` you supplied */
+ contentMd5: string;
+ /** S3 ACL. Always `public-read`, which makes the uploaded font accessible to the Webflow CDN. */
+ acl: string;
+ /** Cache-Control header value applied to the S3 object */
+ cacheControl: string;
+ /** MIME type matched to the file extension */
+ contentType: string;
+ /** S3 returns this HTTP status code on a successful upload */
+ successActionStatus: string;
+}
diff --git a/src/api/types/CustomFonts.ts b/src/api/types/CustomFonts.ts
new file mode 100644
index 00000000..b41e79b6
--- /dev/null
+++ b/src/api/types/CustomFonts.ts
@@ -0,0 +1,11 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../index";
+
+/**
+ * A list of custom fonts
+ */
+export interface CustomFonts {
+ customFonts: Webflow.CustomFont[];
+ pagination: Webflow.Pagination;
+}
diff --git a/src/api/types/ErrorCode.ts b/src/api/types/ErrorCode.ts
index d0e73bcd..314633e3 100644
--- a/src/api/types/ErrorCode.ts
+++ b/src/api/types/ErrorCode.ts
@@ -2,34 +2,103 @@
/** Error code */
export const ErrorCode = {
+ AeoInputValidation: "aeo_input_validation",
+ AnalyzeFilterConflict: "analyze_filter_conflict",
+ AnalyzeInputValidation: "analyze_input_validation",
+ AnalyzeUnsupportedFilter: "analyze_unsupported_filter",
BadRequest: "bad_request",
+ BatchTooLarge: "batch_too_large",
+ BeforeHistoricalFloor: "before_historical_floor",
+ BillingProviderUnavailable: "billing_provider_unavailable",
+ BranchMergeConflict: "branch_merge_conflict",
+ BranchMergeInProgress: "branch_merge_in_progress",
+ BranchNotFound: "branch_not_found",
+ BranchPublishFailed: "branch_publish_failed",
+ BranchSyncPending: "branch_sync_pending",
+ BranchTaskNotFound: "branch_task_not_found",
+ BranchUpdateInProgress: "branch_update_in_progress",
+ BrandNotConfigured: "brand_not_configured",
+ CannotInviteSelf: "cannot_invite_self",
+ CannotRemoveSelf: "cannot_remove_self",
+ CannotUpdateUserRole: "cannot_update_user_role",
+ ClientSeatsUnavailable: "client_seats_unavailable",
CollectionNotFound: "collection_not_found",
+ CompetitorsNotConfigured: "competitors_not_configured",
Conflict: "conflict",
+ ConflictingScopeFilters: "conflicting_scope_filters",
+ DefaultSiteRoleRequired: "default_site_role_required",
DuplicateCollection: "duplicate_collection",
+ DuplicateMemberInRequest: "duplicate_member_in_request",
+ DuplicateSiteInRequest: "duplicate_site_in_request",
DuplicateUserEmail: "duplicate_user_email",
EcommerceNotEnabled: "ecommerce_not_enabled",
+ EndTimeTooRecent: "end_time_too_recent",
+ EnterpriseProvisioningCloudAppNotSupported: "enterprise_provisioning_cloud_app_not_supported",
+ EnterpriseProvisioningUpstreamError: "enterprise_provisioning_upstream_error",
+ EnterpriseSelfProvisioningNotEntitled: "enterprise_self_provisioning_not_entitled",
Forbidden: "forbidden",
FormsRequireRepublish: "forms_require_republish",
IncompatibleWebhookFilter: "incompatible_webhook_filter",
+ InsufficientPermissions: "insufficient_permissions",
+ InsufficientSeats: "insufficient_seats",
InternalError: "internal_error",
InvalidAuthVersion: "invalid_auth_version",
InvalidCredentials: "invalid_credentials",
InvalidDomain: "invalid_domain",
+ InvalidResolution: "invalid_resolution",
+ InvalidSiteRole: "invalid_site_role",
+ InvalidTimeRange: "invalid_time_range",
InvalidUserEmail: "invalid_user_email",
+ InvalidWorkspaceRole: "invalid_workspace_role",
+ InviteExpired: "invite_expired",
+ InviteRoleConflict: "invite_role_conflict",
ItemNotFound: "item_not_found",
+ ManagedByScim: "managed_by_scim",
+ MemberAlreadyHasAccess: "member_already_has_access",
+ MemberHasNoSiteAccess: "member_has_no_site_access",
+ MemberIsPayingClient: "member_is_paying_client",
+ MemberNotFound: "member_not_found",
+ MemberNotRemovable: "member_not_removable",
+ MemberRoleConflict: "member_role_conflict",
MissingScopes: "missing_scopes",
NoDomains: "no_domains",
+ NoMembersOrInvites: "no_members_or_invites",
NotAuthorized: "not_authorized",
NotEnterprisePlanSite: "not_enterprise_plan_site",
NotEnterprisePlanWorkspace: "not_enterprise_plan_workspace",
+ OptimizeBeforeHistoricalFloor: "optimize_before_historical_floor",
+ OptimizeInputValidation: "optimize_input_validation",
+ OptimizeInvalidInterval: "optimize_invalid_interval",
+ OptimizeUnknownDimension: "optimize_unknown_dimension",
+ OptimizeUnknownGoal: "optimize_unknown_goal",
+ OptimizeUnknownOptimization: "optimize_unknown_optimization",
+ OptimizeUnsupportedGroupBy: "optimize_unsupported_group_by",
OrderNotFound: "order_not_found",
+ PageCannotBranch: "page_cannot_branch",
ResourceNotFound: "resource_not_found",
+ ServiceUnavailable: "service_unavailable",
+ SiteAccessNotApplicableToMember: "site_access_not_applicable_to_member",
+ SiteAccessNotScopableForRole: "site_access_not_scopable_for_role",
+ SiteAccessRolesMustMatch: "site_access_roles_must_match",
+ SiteNotInWorkspace: "site_not_in_workspace",
+ SiteRoleIdInvalid: "site_role_id_invalid",
+ SiteRoleIdNotAllowed: "site_role_id_not_allowed",
+ SiteRoleIdRequired: "site_role_id_required",
+ SiteSpecificAccessDisabled: "site_specific_access_disabled",
+ SiteSpecificAccessNotEntitled: "site_specific_access_not_entitled",
+ TimeRangeTooWide: "time_range_too_wide",
TooManyRequests: "too_many_requests",
+ UnsupportedBotProvider: "unsupported_bot_provider",
UnsupportedVersion: "unsupported_version",
UnsupportedWebhookTriggerType: "unsupported_webhook_trigger_type",
UserLimitReached: "user_limit_reached",
UserNotFound: "user_not_found",
UsersNotEnabled: "users_not_enabled",
ValidationError: "validation_error",
+ WorkspaceInviteNotFound: "workspace_invite_not_found",
+ WorkspaceMemberManagedByScim: "workspace_member_managed_by_scim",
+ WorkspaceMemberNotFound: "workspace_member_not_found",
+ WorkspaceMemberNotRemovable: "workspace_member_not_removable",
+ WorkspaceRoleNotGrantable: "workspace_role_not_grantable",
} as const;
export type ErrorCode = (typeof ErrorCode)[keyof typeof ErrorCode];
diff --git a/src/api/types/FieldGroup.ts b/src/api/types/FieldGroup.ts
new file mode 100644
index 00000000..b788b22c
--- /dev/null
+++ b/src/api/types/FieldGroup.ts
@@ -0,0 +1,13 @@
+// This file was auto-generated by Fern from our API Definition.
+
+/**
+ * A group of fields within a collection
+ */
+export interface FieldGroup {
+ /** The display name of the field group */
+ displayName: string;
+ /** The IDs of the fields in this group */
+ fieldIds: string[];
+ /** A description of the field group */
+ description?: string;
+}
diff --git a/src/api/types/FormSubmission.ts b/src/api/types/FormSubmission.ts
index aef4b732..32a29a65 100644
--- a/src/api/types/FormSubmission.ts
+++ b/src/api/types/FormSubmission.ts
@@ -13,4 +13,6 @@ export interface FormSubmission {
dateSubmitted?: Date;
/** The data submitted in the Form */
formResponse?: Record;
+ /** The ID of the locale the form was submitted from. `null` for primary-locale submissions or sites without localization. */
+ localeId?: string;
}
diff --git a/src/api/types/FormSubmissionTriggerPayload.ts b/src/api/types/FormSubmissionTriggerPayload.ts
index dfa4b2a9..cf874564 100644
--- a/src/api/types/FormSubmissionTriggerPayload.ts
+++ b/src/api/types/FormSubmissionTriggerPayload.ts
@@ -22,4 +22,6 @@ export interface FormSubmissionTriggerPayload {
formId?: string;
/** The uniqueID of the Form element */
formElementId?: string;
+ /** The ID of the locale the form was submitted from. `null` for primary-locale submissions or sites without localization. */
+ localeId?: string;
}
diff --git a/src/api/types/Goal.ts b/src/api/types/Goal.ts
new file mode 100644
index 00000000..111bf7d6
--- /dev/null
+++ b/src/api/types/Goal.ts
@@ -0,0 +1,32 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../index";
+
+/**
+ * A configured Analyze goal.
+ *
+ * - `integrationSource` is present only when `goalType` is `integration`.
+ * - `formId` is present only when `integrationSource` is `hubspot` or `marketo`.
+ * - `valueType` is present only when `type` is `value`, and `value` only when `valueType` is `static`.
+ */
+export interface Goal {
+ /** Identifier of the goal. A numeric string, not a Webflow object ID. */
+ goalId: string;
+ /** Display name of the goal. */
+ name: string;
+ /** Whether the goal is a site goal, one of the goals marked as your site's top-level conversions. */
+ isSiteGoal: boolean;
+ goalType: Webflow.GoalCategory;
+ integrationSource?: Webflow.GoalIntegrationSource;
+ /** Identifier of the HubSpot or Marketo form the goal tracks. */
+ formId?: string;
+ scope: Webflow.GoalScope;
+ type: Webflow.GoalType;
+ /** Identifiers of the goal's underlying events. These are goal event IDs, not the element IDs returned by the top events report. */
+ eventIds: string[];
+ valueType?: Webflow.GoalValueType;
+ /** Static monetary amount in US cents (for example, `1800` is $18.00). Present only for `static` value goals. */
+ value?: number;
+ /** When the goal was last updated. Absent on older goals. */
+ updatedAt?: Date;
+}
diff --git a/src/api/types/GoalCategory.ts b/src/api/types/GoalCategory.ts
new file mode 100644
index 00000000..c2a5b3ae
--- /dev/null
+++ b/src/api/types/GoalCategory.ts
@@ -0,0 +1,10 @@
+// This file was auto-generated by Fern from our API Definition.
+
+/** The type of goal. `click` goals track clicks on buttons and links. `view` goals track page views. `integration` goals come from HubSpot, Marketo, or Shopify (see `integrationSource`). All other goals, such as goals defined through the API, are `custom`. */
+export const GoalCategory = {
+ Click: "click",
+ View: "view",
+ Integration: "integration",
+ Custom: "custom",
+} as const;
+export type GoalCategory = (typeof GoalCategory)[keyof typeof GoalCategory];
diff --git a/src/api/types/GoalIntegrationSource.ts b/src/api/types/GoalIntegrationSource.ts
new file mode 100644
index 00000000..aa96ae5e
--- /dev/null
+++ b/src/api/types/GoalIntegrationSource.ts
@@ -0,0 +1,9 @@
+// This file was auto-generated by Fern from our API Definition.
+
+/** Third-party source that owns an integration goal's conversions. `shopify` covers client-side and all server-side Shopify events. */
+export const GoalIntegrationSource = {
+ Hubspot: "hubspot",
+ Marketo: "marketo",
+ Shopify: "shopify",
+} as const;
+export type GoalIntegrationSource = (typeof GoalIntegrationSource)[keyof typeof GoalIntegrationSource];
diff --git a/src/api/types/GoalPerformanceDataPoint.ts b/src/api/types/GoalPerformanceDataPoint.ts
new file mode 100644
index 00000000..5649772f
--- /dev/null
+++ b/src/api/types/GoalPerformanceDataPoint.ts
@@ -0,0 +1,11 @@
+// This file was auto-generated by Fern from our API Definition.
+
+/**
+ * Conversions for one day.
+ */
+export interface GoalPerformanceDataPoint {
+ /** Start of the day bucket in `bucketTimeZone`, returned as a UTC instant. */
+ timestamp: Date;
+ /** Unique conversions of the goal in this day. */
+ count: number;
+}
diff --git a/src/api/types/GoalPerformanceFilter.ts b/src/api/types/GoalPerformanceFilter.ts
new file mode 100644
index 00000000..d636affb
--- /dev/null
+++ b/src/api/types/GoalPerformanceFilter.ts
@@ -0,0 +1,40 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../index";
+
+/**
+ * Filter goal performance by dimension. Each property is an optional set of `AnalyzeFilterOperators` (`eq`, `in`, `ne`, `nin`) applied to the named dimension. Filter a given dimension in one place — either inside `filter` or as a top-level query parameter.
+ */
+export interface GoalPerformanceFilter {
+ audienceIds?: Webflow.AnalyzeFilterOperators;
+ browser?: Webflow.AnalyzeFilterOperators;
+ collectionId?: Webflow.AnalyzeFilterOperators;
+ country?: Webflow.AnalyzeFilterOperators;
+ dayOfWeek?: Webflow.AnalyzeFilterOperators;
+ deviceBrand?: Webflow.AnalyzeFilterOperators;
+ deviceType?: Webflow.AnalyzeFilterOperators;
+ domain?: Webflow.AnalyzeFilterOperators;
+ itemSlug?: Webflow.AnalyzeFilterOperators;
+ language?: Webflow.AnalyzeFilterOperators;
+ locale?: Webflow.AnalyzeFilterOperators;
+ nextCollectionId?: Webflow.AnalyzeFilterOperators;
+ nextItemSlug?: Webflow.AnalyzeFilterOperators;
+ nextPageId?: Webflow.AnalyzeFilterOperators;
+ os?: Webflow.AnalyzeFilterOperators;
+ pageId?: Webflow.AnalyzeFilterOperators;
+ pagePath?: Webflow.AnalyzeFilterOperators;
+ previousCollectionId?: Webflow.AnalyzeFilterOperators;
+ previousItemSlug?: Webflow.AnalyzeFilterOperators;
+ previousPageId?: Webflow.AnalyzeFilterOperators;
+ referrer?: Webflow.AnalyzeFilterOperators;
+ region?: Webflow.AnalyzeFilterOperators;
+ timeOfDay?: Webflow.AnalyzeFilterOperators;
+ timezone?: Webflow.AnalyzeFilterOperators;
+ trafficSource?: Webflow.AnalyzeFilterOperators;
+ utmCampaign?: Webflow.AnalyzeFilterOperators;
+ utmContent?: Webflow.AnalyzeFilterOperators;
+ utmMedium?: Webflow.AnalyzeFilterOperators;
+ utmSource?: Webflow.AnalyzeFilterOperators;
+ utmTerm?: Webflow.AnalyzeFilterOperators;
+ visitStatus?: Webflow.AnalyzeFilterOperators;
+}
diff --git a/src/api/types/GoalPerformanceResponse.ts b/src/api/types/GoalPerformanceResponse.ts
new file mode 100644
index 00000000..c60bd278
--- /dev/null
+++ b/src/api/types/GoalPerformanceResponse.ts
@@ -0,0 +1,15 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../index";
+
+/**
+ * Response payload for goal performance. Returns the goal's configuration alongside its daily series, so callers don't need a separate List Goals request.
+ */
+export interface GoalPerformanceResponse {
+ goal: Webflow.Goal;
+ window: Webflow.AnalyzeWindow;
+ bucketing: Webflow.AnalyzeDailyBucketing;
+ /** Daily conversion counts, in chronological order. Empty when the goal had no conversions in the window. */
+ data: Webflow.GoalPerformanceDataPoint[];
+ filter?: Webflow.GoalPerformanceFilter;
+}
diff --git a/src/api/types/GoalScope.ts b/src/api/types/GoalScope.ts
new file mode 100644
index 00000000..cd4ae1de
--- /dev/null
+++ b/src/api/types/GoalScope.ts
@@ -0,0 +1,9 @@
+// This file was auto-generated by Fern from our API Definition.
+
+/** The unit a goal converts on. */
+export const GoalScope = {
+ Session: "session",
+ User: "user",
+ Pageview: "pageview",
+} as const;
+export type GoalScope = (typeof GoalScope)[keyof typeof GoalScope];
diff --git a/src/api/types/GoalType.ts b/src/api/types/GoalType.ts
new file mode 100644
index 00000000..536fa1f0
--- /dev/null
+++ b/src/api/types/GoalType.ts
@@ -0,0 +1,8 @@
+// This file was auto-generated by Fern from our API Definition.
+
+/** Whether the goal counts conversions or tracks a monetary value. */
+export const GoalType = {
+ Conversion: "conversion",
+ Value: "value",
+} as const;
+export type GoalType = (typeof GoalType)[keyof typeof GoalType];
diff --git a/src/api/types/GoalValueType.ts b/src/api/types/GoalValueType.ts
new file mode 100644
index 00000000..393b3391
--- /dev/null
+++ b/src/api/types/GoalValueType.ts
@@ -0,0 +1,8 @@
+// This file was auto-generated by Fern from our API Definition.
+
+/** How a value goal's amount is set. `static` goals use a fixed `value`. `dynamic` goals take the amount from each conversion. */
+export const GoalValueType = {
+ Static: "static",
+ Dynamic: "dynamic",
+} as const;
+export type GoalValueType = (typeof GoalValueType)[keyof typeof GoalValueType];
diff --git a/src/api/types/GoalsResponse.ts b/src/api/types/GoalsResponse.ts
new file mode 100644
index 00000000..e27c1274
--- /dev/null
+++ b/src/api/types/GoalsResponse.ts
@@ -0,0 +1,11 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../index";
+
+/**
+ * Response payload for the goals catalog.
+ */
+export interface GoalsResponse {
+ /** The site's configured goals. Empty when the site has none. */
+ goals: Webflow.Goal[];
+}
diff --git a/src/api/types/GoogleTagId.ts b/src/api/types/GoogleTagId.ts
new file mode 100644
index 00000000..aed843a1
--- /dev/null
+++ b/src/api/types/GoogleTagId.ts
@@ -0,0 +1,13 @@
+// This file was auto-generated by Fern from our API Definition.
+
+/**
+ * A Google Tag associated with a site.
+ */
+export interface GoogleTagId {
+ /** Display order of the tag. Optional on input; always present on output. Auto-assigned for new tags and renormalized after deletion. */
+ order?: number;
+ /** A human-readable label for the tag. */
+ displayName: string;
+ /** The Google Tag ID. Accepts G-, GT-, AW-, and DC- prefixes. Rejects UA- prefixes. */
+ tagId: string;
+}
diff --git a/src/api/types/GoogleTagIds.ts b/src/api/types/GoogleTagIds.ts
new file mode 100644
index 00000000..150493bb
--- /dev/null
+++ b/src/api/types/GoogleTagIds.ts
@@ -0,0 +1,11 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../index";
+
+/**
+ * A list of Google Tags configured for a site.
+ */
+export interface GoogleTagIds {
+ /** List of Google Tags configured for a site, sorted by order. */
+ googleTagIds: Webflow.GoogleTagId[];
+}
diff --git a/src/api/types/InsertCollectionItem.ts b/src/api/types/InsertCollectionItem.ts
new file mode 100644
index 00000000..41a78c53
--- /dev/null
+++ b/src/api/types/InsertCollectionItem.ts
@@ -0,0 +1,24 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../index";
+
+/**
+ * A single entry in an `items/insert` request. Each entry describes one item and the locales to create it in.
+ *
+ * - Omit `id` to create a new item. Use `cmsLocaleIds` to select locales, or `allCmsLocales: true` to select every current site locale. The variants share one new item ID and the same `fieldData`. Omit both locale selectors to create only in the primary locale.
+ * - Set `id` to an existing item's ID to add locale variants to that item. `cmsLocaleIds` is required when you send `id`, and the item must not already have a variant in those locales.
+ * - To give one item different content per locale, send several entries that share the same `id`, each with a single locale in `cmsLocaleIds`.
+ */
+export interface InsertCollectionItem {
+ /** The ID of an existing item to attach locale variants to. Omit this property to create a new item. Requires `cmsLocaleIds` and cannot be combined with `allCmsLocales`. */
+ id?: string;
+ /** The locales to create this entry in. For a new item, omit both this property and `allCmsLocales` to create only in the primary locale. Required when `id` is set. Cannot be combined with `allCmsLocales`, even as an empty array. A locale listed twice returns a `400`. */
+ cmsLocaleIds?: string[];
+ /** Set to `true` to create a new item in every current site locale, including the primary locale, without listing locale IDs. The variants share one new item ID and the same `fieldData`. Only `true` is accepted; omit this property instead of sending `false`. Cannot be combined with `cmsLocaleIds` or an existing item `id`. Each locale variant counts toward the 100-item request limit. */
+ allCmsLocales?: true;
+ /** Boolean determining if the Item is set to archived */
+ isArchived?: boolean;
+ /** Whether the item is created in a draft state. A new item has never been published, so `isDraft: true` gives it a `Draft` status. Set `isDraft: false` to queue the item to publish on the next site publish. */
+ isDraft?: boolean;
+ fieldData: Webflow.InsertCollectionItemFieldData;
+}
diff --git a/src/api/types/InsertCollectionItemFieldData.ts b/src/api/types/InsertCollectionItemFieldData.ts
new file mode 100644
index 00000000..e2b23fbc
--- /dev/null
+++ b/src/api/types/InsertCollectionItemFieldData.ts
@@ -0,0 +1,10 @@
+// This file was auto-generated by Fern from our API Definition.
+
+export interface InsertCollectionItemFieldData {
+ /** Name of the Item */
+ name: string;
+ /** URL structure of the Item in your site. Note: Updates to an item slug will break all links referencing the old slug. */
+ slug: string;
+ /** Accepts any additional properties */
+ [key: string]: any;
+}
diff --git a/src/api/types/InsertedCollectionItem.ts b/src/api/types/InsertedCollectionItem.ts
new file mode 100644
index 00000000..5efd0f63
--- /dev/null
+++ b/src/api/types/InsertedCollectionItem.ts
@@ -0,0 +1,24 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../index";
+
+/**
+ * A Collection Item returned by `items/insert`. Locale variants of the same item share an `id` and differ by `cmsLocaleId`. An entry that selects several locales with `cmsLocaleIds` or `allCmsLocales` returns one item per locale, so match a returned item to the entry that created it on `id` and `cmsLocaleId` rather than on position.
+ */
+export interface InsertedCollectionItem {
+ /** Unique identifier for the Item */
+ id?: string;
+ /** Identifier for the locale of the CMS item */
+ cmsLocaleId?: string;
+ /** The date the item was last published. `null` for the staged items this endpoint creates. */
+ lastPublished?: string;
+ /** The date the item was last updated */
+ lastUpdated?: string;
+ /** The date the item was created */
+ createdOn?: string;
+ /** Boolean determining if the Item is set to archived */
+ isArchived?: boolean;
+ /** Whether the item is in a draft state. `true` unless the request set `isDraft: false`. */
+ isDraft?: boolean;
+ fieldData: Webflow.InsertedCollectionItemFieldData;
+}
diff --git a/src/api/types/InsertedCollectionItemFieldData.ts b/src/api/types/InsertedCollectionItemFieldData.ts
new file mode 100644
index 00000000..3ac9164a
--- /dev/null
+++ b/src/api/types/InsertedCollectionItemFieldData.ts
@@ -0,0 +1,10 @@
+// This file was auto-generated by Fern from our API Definition.
+
+export interface InsertedCollectionItemFieldData {
+ /** Name of the Item */
+ name: string;
+ /** URL structure of the Item in your site. Note: Updates to an item slug will break all links referencing the old slug. */
+ slug: string;
+ /** Accepts any additional properties */
+ [key: string]: any;
+}
diff --git a/src/api/types/InviteWorkspaceMemberRequestBody.ts b/src/api/types/InviteWorkspaceMemberRequestBody.ts
new file mode 100644
index 00000000..cc66ff6c
--- /dev/null
+++ b/src/api/types/InviteWorkspaceMemberRequestBody.ts
@@ -0,0 +1,11 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../index";
+
+/**
+ * Supply either `defaultSiteRole` (one role across every Site the Workspace default extends to) or `siteAccess` (specific Sites, all with the same Site Role), not both. A `client` invite creates a collaborator client relationship and requires exactly one `siteAccess` entry. This endpoint does not accept `sitePlan` or `canPublish`.
+ */
+export type InviteWorkspaceMemberRequestBody =
+ | Webflow.WithDefaultSiteRole
+ | Webflow.WithSiteAccess
+ | Webflow.CollaboratorClientInvite;
diff --git a/src/api/types/InviteWorkspaceMemberRequestBodyDefaultSiteRoleDefaultSiteRole.ts b/src/api/types/InviteWorkspaceMemberRequestBodyDefaultSiteRoleDefaultSiteRole.ts
new file mode 100644
index 00000000..d28b9680
--- /dev/null
+++ b/src/api/types/InviteWorkspaceMemberRequestBodyDefaultSiteRoleDefaultSiteRole.ts
@@ -0,0 +1,13 @@
+// This file was auto-generated by Fern from our API Definition.
+
+/** The Site Role to grant across every Site the Workspace default extends to */
+export const InviteWorkspaceMemberRequestBodyDefaultSiteRoleDefaultSiteRole = {
+ SiteManager: "site_manager",
+ Designer: "designer",
+ Marketer: "marketer",
+ ContentEditor: "content_editor",
+ Reviewer: "reviewer",
+ Custom: "custom",
+} as const;
+export type InviteWorkspaceMemberRequestBodyDefaultSiteRoleDefaultSiteRole =
+ (typeof InviteWorkspaceMemberRequestBodyDefaultSiteRoleDefaultSiteRole)[keyof typeof InviteWorkspaceMemberRequestBodyDefaultSiteRoleDefaultSiteRole];
diff --git a/src/api/types/InviteWorkspaceMemberRequestBodyDefaultSiteRoleWorkspaceRole.ts b/src/api/types/InviteWorkspaceMemberRequestBodyDefaultSiteRoleWorkspaceRole.ts
new file mode 100644
index 00000000..cbbc7f7a
--- /dev/null
+++ b/src/api/types/InviteWorkspaceMemberRequestBodyDefaultSiteRoleWorkspaceRole.ts
@@ -0,0 +1,10 @@
+// This file was auto-generated by Fern from our API Definition.
+
+/** The Workspace Role to invite the person as */
+export const InviteWorkspaceMemberRequestBodyDefaultSiteRoleWorkspaceRole = {
+ Admin: "admin",
+ Member: "member",
+ Reviewer: "reviewer",
+} as const;
+export type InviteWorkspaceMemberRequestBodyDefaultSiteRoleWorkspaceRole =
+ (typeof InviteWorkspaceMemberRequestBodyDefaultSiteRoleWorkspaceRole)[keyof typeof InviteWorkspaceMemberRequestBodyDefaultSiteRoleWorkspaceRole];
diff --git a/src/api/types/InviteWorkspaceMemberRequestBodyEmailSiteAccessItem.ts b/src/api/types/InviteWorkspaceMemberRequestBodyEmailSiteAccessItem.ts
new file mode 100644
index 00000000..be01bc83
--- /dev/null
+++ b/src/api/types/InviteWorkspaceMemberRequestBodyEmailSiteAccessItem.ts
@@ -0,0 +1,10 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../index";
+
+export interface InviteWorkspaceMemberRequestBodyEmailSiteAccessItem {
+ siteId: string;
+ siteRole: Webflow.InviteWorkspaceMemberRequestBodyEmailSiteAccessItemSiteRole;
+ /** ID of the custom Site Role named by `siteRole`. Requires `siteRole` to be `custom`, and rejected with any other `siteRole`. Rejected if the id doesn't name a client-eligible custom Site Role belonging to this workspace. */
+ siteRoleId?: string;
+}
diff --git a/src/api/types/InviteWorkspaceMemberRequestBodyEmailSiteAccessItemSiteRole.ts b/src/api/types/InviteWorkspaceMemberRequestBodyEmailSiteAccessItemSiteRole.ts
new file mode 100644
index 00000000..8347d0b2
--- /dev/null
+++ b/src/api/types/InviteWorkspaceMemberRequestBodyEmailSiteAccessItemSiteRole.ts
@@ -0,0 +1,10 @@
+// This file was auto-generated by Fern from our API Definition.
+
+export const InviteWorkspaceMemberRequestBodyEmailSiteAccessItemSiteRole = {
+ Marketer: "marketer",
+ ContentEditor: "content_editor",
+ Reviewer: "reviewer",
+ Custom: "custom",
+} as const;
+export type InviteWorkspaceMemberRequestBodyEmailSiteAccessItemSiteRole =
+ (typeof InviteWorkspaceMemberRequestBodyEmailSiteAccessItemSiteRole)[keyof typeof InviteWorkspaceMemberRequestBodyEmailSiteAccessItemSiteRole];
diff --git a/src/api/types/InviteWorkspaceMemberRequestBodyOneSiteAccessItem.ts b/src/api/types/InviteWorkspaceMemberRequestBodyOneSiteAccessItem.ts
new file mode 100644
index 00000000..327b7a75
--- /dev/null
+++ b/src/api/types/InviteWorkspaceMemberRequestBodyOneSiteAccessItem.ts
@@ -0,0 +1,10 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../index";
+
+export interface InviteWorkspaceMemberRequestBodyOneSiteAccessItem {
+ siteId: string;
+ siteRole: Webflow.InviteWorkspaceMemberRequestBodyOneSiteAccessItemSiteRole;
+ /** ID of the custom Site Role named by `siteRole`. Requires `siteRole` to be `custom`, and rejected with any other `siteRole`. Rejected if the id doesn't name a custom Site Role belonging to this workspace. */
+ siteRoleId?: string;
+}
diff --git a/src/api/types/InviteWorkspaceMemberRequestBodyOneSiteAccessItemSiteRole.ts b/src/api/types/InviteWorkspaceMemberRequestBodyOneSiteAccessItemSiteRole.ts
new file mode 100644
index 00000000..96127e5a
--- /dev/null
+++ b/src/api/types/InviteWorkspaceMemberRequestBodyOneSiteAccessItemSiteRole.ts
@@ -0,0 +1,12 @@
+// This file was auto-generated by Fern from our API Definition.
+
+export const InviteWorkspaceMemberRequestBodyOneSiteAccessItemSiteRole = {
+ SiteManager: "site_manager",
+ Designer: "designer",
+ Marketer: "marketer",
+ ContentEditor: "content_editor",
+ Reviewer: "reviewer",
+ Custom: "custom",
+} as const;
+export type InviteWorkspaceMemberRequestBodyOneSiteAccessItemSiteRole =
+ (typeof InviteWorkspaceMemberRequestBodyOneSiteAccessItemSiteRole)[keyof typeof InviteWorkspaceMemberRequestBodyOneSiteAccessItemSiteRole];
diff --git a/src/api/types/InviteWorkspaceMemberRequestBodyOneWorkspaceRole.ts b/src/api/types/InviteWorkspaceMemberRequestBodyOneWorkspaceRole.ts
new file mode 100644
index 00000000..718decd0
--- /dev/null
+++ b/src/api/types/InviteWorkspaceMemberRequestBodyOneWorkspaceRole.ts
@@ -0,0 +1,10 @@
+// This file was auto-generated by Fern from our API Definition.
+
+/** The Workspace Role to invite the person as */
+export const InviteWorkspaceMemberRequestBodyOneWorkspaceRole = {
+ Admin: "admin",
+ Member: "member",
+ Reviewer: "reviewer",
+} as const;
+export type InviteWorkspaceMemberRequestBodyOneWorkspaceRole =
+ (typeof InviteWorkspaceMemberRequestBodyOneWorkspaceRole)[keyof typeof InviteWorkspaceMemberRequestBodyOneWorkspaceRole];
diff --git a/src/api/types/InviteWorkspaceMemberResponseBody.ts b/src/api/types/InviteWorkspaceMemberResponseBody.ts
new file mode 100644
index 00000000..4acbd34c
--- /dev/null
+++ b/src/api/types/InviteWorkspaceMemberResponseBody.ts
@@ -0,0 +1,20 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../index";
+
+/**
+ * `invited` with the invite when the request creates or extends an invite, including when an active client is invited to an additional Site. `active` means the requested membership and Site access already exist.
+ */
+export type InviteWorkspaceMemberResponseBody =
+ | Webflow.InviteWorkspaceMemberResponseBody.Invited
+ | Webflow.InviteWorkspaceMemberResponseBody.Active;
+
+export namespace InviteWorkspaceMemberResponseBody {
+ export interface Invited extends Webflow.Invited {
+ status: "invited";
+ }
+
+ export interface Active extends Webflow.InviteWorkspaceMemberResponseBodyActive {
+ status: "active";
+ }
+}
diff --git a/src/api/types/InviteWorkspaceMemberResponseBodyActive.ts b/src/api/types/InviteWorkspaceMemberResponseBodyActive.ts
new file mode 100644
index 00000000..c739ef50
--- /dev/null
+++ b/src/api/types/InviteWorkspaceMemberResponseBodyActive.ts
@@ -0,0 +1,7 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../index";
+
+export interface InviteWorkspaceMemberResponseBodyActive {
+ member: Webflow.WorkspaceMember;
+}
diff --git a/src/api/types/Invited.ts b/src/api/types/Invited.ts
new file mode 100644
index 00000000..4e493b9f
--- /dev/null
+++ b/src/api/types/Invited.ts
@@ -0,0 +1,7 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../index";
+
+export interface Invited {
+ invite: Webflow.WorkspaceInvite;
+}
diff --git a/src/api/types/Optimization.ts b/src/api/types/Optimization.ts
new file mode 100644
index 00000000..61d5e419
--- /dev/null
+++ b/src/api/types/Optimization.ts
@@ -0,0 +1,27 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../index";
+
+/**
+ * An optimization is a container for one or more variations. It defines where (the pages), what (the changes, grouped into variations), and who (which visitors see each variation).
+ */
+export interface Optimization {
+ /** The optimization ID. */
+ optimizationId: string;
+ /** The optimization's name. */
+ name: string;
+ optimizationType: Webflow.OptimizationType;
+ status: Webflow.OptimizationStatus;
+ /** The number of variations in the optimization. */
+ variationCount: number;
+ /** When the optimization was last updated. */
+ updatedAt?: Date;
+ /** The optimization's intervals, oldest first. Empty for an optimization that has never run. */
+ intervals: Webflow.OptimizationInterval[];
+ /**
+ * The optimization's goals as they're set up now: its site goals, the existing goals added to it, and the goals created in it. `source` shows where each goal comes from. The list is the same for every interval, and optimizations that have never run have it too. It isn't in a set order.
+ *
+ * A report accepts any `goalId` from this list, in any interval.
+ */
+ currentGoals: Webflow.OptimizeCurrentGoal[];
+}
diff --git a/src/api/types/OptimizationAudienceInsightsResponse.ts b/src/api/types/OptimizationAudienceInsightsResponse.ts
new file mode 100644
index 00000000..88222e1c
--- /dev/null
+++ b/src/api/types/OptimizationAudienceInsightsResponse.ts
@@ -0,0 +1,20 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../index";
+
+/**
+ * Each variation's results for each segment of one dimension, for one goal over a date range within one interval.
+ */
+export interface OptimizationAudienceInsightsResponse {
+ /** Identifies the report type. */
+ report: "optimization_audience_insights";
+ intervalStart: Webflow.OptimizeReportIntervalStart;
+ intervalEnd: Webflow.OptimizeReportIntervalEnd;
+ goal: Webflow.OptimizeReportGoal;
+ optimizationType: Webflow.OptimizationType;
+ /** The dimension the segments are grouped by, from the request's `groupBy`. */
+ groupedBy: Webflow.OptimizeDimension;
+ filter?: Webflow.OptimizeAppliedFilter;
+ /** One entry per variation. */
+ variations: Webflow.OptimizeAudienceVariation[];
+}
diff --git a/src/api/types/OptimizationDimensionValuesResponse.ts b/src/api/types/OptimizationDimensionValuesResponse.ts
new file mode 100644
index 00000000..56230336
--- /dev/null
+++ b/src/api/types/OptimizationDimensionValuesResponse.ts
@@ -0,0 +1,18 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../index";
+
+/**
+ * A page of values seen for one dimension.
+ */
+export interface OptimizationDimensionValuesResponse {
+ intervalStart: Webflow.OptimizeReportIntervalStart;
+ intervalEnd: Webflow.OptimizeReportIntervalEnd;
+ /** The dimension the values belong to. */
+ dimension: Webflow.OptimizeDimension;
+ filter?: Webflow.OptimizeAppliedFilter;
+ /** The values on this page, sorted by `eventCount`, highest first. Empty if the dimension had no values in the date range. */
+ values: Webflow.OptimizeDimensionValue[];
+ /** Pass this value as `cursor` to get the next page. Omitted on the last page. */
+ nextCursor?: string;
+}
diff --git a/src/api/types/OptimizationDimensionsResponse.ts b/src/api/types/OptimizationDimensionsResponse.ts
new file mode 100644
index 00000000..8879f05d
--- /dev/null
+++ b/src/api/types/OptimizationDimensionsResponse.ts
@@ -0,0 +1,13 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../index";
+
+/**
+ * The dimensions you can group or filter an optimization's reports by.
+ */
+export interface OptimizationDimensionsResponse {
+ intervalStart: Webflow.OptimizeReportIntervalStart;
+ intervalEnd: Webflow.OptimizeReportIntervalEnd;
+ /** The available dimensions. */
+ dimensions: Webflow.OptimizeDimension[];
+}
diff --git a/src/api/types/OptimizationGoalsResponse.ts b/src/api/types/OptimizationGoalsResponse.ts
new file mode 100644
index 00000000..99bf65b3
--- /dev/null
+++ b/src/api/types/OptimizationGoalsResponse.ts
@@ -0,0 +1,15 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../index";
+
+/**
+ * An optimization's goals for the interval that contains the requested date range, and its current goals.
+ */
+export interface OptimizationGoalsResponse {
+ intervalStart: Webflow.OptimizeReportIntervalStart;
+ intervalEnd: Webflow.OptimizeReportIntervalEnd;
+ /** The goals saved when the interval started. They include the interval's target goals and the goals created in the optimization by then. */
+ goals: Webflow.OptimizeGoal[];
+ /** The optimization's goals as they're set up now, with where each comes from. The list is the same for every interval. A report accepts any `goalId` from this list. */
+ currentGoals: Webflow.OptimizeCurrentGoal[];
+}
diff --git a/src/api/types/OptimizationInterval.ts b/src/api/types/OptimizationInterval.ts
new file mode 100644
index 00000000..e00b4ef5
--- /dev/null
+++ b/src/api/types/OptimizationInterval.ts
@@ -0,0 +1,17 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../index";
+
+/**
+ * An interval is a snapshot of the optimization's configuration, such as which variations are live and which goals are target goals. When the configuration changes in a way that affects results, the current interval ends and a new one begins.
+ *
+ * Each report covers a date range within one interval. Use an interval's `start` and `end` to choose `intervalStart` and `intervalEnd`.
+ */
+export interface OptimizationInterval {
+ /** When the interval began. */
+ start: Date;
+ /** When the interval ended. Omitted while the interval is ongoing. */
+ end?: Date;
+ /** The goals saved when this interval started. They include the interval's target goals and the goals created in the optimization by then. Goals created later, and site goals and existing goals that aren't a target goal, appear only in the optimization's `currentGoals`. */
+ goals: Webflow.OptimizeGoal[];
+}
diff --git a/src/api/types/OptimizationListResponse.ts b/src/api/types/OptimizationListResponse.ts
new file mode 100644
index 00000000..36876c36
--- /dev/null
+++ b/src/api/types/OptimizationListResponse.ts
@@ -0,0 +1,15 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../index";
+
+/**
+ * A page of optimizations.
+ */
+export interface OptimizationListResponse {
+ /** The optimizations on this page, sorted by `optimizationId`. */
+ optimizations: Webflow.Optimization[];
+ /** The statuses this list includes. */
+ status: Webflow.OptimizationStatus[];
+ /** Pass this value as `cursor` to get the next page. Omitted on the last page. */
+ nextCursor?: string;
+}
diff --git a/src/api/types/OptimizationStatus.ts b/src/api/types/OptimizationStatus.ts
new file mode 100644
index 00000000..3dd340b0
--- /dev/null
+++ b/src/api/types/OptimizationStatus.ts
@@ -0,0 +1,18 @@
+// This file was auto-generated by Fern from our API Definition.
+
+/**
+ * The optimization's status.
+ * - `live`: An optimization with at least one live variation.
+ * - `draft`: A new optimization that has never gone live.
+ * - `ready`: A draft optimization where all variations are ready to publish.
+ * - `archived`: An optimization that's been decommissioned but still retains its results.
+ * - `off`: An optimization that's been stopped or all its variations are paused.
+ */
+export const OptimizationStatus = {
+ Live: "live",
+ Draft: "draft",
+ Ready: "ready",
+ Archived: "archived",
+ Off: "off",
+} as const;
+export type OptimizationStatus = (typeof OptimizationStatus)[keyof typeof OptimizationStatus];
diff --git a/src/api/types/OptimizationSummaryResponse.ts b/src/api/types/OptimizationSummaryResponse.ts
new file mode 100644
index 00000000..c7188d5e
--- /dev/null
+++ b/src/api/types/OptimizationSummaryResponse.ts
@@ -0,0 +1,18 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../index";
+
+/**
+ * Each variation's results for one goal over a date range within one interval.
+ */
+export interface OptimizationSummaryResponse {
+ /** Identifies the report type. */
+ report: "optimization_summary";
+ intervalStart: Webflow.OptimizeReportIntervalStart;
+ intervalEnd: Webflow.OptimizeReportIntervalEnd;
+ goal: Webflow.OptimizeReportGoal;
+ optimizationType: Webflow.OptimizationType;
+ filter?: Webflow.OptimizeAppliedFilter;
+ /** One entry per variation. */
+ variations: Webflow.OptimizeVariationResult[];
+}
diff --git a/src/api/types/OptimizationTrendResponse.ts b/src/api/types/OptimizationTrendResponse.ts
new file mode 100644
index 00000000..52ac9d8c
--- /dev/null
+++ b/src/api/types/OptimizationTrendResponse.ts
@@ -0,0 +1,21 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../index";
+
+/**
+ * Each variation's results by day or week, for one goal over a date range within one interval.
+ */
+export interface OptimizationTrendResponse {
+ /** Identifies the report type. */
+ report: "optimization_trend";
+ intervalStart: Webflow.OptimizeReportIntervalStart;
+ intervalEnd: Webflow.OptimizeReportIntervalEnd;
+ goal: Webflow.OptimizeReportGoal;
+ granularity: Webflow.OptimizeTrendGranularity;
+ /** The time zone the buckets use. This is the account's time zone, or `America/Los_Angeles` if none is set. */
+ timeZone: string;
+ optimizationType: Webflow.OptimizationType;
+ filter?: Webflow.OptimizeAppliedFilter;
+ /** One entry per bucket. */
+ series: Webflow.OptimizeTrendPoint[];
+}
diff --git a/src/api/types/OptimizationType.ts b/src/api/types/OptimizationType.ts
new file mode 100644
index 00000000..98354c71
--- /dev/null
+++ b/src/api/types/OptimizationType.ts
@@ -0,0 +1,14 @@
+// This file was auto-generated by Fern from our API Definition.
+
+/**
+ * The kind of optimization.
+ * - `test`: A traditional test. Randomly shows different versions of your content to a set percentage of your traffic. After enough traffic has seen the variations, a single winner is determined based on statistical significance.
+ * - `personalize`: A manual personalization. Uses rules-based personalization to define who should see which variation. Runs until you choose to stop it, and every visitor in the target segment consistently sees the same version of the page.
+ * - `aiOptimize`: An AI-optimized optimization. Uses AI to automatically deliver the best-performing variation to each visitor. As behavior shifts, the AI adapts in real time, learning which versions yield the most conversions.
+ */
+export const OptimizationType = {
+ Test: "test",
+ Personalize: "personalize",
+ AiOptimize: "aiOptimize",
+} as const;
+export type OptimizationType = (typeof OptimizationType)[keyof typeof OptimizationType];
diff --git a/src/api/types/OptimizeAppliedFilter.ts b/src/api/types/OptimizeAppliedFilter.ts
new file mode 100644
index 00000000..4a5758c5
--- /dev/null
+++ b/src/api/types/OptimizeAppliedFilter.ts
@@ -0,0 +1,8 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../index";
+
+/**
+ * The request's `filter`, keyed by dimension `id`, with each dimension's display name. Present only when the request included a `filter`.
+ */
+export type OptimizeAppliedFilter = Record;
diff --git a/src/api/types/OptimizeAppliedFilterEntry.ts b/src/api/types/OptimizeAppliedFilterEntry.ts
new file mode 100644
index 00000000..b3cc60f8
--- /dev/null
+++ b/src/api/types/OptimizeAppliedFilterEntry.ts
@@ -0,0 +1,13 @@
+// This file was auto-generated by Fern from our API Definition.
+
+/**
+ * The filter applied for one dimension.
+ */
+export interface OptimizeAppliedFilterEntry {
+ /** The dimension's display name. */
+ name: string;
+ /** The included values. */
+ in?: string[];
+ /** The excluded values. */
+ nin?: string[];
+}
diff --git a/src/api/types/OptimizeAudienceSegment.ts b/src/api/types/OptimizeAudienceSegment.ts
new file mode 100644
index 00000000..4567b6d1
--- /dev/null
+++ b/src/api/types/OptimizeAudienceSegment.ts
@@ -0,0 +1,33 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../index";
+
+/**
+ * One variation's results for one segment of the `groupBy` dimension.
+ */
+export interface OptimizeAudienceSegment {
+ /** The segment's value for the `groupBy` dimension. */
+ segment: string;
+ /** The segment's display label. */
+ segmentLabel: string;
+ /** The number of sessions in this segment that saw the variation. */
+ sessions: number;
+ /** The number of users in this segment who saw the variation. */
+ users: number;
+ /** The number of conversions in this segment. */
+ conversions: number;
+ /** The conversion rate in this segment, as a fraction. For example, `0.19` means 19%. */
+ conversionRate: number;
+ /** The total value of this segment's conversions. For `value` goals only. */
+ value?: number;
+ /** The variation's lift in this segment, as a fraction. For example, `0.19` means 19%. For `conversion` goals only. */
+ lift?: number;
+ trendDirection?: Webflow.OptimizeTrendDirection;
+ /**
+ * A value from 0 to 1 for how much to trust `trendDirection`.
+ * - For `up` and `down`, the confidence that the difference from the base variation is real.
+ * - For `sideways`, the confidence that a 10% difference would have been detected.
+ * - Always `0` for `unsure`.
+ */
+ confidence?: number;
+}
diff --git a/src/api/types/OptimizeAudienceVariation.ts b/src/api/types/OptimizeAudienceVariation.ts
new file mode 100644
index 00000000..6803649b
--- /dev/null
+++ b/src/api/types/OptimizeAudienceVariation.ts
@@ -0,0 +1,15 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../index";
+
+/**
+ * One variation's results, split by segment.
+ */
+export interface OptimizeAudienceVariation {
+ /** The variation ID. */
+ variationId: string;
+ /** The variation's name. */
+ name: string;
+ /** One entry per segment of the `groupBy` dimension. */
+ segments: Webflow.OptimizeAudienceSegment[];
+}
diff --git a/src/api/types/OptimizeCurrentGoal.ts b/src/api/types/OptimizeCurrentGoal.ts
new file mode 100644
index 00000000..d657bdf2
--- /dev/null
+++ b/src/api/types/OptimizeCurrentGoal.ts
@@ -0,0 +1,17 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../index";
+
+/**
+ * A goal as it's set up on the optimization now. It has no `isPrimary`, because target goals are set per interval.
+ */
+export interface OptimizeCurrentGoal {
+ /** The goal ID. Pass it as `goalId` to choose the goal a report measures, in any interval. */
+ goalId: string;
+ /** The goal's name. */
+ name: string;
+ metricType: Webflow.OptimizeGoalMetricType;
+ scope: Webflow.OptimizeGoalScope;
+ countingMethod: Webflow.OptimizeGoalCountingMethod;
+ source: Webflow.OptimizeGoalSource;
+}
diff --git a/src/api/types/OptimizeDimension.ts b/src/api/types/OptimizeDimension.ts
new file mode 100644
index 00000000..5651410b
--- /dev/null
+++ b/src/api/types/OptimizeDimension.ts
@@ -0,0 +1,11 @@
+// This file was auto-generated by Fern from our API Definition.
+
+/**
+ * A dimension you can group or filter an optimization's reports by.
+ */
+export interface OptimizeDimension {
+ /** The dimension ID. Use it in `groupBy`, as a `filter` key, or to list the dimension's values. */
+ id: string;
+ /** The dimension's display name. */
+ name: string;
+}
diff --git a/src/api/types/OptimizeDimensionValue.ts b/src/api/types/OptimizeDimensionValue.ts
new file mode 100644
index 00000000..e86d2e0a
--- /dev/null
+++ b/src/api/types/OptimizeDimensionValue.ts
@@ -0,0 +1,13 @@
+// This file was auto-generated by Fern from our API Definition.
+
+/**
+ * A value seen for the dimension.
+ */
+export interface OptimizeDimensionValue {
+ /** The raw value. Use it in `filter` to narrow a report. `null` means the dimension was absent. */
+ value?: string;
+ /** The value's display label. */
+ label: string;
+ /** How often the value appeared in the date range. */
+ eventCount: number;
+}
diff --git a/src/api/types/OptimizeFilter.ts b/src/api/types/OptimizeFilter.ts
new file mode 100644
index 00000000..6a825d50
--- /dev/null
+++ b/src/api/types/OptimizeFilter.ts
@@ -0,0 +1,10 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../index";
+
+/**
+ * Narrows a report to visitors who match dimension values. Each key is a dimension `id` from List Dimensions, and each value uses `in` or `nin` with raw values from List Dimension Values.
+ *
+ * Separate dimensions combine with AND. Values within one dimension combine with OR. A filter can name at most 20 dimensions, with at most 50 values per operator and 500 values in total.
+ */
+export type OptimizeFilter = Record;
diff --git a/src/api/types/OptimizeFilterOperators.ts b/src/api/types/OptimizeFilterOperators.ts
new file mode 100644
index 00000000..49d9524b
--- /dev/null
+++ b/src/api/types/OptimizeFilterOperators.ts
@@ -0,0 +1,11 @@
+// This file was auto-generated by Fern from our API Definition.
+
+/**
+ * Values to include or exclude for one dimension. Specify at least one of `in` or `nin`. Values within one dimension combine with OR.
+ */
+export interface OptimizeFilterOperators {
+ /** Include visitors whose value for this dimension is in this list. Use indexed bracket notation, for example `filter[country][in][0]=US&filter[country][in][1]=GB`. */
+ in?: string[];
+ /** Exclude visitors whose value for this dimension is in this list. Use indexed bracket notation, for example `filter[customAttribute:towel][nin][0]=forgotten`. */
+ nin?: string[];
+}
diff --git a/src/api/types/OptimizeGoal.ts b/src/api/types/OptimizeGoal.ts
new file mode 100644
index 00000000..523b3d4c
--- /dev/null
+++ b/src/api/types/OptimizeGoal.ts
@@ -0,0 +1,18 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../index";
+
+/**
+ * A goal. Results are measured against goals. If a visitor takes the action defined in a goal, that counts as a conversion.
+ */
+export interface OptimizeGoal {
+ /** The goal ID. Pass it as `goalId` to choose the goal a report measures. */
+ goalId: string;
+ /** The goal's name. */
+ name: string;
+ /** `true` for a target goal, a goal Optimize uses to measure success. An interval usually has one target goal, but it can have several or none. Other goals are used only for reporting. */
+ isPrimary: boolean;
+ metricType: Webflow.OptimizeGoalMetricType;
+ scope: Webflow.OptimizeGoalScope;
+ countingMethod: Webflow.OptimizeGoalCountingMethod;
+}
diff --git a/src/api/types/OptimizeGoalCountingMethod.ts b/src/api/types/OptimizeGoalCountingMethod.ts
new file mode 100644
index 00000000..ce61631b
--- /dev/null
+++ b/src/api/types/OptimizeGoalCountingMethod.ts
@@ -0,0 +1,12 @@
+// This file was auto-generated by Fern from our API Definition.
+
+/**
+ * How many conversions the goal counts.
+ * - `unique`: One conversion is counted per session or user, depending on the goal's `scope`.
+ * - `cumulative`: All conversions are counted per session or user, depending on the goal's `scope`.
+ */
+export const OptimizeGoalCountingMethod = {
+ Unique: "unique",
+ Cumulative: "cumulative",
+} as const;
+export type OptimizeGoalCountingMethod = (typeof OptimizeGoalCountingMethod)[keyof typeof OptimizeGoalCountingMethod];
diff --git a/src/api/types/OptimizeGoalMetricType.ts b/src/api/types/OptimizeGoalMetricType.ts
new file mode 100644
index 00000000..43802432
--- /dev/null
+++ b/src/api/types/OptimizeGoalMetricType.ts
@@ -0,0 +1,12 @@
+// This file was auto-generated by Fern from our API Definition.
+
+/**
+ * What the goal measures.
+ * - `conversion`: A goal without a monetary value. Results show its conversions.
+ * - `value`: A goal with a monetary value. Results also show the value tied to each conversion.
+ */
+export const OptimizeGoalMetricType = {
+ Conversion: "conversion",
+ Value: "value",
+} as const;
+export type OptimizeGoalMetricType = (typeof OptimizeGoalMetricType)[keyof typeof OptimizeGoalMetricType];
diff --git a/src/api/types/OptimizeGoalScope.ts b/src/api/types/OptimizeGoalScope.ts
new file mode 100644
index 00000000..25c77f43
--- /dev/null
+++ b/src/api/types/OptimizeGoalScope.ts
@@ -0,0 +1,14 @@
+// This file was auto-generated by Fern from our API Definition.
+
+/**
+ * The unit the goal counts conversions in.
+ * - `pageview`: A page view is recorded any time a visitor loads a site page.
+ * - `user`: A unique visitor who browses your site and sees your variation. A visitor who browses multiple times counts as one user.
+ * - `session`: A period of continuous activity by a unique visitor. If the visitor returns after 30 minutes or more of inactivity, a new session begins.
+ */
+export const OptimizeGoalScope = {
+ Pageview: "pageview",
+ User: "user",
+ Session: "session",
+} as const;
+export type OptimizeGoalScope = (typeof OptimizeGoalScope)[keyof typeof OptimizeGoalScope];
diff --git a/src/api/types/OptimizeGoalSource.ts b/src/api/types/OptimizeGoalSource.ts
new file mode 100644
index 00000000..fbadcb6f
--- /dev/null
+++ b/src/api/types/OptimizeGoalSource.ts
@@ -0,0 +1,14 @@
+// This file was auto-generated by Fern from our API Definition.
+
+/**
+ * Where the goal comes from.
+ * - `site`: A site goal. Site goals apply to every optimization on the site, so each optimization has them without anyone adding them.
+ * - `existing`: A goal created outside this optimization that was added to it or chosen as a target goal. It isn't a site goal, and other optimizations can use it too.
+ * - `optimization`: A goal created in this optimization, such as the AutoGoal that Optimize creates with each optimization. Only this optimization has it.
+ */
+export const OptimizeGoalSource = {
+ Site: "site",
+ Existing: "existing",
+ Optimization: "optimization",
+} as const;
+export type OptimizeGoalSource = (typeof OptimizeGoalSource)[keyof typeof OptimizeGoalSource];
diff --git a/src/api/types/OptimizeNonWebflowSiteResource.ts b/src/api/types/OptimizeNonWebflowSiteResource.ts
new file mode 100644
index 00000000..bc2c5cf1
--- /dev/null
+++ b/src/api/types/OptimizeNonWebflowSiteResource.ts
@@ -0,0 +1,13 @@
+// This file was auto-generated by Fern from our API Definition.
+
+/**
+ * A non-Webflow site that uses Optimize.
+ */
+export interface OptimizeNonWebflowSiteResource {
+ /** The ID of the non-Webflow site. */
+ optimizeSiteId: string;
+ /** The ID of the workspace the site belongs to. */
+ workspaceId?: string;
+ /** The site's name. */
+ name?: string;
+}
diff --git a/src/api/types/OptimizeReference.ts b/src/api/types/OptimizeReference.ts
new file mode 100644
index 00000000..720273bf
--- /dev/null
+++ b/src/api/types/OptimizeReference.ts
@@ -0,0 +1,13 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../index";
+
+/**
+ * An `optimizeId` the access token can access, and the resource it comes from.
+ */
+export interface OptimizeReference {
+ /** The ID of an Optimize configuration, which holds its optimizations, goals, audiences, and settings. Use it with the other Optimize endpoints. */
+ optimizeId: string;
+ /** The resource the `optimizeId` comes from. `type` identifies which kind. */
+ resource: Webflow.OptimizeReferenceResource;
+}
diff --git a/src/api/types/OptimizeReferenceListResponse.ts b/src/api/types/OptimizeReferenceListResponse.ts
new file mode 100644
index 00000000..2301b502
--- /dev/null
+++ b/src/api/types/OptimizeReferenceListResponse.ts
@@ -0,0 +1,11 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../index";
+
+/**
+ * The `optimizeId` values the access token can access.
+ */
+export interface OptimizeReferenceListResponse {
+ /** One entry per `optimizeId` and resource, sorted by `optimizeId`. Not paginated. */
+ references: Webflow.OptimizeReference[];
+}
diff --git a/src/api/types/OptimizeReferenceResource.ts b/src/api/types/OptimizeReferenceResource.ts
new file mode 100644
index 00000000..317cbc78
--- /dev/null
+++ b/src/api/types/OptimizeReferenceResource.ts
@@ -0,0 +1,20 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../index";
+
+/**
+ * The resource the `optimizeId` comes from. `type` identifies which kind.
+ */
+export type OptimizeReferenceResource =
+ | Webflow.OptimizeReferenceResource.WebflowSite
+ | Webflow.OptimizeReferenceResource.OptimizeSite;
+
+export namespace OptimizeReferenceResource {
+ export interface WebflowSite extends Webflow.OptimizeWebflowSiteResource {
+ type: "webflow-site";
+ }
+
+ export interface OptimizeSite extends Webflow.OptimizeNonWebflowSiteResource {
+ type: "optimize-site";
+ }
+}
diff --git a/src/api/types/OptimizeReportGoal.ts b/src/api/types/OptimizeReportGoal.ts
new file mode 100644
index 00000000..11468e41
--- /dev/null
+++ b/src/api/types/OptimizeReportGoal.ts
@@ -0,0 +1,11 @@
+// This file was auto-generated by Fern from our API Definition.
+
+/**
+ * The goal the report measures. When the request omits `goalId`, this is the interval's first target goal, or its first goal if it has no target goal.
+ */
+export interface OptimizeReportGoal {
+ /** The goal ID. */
+ goalId: string;
+ /** The goal's name. */
+ name: string;
+}
diff --git a/src/api/types/OptimizeReportIntervalEnd.ts b/src/api/types/OptimizeReportIntervalEnd.ts
new file mode 100644
index 00000000..2dddb7fc
--- /dev/null
+++ b/src/api/types/OptimizeReportIntervalEnd.ts
@@ -0,0 +1,6 @@
+// This file was auto-generated by Fern from our API Definition.
+
+/**
+ * End of the reported date range, in full form with milliseconds.
+ */
+export type OptimizeReportIntervalEnd = Date;
diff --git a/src/api/types/OptimizeReportIntervalStart.ts b/src/api/types/OptimizeReportIntervalStart.ts
new file mode 100644
index 00000000..bc54bd31
--- /dev/null
+++ b/src/api/types/OptimizeReportIntervalStart.ts
@@ -0,0 +1,6 @@
+// This file was auto-generated by Fern from our API Definition.
+
+/**
+ * Start of the reported date range, in full form with milliseconds.
+ */
+export type OptimizeReportIntervalStart = Date;
diff --git a/src/api/types/OptimizeTrendDirection.ts b/src/api/types/OptimizeTrendDirection.ts
new file mode 100644
index 00000000..1d434cdb
--- /dev/null
+++ b/src/api/types/OptimizeTrendDirection.ts
@@ -0,0 +1,16 @@
+// This file was auto-generated by Fern from our API Definition.
+
+/**
+ * How the variation performs against the base variation in this segment.
+ * - `up`: The variation is trending better than the base variation in this segment.
+ * - `down`: The variation is trending worse than the base variation in this segment.
+ * - `sideways`: No meaningful difference from the base variation in this segment, with enough data that a 10% difference would likely have been detected.
+ * - `unsure`: Not enough data in this segment to tell whether the variation differs from the base variation.
+ */
+export const OptimizeTrendDirection = {
+ Up: "up",
+ Down: "down",
+ Sideways: "sideways",
+ Unsure: "unsure",
+} as const;
+export type OptimizeTrendDirection = (typeof OptimizeTrendDirection)[keyof typeof OptimizeTrendDirection];
diff --git a/src/api/types/OptimizeTrendGranularity.ts b/src/api/types/OptimizeTrendGranularity.ts
new file mode 100644
index 00000000..506b3be7
--- /dev/null
+++ b/src/api/types/OptimizeTrendGranularity.ts
@@ -0,0 +1,8 @@
+// This file was auto-generated by Fern from our API Definition.
+
+/** The size of each bucket in `series`. */
+export const OptimizeTrendGranularity = {
+ Daily: "daily",
+ Weekly: "weekly",
+} as const;
+export type OptimizeTrendGranularity = (typeof OptimizeTrendGranularity)[keyof typeof OptimizeTrendGranularity];
diff --git a/src/api/types/OptimizeTrendPoint.ts b/src/api/types/OptimizeTrendPoint.ts
new file mode 100644
index 00000000..e06a95cc
--- /dev/null
+++ b/src/api/types/OptimizeTrendPoint.ts
@@ -0,0 +1,13 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../index";
+
+/**
+ * Each variation's results for one bucket.
+ */
+export interface OptimizeTrendPoint {
+ /** The start of the day or week in `timeZone`, as a UTC timestamp. For example, with `timeZone` set to `America/Chicago`, the bucket for September 3 has a `date` of `2026-09-03T05:00:00.000Z`. */
+ date: Date;
+ /** One entry per variation. */
+ variations: Webflow.OptimizeVariationResult[];
+}
diff --git a/src/api/types/OptimizeVariationComparison.ts b/src/api/types/OptimizeVariationComparison.ts
new file mode 100644
index 00000000..13972e04
--- /dev/null
+++ b/src/api/types/OptimizeVariationComparison.ts
@@ -0,0 +1,17 @@
+// This file was auto-generated by Fern from our API Definition.
+
+/**
+ * How the variation compares with the base variation. Omitted for `personalize` optimizations.
+ */
+export interface OptimizeVariationComparison {
+ /** Whether this is the base variation. */
+ isBaseline: boolean;
+ /** Whether this is the winning variation. For `test` optimizations only. */
+ isWinner?: boolean;
+ /** The variation's lift, as a fraction. For example, `0.19` means 19%. For `test` optimizations only. */
+ lift?: number;
+ /** The variation's [statistical significance](https://help.webflow.com/hc/en-us/articles/34167147351315-Variation-statistical-significance-overview), as a probability from 0 to 1. For `test` optimizations only. */
+ statisticalSignificance?: number;
+ /** The variation's [strength](https://help.webflow.com/hc/en-us/articles/33615967793427-Variation-strength-overview), as a probability from 0 to 1. For `aiOptimize` optimizations only. */
+ strength?: number;
+}
diff --git a/src/api/types/OptimizeVariationResult.ts b/src/api/types/OptimizeVariationResult.ts
new file mode 100644
index 00000000..8ed586e1
--- /dev/null
+++ b/src/api/types/OptimizeVariationResult.ts
@@ -0,0 +1,26 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../index";
+
+/**
+ * One variation's results for the report's goal.
+ */
+export interface OptimizeVariationResult {
+ /** The variation ID. */
+ variationId: string;
+ /** The variation's name. */
+ name: string;
+ /** The number of sessions that saw the variation. */
+ sessions: number;
+ /** The number of users who saw the variation. */
+ users: number;
+ /** The number of conversions. */
+ conversions: number;
+ /** The conversion rate, as a fraction. For example, `0.19` means 19%. */
+ conversionRate: number;
+ /** The total value of the variation's conversions. For `value` goals only. */
+ value?: number;
+ /** The average conversion value. For `value` goals only, and omitted when `conversions` is 0. */
+ valuePerConversion?: number;
+ comparison?: Webflow.OptimizeVariationComparison;
+}
diff --git a/src/api/types/OptimizeWebflowSiteResource.ts b/src/api/types/OptimizeWebflowSiteResource.ts
new file mode 100644
index 00000000..83878d2b
--- /dev/null
+++ b/src/api/types/OptimizeWebflowSiteResource.ts
@@ -0,0 +1,13 @@
+// This file was auto-generated by Fern from our API Definition.
+
+/**
+ * A Webflow site.
+ */
+export interface OptimizeWebflowSiteResource {
+ /** The Webflow site ID. */
+ siteId: string;
+ /** The ID of the workspace the site belongs to. */
+ workspaceId?: string;
+ /** The site's display name. */
+ displayName: string;
+}
diff --git a/src/api/types/PageCreatedWebhookPayload.ts b/src/api/types/PageCreatedWebhookPayload.ts
index 2868ed48..e1d1b297 100644
--- a/src/api/types/PageCreatedWebhookPayload.ts
+++ b/src/api/types/PageCreatedWebhookPayload.ts
@@ -7,6 +7,14 @@ export interface PageCreatedWebhookPayload {
siteId?: string;
pageId?: string;
pageTitle?: string;
+ /** The display name of the page, or null if not set */
+ pageName?: string;
+ /** Whether the page is archived */
+ archived?: boolean;
+ /** Whether the page is a draft */
+ draft?: boolean;
+ /** Whether the page belongs to a branch */
+ isBranch?: boolean;
createdOn?: Date;
publishedPath?: string;
}
diff --git a/src/api/types/PageDeletedWebhookPayload.ts b/src/api/types/PageDeletedWebhookPayload.ts
index 4af70418..1cec3fc0 100644
--- a/src/api/types/PageDeletedWebhookPayload.ts
+++ b/src/api/types/PageDeletedWebhookPayload.ts
@@ -7,6 +7,14 @@ export interface PageDeletedWebhookPayload {
siteId?: string;
pageId?: string;
pageTitle?: string;
+ /** The display name of the page, or null if not set */
+ pageName?: string;
+ /** Whether the page is archived */
+ archived?: boolean;
+ /** Whether the page is a draft */
+ draft?: boolean;
+ /** Whether the page belongs to a branch */
+ isBranch?: boolean;
deletedOn?: Date;
publishedPath?: string;
}
diff --git a/src/api/types/PageFlowDirection.ts b/src/api/types/PageFlowDirection.ts
new file mode 100644
index 00000000..a56b334f
--- /dev/null
+++ b/src/api/types/PageFlowDirection.ts
@@ -0,0 +1,12 @@
+// This file was auto-generated by Fern from our API Definition.
+
+/**
+ * Which side of the anchor page to rank.
+ * - `previous`: pages viewed immediately before the anchor page.
+ * - `next`: pages viewed immediately after the anchor page.
+ */
+export const PageFlowDirection = {
+ Previous: "previous",
+ Next: "next",
+} as const;
+export type PageFlowDirection = (typeof PageFlowDirection)[keyof typeof PageFlowDirection];
diff --git a/src/api/types/PageFlowFilter.ts b/src/api/types/PageFlowFilter.ts
new file mode 100644
index 00000000..d6410353
--- /dev/null
+++ b/src/api/types/PageFlowFilter.ts
@@ -0,0 +1,40 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../index";
+
+/**
+ * Filter the page flow report by dimension. Each property is an optional set of `AnalyzeFilterOperators` (`eq`, `in`, `ne`, `nin`) applied to the named dimension. Filter a given dimension in one place — either inside `filter` or as a top-level query parameter.
+ */
+export interface PageFlowFilter {
+ audienceIds?: Webflow.AnalyzeFilterOperators;
+ browser?: Webflow.AnalyzeFilterOperators;
+ collectionId?: Webflow.AnalyzeFilterOperators;
+ country?: Webflow.AnalyzeFilterOperators;
+ dayOfWeek?: Webflow.AnalyzeFilterOperators;
+ deviceBrand?: Webflow.AnalyzeFilterOperators;
+ deviceType?: Webflow.AnalyzeFilterOperators;
+ domain?: Webflow.AnalyzeFilterOperators;
+ itemSlug?: Webflow.AnalyzeFilterOperators;
+ language?: Webflow.AnalyzeFilterOperators;
+ locale?: Webflow.AnalyzeFilterOperators;
+ nextCollectionId?: Webflow.AnalyzeFilterOperators;
+ nextItemSlug?: Webflow.AnalyzeFilterOperators;
+ nextPageId?: Webflow.AnalyzeFilterOperators;
+ os?: Webflow.AnalyzeFilterOperators;
+ pageId?: Webflow.AnalyzeFilterOperators;
+ pagePath?: Webflow.AnalyzeFilterOperators;
+ previousCollectionId?: Webflow.AnalyzeFilterOperators;
+ previousItemSlug?: Webflow.AnalyzeFilterOperators;
+ previousPageId?: Webflow.AnalyzeFilterOperators;
+ referrer?: Webflow.AnalyzeFilterOperators;
+ region?: Webflow.AnalyzeFilterOperators;
+ timeOfDay?: Webflow.AnalyzeFilterOperators;
+ timezone?: Webflow.AnalyzeFilterOperators;
+ trafficSource?: Webflow.AnalyzeFilterOperators;
+ utmCampaign?: Webflow.AnalyzeFilterOperators;
+ utmContent?: Webflow.AnalyzeFilterOperators;
+ utmMedium?: Webflow.AnalyzeFilterOperators;
+ utmSource?: Webflow.AnalyzeFilterOperators;
+ utmTerm?: Webflow.AnalyzeFilterOperators;
+ visitStatus?: Webflow.AnalyzeFilterOperators;
+}
diff --git a/src/api/types/PageFlowMetricScope.ts b/src/api/types/PageFlowMetricScope.ts
new file mode 100644
index 00000000..2b8e7282
--- /dev/null
+++ b/src/api/types/PageFlowMetricScope.ts
@@ -0,0 +1,14 @@
+// This file was auto-generated by Fern from our API Definition.
+
+/**
+ * The unit each row's `count` is measured in.
+ * - `session`: number of sessions.
+ * - `user`: number of unique users.
+ * - `pageview`: number of page views.
+ */
+export const PageFlowMetricScope = {
+ Session: "session",
+ User: "user",
+ Pageview: "pageview",
+} as const;
+export type PageFlowMetricScope = (typeof PageFlowMetricScope)[keyof typeof PageFlowMetricScope];
diff --git a/src/api/types/PageFlowResponse.ts b/src/api/types/PageFlowResponse.ts
new file mode 100644
index 00000000..aef622ec
--- /dev/null
+++ b/src/api/types/PageFlowResponse.ts
@@ -0,0 +1,25 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../index";
+
+/**
+ * Response payload for the page flow report.
+ */
+export interface PageFlowResponse {
+ /** Discriminator identifying the report type. */
+ report: "page_flow";
+ window: Webflow.AnalyzeWindow;
+ direction: Webflow.PageFlowDirection;
+ metricScope: Webflow.PageFlowMetricScope;
+ /** Identifier of the anchor Webflow page. */
+ pageId: string;
+ /** Identifier of the CMS collection for the anchor template-page instance. Present with `itemSlug` when the request targeted a CMS page. */
+ collectionId?: string;
+ /** Slug of the CMS item for the anchor template-page instance. Present with `collectionId` when the request targeted a CMS page. */
+ itemSlug?: string;
+ /** The row cap applied to this response, including the default. */
+ limit: number;
+ /** Related pages ranked by `count`, descending. At most `limit` rows. */
+ data: Webflow.PageFlowRow[];
+ filter?: Webflow.PageFlowFilter;
+}
diff --git a/src/api/types/PageFlowRow.ts b/src/api/types/PageFlowRow.ts
new file mode 100644
index 00000000..ce4f87bb
--- /dev/null
+++ b/src/api/types/PageFlowRow.ts
@@ -0,0 +1,19 @@
+// This file was auto-generated by Fern from our API Definition.
+
+/**
+ * A page viewed immediately before or after the anchor page, with its count for the requested `metricScope`.
+ */
+export interface PageFlowRow {
+ /** Identifier of the related Webflow page. */
+ pageId: string;
+ /** Display title for the related page, including the CMS item name when applicable. */
+ title: string;
+ /** Name of the related Webflow page. */
+ pageName: string;
+ /** Non-negative count for this related page, in units of the request's `metricScope`. */
+ count: number;
+ /** Identifier of the CMS collection this page belongs to. Present only for CMS-templated pages. */
+ collectionId?: string;
+ /** Slug of the CMS item this row represents. Present only for CMS-templated pages. */
+ itemSlug?: string;
+}
diff --git a/src/api/types/PageMetadataUpdatedWebhookPayload.ts b/src/api/types/PageMetadataUpdatedWebhookPayload.ts
index 841cbb8e..548c853f 100644
--- a/src/api/types/PageMetadataUpdatedWebhookPayload.ts
+++ b/src/api/types/PageMetadataUpdatedWebhookPayload.ts
@@ -7,6 +7,14 @@ export interface PageMetadataUpdatedWebhookPayload {
siteId?: string;
pageId?: string;
pageTitle?: string;
+ /** The display name of the page, or null if not set */
+ pageName?: string;
+ /** Whether the page is archived */
+ archived?: boolean;
+ /** Whether the page is a draft */
+ draft?: boolean;
+ /** Whether the page belongs to a branch */
+ isBranch?: boolean;
lastUpdated?: Date;
publishedPath?: string;
}
diff --git a/src/api/types/PersonActor.ts b/src/api/types/PersonActor.ts
new file mode 100644
index 00000000..ed8599e9
--- /dev/null
+++ b/src/api/types/PersonActor.ts
@@ -0,0 +1,8 @@
+// This file was auto-generated by Fern from our API Definition.
+
+export interface PersonActor {
+ /** The ID of the user who performed the action */
+ id?: string;
+ /** The email address of the user who performed the action */
+ email?: string;
+}
diff --git a/src/api/types/ScrollDepthDataPoint.ts b/src/api/types/ScrollDepthDataPoint.ts
new file mode 100644
index 00000000..42de1255
--- /dev/null
+++ b/src/api/types/ScrollDepthDataPoint.ts
@@ -0,0 +1,11 @@
+// This file was auto-generated by Fern from our API Definition.
+
+/**
+ * A scroll-depth breakpoint. `pageviewSharePercent` is the share of pageviews that scrolled at least `depthPixels` deep — not the percent of the page scrolled.
+ */
+export interface ScrollDepthDataPoint {
+ /** Share of page views (1–100) that scrolled at least `depthPixels` deep. The report currently returns breakpoints at 75, 50, and 25. */
+ pageviewSharePercent: number;
+ /** Scroll depth from the top of the page, in CSS pixels. */
+ depthPixels: number;
+}
diff --git a/src/api/types/ScrollDepthFilter.ts b/src/api/types/ScrollDepthFilter.ts
new file mode 100644
index 00000000..353eda76
--- /dev/null
+++ b/src/api/types/ScrollDepthFilter.ts
@@ -0,0 +1,40 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../index";
+
+/**
+ * Filter the scroll depth report by dimension. Each property is an optional set of `AnalyzeFilterOperators` (`eq`, `in`, `ne`, `nin`) applied to the named dimension. Filter a given dimension in one place — either inside `filter` or as a top-level query parameter.
+ */
+export interface ScrollDepthFilter {
+ audienceIds?: Webflow.AnalyzeFilterOperators;
+ browser?: Webflow.AnalyzeFilterOperators;
+ collectionId?: Webflow.AnalyzeFilterOperators;
+ country?: Webflow.AnalyzeFilterOperators;
+ dayOfWeek?: Webflow.AnalyzeFilterOperators;
+ deviceBrand?: Webflow.AnalyzeFilterOperators;
+ deviceType?: Webflow.AnalyzeFilterOperators;
+ domain?: Webflow.AnalyzeFilterOperators;
+ itemSlug?: Webflow.AnalyzeFilterOperators;
+ language?: Webflow.AnalyzeFilterOperators;
+ locale?: Webflow.AnalyzeFilterOperators;
+ nextCollectionId?: Webflow.AnalyzeFilterOperators;
+ nextItemSlug?: Webflow.AnalyzeFilterOperators;
+ nextPageId?: Webflow.AnalyzeFilterOperators;
+ os?: Webflow.AnalyzeFilterOperators;
+ pageId?: Webflow.AnalyzeFilterOperators;
+ pagePath?: Webflow.AnalyzeFilterOperators;
+ previousCollectionId?: Webflow.AnalyzeFilterOperators;
+ previousItemSlug?: Webflow.AnalyzeFilterOperators;
+ previousPageId?: Webflow.AnalyzeFilterOperators;
+ referrer?: Webflow.AnalyzeFilterOperators;
+ region?: Webflow.AnalyzeFilterOperators;
+ timeOfDay?: Webflow.AnalyzeFilterOperators;
+ timezone?: Webflow.AnalyzeFilterOperators;
+ trafficSource?: Webflow.AnalyzeFilterOperators;
+ utmCampaign?: Webflow.AnalyzeFilterOperators;
+ utmContent?: Webflow.AnalyzeFilterOperators;
+ utmMedium?: Webflow.AnalyzeFilterOperators;
+ utmSource?: Webflow.AnalyzeFilterOperators;
+ utmTerm?: Webflow.AnalyzeFilterOperators;
+ visitStatus?: Webflow.AnalyzeFilterOperators;
+}
diff --git a/src/api/types/ScrollDepthResponse.ts b/src/api/types/ScrollDepthResponse.ts
new file mode 100644
index 00000000..e9098e71
--- /dev/null
+++ b/src/api/types/ScrollDepthResponse.ts
@@ -0,0 +1,15 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../index";
+
+/**
+ * Response payload for the scroll depth report.
+ */
+export interface ScrollDepthResponse {
+ /** Discriminator identifying the report type. */
+ report: "scroll_depth";
+ window: Webflow.AnalyzeWindow;
+ /** Scroll-depth breakpoints sorted from shallowest (highest share) to deepest (lowest share). The report currently returns up to three rows, for the 75%, 50%, and 25% breakpoints. Rows may be omitted when the underlying data is sparse. */
+ data: Webflow.ScrollDepthDataPoint[];
+ filter?: Webflow.ScrollDepthFilter;
+}
diff --git a/src/api/types/SettingChange.ts b/src/api/types/SettingChange.ts
index c426238b..f6f38e0b 100644
--- a/src/api/types/SettingChange.ts
+++ b/src/api/types/SettingChange.ts
@@ -1,10 +1,8 @@
// This file was auto-generated by Fern from our API Definition.
-import type * as Webflow from "../index";
-
export interface SettingChange {
setting?: "ai_toggle";
previousValue?: string;
value?: string;
- method?: Webflow.WorkspaceAuditLogItemPayloadSettingChangeMethod;
+ method?: "dashboard";
}
diff --git a/src/api/types/SiteActivityLogItem.ts b/src/api/types/SiteActivityLogItem.ts
index 60414917..90abd254 100644
--- a/src/api/types/SiteActivityLogItem.ts
+++ b/src/api/types/SiteActivityLogItem.ts
@@ -14,4 +14,12 @@ export interface SiteActivityLogItem {
newValue?: string;
previousValue?: string;
payload?: Record;
+ /** The system that originated the event. `WEBFLOW_AI` for Webflow AI features, `WEBFLOW_MCP` for an external MCP server or Bridge App, `DESIGNER` for human writes from the Designer, and `SYSTEM` for automated Webflow processes such as backups or migrations. `null` for legacy events recorded before attribution was available. */
+ source?: Webflow.SiteActivityLogItemSource;
+ /** The type of actor responsible for the event. `user` for a human who directly triggered or accepted the action, `agent` for a fully autonomous AI agent, `workflow` for a user-created workflow that ran autonomously, and `rule` for an autonomous rule that fired on a trigger. `null` for legacy events. */
+ actorType?: Webflow.SiteActivityLogItemActorType;
+ /** Unique identifier of the actor that originated the event. `null` when not available. */
+ actorId?: string;
+ /** Display name of the actor that originated the event. `null` when not available. */
+ actorName?: string;
}
diff --git a/src/api/types/SiteActivityLogItemActorType.ts b/src/api/types/SiteActivityLogItemActorType.ts
new file mode 100644
index 00000000..8fa8da76
--- /dev/null
+++ b/src/api/types/SiteActivityLogItemActorType.ts
@@ -0,0 +1,11 @@
+// This file was auto-generated by Fern from our API Definition.
+
+/** The type of actor responsible for the event. `user` for a human who directly triggered or accepted the action, `agent` for a fully autonomous AI agent, `workflow` for a user-created workflow that ran autonomously, and `rule` for an autonomous rule that fired on a trigger. `null` for legacy events. */
+export const SiteActivityLogItemActorType = {
+ User: "user",
+ Agent: "agent",
+ Workflow: "workflow",
+ Rule: "rule",
+} as const;
+export type SiteActivityLogItemActorType =
+ (typeof SiteActivityLogItemActorType)[keyof typeof SiteActivityLogItemActorType];
diff --git a/src/api/types/SiteActivityLogItemSource.ts b/src/api/types/SiteActivityLogItemSource.ts
new file mode 100644
index 00000000..5367bbe8
--- /dev/null
+++ b/src/api/types/SiteActivityLogItemSource.ts
@@ -0,0 +1,10 @@
+// This file was auto-generated by Fern from our API Definition.
+
+/** The system that originated the event. `WEBFLOW_AI` for Webflow AI features, `WEBFLOW_MCP` for an external MCP server or Bridge App, `DESIGNER` for human writes from the Designer, and `SYSTEM` for automated Webflow processes such as backups or migrations. `null` for legacy events recorded before attribution was available. */
+export const SiteActivityLogItemSource = {
+ WebflowAi: "WEBFLOW_AI",
+ WebflowMcp: "WEBFLOW_MCP",
+ Designer: "DESIGNER",
+ System: "SYSTEM",
+} as const;
+export type SiteActivityLogItemSource = (typeof SiteActivityLogItemSource)[keyof typeof SiteActivityLogItemSource];
diff --git a/src/api/types/SiteMember.ts b/src/api/types/SiteMember.ts
new file mode 100644
index 00000000..62aaff15
--- /dev/null
+++ b/src/api/types/SiteMember.ts
@@ -0,0 +1,16 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../index";
+
+export interface SiteMember {
+ /** Unique identifier for the Member */
+ id: string;
+ /** Email address of the Member */
+ email?: string;
+ /** First name of the Member */
+ firstName?: string;
+ /** Last name of the Member */
+ lastName?: string;
+ /** Roles the Member holds */
+ roles: Webflow.SiteMemberRoles;
+}
diff --git a/src/api/types/SiteMemberRoles.ts b/src/api/types/SiteMemberRoles.ts
new file mode 100644
index 00000000..f7233759
--- /dev/null
+++ b/src/api/types/SiteMemberRoles.ts
@@ -0,0 +1,15 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../index";
+
+/**
+ * Roles the Member holds
+ */
+export interface SiteMemberRoles {
+ /** The Member's role in the Workspace that owns this Site */
+ workspace: Webflow.SiteMemberRolesWorkspace;
+ /** The Member's Site Role on this Site */
+ site: Webflow.SiteMemberRolesSite;
+ /** Unique identifier for the custom Site Role, when `site` is `custom` */
+ siteRoleId?: string;
+}
diff --git a/src/api/types/SiteMemberRolesSite.ts b/src/api/types/SiteMemberRolesSite.ts
new file mode 100644
index 00000000..f3cdddf4
--- /dev/null
+++ b/src/api/types/SiteMemberRolesSite.ts
@@ -0,0 +1,15 @@
+// This file was auto-generated by Fern from our API Definition.
+
+/** The Member's Site Role on this Site */
+export const SiteMemberRolesSite = {
+ SiteManager: "site_manager",
+ Designer: "designer",
+ BranchDesigner: "branch_designer",
+ LimitedDesigner: "limited_designer",
+ Marketer: "marketer",
+ ContentEditor: "content_editor",
+ Reviewer: "reviewer",
+ Viewer: "viewer",
+ Custom: "custom",
+} as const;
+export type SiteMemberRolesSite = (typeof SiteMemberRolesSite)[keyof typeof SiteMemberRolesSite];
diff --git a/src/api/types/SiteMemberRolesWorkspace.ts b/src/api/types/SiteMemberRolesWorkspace.ts
new file mode 100644
index 00000000..1c581aa3
--- /dev/null
+++ b/src/api/types/SiteMemberRolesWorkspace.ts
@@ -0,0 +1,12 @@
+// This file was auto-generated by Fern from our API Definition.
+
+/** The Member's role in the Workspace that owns this Site */
+export const SiteMemberRolesWorkspace = {
+ Owner: "owner",
+ Admin: "admin",
+ Member: "member",
+ Guest: "guest",
+ Reviewer: "reviewer",
+ Client: "client",
+} as const;
+export type SiteMemberRolesWorkspace = (typeof SiteMemberRolesWorkspace)[keyof typeof SiteMemberRolesWorkspace];
diff --git a/src/api/types/SiteMembersResponse.ts b/src/api/types/SiteMembersResponse.ts
new file mode 100644
index 00000000..fe067641
--- /dev/null
+++ b/src/api/types/SiteMembersResponse.ts
@@ -0,0 +1,10 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../index";
+
+export interface SiteMembersResponse {
+ /** List of Site Members */
+ members: Webflow.SiteMember[];
+ /** Pagination object */
+ pagination: Webflow.SiteMembersResponsePagination;
+}
diff --git a/src/api/types/SiteMembersResponsePagination.ts b/src/api/types/SiteMembersResponsePagination.ts
new file mode 100644
index 00000000..6cdc319a
--- /dev/null
+++ b/src/api/types/SiteMembersResponsePagination.ts
@@ -0,0 +1,11 @@
+// This file was auto-generated by Fern from our API Definition.
+
+/**
+ * Pagination object
+ */
+export interface SiteMembersResponsePagination {
+ /** The limit used for pagination */
+ limit: number;
+ /** Cursor for the next page of results. `null` when there are no more results. */
+ nextCursor?: string;
+}
diff --git a/src/api/types/SitePublishPayload.ts b/src/api/types/SitePublishPayload.ts
index 7b3987d8..576c3a4b 100644
--- a/src/api/types/SitePublishPayload.ts
+++ b/src/api/types/SitePublishPayload.ts
@@ -1,5 +1,7 @@
// This file was auto-generated by Fern from our API Definition.
+import type * as Webflow from "../index";
+
/**
* The payload of data sent from Webflow
*/
@@ -12,4 +14,8 @@ export interface SitePublishPayload {
domains?: string[];
/** The name and ID of the user who published the site */
publishedBy?: Record;
+ /** Whether the entire site or an individual page was published */
+ publishScope?: Webflow.SitePublishPayloadPublishScope;
+ /** The ID of the page that was published */
+ pageId?: string;
}
diff --git a/src/api/types/SitePublishPayloadPublishScope.ts b/src/api/types/SitePublishPayloadPublishScope.ts
new file mode 100644
index 00000000..119c924a
--- /dev/null
+++ b/src/api/types/SitePublishPayloadPublishScope.ts
@@ -0,0 +1,9 @@
+// This file was auto-generated by Fern from our API Definition.
+
+/** Whether the entire site or an individual page was published */
+export const SitePublishPayloadPublishScope = {
+ Page: "page",
+ Site: "site",
+} as const;
+export type SitePublishPayloadPublishScope =
+ (typeof SitePublishPayloadPublishScope)[keyof typeof SitePublishPayloadPublishScope];
diff --git a/src/api/types/TimeOnPageDataPoint.ts b/src/api/types/TimeOnPageDataPoint.ts
new file mode 100644
index 00000000..cb96b1f1
--- /dev/null
+++ b/src/api/types/TimeOnPageDataPoint.ts
@@ -0,0 +1,11 @@
+// This file was auto-generated by Fern from our API Definition.
+
+/**
+ * A single average time on page data point. When `timeseries` is omitted, the response holds one aggregate point covering the whole window; otherwise it returns one point per requested bucket.
+ */
+export interface TimeOnPageDataPoint {
+ /** Start of the bucket, in ISO 8601 / RFC 3339 format. For an aggregate result, this is the start of the requested window. */
+ timestamp: Date;
+ /** Average time on page for this bucket, in seconds, in units of the request's `metricScope`. */
+ averageSeconds: number;
+}
diff --git a/src/api/types/TimeOnPageFilter.ts b/src/api/types/TimeOnPageFilter.ts
new file mode 100644
index 00000000..eb16e3bf
--- /dev/null
+++ b/src/api/types/TimeOnPageFilter.ts
@@ -0,0 +1,40 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../index";
+
+/**
+ * Filter the time on page report by dimension. Each property is an optional set of `AnalyzeFilterOperators` (`eq`, `in`, `ne`, `nin`) applied to the named dimension. Filter a given dimension in one place — either inside `filter` or as a top-level query parameter.
+ */
+export interface TimeOnPageFilter {
+ audienceIds?: Webflow.AnalyzeFilterOperators;
+ browser?: Webflow.AnalyzeFilterOperators;
+ collectionId?: Webflow.AnalyzeFilterOperators;
+ country?: Webflow.AnalyzeFilterOperators;
+ dayOfWeek?: Webflow.AnalyzeFilterOperators;
+ deviceBrand?: Webflow.AnalyzeFilterOperators;
+ deviceType?: Webflow.AnalyzeFilterOperators;
+ domain?: Webflow.AnalyzeFilterOperators;
+ itemSlug?: Webflow.AnalyzeFilterOperators;
+ language?: Webflow.AnalyzeFilterOperators;
+ locale?: Webflow.AnalyzeFilterOperators;
+ nextCollectionId?: Webflow.AnalyzeFilterOperators;
+ nextItemSlug?: Webflow.AnalyzeFilterOperators;
+ nextPageId?: Webflow.AnalyzeFilterOperators;
+ os?: Webflow.AnalyzeFilterOperators;
+ pageId?: Webflow.AnalyzeFilterOperators;
+ pagePath?: Webflow.AnalyzeFilterOperators;
+ previousCollectionId?: Webflow.AnalyzeFilterOperators;
+ previousItemSlug?: Webflow.AnalyzeFilterOperators;
+ previousPageId?: Webflow.AnalyzeFilterOperators;
+ referrer?: Webflow.AnalyzeFilterOperators;
+ region?: Webflow.AnalyzeFilterOperators;
+ timeOfDay?: Webflow.AnalyzeFilterOperators;
+ timezone?: Webflow.AnalyzeFilterOperators;
+ trafficSource?: Webflow.AnalyzeFilterOperators;
+ utmCampaign?: Webflow.AnalyzeFilterOperators;
+ utmContent?: Webflow.AnalyzeFilterOperators;
+ utmMedium?: Webflow.AnalyzeFilterOperators;
+ utmSource?: Webflow.AnalyzeFilterOperators;
+ utmTerm?: Webflow.AnalyzeFilterOperators;
+ visitStatus?: Webflow.AnalyzeFilterOperators;
+}
diff --git a/src/api/types/TimeOnPageGranularityPeriod.ts b/src/api/types/TimeOnPageGranularityPeriod.ts
new file mode 100644
index 00000000..8cb69da5
--- /dev/null
+++ b/src/api/types/TimeOnPageGranularityPeriod.ts
@@ -0,0 +1,9 @@
+// This file was auto-generated by Fern from our API Definition.
+
+/** Bucket size for a time on page timeseries. `day` returns one value per day and `week` returns one value per week. */
+export const TimeOnPageGranularityPeriod = {
+ Day: "day",
+ Week: "week",
+} as const;
+export type TimeOnPageGranularityPeriod =
+ (typeof TimeOnPageGranularityPeriod)[keyof typeof TimeOnPageGranularityPeriod];
diff --git a/src/api/types/TimeOnPageMetricScope.ts b/src/api/types/TimeOnPageMetricScope.ts
new file mode 100644
index 00000000..a1ca16b2
--- /dev/null
+++ b/src/api/types/TimeOnPageMetricScope.ts
@@ -0,0 +1,14 @@
+// This file was auto-generated by Fern from our API Definition.
+
+/**
+ * The unit each `averageSeconds` value is averaged over.
+ * - `session`: average time on page per session.
+ * - `user`: average time on page per unique user.
+ * - `pageview`: average time on page per page view.
+ */
+export const TimeOnPageMetricScope = {
+ Session: "session",
+ User: "user",
+ Pageview: "pageview",
+} as const;
+export type TimeOnPageMetricScope = (typeof TimeOnPageMetricScope)[keyof typeof TimeOnPageMetricScope];
diff --git a/src/api/types/TimeOnPageResponse.ts b/src/api/types/TimeOnPageResponse.ts
new file mode 100644
index 00000000..f1c035a7
--- /dev/null
+++ b/src/api/types/TimeOnPageResponse.ts
@@ -0,0 +1,17 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../index";
+
+/**
+ * Response payload for the time on page report.
+ */
+export interface TimeOnPageResponse {
+ /** Discriminator identifying the report type. */
+ report: "time_on_page";
+ window: Webflow.AnalyzeWindow;
+ metricScope: Webflow.TimeOnPageMetricScope;
+ bucketing?: Webflow.AnalyzeTimeOnPageBucketing;
+ /** Average time on page over the requested window — one aggregate point when `timeseries` is omitted, otherwise one point per bucket. */
+ data: Webflow.TimeOnPageDataPoint[];
+ filter?: Webflow.TimeOnPageFilter;
+}
diff --git a/src/api/types/TimeOnPageTimeseriesQuery.ts b/src/api/types/TimeOnPageTimeseriesQuery.ts
new file mode 100644
index 00000000..0ec6465c
--- /dev/null
+++ b/src/api/types/TimeOnPageTimeseriesQuery.ts
@@ -0,0 +1,11 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../index";
+
+/**
+ * Options that opt the time on page report into bucketed timeseries data.
+ */
+export interface TimeOnPageTimeseriesQuery {
+ granularityPeriod: Webflow.TimeOnPageGranularityPeriod;
+ bucketTimeZone: Webflow.AnalyzeBucketTimeZone;
+}
diff --git a/src/api/types/TokenActor.ts b/src/api/types/TokenActor.ts
new file mode 100644
index 00000000..b2ad59b2
--- /dev/null
+++ b/src/api/types/TokenActor.ts
@@ -0,0 +1,8 @@
+// This file was auto-generated by Fern from our API Definition.
+
+export interface TokenActor {
+ /** The ID of the API token's authorization. This is not a user ID. */
+ id: string;
+ /** The name of the API token, if it has one */
+ name?: string;
+}
diff --git a/src/api/types/TopDimensionsDimension.ts b/src/api/types/TopDimensionsDimension.ts
new file mode 100644
index 00000000..1259eb77
--- /dev/null
+++ b/src/api/types/TopDimensionsDimension.ts
@@ -0,0 +1,38 @@
+// This file was auto-generated by Fern from our API Definition.
+
+/**
+ * The dimension whose top values are ranked.
+ * - `country`: ISO 3166-1 alpha-2 country code (e.g., `US`).
+ * - `region`: first-level subdivision below country, keyed by ISO 3166-2 code (e.g., `US-CA`, with `name` `California, United States`).
+ * - `deviceType`: `desktop`, `mobile`, or `tablet`.
+ * - `os`: operating system name (e.g., `iOS`, `Windows NT`).
+ * - `browser`: browser name (e.g., `Chrome`, `Safari`).
+ * - `language`: the visitor's stated language preference (from the `Accept-Language` request header).
+ * - `locale`: the locale declared on the visited page (the page's `` value).
+ * - `referrer`: referrer domain (e.g., `google.com`).
+ * - `trafficSource`: traffic source category, keyed by a code: `DN` Direct, `SP` Paid Search, `SO` Organic Search, `CP` Paid Social, `CO` Organic Social, `EM` Email, `RC` Recirculation, `OP` Other Paid, `OT` Other, `AI` Generative AI. `attributeKey` is the code; `name` is the label.
+ * - `utmCampaign`: `utm_campaign` value.
+ * - `utmContent`: `utm_content` value.
+ * - `utmMedium`: `utm_medium` value.
+ * - `utmSource`: `utm_source` value.
+ * - `utmTerm`: `utm_term` value.
+ * - `audienceIds`: Webflow audience identifier. For this dimension, `attributeKey` is the audience ID and `name` is the audience's display name (falling back to the ID if no display name is set).
+ */
+export const TopDimensionsDimension = {
+ Country: "country",
+ Region: "region",
+ DeviceType: "deviceType",
+ Os: "os",
+ Browser: "browser",
+ Language: "language",
+ Locale: "locale",
+ Referrer: "referrer",
+ TrafficSource: "trafficSource",
+ UtmCampaign: "utmCampaign",
+ UtmContent: "utmContent",
+ UtmMedium: "utmMedium",
+ UtmSource: "utmSource",
+ UtmTerm: "utmTerm",
+ AudienceIds: "audienceIds",
+} as const;
+export type TopDimensionsDimension = (typeof TopDimensionsDimension)[keyof typeof TopDimensionsDimension];
diff --git a/src/api/types/TopDimensionsFilter.ts b/src/api/types/TopDimensionsFilter.ts
new file mode 100644
index 00000000..2b13ed9a
--- /dev/null
+++ b/src/api/types/TopDimensionsFilter.ts
@@ -0,0 +1,40 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../index";
+
+/**
+ * Filter the top dimensions report by dimension. Each property is an optional set of `AnalyzeFilterOperators` (`eq`, `in`, `ne`, `nin`) applied to the named dimension. Filter a given dimension in one place — either inside `filter` or as a top-level query parameter.
+ */
+export interface TopDimensionsFilter {
+ audienceIds?: Webflow.AnalyzeFilterOperators;
+ browser?: Webflow.AnalyzeFilterOperators;
+ collectionId?: Webflow.AnalyzeFilterOperators;
+ country?: Webflow.AnalyzeFilterOperators;
+ dayOfWeek?: Webflow.AnalyzeFilterOperators;
+ deviceBrand?: Webflow.AnalyzeFilterOperators;
+ deviceType?: Webflow.AnalyzeFilterOperators;
+ domain?: Webflow.AnalyzeFilterOperators;
+ itemSlug?: Webflow.AnalyzeFilterOperators;
+ language?: Webflow.AnalyzeFilterOperators;
+ locale?: Webflow.AnalyzeFilterOperators;
+ nextCollectionId?: Webflow.AnalyzeFilterOperators;
+ nextItemSlug?: Webflow.AnalyzeFilterOperators;
+ nextPageId?: Webflow.AnalyzeFilterOperators;
+ os?: Webflow.AnalyzeFilterOperators;
+ pageId?: Webflow.AnalyzeFilterOperators;
+ pagePath?: Webflow.AnalyzeFilterOperators;
+ previousCollectionId?: Webflow.AnalyzeFilterOperators;
+ previousItemSlug?: Webflow.AnalyzeFilterOperators;
+ previousPageId?: Webflow.AnalyzeFilterOperators;
+ referrer?: Webflow.AnalyzeFilterOperators;
+ region?: Webflow.AnalyzeFilterOperators;
+ timeOfDay?: Webflow.AnalyzeFilterOperators;
+ timezone?: Webflow.AnalyzeFilterOperators;
+ trafficSource?: Webflow.AnalyzeFilterOperators;
+ utmCampaign?: Webflow.AnalyzeFilterOperators;
+ utmContent?: Webflow.AnalyzeFilterOperators;
+ utmMedium?: Webflow.AnalyzeFilterOperators;
+ utmSource?: Webflow.AnalyzeFilterOperators;
+ utmTerm?: Webflow.AnalyzeFilterOperators;
+ visitStatus?: Webflow.AnalyzeFilterOperators;
+}
diff --git a/src/api/types/TopDimensionsMetricScope.ts b/src/api/types/TopDimensionsMetricScope.ts
new file mode 100644
index 00000000..c0208937
--- /dev/null
+++ b/src/api/types/TopDimensionsMetricScope.ts
@@ -0,0 +1,12 @@
+// This file was auto-generated by Fern from our API Definition.
+
+/**
+ * The unit each row's `count` is measured in.
+ * - `session`: number of sessions attributed to the dimension value.
+ * - `user`: number of unique users attributed to the dimension value.
+ */
+export const TopDimensionsMetricScope = {
+ Session: "session",
+ User: "user",
+} as const;
+export type TopDimensionsMetricScope = (typeof TopDimensionsMetricScope)[keyof typeof TopDimensionsMetricScope];
diff --git a/src/api/types/TopDimensionsResponse.ts b/src/api/types/TopDimensionsResponse.ts
new file mode 100644
index 00000000..c50ebcb0
--- /dev/null
+++ b/src/api/types/TopDimensionsResponse.ts
@@ -0,0 +1,19 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../index";
+
+/**
+ * Response payload for the top dimensions report.
+ */
+export interface TopDimensionsResponse {
+ /** Discriminator identifying the report type. */
+ report: "top_dimensions";
+ window: Webflow.AnalyzeWindow;
+ dimension: Webflow.TopDimensionsDimension;
+ metricScope: Webflow.TopDimensionsMetricScope;
+ /** The row cap that was applied to this response (echoes the resolved request value, including the default). */
+ limit: number;
+ /** Dimension values ranked by `count`, descending. At most `limit` rows. */
+ data: Webflow.TopDimensionsRow[];
+ filter?: Webflow.TopDimensionsFilter;
+}
diff --git a/src/api/types/TopDimensionsRow.ts b/src/api/types/TopDimensionsRow.ts
new file mode 100644
index 00000000..20281d62
--- /dev/null
+++ b/src/api/types/TopDimensionsRow.ts
@@ -0,0 +1,13 @@
+// This file was auto-generated by Fern from our API Definition.
+
+/**
+ * A single value within the chosen dimension, with its count for the requested `metricScope`.
+ */
+export interface TopDimensionsRow {
+ /** Identifier for the dimension value. Pass this back into a `filter` on any Analyze report to scope that report to this value. */
+ attributeKey: string;
+ /** Display label for the dimension value. For many dimensions this matches `attributeKey`; for others (such as `region`, `trafficSource`, and `audienceIds`) it's a human-readable label. */
+ name: string;
+ /** Non-negative count for this dimension value, in units of the request's `metricScope`. */
+ count: number;
+}
diff --git a/src/api/types/TopEventsCmsContextEntry.ts b/src/api/types/TopEventsCmsContextEntry.ts
new file mode 100644
index 00000000..2871eaf8
--- /dev/null
+++ b/src/api/types/TopEventsCmsContextEntry.ts
@@ -0,0 +1,11 @@
+// This file was auto-generated by Fern from our API Definition.
+
+/**
+ * CMS collection-list rendering context for a top event row.
+ */
+export interface TopEventsCmsContextEntry {
+ /** Identifier of the CMS collection. */
+ collectionId: string;
+ /** Identifier of the CMS item. */
+ itemId: string;
+}
diff --git a/src/api/types/TopEventsComponentContextEntry.ts b/src/api/types/TopEventsComponentContextEntry.ts
new file mode 100644
index 00000000..5ec23099
--- /dev/null
+++ b/src/api/types/TopEventsComponentContextEntry.ts
@@ -0,0 +1,11 @@
+// This file was auto-generated by Fern from our API Definition.
+
+/**
+ * Component rendering context for a top event row.
+ */
+export interface TopEventsComponentContextEntry {
+ /** Identifier of the component definition. */
+ componentId: string;
+ /** Identifier of the component instance. */
+ instanceId: string;
+}
diff --git a/src/api/types/TopEventsFilter.ts b/src/api/types/TopEventsFilter.ts
new file mode 100644
index 00000000..962914e2
--- /dev/null
+++ b/src/api/types/TopEventsFilter.ts
@@ -0,0 +1,33 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../index";
+
+/**
+ * Filter the top events report by dimension. Each property is an optional set of `AnalyzeFilterOperators` (`eq`, `in`, `ne`, `nin`) applied to the named dimension. Filter a given dimension in one place — either inside `filter` or as a top-level query parameter.
+ */
+export interface TopEventsFilter {
+ audienceIds?: Webflow.AnalyzeFilterOperators;
+ browser?: Webflow.AnalyzeFilterOperators;
+ collectionId?: Webflow.AnalyzeFilterOperators;
+ country?: Webflow.AnalyzeFilterOperators;
+ dayOfWeek?: Webflow.AnalyzeFilterOperators;
+ deviceBrand?: Webflow.AnalyzeFilterOperators;
+ deviceType?: Webflow.AnalyzeFilterOperators;
+ domain?: Webflow.AnalyzeFilterOperators;
+ itemSlug?: Webflow.AnalyzeFilterOperators;
+ language?: Webflow.AnalyzeFilterOperators;
+ locale?: Webflow.AnalyzeFilterOperators;
+ os?: Webflow.AnalyzeFilterOperators;
+ pageId?: Webflow.AnalyzeFilterOperators;
+ pagePath?: Webflow.AnalyzeFilterOperators;
+ region?: Webflow.AnalyzeFilterOperators;
+ timeOfDay?: Webflow.AnalyzeFilterOperators;
+ timezone?: Webflow.AnalyzeFilterOperators;
+ trafficSource?: Webflow.AnalyzeFilterOperators;
+ utmCampaign?: Webflow.AnalyzeFilterOperators;
+ utmContent?: Webflow.AnalyzeFilterOperators;
+ utmMedium?: Webflow.AnalyzeFilterOperators;
+ utmSource?: Webflow.AnalyzeFilterOperators;
+ utmTerm?: Webflow.AnalyzeFilterOperators;
+ visitStatus?: Webflow.AnalyzeFilterOperators;
+}
diff --git a/src/api/types/TopEventsResponse.ts b/src/api/types/TopEventsResponse.ts
new file mode 100644
index 00000000..1dc5b42c
--- /dev/null
+++ b/src/api/types/TopEventsResponse.ts
@@ -0,0 +1,18 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../index";
+
+/**
+ * Response payload for the top events report.
+ */
+export interface TopEventsResponse {
+ /** Discriminator identifying the report type. */
+ report: "top_events";
+ window: Webflow.AnalyzeWindow;
+ /** The row cap that was applied to this response (echoes the resolved request value, including the default). */
+ limit: number;
+ bucketing?: Webflow.AnalyzeDailyBucketing;
+ /** Events ranked by `count`, descending. At most `limit` rows. */
+ data: Webflow.TopEventsRow[];
+ filter?: Webflow.TopEventsFilter;
+}
diff --git a/src/api/types/TopEventsRow.ts b/src/api/types/TopEventsRow.ts
new file mode 100644
index 00000000..e43280e6
--- /dev/null
+++ b/src/api/types/TopEventsRow.ts
@@ -0,0 +1,29 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../index";
+
+/**
+ * A single event in the ranked response, with its event count over the requested window. Events are counted individually, not rolled up into sessions, users, or page views, so this report has no `metricScope` — `count` is always the number of times the event fired.
+ */
+export interface TopEventsRow {
+ /** Opaque identifier of the event. */
+ eventId: string;
+ /** Display name of the event. Omitted when the event has no name (customer-defined events may leave it blank). */
+ name?: string;
+ /** Identifier of the Webflow page the event is associated with. Omitted when the upstream has no page context for the event. */
+ pageId?: string;
+ /** Display name of the associated page. Omitted when the page label is unknown. */
+ pageName?: string;
+ /** Number of times the event fired during the requested window. */
+ count: number;
+ /** Component rendering context for the event. Omitted when the event is not rendered inside a component. */
+ componentContext?: Webflow.TopEventsComponentContextEntry[];
+ /** CMS collection-list rendering context for the event. Omitted when the event is not rendered inside a CMS collection list. */
+ cmsContext?: Webflow.TopEventsCmsContextEntry[];
+ /** Identifier of the CMS collection the associated page belongs to. Present only for events on CMS-templated pages. */
+ collectionId?: string;
+ /** Slug of the CMS item the associated page represents. Present only for events on CMS-templated pages. */
+ itemSlug?: string;
+ /** Daily count timeseries for this event over the requested window. Returned when `timeseries` is requested. */
+ timeseries?: Webflow.TopEventsTimeseriesPoint[];
+}
diff --git a/src/api/types/TopEventsTimeseriesPoint.ts b/src/api/types/TopEventsTimeseriesPoint.ts
new file mode 100644
index 00000000..f46d7ef7
--- /dev/null
+++ b/src/api/types/TopEventsTimeseriesPoint.ts
@@ -0,0 +1,13 @@
+// This file was auto-generated by Fern from our API Definition.
+
+/**
+ * A single **daily** bucket in a per-event timeseries. Returned only when `timeseries` is requested.
+ *
+ * Buckets are aligned to local day boundaries in the response's `bucketing.bucketTimeZone`; the `timestamp` is the UTC instant for that local bucket start. A row's `timeseries` contains daily buckets for the requested window. When `timeseries` is requested but the event did not occur in the window, `timeseries` is an empty array — distinguishing "asked, none" from "didn't ask".
+ */
+export interface TopEventsTimeseriesPoint {
+ /** Start of the daily bucket, in ISO 8601 / RFC 3339 format. */
+ timestamp: Date;
+ /** Number of times the event occurred on this day. */
+ count: number;
+}
diff --git a/src/api/types/TopPagesFilter.ts b/src/api/types/TopPagesFilter.ts
new file mode 100644
index 00000000..3ab68f1a
--- /dev/null
+++ b/src/api/types/TopPagesFilter.ts
@@ -0,0 +1,40 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../index";
+
+/**
+ * Filter the top pages report by dimension. Each property is an optional set of `AnalyzeFilterOperators` (`eq`, `in`, `ne`, `nin`) applied to the named dimension. Filter a given dimension in one place — either inside `filter` or as a top-level query parameter.
+ */
+export interface TopPagesFilter {
+ audienceIds?: Webflow.AnalyzeFilterOperators;
+ browser?: Webflow.AnalyzeFilterOperators;
+ collectionId?: Webflow.AnalyzeFilterOperators;
+ country?: Webflow.AnalyzeFilterOperators;
+ dayOfWeek?: Webflow.AnalyzeFilterOperators;
+ deviceBrand?: Webflow.AnalyzeFilterOperators;
+ deviceType?: Webflow.AnalyzeFilterOperators;
+ domain?: Webflow.AnalyzeFilterOperators;
+ itemSlug?: Webflow.AnalyzeFilterOperators;
+ language?: Webflow.AnalyzeFilterOperators;
+ locale?: Webflow.AnalyzeFilterOperators;
+ nextCollectionId?: Webflow.AnalyzeFilterOperators;
+ nextItemSlug?: Webflow.AnalyzeFilterOperators;
+ nextPageId?: Webflow.AnalyzeFilterOperators;
+ os?: Webflow.AnalyzeFilterOperators;
+ pageId?: Webflow.AnalyzeFilterOperators;
+ pagePath?: Webflow.AnalyzeFilterOperators;
+ previousCollectionId?: Webflow.AnalyzeFilterOperators;
+ previousItemSlug?: Webflow.AnalyzeFilterOperators;
+ previousPageId?: Webflow.AnalyzeFilterOperators;
+ referrer?: Webflow.AnalyzeFilterOperators;
+ region?: Webflow.AnalyzeFilterOperators;
+ timeOfDay?: Webflow.AnalyzeFilterOperators;
+ timezone?: Webflow.AnalyzeFilterOperators;
+ trafficSource?: Webflow.AnalyzeFilterOperators;
+ utmCampaign?: Webflow.AnalyzeFilterOperators;
+ utmContent?: Webflow.AnalyzeFilterOperators;
+ utmMedium?: Webflow.AnalyzeFilterOperators;
+ utmSource?: Webflow.AnalyzeFilterOperators;
+ utmTerm?: Webflow.AnalyzeFilterOperators;
+ visitStatus?: Webflow.AnalyzeFilterOperators;
+}
diff --git a/src/api/types/TopPagesResponse.ts b/src/api/types/TopPagesResponse.ts
new file mode 100644
index 00000000..45a226d1
--- /dev/null
+++ b/src/api/types/TopPagesResponse.ts
@@ -0,0 +1,19 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../index";
+
+/**
+ * Response payload for the top pages report.
+ */
+export interface TopPagesResponse {
+ /** Discriminator identifying the report type. */
+ report: "top_pages";
+ window: Webflow.AnalyzeWindow;
+ sortBy: Webflow.TopPagesSortBy;
+ /** The row cap that was applied to this response (echoes the resolved request value, including the default). */
+ limit: number;
+ bucketing?: Webflow.AnalyzeDailyBucketing;
+ /** Pages ranked by `sortBy`, descending. At most `limit` rows. */
+ data: Webflow.TopPagesRow[];
+ filter?: Webflow.TopPagesFilter;
+}
diff --git a/src/api/types/TopPagesRow.ts b/src/api/types/TopPagesRow.ts
new file mode 100644
index 00000000..d6c98c51
--- /dev/null
+++ b/src/api/types/TopPagesRow.ts
@@ -0,0 +1,25 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../index";
+
+/**
+ * A single page in the ranked response. Every row carries all three scope counts (`sessionCount`, `userCount`, `pageviewCount`); `sortBy` governs only the row ordering.
+ */
+export interface TopPagesRow {
+ /** Identifier of the Webflow page. */
+ pageId: string;
+ /** Display title for the page. Resolves to the page's CMS item name when applicable, otherwise the page label. Falls back to `pageId` when no title is available. */
+ title: string;
+ /** Sessions attributed to this page during the requested window. */
+ sessionCount: number;
+ /** Unique users that visited this page during the requested window. */
+ userCount: number;
+ /** Page views recorded for this page during the requested window. */
+ pageviewCount: number;
+ /** Identifier of the CMS collection this page belongs to. Present only for CMS-templated pages. */
+ collectionId?: string;
+ /** Slug of the CMS item this row represents. Present only for CMS-templated pages. */
+ itemSlug?: string;
+ /** Daily page view timeseries for this page over the requested window. Returned when `timeseries` is requested. */
+ timeseries?: Webflow.TopPagesTimeseriesPoint[];
+}
diff --git a/src/api/types/TopPagesSortBy.ts b/src/api/types/TopPagesSortBy.ts
new file mode 100644
index 00000000..3b5be1e0
--- /dev/null
+++ b/src/api/types/TopPagesSortBy.ts
@@ -0,0 +1,14 @@
+// This file was auto-generated by Fern from our API Definition.
+
+/**
+ * The metric used to rank rows in the response, descending. Row-level `sessionCount`, `userCount`, and `pageviewCount` are always all returned regardless of `sortBy`.
+ * - `session`: rank by session count (default).
+ * - `user`: rank by unique user count.
+ * - `pageview`: rank by page view count.
+ */
+export const TopPagesSortBy = {
+ Session: "session",
+ User: "user",
+ Pageview: "pageview",
+} as const;
+export type TopPagesSortBy = (typeof TopPagesSortBy)[keyof typeof TopPagesSortBy];
diff --git a/src/api/types/TopPagesTimeseriesPoint.ts b/src/api/types/TopPagesTimeseriesPoint.ts
new file mode 100644
index 00000000..17d37d69
--- /dev/null
+++ b/src/api/types/TopPagesTimeseriesPoint.ts
@@ -0,0 +1,15 @@
+// This file was auto-generated by Fern from our API Definition.
+
+/**
+ * A single **daily** bucket in a per-page timeseries. Returned only when `timeseries` is requested.
+ *
+ * Buckets are aligned to local day boundaries in the response's `bucketing.bucketTimeZone`; the `timestamp` is the UTC instant for that local bucket start. A row's `timeseries` contains daily buckets for the requested window.
+ *
+ * Bucket counts are always page views, regardless of the request's `sortBy`. Row-level `sessionCount` / `userCount` / `pageviewCount` reflect `sortBy`.
+ */
+export interface TopPagesTimeseriesPoint {
+ /** Start of the daily bucket, in ISO 8601 / RFC 3339 format. */
+ timestamp: Date;
+ /** Page views recorded for this day. */
+ pageviewCount: number;
+}
diff --git a/src/api/types/TrafficDataPoint.ts b/src/api/types/TrafficDataPoint.ts
new file mode 100644
index 00000000..65fa47d2
--- /dev/null
+++ b/src/api/types/TrafficDataPoint.ts
@@ -0,0 +1,11 @@
+// This file was auto-generated by Fern from our API Definition.
+
+/**
+ * A single daily bucket in a traffic time series. Buckets are aligned to local day boundaries in the response's `bucketing.bucketTimeZone`; the `timestamp` is the UTC instant for that local bucket start.
+ */
+export interface TrafficDataPoint {
+ /** Start of the daily bucket, in ISO 8601 / RFC 3339 format. */
+ timestamp: Date;
+ /** Non-negative count for this day, in units of the request's `metricScope`. */
+ count: number;
+}
diff --git a/src/api/types/TrafficFilter.ts b/src/api/types/TrafficFilter.ts
new file mode 100644
index 00000000..8e9d0ef2
--- /dev/null
+++ b/src/api/types/TrafficFilter.ts
@@ -0,0 +1,40 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../index";
+
+/**
+ * Filter the traffic report by dimension. Each property is an optional set of `AnalyzeFilterOperators` (`eq`, `in`, `ne`, `nin`) applied to the named dimension. Filter a given dimension in one place — either inside `filter` or as a top-level query parameter.
+ */
+export interface TrafficFilter {
+ audienceIds?: Webflow.AnalyzeFilterOperators;
+ browser?: Webflow.AnalyzeFilterOperators;
+ collectionId?: Webflow.AnalyzeFilterOperators;
+ country?: Webflow.AnalyzeFilterOperators;
+ dayOfWeek?: Webflow.AnalyzeFilterOperators;
+ deviceBrand?: Webflow.AnalyzeFilterOperators;
+ deviceType?: Webflow.AnalyzeFilterOperators;
+ domain?: Webflow.AnalyzeFilterOperators;
+ itemSlug?: Webflow.AnalyzeFilterOperators;
+ language?: Webflow.AnalyzeFilterOperators;
+ locale?: Webflow.AnalyzeFilterOperators;
+ nextCollectionId?: Webflow.AnalyzeFilterOperators;
+ nextItemSlug?: Webflow.AnalyzeFilterOperators;
+ nextPageId?: Webflow.AnalyzeFilterOperators;
+ os?: Webflow.AnalyzeFilterOperators;
+ pageId?: Webflow.AnalyzeFilterOperators;
+ pagePath?: Webflow.AnalyzeFilterOperators;
+ previousCollectionId?: Webflow.AnalyzeFilterOperators;
+ previousItemSlug?: Webflow.AnalyzeFilterOperators;
+ previousPageId?: Webflow.AnalyzeFilterOperators;
+ referrer?: Webflow.AnalyzeFilterOperators;
+ region?: Webflow.AnalyzeFilterOperators;
+ timeOfDay?: Webflow.AnalyzeFilterOperators;
+ timezone?: Webflow.AnalyzeFilterOperators;
+ trafficSource?: Webflow.AnalyzeFilterOperators;
+ utmCampaign?: Webflow.AnalyzeFilterOperators;
+ utmContent?: Webflow.AnalyzeFilterOperators;
+ utmMedium?: Webflow.AnalyzeFilterOperators;
+ utmSource?: Webflow.AnalyzeFilterOperators;
+ utmTerm?: Webflow.AnalyzeFilterOperators;
+ visitStatus?: Webflow.AnalyzeFilterOperators;
+}
diff --git a/src/api/types/TrafficMetricScope.ts b/src/api/types/TrafficMetricScope.ts
new file mode 100644
index 00000000..aa7e8d07
--- /dev/null
+++ b/src/api/types/TrafficMetricScope.ts
@@ -0,0 +1,14 @@
+// This file was auto-generated by Fern from our API Definition.
+
+/**
+ * The unit each `count` data point is measured in.
+ * - `session`: number of sessions.
+ * - `user`: number of unique users.
+ * - `pageview`: number of page views.
+ */
+export const TrafficMetricScope = {
+ Session: "session",
+ User: "user",
+ Pageview: "pageview",
+} as const;
+export type TrafficMetricScope = (typeof TrafficMetricScope)[keyof typeof TrafficMetricScope];
diff --git a/src/api/types/TrafficResponse.ts b/src/api/types/TrafficResponse.ts
new file mode 100644
index 00000000..0a8786d7
--- /dev/null
+++ b/src/api/types/TrafficResponse.ts
@@ -0,0 +1,17 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../index";
+
+/**
+ * Response payload for the traffic report.
+ */
+export interface TrafficResponse {
+ /** Discriminator identifying the report type. */
+ report: "traffic";
+ window: Webflow.AnalyzeWindow;
+ metricScope: Webflow.TrafficMetricScope;
+ bucketing: Webflow.AnalyzeDailyBucketing;
+ /** Time-ordered series of data points covering the requested window. */
+ data: Webflow.TrafficDataPoint[];
+ filter?: Webflow.TrafficFilter;
+}
diff --git a/src/api/types/TriggerType.ts b/src/api/types/TriggerType.ts
index 4194377b..2e25b09e 100644
--- a/src/api/types/TriggerType.ts
+++ b/src/api/types/TriggerType.ts
@@ -16,5 +16,8 @@ export const TriggerType = {
CollectionItemPublished: "collection_item_published",
CollectionItemUnpublished: "collection_item_unpublished",
CommentCreated: "comment_created",
+ BranchCreated: "branch_created",
+ BranchMerged: "branch_merged",
+ BranchDeleted: "branch_deleted",
} as const;
export type TriggerType = (typeof TriggerType)[keyof typeof TriggerType];
diff --git a/src/api/types/UpdateSiteMemberRoleRequestBody.ts b/src/api/types/UpdateSiteMemberRoleRequestBody.ts
new file mode 100644
index 00000000..6634ac72
--- /dev/null
+++ b/src/api/types/UpdateSiteMemberRoleRequestBody.ts
@@ -0,0 +1,10 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../index";
+
+export interface UpdateSiteMemberRoleRequestBody {
+ /** The Site Role to assign */
+ siteRole: Webflow.UpdateSiteMemberRoleRequestBodySiteRole;
+ /** ID of the custom Site Role to assign. Required when `siteRole` is `custom`, and rejected with any other `siteRole`. Rejected if the id doesn't name a custom Site Role belonging to this workspace. */
+ siteRoleId?: string;
+}
diff --git a/src/api/types/UpdateSiteMemberRoleRequestBodySiteRole.ts b/src/api/types/UpdateSiteMemberRoleRequestBodySiteRole.ts
new file mode 100644
index 00000000..f1776972
--- /dev/null
+++ b/src/api/types/UpdateSiteMemberRoleRequestBodySiteRole.ts
@@ -0,0 +1,13 @@
+// This file was auto-generated by Fern from our API Definition.
+
+/** The Site Role to assign */
+export const UpdateSiteMemberRoleRequestBodySiteRole = {
+ SiteManager: "site_manager",
+ Designer: "designer",
+ Marketer: "marketer",
+ ContentEditor: "content_editor",
+ Reviewer: "reviewer",
+ Custom: "custom",
+} as const;
+export type UpdateSiteMemberRoleRequestBodySiteRole =
+ (typeof UpdateSiteMemberRoleRequestBodySiteRole)[keyof typeof UpdateSiteMemberRoleRequestBodySiteRole];
diff --git a/src/api/types/WithDefaultSiteRole.ts b/src/api/types/WithDefaultSiteRole.ts
new file mode 100644
index 00000000..732149e9
--- /dev/null
+++ b/src/api/types/WithDefaultSiteRole.ts
@@ -0,0 +1,13 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../index";
+
+export interface WithDefaultSiteRole {
+ email: string;
+ /** The Workspace Role to invite the person as */
+ workspaceRole: Webflow.InviteWorkspaceMemberRequestBodyDefaultSiteRoleWorkspaceRole;
+ /** The Site Role to grant across every Site the Workspace default extends to */
+ defaultSiteRole: Webflow.InviteWorkspaceMemberRequestBodyDefaultSiteRoleDefaultSiteRole;
+ /** ID of the custom Site Role named by `defaultSiteRole`. Requires `defaultSiteRole` to be `custom`, and rejected with any other `defaultSiteRole`. Rejected if the id doesn't name a custom Site Role belonging to this workspace. */
+ defaultSiteRoleId?: string;
+}
diff --git a/src/api/types/WithSiteAccess.ts b/src/api/types/WithSiteAccess.ts
new file mode 100644
index 00000000..d67b2605
--- /dev/null
+++ b/src/api/types/WithSiteAccess.ts
@@ -0,0 +1,11 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../index";
+
+export interface WithSiteAccess {
+ email: string;
+ /** The Workspace Role to invite the person as */
+ workspaceRole: Webflow.InviteWorkspaceMemberRequestBodyOneWorkspaceRole;
+ /** Sites to grant on acceptance, instead of one Workspace-wide default. Every entry must use the same `siteRole` (and `siteRoleId`, for `custom`) — a pending invite stores one Site Role for all of its Sites. */
+ siteAccess: Webflow.InviteWorkspaceMemberRequestBodyOneSiteAccessItem[];
+}
diff --git a/src/api/types/Workspace.ts b/src/api/types/Workspace.ts
new file mode 100644
index 00000000..494c7017
--- /dev/null
+++ b/src/api/types/Workspace.ts
@@ -0,0 +1,10 @@
+// This file was auto-generated by Fern from our API Definition.
+
+export interface Workspace {
+ /** Unique identifier for the workspace */
+ id: string;
+ /** Name of the workspace */
+ name: string;
+ /** URL slug of the workspace */
+ slug: string;
+}
diff --git a/src/api/types/WorkspaceAuditLogActor.ts b/src/api/types/WorkspaceAuditLogActor.ts
new file mode 100644
index 00000000..adbea9c0
--- /dev/null
+++ b/src/api/types/WorkspaceAuditLogActor.ts
@@ -0,0 +1,18 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../index";
+
+/**
+ * The user or API token that performed the action. Use `type` to tell them apart.
+ */
+export type WorkspaceAuditLogActor = Webflow.WorkspaceAuditLogActor.Person | Webflow.WorkspaceAuditLogActor.Token;
+
+export namespace WorkspaceAuditLogActor {
+ export interface Person extends Webflow.PersonActor {
+ type: "person";
+ }
+
+ export interface Token extends Webflow.TokenActor {
+ type: "token";
+ }
+}
diff --git a/src/api/types/WorkspaceAuditLogItem.ts b/src/api/types/WorkspaceAuditLogItem.ts
index 21e2dcbb..7a4737e4 100644
--- a/src/api/types/WorkspaceAuditLogItem.ts
+++ b/src/api/types/WorkspaceAuditLogItem.ts
@@ -37,7 +37,7 @@ export namespace WorkspaceAuditLogItem {
export interface _Base {
timestamp?: Date;
- actor?: Webflow.WorkspaceAuditLogItemActor;
+ actor?: Webflow.WorkspaceAuditLogActor;
workspace?: Webflow.WorkspaceAuditLogItemWorkspace;
}
}
diff --git a/src/api/types/WorkspaceAuditLogItemActor.ts b/src/api/types/WorkspaceAuditLogItemActor.ts
deleted file mode 100644
index f08d817d..00000000
--- a/src/api/types/WorkspaceAuditLogItemActor.ts
+++ /dev/null
@@ -1,6 +0,0 @@
-// This file was auto-generated by Fern from our API Definition.
-
-export interface WorkspaceAuditLogItemActor {
- id?: string;
- email?: string;
-}
diff --git a/src/api/types/WorkspaceAuditLogItemPayloadSettingChangeMethod.ts b/src/api/types/WorkspaceAuditLogItemPayloadSettingChangeMethod.ts
deleted file mode 100644
index 7d7067a2..00000000
--- a/src/api/types/WorkspaceAuditLogItemPayloadSettingChangeMethod.ts
+++ /dev/null
@@ -1,8 +0,0 @@
-// This file was auto-generated by Fern from our API Definition.
-
-export const WorkspaceAuditLogItemPayloadSettingChangeMethod = {
- Dashboard: "dashboard",
- Admin: "admin",
-} as const;
-export type WorkspaceAuditLogItemPayloadSettingChangeMethod =
- (typeof WorkspaceAuditLogItemPayloadSettingChangeMethod)[keyof typeof WorkspaceAuditLogItemPayloadSettingChangeMethod];
diff --git a/src/api/types/WorkspaceAuditLogItemPayloadSiteMembershipMethod.ts b/src/api/types/WorkspaceAuditLogItemPayloadSiteMembershipMethod.ts
index 3dda5663..f92ef40c 100644
--- a/src/api/types/WorkspaceAuditLogItemPayloadSiteMembershipMethod.ts
+++ b/src/api/types/WorkspaceAuditLogItemPayloadSiteMembershipMethod.ts
@@ -1,12 +1,12 @@
// This file was auto-generated by Fern from our API Definition.
export const WorkspaceAuditLogItemPayloadSiteMembershipMethod = {
- Sso: "sso",
Invite: "invite",
Scim: "scim",
Dashboard: "dashboard",
Admin: "admin",
AccessRequest: "access_request",
+ Api: "api",
} as const;
export type WorkspaceAuditLogItemPayloadSiteMembershipMethod =
(typeof WorkspaceAuditLogItemPayloadSiteMembershipMethod)[keyof typeof WorkspaceAuditLogItemPayloadSiteMembershipMethod];
diff --git a/src/api/types/WorkspaceAuditLogItemPayloadWorkspaceInvitationMethod.ts b/src/api/types/WorkspaceAuditLogItemPayloadWorkspaceInvitationMethod.ts
index dc9a42e4..02e7cc6c 100644
--- a/src/api/types/WorkspaceAuditLogItemPayloadWorkspaceInvitationMethod.ts
+++ b/src/api/types/WorkspaceAuditLogItemPayloadWorkspaceInvitationMethod.ts
@@ -4,6 +4,10 @@ export const WorkspaceAuditLogItemPayloadWorkspaceInvitationMethod = {
Sso: "sso",
Dashboard: "dashboard",
Admin: "admin",
+ Api: "api",
+ Designer: "designer",
+ Scim: "scim",
+ AccessRequest: "access_request",
} as const;
export type WorkspaceAuditLogItemPayloadWorkspaceInvitationMethod =
(typeof WorkspaceAuditLogItemPayloadWorkspaceInvitationMethod)[keyof typeof WorkspaceAuditLogItemPayloadWorkspaceInvitationMethod];
diff --git a/src/api/types/WorkspaceAuditLogItemPayloadWorkspaceMembershipMethod.ts b/src/api/types/WorkspaceAuditLogItemPayloadWorkspaceMembershipMethod.ts
index f31f0c0d..578c9bbc 100644
--- a/src/api/types/WorkspaceAuditLogItemPayloadWorkspaceMembershipMethod.ts
+++ b/src/api/types/WorkspaceAuditLogItemPayloadWorkspaceMembershipMethod.ts
@@ -5,6 +5,9 @@ export const WorkspaceAuditLogItemPayloadWorkspaceMembershipMethod = {
Dashboard: "dashboard",
Admin: "admin",
AccessRequest: "access_request",
+ Api: "api",
+ Invite: "invite",
+ Scim: "scim",
} as const;
export type WorkspaceAuditLogItemPayloadWorkspaceMembershipMethod =
(typeof WorkspaceAuditLogItemPayloadWorkspaceMembershipMethod)[keyof typeof WorkspaceAuditLogItemPayloadWorkspaceMembershipMethod];
diff --git a/src/api/types/WorkspaceBulkRoleChangeResponse.ts b/src/api/types/WorkspaceBulkRoleChangeResponse.ts
new file mode 100644
index 00000000..dcadfbcc
--- /dev/null
+++ b/src/api/types/WorkspaceBulkRoleChangeResponse.ts
@@ -0,0 +1,13 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../index";
+
+/**
+ * Result of each update in the batch. A failed item does not fail the request.
+ */
+export interface WorkspaceBulkRoleChangeResponse {
+ /** Counts of updated and failed items */
+ summary: Webflow.WorkspaceBulkRoleChangeResponseSummary;
+ /** Result for each id. Match results to the request by `id`, not by position. */
+ results: Webflow.WorkspaceBulkRoleChangeResponseResultsItem[];
+}
diff --git a/src/api/types/WorkspaceBulkRoleChangeResponseResultsItem.ts b/src/api/types/WorkspaceBulkRoleChangeResponseResultsItem.ts
new file mode 100644
index 00000000..747ae1fb
--- /dev/null
+++ b/src/api/types/WorkspaceBulkRoleChangeResponseResultsItem.ts
@@ -0,0 +1,14 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../index";
+
+export interface WorkspaceBulkRoleChangeResponseResultsItem {
+ /** Unique identifier for the Member or invite */
+ id: string;
+ /** Whether `id` is a Member or an invite */
+ type: Webflow.WorkspaceBulkRoleChangeResponseResultsItemType;
+ /** Whether the update was applied */
+ outcome: Webflow.WorkspaceBulkRoleChangeResponseResultsItemOutcome;
+ /** Why the update failed. Present only when `outcome` is `failed`. */
+ error?: Webflow.WorkspaceBulkRoleChangeResponseResultsItemError;
+}
diff --git a/src/api/types/WorkspaceBulkRoleChangeResponseResultsItemError.ts b/src/api/types/WorkspaceBulkRoleChangeResponseResultsItemError.ts
new file mode 100644
index 00000000..cc0e34fd
--- /dev/null
+++ b/src/api/types/WorkspaceBulkRoleChangeResponseResultsItemError.ts
@@ -0,0 +1,13 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../index";
+
+/**
+ * Why the update failed. Present only when `outcome` is `failed`.
+ */
+export interface WorkspaceBulkRoleChangeResponseResultsItemError {
+ /** Why this id failed. `workspace_member_not_found` and `workspace_invite_not_found` mean the id doesn't match a member or invite in this Workspace. `workspace_member_managed_by_scim` means the member is provisioned by your identity provider. `invalid_workspace_role` and `invalid_site_role` mean `role` or `defaultSiteRole` in the request isn't valid for this id, including a reviewer pairing mismatch. `cannot_update_user_role` covers every other role change this id can't accept. `internal_error` means the update failed for a reason unrelated to the request; retry it. */
+ code?: Webflow.WorkspaceBulkRoleChangeResponseResultsItemErrorCode;
+ /** Error message */
+ message?: string;
+}
diff --git a/src/api/types/WorkspaceBulkRoleChangeResponseResultsItemErrorCode.ts b/src/api/types/WorkspaceBulkRoleChangeResponseResultsItemErrorCode.ts
new file mode 100644
index 00000000..dac70e0d
--- /dev/null
+++ b/src/api/types/WorkspaceBulkRoleChangeResponseResultsItemErrorCode.ts
@@ -0,0 +1,14 @@
+// This file was auto-generated by Fern from our API Definition.
+
+/** Why this id failed. `workspace_member_not_found` and `workspace_invite_not_found` mean the id doesn't match a member or invite in this Workspace. `workspace_member_managed_by_scim` means the member is provisioned by your identity provider. `invalid_workspace_role` and `invalid_site_role` mean `role` or `defaultSiteRole` in the request isn't valid for this id, including a reviewer pairing mismatch. `cannot_update_user_role` covers every other role change this id can't accept. `internal_error` means the update failed for a reason unrelated to the request; retry it. */
+export const WorkspaceBulkRoleChangeResponseResultsItemErrorCode = {
+ WorkspaceMemberNotFound: "workspace_member_not_found",
+ WorkspaceInviteNotFound: "workspace_invite_not_found",
+ WorkspaceMemberManagedByScim: "workspace_member_managed_by_scim",
+ InvalidWorkspaceRole: "invalid_workspace_role",
+ InvalidSiteRole: "invalid_site_role",
+ CannotUpdateUserRole: "cannot_update_user_role",
+ InternalError: "internal_error",
+} as const;
+export type WorkspaceBulkRoleChangeResponseResultsItemErrorCode =
+ (typeof WorkspaceBulkRoleChangeResponseResultsItemErrorCode)[keyof typeof WorkspaceBulkRoleChangeResponseResultsItemErrorCode];
diff --git a/src/api/types/WorkspaceBulkRoleChangeResponseResultsItemOutcome.ts b/src/api/types/WorkspaceBulkRoleChangeResponseResultsItemOutcome.ts
new file mode 100644
index 00000000..d5fb2ea2
--- /dev/null
+++ b/src/api/types/WorkspaceBulkRoleChangeResponseResultsItemOutcome.ts
@@ -0,0 +1,9 @@
+// This file was auto-generated by Fern from our API Definition.
+
+/** Whether the update was applied */
+export const WorkspaceBulkRoleChangeResponseResultsItemOutcome = {
+ Updated: "updated",
+ Failed: "failed",
+} as const;
+export type WorkspaceBulkRoleChangeResponseResultsItemOutcome =
+ (typeof WorkspaceBulkRoleChangeResponseResultsItemOutcome)[keyof typeof WorkspaceBulkRoleChangeResponseResultsItemOutcome];
diff --git a/src/api/types/WorkspaceBulkRoleChangeResponseResultsItemType.ts b/src/api/types/WorkspaceBulkRoleChangeResponseResultsItemType.ts
new file mode 100644
index 00000000..43dc1270
--- /dev/null
+++ b/src/api/types/WorkspaceBulkRoleChangeResponseResultsItemType.ts
@@ -0,0 +1,9 @@
+// This file was auto-generated by Fern from our API Definition.
+
+/** Whether `id` is a Member or an invite */
+export const WorkspaceBulkRoleChangeResponseResultsItemType = {
+ Member: "member",
+ Invite: "invite",
+} as const;
+export type WorkspaceBulkRoleChangeResponseResultsItemType =
+ (typeof WorkspaceBulkRoleChangeResponseResultsItemType)[keyof typeof WorkspaceBulkRoleChangeResponseResultsItemType];
diff --git a/src/api/types/WorkspaceBulkRoleChangeResponseSummary.ts b/src/api/types/WorkspaceBulkRoleChangeResponseSummary.ts
new file mode 100644
index 00000000..44564b44
--- /dev/null
+++ b/src/api/types/WorkspaceBulkRoleChangeResponseSummary.ts
@@ -0,0 +1,11 @@
+// This file was auto-generated by Fern from our API Definition.
+
+/**
+ * Counts of updated and failed items
+ */
+export interface WorkspaceBulkRoleChangeResponseSummary {
+ /** Number of items updated */
+ updated: number;
+ /** Number of items that failed */
+ failed: number;
+}
diff --git a/src/api/types/WorkspaceInvitationAuditLogItemEventSubType.ts b/src/api/types/WorkspaceInvitationAuditLogItemEventSubType.ts
index e58a38d6..1dd2bcc7 100644
--- a/src/api/types/WorkspaceInvitationAuditLogItemEventSubType.ts
+++ b/src/api/types/WorkspaceInvitationAuditLogItemEventSubType.ts
@@ -3,10 +3,11 @@
export const WorkspaceInvitationAuditLogItemEventSubType = {
InviteSent: "invite_sent",
InviteAccepted: "invite_accepted",
- InviteUpdated: "invite_updated",
+ InviteRoleUpdated: "invite_role_updated",
InviteCanceled: "invite_canceled",
InviteDeclined: "invite_declined",
AccessRequestAccepted: "access_request_accepted",
+ AccessRequestDeclined: "access_request_declined",
} as const;
export type WorkspaceInvitationAuditLogItemEventSubType =
(typeof WorkspaceInvitationAuditLogItemEventSubType)[keyof typeof WorkspaceInvitationAuditLogItemEventSubType];
diff --git a/src/api/types/WorkspaceInvite.ts b/src/api/types/WorkspaceInvite.ts
new file mode 100644
index 00000000..673a7ce8
--- /dev/null
+++ b/src/api/types/WorkspaceInvite.ts
@@ -0,0 +1,24 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../index";
+
+export interface WorkspaceInvite {
+ /** Unique identifier for the invite */
+ id: string;
+ /** Email address the invite was sent to */
+ email: string;
+ /** The Workspace Role the invite grants on acceptance */
+ role: Webflow.WorkspaceInviteRole;
+ /** Date the invite was created */
+ createdOn: Date;
+ /** Status of the invite. Only a `pending` invite can still be accepted. */
+ status: Webflow.WorkspaceInviteStatus;
+ /** IDs of the Sites the invite grants access to */
+ sites: string[];
+ /** Whether the invite grants access across the Workspace. Use this with `sites` to distinguish workspace-wide access from no Site access. */
+ allSites: boolean;
+ /** The default Site Role the invite grants on acceptance. Legacy invites might not include this field. */
+ defaultSiteRole?: Webflow.WorkspaceInviteDefaultSiteRole;
+ /** ID of the custom Site Role named by `defaultSiteRole` */
+ defaultSiteRoleId?: string;
+}
diff --git a/src/api/types/WorkspaceInviteDefaultSiteRole.ts b/src/api/types/WorkspaceInviteDefaultSiteRole.ts
new file mode 100644
index 00000000..fe70a7bc
--- /dev/null
+++ b/src/api/types/WorkspaceInviteDefaultSiteRole.ts
@@ -0,0 +1,16 @@
+// This file was auto-generated by Fern from our API Definition.
+
+/** The default Site Role the invite grants on acceptance. Legacy invites might not include this field. */
+export const WorkspaceInviteDefaultSiteRole = {
+ SiteManager: "site_manager",
+ Designer: "designer",
+ BranchDesigner: "branch_designer",
+ LimitedDesigner: "limited_designer",
+ Marketer: "marketer",
+ ContentEditor: "content_editor",
+ Reviewer: "reviewer",
+ Viewer: "viewer",
+ Custom: "custom",
+} as const;
+export type WorkspaceInviteDefaultSiteRole =
+ (typeof WorkspaceInviteDefaultSiteRole)[keyof typeof WorkspaceInviteDefaultSiteRole];
diff --git a/src/api/types/WorkspaceInviteRole.ts b/src/api/types/WorkspaceInviteRole.ts
new file mode 100644
index 00000000..c5c46a20
--- /dev/null
+++ b/src/api/types/WorkspaceInviteRole.ts
@@ -0,0 +1,12 @@
+// This file was auto-generated by Fern from our API Definition.
+
+/** The Workspace Role the invite grants on acceptance */
+export const WorkspaceInviteRole = {
+ Owner: "owner",
+ Admin: "admin",
+ Member: "member",
+ Guest: "guest",
+ Reviewer: "reviewer",
+ Client: "client",
+} as const;
+export type WorkspaceInviteRole = (typeof WorkspaceInviteRole)[keyof typeof WorkspaceInviteRole];
diff --git a/src/api/types/WorkspaceInviteStatus.ts b/src/api/types/WorkspaceInviteStatus.ts
new file mode 100644
index 00000000..a8dc3d6d
--- /dev/null
+++ b/src/api/types/WorkspaceInviteStatus.ts
@@ -0,0 +1,9 @@
+// This file was auto-generated by Fern from our API Definition.
+
+/** Status of the invite. Only a `pending` invite can still be accepted. */
+export const WorkspaceInviteStatus = {
+ Pending: "pending",
+ Declined: "declined",
+ Expired: "expired",
+} as const;
+export type WorkspaceInviteStatus = (typeof WorkspaceInviteStatus)[keyof typeof WorkspaceInviteStatus];
diff --git a/src/api/types/WorkspaceMember.ts b/src/api/types/WorkspaceMember.ts
new file mode 100644
index 00000000..3636a3f3
--- /dev/null
+++ b/src/api/types/WorkspaceMember.ts
@@ -0,0 +1,18 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../index";
+
+export interface WorkspaceMember {
+ /** Unique identifier for the Member */
+ id: string;
+ /** Email address of the Member */
+ email?: string;
+ /** First name of the Member */
+ firstName?: string;
+ /** Last name of the Member */
+ lastName?: string;
+ /** Roles the Member holds */
+ roles: Webflow.WorkspaceMemberRoles;
+ /** When the Member most recently joined the Workspace. Not "member since": removing and re-adding a Member (including a support restore) reports the re-add, and a role change does not update it. For a Member who joined by invite, this is when they accepted, not when the invite was sent. `null` when unknown. */
+ addedOn?: Date;
+}
diff --git a/src/api/types/WorkspaceMemberRoles.ts b/src/api/types/WorkspaceMemberRoles.ts
new file mode 100644
index 00000000..4222e4c4
--- /dev/null
+++ b/src/api/types/WorkspaceMemberRoles.ts
@@ -0,0 +1,13 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../index";
+
+/**
+ * Roles the Member holds
+ */
+export interface WorkspaceMemberRoles {
+ /** The Member's role in the Workspace */
+ workspace: Webflow.WorkspaceMemberRolesWorkspace;
+ /** The Member's default Site Role. List Workspace Members and Update Workspace Member Role return it only for Workspaces on Workspace seats. */
+ site?: Webflow.WorkspaceMemberRolesSite;
+}
diff --git a/src/api/types/WorkspaceMemberRolesSite.ts b/src/api/types/WorkspaceMemberRolesSite.ts
new file mode 100644
index 00000000..60c86e25
--- /dev/null
+++ b/src/api/types/WorkspaceMemberRolesSite.ts
@@ -0,0 +1,15 @@
+// This file was auto-generated by Fern from our API Definition.
+
+/** The Member's default Site Role. List Workspace Members and Update Workspace Member Role return it only for Workspaces on Workspace seats. */
+export const WorkspaceMemberRolesSite = {
+ SiteManager: "site_manager",
+ Designer: "designer",
+ BranchDesigner: "branch_designer",
+ LimitedDesigner: "limited_designer",
+ Marketer: "marketer",
+ ContentEditor: "content_editor",
+ Reviewer: "reviewer",
+ Viewer: "viewer",
+ Custom: "custom",
+} as const;
+export type WorkspaceMemberRolesSite = (typeof WorkspaceMemberRolesSite)[keyof typeof WorkspaceMemberRolesSite];
diff --git a/src/api/types/WorkspaceMemberRolesWorkspace.ts b/src/api/types/WorkspaceMemberRolesWorkspace.ts
new file mode 100644
index 00000000..50842e5f
--- /dev/null
+++ b/src/api/types/WorkspaceMemberRolesWorkspace.ts
@@ -0,0 +1,13 @@
+// This file was auto-generated by Fern from our API Definition.
+
+/** The Member's role in the Workspace */
+export const WorkspaceMemberRolesWorkspace = {
+ Owner: "owner",
+ Admin: "admin",
+ Member: "member",
+ Guest: "guest",
+ Reviewer: "reviewer",
+ Client: "client",
+} as const;
+export type WorkspaceMemberRolesWorkspace =
+ (typeof WorkspaceMemberRolesWorkspace)[keyof typeof WorkspaceMemberRolesWorkspace];
diff --git a/src/api/types/WorkspaceMembersResponse.ts b/src/api/types/WorkspaceMembersResponse.ts
new file mode 100644
index 00000000..e6c646ce
--- /dev/null
+++ b/src/api/types/WorkspaceMembersResponse.ts
@@ -0,0 +1,12 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../index";
+
+export interface WorkspaceMembersResponse {
+ /** List of Workspace Members */
+ members: Webflow.WorkspaceMember[];
+ /** List of pending, declined and expired invites */
+ invites: Webflow.WorkspaceInvite[];
+ /** Pagination object */
+ pagination: Webflow.WorkspaceMembersResponsePagination;
+}
diff --git a/src/api/types/WorkspaceMembersResponsePagination.ts b/src/api/types/WorkspaceMembersResponsePagination.ts
new file mode 100644
index 00000000..c8da0cf0
--- /dev/null
+++ b/src/api/types/WorkspaceMembersResponsePagination.ts
@@ -0,0 +1,11 @@
+// This file was auto-generated by Fern from our API Definition.
+
+/**
+ * Pagination object
+ */
+export interface WorkspaceMembersResponsePagination {
+ /** The limit used for pagination, applied to `members` and `invites` separately */
+ limit: number;
+ /** Cursor for the next page of both lists. `null` when there are no more results. */
+ nextCursor?: string;
+}
diff --git a/src/api/types/Workspaces.ts b/src/api/types/Workspaces.ts
new file mode 100644
index 00000000..7d9a198a
--- /dev/null
+++ b/src/api/types/Workspaces.ts
@@ -0,0 +1,7 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../index";
+
+export interface Workspaces {
+ workspaces: Webflow.Workspace[];
+}
diff --git a/src/api/types/index.ts b/src/api/types/index.ts
index ce98580e..e8cfae8d 100644
--- a/src/api/types/index.ts
+++ b/src/api/types/index.ts
@@ -1,3 +1,61 @@
+export * from "./AeoAnswerEngine";
+export * from "./AeoAnswerEngineKey";
+export * from "./AeoAnswerEnginesFilter";
+export * from "./AeoBotCategory";
+export * from "./AeoBotProvider";
+export * from "./AeoBotTrafficFilter";
+export * from "./AeoBotTrafficPage";
+export * from "./AeoBotTrafficPagesResponse";
+export * from "./AeoBotTrafficResponse";
+export * from "./AeoBrandNames";
+export * from "./AeoCitationFilter";
+export * from "./AeoCitationRateResponse";
+export * from "./AeoCitationRateResponseBreakdown";
+export * from "./AeoCitationRateResponseDataItem";
+export * from "./AeoCitationsResponse";
+export * from "./AeoCitationsResponseDataItem";
+export * from "./AeoCitedDomainPathsResponse";
+export * from "./AeoCitedPath";
+export * from "./AeoCompetitorCitationsResponse";
+export * from "./AeoCompetitorCitationsResponseDataItem";
+export * from "./AeoOwnedCitedPath";
+export * from "./AeoPage";
+export * from "./AeoPageCitationShareResponse";
+export * from "./AeoPageCitationShareResponseDataItem";
+export * from "./AeoPageCitationShareResponseFilter";
+export * from "./AeoPageCitationShareResponsePage";
+export * from "./AeoPrompt";
+export * from "./AeoPromptExecution";
+export * from "./AeoPromptExecutionListResponse";
+export * from "./AeoPromptExecutionPromptStatus";
+export * from "./AeoPromptExecutionStatus";
+export * from "./AeoPromptExecutionTopic";
+export * from "./AeoPromptIdsFilter";
+export * from "./AeoPromptLabel";
+export * from "./AeoPromptListResponse";
+export * from "./AeoPromptStatus";
+export * from "./AeoPromptTopic";
+export * from "./AeoTimeseries";
+export * from "./AeoTimeseriesGranularityPeriod";
+export * from "./AeoTopCitedDomainsResponse";
+export * from "./AeoTopCitedDomainsResponseDataItem";
+export * from "./AeoTopicEngineFilter";
+export * from "./AeoTopicIdsFilter";
+export * from "./AeoTopicLabel";
+export * from "./AeoVisibilityBreakdownResponse";
+export * from "./AeoVisibilityBreakdownResponseBreakdown";
+export * from "./AeoVisibilityBreakdownResponseDataItem";
+export * from "./AeoVisibilityFilter";
+export * from "./AeoVisibilityResponse";
+export * from "./AeoVisibilityResponseDataItem";
+export * from "./AeoVisibilityScore";
+export * from "./AeoWindow";
+export * from "./AnalyzeBucketTimeZone";
+export * from "./AnalyzeDailyBucketing";
+export * from "./AnalyzeDailyTimeseriesQuery";
+export * from "./AnalyzeFilterOperators";
+export * from "./AnalyzeTimeOnPageBucketing";
+export * from "./AnalyzeWindow";
export * from "./Application";
export * from "./Asset";
export * from "./AssetFolder";
@@ -11,8 +69,18 @@ export * from "./AuthorizationAuthorization";
export * from "./AuthorizationAuthorizationAuthorizedTo";
export * from "./AuthorizedUser";
export * from "./BadRequestErrorBody";
+export * from "./BranchCreatedWebhook";
+export * from "./BranchCreatedWebhookPayload";
+export * from "./BranchDeletedWebhook";
+export * from "./BranchDeletedWebhookPayload";
+export * from "./BranchMergedWebhook";
+export * from "./BranchMergedWebhookPayload";
+export * from "./BrowserWindowHeightDataPoint";
+export * from "./BrowserWindowHeightFilter";
+export * from "./BrowserWindowHeightResponse";
export * from "./BulkCollectionItem";
export * from "./BulkCollectionItemFieldData";
+export * from "./CollaboratorClientInvite";
export * from "./Collection";
export * from "./CollectionItem";
export * from "./CollectionItemChanged";
@@ -40,6 +108,7 @@ export * from "./Comment";
export * from "./CommentPayload";
export * from "./CommentPayloadAuthor";
export * from "./CommentPayloadMentionedUsersItem";
+export * from "./CommentPayloadType";
export * from "./CommentReply";
export * from "./CommentReplyAuthor";
export * from "./CommentReplyList";
@@ -65,6 +134,20 @@ export * from "./CustomCodeBlock";
export * from "./CustomCodeBlockType";
export * from "./CustomCodeHostedResponse";
export * from "./CustomCodeInlineResponse";
+export * from "./CustomFont";
+export * from "./CustomFontAxis";
+export * from "./CustomFontBatchCreateResponse";
+export * from "./CustomFontBatchCreateResponseCreatedItem";
+export * from "./CustomFontBatchCreateResponseFailedItem";
+export * from "./CustomFontBatchDeleteResponse";
+export * from "./CustomFontBatchDeleteResponseDeletedItem";
+export * from "./CustomFontBatchDeleteResponseFailedItem";
+export * from "./CustomFontCreateResponse";
+export * from "./CustomFontFontDisplay";
+export * from "./CustomFontFormat";
+export * from "./CustomFonts";
+export * from "./CustomFontUpload";
+export * from "./CustomFontUploadFields";
export * from "./CustomRole";
export * from "./CustomRoleAuditLogItem";
export * from "./CustomRoleAuditLogItemEventSubType";
@@ -76,6 +159,7 @@ export * from "./Error_";
export * from "./ErrorCode";
export * from "./Field";
export * from "./FieldCreate";
+export * from "./FieldGroup";
export * from "./FieldType";
export * from "./FieldValidations";
export * from "./FieldValidationsAdditionalProperties";
@@ -92,12 +176,39 @@ export * from "./FormSubmissionTrigger";
export * from "./FormSubmissionTriggerPayload";
export * from "./FormSubmissionTriggerPayloadSchemaItem";
export * from "./FormSubmissionTriggerPayloadSchemaItemFieldType";
+export * from "./Goal";
+export * from "./GoalCategory";
+export * from "./GoalIntegrationSource";
+export * from "./GoalPerformanceDataPoint";
+export * from "./GoalPerformanceFilter";
+export * from "./GoalPerformanceResponse";
+export * from "./GoalScope";
+export * from "./GoalsResponse";
+export * from "./GoalType";
+export * from "./GoalValueType";
+export * from "./GoogleTagId";
+export * from "./GoogleTagIds";
export * from "./ImageNode";
export * from "./ImageNodeImage";
+export * from "./InsertCollectionItem";
+export * from "./InsertCollectionItemFieldData";
+export * from "./InsertedCollectionItem";
+export * from "./InsertedCollectionItemFieldData";
export * from "./InvalidDomain";
export * from "./InvalidScopes";
export * from "./InventoryItem";
export * from "./InventoryItemInventoryType";
+export * from "./Invited";
+export * from "./InviteWorkspaceMemberRequestBody";
+export * from "./InviteWorkspaceMemberRequestBodyDefaultSiteRoleDefaultSiteRole";
+export * from "./InviteWorkspaceMemberRequestBodyDefaultSiteRoleWorkspaceRole";
+export * from "./InviteWorkspaceMemberRequestBodyEmailSiteAccessItem";
+export * from "./InviteWorkspaceMemberRequestBodyEmailSiteAccessItemSiteRole";
+export * from "./InviteWorkspaceMemberRequestBodyOneSiteAccessItem";
+export * from "./InviteWorkspaceMemberRequestBodyOneSiteAccessItemSiteRole";
+export * from "./InviteWorkspaceMemberRequestBodyOneWorkspaceRole";
+export * from "./InviteWorkspaceMemberResponseBody";
+export * from "./InviteWorkspaceMemberResponseBodyActive";
export * from "./ItemsListItemsLiveRequestCreatedOn";
export * from "./ItemsListItemsLiveRequestLastPublished";
export * from "./ItemsListItemsLiveRequestLastUpdated";
@@ -114,6 +225,44 @@ export * from "./NoDomains";
export * from "./Node";
export * from "./NotEnterprisePlanSite";
export * from "./NotEnterprisePlanWorkspace";
+export * from "./Optimization";
+export * from "./OptimizationAudienceInsightsResponse";
+export * from "./OptimizationDimensionsResponse";
+export * from "./OptimizationDimensionValuesResponse";
+export * from "./OptimizationGoalsResponse";
+export * from "./OptimizationInterval";
+export * from "./OptimizationListResponse";
+export * from "./OptimizationStatus";
+export * from "./OptimizationSummaryResponse";
+export * from "./OptimizationTrendResponse";
+export * from "./OptimizationType";
+export * from "./OptimizeAppliedFilter";
+export * from "./OptimizeAppliedFilterEntry";
+export * from "./OptimizeAudienceSegment";
+export * from "./OptimizeAudienceVariation";
+export * from "./OptimizeCurrentGoal";
+export * from "./OptimizeDimension";
+export * from "./OptimizeDimensionValue";
+export * from "./OptimizeFilter";
+export * from "./OptimizeFilterOperators";
+export * from "./OptimizeGoal";
+export * from "./OptimizeGoalCountingMethod";
+export * from "./OptimizeGoalMetricType";
+export * from "./OptimizeGoalScope";
+export * from "./OptimizeGoalSource";
+export * from "./OptimizeNonWebflowSiteResource";
+export * from "./OptimizeReference";
+export * from "./OptimizeReferenceListResponse";
+export * from "./OptimizeReferenceResource";
+export * from "./OptimizeReportGoal";
+export * from "./OptimizeReportIntervalEnd";
+export * from "./OptimizeReportIntervalStart";
+export * from "./OptimizeTrendDirection";
+export * from "./OptimizeTrendGranularity";
+export * from "./OptimizeTrendPoint";
+export * from "./OptimizeVariationComparison";
+export * from "./OptimizeVariationResult";
+export * from "./OptimizeWebflowSiteResource";
export * from "./OptionField";
export * from "./Order";
export * from "./OrderAddress";
@@ -144,6 +293,11 @@ export * from "./PageCreatedWebhook";
export * from "./PageCreatedWebhookPayload";
export * from "./PageDeletedWebhook";
export * from "./PageDeletedWebhookPayload";
+export * from "./PageFlowDirection";
+export * from "./PageFlowFilter";
+export * from "./PageFlowMetricScope";
+export * from "./PageFlowResponse";
+export * from "./PageFlowRow";
export * from "./PageList";
export * from "./PageMetadataUpdatedWebhook";
export * from "./PageMetadataUpdatedWebhookPayload";
@@ -153,6 +307,7 @@ export * from "./Pagination";
export * from "./Payload";
export * from "./PayloadFieldData";
export * from "./PaypalDetails";
+export * from "./PersonActor";
export * from "./Product";
export * from "./ProductAndSkUs";
export * from "./ProductAndSkUsList";
@@ -172,6 +327,9 @@ export * from "./ScriptApply";
export * from "./ScriptApplyList";
export * from "./ScriptApplyLocation";
export * from "./Scripts";
+export * from "./ScrollDepthDataPoint";
+export * from "./ScrollDepthFilter";
+export * from "./ScrollDepthResponse";
export * from "./SearchButtonNode";
export * from "./SearchButtonNodeWrite";
export * from "./Select";
@@ -184,19 +342,28 @@ export * from "./SingleLocaleCreatedPayload";
export * from "./SingleLocaleCreatedPayloadFieldData";
export * from "./Site";
export * from "./SiteActivityLogItem";
+export * from "./SiteActivityLogItemActorType";
export * from "./SiteActivityLogItemEvent";
export * from "./SiteActivityLogItemResourceOperation";
+export * from "./SiteActivityLogItemSource";
export * from "./SiteActivityLogItemUser";
export * from "./SiteActivityLogResponse";
export * from "./SiteDataCollectionType";
+export * from "./SiteMember";
+export * from "./SiteMemberRoles";
+export * from "./SiteMemberRolesSite";
+export * from "./SiteMemberRolesWorkspace";
export * from "./SiteMembership";
export * from "./SiteMembershipAuditLogItem";
export * from "./SiteMembershipAuditLogItemEventSubType";
+export * from "./SiteMembersResponse";
+export * from "./SiteMembersResponsePagination";
export * from "./SitePlan";
export * from "./SitePlanId";
export * from "./SitePlanName";
export * from "./SitePublish";
export * from "./SitePublishPayload";
+export * from "./SitePublishPayloadPublishScope";
export * from "./Sites";
export * from "./Sku";
export * from "./SkuFieldData";
@@ -224,17 +391,48 @@ export * from "./TextInputNodeWrite";
export * from "./TextNode";
export * from "./TextNodeText";
export * from "./TextNodeWrite";
+export * from "./TimeOnPageDataPoint";
+export * from "./TimeOnPageFilter";
+export * from "./TimeOnPageGranularityPeriod";
+export * from "./TimeOnPageMetricScope";
+export * from "./TimeOnPageResponse";
+export * from "./TimeOnPageTimeseriesQuery";
+export * from "./TokenActor";
+export * from "./TopDimensionsDimension";
+export * from "./TopDimensionsFilter";
+export * from "./TopDimensionsMetricScope";
+export * from "./TopDimensionsResponse";
+export * from "./TopDimensionsRow";
+export * from "./TopEventsCmsContextEntry";
+export * from "./TopEventsComponentContextEntry";
+export * from "./TopEventsFilter";
+export * from "./TopEventsResponse";
+export * from "./TopEventsRow";
+export * from "./TopEventsTimeseriesPoint";
+export * from "./TopPagesFilter";
+export * from "./TopPagesResponse";
+export * from "./TopPagesRow";
+export * from "./TopPagesSortBy";
+export * from "./TopPagesTimeseriesPoint";
+export * from "./TrafficDataPoint";
+export * from "./TrafficFilter";
+export * from "./TrafficMetricScope";
+export * from "./TrafficResponse";
export * from "./TriggerType";
export * from "./UpdatedOrder";
+export * from "./UpdateSiteMemberRoleRequestBody";
+export * from "./UpdateSiteMemberRoleRequestBodySiteRole";
export * from "./UserAccess";
export * from "./UserAccessAuditLogItem";
export * from "./UserAccessAuditLogItemEventSubType";
export * from "./Webhook";
export * from "./WebhookFilter";
export * from "./WebhookList";
+export * from "./WithDefaultSiteRole";
+export * from "./WithSiteAccess";
+export * from "./Workspace";
+export * from "./WorkspaceAuditLogActor";
export * from "./WorkspaceAuditLogItem";
-export * from "./WorkspaceAuditLogItemActor";
-export * from "./WorkspaceAuditLogItemPayloadSettingChangeMethod";
export * from "./WorkspaceAuditLogItemPayloadSiteMembershipGranularAccess";
export * from "./WorkspaceAuditLogItemPayloadSiteMembershipMethod";
export * from "./WorkspaceAuditLogItemPayloadSiteMembershipSite";
@@ -250,9 +448,27 @@ export * from "./WorkspaceAuditLogItemPayloadWorkspaceMembershipTargetUser";
export * from "./WorkspaceAuditLogItemPayloadWorkspaceMembershipUserType";
export * from "./WorkspaceAuditLogItemWorkspace";
export * from "./WorkspaceAuditLogResponse";
+export * from "./WorkspaceBulkRoleChangeResponse";
+export * from "./WorkspaceBulkRoleChangeResponseResultsItem";
+export * from "./WorkspaceBulkRoleChangeResponseResultsItemError";
+export * from "./WorkspaceBulkRoleChangeResponseResultsItemErrorCode";
+export * from "./WorkspaceBulkRoleChangeResponseResultsItemOutcome";
+export * from "./WorkspaceBulkRoleChangeResponseResultsItemType";
+export * from "./WorkspaceBulkRoleChangeResponseSummary";
export * from "./WorkspaceInvitation";
export * from "./WorkspaceInvitationAuditLogItem";
export * from "./WorkspaceInvitationAuditLogItemEventSubType";
+export * from "./WorkspaceInvite";
+export * from "./WorkspaceInviteDefaultSiteRole";
+export * from "./WorkspaceInviteRole";
+export * from "./WorkspaceInviteStatus";
+export * from "./WorkspaceMember";
+export * from "./WorkspaceMemberRoles";
+export * from "./WorkspaceMemberRolesSite";
+export * from "./WorkspaceMemberRolesWorkspace";
export * from "./WorkspaceMembership";
export * from "./WorkspaceMembershipAuditLogItem";
export * from "./WorkspaceMembershipAuditLogItemEventSubType";
+export * from "./WorkspaceMembersResponse";
+export * from "./WorkspaceMembersResponsePagination";
+export * from "./Workspaces";
diff --git a/src/serialization/resources/analyze/index.ts b/src/serialization/resources/analyze/index.ts
new file mode 100644
index 00000000..3e5335fe
--- /dev/null
+++ b/src/serialization/resources/analyze/index.ts
@@ -0,0 +1 @@
+export * from "./resources";
diff --git a/src/serialization/resources/analyze/resources/goals/index.ts b/src/serialization/resources/analyze/resources/goals/index.ts
new file mode 100644
index 00000000..eea524d6
--- /dev/null
+++ b/src/serialization/resources/analyze/resources/goals/index.ts
@@ -0,0 +1 @@
+export * from "./types";
diff --git a/src/serialization/resources/analyze/resources/goals/types/GoalsGoalPerformanceRequestDeviceType.ts b/src/serialization/resources/analyze/resources/goals/types/GoalsGoalPerformanceRequestDeviceType.ts
new file mode 100644
index 00000000..dedaa846
--- /dev/null
+++ b/src/serialization/resources/analyze/resources/goals/types/GoalsGoalPerformanceRequestDeviceType.ts
@@ -0,0 +1,14 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../../../../../api/index";
+import * as core from "../../../../../../core";
+import type * as serializers from "../../../../../index";
+
+export const GoalsGoalPerformanceRequestDeviceType: core.serialization.Schema<
+ serializers.analyze.GoalsGoalPerformanceRequestDeviceType.Raw,
+ Webflow.analyze.GoalsGoalPerformanceRequestDeviceType
+> = core.serialization.enum_(["desktop", "mobile", "tablet"]);
+
+export declare namespace GoalsGoalPerformanceRequestDeviceType {
+ export type Raw = "desktop" | "mobile" | "tablet";
+}
diff --git a/src/serialization/resources/analyze/resources/goals/types/index.ts b/src/serialization/resources/analyze/resources/goals/types/index.ts
new file mode 100644
index 00000000..687f9638
--- /dev/null
+++ b/src/serialization/resources/analyze/resources/goals/types/index.ts
@@ -0,0 +1 @@
+export * from "./GoalsGoalPerformanceRequestDeviceType";
diff --git a/src/serialization/resources/analyze/resources/index.ts b/src/serialization/resources/analyze/resources/index.ts
new file mode 100644
index 00000000..d251e4c5
--- /dev/null
+++ b/src/serialization/resources/analyze/resources/index.ts
@@ -0,0 +1,4 @@
+export * as goals from "./goals";
+export * from "./goals/types";
+export * as reports from "./reports";
+export * from "./reports/types";
diff --git a/src/serialization/resources/analyze/resources/reports/index.ts b/src/serialization/resources/analyze/resources/reports/index.ts
new file mode 100644
index 00000000..eea524d6
--- /dev/null
+++ b/src/serialization/resources/analyze/resources/reports/index.ts
@@ -0,0 +1 @@
+export * from "./types";
diff --git a/src/serialization/resources/analyze/resources/reports/types/ReportsBrowserWindowHeightRequestDeviceType.ts b/src/serialization/resources/analyze/resources/reports/types/ReportsBrowserWindowHeightRequestDeviceType.ts
new file mode 100644
index 00000000..52052d7c
--- /dev/null
+++ b/src/serialization/resources/analyze/resources/reports/types/ReportsBrowserWindowHeightRequestDeviceType.ts
@@ -0,0 +1,14 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../../../../../api/index";
+import * as core from "../../../../../../core";
+import type * as serializers from "../../../../../index";
+
+export const ReportsBrowserWindowHeightRequestDeviceType: core.serialization.Schema<
+ serializers.analyze.ReportsBrowserWindowHeightRequestDeviceType.Raw,
+ Webflow.analyze.ReportsBrowserWindowHeightRequestDeviceType
+> = core.serialization.enum_(["desktop", "mobile", "tablet"]);
+
+export declare namespace ReportsBrowserWindowHeightRequestDeviceType {
+ export type Raw = "desktop" | "mobile" | "tablet";
+}
diff --git a/src/serialization/resources/analyze/resources/reports/types/ReportsPageFlowRequestDeviceType.ts b/src/serialization/resources/analyze/resources/reports/types/ReportsPageFlowRequestDeviceType.ts
new file mode 100644
index 00000000..1f84ed7b
--- /dev/null
+++ b/src/serialization/resources/analyze/resources/reports/types/ReportsPageFlowRequestDeviceType.ts
@@ -0,0 +1,14 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../../../../../api/index";
+import * as core from "../../../../../../core";
+import type * as serializers from "../../../../../index";
+
+export const ReportsPageFlowRequestDeviceType: core.serialization.Schema<
+ serializers.analyze.ReportsPageFlowRequestDeviceType.Raw,
+ Webflow.analyze.ReportsPageFlowRequestDeviceType
+> = core.serialization.enum_(["desktop", "mobile", "tablet"]);
+
+export declare namespace ReportsPageFlowRequestDeviceType {
+ export type Raw = "desktop" | "mobile" | "tablet";
+}
diff --git a/src/serialization/resources/analyze/resources/reports/types/ReportsScrollDepthRequestDeviceType.ts b/src/serialization/resources/analyze/resources/reports/types/ReportsScrollDepthRequestDeviceType.ts
new file mode 100644
index 00000000..6acf2bfd
--- /dev/null
+++ b/src/serialization/resources/analyze/resources/reports/types/ReportsScrollDepthRequestDeviceType.ts
@@ -0,0 +1,14 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../../../../../api/index";
+import * as core from "../../../../../../core";
+import type * as serializers from "../../../../../index";
+
+export const ReportsScrollDepthRequestDeviceType: core.serialization.Schema<
+ serializers.analyze.ReportsScrollDepthRequestDeviceType.Raw,
+ Webflow.analyze.ReportsScrollDepthRequestDeviceType
+> = core.serialization.enum_(["desktop", "mobile", "tablet"]);
+
+export declare namespace ReportsScrollDepthRequestDeviceType {
+ export type Raw = "desktop" | "mobile" | "tablet";
+}
diff --git a/src/serialization/resources/analyze/resources/reports/types/ReportsTimeOnPageRequestDeviceType.ts b/src/serialization/resources/analyze/resources/reports/types/ReportsTimeOnPageRequestDeviceType.ts
new file mode 100644
index 00000000..21c99f93
--- /dev/null
+++ b/src/serialization/resources/analyze/resources/reports/types/ReportsTimeOnPageRequestDeviceType.ts
@@ -0,0 +1,14 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../../../../../api/index";
+import * as core from "../../../../../../core";
+import type * as serializers from "../../../../../index";
+
+export const ReportsTimeOnPageRequestDeviceType: core.serialization.Schema<
+ serializers.analyze.ReportsTimeOnPageRequestDeviceType.Raw,
+ Webflow.analyze.ReportsTimeOnPageRequestDeviceType
+> = core.serialization.enum_(["desktop", "mobile", "tablet"]);
+
+export declare namespace ReportsTimeOnPageRequestDeviceType {
+ export type Raw = "desktop" | "mobile" | "tablet";
+}
diff --git a/src/serialization/resources/analyze/resources/reports/types/ReportsTopDimensionsRequestDeviceType.ts b/src/serialization/resources/analyze/resources/reports/types/ReportsTopDimensionsRequestDeviceType.ts
new file mode 100644
index 00000000..1de33c6e
--- /dev/null
+++ b/src/serialization/resources/analyze/resources/reports/types/ReportsTopDimensionsRequestDeviceType.ts
@@ -0,0 +1,14 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../../../../../api/index";
+import * as core from "../../../../../../core";
+import type * as serializers from "../../../../../index";
+
+export const ReportsTopDimensionsRequestDeviceType: core.serialization.Schema<
+ serializers.analyze.ReportsTopDimensionsRequestDeviceType.Raw,
+ Webflow.analyze.ReportsTopDimensionsRequestDeviceType
+> = core.serialization.enum_(["desktop", "mobile", "tablet"]);
+
+export declare namespace ReportsTopDimensionsRequestDeviceType {
+ export type Raw = "desktop" | "mobile" | "tablet";
+}
diff --git a/src/serialization/resources/analyze/resources/reports/types/ReportsTopEventsRequestDeviceType.ts b/src/serialization/resources/analyze/resources/reports/types/ReportsTopEventsRequestDeviceType.ts
new file mode 100644
index 00000000..567df47a
--- /dev/null
+++ b/src/serialization/resources/analyze/resources/reports/types/ReportsTopEventsRequestDeviceType.ts
@@ -0,0 +1,14 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../../../../../api/index";
+import * as core from "../../../../../../core";
+import type * as serializers from "../../../../../index";
+
+export const ReportsTopEventsRequestDeviceType: core.serialization.Schema<
+ serializers.analyze.ReportsTopEventsRequestDeviceType.Raw,
+ Webflow.analyze.ReportsTopEventsRequestDeviceType
+> = core.serialization.enum_(["desktop", "mobile", "tablet"]);
+
+export declare namespace ReportsTopEventsRequestDeviceType {
+ export type Raw = "desktop" | "mobile" | "tablet";
+}
diff --git a/src/serialization/resources/analyze/resources/reports/types/ReportsTopPagesRequestDeviceType.ts b/src/serialization/resources/analyze/resources/reports/types/ReportsTopPagesRequestDeviceType.ts
new file mode 100644
index 00000000..880cb883
--- /dev/null
+++ b/src/serialization/resources/analyze/resources/reports/types/ReportsTopPagesRequestDeviceType.ts
@@ -0,0 +1,14 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../../../../../api/index";
+import * as core from "../../../../../../core";
+import type * as serializers from "../../../../../index";
+
+export const ReportsTopPagesRequestDeviceType: core.serialization.Schema<
+ serializers.analyze.ReportsTopPagesRequestDeviceType.Raw,
+ Webflow.analyze.ReportsTopPagesRequestDeviceType
+> = core.serialization.enum_(["desktop", "mobile", "tablet"]);
+
+export declare namespace ReportsTopPagesRequestDeviceType {
+ export type Raw = "desktop" | "mobile" | "tablet";
+}
diff --git a/src/serialization/resources/analyze/resources/reports/types/ReportsTrafficRequestDeviceType.ts b/src/serialization/resources/analyze/resources/reports/types/ReportsTrafficRequestDeviceType.ts
new file mode 100644
index 00000000..b4ed49fa
--- /dev/null
+++ b/src/serialization/resources/analyze/resources/reports/types/ReportsTrafficRequestDeviceType.ts
@@ -0,0 +1,14 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../../../../../api/index";
+import * as core from "../../../../../../core";
+import type * as serializers from "../../../../../index";
+
+export const ReportsTrafficRequestDeviceType: core.serialization.Schema<
+ serializers.analyze.ReportsTrafficRequestDeviceType.Raw,
+ Webflow.analyze.ReportsTrafficRequestDeviceType
+> = core.serialization.enum_(["desktop", "mobile", "tablet"]);
+
+export declare namespace ReportsTrafficRequestDeviceType {
+ export type Raw = "desktop" | "mobile" | "tablet";
+}
diff --git a/src/serialization/resources/analyze/resources/reports/types/index.ts b/src/serialization/resources/analyze/resources/reports/types/index.ts
new file mode 100644
index 00000000..75377b8c
--- /dev/null
+++ b/src/serialization/resources/analyze/resources/reports/types/index.ts
@@ -0,0 +1,8 @@
+export * from "./ReportsBrowserWindowHeightRequestDeviceType";
+export * from "./ReportsPageFlowRequestDeviceType";
+export * from "./ReportsScrollDepthRequestDeviceType";
+export * from "./ReportsTimeOnPageRequestDeviceType";
+export * from "./ReportsTopDimensionsRequestDeviceType";
+export * from "./ReportsTopEventsRequestDeviceType";
+export * from "./ReportsTopPagesRequestDeviceType";
+export * from "./ReportsTrafficRequestDeviceType";
diff --git a/src/serialization/resources/collections/client/requests/PatchCollectionRequest.ts b/src/serialization/resources/collections/client/requests/PatchCollectionRequest.ts
new file mode 100644
index 00000000..083145db
--- /dev/null
+++ b/src/serialization/resources/collections/client/requests/PatchCollectionRequest.ts
@@ -0,0 +1,25 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../../../../api/index";
+import * as core from "../../../../../core";
+import type * as serializers from "../../../../index";
+import { FieldGroup } from "../../../../types/FieldGroup";
+
+export const PatchCollectionRequest: core.serialization.Schema<
+ serializers.PatchCollectionRequest.Raw,
+ Webflow.PatchCollectionRequest
+> = core.serialization.object({
+ displayName: core.serialization.string().optional(),
+ singularName: core.serialization.string().optional(),
+ slug: core.serialization.string().optional(),
+ fieldGroups: core.serialization.list(FieldGroup).optional(),
+});
+
+export declare namespace PatchCollectionRequest {
+ export interface Raw {
+ displayName?: string | null;
+ singularName?: string | null;
+ slug?: string | null;
+ fieldGroups?: FieldGroup.Raw[] | null;
+ }
+}
diff --git a/src/serialization/resources/collections/client/requests/index.ts b/src/serialization/resources/collections/client/requests/index.ts
index 1694555b..2a30124e 100644
--- a/src/serialization/resources/collections/client/requests/index.ts
+++ b/src/serialization/resources/collections/client/requests/index.ts
@@ -1 +1,2 @@
export { CollectionsCreateRequest } from "./CollectionsCreateRequest";
+export { PatchCollectionRequest } from "./PatchCollectionRequest";
diff --git a/src/serialization/resources/collections/resources/items/client/requests/InsertCollectionItemsRequestBody.ts b/src/serialization/resources/collections/resources/items/client/requests/InsertCollectionItemsRequestBody.ts
new file mode 100644
index 00000000..191154e1
--- /dev/null
+++ b/src/serialization/resources/collections/resources/items/client/requests/InsertCollectionItemsRequestBody.ts
@@ -0,0 +1,19 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../../../../../../api/index";
+import * as core from "../../../../../../../core";
+import type * as serializers from "../../../../../../index";
+import { InsertCollectionItem } from "../../../../../../types/InsertCollectionItem";
+
+export const InsertCollectionItemsRequestBody: core.serialization.Schema<
+ serializers.collections.InsertCollectionItemsRequestBody.Raw,
+ Omit
+> = core.serialization.object({
+ items: core.serialization.list(InsertCollectionItem),
+});
+
+export declare namespace InsertCollectionItemsRequestBody {
+ export interface Raw {
+ items: InsertCollectionItem.Raw[];
+ }
+}
diff --git a/src/serialization/resources/collections/resources/items/client/requests/index.ts b/src/serialization/resources/collections/resources/items/client/requests/index.ts
index 1db833c1..c4e66f24 100644
--- a/src/serialization/resources/collections/resources/items/client/requests/index.ts
+++ b/src/serialization/resources/collections/resources/items/client/requests/index.ts
@@ -1,4 +1,5 @@
export { CreateBulkCollectionItemRequestBody } from "./CreateBulkCollectionItemRequestBody";
+export { InsertCollectionItemsRequestBody } from "./InsertCollectionItemsRequestBody";
export { ItemsDeleteItemsLiveRequest } from "./ItemsDeleteItemsLiveRequest";
export { ItemsDeleteItemsRequest } from "./ItemsDeleteItemsRequest";
export { ItemsUpdateItemsLiveRequest } from "./ItemsUpdateItemsLiveRequest";
diff --git a/src/serialization/resources/collections/resources/items/types/ItemsInsertItemsResponse.ts b/src/serialization/resources/collections/resources/items/types/ItemsInsertItemsResponse.ts
new file mode 100644
index 00000000..50a3e831
--- /dev/null
+++ b/src/serialization/resources/collections/resources/items/types/ItemsInsertItemsResponse.ts
@@ -0,0 +1,19 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../../../../../api/index";
+import * as core from "../../../../../../core";
+import type * as serializers from "../../../../../index";
+import { InsertedCollectionItem } from "../../../../../types/InsertedCollectionItem";
+
+export const ItemsInsertItemsResponse: core.serialization.ObjectSchema<
+ serializers.collections.ItemsInsertItemsResponse.Raw,
+ Webflow.collections.ItemsInsertItemsResponse
+> = core.serialization.object({
+ items: core.serialization.list(InsertedCollectionItem),
+});
+
+export declare namespace ItemsInsertItemsResponse {
+ export interface Raw {
+ items: InsertedCollectionItem.Raw[];
+ }
+}
diff --git a/src/serialization/resources/collections/resources/items/types/ItemsListItemsLiveRequestFilterValue.ts b/src/serialization/resources/collections/resources/items/types/ItemsListItemsLiveRequestFilterValue.ts
new file mode 100644
index 00000000..15426b8c
--- /dev/null
+++ b/src/serialization/resources/collections/resources/items/types/ItemsListItemsLiveRequestFilterValue.ts
@@ -0,0 +1,41 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../../../../../api/index";
+import * as core from "../../../../../../core";
+import type * as serializers from "../../../../../index";
+import { ItemsListItemsLiveRequestFilterValueExists } from "./ItemsListItemsLiveRequestFilterValueExists";
+import { ItemsListItemsLiveRequestFilterValueIn } from "./ItemsListItemsLiveRequestFilterValueIn";
+import { ItemsListItemsLiveRequestFilterValueNin } from "./ItemsListItemsLiveRequestFilterValueNin";
+
+export const ItemsListItemsLiveRequestFilterValue: core.serialization.ObjectSchema<
+ serializers.collections.ItemsListItemsLiveRequestFilterValue.Raw,
+ Webflow.collections.ItemsListItemsLiveRequestFilterValue
+> = core.serialization.object({
+ eq: core.serialization.string().optional(),
+ ne: core.serialization.string().optional(),
+ gt: core.serialization.string().optional(),
+ gte: core.serialization.string().optional(),
+ lt: core.serialization.string().optional(),
+ lte: core.serialization.string().optional(),
+ in: ItemsListItemsLiveRequestFilterValueIn.optional(),
+ nin: ItemsListItemsLiveRequestFilterValueNin.optional(),
+ contains: core.serialization.string().optional(),
+ ncontains: core.serialization.string().optional(),
+ exists: ItemsListItemsLiveRequestFilterValueExists.optional(),
+});
+
+export declare namespace ItemsListItemsLiveRequestFilterValue {
+ export interface Raw {
+ eq?: string | null;
+ ne?: string | null;
+ gt?: string | null;
+ gte?: string | null;
+ lt?: string | null;
+ lte?: string | null;
+ in?: ItemsListItemsLiveRequestFilterValueIn.Raw | null;
+ nin?: ItemsListItemsLiveRequestFilterValueNin.Raw | null;
+ contains?: string | null;
+ ncontains?: string | null;
+ exists?: ItemsListItemsLiveRequestFilterValueExists.Raw | null;
+ }
+}
diff --git a/src/serialization/resources/collections/resources/items/types/ItemsListItemsLiveRequestFilterValueExists.ts b/src/serialization/resources/collections/resources/items/types/ItemsListItemsLiveRequestFilterValueExists.ts
new file mode 100644
index 00000000..a9d9b286
--- /dev/null
+++ b/src/serialization/resources/collections/resources/items/types/ItemsListItemsLiveRequestFilterValueExists.ts
@@ -0,0 +1,14 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../../../../../api/index";
+import * as core from "../../../../../../core";
+import type * as serializers from "../../../../../index";
+
+export const ItemsListItemsLiveRequestFilterValueExists: core.serialization.Schema<
+ serializers.collections.ItemsListItemsLiveRequestFilterValueExists.Raw,
+ Webflow.collections.ItemsListItemsLiveRequestFilterValueExists
+> = core.serialization.enum_(["true", "false"]);
+
+export declare namespace ItemsListItemsLiveRequestFilterValueExists {
+ export type Raw = "true" | "false";
+}
diff --git a/src/serialization/resources/collections/resources/items/types/ItemsListItemsLiveRequestFilterValueIn.ts b/src/serialization/resources/collections/resources/items/types/ItemsListItemsLiveRequestFilterValueIn.ts
new file mode 100644
index 00000000..b2d3d0c2
--- /dev/null
+++ b/src/serialization/resources/collections/resources/items/types/ItemsListItemsLiveRequestFilterValueIn.ts
@@ -0,0 +1,17 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../../../../../api/index";
+import * as core from "../../../../../../core";
+import type * as serializers from "../../../../../index";
+
+export const ItemsListItemsLiveRequestFilterValueIn: core.serialization.Schema<
+ serializers.collections.ItemsListItemsLiveRequestFilterValueIn.Raw,
+ Webflow.collections.ItemsListItemsLiveRequestFilterValueIn
+> = core.serialization.undiscriminatedUnion([
+ core.serialization.string(),
+ core.serialization.list(core.serialization.string()),
+]);
+
+export declare namespace ItemsListItemsLiveRequestFilterValueIn {
+ export type Raw = string | string[];
+}
diff --git a/src/serialization/resources/collections/resources/items/types/ItemsListItemsLiveRequestFilterValueNin.ts b/src/serialization/resources/collections/resources/items/types/ItemsListItemsLiveRequestFilterValueNin.ts
new file mode 100644
index 00000000..f46927ca
--- /dev/null
+++ b/src/serialization/resources/collections/resources/items/types/ItemsListItemsLiveRequestFilterValueNin.ts
@@ -0,0 +1,17 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../../../../../api/index";
+import * as core from "../../../../../../core";
+import type * as serializers from "../../../../../index";
+
+export const ItemsListItemsLiveRequestFilterValueNin: core.serialization.Schema<
+ serializers.collections.ItemsListItemsLiveRequestFilterValueNin.Raw,
+ Webflow.collections.ItemsListItemsLiveRequestFilterValueNin
+> = core.serialization.undiscriminatedUnion([
+ core.serialization.string(),
+ core.serialization.list(core.serialization.string()),
+]);
+
+export declare namespace ItemsListItemsLiveRequestFilterValueNin {
+ export type Raw = string | string[];
+}
diff --git a/src/serialization/resources/collections/resources/items/types/ItemsListItemsLiveRequestSortValue.ts b/src/serialization/resources/collections/resources/items/types/ItemsListItemsLiveRequestSortValue.ts
new file mode 100644
index 00000000..38efd5d9
--- /dev/null
+++ b/src/serialization/resources/collections/resources/items/types/ItemsListItemsLiveRequestSortValue.ts
@@ -0,0 +1,14 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../../../../../api/index";
+import * as core from "../../../../../../core";
+import type * as serializers from "../../../../../index";
+
+export const ItemsListItemsLiveRequestSortValue: core.serialization.Schema<
+ serializers.collections.ItemsListItemsLiveRequestSortValue.Raw,
+ Webflow.collections.ItemsListItemsLiveRequestSortValue
+> = core.serialization.enum_(["asc", "desc"]);
+
+export declare namespace ItemsListItemsLiveRequestSortValue {
+ export type Raw = "asc" | "desc";
+}
diff --git a/src/serialization/resources/collections/resources/items/types/ItemsListItemsRequestFilterValue.ts b/src/serialization/resources/collections/resources/items/types/ItemsListItemsRequestFilterValue.ts
new file mode 100644
index 00000000..6c6c034e
--- /dev/null
+++ b/src/serialization/resources/collections/resources/items/types/ItemsListItemsRequestFilterValue.ts
@@ -0,0 +1,41 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../../../../../api/index";
+import * as core from "../../../../../../core";
+import type * as serializers from "../../../../../index";
+import { ItemsListItemsRequestFilterValueExists } from "./ItemsListItemsRequestFilterValueExists";
+import { ItemsListItemsRequestFilterValueIn } from "./ItemsListItemsRequestFilterValueIn";
+import { ItemsListItemsRequestFilterValueNin } from "./ItemsListItemsRequestFilterValueNin";
+
+export const ItemsListItemsRequestFilterValue: core.serialization.ObjectSchema<
+ serializers.collections.ItemsListItemsRequestFilterValue.Raw,
+ Webflow.collections.ItemsListItemsRequestFilterValue
+> = core.serialization.object({
+ eq: core.serialization.string().optional(),
+ ne: core.serialization.string().optional(),
+ gt: core.serialization.string().optional(),
+ gte: core.serialization.string().optional(),
+ lt: core.serialization.string().optional(),
+ lte: core.serialization.string().optional(),
+ in: ItemsListItemsRequestFilterValueIn.optional(),
+ nin: ItemsListItemsRequestFilterValueNin.optional(),
+ contains: core.serialization.string().optional(),
+ ncontains: core.serialization.string().optional(),
+ exists: ItemsListItemsRequestFilterValueExists.optional(),
+});
+
+export declare namespace ItemsListItemsRequestFilterValue {
+ export interface Raw {
+ eq?: string | null;
+ ne?: string | null;
+ gt?: string | null;
+ gte?: string | null;
+ lt?: string | null;
+ lte?: string | null;
+ in?: ItemsListItemsRequestFilterValueIn.Raw | null;
+ nin?: ItemsListItemsRequestFilterValueNin.Raw | null;
+ contains?: string | null;
+ ncontains?: string | null;
+ exists?: ItemsListItemsRequestFilterValueExists.Raw | null;
+ }
+}
diff --git a/src/serialization/resources/collections/resources/items/types/ItemsListItemsRequestFilterValueExists.ts b/src/serialization/resources/collections/resources/items/types/ItemsListItemsRequestFilterValueExists.ts
new file mode 100644
index 00000000..996b5ba0
--- /dev/null
+++ b/src/serialization/resources/collections/resources/items/types/ItemsListItemsRequestFilterValueExists.ts
@@ -0,0 +1,14 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../../../../../api/index";
+import * as core from "../../../../../../core";
+import type * as serializers from "../../../../../index";
+
+export const ItemsListItemsRequestFilterValueExists: core.serialization.Schema<
+ serializers.collections.ItemsListItemsRequestFilterValueExists.Raw,
+ Webflow.collections.ItemsListItemsRequestFilterValueExists
+> = core.serialization.enum_(["true", "false"]);
+
+export declare namespace ItemsListItemsRequestFilterValueExists {
+ export type Raw = "true" | "false";
+}
diff --git a/src/serialization/resources/collections/resources/items/types/ItemsListItemsRequestFilterValueIn.ts b/src/serialization/resources/collections/resources/items/types/ItemsListItemsRequestFilterValueIn.ts
new file mode 100644
index 00000000..48b867e2
--- /dev/null
+++ b/src/serialization/resources/collections/resources/items/types/ItemsListItemsRequestFilterValueIn.ts
@@ -0,0 +1,17 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../../../../../api/index";
+import * as core from "../../../../../../core";
+import type * as serializers from "../../../../../index";
+
+export const ItemsListItemsRequestFilterValueIn: core.serialization.Schema<
+ serializers.collections.ItemsListItemsRequestFilterValueIn.Raw,
+ Webflow.collections.ItemsListItemsRequestFilterValueIn
+> = core.serialization.undiscriminatedUnion([
+ core.serialization.string(),
+ core.serialization.list(core.serialization.string()),
+]);
+
+export declare namespace ItemsListItemsRequestFilterValueIn {
+ export type Raw = string | string[];
+}
diff --git a/src/serialization/resources/collections/resources/items/types/ItemsListItemsRequestFilterValueNin.ts b/src/serialization/resources/collections/resources/items/types/ItemsListItemsRequestFilterValueNin.ts
new file mode 100644
index 00000000..9de5943f
--- /dev/null
+++ b/src/serialization/resources/collections/resources/items/types/ItemsListItemsRequestFilterValueNin.ts
@@ -0,0 +1,17 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../../../../../api/index";
+import * as core from "../../../../../../core";
+import type * as serializers from "../../../../../index";
+
+export const ItemsListItemsRequestFilterValueNin: core.serialization.Schema<
+ serializers.collections.ItemsListItemsRequestFilterValueNin.Raw,
+ Webflow.collections.ItemsListItemsRequestFilterValueNin
+> = core.serialization.undiscriminatedUnion([
+ core.serialization.string(),
+ core.serialization.list(core.serialization.string()),
+]);
+
+export declare namespace ItemsListItemsRequestFilterValueNin {
+ export type Raw = string | string[];
+}
diff --git a/src/serialization/resources/collections/resources/items/types/ItemsListItemsRequestSortValue.ts b/src/serialization/resources/collections/resources/items/types/ItemsListItemsRequestSortValue.ts
new file mode 100644
index 00000000..1a5aadd2
--- /dev/null
+++ b/src/serialization/resources/collections/resources/items/types/ItemsListItemsRequestSortValue.ts
@@ -0,0 +1,14 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../../../../../api/index";
+import * as core from "../../../../../../core";
+import type * as serializers from "../../../../../index";
+
+export const ItemsListItemsRequestSortValue: core.serialization.Schema<
+ serializers.collections.ItemsListItemsRequestSortValue.Raw,
+ Webflow.collections.ItemsListItemsRequestSortValue
+> = core.serialization.enum_(["asc", "desc"]);
+
+export declare namespace ItemsListItemsRequestSortValue {
+ export type Raw = "asc" | "desc";
+}
diff --git a/src/serialization/resources/collections/resources/items/types/index.ts b/src/serialization/resources/collections/resources/items/types/index.ts
index d9675efd..edf3ffdf 100644
--- a/src/serialization/resources/collections/resources/items/types/index.ts
+++ b/src/serialization/resources/collections/resources/items/types/index.ts
@@ -6,10 +6,21 @@ export * from "./ItemsCreateItemLiveRequestBody";
export * from "./ItemsCreateItemRequestBody";
export * from "./ItemsDeleteItemsLiveRequestItemsItem";
export * from "./ItemsDeleteItemsRequestItemsItem";
+export * from "./ItemsInsertItemsResponse";
+export * from "./ItemsListItemsLiveRequestFilterValue";
+export * from "./ItemsListItemsLiveRequestFilterValueExists";
+export * from "./ItemsListItemsLiveRequestFilterValueIn";
+export * from "./ItemsListItemsLiveRequestFilterValueNin";
export * from "./ItemsListItemsLiveRequestSortBy";
export * from "./ItemsListItemsLiveRequestSortOrder";
+export * from "./ItemsListItemsLiveRequestSortValue";
+export * from "./ItemsListItemsRequestFilterValue";
+export * from "./ItemsListItemsRequestFilterValueExists";
+export * from "./ItemsListItemsRequestFilterValueIn";
+export * from "./ItemsListItemsRequestFilterValueNin";
export * from "./ItemsListItemsRequestSortBy";
export * from "./ItemsListItemsRequestSortOrder";
+export * from "./ItemsListItemsRequestSortValue";
export * from "./ItemsPublishItemRequest";
export * from "./ItemsPublishItemRequestItemsItemsItem";
export * from "./ItemsPublishItemResponse";
diff --git a/src/serialization/resources/customFonts/client/index.ts b/src/serialization/resources/customFonts/client/index.ts
new file mode 100644
index 00000000..415726b7
--- /dev/null
+++ b/src/serialization/resources/customFonts/client/index.ts
@@ -0,0 +1 @@
+export * from "./requests";
diff --git a/src/serialization/resources/customFonts/client/requests/CustomFontBatchCreateRequest.ts b/src/serialization/resources/customFonts/client/requests/CustomFontBatchCreateRequest.ts
new file mode 100644
index 00000000..fc40ff74
--- /dev/null
+++ b/src/serialization/resources/customFonts/client/requests/CustomFontBatchCreateRequest.ts
@@ -0,0 +1,19 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../../../../api/index";
+import * as core from "../../../../../core";
+import type * as serializers from "../../../../index";
+import { CustomFontBatchCreateRequestItemsItem } from "../../types/CustomFontBatchCreateRequestItemsItem";
+
+export const CustomFontBatchCreateRequest: core.serialization.Schema<
+ serializers.CustomFontBatchCreateRequest.Raw,
+ Webflow.CustomFontBatchCreateRequest
+> = core.serialization.object({
+ items: core.serialization.list(CustomFontBatchCreateRequestItemsItem),
+});
+
+export declare namespace CustomFontBatchCreateRequest {
+ export interface Raw {
+ items: CustomFontBatchCreateRequestItemsItem.Raw[];
+ }
+}
diff --git a/src/serialization/resources/customFonts/client/requests/CustomFontBatchDeleteRequest.ts b/src/serialization/resources/customFonts/client/requests/CustomFontBatchDeleteRequest.ts
new file mode 100644
index 00000000..b3058d88
--- /dev/null
+++ b/src/serialization/resources/customFonts/client/requests/CustomFontBatchDeleteRequest.ts
@@ -0,0 +1,19 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../../../../api/index";
+import * as core from "../../../../../core";
+import type * as serializers from "../../../../index";
+import { CustomFontBatchDeleteRequestItemsItem } from "../../types/CustomFontBatchDeleteRequestItemsItem";
+
+export const CustomFontBatchDeleteRequest: core.serialization.Schema<
+ serializers.CustomFontBatchDeleteRequest.Raw,
+ Webflow.CustomFontBatchDeleteRequest
+> = core.serialization.object({
+ items: core.serialization.list(CustomFontBatchDeleteRequestItemsItem),
+});
+
+export declare namespace CustomFontBatchDeleteRequest {
+ export interface Raw {
+ items: CustomFontBatchDeleteRequestItemsItem.Raw[];
+ }
+}
diff --git a/src/serialization/resources/customFonts/client/requests/CustomFontsCreateRequest.ts b/src/serialization/resources/customFonts/client/requests/CustomFontsCreateRequest.ts
new file mode 100644
index 00000000..8c943c8b
--- /dev/null
+++ b/src/serialization/resources/customFonts/client/requests/CustomFontsCreateRequest.ts
@@ -0,0 +1,32 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../../../../api/index";
+import * as core from "../../../../../core";
+import type * as serializers from "../../../../index";
+import { CustomFontAxis } from "../../../../types/CustomFontAxis";
+import { CustomFontsCreateRequestFontDisplay } from "../../types/CustomFontsCreateRequestFontDisplay";
+
+export const CustomFontsCreateRequest: core.serialization.Schema<
+ serializers.CustomFontsCreateRequest.Raw,
+ Webflow.CustomFontsCreateRequest
+> = core.serialization.object({
+ fileName: core.serialization.string(),
+ fileHash: core.serialization.string(),
+ fontFamily: core.serialization.string(),
+ weight: core.serialization.number(),
+ italic: core.serialization.boolean(),
+ fontDisplay: CustomFontsCreateRequestFontDisplay,
+ axes: core.serialization.list(CustomFontAxis).optional(),
+});
+
+export declare namespace CustomFontsCreateRequest {
+ export interface Raw {
+ fileName: string;
+ fileHash: string;
+ fontFamily: string;
+ weight: number;
+ italic: boolean;
+ fontDisplay: CustomFontsCreateRequestFontDisplay.Raw;
+ axes?: CustomFontAxis.Raw[] | null;
+ }
+}
diff --git a/src/serialization/resources/customFonts/client/requests/CustomFontsReplaceFileRequest.ts b/src/serialization/resources/customFonts/client/requests/CustomFontsReplaceFileRequest.ts
new file mode 100644
index 00000000..c2e33ffb
--- /dev/null
+++ b/src/serialization/resources/customFonts/client/requests/CustomFontsReplaceFileRequest.ts
@@ -0,0 +1,23 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../../../../api/index";
+import * as core from "../../../../../core";
+import type * as serializers from "../../../../index";
+import { CustomFontAxis } from "../../../../types/CustomFontAxis";
+
+export const CustomFontsReplaceFileRequest: core.serialization.Schema<
+ serializers.CustomFontsReplaceFileRequest.Raw,
+ Webflow.CustomFontsReplaceFileRequest
+> = core.serialization.object({
+ fileName: core.serialization.string(),
+ fileHash: core.serialization.string(),
+ axes: core.serialization.list(CustomFontAxis).optional(),
+});
+
+export declare namespace CustomFontsReplaceFileRequest {
+ export interface Raw {
+ fileName: string;
+ fileHash: string;
+ axes?: CustomFontAxis.Raw[] | null;
+ }
+}
diff --git a/src/serialization/resources/customFonts/client/requests/CustomFontsUpdateRequest.ts b/src/serialization/resources/customFonts/client/requests/CustomFontsUpdateRequest.ts
new file mode 100644
index 00000000..47ab7dd1
--- /dev/null
+++ b/src/serialization/resources/customFonts/client/requests/CustomFontsUpdateRequest.ts
@@ -0,0 +1,25 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../../../../api/index";
+import * as core from "../../../../../core";
+import type * as serializers from "../../../../index";
+import { CustomFontsUpdateRequestFontDisplay } from "../../types/CustomFontsUpdateRequestFontDisplay";
+
+export const CustomFontsUpdateRequest: core.serialization.Schema<
+ serializers.CustomFontsUpdateRequest.Raw,
+ Webflow.CustomFontsUpdateRequest
+> = core.serialization.object({
+ fontFamily: core.serialization.string().optional(),
+ weight: core.serialization.number().optional(),
+ italic: core.serialization.boolean().optional(),
+ fontDisplay: CustomFontsUpdateRequestFontDisplay.optional(),
+});
+
+export declare namespace CustomFontsUpdateRequest {
+ export interface Raw {
+ fontFamily?: string | null;
+ weight?: number | null;
+ italic?: boolean | null;
+ fontDisplay?: CustomFontsUpdateRequestFontDisplay.Raw | null;
+ }
+}
diff --git a/src/serialization/resources/customFonts/client/requests/index.ts b/src/serialization/resources/customFonts/client/requests/index.ts
new file mode 100644
index 00000000..244fb9cf
--- /dev/null
+++ b/src/serialization/resources/customFonts/client/requests/index.ts
@@ -0,0 +1,5 @@
+export { CustomFontBatchCreateRequest } from "./CustomFontBatchCreateRequest";
+export { CustomFontBatchDeleteRequest } from "./CustomFontBatchDeleteRequest";
+export { CustomFontsCreateRequest } from "./CustomFontsCreateRequest";
+export { CustomFontsReplaceFileRequest } from "./CustomFontsReplaceFileRequest";
+export { CustomFontsUpdateRequest } from "./CustomFontsUpdateRequest";
diff --git a/src/serialization/resources/customFonts/index.ts b/src/serialization/resources/customFonts/index.ts
new file mode 100644
index 00000000..d2ec2302
--- /dev/null
+++ b/src/serialization/resources/customFonts/index.ts
@@ -0,0 +1,2 @@
+export * from "./client";
+export * from "./types";
diff --git a/src/serialization/resources/customFonts/types/CustomFontBatchCreateRequestItemsItem.ts b/src/serialization/resources/customFonts/types/CustomFontBatchCreateRequestItemsItem.ts
new file mode 100644
index 00000000..6aff6d1e
--- /dev/null
+++ b/src/serialization/resources/customFonts/types/CustomFontBatchCreateRequestItemsItem.ts
@@ -0,0 +1,32 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../../../api/index";
+import * as core from "../../../../core";
+import type * as serializers from "../../../index";
+import { CustomFontAxis } from "../../../types/CustomFontAxis";
+import { CustomFontBatchCreateRequestItemsItemFontDisplay } from "./CustomFontBatchCreateRequestItemsItemFontDisplay";
+
+export const CustomFontBatchCreateRequestItemsItem: core.serialization.ObjectSchema<
+ serializers.CustomFontBatchCreateRequestItemsItem.Raw,
+ Webflow.CustomFontBatchCreateRequestItemsItem
+> = core.serialization.object({
+ fileName: core.serialization.string(),
+ fileHash: core.serialization.string(),
+ fontFamily: core.serialization.string(),
+ weight: core.serialization.number(),
+ italic: core.serialization.boolean(),
+ fontDisplay: CustomFontBatchCreateRequestItemsItemFontDisplay,
+ axes: core.serialization.list(CustomFontAxis).optional(),
+});
+
+export declare namespace CustomFontBatchCreateRequestItemsItem {
+ export interface Raw {
+ fileName: string;
+ fileHash: string;
+ fontFamily: string;
+ weight: number;
+ italic: boolean;
+ fontDisplay: CustomFontBatchCreateRequestItemsItemFontDisplay.Raw;
+ axes?: CustomFontAxis.Raw[] | null;
+ }
+}
diff --git a/src/serialization/resources/customFonts/types/CustomFontBatchCreateRequestItemsItemFontDisplay.ts b/src/serialization/resources/customFonts/types/CustomFontBatchCreateRequestItemsItemFontDisplay.ts
new file mode 100644
index 00000000..8beab798
--- /dev/null
+++ b/src/serialization/resources/customFonts/types/CustomFontBatchCreateRequestItemsItemFontDisplay.ts
@@ -0,0 +1,14 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../../../api/index";
+import * as core from "../../../../core";
+import type * as serializers from "../../../index";
+
+export const CustomFontBatchCreateRequestItemsItemFontDisplay: core.serialization.Schema<
+ serializers.CustomFontBatchCreateRequestItemsItemFontDisplay.Raw,
+ Webflow.CustomFontBatchCreateRequestItemsItemFontDisplay
+> = core.serialization.enum_(["auto", "block", "swap", "fallback", "optional"]);
+
+export declare namespace CustomFontBatchCreateRequestItemsItemFontDisplay {
+ export type Raw = "auto" | "block" | "swap" | "fallback" | "optional";
+}
diff --git a/src/serialization/resources/customFonts/types/CustomFontBatchDeleteRequestItemsItem.ts b/src/serialization/resources/customFonts/types/CustomFontBatchDeleteRequestItemsItem.ts
new file mode 100644
index 00000000..e697e916
--- /dev/null
+++ b/src/serialization/resources/customFonts/types/CustomFontBatchDeleteRequestItemsItem.ts
@@ -0,0 +1,18 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../../../api/index";
+import * as core from "../../../../core";
+import type * as serializers from "../../../index";
+
+export const CustomFontBatchDeleteRequestItemsItem: core.serialization.ObjectSchema<
+ serializers.CustomFontBatchDeleteRequestItemsItem.Raw,
+ Webflow.CustomFontBatchDeleteRequestItemsItem
+> = core.serialization.object({
+ id: core.serialization.string(),
+});
+
+export declare namespace CustomFontBatchDeleteRequestItemsItem {
+ export interface Raw {
+ id: string;
+ }
+}
diff --git a/src/serialization/resources/customFonts/types/CustomFontsCreateRequestFontDisplay.ts b/src/serialization/resources/customFonts/types/CustomFontsCreateRequestFontDisplay.ts
new file mode 100644
index 00000000..d1fa546e
--- /dev/null
+++ b/src/serialization/resources/customFonts/types/CustomFontsCreateRequestFontDisplay.ts
@@ -0,0 +1,14 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../../../api/index";
+import * as core from "../../../../core";
+import type * as serializers from "../../../index";
+
+export const CustomFontsCreateRequestFontDisplay: core.serialization.Schema<
+ serializers.CustomFontsCreateRequestFontDisplay.Raw,
+ Webflow.CustomFontsCreateRequestFontDisplay
+> = core.serialization.enum_(["auto", "block", "swap", "fallback", "optional"]);
+
+export declare namespace CustomFontsCreateRequestFontDisplay {
+ export type Raw = "auto" | "block" | "swap" | "fallback" | "optional";
+}
diff --git a/src/serialization/resources/customFonts/types/CustomFontsGetResponse.ts b/src/serialization/resources/customFonts/types/CustomFontsGetResponse.ts
new file mode 100644
index 00000000..beb25e15
--- /dev/null
+++ b/src/serialization/resources/customFonts/types/CustomFontsGetResponse.ts
@@ -0,0 +1,19 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../../../api/index";
+import * as core from "../../../../core";
+import type * as serializers from "../../../index";
+import { CustomFont } from "../../../types/CustomFont";
+
+export const CustomFontsGetResponse: core.serialization.ObjectSchema<
+ serializers.CustomFontsGetResponse.Raw,
+ Webflow.CustomFontsGetResponse
+> = core.serialization.object({
+ customFont: CustomFont,
+});
+
+export declare namespace CustomFontsGetResponse {
+ export interface Raw {
+ customFont: CustomFont.Raw;
+ }
+}
diff --git a/src/serialization/resources/customFonts/types/CustomFontsUpdateRequestFontDisplay.ts b/src/serialization/resources/customFonts/types/CustomFontsUpdateRequestFontDisplay.ts
new file mode 100644
index 00000000..df0db94d
--- /dev/null
+++ b/src/serialization/resources/customFonts/types/CustomFontsUpdateRequestFontDisplay.ts
@@ -0,0 +1,14 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../../../api/index";
+import * as core from "../../../../core";
+import type * as serializers from "../../../index";
+
+export const CustomFontsUpdateRequestFontDisplay: core.serialization.Schema<
+ serializers.CustomFontsUpdateRequestFontDisplay.Raw,
+ Webflow.CustomFontsUpdateRequestFontDisplay
+> = core.serialization.enum_(["auto", "block", "swap", "fallback", "optional"]);
+
+export declare namespace CustomFontsUpdateRequestFontDisplay {
+ export type Raw = "auto" | "block" | "swap" | "fallback" | "optional";
+}
diff --git a/src/serialization/resources/customFonts/types/CustomFontsUpdateResponse.ts b/src/serialization/resources/customFonts/types/CustomFontsUpdateResponse.ts
new file mode 100644
index 00000000..38237d79
--- /dev/null
+++ b/src/serialization/resources/customFonts/types/CustomFontsUpdateResponse.ts
@@ -0,0 +1,19 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../../../api/index";
+import * as core from "../../../../core";
+import type * as serializers from "../../../index";
+import { CustomFont } from "../../../types/CustomFont";
+
+export const CustomFontsUpdateResponse: core.serialization.ObjectSchema<
+ serializers.CustomFontsUpdateResponse.Raw,
+ Webflow.CustomFontsUpdateResponse
+> = core.serialization.object({
+ customFont: CustomFont,
+});
+
+export declare namespace CustomFontsUpdateResponse {
+ export interface Raw {
+ customFont: CustomFont.Raw;
+ }
+}
diff --git a/src/serialization/resources/customFonts/types/index.ts b/src/serialization/resources/customFonts/types/index.ts
new file mode 100644
index 00000000..dd135680
--- /dev/null
+++ b/src/serialization/resources/customFonts/types/index.ts
@@ -0,0 +1,7 @@
+export * from "./CustomFontBatchCreateRequestItemsItem";
+export * from "./CustomFontBatchCreateRequestItemsItemFontDisplay";
+export * from "./CustomFontBatchDeleteRequestItemsItem";
+export * from "./CustomFontsCreateRequestFontDisplay";
+export * from "./CustomFontsGetResponse";
+export * from "./CustomFontsUpdateRequestFontDisplay";
+export * from "./CustomFontsUpdateResponse";
diff --git a/src/serialization/resources/index.ts b/src/serialization/resources/index.ts
index fb6e5ea9..607b1bfd 100644
--- a/src/serialization/resources/index.ts
+++ b/src/serialization/resources/index.ts
@@ -1,3 +1,4 @@
+export * as analyze from "./analyze";
export * as assets from "./assets";
export * from "./assets/client/requests";
export * as collections from "./collections";
@@ -5,6 +6,9 @@ export * from "./collections/client/requests";
export * as components from "./components";
export * from "./components/client/requests";
export * from "./components/types";
+export * as customFonts from "./customFonts";
+export * from "./customFonts/client/requests";
+export * from "./customFonts/types";
export * as forms from "./forms";
export * from "./forms/client/requests";
export * as inventory from "./inventory";
diff --git a/src/serialization/resources/sites/client/requests/SitesPublishRequest.ts b/src/serialization/resources/sites/client/requests/SitesPublishRequest.ts
index 8cb1612c..01c2e9c3 100644
--- a/src/serialization/resources/sites/client/requests/SitesPublishRequest.ts
+++ b/src/serialization/resources/sites/client/requests/SitesPublishRequest.ts
@@ -10,11 +10,13 @@ export const SitesPublishRequest: core.serialization.Schema<
> = core.serialization.object({
customDomains: core.serialization.list(core.serialization.string()).optional(),
publishToWebflowSubdomain: core.serialization.boolean().optional(),
+ pageId: core.serialization.string().optional(),
});
export declare namespace SitesPublishRequest {
export interface Raw {
customDomains?: string[] | null;
publishToWebflowSubdomain?: boolean | null;
+ pageId?: string | null;
}
}
diff --git a/src/serialization/resources/sites/resources/aeo/index.ts b/src/serialization/resources/sites/resources/aeo/index.ts
new file mode 100644
index 00000000..3e5335fe
--- /dev/null
+++ b/src/serialization/resources/sites/resources/aeo/index.ts
@@ -0,0 +1 @@
+export * from "./resources";
diff --git a/src/serialization/resources/sites/resources/aeo/resources/index.ts b/src/serialization/resources/sites/resources/aeo/resources/index.ts
new file mode 100644
index 00000000..5de38473
--- /dev/null
+++ b/src/serialization/resources/sites/resources/aeo/resources/index.ts
@@ -0,0 +1,4 @@
+export * as prompts from "./prompts";
+export * from "./prompts/types";
+export * as reports from "./reports";
+export * from "./reports/types";
diff --git a/src/serialization/resources/sites/resources/aeo/resources/prompts/index.ts b/src/serialization/resources/sites/resources/aeo/resources/prompts/index.ts
new file mode 100644
index 00000000..eea524d6
--- /dev/null
+++ b/src/serialization/resources/sites/resources/aeo/resources/prompts/index.ts
@@ -0,0 +1 @@
+export * from "./types";
diff --git a/src/serialization/resources/sites/resources/aeo/resources/prompts/types/PromptsListRequestStatus.ts b/src/serialization/resources/sites/resources/aeo/resources/prompts/types/PromptsListRequestStatus.ts
new file mode 100644
index 00000000..92073e43
--- /dev/null
+++ b/src/serialization/resources/sites/resources/aeo/resources/prompts/types/PromptsListRequestStatus.ts
@@ -0,0 +1,14 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../../../../../../../api/index";
+import * as core from "../../../../../../../../core";
+import type * as serializers from "../../../../../../../index";
+
+export const PromptsListRequestStatus: core.serialization.Schema<
+ serializers.sites.aeo.PromptsListRequestStatus.Raw,
+ Webflow.sites.aeo.PromptsListRequestStatus
+> = core.serialization.enum_(["active", "paused", "pending", "archived", "all"]);
+
+export declare namespace PromptsListRequestStatus {
+ export type Raw = "active" | "paused" | "pending" | "archived" | "all";
+}
diff --git a/src/serialization/resources/sites/resources/aeo/resources/prompts/types/index.ts b/src/serialization/resources/sites/resources/aeo/resources/prompts/types/index.ts
new file mode 100644
index 00000000..8b13890e
--- /dev/null
+++ b/src/serialization/resources/sites/resources/aeo/resources/prompts/types/index.ts
@@ -0,0 +1 @@
+export * from "./PromptsListRequestStatus";
diff --git a/src/serialization/resources/sites/resources/aeo/resources/reports/index.ts b/src/serialization/resources/sites/resources/aeo/resources/reports/index.ts
new file mode 100644
index 00000000..eea524d6
--- /dev/null
+++ b/src/serialization/resources/sites/resources/aeo/resources/reports/index.ts
@@ -0,0 +1 @@
+export * from "./types";
diff --git a/src/serialization/resources/sites/resources/aeo/resources/reports/types/ReportsCitationRateRequestBreakdown.ts b/src/serialization/resources/sites/resources/aeo/resources/reports/types/ReportsCitationRateRequestBreakdown.ts
new file mode 100644
index 00000000..00cee4f6
--- /dev/null
+++ b/src/serialization/resources/sites/resources/aeo/resources/reports/types/ReportsCitationRateRequestBreakdown.ts
@@ -0,0 +1,14 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../../../../../../../api/index";
+import * as core from "../../../../../../../../core";
+import type * as serializers from "../../../../../../../index";
+
+export const ReportsCitationRateRequestBreakdown: core.serialization.Schema<
+ serializers.sites.aeo.ReportsCitationRateRequestBreakdown.Raw,
+ Webflow.sites.aeo.ReportsCitationRateRequestBreakdown
+> = core.serialization.enum_(["topic", "prompt"]);
+
+export declare namespace ReportsCitationRateRequestBreakdown {
+ export type Raw = "topic" | "prompt";
+}
diff --git a/src/serialization/resources/sites/resources/aeo/resources/reports/types/ReportsVisibilityBreakdownRequestBreakdown.ts b/src/serialization/resources/sites/resources/aeo/resources/reports/types/ReportsVisibilityBreakdownRequestBreakdown.ts
new file mode 100644
index 00000000..a1ca4fa5
--- /dev/null
+++ b/src/serialization/resources/sites/resources/aeo/resources/reports/types/ReportsVisibilityBreakdownRequestBreakdown.ts
@@ -0,0 +1,14 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../../../../../../../api/index";
+import * as core from "../../../../../../../../core";
+import type * as serializers from "../../../../../../../index";
+
+export const ReportsVisibilityBreakdownRequestBreakdown: core.serialization.Schema<
+ serializers.sites.aeo.ReportsVisibilityBreakdownRequestBreakdown.Raw,
+ Webflow.sites.aeo.ReportsVisibilityBreakdownRequestBreakdown
+> = core.serialization.enum_(["topic", "prompt"]);
+
+export declare namespace ReportsVisibilityBreakdownRequestBreakdown {
+ export type Raw = "topic" | "prompt";
+}
diff --git a/src/serialization/resources/sites/resources/aeo/resources/reports/types/index.ts b/src/serialization/resources/sites/resources/aeo/resources/reports/types/index.ts
new file mode 100644
index 00000000..44c19d7d
--- /dev/null
+++ b/src/serialization/resources/sites/resources/aeo/resources/reports/types/index.ts
@@ -0,0 +1,2 @@
+export * from "./ReportsCitationRateRequestBreakdown";
+export * from "./ReportsVisibilityBreakdownRequestBreakdown";
diff --git a/src/serialization/resources/sites/resources/comments/client/index.ts b/src/serialization/resources/sites/resources/comments/client/index.ts
new file mode 100644
index 00000000..415726b7
--- /dev/null
+++ b/src/serialization/resources/sites/resources/comments/client/index.ts
@@ -0,0 +1 @@
+export * from "./requests";
diff --git a/src/serialization/resources/sites/resources/comments/client/requests/CreateCommentReplyRequest.ts b/src/serialization/resources/sites/resources/comments/client/requests/CreateCommentReplyRequest.ts
new file mode 100644
index 00000000..85c66ba7
--- /dev/null
+++ b/src/serialization/resources/sites/resources/comments/client/requests/CreateCommentReplyRequest.ts
@@ -0,0 +1,18 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../../../../../../api/index";
+import * as core from "../../../../../../../core";
+import type * as serializers from "../../../../../../index";
+
+export const CreateCommentReplyRequest: core.serialization.Schema<
+ serializers.sites.CreateCommentReplyRequest.Raw,
+ Webflow.sites.CreateCommentReplyRequest
+> = core.serialization.object({
+ content: core.serialization.string(),
+});
+
+export declare namespace CreateCommentReplyRequest {
+ export interface Raw {
+ content: string;
+ }
+}
diff --git a/src/serialization/resources/sites/resources/comments/client/requests/ResolveCommentThreadRequest.ts b/src/serialization/resources/sites/resources/comments/client/requests/ResolveCommentThreadRequest.ts
new file mode 100644
index 00000000..4bae711a
--- /dev/null
+++ b/src/serialization/resources/sites/resources/comments/client/requests/ResolveCommentThreadRequest.ts
@@ -0,0 +1,18 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../../../../../../api/index";
+import * as core from "../../../../../../../core";
+import type * as serializers from "../../../../../../index";
+
+export const ResolveCommentThreadRequest: core.serialization.Schema<
+ serializers.sites.ResolveCommentThreadRequest.Raw,
+ Webflow.sites.ResolveCommentThreadRequest
+> = core.serialization.object({
+ resolved: core.serialization.boolean(),
+});
+
+export declare namespace ResolveCommentThreadRequest {
+ export interface Raw {
+ resolved: boolean;
+ }
+}
diff --git a/src/serialization/resources/sites/resources/comments/client/requests/index.ts b/src/serialization/resources/sites/resources/comments/client/requests/index.ts
new file mode 100644
index 00000000..9c735bab
--- /dev/null
+++ b/src/serialization/resources/sites/resources/comments/client/requests/index.ts
@@ -0,0 +1,2 @@
+export { CreateCommentReplyRequest } from "./CreateCommentReplyRequest";
+export { ResolveCommentThreadRequest } from "./ResolveCommentThreadRequest";
diff --git a/src/serialization/resources/sites/resources/comments/index.ts b/src/serialization/resources/sites/resources/comments/index.ts
index eea524d6..d2ec2302 100644
--- a/src/serialization/resources/sites/resources/comments/index.ts
+++ b/src/serialization/resources/sites/resources/comments/index.ts
@@ -1 +1,2 @@
+export * from "./client";
export * from "./types";
diff --git a/src/serialization/resources/sites/resources/index.ts b/src/serialization/resources/sites/resources/index.ts
index fbc66e1d..3d4a06fd 100644
--- a/src/serialization/resources/sites/resources/index.ts
+++ b/src/serialization/resources/sites/resources/index.ts
@@ -1,7 +1,12 @@
+export * as aeo from "./aeo";
export * as comments from "./comments";
+export * from "./comments/client/requests";
export * from "./comments/types";
export * as forms from "./forms";
export * from "./forms/client/requests";
+export * as members from "./members";
+export * from "./members/client/requests";
+export * from "./members/types";
export * as wellKnown from "./wellKnown";
export * from "./wellKnown/client/requests";
export * from "./wellKnown/types";
diff --git a/src/serialization/resources/sites/resources/members/client/index.ts b/src/serialization/resources/sites/resources/members/client/index.ts
new file mode 100644
index 00000000..415726b7
--- /dev/null
+++ b/src/serialization/resources/sites/resources/members/client/index.ts
@@ -0,0 +1 @@
+export * from "./requests";
diff --git a/src/serialization/resources/sites/resources/members/client/requests/GrantSiteMemberRequestBody.ts b/src/serialization/resources/sites/resources/members/client/requests/GrantSiteMemberRequestBody.ts
new file mode 100644
index 00000000..71242d93
--- /dev/null
+++ b/src/serialization/resources/sites/resources/members/client/requests/GrantSiteMemberRequestBody.ts
@@ -0,0 +1,25 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../../../../../../api/index";
+import * as core from "../../../../../../../core";
+import type * as serializers from "../../../../../../index";
+import { GrantSiteMemberRequestBodySiteRole } from "../../types/GrantSiteMemberRequestBodySiteRole";
+
+export const GrantSiteMemberRequestBody: core.serialization.Schema<
+ serializers.sites.GrantSiteMemberRequestBody.Raw,
+ Webflow.sites.GrantSiteMemberRequestBody
+> = core.serialization.object({
+ email: core.serialization.string().optional(),
+ memberId: core.serialization.string().optional(),
+ siteRole: GrantSiteMemberRequestBodySiteRole,
+ siteRoleId: core.serialization.string().optional(),
+});
+
+export declare namespace GrantSiteMemberRequestBody {
+ export interface Raw {
+ email?: string | null;
+ memberId?: string | null;
+ siteRole: GrantSiteMemberRequestBodySiteRole.Raw;
+ siteRoleId?: string | null;
+ }
+}
diff --git a/src/serialization/resources/sites/resources/members/client/requests/index.ts b/src/serialization/resources/sites/resources/members/client/requests/index.ts
new file mode 100644
index 00000000..3e1d7503
--- /dev/null
+++ b/src/serialization/resources/sites/resources/members/client/requests/index.ts
@@ -0,0 +1 @@
+export { GrantSiteMemberRequestBody } from "./GrantSiteMemberRequestBody";
diff --git a/src/serialization/resources/sites/resources/members/index.ts b/src/serialization/resources/sites/resources/members/index.ts
new file mode 100644
index 00000000..d2ec2302
--- /dev/null
+++ b/src/serialization/resources/sites/resources/members/index.ts
@@ -0,0 +1,2 @@
+export * from "./client";
+export * from "./types";
diff --git a/src/serialization/resources/sites/resources/members/types/GrantSiteMemberRequestBodySiteRole.ts b/src/serialization/resources/sites/resources/members/types/GrantSiteMemberRequestBodySiteRole.ts
new file mode 100644
index 00000000..61809b56
--- /dev/null
+++ b/src/serialization/resources/sites/resources/members/types/GrantSiteMemberRequestBodySiteRole.ts
@@ -0,0 +1,14 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../../../../../api/index";
+import * as core from "../../../../../../core";
+import type * as serializers from "../../../../../index";
+
+export const GrantSiteMemberRequestBodySiteRole: core.serialization.Schema<
+ serializers.sites.GrantSiteMemberRequestBodySiteRole.Raw,
+ Webflow.sites.GrantSiteMemberRequestBodySiteRole
+> = core.serialization.enum_(["site_manager", "designer", "marketer", "content_editor", "reviewer", "custom"]);
+
+export declare namespace GrantSiteMemberRequestBodySiteRole {
+ export type Raw = "site_manager" | "designer" | "marketer" | "content_editor" | "reviewer" | "custom";
+}
diff --git a/src/serialization/resources/sites/resources/members/types/index.ts b/src/serialization/resources/sites/resources/members/types/index.ts
new file mode 100644
index 00000000..39e18d76
--- /dev/null
+++ b/src/serialization/resources/sites/resources/members/types/index.ts
@@ -0,0 +1 @@
+export * from "./GrantSiteMemberRequestBodySiteRole";
diff --git a/src/serialization/resources/sites/types/SitesPublishResponse.ts b/src/serialization/resources/sites/types/SitesPublishResponse.ts
index f0589df6..ec7928c2 100644
--- a/src/serialization/resources/sites/types/SitesPublishResponse.ts
+++ b/src/serialization/resources/sites/types/SitesPublishResponse.ts
@@ -4,6 +4,7 @@ import type * as Webflow from "../../../../api/index";
import * as core from "../../../../core";
import type * as serializers from "../../../index";
import { Domain } from "../../../types/Domain";
+import { SitesPublishResponsePublishScope } from "./SitesPublishResponsePublishScope";
export const SitesPublishResponse: core.serialization.ObjectSchema<
serializers.SitesPublishResponse.Raw,
@@ -11,11 +12,13 @@ export const SitesPublishResponse: core.serialization.ObjectSchema<
> = core.serialization.object({
customDomains: core.serialization.list(Domain).optional(),
publishToWebflowSubdomain: core.serialization.boolean().optional(),
+ publishScope: SitesPublishResponsePublishScope.optional(),
});
export declare namespace SitesPublishResponse {
export interface Raw {
customDomains?: Domain.Raw[] | null;
publishToWebflowSubdomain?: boolean | null;
+ publishScope?: SitesPublishResponsePublishScope.Raw | null;
}
}
diff --git a/src/serialization/resources/sites/types/SitesPublishResponsePublishScope.ts b/src/serialization/resources/sites/types/SitesPublishResponsePublishScope.ts
new file mode 100644
index 00000000..0e993ae5
--- /dev/null
+++ b/src/serialization/resources/sites/types/SitesPublishResponsePublishScope.ts
@@ -0,0 +1,14 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../../../api/index";
+import * as core from "../../../../core";
+import type * as serializers from "../../../index";
+
+export const SitesPublishResponsePublishScope: core.serialization.Schema<
+ serializers.SitesPublishResponsePublishScope.Raw,
+ Webflow.SitesPublishResponsePublishScope
+> = core.serialization.enum_(["site", "page"]);
+
+export declare namespace SitesPublishResponsePublishScope {
+ export type Raw = "site" | "page";
+}
diff --git a/src/serialization/resources/sites/types/index.ts b/src/serialization/resources/sites/types/index.ts
index 7708da86..e8d16a61 100644
--- a/src/serialization/resources/sites/types/index.ts
+++ b/src/serialization/resources/sites/types/index.ts
@@ -1 +1,2 @@
export * from "./SitesPublishResponse";
+export * from "./SitesPublishResponsePublishScope";
diff --git a/src/serialization/resources/workspaces/resources/index.ts b/src/serialization/resources/workspaces/resources/index.ts
index dc704ce7..ad198ce1 100644
--- a/src/serialization/resources/workspaces/resources/index.ts
+++ b/src/serialization/resources/workspaces/resources/index.ts
@@ -1,2 +1,5 @@
export * as auditLogs from "./auditLogs";
export * from "./auditLogs/types";
+export * as members from "./members";
+export * from "./members/client/requests";
+export * from "./members/types";
diff --git a/src/serialization/resources/workspaces/resources/members/client/index.ts b/src/serialization/resources/workspaces/resources/members/client/index.ts
new file mode 100644
index 00000000..415726b7
--- /dev/null
+++ b/src/serialization/resources/workspaces/resources/members/client/index.ts
@@ -0,0 +1 @@
+export * from "./requests";
diff --git a/src/serialization/resources/workspaces/resources/members/client/requests/BulkUpdateWorkspaceMemberRolesRequestBody.ts b/src/serialization/resources/workspaces/resources/members/client/requests/BulkUpdateWorkspaceMemberRolesRequestBody.ts
new file mode 100644
index 00000000..6c36f106
--- /dev/null
+++ b/src/serialization/resources/workspaces/resources/members/client/requests/BulkUpdateWorkspaceMemberRolesRequestBody.ts
@@ -0,0 +1,28 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../../../../../../api/index";
+import * as core from "../../../../../../../core";
+import type * as serializers from "../../../../../../index";
+import { BulkUpdateWorkspaceMemberRolesRequestBodyDefaultSiteRole } from "../../types/BulkUpdateWorkspaceMemberRolesRequestBodyDefaultSiteRole";
+import { BulkUpdateWorkspaceMemberRolesRequestBodyRole } from "../../types/BulkUpdateWorkspaceMemberRolesRequestBodyRole";
+
+export const BulkUpdateWorkspaceMemberRolesRequestBody: core.serialization.Schema<
+ serializers.workspaces.BulkUpdateWorkspaceMemberRolesRequestBody.Raw,
+ Webflow.workspaces.BulkUpdateWorkspaceMemberRolesRequestBody
+> = core.serialization.object({
+ memberIds: core.serialization.list(core.serialization.string()).optional(),
+ inviteIds: core.serialization.list(core.serialization.string()).optional(),
+ role: BulkUpdateWorkspaceMemberRolesRequestBodyRole,
+ defaultSiteRole: BulkUpdateWorkspaceMemberRolesRequestBodyDefaultSiteRole,
+ defaultSiteRoleId: core.serialization.string().optional(),
+});
+
+export declare namespace BulkUpdateWorkspaceMemberRolesRequestBody {
+ export interface Raw {
+ memberIds?: string[] | null;
+ inviteIds?: string[] | null;
+ role: BulkUpdateWorkspaceMemberRolesRequestBodyRole.Raw;
+ defaultSiteRole: BulkUpdateWorkspaceMemberRolesRequestBodyDefaultSiteRole.Raw;
+ defaultSiteRoleId?: string | null;
+ }
+}
diff --git a/src/serialization/resources/workspaces/resources/members/client/requests/UpdateWorkspaceMemberRoleRequestBody.ts b/src/serialization/resources/workspaces/resources/members/client/requests/UpdateWorkspaceMemberRoleRequestBody.ts
new file mode 100644
index 00000000..d0809df9
--- /dev/null
+++ b/src/serialization/resources/workspaces/resources/members/client/requests/UpdateWorkspaceMemberRoleRequestBody.ts
@@ -0,0 +1,24 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../../../../../../api/index";
+import * as core from "../../../../../../../core";
+import type * as serializers from "../../../../../../index";
+import { UpdateWorkspaceMemberRoleRequestBodyDefaultSiteRole } from "../../types/UpdateWorkspaceMemberRoleRequestBodyDefaultSiteRole";
+import { UpdateWorkspaceMemberRoleRequestBodyRole } from "../../types/UpdateWorkspaceMemberRoleRequestBodyRole";
+
+export const UpdateWorkspaceMemberRoleRequestBody: core.serialization.Schema<
+ serializers.workspaces.UpdateWorkspaceMemberRoleRequestBody.Raw,
+ Webflow.workspaces.UpdateWorkspaceMemberRoleRequestBody
+> = core.serialization.object({
+ role: UpdateWorkspaceMemberRoleRequestBodyRole,
+ defaultSiteRole: UpdateWorkspaceMemberRoleRequestBodyDefaultSiteRole,
+ defaultSiteRoleId: core.serialization.string().optional(),
+});
+
+export declare namespace UpdateWorkspaceMemberRoleRequestBody {
+ export interface Raw {
+ role: UpdateWorkspaceMemberRoleRequestBodyRole.Raw;
+ defaultSiteRole: UpdateWorkspaceMemberRoleRequestBodyDefaultSiteRole.Raw;
+ defaultSiteRoleId?: string | null;
+ }
+}
diff --git a/src/serialization/resources/workspaces/resources/members/client/requests/index.ts b/src/serialization/resources/workspaces/resources/members/client/requests/index.ts
new file mode 100644
index 00000000..1575ffda
--- /dev/null
+++ b/src/serialization/resources/workspaces/resources/members/client/requests/index.ts
@@ -0,0 +1,2 @@
+export { BulkUpdateWorkspaceMemberRolesRequestBody } from "./BulkUpdateWorkspaceMemberRolesRequestBody";
+export { UpdateWorkspaceMemberRoleRequestBody } from "./UpdateWorkspaceMemberRoleRequestBody";
diff --git a/src/serialization/resources/workspaces/resources/members/index.ts b/src/serialization/resources/workspaces/resources/members/index.ts
new file mode 100644
index 00000000..d2ec2302
--- /dev/null
+++ b/src/serialization/resources/workspaces/resources/members/index.ts
@@ -0,0 +1,2 @@
+export * from "./client";
+export * from "./types";
diff --git a/src/serialization/resources/workspaces/resources/members/types/BulkUpdateWorkspaceMemberRolesRequestBodyDefaultSiteRole.ts b/src/serialization/resources/workspaces/resources/members/types/BulkUpdateWorkspaceMemberRolesRequestBodyDefaultSiteRole.ts
new file mode 100644
index 00000000..26ed7143
--- /dev/null
+++ b/src/serialization/resources/workspaces/resources/members/types/BulkUpdateWorkspaceMemberRolesRequestBodyDefaultSiteRole.ts
@@ -0,0 +1,14 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../../../../../api/index";
+import * as core from "../../../../../../core";
+import type * as serializers from "../../../../../index";
+
+export const BulkUpdateWorkspaceMemberRolesRequestBodyDefaultSiteRole: core.serialization.Schema<
+ serializers.workspaces.BulkUpdateWorkspaceMemberRolesRequestBodyDefaultSiteRole.Raw,
+ Webflow.workspaces.BulkUpdateWorkspaceMemberRolesRequestBodyDefaultSiteRole
+> = core.serialization.enum_(["site_manager", "designer", "marketer", "content_editor", "reviewer", "custom"]);
+
+export declare namespace BulkUpdateWorkspaceMemberRolesRequestBodyDefaultSiteRole {
+ export type Raw = "site_manager" | "designer" | "marketer" | "content_editor" | "reviewer" | "custom";
+}
diff --git a/src/serialization/resources/workspaces/resources/members/types/BulkUpdateWorkspaceMemberRolesRequestBodyRole.ts b/src/serialization/resources/workspaces/resources/members/types/BulkUpdateWorkspaceMemberRolesRequestBodyRole.ts
new file mode 100644
index 00000000..4d897e41
--- /dev/null
+++ b/src/serialization/resources/workspaces/resources/members/types/BulkUpdateWorkspaceMemberRolesRequestBodyRole.ts
@@ -0,0 +1,14 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../../../../../api/index";
+import * as core from "../../../../../../core";
+import type * as serializers from "../../../../../index";
+
+export const BulkUpdateWorkspaceMemberRolesRequestBodyRole: core.serialization.Schema<
+ serializers.workspaces.BulkUpdateWorkspaceMemberRolesRequestBodyRole.Raw,
+ Webflow.workspaces.BulkUpdateWorkspaceMemberRolesRequestBodyRole
+> = core.serialization.enum_(["admin", "member", "reviewer"]);
+
+export declare namespace BulkUpdateWorkspaceMemberRolesRequestBodyRole {
+ export type Raw = "admin" | "member" | "reviewer";
+}
diff --git a/src/serialization/resources/workspaces/resources/members/types/MembersListMembersRequestRolesItem.ts b/src/serialization/resources/workspaces/resources/members/types/MembersListMembersRequestRolesItem.ts
new file mode 100644
index 00000000..747339c2
--- /dev/null
+++ b/src/serialization/resources/workspaces/resources/members/types/MembersListMembersRequestRolesItem.ts
@@ -0,0 +1,14 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../../../../../api/index";
+import * as core from "../../../../../../core";
+import type * as serializers from "../../../../../index";
+
+export const MembersListMembersRequestRolesItem: core.serialization.Schema<
+ serializers.workspaces.MembersListMembersRequestRolesItem.Raw,
+ Webflow.workspaces.MembersListMembersRequestRolesItem
+> = core.serialization.enum_(["owner", "admin", "member", "guest", "reviewer", "client"]);
+
+export declare namespace MembersListMembersRequestRolesItem {
+ export type Raw = "owner" | "admin" | "member" | "guest" | "reviewer" | "client";
+}
diff --git a/src/serialization/resources/workspaces/resources/members/types/UpdateWorkspaceMemberRoleRequestBodyDefaultSiteRole.ts b/src/serialization/resources/workspaces/resources/members/types/UpdateWorkspaceMemberRoleRequestBodyDefaultSiteRole.ts
new file mode 100644
index 00000000..1ab3c794
--- /dev/null
+++ b/src/serialization/resources/workspaces/resources/members/types/UpdateWorkspaceMemberRoleRequestBodyDefaultSiteRole.ts
@@ -0,0 +1,14 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../../../../../api/index";
+import * as core from "../../../../../../core";
+import type * as serializers from "../../../../../index";
+
+export const UpdateWorkspaceMemberRoleRequestBodyDefaultSiteRole: core.serialization.Schema<
+ serializers.workspaces.UpdateWorkspaceMemberRoleRequestBodyDefaultSiteRole.Raw,
+ Webflow.workspaces.UpdateWorkspaceMemberRoleRequestBodyDefaultSiteRole
+> = core.serialization.enum_(["site_manager", "designer", "marketer", "content_editor", "reviewer", "custom"]);
+
+export declare namespace UpdateWorkspaceMemberRoleRequestBodyDefaultSiteRole {
+ export type Raw = "site_manager" | "designer" | "marketer" | "content_editor" | "reviewer" | "custom";
+}
diff --git a/src/serialization/resources/workspaces/resources/members/types/UpdateWorkspaceMemberRoleRequestBodyRole.ts b/src/serialization/resources/workspaces/resources/members/types/UpdateWorkspaceMemberRoleRequestBodyRole.ts
new file mode 100644
index 00000000..79a6cff6
--- /dev/null
+++ b/src/serialization/resources/workspaces/resources/members/types/UpdateWorkspaceMemberRoleRequestBodyRole.ts
@@ -0,0 +1,14 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../../../../../api/index";
+import * as core from "../../../../../../core";
+import type * as serializers from "../../../../../index";
+
+export const UpdateWorkspaceMemberRoleRequestBodyRole: core.serialization.Schema<
+ serializers.workspaces.UpdateWorkspaceMemberRoleRequestBodyRole.Raw,
+ Webflow.workspaces.UpdateWorkspaceMemberRoleRequestBodyRole
+> = core.serialization.enum_(["admin", "member", "reviewer"]);
+
+export declare namespace UpdateWorkspaceMemberRoleRequestBodyRole {
+ export type Raw = "admin" | "member" | "reviewer";
+}
diff --git a/src/serialization/resources/workspaces/resources/members/types/index.ts b/src/serialization/resources/workspaces/resources/members/types/index.ts
new file mode 100644
index 00000000..98e9f30a
--- /dev/null
+++ b/src/serialization/resources/workspaces/resources/members/types/index.ts
@@ -0,0 +1,5 @@
+export * from "./BulkUpdateWorkspaceMemberRolesRequestBodyDefaultSiteRole";
+export * from "./BulkUpdateWorkspaceMemberRolesRequestBodyRole";
+export * from "./MembersListMembersRequestRolesItem";
+export * from "./UpdateWorkspaceMemberRoleRequestBodyDefaultSiteRole";
+export * from "./UpdateWorkspaceMemberRoleRequestBodyRole";
diff --git a/src/serialization/types/AeoAnswerEngine.ts b/src/serialization/types/AeoAnswerEngine.ts
new file mode 100644
index 00000000..6696c14a
--- /dev/null
+++ b/src/serialization/types/AeoAnswerEngine.ts
@@ -0,0 +1,20 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../api/index";
+import * as core from "../../core";
+import type * as serializers from "../index";
+
+export const AeoAnswerEngine: core.serialization.ObjectSchema<
+ serializers.AeoAnswerEngine.Raw,
+ Webflow.AeoAnswerEngine
+> = core.serialization.object({
+ key: core.serialization.string(),
+ name: core.serialization.string(),
+});
+
+export declare namespace AeoAnswerEngine {
+ export interface Raw {
+ key: string;
+ name: string;
+ }
+}
diff --git a/src/serialization/types/AeoAnswerEngineKey.ts b/src/serialization/types/AeoAnswerEngineKey.ts
new file mode 100644
index 00000000..d29e6c5c
--- /dev/null
+++ b/src/serialization/types/AeoAnswerEngineKey.ts
@@ -0,0 +1,14 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../api/index";
+import * as core from "../../core";
+import type * as serializers from "../index";
+
+export const AeoAnswerEngineKey: core.serialization.Schema<
+ serializers.AeoAnswerEngineKey.Raw,
+ Webflow.AeoAnswerEngineKey
+> = core.serialization.enum_(["chat-gpt", "gemini", "claude", "perplexity"]);
+
+export declare namespace AeoAnswerEngineKey {
+ export type Raw = "chat-gpt" | "gemini" | "claude" | "perplexity";
+}
diff --git a/src/serialization/types/AeoAnswerEnginesFilter.ts b/src/serialization/types/AeoAnswerEnginesFilter.ts
new file mode 100644
index 00000000..9d07f450
--- /dev/null
+++ b/src/serialization/types/AeoAnswerEnginesFilter.ts
@@ -0,0 +1,15 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../api/index";
+import * as core from "../../core";
+import type * as serializers from "../index";
+import { AeoAnswerEngineKey } from "./AeoAnswerEngineKey";
+
+export const AeoAnswerEnginesFilter: core.serialization.Schema<
+ serializers.AeoAnswerEnginesFilter.Raw,
+ Webflow.AeoAnswerEnginesFilter
+> = core.serialization.list(AeoAnswerEngineKey);
+
+export declare namespace AeoAnswerEnginesFilter {
+ export type Raw = AeoAnswerEngineKey.Raw[];
+}
diff --git a/src/serialization/types/AeoBotCategory.ts b/src/serialization/types/AeoBotCategory.ts
new file mode 100644
index 00000000..64cef976
--- /dev/null
+++ b/src/serialization/types/AeoBotCategory.ts
@@ -0,0 +1,12 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../api/index";
+import * as core from "../../core";
+import type * as serializers from "../index";
+
+export const AeoBotCategory: core.serialization.Schema =
+ core.serialization.enum_(["agent", "indexer", "multiple", "training"]);
+
+export declare namespace AeoBotCategory {
+ export type Raw = "agent" | "indexer" | "multiple" | "training";
+}
diff --git a/src/serialization/types/AeoBotProvider.ts b/src/serialization/types/AeoBotProvider.ts
new file mode 100644
index 00000000..9a95011f
--- /dev/null
+++ b/src/serialization/types/AeoBotProvider.ts
@@ -0,0 +1,39 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../api/index";
+import * as core from "../../core";
+import type * as serializers from "../index";
+
+export const AeoBotProvider: core.serialization.Schema =
+ core.serialization.enum_([
+ "ai2",
+ "amazon",
+ "anthropic",
+ "apple",
+ "bytedance",
+ "common-crawl",
+ "duckduckgo",
+ "google",
+ "meta",
+ "microsoft",
+ "mistral",
+ "openai",
+ "perplexity",
+ ]);
+
+export declare namespace AeoBotProvider {
+ export type Raw =
+ | "ai2"
+ | "amazon"
+ | "anthropic"
+ | "apple"
+ | "bytedance"
+ | "common-crawl"
+ | "duckduckgo"
+ | "google"
+ | "meta"
+ | "microsoft"
+ | "mistral"
+ | "openai"
+ | "perplexity";
+}
diff --git a/src/serialization/types/AeoBotTrafficFilter.ts b/src/serialization/types/AeoBotTrafficFilter.ts
new file mode 100644
index 00000000..ad4b738d
--- /dev/null
+++ b/src/serialization/types/AeoBotTrafficFilter.ts
@@ -0,0 +1,21 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../api/index";
+import * as core from "../../core";
+import type * as serializers from "../index";
+import { AeoBotCategory } from "./AeoBotCategory";
+
+export const AeoBotTrafficFilter: core.serialization.ObjectSchema<
+ serializers.AeoBotTrafficFilter.Raw,
+ Webflow.AeoBotTrafficFilter
+> = core.serialization.object({
+ botProviders: core.serialization.list(core.serialization.string()).optional(),
+ botCategory: AeoBotCategory.optional(),
+});
+
+export declare namespace AeoBotTrafficFilter {
+ export interface Raw {
+ botProviders?: string[] | null;
+ botCategory?: AeoBotCategory.Raw | null;
+ }
+}
diff --git a/src/serialization/types/AeoBotTrafficPage.ts b/src/serialization/types/AeoBotTrafficPage.ts
new file mode 100644
index 00000000..17dacc4f
--- /dev/null
+++ b/src/serialization/types/AeoBotTrafficPage.ts
@@ -0,0 +1,21 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../api/index";
+import * as core from "../../core";
+import type * as serializers from "../index";
+import { AeoPage } from "./AeoPage";
+
+export const AeoBotTrafficPage: core.serialization.ObjectSchema<
+ serializers.AeoBotTrafficPage.Raw,
+ Webflow.AeoBotTrafficPage
+> = core.serialization.object({
+ requestCount: core.serialization.number(),
+ page: AeoPage.optional(),
+});
+
+export declare namespace AeoBotTrafficPage {
+ export interface Raw {
+ requestCount: number;
+ page?: AeoPage.Raw | null;
+ }
+}
diff --git a/src/serialization/types/AeoBotTrafficPagesResponse.ts b/src/serialization/types/AeoBotTrafficPagesResponse.ts
new file mode 100644
index 00000000..07cbaf23
--- /dev/null
+++ b/src/serialization/types/AeoBotTrafficPagesResponse.ts
@@ -0,0 +1,27 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../api/index";
+import * as core from "../../core";
+import type * as serializers from "../index";
+import { AeoBotTrafficFilter } from "./AeoBotTrafficFilter";
+import { AeoBotTrafficPage } from "./AeoBotTrafficPage";
+import { AeoWindow } from "./AeoWindow";
+
+export const AeoBotTrafficPagesResponse: core.serialization.ObjectSchema<
+ serializers.AeoBotTrafficPagesResponse.Raw,
+ Webflow.AeoBotTrafficPagesResponse
+> = core.serialization.object({
+ report: core.serialization.stringLiteral("bot_traffic_pages"),
+ window: AeoWindow,
+ data: core.serialization.list(AeoBotTrafficPage),
+ filter: AeoBotTrafficFilter.optional(),
+});
+
+export declare namespace AeoBotTrafficPagesResponse {
+ export interface Raw {
+ report: "bot_traffic_pages";
+ window: AeoWindow.Raw;
+ data: AeoBotTrafficPage.Raw[];
+ filter?: AeoBotTrafficFilter.Raw | null;
+ }
+}
diff --git a/src/serialization/types/AeoBotTrafficResponse.ts b/src/serialization/types/AeoBotTrafficResponse.ts
new file mode 100644
index 00000000..bef72a68
--- /dev/null
+++ b/src/serialization/types/AeoBotTrafficResponse.ts
@@ -0,0 +1,26 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../api/index";
+import * as core from "../../core";
+import type * as serializers from "../index";
+import { AeoBotTrafficFilter } from "./AeoBotTrafficFilter";
+import { AeoWindow } from "./AeoWindow";
+
+export const AeoBotTrafficResponse: core.serialization.ObjectSchema<
+ serializers.AeoBotTrafficResponse.Raw,
+ Webflow.AeoBotTrafficResponse
+> = core.serialization.object({
+ report: core.serialization.stringLiteral("bot_traffic"),
+ window: AeoWindow,
+ totalRequestCount: core.serialization.number(),
+ filter: AeoBotTrafficFilter.optional(),
+});
+
+export declare namespace AeoBotTrafficResponse {
+ export interface Raw {
+ report: "bot_traffic";
+ window: AeoWindow.Raw;
+ totalRequestCount: number;
+ filter?: AeoBotTrafficFilter.Raw | null;
+ }
+}
diff --git a/src/serialization/types/AeoBrandNames.ts b/src/serialization/types/AeoBrandNames.ts
new file mode 100644
index 00000000..65398db4
--- /dev/null
+++ b/src/serialization/types/AeoBrandNames.ts
@@ -0,0 +1,12 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../api/index";
+import * as core from "../../core";
+import type * as serializers from "../index";
+
+export const AeoBrandNames: core.serialization.Schema =
+ core.serialization.list(core.serialization.string());
+
+export declare namespace AeoBrandNames {
+ export type Raw = string[];
+}
diff --git a/src/serialization/types/AeoCitationFilter.ts b/src/serialization/types/AeoCitationFilter.ts
new file mode 100644
index 00000000..d898a474
--- /dev/null
+++ b/src/serialization/types/AeoCitationFilter.ts
@@ -0,0 +1,25 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../api/index";
+import * as core from "../../core";
+import type * as serializers from "../index";
+import { AeoAnswerEnginesFilter } from "./AeoAnswerEnginesFilter";
+import { AeoPromptIdsFilter } from "./AeoPromptIdsFilter";
+import { AeoTopicIdsFilter } from "./AeoTopicIdsFilter";
+
+export const AeoCitationFilter: core.serialization.ObjectSchema<
+ serializers.AeoCitationFilter.Raw,
+ Webflow.AeoCitationFilter
+> = core.serialization.object({
+ topicIds: AeoTopicIdsFilter.optional(),
+ promptIds: AeoPromptIdsFilter.optional(),
+ answerEngines: AeoAnswerEnginesFilter.optional(),
+});
+
+export declare namespace AeoCitationFilter {
+ export interface Raw {
+ topicIds?: AeoTopicIdsFilter.Raw | null;
+ promptIds?: AeoPromptIdsFilter.Raw | null;
+ answerEngines?: AeoAnswerEnginesFilter.Raw | null;
+ }
+}
diff --git a/src/serialization/types/AeoCitationRateResponse.ts b/src/serialization/types/AeoCitationRateResponse.ts
new file mode 100644
index 00000000..bd1f07f4
--- /dev/null
+++ b/src/serialization/types/AeoCitationRateResponse.ts
@@ -0,0 +1,32 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../api/index";
+import * as core from "../../core";
+import type * as serializers from "../index";
+import { AeoCitationFilter } from "./AeoCitationFilter";
+import { AeoCitationRateResponseBreakdown } from "./AeoCitationRateResponseBreakdown";
+import { AeoCitationRateResponseDataItem } from "./AeoCitationRateResponseDataItem";
+import { AeoWindow } from "./AeoWindow";
+
+export const AeoCitationRateResponse: core.serialization.ObjectSchema<
+ serializers.AeoCitationRateResponse.Raw,
+ Webflow.AeoCitationRateResponse
+> = core.serialization.object({
+ report: core.serialization.stringLiteral("citation_rate"),
+ window: AeoWindow,
+ breakdown: AeoCitationRateResponseBreakdown,
+ domains: core.serialization.list(core.serialization.string()),
+ data: core.serialization.list(AeoCitationRateResponseDataItem),
+ filter: AeoCitationFilter.optional(),
+});
+
+export declare namespace AeoCitationRateResponse {
+ export interface Raw {
+ report: "citation_rate";
+ window: AeoWindow.Raw;
+ breakdown: AeoCitationRateResponseBreakdown.Raw;
+ domains: string[];
+ data: AeoCitationRateResponseDataItem.Raw[];
+ filter?: AeoCitationFilter.Raw | null;
+ }
+}
diff --git a/src/serialization/types/AeoCitationRateResponseBreakdown.ts b/src/serialization/types/AeoCitationRateResponseBreakdown.ts
new file mode 100644
index 00000000..e621c4e3
--- /dev/null
+++ b/src/serialization/types/AeoCitationRateResponseBreakdown.ts
@@ -0,0 +1,14 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../api/index";
+import * as core from "../../core";
+import type * as serializers from "../index";
+
+export const AeoCitationRateResponseBreakdown: core.serialization.Schema<
+ serializers.AeoCitationRateResponseBreakdown.Raw,
+ Webflow.AeoCitationRateResponseBreakdown
+> = core.serialization.enum_(["topic", "prompt"]);
+
+export declare namespace AeoCitationRateResponseBreakdown {
+ export type Raw = "topic" | "prompt";
+}
diff --git a/src/serialization/types/AeoCitationRateResponseDataItem.ts b/src/serialization/types/AeoCitationRateResponseDataItem.ts
new file mode 100644
index 00000000..daac1d5a
--- /dev/null
+++ b/src/serialization/types/AeoCitationRateResponseDataItem.ts
@@ -0,0 +1,24 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../api/index";
+import * as core from "../../core";
+import type * as serializers from "../index";
+import { AeoPromptLabel } from "./AeoPromptLabel";
+import { AeoTopicLabel } from "./AeoTopicLabel";
+
+export const AeoCitationRateResponseDataItem: core.serialization.ObjectSchema<
+ serializers.AeoCitationRateResponseDataItem.Raw,
+ Webflow.AeoCitationRateResponseDataItem
+> = core.serialization.object({
+ citationRate: core.serialization.number(),
+ topic: AeoTopicLabel.optional(),
+ prompt: AeoPromptLabel.optional(),
+});
+
+export declare namespace AeoCitationRateResponseDataItem {
+ export interface Raw {
+ citationRate: number;
+ topic?: AeoTopicLabel.Raw | null;
+ prompt?: AeoPromptLabel.Raw | null;
+ }
+}
diff --git a/src/serialization/types/AeoCitationsResponse.ts b/src/serialization/types/AeoCitationsResponse.ts
new file mode 100644
index 00000000..78e88504
--- /dev/null
+++ b/src/serialization/types/AeoCitationsResponse.ts
@@ -0,0 +1,33 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../api/index";
+import * as core from "../../core";
+import type * as serializers from "../index";
+import { AeoCitationFilter } from "./AeoCitationFilter";
+import { AeoCitationsResponseDataItem } from "./AeoCitationsResponseDataItem";
+import { AeoWindow } from "./AeoWindow";
+
+export const AeoCitationsResponse: core.serialization.ObjectSchema<
+ serializers.AeoCitationsResponse.Raw,
+ Webflow.AeoCitationsResponse
+> = core.serialization.object({
+ report: core.serialization.stringLiteral("citations"),
+ window: AeoWindow,
+ data: core.serialization.list(AeoCitationsResponseDataItem),
+ hasMore: core.serialization.boolean(),
+ limit: core.serialization.number(),
+ offset: core.serialization.number(),
+ filter: AeoCitationFilter.optional(),
+});
+
+export declare namespace AeoCitationsResponse {
+ export interface Raw {
+ report: "citations";
+ window: AeoWindow.Raw;
+ data: AeoCitationsResponseDataItem.Raw[];
+ hasMore: boolean;
+ limit: number;
+ offset: number;
+ filter?: AeoCitationFilter.Raw | null;
+ }
+}
diff --git a/src/serialization/types/AeoCitationsResponseDataItem.ts b/src/serialization/types/AeoCitationsResponseDataItem.ts
new file mode 100644
index 00000000..d0efafb0
--- /dev/null
+++ b/src/serialization/types/AeoCitationsResponseDataItem.ts
@@ -0,0 +1,35 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../api/index";
+import * as core from "../../core";
+import type * as serializers from "../index";
+import { AeoAnswerEngine } from "./AeoAnswerEngine";
+import { AeoPromptLabel } from "./AeoPromptLabel";
+import { AeoTopicLabel } from "./AeoTopicLabel";
+
+export const AeoCitationsResponseDataItem: core.serialization.ObjectSchema<
+ serializers.AeoCitationsResponseDataItem.Raw,
+ Webflow.AeoCitationsResponseDataItem
+> = core.serialization.object({
+ timestamp: core.serialization.date(),
+ topic: AeoTopicLabel,
+ prompt: AeoPromptLabel,
+ answerEngine: AeoAnswerEngine,
+ citations: core.serialization.list(core.serialization.string()),
+ citationDomains: core.serialization.list(core.serialization.string()),
+ citationPaths: core.serialization.list(core.serialization.string()),
+ mentions: core.serialization.list(core.serialization.string()),
+});
+
+export declare namespace AeoCitationsResponseDataItem {
+ export interface Raw {
+ timestamp: string;
+ topic: AeoTopicLabel.Raw;
+ prompt: AeoPromptLabel.Raw;
+ answerEngine: AeoAnswerEngine.Raw;
+ citations: string[];
+ citationDomains: string[];
+ citationPaths: string[];
+ mentions: string[];
+ }
+}
diff --git a/src/serialization/types/AeoCitedDomainPathsResponse.ts b/src/serialization/types/AeoCitedDomainPathsResponse.ts
new file mode 100644
index 00000000..5da92243
--- /dev/null
+++ b/src/serialization/types/AeoCitedDomainPathsResponse.ts
@@ -0,0 +1,29 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../api/index";
+import * as core from "../../core";
+import type * as serializers from "../index";
+import { AeoCitedPath } from "./AeoCitedPath";
+import { AeoTopicEngineFilter } from "./AeoTopicEngineFilter";
+import { AeoWindow } from "./AeoWindow";
+
+export const AeoCitedDomainPathsResponse: core.serialization.ObjectSchema<
+ serializers.AeoCitedDomainPathsResponse.Raw,
+ Webflow.AeoCitedDomainPathsResponse
+> = core.serialization.object({
+ report: core.serialization.stringLiteral("cited_domain_paths"),
+ window: AeoWindow,
+ domain: core.serialization.string(),
+ data: core.serialization.list(AeoCitedPath),
+ filter: AeoTopicEngineFilter.optional(),
+});
+
+export declare namespace AeoCitedDomainPathsResponse {
+ export interface Raw {
+ report: "cited_domain_paths";
+ window: AeoWindow.Raw;
+ domain: string;
+ data: AeoCitedPath.Raw[];
+ filter?: AeoTopicEngineFilter.Raw | null;
+ }
+}
diff --git a/src/serialization/types/AeoCitedPath.ts b/src/serialization/types/AeoCitedPath.ts
new file mode 100644
index 00000000..4c98738c
--- /dev/null
+++ b/src/serialization/types/AeoCitedPath.ts
@@ -0,0 +1,18 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../api/index";
+import * as core from "../../core";
+import type * as serializers from "../index";
+
+export const AeoCitedPath: core.serialization.ObjectSchema =
+ core.serialization.object({
+ path: core.serialization.string(),
+ citationRate: core.serialization.number(),
+ });
+
+export declare namespace AeoCitedPath {
+ export interface Raw {
+ path: string;
+ citationRate: number;
+ }
+}
diff --git a/src/serialization/types/AeoCompetitorCitationsResponse.ts b/src/serialization/types/AeoCompetitorCitationsResponse.ts
new file mode 100644
index 00000000..7d405ac9
--- /dev/null
+++ b/src/serialization/types/AeoCompetitorCitationsResponse.ts
@@ -0,0 +1,29 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../api/index";
+import * as core from "../../core";
+import type * as serializers from "../index";
+import { AeoCompetitorCitationsResponseDataItem } from "./AeoCompetitorCitationsResponseDataItem";
+import { AeoTopicEngineFilter } from "./AeoTopicEngineFilter";
+import { AeoWindow } from "./AeoWindow";
+
+export const AeoCompetitorCitationsResponse: core.serialization.ObjectSchema<
+ serializers.AeoCompetitorCitationsResponse.Raw,
+ Webflow.AeoCompetitorCitationsResponse
+> = core.serialization.object({
+ report: core.serialization.stringLiteral("competitor_citations"),
+ window: AeoWindow,
+ competitorDomains: core.serialization.list(core.serialization.string()),
+ data: core.serialization.list(AeoCompetitorCitationsResponseDataItem),
+ filter: AeoTopicEngineFilter.optional(),
+});
+
+export declare namespace AeoCompetitorCitationsResponse {
+ export interface Raw {
+ report: "competitor_citations";
+ window: AeoWindow.Raw;
+ competitorDomains: string[];
+ data: AeoCompetitorCitationsResponseDataItem.Raw[];
+ filter?: AeoTopicEngineFilter.Raw | null;
+ }
+}
diff --git a/src/serialization/types/AeoCompetitorCitationsResponseDataItem.ts b/src/serialization/types/AeoCompetitorCitationsResponseDataItem.ts
new file mode 100644
index 00000000..4a8f619a
--- /dev/null
+++ b/src/serialization/types/AeoCompetitorCitationsResponseDataItem.ts
@@ -0,0 +1,29 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../api/index";
+import * as core from "../../core";
+import type * as serializers from "../index";
+import { AeoAnswerEngine } from "./AeoAnswerEngine";
+import { AeoPromptLabel } from "./AeoPromptLabel";
+import { AeoTopicLabel } from "./AeoTopicLabel";
+
+export const AeoCompetitorCitationsResponseDataItem: core.serialization.ObjectSchema<
+ serializers.AeoCompetitorCitationsResponseDataItem.Raw,
+ Webflow.AeoCompetitorCitationsResponseDataItem
+> = core.serialization.object({
+ timestamp: core.serialization.date(),
+ topic: AeoTopicLabel,
+ prompt: AeoPromptLabel,
+ answerEngine: AeoAnswerEngine,
+ citations: core.serialization.list(core.serialization.string()),
+});
+
+export declare namespace AeoCompetitorCitationsResponseDataItem {
+ export interface Raw {
+ timestamp: string;
+ topic: AeoTopicLabel.Raw;
+ prompt: AeoPromptLabel.Raw;
+ answerEngine: AeoAnswerEngine.Raw;
+ citations: string[];
+ }
+}
diff --git a/src/serialization/types/AeoOwnedCitedPath.ts b/src/serialization/types/AeoOwnedCitedPath.ts
new file mode 100644
index 00000000..f653c7ec
--- /dev/null
+++ b/src/serialization/types/AeoOwnedCitedPath.ts
@@ -0,0 +1,23 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../api/index";
+import * as core from "../../core";
+import type * as serializers from "../index";
+import { AeoPage } from "./AeoPage";
+
+export const AeoOwnedCitedPath: core.serialization.ObjectSchema<
+ serializers.AeoOwnedCitedPath.Raw,
+ Webflow.AeoOwnedCitedPath
+> = core.serialization.object({
+ path: core.serialization.string(),
+ citationRate: core.serialization.number(),
+ page: AeoPage.optional(),
+});
+
+export declare namespace AeoOwnedCitedPath {
+ export interface Raw {
+ path: string;
+ citationRate: number;
+ page?: AeoPage.Raw | null;
+ }
+}
diff --git a/src/serialization/types/AeoPage.ts b/src/serialization/types/AeoPage.ts
new file mode 100644
index 00000000..08fbaa1c
--- /dev/null
+++ b/src/serialization/types/AeoPage.ts
@@ -0,0 +1,22 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../api/index";
+import * as core from "../../core";
+import type * as serializers from "../index";
+
+export const AeoPage: core.serialization.ObjectSchema =
+ core.serialization.object({
+ pageId: core.serialization.string().optional(),
+ collectionId: core.serialization.string().optional(),
+ itemSlug: core.serialization.string().optional(),
+ title: core.serialization.string().optional(),
+ });
+
+export declare namespace AeoPage {
+ export interface Raw {
+ pageId?: string | null;
+ collectionId?: string | null;
+ itemSlug?: string | null;
+ title?: string | null;
+ }
+}
diff --git a/src/serialization/types/AeoPageCitationShareResponse.ts b/src/serialization/types/AeoPageCitationShareResponse.ts
new file mode 100644
index 00000000..bf6bb2c9
--- /dev/null
+++ b/src/serialization/types/AeoPageCitationShareResponse.ts
@@ -0,0 +1,32 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../api/index";
+import * as core from "../../core";
+import type * as serializers from "../index";
+import { AeoPageCitationShareResponseDataItem } from "./AeoPageCitationShareResponseDataItem";
+import { AeoPageCitationShareResponseFilter } from "./AeoPageCitationShareResponseFilter";
+import { AeoPageCitationShareResponsePage } from "./AeoPageCitationShareResponsePage";
+import { AeoWindow } from "./AeoWindow";
+
+export const AeoPageCitationShareResponse: core.serialization.ObjectSchema<
+ serializers.AeoPageCitationShareResponse.Raw,
+ Webflow.AeoPageCitationShareResponse
+> = core.serialization.object({
+ report: core.serialization.stringLiteral("page_citation_share"),
+ window: AeoWindow,
+ page: AeoPageCitationShareResponsePage,
+ breakdown: core.serialization.stringLiteral("prompt").optional(),
+ data: core.serialization.list(AeoPageCitationShareResponseDataItem),
+ filter: AeoPageCitationShareResponseFilter.optional(),
+});
+
+export declare namespace AeoPageCitationShareResponse {
+ export interface Raw {
+ report: "page_citation_share";
+ window: AeoWindow.Raw;
+ page: AeoPageCitationShareResponsePage.Raw;
+ breakdown?: "prompt" | null;
+ data: AeoPageCitationShareResponseDataItem.Raw[];
+ filter?: AeoPageCitationShareResponseFilter.Raw | null;
+ }
+}
diff --git a/src/serialization/types/AeoPageCitationShareResponseDataItem.ts b/src/serialization/types/AeoPageCitationShareResponseDataItem.ts
new file mode 100644
index 00000000..2fabbd45
--- /dev/null
+++ b/src/serialization/types/AeoPageCitationShareResponseDataItem.ts
@@ -0,0 +1,21 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../api/index";
+import * as core from "../../core";
+import type * as serializers from "../index";
+import { AeoPromptLabel } from "./AeoPromptLabel";
+
+export const AeoPageCitationShareResponseDataItem: core.serialization.ObjectSchema<
+ serializers.AeoPageCitationShareResponseDataItem.Raw,
+ Webflow.AeoPageCitationShareResponseDataItem
+> = core.serialization.object({
+ citationShare: core.serialization.number(),
+ prompt: AeoPromptLabel.optional(),
+});
+
+export declare namespace AeoPageCitationShareResponseDataItem {
+ export interface Raw {
+ citationShare: number;
+ prompt?: AeoPromptLabel.Raw | null;
+ }
+}
diff --git a/src/serialization/types/AeoPageCitationShareResponseFilter.ts b/src/serialization/types/AeoPageCitationShareResponseFilter.ts
new file mode 100644
index 00000000..2f6a6dbd
--- /dev/null
+++ b/src/serialization/types/AeoPageCitationShareResponseFilter.ts
@@ -0,0 +1,19 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../api/index";
+import * as core from "../../core";
+import type * as serializers from "../index";
+import { AeoAnswerEnginesFilter } from "./AeoAnswerEnginesFilter";
+
+export const AeoPageCitationShareResponseFilter: core.serialization.ObjectSchema<
+ serializers.AeoPageCitationShareResponseFilter.Raw,
+ Webflow.AeoPageCitationShareResponseFilter
+> = core.serialization.object({
+ answerEngines: AeoAnswerEnginesFilter.optional(),
+});
+
+export declare namespace AeoPageCitationShareResponseFilter {
+ export interface Raw {
+ answerEngines?: AeoAnswerEnginesFilter.Raw | null;
+ }
+}
diff --git a/src/serialization/types/AeoPageCitationShareResponsePage.ts b/src/serialization/types/AeoPageCitationShareResponsePage.ts
new file mode 100644
index 00000000..7152f4bd
--- /dev/null
+++ b/src/serialization/types/AeoPageCitationShareResponsePage.ts
@@ -0,0 +1,24 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../api/index";
+import * as core from "../../core";
+import type * as serializers from "../index";
+
+export const AeoPageCitationShareResponsePage: core.serialization.ObjectSchema<
+ serializers.AeoPageCitationShareResponsePage.Raw,
+ Webflow.AeoPageCitationShareResponsePage
+> = core.serialization.object({
+ pageId: core.serialization.string(),
+ collectionId: core.serialization.string().optional(),
+ itemSlug: core.serialization.string().optional(),
+ title: core.serialization.string().optional(),
+});
+
+export declare namespace AeoPageCitationShareResponsePage {
+ export interface Raw {
+ pageId: string;
+ collectionId?: string | null;
+ itemSlug?: string | null;
+ title?: string | null;
+ }
+}
diff --git a/src/serialization/types/AeoPrompt.ts b/src/serialization/types/AeoPrompt.ts
new file mode 100644
index 00000000..06c69ceb
--- /dev/null
+++ b/src/serialization/types/AeoPrompt.ts
@@ -0,0 +1,38 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../api/index";
+import * as core from "../../core";
+import type * as serializers from "../index";
+import { AeoPromptStatus } from "./AeoPromptStatus";
+import { AeoPromptTopic } from "./AeoPromptTopic";
+
+export const AeoPrompt: core.serialization.ObjectSchema =
+ core.serialization.object({
+ id: core.serialization.string(),
+ text: core.serialization.string(),
+ topic: AeoPromptTopic,
+ language: core.serialization.string().optional(),
+ region: core.serialization.string().optional(),
+ persona: core.serialization.string().optional(),
+ tags: core.serialization.list(core.serialization.string()),
+ status: AeoPromptStatus,
+ createdAt: core.serialization.date(),
+ updatedAt: core.serialization.date().optional(),
+ lastRunAt: core.serialization.date().optional(),
+ });
+
+export declare namespace AeoPrompt {
+ export interface Raw {
+ id: string;
+ text: string;
+ topic: AeoPromptTopic.Raw;
+ language?: string | null;
+ region?: string | null;
+ persona?: string | null;
+ tags: string[];
+ status: AeoPromptStatus.Raw;
+ createdAt: string;
+ updatedAt?: string | null;
+ lastRunAt?: string | null;
+ }
+}
diff --git a/src/serialization/types/AeoPromptExecution.ts b/src/serialization/types/AeoPromptExecution.ts
new file mode 100644
index 00000000..f3153b83
--- /dev/null
+++ b/src/serialization/types/AeoPromptExecution.ts
@@ -0,0 +1,47 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../api/index";
+import * as core from "../../core";
+import type * as serializers from "../index";
+import { AeoAnswerEngine } from "./AeoAnswerEngine";
+import { AeoPromptExecutionPromptStatus } from "./AeoPromptExecutionPromptStatus";
+import { AeoPromptExecutionStatus } from "./AeoPromptExecutionStatus";
+import { AeoPromptExecutionTopic } from "./AeoPromptExecutionTopic";
+import { AeoPromptLabel } from "./AeoPromptLabel";
+
+export const AeoPromptExecution: core.serialization.ObjectSchema<
+ serializers.AeoPromptExecution.Raw,
+ Webflow.AeoPromptExecution
+> = core.serialization.object({
+ id: core.serialization.string(),
+ prompt: AeoPromptLabel,
+ promptStatus: AeoPromptExecutionPromptStatus,
+ topic: AeoPromptExecutionTopic.optional(),
+ answerEngine: AeoAnswerEngine,
+ status: AeoPromptExecutionStatus,
+ mentions: core.serialization.list(core.serialization.string()),
+ citations: core.serialization.list(core.serialization.string()),
+ tags: core.serialization.list(core.serialization.string()),
+ preview: core.serialization.string().optional(),
+ createdAt: core.serialization.date(),
+ updatedAt: core.serialization.date(),
+ rawResponse: core.serialization.string().optional(),
+});
+
+export declare namespace AeoPromptExecution {
+ export interface Raw {
+ id: string;
+ prompt: AeoPromptLabel.Raw;
+ promptStatus: AeoPromptExecutionPromptStatus.Raw;
+ topic?: AeoPromptExecutionTopic.Raw | null;
+ answerEngine: AeoAnswerEngine.Raw;
+ status: AeoPromptExecutionStatus.Raw;
+ mentions: string[];
+ citations: string[];
+ tags: string[];
+ preview?: string | null;
+ createdAt: string;
+ updatedAt: string;
+ rawResponse?: string | null;
+ }
+}
diff --git a/src/serialization/types/AeoPromptExecutionListResponse.ts b/src/serialization/types/AeoPromptExecutionListResponse.ts
new file mode 100644
index 00000000..c95c5e7d
--- /dev/null
+++ b/src/serialization/types/AeoPromptExecutionListResponse.ts
@@ -0,0 +1,21 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../api/index";
+import * as core from "../../core";
+import type * as serializers from "../index";
+import { AeoPromptExecution } from "./AeoPromptExecution";
+
+export const AeoPromptExecutionListResponse: core.serialization.ObjectSchema<
+ serializers.AeoPromptExecutionListResponse.Raw,
+ Webflow.AeoPromptExecutionListResponse
+> = core.serialization.object({
+ items: core.serialization.list(AeoPromptExecution),
+ nextCursor: core.serialization.string().optional(),
+});
+
+export declare namespace AeoPromptExecutionListResponse {
+ export interface Raw {
+ items: AeoPromptExecution.Raw[];
+ nextCursor?: string | null;
+ }
+}
diff --git a/src/serialization/types/AeoPromptExecutionPromptStatus.ts b/src/serialization/types/AeoPromptExecutionPromptStatus.ts
new file mode 100644
index 00000000..03ec4c6e
--- /dev/null
+++ b/src/serialization/types/AeoPromptExecutionPromptStatus.ts
@@ -0,0 +1,14 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../api/index";
+import * as core from "../../core";
+import type * as serializers from "../index";
+
+export const AeoPromptExecutionPromptStatus: core.serialization.Schema<
+ serializers.AeoPromptExecutionPromptStatus.Raw,
+ Webflow.AeoPromptExecutionPromptStatus
+> = core.serialization.enum_(["active", "paused", "pending", "archived", "deleted"]);
+
+export declare namespace AeoPromptExecutionPromptStatus {
+ export type Raw = "active" | "paused" | "pending" | "archived" | "deleted";
+}
diff --git a/src/serialization/types/AeoPromptExecutionStatus.ts b/src/serialization/types/AeoPromptExecutionStatus.ts
new file mode 100644
index 00000000..d6d7236f
--- /dev/null
+++ b/src/serialization/types/AeoPromptExecutionStatus.ts
@@ -0,0 +1,14 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../api/index";
+import * as core from "../../core";
+import type * as serializers from "../index";
+
+export const AeoPromptExecutionStatus: core.serialization.Schema<
+ serializers.AeoPromptExecutionStatus.Raw,
+ Webflow.AeoPromptExecutionStatus
+> = core.serialization.enum_(["completed", "failed"]);
+
+export declare namespace AeoPromptExecutionStatus {
+ export type Raw = "completed" | "failed";
+}
diff --git a/src/serialization/types/AeoPromptExecutionTopic.ts b/src/serialization/types/AeoPromptExecutionTopic.ts
new file mode 100644
index 00000000..4bfeb583
--- /dev/null
+++ b/src/serialization/types/AeoPromptExecutionTopic.ts
@@ -0,0 +1,20 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../api/index";
+import * as core from "../../core";
+import type * as serializers from "../index";
+
+export const AeoPromptExecutionTopic: core.serialization.ObjectSchema<
+ serializers.AeoPromptExecutionTopic.Raw,
+ Webflow.AeoPromptExecutionTopic
+> = core.serialization.object({
+ id: core.serialization.string(),
+ name: core.serialization.string(),
+});
+
+export declare namespace AeoPromptExecutionTopic {
+ export interface Raw {
+ id: string;
+ name: string;
+ }
+}
diff --git a/src/serialization/types/AeoPromptIdsFilter.ts b/src/serialization/types/AeoPromptIdsFilter.ts
new file mode 100644
index 00000000..cbffb505
--- /dev/null
+++ b/src/serialization/types/AeoPromptIdsFilter.ts
@@ -0,0 +1,14 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../api/index";
+import * as core from "../../core";
+import type * as serializers from "../index";
+
+export const AeoPromptIdsFilter: core.serialization.Schema<
+ serializers.AeoPromptIdsFilter.Raw,
+ Webflow.AeoPromptIdsFilter
+> = core.serialization.list(core.serialization.string());
+
+export declare namespace AeoPromptIdsFilter {
+ export type Raw = string[];
+}
diff --git a/src/serialization/types/AeoPromptLabel.ts b/src/serialization/types/AeoPromptLabel.ts
new file mode 100644
index 00000000..83aa730a
--- /dev/null
+++ b/src/serialization/types/AeoPromptLabel.ts
@@ -0,0 +1,18 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../api/index";
+import * as core from "../../core";
+import type * as serializers from "../index";
+
+export const AeoPromptLabel: core.serialization.ObjectSchema =
+ core.serialization.object({
+ id: core.serialization.string(),
+ text: core.serialization.string().optional(),
+ });
+
+export declare namespace AeoPromptLabel {
+ export interface Raw {
+ id: string;
+ text?: string | null;
+ }
+}
diff --git a/src/serialization/types/AeoPromptListResponse.ts b/src/serialization/types/AeoPromptListResponse.ts
new file mode 100644
index 00000000..151e2fb6
--- /dev/null
+++ b/src/serialization/types/AeoPromptListResponse.ts
@@ -0,0 +1,21 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../api/index";
+import * as core from "../../core";
+import type * as serializers from "../index";
+import { AeoPrompt } from "./AeoPrompt";
+
+export const AeoPromptListResponse: core.serialization.ObjectSchema<
+ serializers.AeoPromptListResponse.Raw,
+ Webflow.AeoPromptListResponse
+> = core.serialization.object({
+ items: core.serialization.list(AeoPrompt),
+ nextCursor: core.serialization.string().optional(),
+});
+
+export declare namespace AeoPromptListResponse {
+ export interface Raw {
+ items: AeoPrompt.Raw[];
+ nextCursor?: string | null;
+ }
+}
diff --git a/src/serialization/types/AeoPromptStatus.ts b/src/serialization/types/AeoPromptStatus.ts
new file mode 100644
index 00000000..e6f09150
--- /dev/null
+++ b/src/serialization/types/AeoPromptStatus.ts
@@ -0,0 +1,12 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../api/index";
+import * as core from "../../core";
+import type * as serializers from "../index";
+
+export const AeoPromptStatus: core.serialization.Schema =
+ core.serialization.enum_(["active", "paused", "pending", "archived"]);
+
+export declare namespace AeoPromptStatus {
+ export type Raw = "active" | "paused" | "pending" | "archived";
+}
diff --git a/src/serialization/types/AeoPromptTopic.ts b/src/serialization/types/AeoPromptTopic.ts
new file mode 100644
index 00000000..519bdaf8
--- /dev/null
+++ b/src/serialization/types/AeoPromptTopic.ts
@@ -0,0 +1,18 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../api/index";
+import * as core from "../../core";
+import type * as serializers from "../index";
+
+export const AeoPromptTopic: core.serialization.ObjectSchema =
+ core.serialization.object({
+ id: core.serialization.string(),
+ name: core.serialization.string(),
+ });
+
+export declare namespace AeoPromptTopic {
+ export interface Raw {
+ id: string;
+ name: string;
+ }
+}
diff --git a/src/serialization/types/AeoTimeseries.ts b/src/serialization/types/AeoTimeseries.ts
new file mode 100644
index 00000000..7be25b08
--- /dev/null
+++ b/src/serialization/types/AeoTimeseries.ts
@@ -0,0 +1,19 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../api/index";
+import * as core from "../../core";
+import type * as serializers from "../index";
+import { AeoTimeseriesGranularityPeriod } from "./AeoTimeseriesGranularityPeriod";
+
+export const AeoTimeseries: core.serialization.ObjectSchema =
+ core.serialization.object({
+ granularityPeriod: AeoTimeseriesGranularityPeriod,
+ bucketTimeZone: core.serialization.string(),
+ });
+
+export declare namespace AeoTimeseries {
+ export interface Raw {
+ granularityPeriod: AeoTimeseriesGranularityPeriod.Raw;
+ bucketTimeZone: string;
+ }
+}
diff --git a/src/serialization/types/AeoTimeseriesGranularityPeriod.ts b/src/serialization/types/AeoTimeseriesGranularityPeriod.ts
new file mode 100644
index 00000000..2ce7dc8c
--- /dev/null
+++ b/src/serialization/types/AeoTimeseriesGranularityPeriod.ts
@@ -0,0 +1,14 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../api/index";
+import * as core from "../../core";
+import type * as serializers from "../index";
+
+export const AeoTimeseriesGranularityPeriod: core.serialization.Schema<
+ serializers.AeoTimeseriesGranularityPeriod.Raw,
+ Webflow.AeoTimeseriesGranularityPeriod
+> = core.serialization.enum_(["day", "week"]);
+
+export declare namespace AeoTimeseriesGranularityPeriod {
+ export type Raw = "day" | "week";
+}
diff --git a/src/serialization/types/AeoTopCitedDomainsResponse.ts b/src/serialization/types/AeoTopCitedDomainsResponse.ts
new file mode 100644
index 00000000..6f33f8bf
--- /dev/null
+++ b/src/serialization/types/AeoTopCitedDomainsResponse.ts
@@ -0,0 +1,27 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../api/index";
+import * as core from "../../core";
+import type * as serializers from "../index";
+import { AeoTopCitedDomainsResponseDataItem } from "./AeoTopCitedDomainsResponseDataItem";
+import { AeoTopicEngineFilter } from "./AeoTopicEngineFilter";
+import { AeoWindow } from "./AeoWindow";
+
+export const AeoTopCitedDomainsResponse: core.serialization.ObjectSchema<
+ serializers.AeoTopCitedDomainsResponse.Raw,
+ Webflow.AeoTopCitedDomainsResponse
+> = core.serialization.object({
+ report: core.serialization.stringLiteral("top_cited_domains"),
+ window: AeoWindow,
+ data: core.serialization.list(AeoTopCitedDomainsResponseDataItem),
+ filter: AeoTopicEngineFilter.optional(),
+});
+
+export declare namespace AeoTopCitedDomainsResponse {
+ export interface Raw {
+ report: "top_cited_domains";
+ window: AeoWindow.Raw;
+ data: AeoTopCitedDomainsResponseDataItem.Raw[];
+ filter?: AeoTopicEngineFilter.Raw | null;
+ }
+}
diff --git a/src/serialization/types/AeoTopCitedDomainsResponseDataItem.ts b/src/serialization/types/AeoTopCitedDomainsResponseDataItem.ts
new file mode 100644
index 00000000..bf566257
--- /dev/null
+++ b/src/serialization/types/AeoTopCitedDomainsResponseDataItem.ts
@@ -0,0 +1,25 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../api/index";
+import * as core from "../../core";
+import type * as serializers from "../index";
+import { AeoOwnedCitedPath } from "./AeoOwnedCitedPath";
+
+export const AeoTopCitedDomainsResponseDataItem: core.serialization.ObjectSchema<
+ serializers.AeoTopCitedDomainsResponseDataItem.Raw,
+ Webflow.AeoTopCitedDomainsResponseDataItem
+> = core.serialization.object({
+ domain: core.serialization.string(),
+ citationRate: core.serialization.number(),
+ paths: core.serialization.list(AeoOwnedCitedPath).optional(),
+ distinctPathCount: core.serialization.number().optional(),
+});
+
+export declare namespace AeoTopCitedDomainsResponseDataItem {
+ export interface Raw {
+ domain: string;
+ citationRate: number;
+ paths?: AeoOwnedCitedPath.Raw[] | null;
+ distinctPathCount?: number | null;
+ }
+}
diff --git a/src/serialization/types/AeoTopicEngineFilter.ts b/src/serialization/types/AeoTopicEngineFilter.ts
new file mode 100644
index 00000000..f0f118d7
--- /dev/null
+++ b/src/serialization/types/AeoTopicEngineFilter.ts
@@ -0,0 +1,22 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../api/index";
+import * as core from "../../core";
+import type * as serializers from "../index";
+import { AeoAnswerEnginesFilter } from "./AeoAnswerEnginesFilter";
+import { AeoTopicIdsFilter } from "./AeoTopicIdsFilter";
+
+export const AeoTopicEngineFilter: core.serialization.ObjectSchema<
+ serializers.AeoTopicEngineFilter.Raw,
+ Webflow.AeoTopicEngineFilter
+> = core.serialization.object({
+ topicIds: AeoTopicIdsFilter.optional(),
+ answerEngines: AeoAnswerEnginesFilter.optional(),
+});
+
+export declare namespace AeoTopicEngineFilter {
+ export interface Raw {
+ topicIds?: AeoTopicIdsFilter.Raw | null;
+ answerEngines?: AeoAnswerEnginesFilter.Raw | null;
+ }
+}
diff --git a/src/serialization/types/AeoTopicIdsFilter.ts b/src/serialization/types/AeoTopicIdsFilter.ts
new file mode 100644
index 00000000..f2730752
--- /dev/null
+++ b/src/serialization/types/AeoTopicIdsFilter.ts
@@ -0,0 +1,14 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../api/index";
+import * as core from "../../core";
+import type * as serializers from "../index";
+
+export const AeoTopicIdsFilter: core.serialization.Schema<
+ serializers.AeoTopicIdsFilter.Raw,
+ Webflow.AeoTopicIdsFilter
+> = core.serialization.list(core.serialization.string());
+
+export declare namespace AeoTopicIdsFilter {
+ export type Raw = string[];
+}
diff --git a/src/serialization/types/AeoTopicLabel.ts b/src/serialization/types/AeoTopicLabel.ts
new file mode 100644
index 00000000..6d9157fc
--- /dev/null
+++ b/src/serialization/types/AeoTopicLabel.ts
@@ -0,0 +1,18 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../api/index";
+import * as core from "../../core";
+import type * as serializers from "../index";
+
+export const AeoTopicLabel: core.serialization.ObjectSchema =
+ core.serialization.object({
+ id: core.serialization.string(),
+ name: core.serialization.string().optional(),
+ });
+
+export declare namespace AeoTopicLabel {
+ export interface Raw {
+ id: string;
+ name?: string | null;
+ }
+}
diff --git a/src/serialization/types/AeoVisibilityBreakdownResponse.ts b/src/serialization/types/AeoVisibilityBreakdownResponse.ts
new file mode 100644
index 00000000..587d13b0
--- /dev/null
+++ b/src/serialization/types/AeoVisibilityBreakdownResponse.ts
@@ -0,0 +1,35 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../api/index";
+import * as core from "../../core";
+import type * as serializers from "../index";
+import { AeoBrandNames } from "./AeoBrandNames";
+import { AeoVisibilityBreakdownResponseBreakdown } from "./AeoVisibilityBreakdownResponseBreakdown";
+import { AeoVisibilityBreakdownResponseDataItem } from "./AeoVisibilityBreakdownResponseDataItem";
+import { AeoVisibilityFilter } from "./AeoVisibilityFilter";
+import { AeoWindow } from "./AeoWindow";
+
+export const AeoVisibilityBreakdownResponse: core.serialization.ObjectSchema<
+ serializers.AeoVisibilityBreakdownResponse.Raw,
+ Webflow.AeoVisibilityBreakdownResponse
+> = core.serialization.object({
+ report: core.serialization.stringLiteral("visibility_breakdown"),
+ window: AeoWindow,
+ breakdown: AeoVisibilityBreakdownResponseBreakdown,
+ brandNames: AeoBrandNames,
+ limit: core.serialization.number().optional(),
+ data: core.serialization.list(AeoVisibilityBreakdownResponseDataItem),
+ filter: AeoVisibilityFilter.optional(),
+});
+
+export declare namespace AeoVisibilityBreakdownResponse {
+ export interface Raw {
+ report: "visibility_breakdown";
+ window: AeoWindow.Raw;
+ breakdown: AeoVisibilityBreakdownResponseBreakdown.Raw;
+ brandNames: AeoBrandNames.Raw;
+ limit?: number | null;
+ data: AeoVisibilityBreakdownResponseDataItem.Raw[];
+ filter?: AeoVisibilityFilter.Raw | null;
+ }
+}
diff --git a/src/serialization/types/AeoVisibilityBreakdownResponseBreakdown.ts b/src/serialization/types/AeoVisibilityBreakdownResponseBreakdown.ts
new file mode 100644
index 00000000..e5816a87
--- /dev/null
+++ b/src/serialization/types/AeoVisibilityBreakdownResponseBreakdown.ts
@@ -0,0 +1,14 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../api/index";
+import * as core from "../../core";
+import type * as serializers from "../index";
+
+export const AeoVisibilityBreakdownResponseBreakdown: core.serialization.Schema<
+ serializers.AeoVisibilityBreakdownResponseBreakdown.Raw,
+ Webflow.AeoVisibilityBreakdownResponseBreakdown
+> = core.serialization.enum_(["topic", "prompt"]);
+
+export declare namespace AeoVisibilityBreakdownResponseBreakdown {
+ export type Raw = "topic" | "prompt";
+}
diff --git a/src/serialization/types/AeoVisibilityBreakdownResponseDataItem.ts b/src/serialization/types/AeoVisibilityBreakdownResponseDataItem.ts
new file mode 100644
index 00000000..b4a4ddec
--- /dev/null
+++ b/src/serialization/types/AeoVisibilityBreakdownResponseDataItem.ts
@@ -0,0 +1,25 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../api/index";
+import * as core from "../../core";
+import type * as serializers from "../index";
+import { AeoPromptLabel } from "./AeoPromptLabel";
+import { AeoTopicLabel } from "./AeoTopicLabel";
+import { AeoVisibilityScore } from "./AeoVisibilityScore";
+
+export const AeoVisibilityBreakdownResponseDataItem: core.serialization.ObjectSchema<
+ serializers.AeoVisibilityBreakdownResponseDataItem.Raw,
+ Webflow.AeoVisibilityBreakdownResponseDataItem
+> = core.serialization.object({
+ visibilityScore: AeoVisibilityScore,
+ topic: AeoTopicLabel.optional(),
+ prompt: AeoPromptLabel.optional(),
+});
+
+export declare namespace AeoVisibilityBreakdownResponseDataItem {
+ export interface Raw {
+ visibilityScore: AeoVisibilityScore.Raw;
+ topic?: AeoTopicLabel.Raw | null;
+ prompt?: AeoPromptLabel.Raw | null;
+ }
+}
diff --git a/src/serialization/types/AeoVisibilityFilter.ts b/src/serialization/types/AeoVisibilityFilter.ts
new file mode 100644
index 00000000..e6c15991
--- /dev/null
+++ b/src/serialization/types/AeoVisibilityFilter.ts
@@ -0,0 +1,25 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../api/index";
+import * as core from "../../core";
+import type * as serializers from "../index";
+import { AeoAnswerEngineKey } from "./AeoAnswerEngineKey";
+import { AeoPromptIdsFilter } from "./AeoPromptIdsFilter";
+import { AeoTopicIdsFilter } from "./AeoTopicIdsFilter";
+
+export const AeoVisibilityFilter: core.serialization.ObjectSchema<
+ serializers.AeoVisibilityFilter.Raw,
+ Webflow.AeoVisibilityFilter
+> = core.serialization.object({
+ topicIds: AeoTopicIdsFilter.optional(),
+ promptIds: AeoPromptIdsFilter.optional(),
+ answerEngine: AeoAnswerEngineKey.optional(),
+});
+
+export declare namespace AeoVisibilityFilter {
+ export interface Raw {
+ topicIds?: AeoTopicIdsFilter.Raw | null;
+ promptIds?: AeoPromptIdsFilter.Raw | null;
+ answerEngine?: AeoAnswerEngineKey.Raw | null;
+ }
+}
diff --git a/src/serialization/types/AeoVisibilityResponse.ts b/src/serialization/types/AeoVisibilityResponse.ts
new file mode 100644
index 00000000..b8ae23e9
--- /dev/null
+++ b/src/serialization/types/AeoVisibilityResponse.ts
@@ -0,0 +1,33 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../api/index";
+import * as core from "../../core";
+import type * as serializers from "../index";
+import { AeoBrandNames } from "./AeoBrandNames";
+import { AeoTimeseries } from "./AeoTimeseries";
+import { AeoVisibilityFilter } from "./AeoVisibilityFilter";
+import { AeoVisibilityResponseDataItem } from "./AeoVisibilityResponseDataItem";
+import { AeoWindow } from "./AeoWindow";
+
+export const AeoVisibilityResponse: core.serialization.ObjectSchema<
+ serializers.AeoVisibilityResponse.Raw,
+ Webflow.AeoVisibilityResponse
+> = core.serialization.object({
+ report: core.serialization.stringLiteral("visibility"),
+ window: AeoWindow,
+ brandNames: AeoBrandNames,
+ bucketing: AeoTimeseries.optional(),
+ data: core.serialization.list(AeoVisibilityResponseDataItem),
+ filter: AeoVisibilityFilter.optional(),
+});
+
+export declare namespace AeoVisibilityResponse {
+ export interface Raw {
+ report: "visibility";
+ window: AeoWindow.Raw;
+ brandNames: AeoBrandNames.Raw;
+ bucketing?: AeoTimeseries.Raw | null;
+ data: AeoVisibilityResponseDataItem.Raw[];
+ filter?: AeoVisibilityFilter.Raw | null;
+ }
+}
diff --git a/src/serialization/types/AeoVisibilityResponseDataItem.ts b/src/serialization/types/AeoVisibilityResponseDataItem.ts
new file mode 100644
index 00000000..21158afa
--- /dev/null
+++ b/src/serialization/types/AeoVisibilityResponseDataItem.ts
@@ -0,0 +1,21 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../api/index";
+import * as core from "../../core";
+import type * as serializers from "../index";
+import { AeoVisibilityScore } from "./AeoVisibilityScore";
+
+export const AeoVisibilityResponseDataItem: core.serialization.ObjectSchema<
+ serializers.AeoVisibilityResponseDataItem.Raw,
+ Webflow.AeoVisibilityResponseDataItem
+> = core.serialization.object({
+ timestamp: core.serialization.date(),
+ visibilityScore: AeoVisibilityScore,
+});
+
+export declare namespace AeoVisibilityResponseDataItem {
+ export interface Raw {
+ timestamp: string;
+ visibilityScore: AeoVisibilityScore.Raw;
+ }
+}
diff --git a/src/serialization/types/AeoVisibilityScore.ts b/src/serialization/types/AeoVisibilityScore.ts
new file mode 100644
index 00000000..434f6337
--- /dev/null
+++ b/src/serialization/types/AeoVisibilityScore.ts
@@ -0,0 +1,14 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../api/index";
+import * as core from "../../core";
+import type * as serializers from "../index";
+
+export const AeoVisibilityScore: core.serialization.Schema<
+ serializers.AeoVisibilityScore.Raw,
+ Webflow.AeoVisibilityScore
+> = core.serialization.number();
+
+export declare namespace AeoVisibilityScore {
+ export type Raw = number;
+}
diff --git a/src/serialization/types/AeoWindow.ts b/src/serialization/types/AeoWindow.ts
new file mode 100644
index 00000000..ca8421fa
--- /dev/null
+++ b/src/serialization/types/AeoWindow.ts
@@ -0,0 +1,18 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../api/index";
+import * as core from "../../core";
+import type * as serializers from "../index";
+
+export const AeoWindow: core.serialization.ObjectSchema =
+ core.serialization.object({
+ startTime: core.serialization.date(),
+ endTime: core.serialization.date(),
+ });
+
+export declare namespace AeoWindow {
+ export interface Raw {
+ startTime: string;
+ endTime: string;
+ }
+}
diff --git a/src/serialization/types/AnalyzeBucketTimeZone.ts b/src/serialization/types/AnalyzeBucketTimeZone.ts
new file mode 100644
index 00000000..afa275c5
--- /dev/null
+++ b/src/serialization/types/AnalyzeBucketTimeZone.ts
@@ -0,0 +1,14 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../api/index";
+import * as core from "../../core";
+import type * as serializers from "../index";
+
+export const AnalyzeBucketTimeZone: core.serialization.Schema<
+ serializers.AnalyzeBucketTimeZone.Raw,
+ Webflow.AnalyzeBucketTimeZone
+> = core.serialization.string();
+
+export declare namespace AnalyzeBucketTimeZone {
+ export type Raw = string;
+}
diff --git a/src/serialization/types/AnalyzeDailyBucketing.ts b/src/serialization/types/AnalyzeDailyBucketing.ts
new file mode 100644
index 00000000..937677ed
--- /dev/null
+++ b/src/serialization/types/AnalyzeDailyBucketing.ts
@@ -0,0 +1,21 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../api/index";
+import * as core from "../../core";
+import type * as serializers from "../index";
+import { AnalyzeBucketTimeZone } from "./AnalyzeBucketTimeZone";
+
+export const AnalyzeDailyBucketing: core.serialization.ObjectSchema<
+ serializers.AnalyzeDailyBucketing.Raw,
+ Webflow.AnalyzeDailyBucketing
+> = core.serialization.object({
+ granularityPeriod: core.serialization.stringLiteral("day"),
+ bucketTimeZone: AnalyzeBucketTimeZone,
+});
+
+export declare namespace AnalyzeDailyBucketing {
+ export interface Raw {
+ granularityPeriod: "day";
+ bucketTimeZone: AnalyzeBucketTimeZone.Raw;
+ }
+}
diff --git a/src/serialization/types/AnalyzeDailyTimeseriesQuery.ts b/src/serialization/types/AnalyzeDailyTimeseriesQuery.ts
new file mode 100644
index 00000000..54e494c4
--- /dev/null
+++ b/src/serialization/types/AnalyzeDailyTimeseriesQuery.ts
@@ -0,0 +1,19 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../api/index";
+import * as core from "../../core";
+import type * as serializers from "../index";
+import { AnalyzeBucketTimeZone } from "./AnalyzeBucketTimeZone";
+
+export const AnalyzeDailyTimeseriesQuery: core.serialization.ObjectSchema<
+ serializers.AnalyzeDailyTimeseriesQuery.Raw,
+ Webflow.AnalyzeDailyTimeseriesQuery
+> = core.serialization.object({
+ bucketTimeZone: AnalyzeBucketTimeZone,
+});
+
+export declare namespace AnalyzeDailyTimeseriesQuery {
+ export interface Raw {
+ bucketTimeZone: AnalyzeBucketTimeZone.Raw;
+ }
+}
diff --git a/src/serialization/types/AnalyzeFilterOperators.ts b/src/serialization/types/AnalyzeFilterOperators.ts
new file mode 100644
index 00000000..c97eadcf
--- /dev/null
+++ b/src/serialization/types/AnalyzeFilterOperators.ts
@@ -0,0 +1,24 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../api/index";
+import * as core from "../../core";
+import type * as serializers from "../index";
+
+export const AnalyzeFilterOperators: core.serialization.ObjectSchema<
+ serializers.AnalyzeFilterOperators.Raw,
+ Webflow.AnalyzeFilterOperators
+> = core.serialization.object({
+ eq: core.serialization.string().optional(),
+ in: core.serialization.list(core.serialization.string()).optional(),
+ ne: core.serialization.string().optional(),
+ nin: core.serialization.list(core.serialization.string()).optional(),
+});
+
+export declare namespace AnalyzeFilterOperators {
+ export interface Raw {
+ eq?: string | null;
+ in?: string[] | null;
+ ne?: string | null;
+ nin?: string[] | null;
+ }
+}
diff --git a/src/serialization/types/AnalyzeTimeOnPageBucketing.ts b/src/serialization/types/AnalyzeTimeOnPageBucketing.ts
new file mode 100644
index 00000000..aae0c73f
--- /dev/null
+++ b/src/serialization/types/AnalyzeTimeOnPageBucketing.ts
@@ -0,0 +1,22 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../api/index";
+import * as core from "../../core";
+import type * as serializers from "../index";
+import { AnalyzeBucketTimeZone } from "./AnalyzeBucketTimeZone";
+import { TimeOnPageGranularityPeriod } from "./TimeOnPageGranularityPeriod";
+
+export const AnalyzeTimeOnPageBucketing: core.serialization.ObjectSchema<
+ serializers.AnalyzeTimeOnPageBucketing.Raw,
+ Webflow.AnalyzeTimeOnPageBucketing
+> = core.serialization.object({
+ granularityPeriod: TimeOnPageGranularityPeriod,
+ bucketTimeZone: AnalyzeBucketTimeZone,
+});
+
+export declare namespace AnalyzeTimeOnPageBucketing {
+ export interface Raw {
+ granularityPeriod: TimeOnPageGranularityPeriod.Raw;
+ bucketTimeZone: AnalyzeBucketTimeZone.Raw;
+ }
+}
diff --git a/src/serialization/types/AnalyzeWindow.ts b/src/serialization/types/AnalyzeWindow.ts
new file mode 100644
index 00000000..0c6e517e
--- /dev/null
+++ b/src/serialization/types/AnalyzeWindow.ts
@@ -0,0 +1,18 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../api/index";
+import * as core from "../../core";
+import type * as serializers from "../index";
+
+export const AnalyzeWindow: core.serialization.ObjectSchema =
+ core.serialization.object({
+ startTime: core.serialization.date(),
+ endTime: core.serialization.date(),
+ });
+
+export declare namespace AnalyzeWindow {
+ export interface Raw {
+ startTime: string;
+ endTime: string;
+ }
+}
diff --git a/src/serialization/types/Asset.ts b/src/serialization/types/Asset.ts
index 3c9b0b10..99ee0056 100644
--- a/src/serialization/types/Asset.ts
+++ b/src/serialization/types/Asset.ts
@@ -17,6 +17,7 @@ export const Asset: core.serialization.ObjectSchema = core.serialization.object({
+ triggerType: core.serialization.string().optional(),
+ payload: BranchCreatedWebhookPayload.optional(),
+});
+
+export declare namespace BranchCreatedWebhook {
+ export interface Raw {
+ triggerType?: string | null;
+ payload?: BranchCreatedWebhookPayload.Raw | null;
+ }
+}
diff --git a/src/serialization/types/BranchCreatedWebhookPayload.ts b/src/serialization/types/BranchCreatedWebhookPayload.ts
new file mode 100644
index 00000000..7efb1a31
--- /dev/null
+++ b/src/serialization/types/BranchCreatedWebhookPayload.ts
@@ -0,0 +1,30 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../api/index";
+import * as core from "../../core";
+import type * as serializers from "../index";
+
+export const BranchCreatedWebhookPayload: core.serialization.ObjectSchema<
+ serializers.BranchCreatedWebhookPayload.Raw,
+ Webflow.BranchCreatedWebhookPayload
+> = core.serialization.object({
+ siteId: core.serialization.string().optional(),
+ branchId: core.serialization.string().optional(),
+ pageId: core.serialization.string().optional(),
+ parentPageId: core.serialization.string().optional(),
+ pageName: core.serialization.string().optional(),
+ createdBy: core.serialization.string().optional(),
+ createdOn: core.serialization.date().optional(),
+});
+
+export declare namespace BranchCreatedWebhookPayload {
+ export interface Raw {
+ siteId?: string | null;
+ branchId?: string | null;
+ pageId?: string | null;
+ parentPageId?: string | null;
+ pageName?: string | null;
+ createdBy?: string | null;
+ createdOn?: string | null;
+ }
+}
diff --git a/src/serialization/types/BranchDeletedWebhook.ts b/src/serialization/types/BranchDeletedWebhook.ts
new file mode 100644
index 00000000..4fd23ec1
--- /dev/null
+++ b/src/serialization/types/BranchDeletedWebhook.ts
@@ -0,0 +1,21 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../api/index";
+import * as core from "../../core";
+import type * as serializers from "../index";
+import { BranchDeletedWebhookPayload } from "./BranchDeletedWebhookPayload";
+
+export const BranchDeletedWebhook: core.serialization.ObjectSchema<
+ serializers.BranchDeletedWebhook.Raw,
+ Webflow.BranchDeletedWebhook
+> = core.serialization.object({
+ triggerType: core.serialization.string().optional(),
+ payload: BranchDeletedWebhookPayload.optional(),
+});
+
+export declare namespace BranchDeletedWebhook {
+ export interface Raw {
+ triggerType?: string | null;
+ payload?: BranchDeletedWebhookPayload.Raw | null;
+ }
+}
diff --git a/src/serialization/types/BranchDeletedWebhookPayload.ts b/src/serialization/types/BranchDeletedWebhookPayload.ts
new file mode 100644
index 00000000..b360ba54
--- /dev/null
+++ b/src/serialization/types/BranchDeletedWebhookPayload.ts
@@ -0,0 +1,30 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../api/index";
+import * as core from "../../core";
+import type * as serializers from "../index";
+
+export const BranchDeletedWebhookPayload: core.serialization.ObjectSchema<
+ serializers.BranchDeletedWebhookPayload.Raw,
+ Webflow.BranchDeletedWebhookPayload
+> = core.serialization.object({
+ siteId: core.serialization.string().optional(),
+ branchId: core.serialization.string().optional(),
+ pageId: core.serialization.string().optional(),
+ parentPageId: core.serialization.string().optional(),
+ pageName: core.serialization.string().optional(),
+ deletedBy: core.serialization.string().optional(),
+ deletedOn: core.serialization.date().optional(),
+});
+
+export declare namespace BranchDeletedWebhookPayload {
+ export interface Raw {
+ siteId?: string | null;
+ branchId?: string | null;
+ pageId?: string | null;
+ parentPageId?: string | null;
+ pageName?: string | null;
+ deletedBy?: string | null;
+ deletedOn?: string | null;
+ }
+}
diff --git a/src/serialization/types/BranchMergedWebhook.ts b/src/serialization/types/BranchMergedWebhook.ts
new file mode 100644
index 00000000..ca01e06d
--- /dev/null
+++ b/src/serialization/types/BranchMergedWebhook.ts
@@ -0,0 +1,21 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../api/index";
+import * as core from "../../core";
+import type * as serializers from "../index";
+import { BranchMergedWebhookPayload } from "./BranchMergedWebhookPayload";
+
+export const BranchMergedWebhook: core.serialization.ObjectSchema<
+ serializers.BranchMergedWebhook.Raw,
+ Webflow.BranchMergedWebhook
+> = core.serialization.object({
+ triggerType: core.serialization.string().optional(),
+ payload: BranchMergedWebhookPayload.optional(),
+});
+
+export declare namespace BranchMergedWebhook {
+ export interface Raw {
+ triggerType?: string | null;
+ payload?: BranchMergedWebhookPayload.Raw | null;
+ }
+}
diff --git a/src/serialization/types/BranchMergedWebhookPayload.ts b/src/serialization/types/BranchMergedWebhookPayload.ts
new file mode 100644
index 00000000..14998141
--- /dev/null
+++ b/src/serialization/types/BranchMergedWebhookPayload.ts
@@ -0,0 +1,30 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../api/index";
+import * as core from "../../core";
+import type * as serializers from "../index";
+
+export const BranchMergedWebhookPayload: core.serialization.ObjectSchema<
+ serializers.BranchMergedWebhookPayload.Raw,
+ Webflow.BranchMergedWebhookPayload
+> = core.serialization.object({
+ siteId: core.serialization.string().optional(),
+ branchId: core.serialization.string().optional(),
+ pageId: core.serialization.string().optional(),
+ parentPageId: core.serialization.string().optional(),
+ pageName: core.serialization.string().optional(),
+ mergedBy: core.serialization.string().optional(),
+ mergedOn: core.serialization.date().optional(),
+});
+
+export declare namespace BranchMergedWebhookPayload {
+ export interface Raw {
+ siteId?: string | null;
+ branchId?: string | null;
+ pageId?: string | null;
+ parentPageId?: string | null;
+ pageName?: string | null;
+ mergedBy?: string | null;
+ mergedOn?: string | null;
+ }
+}
diff --git a/src/serialization/types/BrowserWindowHeightDataPoint.ts b/src/serialization/types/BrowserWindowHeightDataPoint.ts
new file mode 100644
index 00000000..90e23424
--- /dev/null
+++ b/src/serialization/types/BrowserWindowHeightDataPoint.ts
@@ -0,0 +1,18 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../api/index";
+import * as core from "../../core";
+import type * as serializers from "../index";
+
+export const BrowserWindowHeightDataPoint: core.serialization.ObjectSchema<
+ serializers.BrowserWindowHeightDataPoint.Raw,
+ Webflow.BrowserWindowHeightDataPoint
+> = core.serialization.object({
+ averageBrowserWindowHeightPixels: core.serialization.number(),
+});
+
+export declare namespace BrowserWindowHeightDataPoint {
+ export interface Raw {
+ averageBrowserWindowHeightPixels: number;
+ }
+}
diff --git a/src/serialization/types/BrowserWindowHeightFilter.ts b/src/serialization/types/BrowserWindowHeightFilter.ts
new file mode 100644
index 00000000..374f6b5d
--- /dev/null
+++ b/src/serialization/types/BrowserWindowHeightFilter.ts
@@ -0,0 +1,79 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../api/index";
+import * as core from "../../core";
+import type * as serializers from "../index";
+import { AnalyzeFilterOperators } from "./AnalyzeFilterOperators";
+
+export const BrowserWindowHeightFilter: core.serialization.ObjectSchema<
+ serializers.BrowserWindowHeightFilter.Raw,
+ Webflow.BrowserWindowHeightFilter
+> = core.serialization.object({
+ audienceIds: AnalyzeFilterOperators.optional(),
+ browser: AnalyzeFilterOperators.optional(),
+ collectionId: AnalyzeFilterOperators.optional(),
+ country: AnalyzeFilterOperators.optional(),
+ dayOfWeek: AnalyzeFilterOperators.optional(),
+ deviceBrand: AnalyzeFilterOperators.optional(),
+ deviceType: AnalyzeFilterOperators.optional(),
+ domain: AnalyzeFilterOperators.optional(),
+ itemSlug: AnalyzeFilterOperators.optional(),
+ language: AnalyzeFilterOperators.optional(),
+ locale: AnalyzeFilterOperators.optional(),
+ nextCollectionId: AnalyzeFilterOperators.optional(),
+ nextItemSlug: AnalyzeFilterOperators.optional(),
+ nextPageId: AnalyzeFilterOperators.optional(),
+ os: AnalyzeFilterOperators.optional(),
+ pageId: AnalyzeFilterOperators.optional(),
+ pagePath: AnalyzeFilterOperators.optional(),
+ previousCollectionId: AnalyzeFilterOperators.optional(),
+ previousItemSlug: AnalyzeFilterOperators.optional(),
+ previousPageId: AnalyzeFilterOperators.optional(),
+ referrer: AnalyzeFilterOperators.optional(),
+ region: AnalyzeFilterOperators.optional(),
+ timeOfDay: AnalyzeFilterOperators.optional(),
+ timezone: AnalyzeFilterOperators.optional(),
+ trafficSource: AnalyzeFilterOperators.optional(),
+ utmCampaign: AnalyzeFilterOperators.optional(),
+ utmContent: AnalyzeFilterOperators.optional(),
+ utmMedium: AnalyzeFilterOperators.optional(),
+ utmSource: AnalyzeFilterOperators.optional(),
+ utmTerm: AnalyzeFilterOperators.optional(),
+ visitStatus: AnalyzeFilterOperators.optional(),
+});
+
+export declare namespace BrowserWindowHeightFilter {
+ export interface Raw {
+ audienceIds?: AnalyzeFilterOperators.Raw | null;
+ browser?: AnalyzeFilterOperators.Raw | null;
+ collectionId?: AnalyzeFilterOperators.Raw | null;
+ country?: AnalyzeFilterOperators.Raw | null;
+ dayOfWeek?: AnalyzeFilterOperators.Raw | null;
+ deviceBrand?: AnalyzeFilterOperators.Raw | null;
+ deviceType?: AnalyzeFilterOperators.Raw | null;
+ domain?: AnalyzeFilterOperators.Raw | null;
+ itemSlug?: AnalyzeFilterOperators.Raw | null;
+ language?: AnalyzeFilterOperators.Raw | null;
+ locale?: AnalyzeFilterOperators.Raw | null;
+ nextCollectionId?: AnalyzeFilterOperators.Raw | null;
+ nextItemSlug?: AnalyzeFilterOperators.Raw | null;
+ nextPageId?: AnalyzeFilterOperators.Raw | null;
+ os?: AnalyzeFilterOperators.Raw | null;
+ pageId?: AnalyzeFilterOperators.Raw | null;
+ pagePath?: AnalyzeFilterOperators.Raw | null;
+ previousCollectionId?: AnalyzeFilterOperators.Raw | null;
+ previousItemSlug?: AnalyzeFilterOperators.Raw | null;
+ previousPageId?: AnalyzeFilterOperators.Raw | null;
+ referrer?: AnalyzeFilterOperators.Raw | null;
+ region?: AnalyzeFilterOperators.Raw | null;
+ timeOfDay?: AnalyzeFilterOperators.Raw | null;
+ timezone?: AnalyzeFilterOperators.Raw | null;
+ trafficSource?: AnalyzeFilterOperators.Raw | null;
+ utmCampaign?: AnalyzeFilterOperators.Raw | null;
+ utmContent?: AnalyzeFilterOperators.Raw | null;
+ utmMedium?: AnalyzeFilterOperators.Raw | null;
+ utmSource?: AnalyzeFilterOperators.Raw | null;
+ utmTerm?: AnalyzeFilterOperators.Raw | null;
+ visitStatus?: AnalyzeFilterOperators.Raw | null;
+ }
+}
diff --git a/src/serialization/types/BrowserWindowHeightResponse.ts b/src/serialization/types/BrowserWindowHeightResponse.ts
new file mode 100644
index 00000000..e1bc35f5
--- /dev/null
+++ b/src/serialization/types/BrowserWindowHeightResponse.ts
@@ -0,0 +1,27 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../api/index";
+import * as core from "../../core";
+import type * as serializers from "../index";
+import { AnalyzeWindow } from "./AnalyzeWindow";
+import { BrowserWindowHeightDataPoint } from "./BrowserWindowHeightDataPoint";
+import { BrowserWindowHeightFilter } from "./BrowserWindowHeightFilter";
+
+export const BrowserWindowHeightResponse: core.serialization.ObjectSchema<
+ serializers.BrowserWindowHeightResponse.Raw,
+ Webflow.BrowserWindowHeightResponse
+> = core.serialization.object({
+ report: core.serialization.stringLiteral("browser_window_height"),
+ window: AnalyzeWindow,
+ data: core.serialization.list(BrowserWindowHeightDataPoint),
+ filter: BrowserWindowHeightFilter.optional(),
+});
+
+export declare namespace BrowserWindowHeightResponse {
+ export interface Raw {
+ report: "browser_window_height";
+ window: AnalyzeWindow.Raw;
+ data: BrowserWindowHeightDataPoint.Raw[];
+ filter?: BrowserWindowHeightFilter.Raw | null;
+ }
+}
diff --git a/src/serialization/types/CollaboratorClientInvite.ts b/src/serialization/types/CollaboratorClientInvite.ts
new file mode 100644
index 00000000..f24fdfac
--- /dev/null
+++ b/src/serialization/types/CollaboratorClientInvite.ts
@@ -0,0 +1,23 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../api/index";
+import * as core from "../../core";
+import type * as serializers from "../index";
+import { InviteWorkspaceMemberRequestBodyEmailSiteAccessItem } from "./InviteWorkspaceMemberRequestBodyEmailSiteAccessItem";
+
+export const CollaboratorClientInvite: core.serialization.ObjectSchema<
+ serializers.CollaboratorClientInvite.Raw,
+ Webflow.CollaboratorClientInvite
+> = core.serialization.object({
+ email: core.serialization.string(),
+ workspaceRole: core.serialization.stringLiteral("client"),
+ siteAccess: core.serialization.list(InviteWorkspaceMemberRequestBodyEmailSiteAccessItem),
+});
+
+export declare namespace CollaboratorClientInvite {
+ export interface Raw {
+ email: string;
+ workspaceRole: "client";
+ siteAccess: InviteWorkspaceMemberRequestBodyEmailSiteAccessItem.Raw[];
+ }
+}
diff --git a/src/serialization/types/Collection.ts b/src/serialization/types/Collection.ts
index 9e3b601b..cd3c6962 100644
--- a/src/serialization/types/Collection.ts
+++ b/src/serialization/types/Collection.ts
@@ -4,6 +4,7 @@ import type * as Webflow from "../../api/index";
import * as core from "../../core";
import type * as serializers from "../index";
import { Field } from "./Field";
+import { FieldGroup } from "./FieldGroup";
export const Collection: core.serialization.ObjectSchema =
core.serialization.object({
@@ -14,6 +15,7 @@ export const Collection: core.serialization.ObjectSchema =
core.serialization.object({
threadId: core.serialization.string().optional(),
commentId: core.serialization.string().optional(),
- type: core.serialization.string().optional(),
+ type: CommentPayloadType.optional(),
siteId: core.serialization.string().optional(),
pageId: core.serialization.string().optional(),
localeId: core.serialization.string().optional(),
@@ -28,7 +29,7 @@ export declare namespace CommentPayload {
export interface Raw {
threadId?: string | null;
commentId?: string | null;
- type?: string | null;
+ type?: CommentPayloadType.Raw | null;
siteId?: string | null;
pageId?: string | null;
localeId?: string | null;
diff --git a/src/serialization/types/CommentPayloadType.ts b/src/serialization/types/CommentPayloadType.ts
new file mode 100644
index 00000000..49fa7e1d
--- /dev/null
+++ b/src/serialization/types/CommentPayloadType.ts
@@ -0,0 +1,14 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../api/index";
+import * as core from "../../core";
+import type * as serializers from "../index";
+
+export const CommentPayloadType: core.serialization.Schema<
+ serializers.CommentPayloadType.Raw,
+ Webflow.CommentPayloadType
+> = core.serialization.enum_(["new_comment", "reply"]);
+
+export declare namespace CommentPayloadType {
+ export type Raw = "new_comment" | "reply";
+}
diff --git a/src/serialization/types/CustomFont.ts b/src/serialization/types/CustomFont.ts
new file mode 100644
index 00000000..96c6763d
--- /dev/null
+++ b/src/serialization/types/CustomFont.ts
@@ -0,0 +1,35 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../api/index";
+import * as core from "../../core";
+import type * as serializers from "../index";
+import { CustomFontAxis } from "./CustomFontAxis";
+import { CustomFontFontDisplay } from "./CustomFontFontDisplay";
+import { CustomFontFormat } from "./CustomFontFormat";
+
+export const CustomFont: core.serialization.ObjectSchema =
+ core.serialization.object({
+ id: core.serialization.string().optional(),
+ fontFamily: core.serialization.string(),
+ format: CustomFontFormat.optional(),
+ fileName: core.serialization.string().optional(),
+ weight: core.serialization.number(),
+ italic: core.serialization.boolean(),
+ fontDisplay: CustomFontFontDisplay,
+ axes: core.serialization.list(CustomFontAxis),
+ hostedUrl: core.serialization.string().optional(),
+ });
+
+export declare namespace CustomFont {
+ export interface Raw {
+ id?: string | null;
+ fontFamily: string;
+ format?: CustomFontFormat.Raw | null;
+ fileName?: string | null;
+ weight: number;
+ italic: boolean;
+ fontDisplay: CustomFontFontDisplay.Raw;
+ axes: CustomFontAxis.Raw[];
+ hostedUrl?: string | null;
+ }
+}
diff --git a/src/serialization/types/CustomFontAxis.ts b/src/serialization/types/CustomFontAxis.ts
new file mode 100644
index 00000000..9319dc96
--- /dev/null
+++ b/src/serialization/types/CustomFontAxis.ts
@@ -0,0 +1,24 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../api/index";
+import * as core from "../../core";
+import type * as serializers from "../index";
+
+export const CustomFontAxis: core.serialization.ObjectSchema =
+ core.serialization.object({
+ tag: core.serialization.string(),
+ name: core.serialization.string().optional(),
+ min: core.serialization.number(),
+ max: core.serialization.number(),
+ defaultValue: core.serialization.number(),
+ });
+
+export declare namespace CustomFontAxis {
+ export interface Raw {
+ tag: string;
+ name?: string | null;
+ min: number;
+ max: number;
+ defaultValue: number;
+ }
+}
diff --git a/src/serialization/types/CustomFontBatchCreateResponse.ts b/src/serialization/types/CustomFontBatchCreateResponse.ts
new file mode 100644
index 00000000..caf7e665
--- /dev/null
+++ b/src/serialization/types/CustomFontBatchCreateResponse.ts
@@ -0,0 +1,22 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../api/index";
+import * as core from "../../core";
+import type * as serializers from "../index";
+import { CustomFontBatchCreateResponseCreatedItem } from "./CustomFontBatchCreateResponseCreatedItem";
+import { CustomFontBatchCreateResponseFailedItem } from "./CustomFontBatchCreateResponseFailedItem";
+
+export const CustomFontBatchCreateResponse: core.serialization.ObjectSchema<
+ serializers.CustomFontBatchCreateResponse.Raw,
+ Webflow.CustomFontBatchCreateResponse
+> = core.serialization.object({
+ created: core.serialization.list(CustomFontBatchCreateResponseCreatedItem),
+ failed: core.serialization.list(CustomFontBatchCreateResponseFailedItem),
+});
+
+export declare namespace CustomFontBatchCreateResponse {
+ export interface Raw {
+ created: CustomFontBatchCreateResponseCreatedItem.Raw[];
+ failed: CustomFontBatchCreateResponseFailedItem.Raw[];
+ }
+}
diff --git a/src/serialization/types/CustomFontBatchCreateResponseCreatedItem.ts b/src/serialization/types/CustomFontBatchCreateResponseCreatedItem.ts
new file mode 100644
index 00000000..ea3253f9
--- /dev/null
+++ b/src/serialization/types/CustomFontBatchCreateResponseCreatedItem.ts
@@ -0,0 +1,22 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../api/index";
+import * as core from "../../core";
+import type * as serializers from "../index";
+import { CustomFont } from "./CustomFont";
+import { CustomFontUpload } from "./CustomFontUpload";
+
+export const CustomFontBatchCreateResponseCreatedItem: core.serialization.ObjectSchema<
+ serializers.CustomFontBatchCreateResponseCreatedItem.Raw,
+ Webflow.CustomFontBatchCreateResponseCreatedItem
+> = core.serialization.object({
+ customFont: CustomFont,
+ upload: CustomFontUpload,
+});
+
+export declare namespace CustomFontBatchCreateResponseCreatedItem {
+ export interface Raw {
+ customFont: CustomFont.Raw;
+ upload: CustomFontUpload.Raw;
+ }
+}
diff --git a/src/serialization/types/CustomFontBatchCreateResponseFailedItem.ts b/src/serialization/types/CustomFontBatchCreateResponseFailedItem.ts
new file mode 100644
index 00000000..73ad62a7
--- /dev/null
+++ b/src/serialization/types/CustomFontBatchCreateResponseFailedItem.ts
@@ -0,0 +1,24 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../api/index";
+import * as core from "../../core";
+import type * as serializers from "../index";
+
+export const CustomFontBatchCreateResponseFailedItem: core.serialization.ObjectSchema<
+ serializers.CustomFontBatchCreateResponseFailedItem.Raw,
+ Webflow.CustomFontBatchCreateResponseFailedItem
+> = core.serialization.object({
+ index: core.serialization.number(),
+ fileName: core.serialization.string(),
+ name: core.serialization.string(),
+ msg: core.serialization.string(),
+});
+
+export declare namespace CustomFontBatchCreateResponseFailedItem {
+ export interface Raw {
+ index: number;
+ fileName: string;
+ name: string;
+ msg: string;
+ }
+}
diff --git a/src/serialization/types/CustomFontBatchDeleteResponse.ts b/src/serialization/types/CustomFontBatchDeleteResponse.ts
new file mode 100644
index 00000000..6e716814
--- /dev/null
+++ b/src/serialization/types/CustomFontBatchDeleteResponse.ts
@@ -0,0 +1,22 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../api/index";
+import * as core from "../../core";
+import type * as serializers from "../index";
+import { CustomFontBatchDeleteResponseDeletedItem } from "./CustomFontBatchDeleteResponseDeletedItem";
+import { CustomFontBatchDeleteResponseFailedItem } from "./CustomFontBatchDeleteResponseFailedItem";
+
+export const CustomFontBatchDeleteResponse: core.serialization.ObjectSchema<
+ serializers.CustomFontBatchDeleteResponse.Raw,
+ Webflow.CustomFontBatchDeleteResponse
+> = core.serialization.object({
+ deleted: core.serialization.list(CustomFontBatchDeleteResponseDeletedItem),
+ failed: core.serialization.list(CustomFontBatchDeleteResponseFailedItem),
+});
+
+export declare namespace CustomFontBatchDeleteResponse {
+ export interface Raw {
+ deleted: CustomFontBatchDeleteResponseDeletedItem.Raw[];
+ failed: CustomFontBatchDeleteResponseFailedItem.Raw[];
+ }
+}
diff --git a/src/serialization/types/CustomFontBatchDeleteResponseDeletedItem.ts b/src/serialization/types/CustomFontBatchDeleteResponseDeletedItem.ts
new file mode 100644
index 00000000..20a7bb53
--- /dev/null
+++ b/src/serialization/types/CustomFontBatchDeleteResponseDeletedItem.ts
@@ -0,0 +1,18 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../api/index";
+import * as core from "../../core";
+import type * as serializers from "../index";
+
+export const CustomFontBatchDeleteResponseDeletedItem: core.serialization.ObjectSchema<
+ serializers.CustomFontBatchDeleteResponseDeletedItem.Raw,
+ Webflow.CustomFontBatchDeleteResponseDeletedItem
+> = core.serialization.object({
+ id: core.serialization.string(),
+});
+
+export declare namespace CustomFontBatchDeleteResponseDeletedItem {
+ export interface Raw {
+ id: string;
+ }
+}
diff --git a/src/serialization/types/CustomFontBatchDeleteResponseFailedItem.ts b/src/serialization/types/CustomFontBatchDeleteResponseFailedItem.ts
new file mode 100644
index 00000000..f2a9e296
--- /dev/null
+++ b/src/serialization/types/CustomFontBatchDeleteResponseFailedItem.ts
@@ -0,0 +1,22 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../api/index";
+import * as core from "../../core";
+import type * as serializers from "../index";
+
+export const CustomFontBatchDeleteResponseFailedItem: core.serialization.ObjectSchema<
+ serializers.CustomFontBatchDeleteResponseFailedItem.Raw,
+ Webflow.CustomFontBatchDeleteResponseFailedItem
+> = core.serialization.object({
+ id: core.serialization.string(),
+ name: core.serialization.string(),
+ msg: core.serialization.string(),
+});
+
+export declare namespace CustomFontBatchDeleteResponseFailedItem {
+ export interface Raw {
+ id: string;
+ name: string;
+ msg: string;
+ }
+}
diff --git a/src/serialization/types/CustomFontCreateResponse.ts b/src/serialization/types/CustomFontCreateResponse.ts
new file mode 100644
index 00000000..276a812b
--- /dev/null
+++ b/src/serialization/types/CustomFontCreateResponse.ts
@@ -0,0 +1,22 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../api/index";
+import * as core from "../../core";
+import type * as serializers from "../index";
+import { CustomFont } from "./CustomFont";
+import { CustomFontUpload } from "./CustomFontUpload";
+
+export const CustomFontCreateResponse: core.serialization.ObjectSchema<
+ serializers.CustomFontCreateResponse.Raw,
+ Webflow.CustomFontCreateResponse
+> = core.serialization.object({
+ customFont: CustomFont,
+ upload: CustomFontUpload,
+});
+
+export declare namespace CustomFontCreateResponse {
+ export interface Raw {
+ customFont: CustomFont.Raw;
+ upload: CustomFontUpload.Raw;
+ }
+}
diff --git a/src/serialization/types/CustomFontFontDisplay.ts b/src/serialization/types/CustomFontFontDisplay.ts
new file mode 100644
index 00000000..218acac4
--- /dev/null
+++ b/src/serialization/types/CustomFontFontDisplay.ts
@@ -0,0 +1,14 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../api/index";
+import * as core from "../../core";
+import type * as serializers from "../index";
+
+export const CustomFontFontDisplay: core.serialization.Schema<
+ serializers.CustomFontFontDisplay.Raw,
+ Webflow.CustomFontFontDisplay
+> = core.serialization.enum_(["auto", "block", "swap", "fallback", "optional"]);
+
+export declare namespace CustomFontFontDisplay {
+ export type Raw = "auto" | "block" | "swap" | "fallback" | "optional";
+}
diff --git a/src/serialization/types/CustomFontFormat.ts b/src/serialization/types/CustomFontFormat.ts
new file mode 100644
index 00000000..65ce22f7
--- /dev/null
+++ b/src/serialization/types/CustomFontFormat.ts
@@ -0,0 +1,12 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../api/index";
+import * as core from "../../core";
+import type * as serializers from "../index";
+
+export const CustomFontFormat: core.serialization.Schema =
+ core.serialization.enum_(["woff2", "woff", "truetype", "opentype", "embedded-opentype", "svg"]);
+
+export declare namespace CustomFontFormat {
+ export type Raw = "woff2" | "woff" | "truetype" | "opentype" | "embedded-opentype" | "svg";
+}
diff --git a/src/serialization/types/CustomFontUpload.ts b/src/serialization/types/CustomFontUpload.ts
new file mode 100644
index 00000000..0eb856f5
--- /dev/null
+++ b/src/serialization/types/CustomFontUpload.ts
@@ -0,0 +1,23 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../api/index";
+import * as core from "../../core";
+import type * as serializers from "../index";
+import { CustomFontUploadFields } from "./CustomFontUploadFields";
+
+export const CustomFontUpload: core.serialization.ObjectSchema<
+ serializers.CustomFontUpload.Raw,
+ Webflow.CustomFontUpload
+> = core.serialization.object({
+ url: core.serialization.string(),
+ fields: CustomFontUploadFields,
+ expiresAt: core.serialization.date(),
+});
+
+export declare namespace CustomFontUpload {
+ export interface Raw {
+ url: string;
+ fields: CustomFontUploadFields.Raw;
+ expiresAt: string;
+ }
+}
diff --git a/src/serialization/types/CustomFontUploadFields.ts b/src/serialization/types/CustomFontUploadFields.ts
new file mode 100644
index 00000000..2b9dcc49
--- /dev/null
+++ b/src/serialization/types/CustomFontUploadFields.ts
@@ -0,0 +1,42 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../api/index";
+import * as core from "../../core";
+import type * as serializers from "../index";
+
+export const CustomFontUploadFields: core.serialization.ObjectSchema<
+ serializers.CustomFontUploadFields.Raw,
+ Webflow.CustomFontUploadFields
+> = core.serialization.object({
+ bucket: core.serialization.string(),
+ key: core.serialization.string(),
+ policy: core.serialization.property("Policy", core.serialization.string()),
+ xAmzAlgorithm: core.serialization.property("X-Amz-Algorithm", core.serialization.string()),
+ xAmzCredential: core.serialization.property("X-Amz-Credential", core.serialization.string()),
+ xAmzDate: core.serialization.property("X-Amz-Date", core.serialization.string()),
+ xAmzSignature: core.serialization.property("X-Amz-Signature", core.serialization.string()),
+ xAmzSecurityToken: core.serialization.property("X-Amz-Security-Token", core.serialization.string().optional()),
+ contentMd5: core.serialization.property("Content-MD5", core.serialization.string()),
+ acl: core.serialization.string(),
+ cacheControl: core.serialization.property("Cache-Control", core.serialization.string()),
+ contentType: core.serialization.property("Content-Type", core.serialization.string()),
+ successActionStatus: core.serialization.property("success_action_status", core.serialization.string()),
+});
+
+export declare namespace CustomFontUploadFields {
+ export interface Raw {
+ bucket: string;
+ key: string;
+ Policy: string;
+ "X-Amz-Algorithm": string;
+ "X-Amz-Credential": string;
+ "X-Amz-Date": string;
+ "X-Amz-Signature": string;
+ "X-Amz-Security-Token"?: string | null;
+ "Content-MD5": string;
+ acl: string;
+ "Cache-Control": string;
+ "Content-Type": string;
+ success_action_status: string;
+ }
+}
diff --git a/src/serialization/types/CustomFonts.ts b/src/serialization/types/CustomFonts.ts
new file mode 100644
index 00000000..41399bf5
--- /dev/null
+++ b/src/serialization/types/CustomFonts.ts
@@ -0,0 +1,20 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../api/index";
+import * as core from "../../core";
+import type * as serializers from "../index";
+import { CustomFont } from "./CustomFont";
+import { Pagination } from "./Pagination";
+
+export const CustomFonts: core.serialization.ObjectSchema =
+ core.serialization.object({
+ customFonts: core.serialization.list(CustomFont),
+ pagination: Pagination,
+ });
+
+export declare namespace CustomFonts {
+ export interface Raw {
+ customFonts: CustomFont.Raw[];
+ pagination: Pagination.Raw;
+ }
+}
diff --git a/src/serialization/types/ErrorCode.ts b/src/serialization/types/ErrorCode.ts
index 36e3fe74..29d09fc4 100644
--- a/src/serialization/types/ErrorCode.ts
+++ b/src/serialization/types/ErrorCode.ts
@@ -6,66 +6,204 @@ import type * as serializers from "../index";
export const ErrorCode: core.serialization.Schema =
core.serialization.enum_([
+ "aeo_input_validation",
+ "analyze_filter_conflict",
+ "analyze_input_validation",
+ "analyze_unsupported_filter",
"bad_request",
+ "batch_too_large",
+ "before_historical_floor",
+ "billing_provider_unavailable",
+ "branch_merge_conflict",
+ "branch_merge_in_progress",
+ "branch_not_found",
+ "branch_publish_failed",
+ "branch_sync_pending",
+ "branch_task_not_found",
+ "branch_update_in_progress",
+ "brand_not_configured",
+ "cannot_invite_self",
+ "cannot_remove_self",
+ "cannot_update_user_role",
+ "client_seats_unavailable",
"collection_not_found",
+ "competitors_not_configured",
"conflict",
+ "conflicting_scope_filters",
+ "default_site_role_required",
"duplicate_collection",
+ "duplicate_member_in_request",
+ "duplicate_site_in_request",
"duplicate_user_email",
"ecommerce_not_enabled",
+ "end_time_too_recent",
+ "enterprise_provisioning_cloud_app_not_supported",
+ "enterprise_provisioning_upstream_error",
+ "enterprise_self_provisioning_not_entitled",
"forbidden",
"forms_require_republish",
"incompatible_webhook_filter",
+ "insufficient_permissions",
+ "insufficient_seats",
"internal_error",
"invalid_auth_version",
"invalid_credentials",
"invalid_domain",
+ "invalid_resolution",
+ "invalid_site_role",
+ "invalid_time_range",
"invalid_user_email",
+ "invalid_workspace_role",
+ "invite_expired",
+ "invite_role_conflict",
"item_not_found",
+ "managed_by_scim",
+ "member_already_has_access",
+ "member_has_no_site_access",
+ "member_is_paying_client",
+ "member_not_found",
+ "member_not_removable",
+ "member_role_conflict",
"missing_scopes",
"no_domains",
+ "no_members_or_invites",
"not_authorized",
"not_enterprise_plan_site",
"not_enterprise_plan_workspace",
+ "optimize_before_historical_floor",
+ "optimize_input_validation",
+ "optimize_invalid_interval",
+ "optimize_unknown_dimension",
+ "optimize_unknown_goal",
+ "optimize_unknown_optimization",
+ "optimize_unsupported_group_by",
"order_not_found",
+ "page_cannot_branch",
"resource_not_found",
+ "service_unavailable",
+ "site_access_not_applicable_to_member",
+ "site_access_not_scopable_for_role",
+ "site_access_roles_must_match",
+ "site_not_in_workspace",
+ "site_role_id_invalid",
+ "site_role_id_not_allowed",
+ "site_role_id_required",
+ "site_specific_access_disabled",
+ "site_specific_access_not_entitled",
+ "time_range_too_wide",
"too_many_requests",
+ "unsupported_bot_provider",
"unsupported_version",
"unsupported_webhook_trigger_type",
"user_limit_reached",
"user_not_found",
"users_not_enabled",
"validation_error",
+ "workspace_invite_not_found",
+ "workspace_member_managed_by_scim",
+ "workspace_member_not_found",
+ "workspace_member_not_removable",
+ "workspace_role_not_grantable",
]);
export declare namespace ErrorCode {
export type Raw =
+ | "aeo_input_validation"
+ | "analyze_filter_conflict"
+ | "analyze_input_validation"
+ | "analyze_unsupported_filter"
| "bad_request"
+ | "batch_too_large"
+ | "before_historical_floor"
+ | "billing_provider_unavailable"
+ | "branch_merge_conflict"
+ | "branch_merge_in_progress"
+ | "branch_not_found"
+ | "branch_publish_failed"
+ | "branch_sync_pending"
+ | "branch_task_not_found"
+ | "branch_update_in_progress"
+ | "brand_not_configured"
+ | "cannot_invite_self"
+ | "cannot_remove_self"
+ | "cannot_update_user_role"
+ | "client_seats_unavailable"
| "collection_not_found"
+ | "competitors_not_configured"
| "conflict"
+ | "conflicting_scope_filters"
+ | "default_site_role_required"
| "duplicate_collection"
+ | "duplicate_member_in_request"
+ | "duplicate_site_in_request"
| "duplicate_user_email"
| "ecommerce_not_enabled"
+ | "end_time_too_recent"
+ | "enterprise_provisioning_cloud_app_not_supported"
+ | "enterprise_provisioning_upstream_error"
+ | "enterprise_self_provisioning_not_entitled"
| "forbidden"
| "forms_require_republish"
| "incompatible_webhook_filter"
+ | "insufficient_permissions"
+ | "insufficient_seats"
| "internal_error"
| "invalid_auth_version"
| "invalid_credentials"
| "invalid_domain"
+ | "invalid_resolution"
+ | "invalid_site_role"
+ | "invalid_time_range"
| "invalid_user_email"
+ | "invalid_workspace_role"
+ | "invite_expired"
+ | "invite_role_conflict"
| "item_not_found"
+ | "managed_by_scim"
+ | "member_already_has_access"
+ | "member_has_no_site_access"
+ | "member_is_paying_client"
+ | "member_not_found"
+ | "member_not_removable"
+ | "member_role_conflict"
| "missing_scopes"
| "no_domains"
+ | "no_members_or_invites"
| "not_authorized"
| "not_enterprise_plan_site"
| "not_enterprise_plan_workspace"
+ | "optimize_before_historical_floor"
+ | "optimize_input_validation"
+ | "optimize_invalid_interval"
+ | "optimize_unknown_dimension"
+ | "optimize_unknown_goal"
+ | "optimize_unknown_optimization"
+ | "optimize_unsupported_group_by"
| "order_not_found"
+ | "page_cannot_branch"
| "resource_not_found"
+ | "service_unavailable"
+ | "site_access_not_applicable_to_member"
+ | "site_access_not_scopable_for_role"
+ | "site_access_roles_must_match"
+ | "site_not_in_workspace"
+ | "site_role_id_invalid"
+ | "site_role_id_not_allowed"
+ | "site_role_id_required"
+ | "site_specific_access_disabled"
+ | "site_specific_access_not_entitled"
+ | "time_range_too_wide"
| "too_many_requests"
+ | "unsupported_bot_provider"
| "unsupported_version"
| "unsupported_webhook_trigger_type"
| "user_limit_reached"
| "user_not_found"
| "users_not_enabled"
- | "validation_error";
+ | "validation_error"
+ | "workspace_invite_not_found"
+ | "workspace_member_managed_by_scim"
+ | "workspace_member_not_found"
+ | "workspace_member_not_removable"
+ | "workspace_role_not_grantable";
}
diff --git a/src/serialization/types/FieldGroup.ts b/src/serialization/types/FieldGroup.ts
new file mode 100644
index 00000000..5870b508
--- /dev/null
+++ b/src/serialization/types/FieldGroup.ts
@@ -0,0 +1,20 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../api/index";
+import * as core from "../../core";
+import type * as serializers from "../index";
+
+export const FieldGroup: core.serialization.ObjectSchema =
+ core.serialization.object({
+ displayName: core.serialization.string(),
+ fieldIds: core.serialization.list(core.serialization.string()),
+ description: core.serialization.string().optional(),
+ });
+
+export declare namespace FieldGroup {
+ export interface Raw {
+ displayName: string;
+ fieldIds: string[];
+ description?: string | null;
+ }
+}
diff --git a/src/serialization/types/FormSubmission.ts b/src/serialization/types/FormSubmission.ts
index d091353d..8b664aa8 100644
--- a/src/serialization/types/FormSubmission.ts
+++ b/src/serialization/types/FormSubmission.ts
@@ -12,6 +12,7 @@ export const FormSubmission: core.serialization.ObjectSchema | null;
+ localeId?: string | null;
}
}
diff --git a/src/serialization/types/FormSubmissionTriggerPayload.ts b/src/serialization/types/FormSubmissionTriggerPayload.ts
index e0e7f9a9..cea5c1a6 100644
--- a/src/serialization/types/FormSubmissionTriggerPayload.ts
+++ b/src/serialization/types/FormSubmissionTriggerPayload.ts
@@ -17,6 +17,7 @@ export const FormSubmissionTriggerPayload: core.serialization.ObjectSchema<
id: core.serialization.string().optional(),
formId: core.serialization.string().optional(),
formElementId: core.serialization.string().optional(),
+ localeId: core.serialization.string().optional(),
});
export declare namespace FormSubmissionTriggerPayload {
@@ -29,5 +30,6 @@ export declare namespace FormSubmissionTriggerPayload {
id?: string | null;
formId?: string | null;
formElementId?: string | null;
+ localeId?: string | null;
}
}
diff --git a/src/serialization/types/Goal.ts b/src/serialization/types/Goal.ts
new file mode 100644
index 00000000..1316e8f5
--- /dev/null
+++ b/src/serialization/types/Goal.ts
@@ -0,0 +1,42 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../api/index";
+import * as core from "../../core";
+import type * as serializers from "../index";
+import { GoalCategory } from "./GoalCategory";
+import { GoalIntegrationSource } from "./GoalIntegrationSource";
+import { GoalScope } from "./GoalScope";
+import { GoalType } from "./GoalType";
+import { GoalValueType } from "./GoalValueType";
+
+export const Goal: core.serialization.ObjectSchema = core.serialization.object({
+ goalId: core.serialization.string(),
+ name: core.serialization.string(),
+ isSiteGoal: core.serialization.boolean(),
+ goalType: GoalCategory,
+ integrationSource: GoalIntegrationSource.optional(),
+ formId: core.serialization.string().optional(),
+ scope: GoalScope,
+ type: GoalType,
+ eventIds: core.serialization.list(core.serialization.string()),
+ valueType: GoalValueType.optional(),
+ value: core.serialization.number().optional(),
+ updatedAt: core.serialization.date().optional(),
+});
+
+export declare namespace Goal {
+ export interface Raw {
+ goalId: string;
+ name: string;
+ isSiteGoal: boolean;
+ goalType: GoalCategory.Raw;
+ integrationSource?: GoalIntegrationSource.Raw | null;
+ formId?: string | null;
+ scope: GoalScope.Raw;
+ type: GoalType.Raw;
+ eventIds: string[];
+ valueType?: GoalValueType.Raw | null;
+ value?: number | null;
+ updatedAt?: string | null;
+ }
+}
diff --git a/src/serialization/types/GoalCategory.ts b/src/serialization/types/GoalCategory.ts
new file mode 100644
index 00000000..3ecf762e
--- /dev/null
+++ b/src/serialization/types/GoalCategory.ts
@@ -0,0 +1,12 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../api/index";
+import * as core from "../../core";
+import type * as serializers from "../index";
+
+export const GoalCategory: core.serialization.Schema =
+ core.serialization.enum_(["click", "view", "integration", "custom"]);
+
+export declare namespace GoalCategory {
+ export type Raw = "click" | "view" | "integration" | "custom";
+}
diff --git a/src/serialization/types/GoalIntegrationSource.ts b/src/serialization/types/GoalIntegrationSource.ts
new file mode 100644
index 00000000..335d217f
--- /dev/null
+++ b/src/serialization/types/GoalIntegrationSource.ts
@@ -0,0 +1,14 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../api/index";
+import * as core from "../../core";
+import type * as serializers from "../index";
+
+export const GoalIntegrationSource: core.serialization.Schema<
+ serializers.GoalIntegrationSource.Raw,
+ Webflow.GoalIntegrationSource
+> = core.serialization.enum_(["hubspot", "marketo", "shopify"]);
+
+export declare namespace GoalIntegrationSource {
+ export type Raw = "hubspot" | "marketo" | "shopify";
+}
diff --git a/src/serialization/types/GoalPerformanceDataPoint.ts b/src/serialization/types/GoalPerformanceDataPoint.ts
new file mode 100644
index 00000000..4b9f2bf6
--- /dev/null
+++ b/src/serialization/types/GoalPerformanceDataPoint.ts
@@ -0,0 +1,20 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../api/index";
+import * as core from "../../core";
+import type * as serializers from "../index";
+
+export const GoalPerformanceDataPoint: core.serialization.ObjectSchema<
+ serializers.GoalPerformanceDataPoint.Raw,
+ Webflow.GoalPerformanceDataPoint
+> = core.serialization.object({
+ timestamp: core.serialization.date(),
+ count: core.serialization.number(),
+});
+
+export declare namespace GoalPerformanceDataPoint {
+ export interface Raw {
+ timestamp: string;
+ count: number;
+ }
+}
diff --git a/src/serialization/types/GoalPerformanceFilter.ts b/src/serialization/types/GoalPerformanceFilter.ts
new file mode 100644
index 00000000..b3f464cb
--- /dev/null
+++ b/src/serialization/types/GoalPerformanceFilter.ts
@@ -0,0 +1,79 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../api/index";
+import * as core from "../../core";
+import type * as serializers from "../index";
+import { AnalyzeFilterOperators } from "./AnalyzeFilterOperators";
+
+export const GoalPerformanceFilter: core.serialization.ObjectSchema<
+ serializers.GoalPerformanceFilter.Raw,
+ Webflow.GoalPerformanceFilter
+> = core.serialization.object({
+ audienceIds: AnalyzeFilterOperators.optional(),
+ browser: AnalyzeFilterOperators.optional(),
+ collectionId: AnalyzeFilterOperators.optional(),
+ country: AnalyzeFilterOperators.optional(),
+ dayOfWeek: AnalyzeFilterOperators.optional(),
+ deviceBrand: AnalyzeFilterOperators.optional(),
+ deviceType: AnalyzeFilterOperators.optional(),
+ domain: AnalyzeFilterOperators.optional(),
+ itemSlug: AnalyzeFilterOperators.optional(),
+ language: AnalyzeFilterOperators.optional(),
+ locale: AnalyzeFilterOperators.optional(),
+ nextCollectionId: AnalyzeFilterOperators.optional(),
+ nextItemSlug: AnalyzeFilterOperators.optional(),
+ nextPageId: AnalyzeFilterOperators.optional(),
+ os: AnalyzeFilterOperators.optional(),
+ pageId: AnalyzeFilterOperators.optional(),
+ pagePath: AnalyzeFilterOperators.optional(),
+ previousCollectionId: AnalyzeFilterOperators.optional(),
+ previousItemSlug: AnalyzeFilterOperators.optional(),
+ previousPageId: AnalyzeFilterOperators.optional(),
+ referrer: AnalyzeFilterOperators.optional(),
+ region: AnalyzeFilterOperators.optional(),
+ timeOfDay: AnalyzeFilterOperators.optional(),
+ timezone: AnalyzeFilterOperators.optional(),
+ trafficSource: AnalyzeFilterOperators.optional(),
+ utmCampaign: AnalyzeFilterOperators.optional(),
+ utmContent: AnalyzeFilterOperators.optional(),
+ utmMedium: AnalyzeFilterOperators.optional(),
+ utmSource: AnalyzeFilterOperators.optional(),
+ utmTerm: AnalyzeFilterOperators.optional(),
+ visitStatus: AnalyzeFilterOperators.optional(),
+});
+
+export declare namespace GoalPerformanceFilter {
+ export interface Raw {
+ audienceIds?: AnalyzeFilterOperators.Raw | null;
+ browser?: AnalyzeFilterOperators.Raw | null;
+ collectionId?: AnalyzeFilterOperators.Raw | null;
+ country?: AnalyzeFilterOperators.Raw | null;
+ dayOfWeek?: AnalyzeFilterOperators.Raw | null;
+ deviceBrand?: AnalyzeFilterOperators.Raw | null;
+ deviceType?: AnalyzeFilterOperators.Raw | null;
+ domain?: AnalyzeFilterOperators.Raw | null;
+ itemSlug?: AnalyzeFilterOperators.Raw | null;
+ language?: AnalyzeFilterOperators.Raw | null;
+ locale?: AnalyzeFilterOperators.Raw | null;
+ nextCollectionId?: AnalyzeFilterOperators.Raw | null;
+ nextItemSlug?: AnalyzeFilterOperators.Raw | null;
+ nextPageId?: AnalyzeFilterOperators.Raw | null;
+ os?: AnalyzeFilterOperators.Raw | null;
+ pageId?: AnalyzeFilterOperators.Raw | null;
+ pagePath?: AnalyzeFilterOperators.Raw | null;
+ previousCollectionId?: AnalyzeFilterOperators.Raw | null;
+ previousItemSlug?: AnalyzeFilterOperators.Raw | null;
+ previousPageId?: AnalyzeFilterOperators.Raw | null;
+ referrer?: AnalyzeFilterOperators.Raw | null;
+ region?: AnalyzeFilterOperators.Raw | null;
+ timeOfDay?: AnalyzeFilterOperators.Raw | null;
+ timezone?: AnalyzeFilterOperators.Raw | null;
+ trafficSource?: AnalyzeFilterOperators.Raw | null;
+ utmCampaign?: AnalyzeFilterOperators.Raw | null;
+ utmContent?: AnalyzeFilterOperators.Raw | null;
+ utmMedium?: AnalyzeFilterOperators.Raw | null;
+ utmSource?: AnalyzeFilterOperators.Raw | null;
+ utmTerm?: AnalyzeFilterOperators.Raw | null;
+ visitStatus?: AnalyzeFilterOperators.Raw | null;
+ }
+}
diff --git a/src/serialization/types/GoalPerformanceResponse.ts b/src/serialization/types/GoalPerformanceResponse.ts
new file mode 100644
index 00000000..790e0ebb
--- /dev/null
+++ b/src/serialization/types/GoalPerformanceResponse.ts
@@ -0,0 +1,31 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../api/index";
+import * as core from "../../core";
+import type * as serializers from "../index";
+import { AnalyzeDailyBucketing } from "./AnalyzeDailyBucketing";
+import { AnalyzeWindow } from "./AnalyzeWindow";
+import { Goal } from "./Goal";
+import { GoalPerformanceDataPoint } from "./GoalPerformanceDataPoint";
+import { GoalPerformanceFilter } from "./GoalPerformanceFilter";
+
+export const GoalPerformanceResponse: core.serialization.ObjectSchema<
+ serializers.GoalPerformanceResponse.Raw,
+ Webflow.GoalPerformanceResponse
+> = core.serialization.object({
+ goal: Goal,
+ window: AnalyzeWindow,
+ bucketing: AnalyzeDailyBucketing,
+ data: core.serialization.list(GoalPerformanceDataPoint),
+ filter: GoalPerformanceFilter.optional(),
+});
+
+export declare namespace GoalPerformanceResponse {
+ export interface Raw {
+ goal: Goal.Raw;
+ window: AnalyzeWindow.Raw;
+ bucketing: AnalyzeDailyBucketing.Raw;
+ data: GoalPerformanceDataPoint.Raw[];
+ filter?: GoalPerformanceFilter.Raw | null;
+ }
+}
diff --git a/src/serialization/types/GoalScope.ts b/src/serialization/types/GoalScope.ts
new file mode 100644
index 00000000..2a45ab67
--- /dev/null
+++ b/src/serialization/types/GoalScope.ts
@@ -0,0 +1,12 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../api/index";
+import * as core from "../../core";
+import type * as serializers from "../index";
+
+export const GoalScope: core.serialization.Schema =
+ core.serialization.enum_(["session", "user", "pageview"]);
+
+export declare namespace GoalScope {
+ export type Raw = "session" | "user" | "pageview";
+}
diff --git a/src/serialization/types/GoalType.ts b/src/serialization/types/GoalType.ts
new file mode 100644
index 00000000..9cf0cd31
--- /dev/null
+++ b/src/serialization/types/GoalType.ts
@@ -0,0 +1,13 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../api/index";
+import * as core from "../../core";
+import type * as serializers from "../index";
+
+export const GoalType: core.serialization.Schema = core.serialization.enum_(
+ ["conversion", "value"],
+);
+
+export declare namespace GoalType {
+ export type Raw = "conversion" | "value";
+}
diff --git a/src/serialization/types/GoalValueType.ts b/src/serialization/types/GoalValueType.ts
new file mode 100644
index 00000000..e2db70eb
--- /dev/null
+++ b/src/serialization/types/GoalValueType.ts
@@ -0,0 +1,12 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../api/index";
+import * as core from "../../core";
+import type * as serializers from "../index";
+
+export const GoalValueType: core.serialization.Schema =
+ core.serialization.enum_(["static", "dynamic"]);
+
+export declare namespace GoalValueType {
+ export type Raw = "static" | "dynamic";
+}
diff --git a/src/serialization/types/GoalsResponse.ts b/src/serialization/types/GoalsResponse.ts
new file mode 100644
index 00000000..36ff9e3a
--- /dev/null
+++ b/src/serialization/types/GoalsResponse.ts
@@ -0,0 +1,17 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../api/index";
+import * as core from "../../core";
+import type * as serializers from "../index";
+import { Goal } from "./Goal";
+
+export const GoalsResponse: core.serialization.ObjectSchema =
+ core.serialization.object({
+ goals: core.serialization.list(Goal),
+ });
+
+export declare namespace GoalsResponse {
+ export interface Raw {
+ goals: Goal.Raw[];
+ }
+}
diff --git a/src/serialization/types/GoogleTagId.ts b/src/serialization/types/GoogleTagId.ts
new file mode 100644
index 00000000..da81d3a5
--- /dev/null
+++ b/src/serialization/types/GoogleTagId.ts
@@ -0,0 +1,20 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../api/index";
+import * as core from "../../core";
+import type * as serializers from "../index";
+
+export const GoogleTagId: core.serialization.ObjectSchema =
+ core.serialization.object({
+ order: core.serialization.number().optional(),
+ displayName: core.serialization.string(),
+ tagId: core.serialization.string(),
+ });
+
+export declare namespace GoogleTagId {
+ export interface Raw {
+ order?: number | null;
+ displayName: string;
+ tagId: string;
+ }
+}
diff --git a/src/serialization/types/GoogleTagIds.ts b/src/serialization/types/GoogleTagIds.ts
new file mode 100644
index 00000000..8ff48fc7
--- /dev/null
+++ b/src/serialization/types/GoogleTagIds.ts
@@ -0,0 +1,17 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../api/index";
+import * as core from "../../core";
+import type * as serializers from "../index";
+import { GoogleTagId } from "./GoogleTagId";
+
+export const GoogleTagIds: core.serialization.ObjectSchema =
+ core.serialization.object({
+ googleTagIds: core.serialization.list(GoogleTagId),
+ });
+
+export declare namespace GoogleTagIds {
+ export interface Raw {
+ googleTagIds: GoogleTagId.Raw[];
+ }
+}
diff --git a/src/serialization/types/InsertCollectionItem.ts b/src/serialization/types/InsertCollectionItem.ts
new file mode 100644
index 00000000..549bbbf1
--- /dev/null
+++ b/src/serialization/types/InsertCollectionItem.ts
@@ -0,0 +1,29 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../api/index";
+import * as core from "../../core";
+import type * as serializers from "../index";
+import { InsertCollectionItemFieldData } from "./InsertCollectionItemFieldData";
+
+export const InsertCollectionItem: core.serialization.ObjectSchema<
+ serializers.InsertCollectionItem.Raw,
+ Webflow.InsertCollectionItem
+> = core.serialization.object({
+ id: core.serialization.string().optional(),
+ cmsLocaleIds: core.serialization.list(core.serialization.string()).optional(),
+ allCmsLocales: core.serialization.booleanLiteral(true).optional(),
+ isArchived: core.serialization.boolean().optional(),
+ isDraft: core.serialization.boolean().optional(),
+ fieldData: InsertCollectionItemFieldData,
+});
+
+export declare namespace InsertCollectionItem {
+ export interface Raw {
+ id?: string | null;
+ cmsLocaleIds?: string[] | null;
+ allCmsLocales?: true | null;
+ isArchived?: boolean | null;
+ isDraft?: boolean | null;
+ fieldData: InsertCollectionItemFieldData.Raw;
+ }
+}
diff --git a/src/serialization/types/InsertCollectionItemFieldData.ts b/src/serialization/types/InsertCollectionItemFieldData.ts
new file mode 100644
index 00000000..b6f4d3ba
--- /dev/null
+++ b/src/serialization/types/InsertCollectionItemFieldData.ts
@@ -0,0 +1,23 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../api/index";
+import * as core from "../../core";
+import type * as serializers from "../index";
+
+export const InsertCollectionItemFieldData: core.serialization.ObjectSchema<
+ serializers.InsertCollectionItemFieldData.Raw,
+ Webflow.InsertCollectionItemFieldData
+> = core.serialization
+ .object({
+ name: core.serialization.string(),
+ slug: core.serialization.string(),
+ })
+ .passthrough();
+
+export declare namespace InsertCollectionItemFieldData {
+ export interface Raw {
+ name: string;
+ slug: string;
+ [key: string]: any;
+ }
+}
diff --git a/src/serialization/types/InsertedCollectionItem.ts b/src/serialization/types/InsertedCollectionItem.ts
new file mode 100644
index 00000000..7dfd6c90
--- /dev/null
+++ b/src/serialization/types/InsertedCollectionItem.ts
@@ -0,0 +1,33 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../api/index";
+import * as core from "../../core";
+import type * as serializers from "../index";
+import { InsertedCollectionItemFieldData } from "./InsertedCollectionItemFieldData";
+
+export const InsertedCollectionItem: core.serialization.ObjectSchema<
+ serializers.InsertedCollectionItem.Raw,
+ Webflow.InsertedCollectionItem
+> = core.serialization.object({
+ id: core.serialization.string().optional(),
+ cmsLocaleId: core.serialization.string().optional(),
+ lastPublished: core.serialization.string().optional(),
+ lastUpdated: core.serialization.string().optional(),
+ createdOn: core.serialization.string().optional(),
+ isArchived: core.serialization.boolean().optional(),
+ isDraft: core.serialization.boolean().optional(),
+ fieldData: InsertedCollectionItemFieldData,
+});
+
+export declare namespace InsertedCollectionItem {
+ export interface Raw {
+ id?: string | null;
+ cmsLocaleId?: string | null;
+ lastPublished?: string | null;
+ lastUpdated?: string | null;
+ createdOn?: string | null;
+ isArchived?: boolean | null;
+ isDraft?: boolean | null;
+ fieldData: InsertedCollectionItemFieldData.Raw;
+ }
+}
diff --git a/src/serialization/types/InsertedCollectionItemFieldData.ts b/src/serialization/types/InsertedCollectionItemFieldData.ts
new file mode 100644
index 00000000..c95b59eb
--- /dev/null
+++ b/src/serialization/types/InsertedCollectionItemFieldData.ts
@@ -0,0 +1,23 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../api/index";
+import * as core from "../../core";
+import type * as serializers from "../index";
+
+export const InsertedCollectionItemFieldData: core.serialization.ObjectSchema<
+ serializers.InsertedCollectionItemFieldData.Raw,
+ Webflow.InsertedCollectionItemFieldData
+> = core.serialization
+ .object({
+ name: core.serialization.string(),
+ slug: core.serialization.string(),
+ })
+ .passthrough();
+
+export declare namespace InsertedCollectionItemFieldData {
+ export interface Raw {
+ name: string;
+ slug: string;
+ [key: string]: any;
+ }
+}
diff --git a/src/serialization/types/InviteWorkspaceMemberRequestBody.ts b/src/serialization/types/InviteWorkspaceMemberRequestBody.ts
new file mode 100644
index 00000000..b5dcbc68
--- /dev/null
+++ b/src/serialization/types/InviteWorkspaceMemberRequestBody.ts
@@ -0,0 +1,17 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../api/index";
+import * as core from "../../core";
+import type * as serializers from "../index";
+import { CollaboratorClientInvite } from "./CollaboratorClientInvite";
+import { WithDefaultSiteRole } from "./WithDefaultSiteRole";
+import { WithSiteAccess } from "./WithSiteAccess";
+
+export const InviteWorkspaceMemberRequestBody: core.serialization.Schema<
+ serializers.InviteWorkspaceMemberRequestBody.Raw,
+ Webflow.InviteWorkspaceMemberRequestBody
+> = core.serialization.undiscriminatedUnion([WithDefaultSiteRole, WithSiteAccess, CollaboratorClientInvite]);
+
+export declare namespace InviteWorkspaceMemberRequestBody {
+ export type Raw = WithDefaultSiteRole.Raw | WithSiteAccess.Raw | CollaboratorClientInvite.Raw;
+}
diff --git a/src/serialization/types/InviteWorkspaceMemberRequestBodyDefaultSiteRoleDefaultSiteRole.ts b/src/serialization/types/InviteWorkspaceMemberRequestBodyDefaultSiteRoleDefaultSiteRole.ts
new file mode 100644
index 00000000..26e4f8eb
--- /dev/null
+++ b/src/serialization/types/InviteWorkspaceMemberRequestBodyDefaultSiteRoleDefaultSiteRole.ts
@@ -0,0 +1,14 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../api/index";
+import * as core from "../../core";
+import type * as serializers from "../index";
+
+export const InviteWorkspaceMemberRequestBodyDefaultSiteRoleDefaultSiteRole: core.serialization.Schema<
+ serializers.InviteWorkspaceMemberRequestBodyDefaultSiteRoleDefaultSiteRole.Raw,
+ Webflow.InviteWorkspaceMemberRequestBodyDefaultSiteRoleDefaultSiteRole
+> = core.serialization.enum_(["site_manager", "designer", "marketer", "content_editor", "reviewer", "custom"]);
+
+export declare namespace InviteWorkspaceMemberRequestBodyDefaultSiteRoleDefaultSiteRole {
+ export type Raw = "site_manager" | "designer" | "marketer" | "content_editor" | "reviewer" | "custom";
+}
diff --git a/src/serialization/types/InviteWorkspaceMemberRequestBodyDefaultSiteRoleWorkspaceRole.ts b/src/serialization/types/InviteWorkspaceMemberRequestBodyDefaultSiteRoleWorkspaceRole.ts
new file mode 100644
index 00000000..aced3a8c
--- /dev/null
+++ b/src/serialization/types/InviteWorkspaceMemberRequestBodyDefaultSiteRoleWorkspaceRole.ts
@@ -0,0 +1,14 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../api/index";
+import * as core from "../../core";
+import type * as serializers from "../index";
+
+export const InviteWorkspaceMemberRequestBodyDefaultSiteRoleWorkspaceRole: core.serialization.Schema<
+ serializers.InviteWorkspaceMemberRequestBodyDefaultSiteRoleWorkspaceRole.Raw,
+ Webflow.InviteWorkspaceMemberRequestBodyDefaultSiteRoleWorkspaceRole
+> = core.serialization.enum_(["admin", "member", "reviewer"]);
+
+export declare namespace InviteWorkspaceMemberRequestBodyDefaultSiteRoleWorkspaceRole {
+ export type Raw = "admin" | "member" | "reviewer";
+}
diff --git a/src/serialization/types/InviteWorkspaceMemberRequestBodyEmailSiteAccessItem.ts b/src/serialization/types/InviteWorkspaceMemberRequestBodyEmailSiteAccessItem.ts
new file mode 100644
index 00000000..2177b835
--- /dev/null
+++ b/src/serialization/types/InviteWorkspaceMemberRequestBodyEmailSiteAccessItem.ts
@@ -0,0 +1,23 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../api/index";
+import * as core from "../../core";
+import type * as serializers from "../index";
+import { InviteWorkspaceMemberRequestBodyEmailSiteAccessItemSiteRole } from "./InviteWorkspaceMemberRequestBodyEmailSiteAccessItemSiteRole";
+
+export const InviteWorkspaceMemberRequestBodyEmailSiteAccessItem: core.serialization.ObjectSchema<
+ serializers.InviteWorkspaceMemberRequestBodyEmailSiteAccessItem.Raw,
+ Webflow.InviteWorkspaceMemberRequestBodyEmailSiteAccessItem
+> = core.serialization.object({
+ siteId: core.serialization.string(),
+ siteRole: InviteWorkspaceMemberRequestBodyEmailSiteAccessItemSiteRole,
+ siteRoleId: core.serialization.string().optional(),
+});
+
+export declare namespace InviteWorkspaceMemberRequestBodyEmailSiteAccessItem {
+ export interface Raw {
+ siteId: string;
+ siteRole: InviteWorkspaceMemberRequestBodyEmailSiteAccessItemSiteRole.Raw;
+ siteRoleId?: string | null;
+ }
+}
diff --git a/src/serialization/types/InviteWorkspaceMemberRequestBodyEmailSiteAccessItemSiteRole.ts b/src/serialization/types/InviteWorkspaceMemberRequestBodyEmailSiteAccessItemSiteRole.ts
new file mode 100644
index 00000000..3fcb2598
--- /dev/null
+++ b/src/serialization/types/InviteWorkspaceMemberRequestBodyEmailSiteAccessItemSiteRole.ts
@@ -0,0 +1,14 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../api/index";
+import * as core from "../../core";
+import type * as serializers from "../index";
+
+export const InviteWorkspaceMemberRequestBodyEmailSiteAccessItemSiteRole: core.serialization.Schema<
+ serializers.InviteWorkspaceMemberRequestBodyEmailSiteAccessItemSiteRole.Raw,
+ Webflow.InviteWorkspaceMemberRequestBodyEmailSiteAccessItemSiteRole
+> = core.serialization.enum_(["marketer", "content_editor", "reviewer", "custom"]);
+
+export declare namespace InviteWorkspaceMemberRequestBodyEmailSiteAccessItemSiteRole {
+ export type Raw = "marketer" | "content_editor" | "reviewer" | "custom";
+}
diff --git a/src/serialization/types/InviteWorkspaceMemberRequestBodyOneSiteAccessItem.ts b/src/serialization/types/InviteWorkspaceMemberRequestBodyOneSiteAccessItem.ts
new file mode 100644
index 00000000..0a0d34ad
--- /dev/null
+++ b/src/serialization/types/InviteWorkspaceMemberRequestBodyOneSiteAccessItem.ts
@@ -0,0 +1,23 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../api/index";
+import * as core from "../../core";
+import type * as serializers from "../index";
+import { InviteWorkspaceMemberRequestBodyOneSiteAccessItemSiteRole } from "./InviteWorkspaceMemberRequestBodyOneSiteAccessItemSiteRole";
+
+export const InviteWorkspaceMemberRequestBodyOneSiteAccessItem: core.serialization.ObjectSchema<
+ serializers.InviteWorkspaceMemberRequestBodyOneSiteAccessItem.Raw,
+ Webflow.InviteWorkspaceMemberRequestBodyOneSiteAccessItem
+> = core.serialization.object({
+ siteId: core.serialization.string(),
+ siteRole: InviteWorkspaceMemberRequestBodyOneSiteAccessItemSiteRole,
+ siteRoleId: core.serialization.string().optional(),
+});
+
+export declare namespace InviteWorkspaceMemberRequestBodyOneSiteAccessItem {
+ export interface Raw {
+ siteId: string;
+ siteRole: InviteWorkspaceMemberRequestBodyOneSiteAccessItemSiteRole.Raw;
+ siteRoleId?: string | null;
+ }
+}
diff --git a/src/serialization/types/InviteWorkspaceMemberRequestBodyOneSiteAccessItemSiteRole.ts b/src/serialization/types/InviteWorkspaceMemberRequestBodyOneSiteAccessItemSiteRole.ts
new file mode 100644
index 00000000..3af9e5e8
--- /dev/null
+++ b/src/serialization/types/InviteWorkspaceMemberRequestBodyOneSiteAccessItemSiteRole.ts
@@ -0,0 +1,14 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../api/index";
+import * as core from "../../core";
+import type * as serializers from "../index";
+
+export const InviteWorkspaceMemberRequestBodyOneSiteAccessItemSiteRole: core.serialization.Schema<
+ serializers.InviteWorkspaceMemberRequestBodyOneSiteAccessItemSiteRole.Raw,
+ Webflow.InviteWorkspaceMemberRequestBodyOneSiteAccessItemSiteRole
+> = core.serialization.enum_(["site_manager", "designer", "marketer", "content_editor", "reviewer", "custom"]);
+
+export declare namespace InviteWorkspaceMemberRequestBodyOneSiteAccessItemSiteRole {
+ export type Raw = "site_manager" | "designer" | "marketer" | "content_editor" | "reviewer" | "custom";
+}
diff --git a/src/serialization/types/InviteWorkspaceMemberRequestBodyOneWorkspaceRole.ts b/src/serialization/types/InviteWorkspaceMemberRequestBodyOneWorkspaceRole.ts
new file mode 100644
index 00000000..cb5b4303
--- /dev/null
+++ b/src/serialization/types/InviteWorkspaceMemberRequestBodyOneWorkspaceRole.ts
@@ -0,0 +1,14 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../api/index";
+import * as core from "../../core";
+import type * as serializers from "../index";
+
+export const InviteWorkspaceMemberRequestBodyOneWorkspaceRole: core.serialization.Schema<
+ serializers.InviteWorkspaceMemberRequestBodyOneWorkspaceRole.Raw,
+ Webflow.InviteWorkspaceMemberRequestBodyOneWorkspaceRole
+> = core.serialization.enum_(["admin", "member", "reviewer"]);
+
+export declare namespace InviteWorkspaceMemberRequestBodyOneWorkspaceRole {
+ export type Raw = "admin" | "member" | "reviewer";
+}
diff --git a/src/serialization/types/InviteWorkspaceMemberResponseBody.ts b/src/serialization/types/InviteWorkspaceMemberResponseBody.ts
new file mode 100644
index 00000000..0640de9a
--- /dev/null
+++ b/src/serialization/types/InviteWorkspaceMemberResponseBody.ts
@@ -0,0 +1,32 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../api/index";
+import * as core from "../../core";
+import type * as serializers from "../index";
+import { Invited } from "./Invited";
+import { InviteWorkspaceMemberResponseBodyActive } from "./InviteWorkspaceMemberResponseBodyActive";
+
+export const InviteWorkspaceMemberResponseBody: core.serialization.Schema<
+ serializers.InviteWorkspaceMemberResponseBody.Raw,
+ Webflow.InviteWorkspaceMemberResponseBody
+> = core.serialization
+ .union("status", {
+ invited: Invited,
+ active: InviteWorkspaceMemberResponseBodyActive,
+ })
+ .transform({
+ transform: (value) => value,
+ untransform: (value) => value,
+ });
+
+export declare namespace InviteWorkspaceMemberResponseBody {
+ export type Raw = InviteWorkspaceMemberResponseBody.Invited | InviteWorkspaceMemberResponseBody.Active;
+
+ export interface Invited extends Invited.Raw {
+ status: "invited";
+ }
+
+ export interface Active extends InviteWorkspaceMemberResponseBodyActive.Raw {
+ status: "active";
+ }
+}
diff --git a/src/serialization/types/InviteWorkspaceMemberResponseBodyActive.ts b/src/serialization/types/InviteWorkspaceMemberResponseBodyActive.ts
new file mode 100644
index 00000000..a18e50ca
--- /dev/null
+++ b/src/serialization/types/InviteWorkspaceMemberResponseBodyActive.ts
@@ -0,0 +1,19 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../api/index";
+import * as core from "../../core";
+import type * as serializers from "../index";
+import { WorkspaceMember } from "./WorkspaceMember";
+
+export const InviteWorkspaceMemberResponseBodyActive: core.serialization.ObjectSchema<
+ serializers.InviteWorkspaceMemberResponseBodyActive.Raw,
+ Webflow.InviteWorkspaceMemberResponseBodyActive
+> = core.serialization.object({
+ member: WorkspaceMember,
+});
+
+export declare namespace InviteWorkspaceMemberResponseBodyActive {
+ export interface Raw {
+ member: WorkspaceMember.Raw;
+ }
+}
diff --git a/src/serialization/types/Invited.ts b/src/serialization/types/Invited.ts
new file mode 100644
index 00000000..9b21cb36
--- /dev/null
+++ b/src/serialization/types/Invited.ts
@@ -0,0 +1,17 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../api/index";
+import * as core from "../../core";
+import type * as serializers from "../index";
+import { WorkspaceInvite } from "./WorkspaceInvite";
+
+export const Invited: core.serialization.ObjectSchema =
+ core.serialization.object({
+ invite: WorkspaceInvite,
+ });
+
+export declare namespace Invited {
+ export interface Raw {
+ invite: WorkspaceInvite.Raw;
+ }
+}
diff --git a/src/serialization/types/Optimization.ts b/src/serialization/types/Optimization.ts
new file mode 100644
index 00000000..ac8f2078
--- /dev/null
+++ b/src/serialization/types/Optimization.ts
@@ -0,0 +1,34 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../api/index";
+import * as core from "../../core";
+import type * as serializers from "../index";
+import { OptimizationInterval } from "./OptimizationInterval";
+import { OptimizationStatus } from "./OptimizationStatus";
+import { OptimizationType } from "./OptimizationType";
+import { OptimizeCurrentGoal } from "./OptimizeCurrentGoal";
+
+export const Optimization: core.serialization.ObjectSchema =
+ core.serialization.object({
+ optimizationId: core.serialization.string(),
+ name: core.serialization.string(),
+ optimizationType: OptimizationType,
+ status: OptimizationStatus,
+ variationCount: core.serialization.number(),
+ updatedAt: core.serialization.date().optional(),
+ intervals: core.serialization.list(OptimizationInterval),
+ currentGoals: core.serialization.list(OptimizeCurrentGoal),
+ });
+
+export declare namespace Optimization {
+ export interface Raw {
+ optimizationId: string;
+ name: string;
+ optimizationType: OptimizationType.Raw;
+ status: OptimizationStatus.Raw;
+ variationCount: number;
+ updatedAt?: string | null;
+ intervals: OptimizationInterval.Raw[];
+ currentGoals: OptimizeCurrentGoal.Raw[];
+ }
+}
diff --git a/src/serialization/types/OptimizationAudienceInsightsResponse.ts b/src/serialization/types/OptimizationAudienceInsightsResponse.ts
new file mode 100644
index 00000000..4c6a3910
--- /dev/null
+++ b/src/serialization/types/OptimizationAudienceInsightsResponse.ts
@@ -0,0 +1,39 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../api/index";
+import * as core from "../../core";
+import type * as serializers from "../index";
+import { OptimizationType } from "./OptimizationType";
+import { OptimizeAppliedFilter } from "./OptimizeAppliedFilter";
+import { OptimizeAudienceVariation } from "./OptimizeAudienceVariation";
+import { OptimizeDimension } from "./OptimizeDimension";
+import { OptimizeReportGoal } from "./OptimizeReportGoal";
+import { OptimizeReportIntervalEnd } from "./OptimizeReportIntervalEnd";
+import { OptimizeReportIntervalStart } from "./OptimizeReportIntervalStart";
+
+export const OptimizationAudienceInsightsResponse: core.serialization.ObjectSchema<
+ serializers.OptimizationAudienceInsightsResponse.Raw,
+ Webflow.OptimizationAudienceInsightsResponse
+> = core.serialization.object({
+ report: core.serialization.stringLiteral("optimization_audience_insights"),
+ intervalStart: OptimizeReportIntervalStart,
+ intervalEnd: OptimizeReportIntervalEnd,
+ goal: OptimizeReportGoal,
+ optimizationType: OptimizationType,
+ groupedBy: OptimizeDimension,
+ filter: OptimizeAppliedFilter.optional(),
+ variations: core.serialization.list(OptimizeAudienceVariation),
+});
+
+export declare namespace OptimizationAudienceInsightsResponse {
+ export interface Raw {
+ report: "optimization_audience_insights";
+ intervalStart: OptimizeReportIntervalStart.Raw;
+ intervalEnd: OptimizeReportIntervalEnd.Raw;
+ goal: OptimizeReportGoal.Raw;
+ optimizationType: OptimizationType.Raw;
+ groupedBy: OptimizeDimension.Raw;
+ filter?: OptimizeAppliedFilter.Raw | null;
+ variations: OptimizeAudienceVariation.Raw[];
+ }
+}
diff --git a/src/serialization/types/OptimizationDimensionValuesResponse.ts b/src/serialization/types/OptimizationDimensionValuesResponse.ts
new file mode 100644
index 00000000..81a29199
--- /dev/null
+++ b/src/serialization/types/OptimizationDimensionValuesResponse.ts
@@ -0,0 +1,33 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../api/index";
+import * as core from "../../core";
+import type * as serializers from "../index";
+import { OptimizeAppliedFilter } from "./OptimizeAppliedFilter";
+import { OptimizeDimension } from "./OptimizeDimension";
+import { OptimizeDimensionValue } from "./OptimizeDimensionValue";
+import { OptimizeReportIntervalEnd } from "./OptimizeReportIntervalEnd";
+import { OptimizeReportIntervalStart } from "./OptimizeReportIntervalStart";
+
+export const OptimizationDimensionValuesResponse: core.serialization.ObjectSchema<
+ serializers.OptimizationDimensionValuesResponse.Raw,
+ Webflow.OptimizationDimensionValuesResponse
+> = core.serialization.object({
+ intervalStart: OptimizeReportIntervalStart,
+ intervalEnd: OptimizeReportIntervalEnd,
+ dimension: OptimizeDimension,
+ filter: OptimizeAppliedFilter.optional(),
+ values: core.serialization.list(OptimizeDimensionValue),
+ nextCursor: core.serialization.string().optional(),
+});
+
+export declare namespace OptimizationDimensionValuesResponse {
+ export interface Raw {
+ intervalStart: OptimizeReportIntervalStart.Raw;
+ intervalEnd: OptimizeReportIntervalEnd.Raw;
+ dimension: OptimizeDimension.Raw;
+ filter?: OptimizeAppliedFilter.Raw | null;
+ values: OptimizeDimensionValue.Raw[];
+ nextCursor?: string | null;
+ }
+}
diff --git a/src/serialization/types/OptimizationDimensionsResponse.ts b/src/serialization/types/OptimizationDimensionsResponse.ts
new file mode 100644
index 00000000..b8b099a7
--- /dev/null
+++ b/src/serialization/types/OptimizationDimensionsResponse.ts
@@ -0,0 +1,25 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../api/index";
+import * as core from "../../core";
+import type * as serializers from "../index";
+import { OptimizeDimension } from "./OptimizeDimension";
+import { OptimizeReportIntervalEnd } from "./OptimizeReportIntervalEnd";
+import { OptimizeReportIntervalStart } from "./OptimizeReportIntervalStart";
+
+export const OptimizationDimensionsResponse: core.serialization.ObjectSchema<
+ serializers.OptimizationDimensionsResponse.Raw,
+ Webflow.OptimizationDimensionsResponse
+> = core.serialization.object({
+ intervalStart: OptimizeReportIntervalStart,
+ intervalEnd: OptimizeReportIntervalEnd,
+ dimensions: core.serialization.list(OptimizeDimension),
+});
+
+export declare namespace OptimizationDimensionsResponse {
+ export interface Raw {
+ intervalStart: OptimizeReportIntervalStart.Raw;
+ intervalEnd: OptimizeReportIntervalEnd.Raw;
+ dimensions: OptimizeDimension.Raw[];
+ }
+}
diff --git a/src/serialization/types/OptimizationGoalsResponse.ts b/src/serialization/types/OptimizationGoalsResponse.ts
new file mode 100644
index 00000000..ac8ebae2
--- /dev/null
+++ b/src/serialization/types/OptimizationGoalsResponse.ts
@@ -0,0 +1,28 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../api/index";
+import * as core from "../../core";
+import type * as serializers from "../index";
+import { OptimizeCurrentGoal } from "./OptimizeCurrentGoal";
+import { OptimizeGoal } from "./OptimizeGoal";
+import { OptimizeReportIntervalEnd } from "./OptimizeReportIntervalEnd";
+import { OptimizeReportIntervalStart } from "./OptimizeReportIntervalStart";
+
+export const OptimizationGoalsResponse: core.serialization.ObjectSchema<
+ serializers.OptimizationGoalsResponse.Raw,
+ Webflow.OptimizationGoalsResponse
+> = core.serialization.object({
+ intervalStart: OptimizeReportIntervalStart,
+ intervalEnd: OptimizeReportIntervalEnd,
+ goals: core.serialization.list(OptimizeGoal),
+ currentGoals: core.serialization.list(OptimizeCurrentGoal),
+});
+
+export declare namespace OptimizationGoalsResponse {
+ export interface Raw {
+ intervalStart: OptimizeReportIntervalStart.Raw;
+ intervalEnd: OptimizeReportIntervalEnd.Raw;
+ goals: OptimizeGoal.Raw[];
+ currentGoals: OptimizeCurrentGoal.Raw[];
+ }
+}
diff --git a/src/serialization/types/OptimizationInterval.ts b/src/serialization/types/OptimizationInterval.ts
new file mode 100644
index 00000000..a2a6aa60
--- /dev/null
+++ b/src/serialization/types/OptimizationInterval.ts
@@ -0,0 +1,23 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../api/index";
+import * as core from "../../core";
+import type * as serializers from "../index";
+import { OptimizeGoal } from "./OptimizeGoal";
+
+export const OptimizationInterval: core.serialization.ObjectSchema<
+ serializers.OptimizationInterval.Raw,
+ Webflow.OptimizationInterval
+> = core.serialization.object({
+ start: core.serialization.date(),
+ end: core.serialization.date().optional(),
+ goals: core.serialization.list(OptimizeGoal),
+});
+
+export declare namespace OptimizationInterval {
+ export interface Raw {
+ start: string;
+ end?: string | null;
+ goals: OptimizeGoal.Raw[];
+ }
+}
diff --git a/src/serialization/types/OptimizationListResponse.ts b/src/serialization/types/OptimizationListResponse.ts
new file mode 100644
index 00000000..80d1c670
--- /dev/null
+++ b/src/serialization/types/OptimizationListResponse.ts
@@ -0,0 +1,24 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../api/index";
+import * as core from "../../core";
+import type * as serializers from "../index";
+import { Optimization } from "./Optimization";
+import { OptimizationStatus } from "./OptimizationStatus";
+
+export const OptimizationListResponse: core.serialization.ObjectSchema<
+ serializers.OptimizationListResponse.Raw,
+ Webflow.OptimizationListResponse
+> = core.serialization.object({
+ optimizations: core.serialization.list(Optimization),
+ status: core.serialization.list(OptimizationStatus),
+ nextCursor: core.serialization.string().optional(),
+});
+
+export declare namespace OptimizationListResponse {
+ export interface Raw {
+ optimizations: Optimization.Raw[];
+ status: OptimizationStatus.Raw[];
+ nextCursor?: string | null;
+ }
+}
diff --git a/src/serialization/types/OptimizationStatus.ts b/src/serialization/types/OptimizationStatus.ts
new file mode 100644
index 00000000..4d495c8b
--- /dev/null
+++ b/src/serialization/types/OptimizationStatus.ts
@@ -0,0 +1,14 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../api/index";
+import * as core from "../../core";
+import type * as serializers from "../index";
+
+export const OptimizationStatus: core.serialization.Schema<
+ serializers.OptimizationStatus.Raw,
+ Webflow.OptimizationStatus
+> = core.serialization.enum_(["live", "draft", "ready", "archived", "off"]);
+
+export declare namespace OptimizationStatus {
+ export type Raw = "live" | "draft" | "ready" | "archived" | "off";
+}
diff --git a/src/serialization/types/OptimizationSummaryResponse.ts b/src/serialization/types/OptimizationSummaryResponse.ts
new file mode 100644
index 00000000..11a8ca97
--- /dev/null
+++ b/src/serialization/types/OptimizationSummaryResponse.ts
@@ -0,0 +1,36 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../api/index";
+import * as core from "../../core";
+import type * as serializers from "../index";
+import { OptimizationType } from "./OptimizationType";
+import { OptimizeAppliedFilter } from "./OptimizeAppliedFilter";
+import { OptimizeReportGoal } from "./OptimizeReportGoal";
+import { OptimizeReportIntervalEnd } from "./OptimizeReportIntervalEnd";
+import { OptimizeReportIntervalStart } from "./OptimizeReportIntervalStart";
+import { OptimizeVariationResult } from "./OptimizeVariationResult";
+
+export const OptimizationSummaryResponse: core.serialization.ObjectSchema<
+ serializers.OptimizationSummaryResponse.Raw,
+ Webflow.OptimizationSummaryResponse
+> = core.serialization.object({
+ report: core.serialization.stringLiteral("optimization_summary"),
+ intervalStart: OptimizeReportIntervalStart,
+ intervalEnd: OptimizeReportIntervalEnd,
+ goal: OptimizeReportGoal,
+ optimizationType: OptimizationType,
+ filter: OptimizeAppliedFilter.optional(),
+ variations: core.serialization.list(OptimizeVariationResult),
+});
+
+export declare namespace OptimizationSummaryResponse {
+ export interface Raw {
+ report: "optimization_summary";
+ intervalStart: OptimizeReportIntervalStart.Raw;
+ intervalEnd: OptimizeReportIntervalEnd.Raw;
+ goal: OptimizeReportGoal.Raw;
+ optimizationType: OptimizationType.Raw;
+ filter?: OptimizeAppliedFilter.Raw | null;
+ variations: OptimizeVariationResult.Raw[];
+ }
+}
diff --git a/src/serialization/types/OptimizationTrendResponse.ts b/src/serialization/types/OptimizationTrendResponse.ts
new file mode 100644
index 00000000..0e592b31
--- /dev/null
+++ b/src/serialization/types/OptimizationTrendResponse.ts
@@ -0,0 +1,41 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../api/index";
+import * as core from "../../core";
+import type * as serializers from "../index";
+import { OptimizationType } from "./OptimizationType";
+import { OptimizeAppliedFilter } from "./OptimizeAppliedFilter";
+import { OptimizeReportGoal } from "./OptimizeReportGoal";
+import { OptimizeReportIntervalEnd } from "./OptimizeReportIntervalEnd";
+import { OptimizeReportIntervalStart } from "./OptimizeReportIntervalStart";
+import { OptimizeTrendGranularity } from "./OptimizeTrendGranularity";
+import { OptimizeTrendPoint } from "./OptimizeTrendPoint";
+
+export const OptimizationTrendResponse: core.serialization.ObjectSchema<
+ serializers.OptimizationTrendResponse.Raw,
+ Webflow.OptimizationTrendResponse
+> = core.serialization.object({
+ report: core.serialization.stringLiteral("optimization_trend"),
+ intervalStart: OptimizeReportIntervalStart,
+ intervalEnd: OptimizeReportIntervalEnd,
+ goal: OptimizeReportGoal,
+ granularity: OptimizeTrendGranularity,
+ timeZone: core.serialization.string(),
+ optimizationType: OptimizationType,
+ filter: OptimizeAppliedFilter.optional(),
+ series: core.serialization.list(OptimizeTrendPoint),
+});
+
+export declare namespace OptimizationTrendResponse {
+ export interface Raw {
+ report: "optimization_trend";
+ intervalStart: OptimizeReportIntervalStart.Raw;
+ intervalEnd: OptimizeReportIntervalEnd.Raw;
+ goal: OptimizeReportGoal.Raw;
+ granularity: OptimizeTrendGranularity.Raw;
+ timeZone: string;
+ optimizationType: OptimizationType.Raw;
+ filter?: OptimizeAppliedFilter.Raw | null;
+ series: OptimizeTrendPoint.Raw[];
+ }
+}
diff --git a/src/serialization/types/OptimizationType.ts b/src/serialization/types/OptimizationType.ts
new file mode 100644
index 00000000..713051f0
--- /dev/null
+++ b/src/serialization/types/OptimizationType.ts
@@ -0,0 +1,12 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../api/index";
+import * as core from "../../core";
+import type * as serializers from "../index";
+
+export const OptimizationType: core.serialization.Schema =
+ core.serialization.enum_(["test", "personalize", "aiOptimize"]);
+
+export declare namespace OptimizationType {
+ export type Raw = "test" | "personalize" | "aiOptimize";
+}
diff --git a/src/serialization/types/OptimizeAppliedFilter.ts b/src/serialization/types/OptimizeAppliedFilter.ts
new file mode 100644
index 00000000..1f8b271b
--- /dev/null
+++ b/src/serialization/types/OptimizeAppliedFilter.ts
@@ -0,0 +1,15 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../api/index";
+import * as core from "../../core";
+import type * as serializers from "../index";
+import { OptimizeAppliedFilterEntry } from "./OptimizeAppliedFilterEntry";
+
+export const OptimizeAppliedFilter: core.serialization.Schema<
+ serializers.OptimizeAppliedFilter.Raw,
+ Webflow.OptimizeAppliedFilter
+> = core.serialization.record(core.serialization.string(), OptimizeAppliedFilterEntry);
+
+export declare namespace OptimizeAppliedFilter {
+ export type Raw = Record;
+}
diff --git a/src/serialization/types/OptimizeAppliedFilterEntry.ts b/src/serialization/types/OptimizeAppliedFilterEntry.ts
new file mode 100644
index 00000000..a59b53a8
--- /dev/null
+++ b/src/serialization/types/OptimizeAppliedFilterEntry.ts
@@ -0,0 +1,22 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../api/index";
+import * as core from "../../core";
+import type * as serializers from "../index";
+
+export const OptimizeAppliedFilterEntry: core.serialization.ObjectSchema<
+ serializers.OptimizeAppliedFilterEntry.Raw,
+ Webflow.OptimizeAppliedFilterEntry
+> = core.serialization.object({
+ name: core.serialization.string(),
+ in: core.serialization.list(core.serialization.string()).optional(),
+ nin: core.serialization.list(core.serialization.string()).optional(),
+});
+
+export declare namespace OptimizeAppliedFilterEntry {
+ export interface Raw {
+ name: string;
+ in?: string[] | null;
+ nin?: string[] | null;
+ }
+}
diff --git a/src/serialization/types/OptimizeAudienceSegment.ts b/src/serialization/types/OptimizeAudienceSegment.ts
new file mode 100644
index 00000000..82c6376d
--- /dev/null
+++ b/src/serialization/types/OptimizeAudienceSegment.ts
@@ -0,0 +1,37 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../api/index";
+import * as core from "../../core";
+import type * as serializers from "../index";
+import { OptimizeTrendDirection } from "./OptimizeTrendDirection";
+
+export const OptimizeAudienceSegment: core.serialization.ObjectSchema<
+ serializers.OptimizeAudienceSegment.Raw,
+ Webflow.OptimizeAudienceSegment
+> = core.serialization.object({
+ segment: core.serialization.string(),
+ segmentLabel: core.serialization.string(),
+ sessions: core.serialization.number(),
+ users: core.serialization.number(),
+ conversions: core.serialization.number(),
+ conversionRate: core.serialization.number(),
+ value: core.serialization.number().optional(),
+ lift: core.serialization.number().optional(),
+ trendDirection: OptimizeTrendDirection.optional(),
+ confidence: core.serialization.number().optional(),
+});
+
+export declare namespace OptimizeAudienceSegment {
+ export interface Raw {
+ segment: string;
+ segmentLabel: string;
+ sessions: number;
+ users: number;
+ conversions: number;
+ conversionRate: number;
+ value?: number | null;
+ lift?: number | null;
+ trendDirection?: OptimizeTrendDirection.Raw | null;
+ confidence?: number | null;
+ }
+}
diff --git a/src/serialization/types/OptimizeAudienceVariation.ts b/src/serialization/types/OptimizeAudienceVariation.ts
new file mode 100644
index 00000000..db7e24a7
--- /dev/null
+++ b/src/serialization/types/OptimizeAudienceVariation.ts
@@ -0,0 +1,23 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../api/index";
+import * as core from "../../core";
+import type * as serializers from "../index";
+import { OptimizeAudienceSegment } from "./OptimizeAudienceSegment";
+
+export const OptimizeAudienceVariation: core.serialization.ObjectSchema<
+ serializers.OptimizeAudienceVariation.Raw,
+ Webflow.OptimizeAudienceVariation
+> = core.serialization.object({
+ variationId: core.serialization.string(),
+ name: core.serialization.string(),
+ segments: core.serialization.list(OptimizeAudienceSegment),
+});
+
+export declare namespace OptimizeAudienceVariation {
+ export interface Raw {
+ variationId: string;
+ name: string;
+ segments: OptimizeAudienceSegment.Raw[];
+ }
+}
diff --git a/src/serialization/types/OptimizeCurrentGoal.ts b/src/serialization/types/OptimizeCurrentGoal.ts
new file mode 100644
index 00000000..69056571
--- /dev/null
+++ b/src/serialization/types/OptimizeCurrentGoal.ts
@@ -0,0 +1,32 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../api/index";
+import * as core from "../../core";
+import type * as serializers from "../index";
+import { OptimizeGoalCountingMethod } from "./OptimizeGoalCountingMethod";
+import { OptimizeGoalMetricType } from "./OptimizeGoalMetricType";
+import { OptimizeGoalScope } from "./OptimizeGoalScope";
+import { OptimizeGoalSource } from "./OptimizeGoalSource";
+
+export const OptimizeCurrentGoal: core.serialization.ObjectSchema<
+ serializers.OptimizeCurrentGoal.Raw,
+ Webflow.OptimizeCurrentGoal
+> = core.serialization.object({
+ goalId: core.serialization.string(),
+ name: core.serialization.string(),
+ metricType: OptimizeGoalMetricType,
+ scope: OptimizeGoalScope,
+ countingMethod: OptimizeGoalCountingMethod,
+ source: OptimizeGoalSource,
+});
+
+export declare namespace OptimizeCurrentGoal {
+ export interface Raw {
+ goalId: string;
+ name: string;
+ metricType: OptimizeGoalMetricType.Raw;
+ scope: OptimizeGoalScope.Raw;
+ countingMethod: OptimizeGoalCountingMethod.Raw;
+ source: OptimizeGoalSource.Raw;
+ }
+}
diff --git a/src/serialization/types/OptimizeDimension.ts b/src/serialization/types/OptimizeDimension.ts
new file mode 100644
index 00000000..f85dd4b9
--- /dev/null
+++ b/src/serialization/types/OptimizeDimension.ts
@@ -0,0 +1,20 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../api/index";
+import * as core from "../../core";
+import type * as serializers from "../index";
+
+export const OptimizeDimension: core.serialization.ObjectSchema<
+ serializers.OptimizeDimension.Raw,
+ Webflow.OptimizeDimension
+> = core.serialization.object({
+ id: core.serialization.string(),
+ name: core.serialization.string(),
+});
+
+export declare namespace OptimizeDimension {
+ export interface Raw {
+ id: string;
+ name: string;
+ }
+}
diff --git a/src/serialization/types/OptimizeDimensionValue.ts b/src/serialization/types/OptimizeDimensionValue.ts
new file mode 100644
index 00000000..97ec2d31
--- /dev/null
+++ b/src/serialization/types/OptimizeDimensionValue.ts
@@ -0,0 +1,22 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../api/index";
+import * as core from "../../core";
+import type * as serializers from "../index";
+
+export const OptimizeDimensionValue: core.serialization.ObjectSchema<
+ serializers.OptimizeDimensionValue.Raw,
+ Webflow.OptimizeDimensionValue
+> = core.serialization.object({
+ value: core.serialization.string().optional(),
+ label: core.serialization.string(),
+ eventCount: core.serialization.number(),
+});
+
+export declare namespace OptimizeDimensionValue {
+ export interface Raw {
+ value?: string | null;
+ label: string;
+ eventCount: number;
+ }
+}
diff --git a/src/serialization/types/OptimizeFilter.ts b/src/serialization/types/OptimizeFilter.ts
new file mode 100644
index 00000000..88425bd5
--- /dev/null
+++ b/src/serialization/types/OptimizeFilter.ts
@@ -0,0 +1,13 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../api/index";
+import * as core from "../../core";
+import type * as serializers from "../index";
+import { OptimizeFilterOperators } from "./OptimizeFilterOperators";
+
+export const OptimizeFilter: core.serialization.Schema =
+ core.serialization.record(core.serialization.string(), OptimizeFilterOperators);
+
+export declare namespace OptimizeFilter {
+ export type Raw = Record;
+}
diff --git a/src/serialization/types/OptimizeFilterOperators.ts b/src/serialization/types/OptimizeFilterOperators.ts
new file mode 100644
index 00000000..f80a3724
--- /dev/null
+++ b/src/serialization/types/OptimizeFilterOperators.ts
@@ -0,0 +1,20 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../api/index";
+import * as core from "../../core";
+import type * as serializers from "../index";
+
+export const OptimizeFilterOperators: core.serialization.ObjectSchema<
+ serializers.OptimizeFilterOperators.Raw,
+ Webflow.OptimizeFilterOperators
+> = core.serialization.object({
+ in: core.serialization.list(core.serialization.string()).optional(),
+ nin: core.serialization.list(core.serialization.string()).optional(),
+});
+
+export declare namespace OptimizeFilterOperators {
+ export interface Raw {
+ in?: string[] | null;
+ nin?: string[] | null;
+ }
+}
diff --git a/src/serialization/types/OptimizeGoal.ts b/src/serialization/types/OptimizeGoal.ts
new file mode 100644
index 00000000..58a3b8da
--- /dev/null
+++ b/src/serialization/types/OptimizeGoal.ts
@@ -0,0 +1,29 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../api/index";
+import * as core from "../../core";
+import type * as serializers from "../index";
+import { OptimizeGoalCountingMethod } from "./OptimizeGoalCountingMethod";
+import { OptimizeGoalMetricType } from "./OptimizeGoalMetricType";
+import { OptimizeGoalScope } from "./OptimizeGoalScope";
+
+export const OptimizeGoal: core.serialization.ObjectSchema =
+ core.serialization.object({
+ goalId: core.serialization.string(),
+ name: core.serialization.string(),
+ isPrimary: core.serialization.boolean(),
+ metricType: OptimizeGoalMetricType,
+ scope: OptimizeGoalScope,
+ countingMethod: OptimizeGoalCountingMethod,
+ });
+
+export declare namespace OptimizeGoal {
+ export interface Raw {
+ goalId: string;
+ name: string;
+ isPrimary: boolean;
+ metricType: OptimizeGoalMetricType.Raw;
+ scope: OptimizeGoalScope.Raw;
+ countingMethod: OptimizeGoalCountingMethod.Raw;
+ }
+}
diff --git a/src/serialization/types/OptimizeGoalCountingMethod.ts b/src/serialization/types/OptimizeGoalCountingMethod.ts
new file mode 100644
index 00000000..725d6979
--- /dev/null
+++ b/src/serialization/types/OptimizeGoalCountingMethod.ts
@@ -0,0 +1,14 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../api/index";
+import * as core from "../../core";
+import type * as serializers from "../index";
+
+export const OptimizeGoalCountingMethod: core.serialization.Schema<
+ serializers.OptimizeGoalCountingMethod.Raw,
+ Webflow.OptimizeGoalCountingMethod
+> = core.serialization.enum_(["unique", "cumulative"]);
+
+export declare namespace OptimizeGoalCountingMethod {
+ export type Raw = "unique" | "cumulative";
+}
diff --git a/src/serialization/types/OptimizeGoalMetricType.ts b/src/serialization/types/OptimizeGoalMetricType.ts
new file mode 100644
index 00000000..481186a8
--- /dev/null
+++ b/src/serialization/types/OptimizeGoalMetricType.ts
@@ -0,0 +1,14 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../api/index";
+import * as core from "../../core";
+import type * as serializers from "../index";
+
+export const OptimizeGoalMetricType: core.serialization.Schema<
+ serializers.OptimizeGoalMetricType.Raw,
+ Webflow.OptimizeGoalMetricType
+> = core.serialization.enum_(["conversion", "value"]);
+
+export declare namespace OptimizeGoalMetricType {
+ export type Raw = "conversion" | "value";
+}
diff --git a/src/serialization/types/OptimizeGoalScope.ts b/src/serialization/types/OptimizeGoalScope.ts
new file mode 100644
index 00000000..8e5e2d9b
--- /dev/null
+++ b/src/serialization/types/OptimizeGoalScope.ts
@@ -0,0 +1,14 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../api/index";
+import * as core from "../../core";
+import type * as serializers from "../index";
+
+export const OptimizeGoalScope: core.serialization.Schema<
+ serializers.OptimizeGoalScope.Raw,
+ Webflow.OptimizeGoalScope
+> = core.serialization.enum_(["pageview", "user", "session"]);
+
+export declare namespace OptimizeGoalScope {
+ export type Raw = "pageview" | "user" | "session";
+}
diff --git a/src/serialization/types/OptimizeGoalSource.ts b/src/serialization/types/OptimizeGoalSource.ts
new file mode 100644
index 00000000..bd9d771c
--- /dev/null
+++ b/src/serialization/types/OptimizeGoalSource.ts
@@ -0,0 +1,14 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../api/index";
+import * as core from "../../core";
+import type * as serializers from "../index";
+
+export const OptimizeGoalSource: core.serialization.Schema<
+ serializers.OptimizeGoalSource.Raw,
+ Webflow.OptimizeGoalSource
+> = core.serialization.enum_(["site", "existing", "optimization"]);
+
+export declare namespace OptimizeGoalSource {
+ export type Raw = "site" | "existing" | "optimization";
+}
diff --git a/src/serialization/types/OptimizeNonWebflowSiteResource.ts b/src/serialization/types/OptimizeNonWebflowSiteResource.ts
new file mode 100644
index 00000000..b9e7bdbb
--- /dev/null
+++ b/src/serialization/types/OptimizeNonWebflowSiteResource.ts
@@ -0,0 +1,22 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../api/index";
+import * as core from "../../core";
+import type * as serializers from "../index";
+
+export const OptimizeNonWebflowSiteResource: core.serialization.ObjectSchema<
+ serializers.OptimizeNonWebflowSiteResource.Raw,
+ Webflow.OptimizeNonWebflowSiteResource
+> = core.serialization.object({
+ optimizeSiteId: core.serialization.string(),
+ workspaceId: core.serialization.string().optional(),
+ name: core.serialization.string().optional(),
+});
+
+export declare namespace OptimizeNonWebflowSiteResource {
+ export interface Raw {
+ optimizeSiteId: string;
+ workspaceId?: string | null;
+ name?: string | null;
+ }
+}
diff --git a/src/serialization/types/OptimizeReference.ts b/src/serialization/types/OptimizeReference.ts
new file mode 100644
index 00000000..50e5c832
--- /dev/null
+++ b/src/serialization/types/OptimizeReference.ts
@@ -0,0 +1,21 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../api/index";
+import * as core from "../../core";
+import type * as serializers from "../index";
+import { OptimizeReferenceResource } from "./OptimizeReferenceResource";
+
+export const OptimizeReference: core.serialization.ObjectSchema<
+ serializers.OptimizeReference.Raw,
+ Webflow.OptimizeReference
+> = core.serialization.object({
+ optimizeId: core.serialization.string(),
+ resource: OptimizeReferenceResource,
+});
+
+export declare namespace OptimizeReference {
+ export interface Raw {
+ optimizeId: string;
+ resource: OptimizeReferenceResource.Raw;
+ }
+}
diff --git a/src/serialization/types/OptimizeReferenceListResponse.ts b/src/serialization/types/OptimizeReferenceListResponse.ts
new file mode 100644
index 00000000..06bb1e0c
--- /dev/null
+++ b/src/serialization/types/OptimizeReferenceListResponse.ts
@@ -0,0 +1,19 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../api/index";
+import * as core from "../../core";
+import type * as serializers from "../index";
+import { OptimizeReference } from "./OptimizeReference";
+
+export const OptimizeReferenceListResponse: core.serialization.ObjectSchema<
+ serializers.OptimizeReferenceListResponse.Raw,
+ Webflow.OptimizeReferenceListResponse
+> = core.serialization.object({
+ references: core.serialization.list(OptimizeReference),
+});
+
+export declare namespace OptimizeReferenceListResponse {
+ export interface Raw {
+ references: OptimizeReference.Raw[];
+ }
+}
diff --git a/src/serialization/types/OptimizeReferenceResource.ts b/src/serialization/types/OptimizeReferenceResource.ts
new file mode 100644
index 00000000..56cf61c7
--- /dev/null
+++ b/src/serialization/types/OptimizeReferenceResource.ts
@@ -0,0 +1,32 @@
+// This file was auto-generated by Fern from our API Definition.
+
+import type * as Webflow from "../../api/index";
+import * as core from "../../core";
+import type * as serializers from "../index";
+import { OptimizeNonWebflowSiteResource } from "./OptimizeNonWebflowSiteResource";
+import { OptimizeWebflowSiteResource } from "./OptimizeWebflowSiteResource";
+
+export const OptimizeReferenceResource: core.serialization.Schema<
+ serializers.OptimizeReferenceResource.Raw,
+ Webflow.OptimizeReferenceResource
+> = core.serialization
+ .union("type", {
+ "webflow-site": OptimizeWebflowSiteResource,
+ "optimize-site": OptimizeNonWebflowSiteResource,
+ })
+ .transform