---
title: "List project collaborators"
method: GET
path: "/v1/projects/{project_id}/collaborators"
tags: ["members-access"]
---

# List project collaborators

`GET /v1/projects/{project_id}/collaborators`

**Plan:** `Enterprise`

Returns the users with direct access to this project.

## Path parameters

- `project_id` string, required — Project ID

## Query parameters

- `limit` integer — Maximum number of items to return
- `cursor` string — Opaque pagination cursor returned by the previous page

## Response `200`

OK

- CursorListResponseV1ProjectCollaborator
  - `data` V1ProjectCollaborator[], nullable, required
    - `accepted_at` string, date-time — When the user accepted the project invitation. Null if the invite is still pending.
    - `access_level` 'owner' | 'admin' | 'write' | 'read' | 'none', required — Access level: owner, admin, write, or read
    - `display_name` string — Human-readable display name. Falls back to the email when the user has not set a display name.
    - `email` string — Email address of the collaborator. Empty if the user has no resolvable email (e.g. deleted user records that were not filtered out, or service-account-like users without an email on file).
    - `invited_at` string, date-time — When the user was invited to the project. Null for the project owner.
    - `invited_by` string — User ID of the inviter. Empty for the project owner.
    - `is_internal` boolean, required — True when the user is internal to the workspace: either a workspace member, or their email belongs to a domain the workspace has verified (typical SSO / JIT provisioning case). Useful for distinguishing internal vs. external collaborators in security reviews.
    - `is_workspace_member` boolean, required — True when the user is a member of the project's workspace. False indicates an ad-hoc project collaborator who has no broader workspace access.
    - `user_id` string, required — User ID of the collaborator
  - `pagination` Pagination, required
    - `has_more` boolean, required — Whether more results are available beyond this page
    - `next_cursor` string, nullable, required — Cursor for the next page; null when there are no more results

## Other responses

- `401` — Missing or invalid API key.
- `402` — This operation or requested configuration requires a workspace plan that includes this feature.
- `403` — The key or caller lacks the required scope or permission.
- `406` — The Accept header excludes every media type this endpoint produces.
- `429` — Too many requests. Retry after the interval in Retry-After when present.
- `default` — Error. The response body uses the standard error envelope; status matches the HTTP status code and type is a machine-readable error code.

---

[API](https://skmtc.net/lovable/apis/lovable-api.md) · [All operations](https://skmtc.net/lovable/apis/lovable-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/lovable/lovable-api/revisions/aa8d44585147/schema)
