Changes who can work on a site: invite a collaborator, remove one, or resend / revoke an invitation that has not been accepted yet.
Each call runs at one of two scopes. Use the scope shown. A site call is made with site scope and the site ID in the tool's site ID parameter; that is the only way the site reaches Wix, so never add a site ID to the request body. An account call is made with account scope, which ignores the site ID.
| Scope | Call | Purpose |
|---|---|---|
| Site | GET https://www.wixapis.com/roles-management/v2/contributors/query | list the site's collaborators |
| Site | POST https://www.wixapis.com/roles-management/contributor/remove | remove a collaborator |
| Account | GET https://www.wixapis.com/roles-management/roles | look up role IDs for invites |
| Site | POST https://www.wixapis.com/invites/site-invite/bulk | send invites (returns the inviteIds) |
| Site | POST https://www.wixapis.com/invites/site-invite/{inviteId}/resend | resend a pending invite |
| Site | POST https://www.wixapis.com/invites/site-invite/{inviteId}/revoke | revoke a pending invite |
Docs: Contributors, Site Invites
accountId and accountOwnerId per collaborator. If the user names a collaborator by email or name, ask them for that person's account ID, or for how to find it, before removing anyone. Do not guess which account ID belongs to which person.inviteId. There is no endpoint to list a site's pending invites. The inviteId is returned when the invite is created (invites[].id in the Bulk Invite response, Step 6) — keep it if you will need to resend or revoke later in the conversation. If the user does not have it, say that it cannot be looked up through the API and ask them to provide it.| User wants | Needs | Go to |
|---|---|---|
| Remove someone who already has access | their accountId | Step 2, then Step 3 |
| Remove themselves | their own accountId | Step 7 |
| Invite someone new | their email(s) and a role (policyIds) | Step 6 |
| Cancel an invite not yet accepted | the inviteId | Step 4 |
| Resend an invite not yet accepted | the inviteId | Step 5 |
Removal works only on existing collaborators; revoke and resend work only on pending invites. Do not use one for the other.
When the user names the person only by email, work out what that email is before acting:
invites[].email from a Bulk Invite response you received, you have its inviteId: treat the person as an invitee (Step 4 or 5). If the user asked to remove them, cancel the invite (Step 4).No filter is needed to list everyone. To narrow by role, pass filter.policyIds (up to 20 role IDs) as repeated query parameters. Response:
Always run this read-only query before removing anyone. Use it to confirm the accountId the user gave is a current collaborator. If it is not in the list, stop and tell the user that account is not a collaborator on the site, so there is nothing to remove. If it is the site owner's account (it matches accountOwnerId), do not remove it: an owner can leave only after transferring ownership to another user. Tell the user that.
Removal clears all of the collaborator's role assignments on the site, so they lose access. When the user gave the exact accountId and Step 2 shows it is a current collaborator (and not the owner), call it directly — do not ask for confirmation:
The response is {} on success.
When the user named the invite (or you created it earlier in this conversation and hold its inviteId), call it directly with an empty JSON body {}. Ask only if you cannot tell which invite is meant:
The response is {}. Revoke applies to pending invites only; if the person has since accepted and appears in the Step 2 list, use Step 3 instead.
When the user named the invite (or you created it earlier in this conversation and hold its inviteId), call it directly with an empty JSON body {}. Ask only if you cannot tell which invite is meant:
The response contains the invite: invite.id, invite.email, invite.status (Pending, Used, Deleted, Declined, Expired) and invite.expirationDate. Report the status back to the user.
Ask the user for the email address(es) (1–10) and which role to grant; policyIds are role IDs, not names. Look them up with GET https://www.wixapis.com/roles-management/roles (Get Roles Info), which returns predefinedRoles and customRoles. Add ?filter.role_level=SITE_LEVEL to list only site roles. Each entry is { "id": "<role id>", "title": "...", "description": "..." }; use the ID of the role the user chose, and do not guess an ID. If the user said "any" or "a standard role", pick from predefinedRoles the role whose description grants the least access (view or content editing, not managing, billing or ownership) and name its title in your final message; if they gave no role at all, ask which one. Once you have the emails and a role, send the invite without asking for confirmation:
The response has invites[] (each with id, email, status, expirationDate) and failedEmails / failedInvites. Report any that failed. Keep each invites[].id: it is the inviteId for Steps 4 and 5.
The APIs cannot tell who is talking to you, so you need the user's own accountId from them. Then:
accountId. The user asked for this, so do not ask for confirmation, but do not soften it afterwards: removal cannot be undone.State what was done, to which account or email, and the outcome. Do not show raw IDs unless the user asks. Always say which of these happened:
For resend, read invite.status in the response: if it is Used, the person already accepted and is now a collaborator, so say they already have access rather than that the invite was resent; Declined, Expired or Deleted mean the invite is no longer pending.
Last updated: 15 October 2026