
Plans
List organization groups with the Organization API
Pull every Organization Group with GET https://api.cursor.com/organizations/groups, look up one by exact name with the name query parameter, or fetch one group with GET https://api.cursor.com/organizations/groups/:groupId. Official reference: Organization API → Organization Groups. Dashboard context: Organization Groups.
Authenticate with an Organization API key (Basic auth, key as username, empty password). Every group route needs members:* (or admin:*). Rate limit: 20 requests per minute per organization. A 429 includes Retry-After: 60.
Each group returns two ids. id uses the g_ prefix — pass that as :groupId on every other group route. publicId uses the grp_ prefix. Organization Groups are a different API from Team directory groups (/teams/directory-groups, team_group_… ids) and Billing Groups (/teams/groups, group_… ids). Pass the wrong prefix and the route returns 400 or 404.
List groups
curl -X GET "https://api.cursor.com/organizations/groups?page=1&pageSize=50" \
-u YOUR_ORGANIZATION_API_KEY:
| Query | Rules |
|---|---|
page |
Defaults to 1. Must be a positive integer |
pageSize |
Defaults to 50. Capped at 200; larger values clamp to 200 |
name |
Exact group name, URL-encoded. Omit or leave blank to list every group |
{
"groups": [
{
"id": "g_PDSPmvukpYgZEDXsoNirw3CFhy",
"publicId": "grp_01k2ja2000e0080000000000n2",
"name": "Engineering",
"memberCount": 12,
"monthlySpendingLimitDollars": 500,
"createdAt": "2026-01-15T10:30:00.000Z",
"updatedAt": "2026-01-20T14:22:00.000Z"
}
],
"pagination": {
"page": 1,
"pageSize": 50,
"totalCount": 1,
"totalPages": 1,
"hasNextPage": false,
"hasPreviousPage": false
}
}
| Field | Meaning |
|---|---|
id |
Organization API group id (g_…). Use as :groupId |
publicId |
Public group id (grp_…) |
name |
Group name (unique within the organization) |
memberCount |
Members currently in the group |
monthlySpendingLimitDollars |
Per-member monthly spend cap in whole dollars, or null when unset |
createdAt / updatedAt |
ISO 8601 timestamps |
Look up by name
Group names are unique within an organization. Pass name (URL-encoded) to get the normal list payload with one group or none. A name with no match returns 200 with an empty groups array — not 404. No route accepts a name in place of :groupId.
curl -X GET "https://api.cursor.com/organizations/groups?name=Engineering" \
-u YOUR_ORGANIZATION_API_KEY:
Get one group
curl -X GET https://api.cursor.com/organizations/groups/g_PDSPmvukpYgZEDXsoNirw3CFhy \
-u YOUR_ORGANIZATION_API_KEY:
{
"group": {
"id": "g_PDSPmvukpYgZEDXsoNirw3CFhy",
"publicId": "grp_01k2ja2000e0080000000000n2",
"name": "Engineering",
"memberCount": 12,
"monthlySpendingLimitDollars": 500,
"createdAt": "2026-01-15T10:30:00.000Z",
"updatedAt": "2026-01-20T14:22:00.000Z"
}
}
Pitfalls
- Passing a Team directory
team_group_…id or Billing Groupgroup_…id as:groupId - Passing
publicId(grp_…) where the route requiresid(g_…) - Assuming a missing name lookup returns 404 — it returns 200 with
groups: [] - Calling with a Team Admin API key — group routes need an Organization API key with
members:*