> This page is for Data API, version v2 Beta.
> For other versions, use one of these documentation indexes:
> - v2 (default): https://developers.webflow.com/data/v2.0.0/llms.txt
> - v2 Beta: https://developers.webflow.com/data/v2.0.0-beta/llms.txt
> - v1: https://developers.webflow.com/data/v1.0.0/llms.txt

> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://developers.webflow.com/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://developers.webflow.com/_mcp/server.

# Invite Workspace Member

POST https://api.webflow.com/beta/workspaces/{workspace_id}/members
Content-Type: application/json

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.

Reference: https://developers.webflow.com/data/reference/enterprise/workspace-members/invite-member

## Authentication

- `Authorization` header (bearer token, required) — Bearer authentication of the form `Bearer <token>`, where token is your auth token.

## Request

### Path parameters

- `workspace_id` (string, required) — 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).

### Body (application/json)

This endpoint expects a workspaces_members_invite-member_Request.

- `workspaces_members_invite-member_Request`

## Response

### 200

The request matched existing active access or a pending invite, or extended a compatible pending client invite.

- `workspaces_members_invite-member_Response_200`

### 201

A new invite was created. This includes inviting an active client to an additional Site.

- `workspaces_members_invite-member_Response_201`

## Errors

### 400 Bad Request Error

Validation failure

- `code` (enum, optional) — Error code
  - Allowed values: `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`
- `message` (string, optional) — Error message
- `externalReference` (string, optional) — Link to more information
- `details` (list of WorkspacesWorkspaceIdMembersPostResponsesContentApplicationJsonSchemaDetailsItems, optional) — Array of errors

### 401 Unauthorized Error

Provided access token is invalid or does not have access to requested resource

- `code` (enum, optional) — Error code
  - Allowed values: `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`
- `message` (string, optional) — Error message
- `externalReference` (string, optional) — Link to more information
- `details` (list of WorkspacesWorkspaceIdMembersPostResponsesContentApplicationJsonSchemaDetailsItems, optional) — Array of errors

### 403 Forbidden Error

Forbidden

- `code` (enum, optional) — Error code
  - Allowed values: `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`
- `message` (string, optional) — Error message
- `externalReference` (string, optional) — Link to more information
- `details` (list of WorkspacesWorkspaceIdMembersPostResponsesContentApplicationJsonSchemaDetailsItems, optional) — Array of errors

### 404 Not Found Error

Requested resource not found

- `code` (enum, optional) — Error code
  - Allowed values: `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`
- `message` (string, optional) — Error message
- `externalReference` (string, optional) — Link to more information
- `details` (list of WorkspacesWorkspaceIdMembersPostResponsesContentApplicationJsonSchemaDetailsItems, optional) — Array of errors

### 409 Conflict Error

Conflict

- `code` (enum, optional) — Error code
  - Allowed values: `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`
- `message` (string, optional) — Error message
- `externalReference` (string, optional) — Link to more information
- `details` (list of WorkspacesWorkspaceIdMembersPostResponsesContentApplicationJsonSchemaDetailsItems, optional) — Array of errors

### 429 Too Many Requests Error

The rate limit of the provided access_token has been reached. Please have your application respect the X-RateLimit-Remaining header we include on API responses.

- `code` (enum, optional) — Error code
  - Allowed values: `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`
- `message` (string, optional) — Error message
- `externalReference` (string, optional) — Link to more information
- `details` (list of WorkspacesWorkspaceIdMembersPostResponsesContentApplicationJsonSchemaDetailsItems, optional) — Array of errors

### 500 Internal Server Error

We had a problem with our server. Try again later.

- `code` (enum, optional) — Error code
  - Allowed values: `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`
- `message` (string, optional) — Error message
- `externalReference` (string, optional) — Link to more information
- `details` (list of WorkspacesWorkspaceIdMembersPostResponsesContentApplicationJsonSchemaDetailsItems, optional) — Array of errors

## Types

### With Default Site Role

- `email` (string, required)
- `workspaceRole` (enum, required) — The Workspace Role to invite the person as
  - Allowed values: `admin`, `member`, `reviewer`
- `defaultSiteRole` (enum, required) — The Site Role to grant across every Site the Workspace default extends to
  - Allowed values: `site_manager`, `designer`, `marketer`, `content_editor`, `reviewer`, `custom`
- `defaultSiteRoleId` (string, optional) — 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.

### With Site Access

- `email` (string, required)
- `workspaceRole` (enum, required) — The Workspace Role to invite the person as
  - Allowed values: `admin`, `member`, `reviewer`
- `siteAccess` (list of WorkspacesWorkspaceIdMembersPostRequestBodyContentApplicationJsonSchemaOneOf1SiteAccessItems, required) — 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.

