PLANS / list-organization-groups-via-org-api

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 Group group_… id as :groupId
  • Passing publicId (grp_…) where the route requires id (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:*