API / list-and-get-origin-app-installations-via-api

API

List and get Origin App installations via the API

List installations for the authenticated app with GET https://api.cursor.com/v1/origin/app/installations, and fetch one with GET https://api.cursor.com/v1/origin/app/installations/{installationId}. Official reference: Origin API → List App Installations / Get App Installation.

Origin is in Early Beta and subject to change. Authenticate with an app JWT. Store each installation id from the install receipt (sub claim) or from this list — you need it to mint installation access tokens. Availability: Early Beta per the API overview.

No installation scope is required — presenting a valid app JWT is enough.

List installations

Query parameters

Param Required Meaning
pageSize no Max installations to return. Defaults to 30 when unset or 0. Values above 100 are clamped to 100.
pageToken no Opaque cursor from a previous response's nextPageToken. Empty for the first page.
curl --request GET \
  --url 'https://api.cursor.com/v1/origin/app/installations' \
  --header 'Authorization: Bearer YOUR_APP_JWT'

Response fields

Field Meaning
installations Page of installations owned by the authenticated app.
installations[].id Installation identifier used to mint installation access tokens.
installations[].appId Identifier of the installed app.
installations[].target.slug URL-facing owner slug.
installations[].target.id Origin owner identifier.
installations[].target.type Owner namespace type: team or user. Omitted when unknown.
installations[].createdAt RFC 3339 installation creation timestamp.
installations[].updatedAt RFC 3339 timestamp for the latest installation update.
installations[].repoSelectionMode Repository grant mode: exactly all or selected.
installations[].scopes Scopes approved for the installation.
installations[].installedBy User who originally installed the app (not the most recent re-consent). Absent when that user record can no longer be read.
installations[].suspendedAt RFC 3339 timestamp while suspended. Omitted while active.
nextPageToken Opaque cursor for the next page; empty when there are no more pages.

deletedAt appears only on the installation.deleted webhook snapshot — a deleted installation no longer resolves through this API.

Example:

{
  "installations": [
    {
      "id": "inst_01k2ja2000e0080000000000b2",
      "appId": "app_01k2ja2000e0080000000000a1",
      "target": {
        "slug": "acme",
        "id": "ns_01k2ja2000e0080000000000p3",
        "type": "team"
      },
      "createdAt": "2026-08-01T09:30:00Z",
      "updatedAt": "2026-08-02T14:45:00Z",
      "repoSelectionMode": "selected",
      "scopes": [
        "repository:contents:read",
        "repository:pull_requests:read"
      ]
    }
  ]
}

Get one installation

Path parameters

Param Required Meaning
installationId yes Installation identifier.
curl --request GET \
  --url 'https://api.cursor.com/v1/origin/app/installations/INSTALLATION_ID' \
  --header 'Authorization: Bearer YOUR_APP_JWT'

Response fields match a single element of the list (same id, appId, target, timestamps, repoSelectionMode, scopes, optional installedBy / suspendedAt).

Example:

{
  "id": "inst_01k2ja2000e0080000000000b2",
  "appId": "app_01k2ja2000e0080000000000a1",
  "target": {
    "slug": "acme",
    "id": "ns_01k2ja2000e0080000000000p3",
    "type": "team"
  },
  "createdAt": "2026-08-01T09:30:00Z",
  "updatedAt": "2026-08-02T14:45:00Z",
  "repoSelectionMode": "selected",
  "scopes": [
    "repository:contents:read",
    "repository:pull_requests:read"
  ]
}

Treat page tokens as opaque. Restart pagination when filters change. A 404 means the installation is not available to this app — Origin does not distinguish missing from unreachable.

Base URL: https://api.cursor.com/v1/origin.