API / get-and-update-origin-app-via-api

API

Get and update an Origin App via the API

Publishers read one app with GET https://api.cursor.com/v1/origin/apps/{appId} and change its settings with PATCH https://api.cursor.com/v1/origin/apps/{appId}. Official reference: Origin API → Get App and Update App.

Origin is in Early Beta and subject to change. Both calls take a Cursor user access token. Get App requires namespace:apps:read. Update App requires app:settings:write. Availability: Early Beta per the API overview.

Get App is the management read for publishers. Get Authenticated App (GET /v1/origin/app with an app JWT) is the app's self-read of the same metadata shape.

Get App

Path parameters

Param Required Meaning
appId yes App identifier prefixed app_
curl --request GET \
  --url 'https://api.cursor.com/v1/origin/apps/APP_ID' \
  --header 'Authorization: Bearer YOUR_USER_ACCESS_TOKEN'

Response fields

Field Meaning
id Globally unique app id
displayName Human-facing name
webhookUrl HTTPS webhook URL; empty when the app receives no deliveries
events Webhook event subscriptions
createdAt / updatedAt RFC 3339 timestamps
installationRedirectUris Exact OAuth install callback allowlist
namespaceSlug Owning namespace slug
description / websiteUrl Publisher fields; empty when unset
defaultScopes Default scopes offered at install

Cost: 1 point.

Update App

Omitted fields stay unchanged. Send at least one settable field. Nested objects that replace a list (events, installationRedirectUris, defaultScopes) are clean replaces: omit the object to leave the list alone; send an empty inner array to clear it.

Clearing webhookUrl with an empty string disables outbound webhook delivery and cancels the app's pending deliveries. Setting a URL again does not resurrect cancelled deliveries.

Path parameters

Param Required Meaning
appId yes App identifier prefixed app_

Request body (all optional; at least one required)

Field Meaning
displayName New name; must not be empty when provided
webhookUrl Absolute HTTPS URL, or "" to disable delivery
events.events Complete new webhook event set
description New description; "" clears
websiteUrl New publisher site; "" clears
installationRedirectUris.installationRedirectUris Complete new callback allowlist
defaultScopes.scopes Complete new default install scopes
curl --request PATCH \
  --url 'https://api.cursor.com/v1/origin/apps/APP_ID' \
  --header 'Authorization: Bearer YOUR_USER_ACCESS_TOKEN' \
  --header 'Content-Type: application/json' \
  --data '{
  "webhookUrl": "https://ci.acme.dev/webhooks/origin-v2",
  "events": {
    "events": [
      "pull_request.created",
      "pull_request.merged",
      "repository.pushed"
    ]
  }
}'

Response

Same app object shape as Get App, reflecting the updated settings. Cost: 5 points.

After changing the webhook URL, call Ping Webhook (POST /v1/origin/app/webhook/pings with an app JWT) to confirm the receiver answers 2xx.

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