### Collaborator Client Invite

- `email` (string, required)
- `workspaceRole` (enum, required) — The Workspace Role to invite the person as
  - Allowed values: `client`
- `siteAccess` (list of WorkspacesWorkspaceIdMembersPostRequestBodyContentApplicationJsonSchemaOneOf2SiteAccessItems, required) — The one Site where the collaborator client receives access.

### Invited

- `status` (enum, required)
  - Allowed values: `invited`
- `invite` (WorkspacesWorkspaceIdMembersPostResponsesContentApplicationJsonSchemaOneOf0Invite, required)

### Active Member

- `status` (enum, required)
  - Allowed values: `active`
- `member` (WorkspacesWorkspaceIdMembersPostResponsesContentApplicationJsonSchemaOneOf1Member, required)

### Invited

- `status` (enum, required)
  - Allowed values: `invited`
- `invite` (WorkspacesWorkspaceIdMembersPostResponsesContentApplicationJsonSchemaOneOf0Invite, required)

### Active Member

- `status` (enum, required)
  - Allowed values: `active`
- `member` (WorkspacesWorkspaceIdMembersPostResponsesContentApplicationJsonSchemaOneOf1Member, required)

### WorkspacesWorkspaceIdMembersPostResponsesContentApplicationJsonSchemaDetailsItems

### WorkspacesWorkspaceIdMembersPostRequestBodyContentApplicationJsonSchemaOneOf1SiteAccessItems

- `siteId` (string, required)
- `siteRole` (enum, required)
  - Allowed values: `site_manager`, `designer`, `marketer`, `content_editor`, `reviewer`, `custom`
- `siteRoleId` (string, optional) — 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.

### WorkspacesWorkspaceIdMembersPostRequestBodyContentApplicationJsonSchemaOneOf2SiteAccessItems

- `siteId` (string, required)
- `siteRole` (enum, required)
  - Allowed values: `marketer`, `content_editor`, `reviewer`, `custom`
- `siteRoleId` (string, optional) — 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.

### WorkspacesWorkspaceIdMembersPostResponsesContentApplicationJsonSchemaOneOf0Invite

- `id` (string, required) — Unique identifier for the invite
- `email` (string, required) — Email address the invite was sent to
- `role` (enum, required) — The Workspace Role the invite grants on acceptance
  - Allowed values: `owner`, `admin`, `member`, `guest`, `reviewer`, `client`
- `createdOn` (string, required) — Date the invite was created
- `status` (enum, required) — Status of the invite. Only a `pending` invite can still be accepted.
  - Allowed values: `pending`, `declined`, `expired`
- `sites` (list of string, required) — IDs of the Sites the invite grants access to
- `allSites` (boolean, required) — Whether the invite grants access across the Workspace. Use this with `sites` to distinguish workspace-wide access from no Site access.
- `defaultSiteRole` (enum, optional) — The default Site Role the invite grants on acceptance. Legacy invites might not include this field.
  - Allowed values: `site_manager`, `designer`, `branch_designer`, `limited_designer`, `marketer`, `content_editor`, `reviewer`, `viewer`, `custom`
- `defaultSiteRoleId` (string, optional) — ID of the custom Site Role named by `defaultSiteRole`

### WorkspacesWorkspaceIdMembersPostResponsesContentApplicationJsonSchemaOneOf1Member

- `id` (string, required) — Unique identifier for the Member
- `roles` (WorkspacesWorkspaceIdMembersPostResponsesContentApplicationJsonSchemaOneOf1MemberRoles, required) — Roles the Member holds
- `addedOn` (string, required, nullable) — 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.
- `email` (string, optional) — Email address of the Member
- `firstName` (string, optional) — First name of the Member
- `lastName` (string, optional) — Last name of the Member

### WorkspacesWorkspaceIdMembersPostResponsesContentApplicationJsonSchemaOneOf1MemberRoles

Roles the Member holds

- `workspace` (enum, required) — The Member's role in the Workspace
  - Allowed values: `owner`, `admin`, `member`, `guest`, `reviewer`, `client`
- `site` (enum, optional) — The Member's default Site Role. List Workspace Members and Update Workspace Member Role return it only for Workspaces on Workspace seats.
  - Allowed values: `site_manager`, `designer`, `branch_designer`, `limited_designer`, `marketer`, `content_editor`, `reviewer`, `viewer`, `custom`

## Examples

### ExistingInvite

**Response**

```json
{
  "status": "invited",
  "invite": {
    "id": "63fa5e47f6b8256f4641c5bf",
    "email": "sam.okafor@example.com",
    "role": "member",
    "createdOn": "2026-08-03T18:24:00.000Z",
    "status": "pending",
    "sites": [],
    "allSites": true,
    "defaultSiteRole": "designer"
  }
}
```

