Summary and recommendation
CircleCI exposes user and org management through its v2 REST API (base URL: https://circleci.com/api/v2), authenticated via a personal API token passed as the Circle-Token header or HTTP Basic Auth username. Tokens inherit the full permissions of the creating user - there are no OAuth scopes or fine-grained token permissions.
Org-scoped endpoints require an org admin token and the org's UUID (not slug), which must be retrieved first via GET /api/v2/me/collaborations. For teams managing CircleCI alongside a broader SaaS portfolio, Stitchflow's MCP server with ~100 deep IT/identity integrations provides a unified layer over this API without requiring custom connector maintenance.
API quick reference
| Has user API | Yes |
| Auth method | API Token (HTTP header: Circle-Token or HTTP Basic Auth with token as username) |
| Base URL | Official docs |
| SCIM available | No |
| SCIM plan required | Scale (Enterprise) |
Authentication
Auth method: API Token (HTTP header: Circle-Token or HTTP Basic Auth with token as username)
Setup steps
- Log in to CircleCI and navigate to User Settings > Personal API Tokens.
- Click 'Create New Token', provide a name, and copy the generated token.
- Include the token in API requests via the header: 'Circle-Token:
' or as the HTTP Basic Auth username with an empty password. - For org-level automation, create an organization-level context or use a machine user's token.
Required scopes
| Scope | Description | Required for |
|---|---|---|
| N/A (Personal API Token) | CircleCI personal API tokens do not use OAuth scopes; they inherit the permissions of the creating user. | All API operations on behalf of the token owner |
User object / data model
| Field | Type | Description | On create | On update | Notes |
|---|---|---|---|---|---|
| id | string (UUID) | Unique identifier for the user. | system-generated | immutable | Used to reference the user in API calls. |
| login | string | The user's VCS login/username (e.g., GitHub or Bitbucket username). | derived from VCS | immutable via API | Tied to the connected VCS account. |
| name | string | Display name of the user. | derived from VCS | not updatable via API | Pulled from the connected VCS provider. |
| avatar_url | string (URL) | URL to the user's avatar image. | derived from VCS | not updatable via API |
Core endpoints
Get current user (authenticated token owner)
- Method: GET
- URL:
https://circleci.com/api/v2/me - Watch out for: Returns info for the token owner only; cannot retrieve arbitrary users by ID via this endpoint.
Request example
GET /api/v2/me
Circle-Token: <token>
Response example
{
"id": "uuid-...",
"login": "jdoe",
"name": "Jane Doe",
"avatar_url": "https://..."
}
Get collaborations (orgs the user belongs to)
- Method: GET
- URL:
https://circleci.com/api/v2/me/collaborations - Watch out for: Lists orgs the authenticated user is a member of; not a full org member roster.
Request example
GET /api/v2/me/collaborations
Circle-Token: <token>
Response example
[
{
"id": "uuid-...",
"vcs_type": "github",
"name": "my-org",
"avatar_url": "https://...",
"slug": "gh/my-org"
}
]
List org members
- Method: GET
- URL:
https://circleci.com/api/v2/org/{orgID}/members - Watch out for: Requires org admin permissions. Use the org UUID (not slug) in the path.
Request example
GET /api/v2/org/{orgID}/members
Circle-Token: <token>
Response example
{
"items": [
{"id": "uuid-...", "login": "jdoe", "name": "Jane Doe"}
],
"next_page_token": "token123"
}
Get org member details
- Method: GET
- URL:
https://circleci.com/api/v2/org/{orgID}/members/{userID} - Watch out for: Role values are CircleCI-internal roles (admin, contributor, etc.), not VCS roles.
Request example
GET /api/v2/org/{orgID}/members/{userID}
Circle-Token: <token>
Response example
{
"id": "uuid-...",
"login": "jdoe",
"name": "Jane Doe",
"role": "contributor"
}
Remove org member
- Method: DELETE
- URL:
https://circleci.com/api/v2/org/{orgID}/members/{userID} - Watch out for: Irreversible via API; the user must be re-invited. Requires org admin token.
Request example
DELETE /api/v2/org/{orgID}/members/{userID}
Circle-Token: <token>
Response example
HTTP 204 No Content
List org groups (roles/teams)
- Method: GET
- URL:
https://circleci.com/api/v2/org/{orgID}/groups - Watch out for: Groups/roles feature availability may depend on plan tier.
Request example
GET /api/v2/org/{orgID}/groups
Circle-Token: <token>
Response example
{
"items": [
{"id": "uuid-...", "name": "developers", "member_count": 5}
],
"next_page_token": null
}
Get user by ID
- Method: GET
- URL:
https://circleci.com/api/v2/user/{id} - Watch out for: Only returns basic profile info. The token owner must have visibility of the user.
Request example
GET /api/v2/user/{id}
Circle-Token: <token>
Response example
{
"id": "uuid-...",
"login": "jdoe",
"name": "Jane Doe",
"avatar_url": "https://..."
}
List project users (followers)
- Method: GET
- URL:
https://circleci.com/api/v1.1/project/{vcs-type}/{username}/{project}/users - Watch out for: This is a v1.1 endpoint (legacy). CircleCI v1.1 is deprecated but still functional. Prefer v2 endpoints where available.
Request example
GET /api/v1.1/project/github/my-org/my-repo/users
Circle-Token: <token>
Response example
[
{"login": "jdoe", "avatar_url": "https://..."}
]
Rate limits, pagination, and events
- Rate limits: CircleCI enforces rate limits on API v2 endpoints. The documented limit is 1,000 requests per minute per user token for most endpoints. Some endpoints may have lower limits.
- Rate-limit headers: Yes
- Retry-After header: No
- Rate-limit notes: When rate limited, the API returns HTTP 429. CircleCI recommends exponential backoff. Specific header names for rate limit state are not publicly documented.
- Pagination method: token
- Default page size: 20
- Max page size: 100
- Pagination pointer: page-token
| Plan | Limit | Concurrent |
|---|---|---|
| All plans | 1,000 requests/minute per token | 0 |
- Webhooks available: Yes
- Webhook notes: CircleCI supports outbound webhooks that fire on pipeline/workflow/job events. There are no user-management-specific webhook events (e.g., no event for user added/removed).
- Alternative event strategy: Poll the org members API to detect membership changes, or use an IdP (Okta, Entra ID, OneLogin) with SSO to manage user lifecycle events.
- Webhook events: workflow-completed, job-completed
SCIM API status
- SCIM available: No
- SCIM version: Not documented
- Plan required: Scale (Enterprise)
- Endpoint: Not documented
Limitations:
- CircleCI does not offer a native SCIM 2.0 endpoint as of the current documentation.
- User provisioning/deprovisioning must be handled via SSO (SAML/OIDC) with supported IdPs (Okta, Entra ID, OneLogin) or via the REST API.
- The Scale/Enterprise plan is required for SSO-based user management.
- No automated SCIM provisioning; users are created on first SSO login (JIT provisioning).
Common scenarios
Three automation scenarios are well-supported by the v2 API. First, org membership audits: paginate GET /api/v2/org/{orgID}/members using the cursor-based page-token parameter until next_page_token is null, collecting id, login, name, and role per member.
Second, offboarding: call DELETE /api/v2/org/{orgID}/members/{userID} with an org admin token, then confirm removal with a follow-up GET expecting a 404 - but note this does not revoke the user's personal API tokens, which must be handled separately.
Third, cross-org membership discovery: use GET /api/v2/me/collaborations scoped to the target user's own token, as no admin endpoint exists to enumerate orgs for an arbitrary user. Some project-user endpoints remain on the legacy v1.
1 API and should be treated as stable-but-deprecated.
Audit all members of a CircleCI organization
- Authenticate with a personal API token belonging to an org admin.
- Call GET /api/v2/me/collaborations to retrieve the org UUID for the target organization.
- Call GET /api/v2/org/{orgID}/members to list all members, paginating with 'page-token' until 'next_page_token' is null.
- Record each member's id, login, name, and role for the audit report.
Watch out for: The token must belong to an org admin; non-admin tokens will receive a 403. Use the UUID from collaborations, not the slug.
Remove a departed employee from a CircleCI org
- Obtain the user's CircleCI user UUID (from the org members list or HR system mapping).
- Call DELETE /api/v2/org/{orgID}/members/{userID} with an org admin token.
- Verify removal by calling GET /api/v2/org/{orgID}/members/{userID} and confirming a 404 response.
- If SSO is enabled, also deprovision the user in the IdP (Okta/Entra/OneLogin) to prevent re-login.
Watch out for: Removing via API does not revoke any personal API tokens the user created. Those must be revoked separately through the UI or by the user.
Identify which orgs a user belongs to (self-service)
- Have the user generate a personal API token in CircleCI User Settings.
- Call GET /api/v2/me to confirm identity.
- Call GET /api/v2/me/collaborations to list all orgs and VCS accounts the token owner is a member of.
- Use the returned org slugs and IDs for further org-scoped API calls.
Watch out for: This only works for the token owner; there is no admin endpoint to list all orgs for an arbitrary user.
Why building this yourself is a trap
Several API behaviors create silent failure modes worth flagging explicitly. User invitation is not available via the API at all - invites must be sent through the web UI or via SSO. SCIM 2.0 is not natively supported; user lifecycle management falls back to SSO JIT provisioning (Scale plan required) or direct REST API calls.
Rate limits cap at 1,000 requests per minute per token with HTTP 429 responses, but retry-after headers are not documented - exponential backoff must be implemented defensively. Finally, DELETE /api/v2/org/{orgID}/members/{userID} is immediate and irreversible through the API; re-adding the user requires a manual re-invite through the UI.
Automate CircleCI workflows without one-off scripts
Stitchflow builds and maintains end-to-end IT automation across your SaaS stack, including apps without APIs. Built for exactly how your company works, with human approvals where they matter.