**SDK Code**

```python ExistingInvite
import requests

url = "https://api.webflow.com/beta/workspaces/580e63e98c9a982ac9b8b741/members"

headers = {"Authorization": "Bearer <token>"}

response = requests.post(url, headers=headers)

print(response.json())
```

```javascript ExistingInvite
const url = 'https://api.webflow.com/beta/workspaces/580e63e98c9a982ac9b8b741/members';
const options = {method: 'POST', headers: {Authorization: 'Bearer <token>'}};

try {
  const response = await fetch(url, options);
  const data = await response.json();
  console.log(data);
} catch (error) {
  console.error(error);
}
```

```go ExistingInvite
package main

import (
	"fmt"
	"net/http"
	"io"
)

func main() {

	url := "https://api.webflow.com/beta/workspaces/580e63e98c9a982ac9b8b741/members"

	req, _ := http.NewRequest("POST", url, nil)

	req.Header.Add("Authorization", "Bearer <token>")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
```

```ruby ExistingInvite
require 'uri'
require 'net/http'

url = URI("https://api.webflow.com/beta/workspaces/580e63e98c9a982ac9b8b741/members")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'

response = http.request(request)
puts response.read_body
```

```java ExistingInvite
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.post("https://api.webflow.com/beta/workspaces/580e63e98c9a982ac9b8b741/members")
  .header("Authorization", "Bearer <token>")
  .asString();
```

```php ExistingInvite
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://api.webflow.com/beta/workspaces/580e63e98c9a982ac9b8b741/members', [
  'headers' => [
    'Authorization' => 'Bearer <token>',
  ],
]);

echo $response->getBody();
```

```csharp ExistingInvite
using RestSharp;

var client = new RestClient("https://api.webflow.com/beta/workspaces/580e63e98c9a982ac9b8b741/members");
var request = new RestRequest(Method.POST);
request.AddHeader("Authorization", "Bearer <token>");
IRestResponse response = client.Execute(request);
```

```swift ExistingInvite
import Foundation

let headers = ["Authorization": "Bearer <token>"]

let request = NSMutableURLRequest(url: NSURL(string: "https://api.webflow.com/beta/workspaces/580e63e98c9a982ac9b8b741/members")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "POST"
request.allHTTPHeaderFields = headers

let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
  if (error != nil) {
    print(error as Any)
  } else {
    let httpResponse = response as? HTTPURLResponse
    print(httpResponse)
  }
})

dataTask.resume()
```

### ExistingClientInvite

**Response**

```json
{
  "status": "invited",
  "invite": {
    "id": "63fa5e47f6b8256f4641c5bf",
    "email": "client@example.com",
    "role": "client",
    "createdOn": "2026-08-03T18:24:00.000Z",
    "status": "pending",
    "sites": [
      "62fa5e47f6b8256f4641c5bd"
    ],
    "allSites": false,
    "defaultSiteRole": "content_editor"
  }
}
```

**SDK Code**

```python ExistingClientInvite
import requests

url = "https://api.webflow.com/beta/workspaces/580e63e98c9a982ac9b8b741/members"

headers = {"Authorization": "Bearer <token>"}

response = requests.post(url, headers=headers)

print(response.json())
```

```javascript ExistingClientInvite
const url = 'https://api.webflow.com/beta/workspaces/580e63e98c9a982ac9b8b741/members';
const options = {method: 'POST', headers: {Authorization: 'Bearer <token>'}};

try {
  const response = await fetch(url, options);
  const data = await response.json();
  console.log(data);
} catch (error) {
  console.error(error);
}
```

```go ExistingClientInvite
package main

import (
	"fmt"
	"net/http"
	"io"
)

func main() {

	url := "https://api.webflow.com/beta/workspaces/580e63e98c9a982ac9b8b741/members"

	req, _ := http.NewRequest("POST", url, nil)

	req.Header.Add("Authorization", "Bearer <token>")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
```

```ruby ExistingClientInvite
require 'uri'
require 'net/http'

url = URI("https://api.webflow.com/beta/workspaces/580e63e98c9a982ac9b8b741/members")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'

response = http.request(request)
puts response.read_body
```

```java ExistingClientInvite
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.post("https://api.webflow.com/beta/workspaces/580e63e98c9a982ac9b8b741/members")
  .header("Authorization", "Bearer <token>")
  .asString();
```

```php ExistingClientInvite
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://api.webflow.com/beta/workspaces/580e63e98c9a982ac9b8b741/members', [
  'headers' => [
    'Authorization' => 'Bearer <token>',
  ],
]);

echo $response->getBody();
```

```csharp ExistingClientInvite
using RestSharp;

var client = new RestClient("https://api.webflow.com/beta/workspaces/580e63e98c9a982ac9b8b741/members");
var request = new RestRequest(Method.POST);
request.AddHeader("Authorization", "Bearer <token>");
IRestResponse response = client.Execute(request);
```

```swift ExistingClientInvite
import Foundation

let headers = ["Authorization": "Bearer <token>"]

let request = NSMutableURLRequest(url: NSURL(string: "https://api.webflow.com/beta/workspaces/580e63e98c9a982ac9b8b741/members")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "POST"
request.allHTTPHeaderFields = headers

let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
  if (error != nil) {
    print(error as Any)
  } else {
    let httpResponse = response as? HTTPURLResponse
    print(httpResponse)
  }
})

dataTask.resume()
```

### ExistingMember

**Response**

```json
{
  "status": "active",
  "member": {
    "id": "62fa5e47f6b8256f4641c5bd",
    "email": "waylon.dalton@example.com",
    "firstName": "Waylon",
    "lastName": "Dalton",
    "roles": {
      "workspace": "member",
      "site": "designer"
    },
    "addedOn": "2026-08-03T18:24:00.000Z"
  }
}
```

**SDK Code**

```python ExistingMember
import requests

url = "https://api.webflow.com/beta/workspaces/580e63e98c9a982ac9b8b741/members"

headers = {"Authorization": "Bearer <token>"}

response = requests.post(url, headers=headers)

print(response.json())
```

```javascript ExistingMember
const url = 'https://api.webflow.com/beta/workspaces/580e63e98c9a982ac9b8b741/members';
const options = {method: 'POST', headers: {Authorization: 'Bearer <token>'}};

try {
  const response = await fetch(url, options);
  const data = await response.json();
  console.log(data);
} catch (error) {
  console.error(error);
}
```

```go ExistingMember
package main

import (
	"fmt"
	"net/http"
	"io"
)

func main() {

	url := "https://api.webflow.com/beta/workspaces/580e63e98c9a982ac9b8b741/members"

	req, _ := http.NewRequest("POST", url, nil)

	req.Header.Add("Authorization", "Bearer <token>")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
```

```ruby ExistingMember
require 'uri'
require 'net/http'

url = URI("https://api.webflow.com/beta/workspaces/580e63e98c9a982ac9b8b741/members")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'

response = http.request(request)
puts response.read_body
```

```java ExistingMember
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.post("https://api.webflow.com/beta/workspaces/580e63e98c9a982ac9b8b741/members")
  .header("Authorization", "Bearer <token>")
  .asString();
```

```php ExistingMember
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://api.webflow.com/beta/workspaces/580e63e98c9a982ac9b8b741/members', [
  'headers' => [
    'Authorization' => 'Bearer <token>',
  ],
]);

echo $response->getBody();
```

```csharp ExistingMember
using RestSharp;

var client = new RestClient("https://api.webflow.com/beta/workspaces/580e63e98c9a982ac9b8b741/members");
var request = new RestRequest(Method.POST);
request.AddHeader("Authorization", "Bearer <token>");
IRestResponse response = client.Execute(request);
```

```swift ExistingMember
import Foundation

let headers = ["Authorization": "Bearer <token>"]

let request = NSMutableURLRequest(url: NSURL(string: "https://api.webflow.com/beta/workspaces/580e63e98c9a982ac9b8b741/members")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "POST"
request.allHTTPHeaderFields = headers

let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
  if (error != nil) {
    print(error as Any)
  } else {
    let httpResponse = response as? HTTPURLResponse
    print(httpResponse)
  }
})

dataTask.resume()
```

### WorkspaceMember

**Response**

```json
{
  "status": "invited",
  "invite": {
    "id": "63fa5e47f6b8256f4641c5bf",
    "email": "sam.okafor@example.com",
    "role": "member",
    "createdOn": "2026-08-03T18:24:00.000Z",
    "status": "pending",
    "sites": [],
    "allSites": true,
    "defaultSiteRole": "designer"
  }
}
```

**SDK Code**

```python WorkspaceMember
import requests

url = "https://api.webflow.com/beta/workspaces/580e63e98c9a982ac9b8b741/members"

headers = {"Authorization": "Bearer <token>"}

response = requests.post(url, headers=headers)

print(response.json())
```

```javascript WorkspaceMember
const url = 'https://api.webflow.com/beta/workspaces/580e63e98c9a982ac9b8b741/members';
const options = {method: 'POST', headers: {Authorization: 'Bearer <token>'}};

try {
  const response = await fetch(url, options);
  const data = await response.json();
  console.log(data);
} catch (error) {
  console.error(error);
}
```

```go WorkspaceMember
package main

import (
	"fmt"
	"net/http"
	"io"
)

func main() {

	url := "https://api.webflow.com/beta/workspaces/580e63e98c9a982ac9b8b741/members"

	req, _ := http.NewRequest("POST", url, nil)

	req.Header.Add("Authorization", "Bearer <token>")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
```

```ruby WorkspaceMember
require 'uri'
require 'net/http'

url = URI("https://api.webflow.com/beta/workspaces/580e63e98c9a982ac9b8b741/members")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'

response = http.request(request)
puts response.read_body
```

```java WorkspaceMember
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.post("https://api.webflow.com/beta/workspaces/580e63e98c9a982ac9b8b741/members")
  .header("Authorization", "Bearer <token>")
  .asString();
```

```php WorkspaceMember
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://api.webflow.com/beta/workspaces/580e63e98c9a982ac9b8b741/members', [
  'headers' => [
    'Authorization' => 'Bearer <token>',
  ],
]);

echo $response->getBody();
```

```csharp WorkspaceMember
using RestSharp;

var client = new RestClient("https://api.webflow.com/beta/workspaces/580e63e98c9a982ac9b8b741/members");
var request = new RestRequest(Method.POST);
request.AddHeader("Authorization", "Bearer <token>");
IRestResponse response = client.Execute(request);
```

```swift WorkspaceMember
import Foundation

let headers = ["Authorization": "Bearer <token>"]

let request = NSMutableURLRequest(url: NSURL(string: "https://api.webflow.com/beta/workspaces/580e63e98c9a982ac9b8b741/members")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "POST"
request.allHTTPHeaderFields = headers

let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
  if (error != nil) {
    print(error as Any)
  } else {
    let httpResponse = response as? HTTPURLResponse
    print(httpResponse)
  }
})

dataTask.resume()
```

### CollaboratorClient

**Request**

```json
{
  "email": "client@example.com",
  "workspaceRole": "client",
  "siteAccess": [
    {
      "siteId": "62fa5e47f6b8256f4641c5bd",
      "siteRole": "content_editor"
    }
  ]
}
```

**Response**

```json
{
  "status": "invited",
  "invite": {
    "id": "63fa5e47f6b8256f4641c5bf",
    "email": "client@example.com",
    "role": "client",
    "createdOn": "2026-08-03T18:24:00.000Z",
    "status": "pending",
    "sites": [
      "62fa5e47f6b8256f4641c5bd"
    ],
    "allSites": false,
    "defaultSiteRole": "content_editor"
  }
}
```

**SDK Code**

```python CollaboratorClient
import requests

url = "https://api.webflow.com/beta/workspaces/580e63e98c9a982ac9b8b741/members"

payload = {
    "email": "client@example.com",
    "workspaceRole": "client",
    "siteAccess": [
        {
            "siteId": "62fa5e47f6b8256f4641c5bd",
            "siteRole": "content_editor"
        }
    ]
}
headers = {
    "Authorization": "Bearer <token>",
    "Content-Type": "application/json"
}

response = requests.post(url, json=payload, headers=headers)

print(response.json())
```

```javascript CollaboratorClient
const url = 'https://api.webflow.com/beta/workspaces/580e63e98c9a982ac9b8b741/members';
const options = {
  method: 'POST',
  headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
  body: '{"email":"client@example.com","workspaceRole":"client","siteAccess":[{"siteId":"62fa5e47f6b8256f4641c5bd","siteRole":"content_editor"}]}'
};

try {
  const response = await fetch(url, options);
  const data = await response.json();
  console.log(data);
} catch (error) {
  console.error(error);
}
```

```go CollaboratorClient
package main

import (
	"fmt"
	"strings"
	"net/http"
	"io"
)

func main() {

	url := "https://api.webflow.com/beta/workspaces/580e63e98c9a982ac9b8b741/members"

	payload := strings.NewReader("{\n  \"email\": \"client@example.com\",\n  \"workspaceRole\": \"client\",\n  \"siteAccess\": [\n    {\n      \"siteId\": \"62fa5e47f6b8256f4641c5bd\",\n      \"siteRole\": \"content_editor\"\n    }\n  ]\n}")

	req, _ := http.NewRequest("POST", url, payload)

	req.Header.Add("Authorization", "Bearer <token>")
	req.Header.Add("Content-Type", "application/json")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
```

```ruby CollaboratorClient
require 'uri'
require 'net/http'

url = URI("https://api.webflow.com/beta/workspaces/580e63e98c9a982ac9b8b741/members")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n  \"email\": \"client@example.com\",\n  \"workspaceRole\": \"client\",\n  \"siteAccess\": [\n    {\n      \"siteId\": \"62fa5e47f6b8256f4641c5bd\",\n      \"siteRole\": \"content_editor\"\n    }\n  ]\n}"

response = http.request(request)
puts response.read_body
```

```java CollaboratorClient
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.post("https://api.webflow.com/beta/workspaces/580e63e98c9a982ac9b8b741/members")
  .header("Authorization", "Bearer <token>")
  .header("Content-Type", "application/json")
  .body("{\n  \"email\": \"client@example.com\",\n  \"workspaceRole\": \"client\",\n  \"siteAccess\": [\n    {\n      \"siteId\": \"62fa5e47f6b8256f4641c5bd\",\n      \"siteRole\": \"content_editor\"\n    }\n  ]\n}")
  .asString();
```

```php CollaboratorClient
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://api.webflow.com/beta/workspaces/580e63e98c9a982ac9b8b741/members', [
  'body' => '{
  "email": "client@example.com",
  "workspaceRole": "client",
  "siteAccess": [
    {
      "siteId": "62fa5e47f6b8256f4641c5bd",
      "siteRole": "content_editor"
    }
  ]
}',
  'headers' => [
    'Authorization' => 'Bearer <token>',
    'Content-Type' => 'application/json',
  ],
]);

echo $response->getBody();
```

```csharp CollaboratorClient
using RestSharp;

var client = new RestClient("https://api.webflow.com/beta/workspaces/580e63e98c9a982ac9b8b741/members");
var request = new RestRequest(Method.POST);
request.AddHeader("Authorization", "Bearer <token>");
request.AddHeader("Content-Type", "application/json");
request.AddParameter("application/json", "{\n  \"email\": \"client@example.com\",\n  \"workspaceRole\": \"client\",\n  \"siteAccess\": [\n    {\n      \"siteId\": \"62fa5e47f6b8256f4641c5bd\",\n      \"siteRole\": \"content_editor\"\n    }\n  ]\n}", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
```

```swift CollaboratorClient
import Foundation

let headers = [
  "Authorization": "Bearer <token>",
  "Content-Type": "application/json"
]
let parameters = [
  "email": "client@example.com",
  "workspaceRole": "client",
  "siteAccess": [
    [
      "siteId": "62fa5e47f6b8256f4641c5bd",
      "siteRole": "content_editor"
    ]
  ]
] as [String : Any]

let postData = JSONSerialization.data(withJSONObject: parameters, options: [])

let request = NSMutableURLRequest(url: NSURL(string: "https://api.webflow.com/beta/workspaces/580e63e98c9a982ac9b8b741/members")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "POST"
request.allHTTPHeaderFields = headers
request.httpBody = postData as Data

let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
  if (error != nil) {
    print(error as Any)
  } else {
    let httpResponse = response as? HTTPURLResponse
    print(httpResponse)
  }
})

dataTask.resume()
```

### WithDefaultSiteRole

**Request**

```json
{
  "email": "sam.okafor@example.com",
  "workspaceRole": "member",
  "defaultSiteRole": "designer"
}
```

**Response**

```json
{
  "status": "invited",
  "invite": {
    "id": "63fa5e47f6b8256f4641c5bf",
    "email": "sam.okafor@example.com",
    "role": "member",
    "createdOn": "2026-08-03T18:24:00.000Z",
    "status": "pending",
    "sites": [],
    "allSites": true,
    "defaultSiteRole": "designer"
  }
}
```

**SDK Code**

```python WithDefaultSiteRole
import requests

url = "https://api.webflow.com/beta/workspaces/580e63e98c9a982ac9b8b741/members"

payload = {
    "email": "sam.okafor@example.com",
    "workspaceRole": "member",
    "defaultSiteRole": "designer"
}
headers = {
    "Authorization": "Bearer <token>",
    "Content-Type": "application/json"
}

response = requests.post(url, json=payload, headers=headers)

print(response.json())
```

```javascript WithDefaultSiteRole
const url = 'https://api.webflow.com/beta/workspaces/580e63e98c9a982ac9b8b741/members';
const options = {
  method: 'POST',
  headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
  body: '{"email":"sam.okafor@example.com","workspaceRole":"member","defaultSiteRole":"designer"}'
};

try {
  const response = await fetch(url, options);
  const data = await response.json();
  console.log(data);
} catch (error) {
  console.error(error);
}
```

```go WithDefaultSiteRole
package main

import (
	"fmt"
	"strings"
	"net/http"
	"io"
)

func main() {

	url := "https://api.webflow.com/beta/workspaces/580e63e98c9a982ac9b8b741/members"

	payload := strings.NewReader("{\n  \"email\": \"sam.okafor@example.com\",\n  \"workspaceRole\": \"member\",\n  \"defaultSiteRole\": \"designer\"\n}")

	req, _ := http.NewRequest("POST", url, payload)

	req.Header.Add("Authorization", "Bearer <token>")
	req.Header.Add("Content-Type", "application/json")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
```

```ruby WithDefaultSiteRole
require 'uri'
require 'net/http'

url = URI("https://api.webflow.com/beta/workspaces/580e63e98c9a982ac9b8b741/members")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n  \"email\": \"sam.okafor@example.com\",\n  \"workspaceRole\": \"member\",\n  \"defaultSiteRole\": \"designer\"\n}"

response = http.request(request)
puts response.read_body
```

```java WithDefaultSiteRole
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.post("https://api.webflow.com/beta/workspaces/580e63e98c9a982ac9b8b741/members")
  .header("Authorization", "Bearer <token>")
  .header("Content-Type", "application/json")
  .body("{\n  \"email\": \"sam.okafor@example.com\",\n  \"workspaceRole\": \"member\",\n  \"defaultSiteRole\": \"designer\"\n}")
  .asString();
```

```php WithDefaultSiteRole
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://api.webflow.com/beta/workspaces/580e63e98c9a982ac9b8b741/members', [
  'body' => '{
  "email": "sam.okafor@example.com",
  "workspaceRole": "member",
  "defaultSiteRole": "designer"
}',
  'headers' => [
    'Authorization' => 'Bearer <token>',
    'Content-Type' => 'application/json',
  ],
]);

echo $response->getBody();
```

```csharp WithDefaultSiteRole
using RestSharp;

var client = new RestClient("https://api.webflow.com/beta/workspaces/580e63e98c9a982ac9b8b741/members");
var request = new RestRequest(Method.POST);
request.AddHeader("Authorization", "Bearer <token>");
request.AddHeader("Content-Type", "application/json");
request.AddParameter("application/json", "{\n  \"email\": \"sam.okafor@example.com\",\n  \"workspaceRole\": \"member\",\n  \"defaultSiteRole\": \"designer\"\n}", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
```

```swift WithDefaultSiteRole
import Foundation

let headers = [
  "Authorization": "Bearer <token>",
  "Content-Type": "application/json"
]
let parameters = [
  "email": "sam.okafor@example.com",
  "workspaceRole": "member",
  "defaultSiteRole": "designer"
] as [String : Any]

let postData = JSONSerialization.data(withJSONObject: parameters, options: [])

let request = NSMutableURLRequest(url: NSURL(string: "https://api.webflow.com/beta/workspaces/580e63e98c9a982ac9b8b741/members")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "POST"
request.allHTTPHeaderFields = headers
request.httpBody = postData as Data

let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
  if (error != nil) {
    print(error as Any)
  } else {
    let httpResponse = response as? HTTPURLResponse
    print(httpResponse)
  }
})

dataTask.resume()
```

### WithSiteAccess

**Request**

```json
{
  "email": "sam.okafor@example.com",
  "workspaceRole": "member",
  "siteAccess": [
    {
      "siteId": "62fa5e47f6b8256f4641c5bd",
      "siteRole": "content_editor"
    },
    {
      "siteId": "62fa5e47f6b8256f4641c5be",
      "siteRole": "content_editor"
    }
  ]
}
```

**Response**

```json
{
  "status": "invited",
  "invite": {
    "id": "63fa5e47f6b8256f4641c5bf",
    "email": "sam.okafor@example.com",
    "role": "member",
    "createdOn": "2026-08-03T18:24:00.000Z",
    "status": "pending",
    "sites": [],
    "allSites": true,
    "defaultSiteRole": "designer"
  }
}
```

**SDK Code**

```python WithSiteAccess
import requests

url = "https://api.webflow.com/beta/workspaces/580e63e98c9a982ac9b8b741/members"

payload = {
    "email": "sam.okafor@example.com",
    "workspaceRole": "member",
    "siteAccess": [
        {
            "siteId": "62fa5e47f6b8256f4641c5bd",
            "siteRole": "content_editor"
        },
        {
            "siteId": "62fa5e47f6b8256f4641c5be",
            "siteRole": "content_editor"
        }
    ]
}
headers = {
    "Authorization": "Bearer <token>",
    "Content-Type": "application/json"
}

response = requests.post(url, json=payload, headers=headers)

print(response.json())
```

```javascript WithSiteAccess
const url = 'https://api.webflow.com/beta/workspaces/580e63e98c9a982ac9b8b741/members';
const options = {
  method: 'POST',
  headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
  body: '{"email":"sam.okafor@example.com","workspaceRole":"member","siteAccess":[{"siteId":"62fa5e47f6b8256f4641c5bd","siteRole":"content_editor"},{"siteId":"62fa5e47f6b8256f4641c5be","siteRole":"content_editor"}]}'
};

try {
  const response = await fetch(url, options);
  const data = await response.json();
  console.log(data);
} catch (error) {
  console.error(error);
}
```

```go WithSiteAccess
package main

import (
	"fmt"
	"strings"
	"net/http"
	"io"
)

func main() {

	url := "https://api.webflow.com/beta/workspaces/580e63e98c9a982ac9b8b741/members"

	payload := strings.NewReader("{\n  \"email\": \"sam.okafor@example.com\",\n  \"workspaceRole\": \"member\",\n  \"siteAccess\": [\n    {\n      \"siteId\": \"62fa5e47f6b8256f4641c5bd\",\n      \"siteRole\": \"content_editor\"\n    },\n    {\n      \"siteId\": \"62fa5e47f6b8256f4641c5be\",\n      \"siteRole\": \"content_editor\"\n    }\n  ]\n}")

	req, _ := http.NewRequest("POST", url, payload)

	req.Header.Add("Authorization", "Bearer <token>")
	req.Header.Add("Content-Type", "application/json")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
```

```ruby WithSiteAccess
require 'uri'
require 'net/http'

url = URI("https://api.webflow.com/beta/workspaces/580e63e98c9a982ac9b8b741/members")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n  \"email\": \"sam.okafor@example.com\",\n  \"workspaceRole\": \"member\",\n  \"siteAccess\": [\n    {\n      \"siteId\": \"62fa5e47f6b8256f4641c5bd\",\n      \"siteRole\": \"content_editor\"\n    },\n    {\n      \"siteId\": \"62fa5e47f6b8256f4641c5be\",\n      \"siteRole\": \"content_editor\"\n    }\n  ]\n}"

response = http.request(request)
puts response.read_body
```

```java WithSiteAccess
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.post("https://api.webflow.com/beta/workspaces/580e63e98c9a982ac9b8b741/members")
  .header("Authorization", "Bearer <token>")
  .header("Content-Type", "application/json")
  .body("{\n  \"email\": \"sam.okafor@example.com\",\n  \"workspaceRole\": \"member\",\n  \"siteAccess\": [\n    {\n      \"siteId\": \"62fa5e47f6b8256f4641c5bd\",\n      \"siteRole\": \"content_editor\"\n    },\n    {\n      \"siteId\": \"62fa5e47f6b8256f4641c5be\",\n      \"siteRole\": \"content_editor\"\n    }\n  ]\n}")
  .asString();
```

```php WithSiteAccess
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://api.webflow.com/beta/workspaces/580e63e98c9a982ac9b8b741/members', [
  'body' => '{
  "email": "sam.okafor@example.com",
  "workspaceRole": "member",
  "siteAccess": [
    {
      "siteId": "62fa5e47f6b8256f4641c5bd",
      "siteRole": "content_editor"
    },
    {
      "siteId": "62fa5e47f6b8256f4641c5be",
      "siteRole": "content_editor"
    }
  ]
}',
  'headers' => [
    'Authorization' => 'Bearer <token>',
    'Content-Type' => 'application/json',
  ],
]);

echo $response->getBody();
```

```csharp WithSiteAccess
using RestSharp;

var client = new RestClient("https://api.webflow.com/beta/workspaces/580e63e98c9a982ac9b8b741/members");
var request = new RestRequest(Method.POST);
request.AddHeader("Authorization", "Bearer <token>");
request.AddHeader("Content-Type", "application/json");
request.AddParameter("application/json", "{\n  \"email\": \"sam.okafor@example.com\",\n  \"workspaceRole\": \"member\",\n  \"siteAccess\": [\n    {\n      \"siteId\": \"62fa5e47f6b8256f4641c5bd\",\n      \"siteRole\": \"content_editor\"\n    },\n    {\n      \"siteId\": \"62fa5e47f6b8256f4641c5be\",\n      \"siteRole\": \"content_editor\"\n    }\n  ]\n}", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
```

```swift WithSiteAccess
import Foundation

let headers = [
  "Authorization": "Bearer <token>",
  "Content-Type": "application/json"
]
let parameters = [
  "email": "sam.okafor@example.com",
  "workspaceRole": "member",
  "siteAccess": [
    [
      "siteId": "62fa5e47f6b8256f4641c5bd",
      "siteRole": "content_editor"
    ],
    [
      "siteId": "62fa5e47f6b8256f4641c5be",
      "siteRole": "content_editor"
    ]
  ]
] as [String : Any]

let postData = JSONSerialization.data(withJSONObject: parameters, options: [])

let request = NSMutableURLRequest(url: NSURL(string: "https://api.webflow.com/beta/workspaces/580e63e98c9a982ac9b8b741/members")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "POST"
request.allHTTPHeaderFields = headers
request.httpBody = postData as Data

let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
  if (error != nil) {
    print(error as Any)
  } else {
    let httpResponse = response as? HTTPURLResponse
    print(httpResponse)
  }
})

dataTask.resume()
```