Thanks to visit codestin.com
Credit goes to cursor.com

Skip to main content

Command Palette

Search for a command to run...

API

Origin API

Origin — платформа Cursor для разработки кода. Её публичный REST API позволяет приложениям и инструментам работать с репозиториями Origin, коммитами, проверками, pull request и установками приложений.

  • Origin Apps проходят аутентификацию с помощью JWT приложений и токенов доступа установки. См. раздел Аутентификация.
  • Полную спецификацию OpenAPI с подробными схемами и примерами можно посмотреть здесь.
  • Агенты могут загрузить индекс llms.txt или полную справочную документацию в формате Markdown по адресу llms-full.txt.

Обзор

Приложения Origin используют модель согласия на установку в стиле OAuth и модель аутентификации в стиле GitHub App:

  1. Приложение подписывает краткосрочный EdDSA JWT своим приватным ключом Ed25519.
  2. Приложение обменивает этот JWT и идентификатор установки на краткосрочный токен доступа установки (oit_…).
  3. Токен установки обращается к API репозиториев и аутентифицирует Git по HTTPS в пределах одобренных для установки репозиториев и областей доступа.
  4. Origin отправляет подписанные доставки вебхука на зарегистрированный URL вебхука приложения.

Базовый URL

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

Пути к конечной точке в справочнике включают полный префикс /v1/origin.

Соглашения протокола

Для запросов и ответов используется application/json. В именах полей JSON используется camelCase. Метки времени указываются в виде строк RFC 3339. 64-битные целые числа Protobuf, включая номера pull request и номера версий, кодируются как строки JSON.

Ответы содержат поля со значениями по умолчанию, а не опускают их, поэтому логическое значение false, число 0, пустая строка и пустой массив присутствуют в теле. Считывайте само значение, а не трактуйте отсутствующий ключ как значение по умолчанию. Поля, описанные в документации как отсутствующие или опускаемые, являются необязательными в контракте и не включаются в тело, если не заданы.

Начало работы

Доступ к Origin

Origin CLI

Установите Origin CLI и войдите в систему:

curl -fsSL https://downloads.cursor.com/origin/install.sh | shorigin auth login

Клонируйте существующий репозиторий:

origin repo clone '{ownerSlug}/{repoName}'# или напрямую через gitgit clone 'https://origin.cursor.com/{ownerSlug}/{repoName}.git'

Apps клонируют через аутентификацию Git по HTTPS с токеном доступа установки, а не с учётными данными пользователя.

Установка

Попросите администратора рабочей области клиента перейти по ссылке:

https://cursor.com/codebase/apps/install  ?client_id=APP_ID  &scope=SPACE_SEPARATED_SCOPES  &redirect_uri=REGISTERED_CALLBACK  &state=RANDOM_ANTI_FORGERY_VALUE  &summary=SHORT_REASON_FOR_ACCESS  &include_granted_scopes=true
ПараметрОбязательныйОписание
client_idДаидентификатор приложения Origin.
scopeДаОбласти доступа, разделённые пробелами. repository:metadata:read добавляется автоматически.
redirect_uriДа при установке по инициативе партнёраТочный зарегистрированный URI обратного вызова.
stateНастоятельно рекомендуетсяСлучайное значение для защиты от подделки, дублируемое в качестве утверждения state в квитанции об установке. Создайте его перед перенаправлением и проверьте утверждение в обратном вызове.
summaryНетКраткое пояснение, отображаемое при предоставлении согласия.
include_granted_scopesНетЕсли true, сохраняет существующие разрешения и запрашивает только дополнительные.

Администратор рабочей области выбирает целевого владельца, одобренные области доступа, а также все репозитории или выбранные репозитории. Доступ к репозиториям контролирует клиент, а не приложение.

После одобрения Origin перенаправляет на зарегистрированный обратный вызов:

https://ci.example.com/origin/callback?installation_receipt=RECEIPT_JWT

Проверьте квитанцию об установке, затем сохраните идентификатор установки из утверждения sub. Он понадобится при выпуске токена доступа установки.

Установки используют один из двух режимов выбора репозиториев:

  • all: установка может получать доступ ко всем репозиториям, принадлежащим выбранной цели.
  • selected: установка может получать доступ только к репозиториям, выбранным администратором рабочей области.

Оба режима распространяются на зеркалированные репозитории и нативные репозитории Origin, поэтому зеркало появляется в GET /installation/repos и его можно выбрать. Зеркало доступно только для чтения, пока не станет стабильным исходящим зеркалом: см. Зеркалированные репозитории.

Используйте GET /installation/repos с токеном установки, чтобы узнать, какие репозитории доступны для этой установки. Конечные точки App JWT позволяют выводить список установок приложения, просматривать их и удалять. Удаление установки предотвращает выпуск новых токенов.

Квитанция об установке

installation_receipt — это краткосрочный компактный JWT, подписанный Origin. Он подтверждает, что одобрение установки поступило от Origin, а не было подделано при перенаправлении, и содержит всё необходимое для обратного вызова. Cursor не выполняет перенаправление без него, поэтому он всегда включается во внешние обратные вызовы.

Заголовок JOSE:

{  "alg": "EdDSA",  "kid": "origin-key-id",  "typ": "origin-installation-receipt+jwt"}

Утверждения:

{  "iss": "https://api.cursor.com/v1/origin",  "aud": "app_01...",  "sub": "i_01...",  "namespace_id": "ns_01...",  "iat": 1786465200,  "exp": 1786465500,  "jti": "RECEIPT_UUID",  "installedBy": {    "id": "user_01...",    "email": "[email protected]",    "displayName": "Jane Doe"  },  "state": "ORIGINAL_VALUE"}
  • aud — идентификатор вашего приложения, а sub — идентификатор установки, который следует использовать при выпуске токенов доступа установки.
  • namespace_id — стабильный идентификатор пространства имён, в котором установлено приложение.
  • installedBy определяет пользователя, выполнившего эту установку или повторное согласие. Он описывает текущее действие, поэтому при повторном согласии может отличаться от устойчивого installedBy в Получить установку приложения. Он содержит displayName, если у аккаунта есть имя, и никогда не содержит handle; вместо этого считывайте handle из ответа REST или payload вебхука.
  • Срок действия квитанции об установке истекает через пять минут после выпуска. jti уникален для каждой квитанции об установке.
  • state присутствует, только если URL установки содержал непустой state, и повторяет его значение. Сопоставьте его со значением защиты от подделки, которое вы создали до перенаправления.

Проверяйте квитанцию об установке, прежде чем доверять обратному вызову: определите ключ подписи из JWKS по заголовку kid, требуйте alg EdDSA и typ origin-installation-receipt+jwt, а также проверяйте подпись, iss, aud и exp. Отклоняйте обратный вызов, если проверка не пройдена.

Квитанция об установке не является токеном доступа установки. Никогда не отправляйте её как учётные данные Bearer; вместо этого выпускайте токены установки через Создать токен доступа установки.

Аутентификация

Передавайте учетные данные REST по схеме Bearer. Значки Auth у каждой конечной точки показывают, какие типы учетных данных он принимает:

curl --request GET \  --url https://api.cursor.com/v1/origin/repos/OWNER_SLUG/REPO_NAME \  --header "Authorization: Bearer $ORIGIN_BEARER_TOKEN"

Создание ключа подписи приложения

Origin Apps используют для аутентификации пару ключей Ed25519. Создайте пару локально, затем зарегистрируйте только открытый ключ на cursor.com/codebase/settings/apps. Приложение может иметь до 10 активных ключей подписи.

Создайте приватный ключ PKCS#8 и открытый ключ PEM SPKI с помощью OpenSSL:

openssl genpkey -algorithm ED25519 -out origin-app-private.pemopenssl pkey -in origin-app-private.pem -pubout -out origin-app-public.pem

Файл открытого ключа начинается с -----BEGIN PUBLIC KEY-----. Вставьте этот PEM при добавлении ключа подписи. Используйте соответствующий приватный ключ только для подписи app JWT.

App JWT

Подпишите краткосрочный JWT приватным ключом Ed25519, соответствующим одному из активных ключей подписи приложения. Создайте эту пару, как описано в разделе Создание ключа подписи приложения.

Заголовок JOSE:

{  "alg": "EdDSA",  "kid": "app_01...",  "typ": "JWT"}

Утверждения:

{  "iss": "app_01...",  "aud": "origin-apps",  "iat": 1782928800,  "exp": 1782929100}

Задайте для iss и kid идентификатор приложения. Установите срок действия около пяти минут.

Authorization: Bearer APP_JWT

Используйте App JWT для операций на уровне приложения: чтения его метаданных, управления установками, выпуска токенов установки и повторной доставки вебхука.

Токен доступа установки

Выполните запрос POST /app/installations/{installationId}/access_tokens с App JWT. Токены установки начинаются с oit_.

Authorization: Bearer oit_...

Ответ содержит expiresAt. Выпускайте токены непосредственно перед использованием, обновляйте их до истечения срока действия, обращайтесь с ними как с паролями и никогда не записывайте в журналы.

Удаление установки или приложения делает токены установки недействительными до expiresAt. После этого REST API и Git по HTTPS отклоняют токен с кодом 401. Не повторяйте попытку с тем же токеном; приложение необходимо переустановить, прежде чем оно сможет выпустить рабочий токен.

Токен установки не может предоставлять больше прав, чем одобренные для установки область доступа или доступ к репозиториям. Токен можно ограничить меньшим набором область доступа или repositoryIds. Пустые или пропущенные массивы наследуют полный набор разрешений установки.

Используйте токены установки для операций, ограниченных репозиторием, включая pull requests, запись результатов проверок и Git по HTTPS.

Аутентификация Git по HTTPS

Токены доступа установки используются для аутентификации Git по HTTPS. Конечная точка Git использует базовую аутентификацию HTTP: пароль — токен установки, имя пользователя — x-access-token. Учетные данные Bearer предназначены для REST API; Git по HTTPS их не принимает.

Выпускайте токен с помощью Создать токен доступа установки непосредственно перед операцией Git. Срок действия токена — не более 15 минут.

Для клонирования, fetch и pull требуется repository:contents:read. Для push требуется repository:contents:write. Токен должен включать целевой репозиторий в предоставленных разрешениях.

Для push также требуется, чтобы владелец репозитория имел право записи в Origin — такое же требование действует для Создать репозиторий. Владелец-пользователь должен использовать тариф Pro, Pro Student, Pro+, Ultra или Start. Владелец-команда должна иметь активный платный тариф команды, не использовать режим конфиденциальности (устаревшая версия), а Origin не должен быть отключён администратором команды. Push в репозиторий, владелец которого не соответствует этим требованиям, возвращает 403. Для клонирования, fetch и pull это требование не действует.

Получите cloneUrl из Получить репозиторий или Список репозиториев установки приложения. Клонирование поддерживается как по пути в формате GitHub (https://origin.cursor.com/OWNER_SLUG/REPO_NAME.git), так и по устаревшему пути /git/.

git clone "https://x-access-token:${INSTALLATION_TOKEN}@origin.cursor.com/OWNER_SLUG/REPO_NAME.git"

Токен, встроенный в URL, сохраняется в .git/config. После успешного клонирования измените URL удалённого репозитория, чтобы последующие команды не использовали истёкший секрет:

git remote set-url origin "https://origin.cursor.com/OWNER_SLUG/REPO_NAME.git"

Чтобы не указывать токен в URL удалённого репозитория, передайте его через помощник Git для учётных данных:

git -c credential.helper="!f() { echo username=x-access-token; echo password=${INSTALLATION_TOKEN}; }; f" \  clone "https://origin.cursor.com/OWNER_SLUG/REPO_NAME.git"

Помощник учётных данных Origin CLI предназначен для входа пользователей. Интеграции приложений передают токен установки, как показано здесь. Обращайтесь с токеном как с паролем: никогда не записывайте его в логи и выпускайте новый до expiresAt, если задаче по-прежнему нужен доступ к Git.

В зеркальном репозитории токен установки позволяет клонировать, выполнять fetch и pull, а Origin отклоняет git push с кодом 403, пока зеркало не станет стабильным исходящим зеркалом. См. Зеркалированные репозитории.

Запросы CLI с аутентификацией пользователя

Используйте origin api для запросов с аутентификацией пользователя. Для интерактивной сессии войдите в систему через браузер:

origin auth loginorigin api /repos/OWNER_SLUG/REPO_NAME/pulls

Для неинтерактивной сессии укажите личный пользовательский API-ключ из Cursor Dashboard → API Keys:

export CURSOR_API_KEY="YOUR_PERSONAL_USER_API_KEY"origin api /repos/OWNER_SLUG/REPO_NAME/pulls

CLI обменивает личный пользовательский API-ключ на краткосрочный пользовательский токен доступа и передаёт этот токен в заголовке Authorization. Не отправляйте сам API-ключ на конечную точку Origin. Интеграциям приложений следует вместо этого использовать app JWT и токены доступа установки.

Discovery и ключи подписи

Origin публикует общедоступные метаданные Discovery и свои активные ключи подписи. Эти же ключи подписывают доставки вебхуков и квитанции об установке.

Метаданные Discovery содержат issuer и jwks_uri:

curl https://api.cursor.com/v1/origin/.well-known/openid-configuration
{  "issuer": "https://api.cursor.com/v1/origin",  "jwks_uri": "https://api.cursor.com/v1/origin/keys",  "response_types_supported": ["id_token"],  "subject_types_supported": ["public"],  "id_token_signing_alg_values_supported": ["EdDSA"]}

/keys возвращает активные JWK Ed25519:

curl https://api.cursor.com/v1/origin/keys
{  "keys": [    {      "kty": "OKP",      "crv": "Ed25519",      "use": "sig",      "alg": "EdDSA",      "kid": "origin-key-id",      "x": "PUBLIC_KEY_MATERIAL"    }  ]}

Кэшируйте JWKS. /keys отправляет Cache-Control: public, max-age=600, stale-if-error=600, поэтому используйте кэшированный ответ в течение 10 минут, затем обновляйте его; если обновление не удалось, используйте последние корректные ключи не более ещё 10 минут, прежде чем проверка завершится ошибкой. Также обновляйте при подписи, которую не удаётся проверить ни одним ключом, — это исключит идентификатор выведенного из обращения ключа. Ключи меняются еженедельно.

Подписи вебхуков не содержат идентификатор ключа, поэтому при проверке следует попробовать все активные ключи Ed25519. Квитанции об установке содержат kid ключа подписи в заголовке JOSE, поэтому ключ для проверки квитанции можно определить напрямую.

Области доступа

Запрашивайте только те области доступа, которые действительно нужны вашему приложению. repository:metadata:read, а также доступ к метаданным приложения или установки предоставляются автоматически и не должны отдельно добавляться в URL установки.

Область доступаРазрешает
repository:metadata:readЧитать метаданные репозитория. Добавляется автоматически.
repository:contents:readЧитать коммиты, ветки, содержимое, файлы сравнения и низкоуровневые объекты Git. Искать текст в файлах. Скачать архив репозитория. Клонировать, выполнять fetch и выполнять pull через Git по HTTPS. Синхронизировать зеркальный репозиторий с исходным репозиторием.
repository:contents:writeВыполнять push через Git по HTTPS. Объединять pull request. Создавать ветки и коммитить изменения файлов через конечные точки git data. Повторно запрашивать запуск проверки.
repository:pull_requests:readЧитать pull request, изменённые файлы, коммиты pull request, назначенные метки и возможность объединения.
repository:pull_requests:writeСоздавать и обновлять pull request. Назначать и удалять метки pull request.
repository:pull_requests:reviews:readЧитать комментарии к pull request, треды комментариев, отправленные ревью и запрошенных ревьюеров.
repository:pull_requests:reviews:writeСоздавать и обновлять комментарии; разрешать и повторно открывать треды комментариев; создавать, обновлять и отклонять ревью; запрашивать и удалять ревьюеров.
repository:checks:readЧитать наборы, запуски проверок и аннотации запусков проверок.
repository:checks:writeСоздавать и обновлять наборы и запуски проверок. Добавлять аннотации запусков проверок.
repository:labels:readЧитать определения меток, принадлежащие репозиторию.
repository:labels:writeСоздавать, обновлять и удалять определения меток репозитория.
repository:rulesets:readЧитать наборы правил репозитория.
repository:rulesets:writeСоздавать, обновлять и удалять наборы правил репозитория.
repository:settings:readЧитать разрешения, выданные непосредственно на репозиторий.
repository:settings:writeОбновлять настройки репозитория: ветку по умолчанию, видимость, методы объединения и автоматическое удаление head-ветки. Выполнять upsert и удаление разрешений на репозиторий.
namespace:settings:readЧитать разрешения, выданные непосредственно на владельца.
namespace:settings:writeВыполнять upsert и удаление разрешений на владельца.

Запрос области доступа :write также предоставляет соответствующую область доступа :read, поэтому repository:labels:write включает repository:labels:read, и вам не нужно указывать обе. Обратное неверно: область доступа для чтения никогда не предоставляет права на запись.

Токен установки может только сужать эти разрешения. Он не может добавить область доступа или репозиторий, не одобренные администратором рабочей области.

Изменения состояния зеркала не входят в эту таблицу. Transition Repo Mirror, Force Repo Mirror Cutover и Detach Repo Mirror используют repository:mirror:write или repository:mirror:delete, которые приложение не может запросить при установке: они входят в учётные данные пользователя Cursor, а вызывающая сторона также должна администрировать репозиторий в вышестоящем источнике зеркала.

Управление приложениями не входит в неё по той же причине. создать приложение использует namespace:apps:create, List Namespace Appsnamespace:apps:read, Get Appapp:settings:read, а Update App, Add ключ подписи приложения и Revoke ключ подписи приложенияapp:settings:write. Издатель имеет их в учётных данных пользователя Cursor; приложение не может запросить их для себя.

В таблице перечислены области доступа, которые приложение запрашивает при установке. Чтобы узнать, какая область доступа требуется для отдельной операции, прочитайте её расширение x-origin-scopes в спецификации OpenAPI. Это расширение охватывает все операции, включая области доступа app, installation и namespace, которые входят в состав самих учётных данных, а не предоставляются разрешением при установке. Операция, все области доступа которой входят в состав учётных данных, помечается в расширении как ambient: true: запрашивать для неё ничего не нужно — достаточно предъявить нужные учётные данные.

Зеркалированные репозитории

Установка использует все доступные ей области доступа для нативного репозитория Origin и стабильного исходящего зеркала. Для репозитория в любом другом состоянии зеркала доступны только две области доступа:

  • repository:metadata:read
  • repository:contents:read

Все остальные области доступа возвращают 403 для этого репозитория независимо от того, что одобрил администратор рабочей области. Через REST API по-прежнему доступны чтение репозитория и содержимого, сравнение коммитов и синхронизация зеркала, а Origin отклоняет pull requests, ревью, комментарии, проверки, наборы правил и любые операции записи. Через Git по HTTPS по-прежнему работают clone, fetch, pull и скачивание LFS, а Origin отклоняет push и загрузку LFS.

Вывести репозиторий из этого состояния может только операция с учётными данными пользователя — установке это не под силу: Transition Repo Mirror меняет направление зеркалирования, Force Repo Mirror Cutover выполняет переключение на вышестоящий источник без отправки расходящихся refs обратно, а Detach Repo Mirror окончательно отключает зеркало.

Объект mirror репозитория не показывает, разрешена ли запись. Зеркало в процессе перехода может сообщать mirror.status как outbound и при этом оставаться доступным только для чтения, поэтому считайте 403 источником истины, а не ориентируйтесь на mirror.status.

Ограничение частоты запросов

В Origin API для каждого принципала действует общий балльный лимит, обновляемый в скользящем одноминутном окне. Для каждого типа аутентифицированного принципала установлен свой лимит:

ПринципалЛимит по умолчанию
Токен доступа установки3 000 баллов в минуту
App JWT6 000 баллов в минуту
Пользователь Cursor или сервисный аккаунт600 баллов в минуту

Перед запуском обработчика каждая конечная точка списывает из этого лимита фиксированное количество баллов. Ошибки аутентификации и авторизации не расходуют баллы.

Cursor может увеличить поминутный лимит для отдельных приложений партнёров по дизайну. Свяжитесь с Cursor, если вашей интеграции требуется более высокий лимит.

Заголовки ответа

Тарифицируемые ответы и Получить сведения об ограничении частоты запросов включают:

ЗаголовокОписание
X-RateLimit-LimitКоличество баллов, доступных в текущем окне для данного принципала
X-RateLimit-RemainingКоличество баллов, оставшихся в текущем окне
X-RateLimit-UsedКоличество баллов, израсходованных в текущем окне
X-RateLimit-ResetМетка времени Unix (в секундах UTC), когда окно сбрасывается
X-RateLimit-ResourceВсегда core для общего бюджета публичного API

X-RateLimit-Reset указывает на полное 60-секундное окно, отсчитываемое с момента ответа. Окно счётчика начинается с первого тарифицируемого запроса в серии, а не на границе календарной минуты.

Превышение лимита

Если запрос превышает лимит, API возвращает ответ HTTP 429 со следующими данными:

  • Retry-After: количество секунд ожидания перед повторной попыткой (60)
  • Те же заголовки X-RateLimit-*, при этом значение X-RateLimit-Remaining равно 0
{  "code": 8,  "message": "Rate limit exceeded: 3000 points per minute for this installation. Retry after 60s.",  "details": []}

Перед повторной попыткой дождитесь времени, указанного в Retry-After, или наступления X-RateLimit-Reset. Если несколько вызывающих сторон используют один токен установки, применяйте экспоненциальную задержку с джиттером.

Проверка оставшейся квоты

Вызовите Получить сведения об ограничении частоты запросов, чтобы узнать текущий лимит, не расходуя баллы. Тело ответа соответствует заголовкам X-RateLimit-* для общего ресурса core.

Общие соглашения

Пагинация

Конечные точки с поддержкой пагинации принимают:

  • pageSize: по умолчанию — 30, максимум — 100.
  • pageToken: непрозрачный токен, возвращённый предыдущей страницей. Не анализируйте и не формируйте его самостоятельно.

В ответах используются поле коллекции для конкретного ресурса и nextPageToken. Оно пусто, если следующей страницы нет. В ответах на публичные запросы списков общее количество не указывается. Токены страниц привязаны к исходному ресурсу и фильтрам. При изменении фильтров начните пагинацию заново. Недопустимые, несовпадающие или непустые токены, не соответствующие запросу, возвращают 400.

Ошибки

Для ошибок используется тело в стиле Google RPC:

{  "code": 5,  "message": "resource not found",  "details": []}

Распространённые коды состояния HTTP: 400, 401, 403, 404, 429, 500 и 503. Некоторые операции с базой данных Git также возвращают 409 при конфликтах состояния репозитория. См. Ограничения частоты запросов для заголовков 429 и поведения при повторных попытках.

Используйте код состояния HTTP и code для обработки ошибок. message предназначено для разработчиков.

404 не позволяет отличить несуществующий ресурс от ресурса, к которому ваше приложение не может получить доступ. Интерпретируйте его как "недоступен для этой установки", а не как доказательство отсутствия ресурса.

details содержит типизированные записи: сведения о нарушениях полей google.rpc.BadRequest при недопустимом аргументе и запись google.rpc.RequestInfo при каждой ошибке. Origin может в любой момент добавлять типы сведений, поэтому игнорируйте записи, которые ваша интеграция не распознаёт.

Каждый ответ с ошибкой содержит идентификатор запроса дважды: в заголовке ответа X-Request-ID и в записи google.rpc.RequestInfo в details. Origin возвращает отправленный вами x-request-id или генерирует его, если вы его не отправили. Запись RequestInfo присутствует даже если message содержит непрозрачную внутреннюю ошибку, поэтому при обращении в Cursor по поводу неудачного вызова укажите идентификатор запроса.

Несопоставленные пути в /v1/origin и запросы, использующие неверный метод для известного пути, возвращают это же тело вместо общей ошибки маршрутизатора. Сообщение указывает метод и путь и никогда не возвращает строку запроса.

Пути репозитория

В путях, ограниченных репозиторием, слаг владельца и имя репозитория указываются в формате {ownerSlug}/{repoName}. Оба сегмента обрабатываются без учёта регистра, поэтому к репозиторию можно обратиться при любом регистре. В ответах возвращаются сохранённые имя и слаг, а не указанный вами регистр; URL Git по HTTPS обрабатываются так же. Сравнивайте имена репозиториев без учёта регистра, а канонический вариант написания берите из Получить репозиторий.

Каждый путь, ограниченный репозиторием, также принимает стабильный идентификатор репозитория вместо этой пары: укажите _ в качестве слага владельца и идентификатор в качестве имени репозитория, например GET /v1/origin/repos/_/REPO_ID. Идентификатор берите из поля id в Получить репозиторий. Зарезервированный символ _ нельзя использовать в качестве слага владельца, поэтому эти две формы никогда не пересекаются. В запросе Connect или JSON задайте для ownerSlug значение _, а для name — идентификатор.

Форма с идентификатором сохраняется после переименования, поэтому это стабильный способ обратиться к репозиторию. Сам по себе идентификатор не предоставляет никаких прав: после того как Origin сопоставит идентификатор с репозиторием, вашему приложению всё равно нужна та же область действия для этого репозитория. Идентификатор, к которому ваше приложение не имеет доступа, возвращает то же тело 404, что и несуществующий идентификатор, поэтому ответ никогда не подтверждает существование репозитория. Некорректный идентификатор возвращает 400. Create Repo принимает только слаг владельца и отклоняет _.

Ссылки на ресурсы

Снимки ресурсов содержат актуальные значения полей ресурса. В контексте контейнера используются компактные ссылки вместо дублирования полных ресурсов:

  • RepositoryReference указывает на репозиторий.
  • PullRequestReference указывает на pull request и содержит ссылку на его репозиторий.
  • ThreadReference указывает на тред, содержащий комментарий к pull request.
  • OriginActor указывает на публичного инициатора как на один из вариантов: user, app или serviceAccount. Присутствует ровно один вариант; считывайте identity из этого варианта.

Текущие ограничения

  • Получение списка репозиториев в пространстве имён и создание репозиториев не поддерживаются Partner API. Репозитории можно находить через установку.
  • Сравнение коммитов возвращает сводные данные, а не встроенный список коммитов. У изменённых файлов есть собственная конечная точка с пагинацией: Список файлов сравнения.
  • К тредам можно обращаться только для их разрешения. Конечная точка для прямого получения списка тредов отсутствует; читайте их из содержащихся в них комментариев.
  • Вебхуки push не содержат полного списка коммитов.
  • Слияние pull request поддерживается для нативных репозиториев Origin. Зеркальные репозитории отклоняются.
  • Зеркальный репозиторий доступен только для чтения для установки, пока не станет стабильным исходящим зеркалом. См. Зеркальные репозитории.

Контрольный список реализации

  • Храните приватный ключ Ed25519 в менеджере секретов и выполняйте ротацию ключей осознанно. См. Создание ключа подписи приложения.
  • Проверяйте подтверждение установки в колбэках установки и считывайте идентификатор установки и state из его утверждений.
  • Используйте краткоживущие JWT приложения и выпускайте токены установки непосредственно перед использованием.
  • Для API с областью действия в пределах репозитория, записи check-run и Git HTTPS используйте токены установки, а не JWT приложения.
  • Запрашивайте минимально необходимые области доступа и доступ к репозиторию.
  • Считайте токены страниц непрозрачными и перезапускайте пагинацию при изменении фильтров.
  • Поддерживайте значения key проверок стабильными и понятными. Для каждой повторной попытки используйте новый неизменяемый externalId, а для обновлений — возрастающие значения externalUpdatedAt.
  • Проверяйте подписи вебхука по сырому телу запроса до его разбора.
  • Дедуплицируйте доставки по webhook-id и обрабатывайте их асинхронно после возврата 2xx.
  • Игнорируйте неизвестные поля JSON для прямой совместимости.

Справочник конечных точек

Полные схемы компонентов доступны в спецификации OpenAPI. В документе в качестве сервера указан https://api.cursor.com, определена схема безопасности HTTP Bearer bearerAuth, а для каждой операции перечислены коды ответов, которые она может вернуть, а также пример запроса и ответа. Кроме того, каждая операция содержит расширение x-origin-scopes: в scopes указан scope, необходимый для операции, а в tokenTypes — типы credential, которые она принимает. Параметры пути имеют те же имена, что используются в URL: ownerSlug и repoName. У каждой операции есть уникальный operationId; если одна операция обслуживает две формы URL, идентификатор второй формы получает суффикс _2, например OriginService_GetRepoTarball_2.

Во фрагментах JSON показаны значения-заполнители, соответствующие схемам. Описания полей ответа отражают схему OpenAPI и текущий контракт платформы.

Приложения и установки

Получить лимит запросов

GET/v1/origin/rate_limit
AuthApp JWTInstallation tokenUser access token

Возвращает текущую информацию о лимите запросов к публичному API для аутентифицированного принципала.

Запрос к этой конечной точке не расходует баллы лимита запросов. Ответ содержит общий поминутный лимит баллов, используемый другими конечными точками публичного API для этого принципала. См. ограничение частоты запросов.

Поля ответа

resources object

Ресурсы лимита запросов для аутентифицированного принципала.

resources.core object

Общий поминутный лимит баллов для конечных точек публичного API.

resources.core.limit integer

Максимальное количество баллов, доступных в текущем интервале.

resources.core.remaining integer

Количество баллов, оставшихся в текущем интервале.

resources.core.reset integer

Метка времени Unix (в секундах UTC), когда текущий интервал будет сброшен.

resources.core.used integer

Количество баллов, израсходованных в текущем интервале.

rate object

Псевдоним resources.core. В новых клиентах используйте resources.core.
curl --request GET \  --url 'https://api.cursor.com/v1/origin/rate_limit' \  --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN'

Структура ответа:

{  "resources": {    "core": {      "limit": 6000,      "remaining": 5994,      "reset": 1785682800,      "used": 6    }  },  "rate": {    "limit": 6000,    "remaining": 5994,    "reset": 1785682800,    "used": 6  }}

Получить данные аутентифицированного приложения

GET/v1/origin/app
AuthApp JWT

Возвращает метаданные аутентифицированного приложения.

Поля ответа

id строка

Идентификатор приложения Origin, используемый как издатель JWT и идентификатор ключа.

displayName строка

Отображаемое имя приложения.

webhookUrl строка

Зарегистрированный HTTPS-адрес для доставки вебхука приложения.

events массив

Подписки приложения на события вебхуков.

createdAt строка

Временная метка RFC 3339 создания приложения.

updatedAt строка

Временная метка RFC 3339 последнего обновления метаданных приложения.

installationRedirectUris массив

Зарегистрированные URI колбэка для установки; нелокальные URI колбэка должны точно совпадать и использовать HTTPS.

namespaceSlug строка

Слаг пространства имён, которому принадлежит приложение.

description строка

Описание приложения, указанное издателем. Пусто, если не задано.

websiteUrl строка

Сайт издателя. Пусто, если не задано.

defaultScopes массив

Области доступа по умолчанию, предлагаемые при установке приложения, в виде строк каталога областей доступа.
curl --request GET \  --url 'https://api.cursor.com/v1/origin/app' \  --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN'

Структура ответа:

{  "id": "app_01k2ja2000e0080000000000a1",  "displayName": "CI Status Bot",  "webhookUrl": "https://ci.acme.dev/webhooks/origin",  "events": [    "pull_request.created",    "pull_request.merged"  ],  "createdAt": "2026-08-01T09:30:00Z",  "updatedAt": "2026-08-02T14:45:00Z",  "installationRedirectUris": [    "https://ci.acme.dev/origin/setup"  ],  "namespaceSlug": "acme",  "description": "Posts CI status on pull requests.",  "websiteUrl": "https://ci.acme.dev",  "defaultScopes": [    "repository:contents:read",    "repository:pull_requests:read"  ]}

Список установок приложения

GET/v1/origin/app/installations
AuthApp JWT

Возвращает список установок аутентифицированного приложения.

Параметры запроса

pageSize целое число

Максимальное число возвращаемых установок. По умолчанию — 30, если не задано или равно 0. Значения свыше 100 ограничиваются 100.

pageToken строка

Непрозрачный курсор из поля next_page_token предыдущего ответа. Пуст для первой страницы.

Поля ответа

installations массив

Страница установок, принадлежащих аутентифицированному приложению.

installations[].id строка

Идентификатор установки, который приложение хранит и использует для создания токенов доступа установки.

installations[].appId строка

Идентификатор установленного приложения.

installations[].target object

Владелец, выбранный заказчиком для этой установки.

installations[].target.slug строка

URL-слаг владельца, используемый вместе с идентификатором владельца для определения владельца репозитория.

installations[].target.id строка

Идентификатор владельца Origin.

installations[].target.type строка

Тип пространства имён владельца. Только для вывода. Допустимые значения: team, user. Пропускается, если неизвестно.

installations[].createdAt строка

Метка времени создания установки в формате RFC 3339.

installations[].updatedAt строка

Метка времени последнего обновления установки в формате RFC 3339.

installations[].repoSelectionMode строка

Режим предоставления доступа к репозиториям: точно all или selected.

installations[].scopes массив

Области, одобренные для установки.

installations[].installedBy object

Пользователь, который изначально установил приложение, а не тот, кто недавно повторно давал согласие. Только для вывода. Отсутствует, если запись этого пользователя больше нельзя прочитать.

installations[].installedBy.id строка

Публичный идентификатор пользователя с префиксом user_.

installations[].installedBy.email строка

Адрес электронной почты пользователя.

installations[].installedBy.displayName строка

Отображаемое имя пользователя: имя и фамилия аккаунта, объединённые пробелом — то же имя, которое отображает продукт. Пропускается, если у аккаунта нет имени.

installations[].installedBy.handle строка

Идентификатор заявленного профиля пользователя без префикса @. Присутствует только пока этот профиль общедоступен; в противном случае отсутствует.

installations[].suspendedAt строка

Метка времени в формате RFC 3339, задаваемая на период приостановки установки. Пропускается, пока установка активна.

installations[].deletedAt строка

Метка времени удаления установки в формате RFC 3339. Передаётся только в snapshot webhook installation.deleted; удалённая установка больше не разрешается через API, поэтому эта конечная точка её никогда не возвращает.

nextPageToken строка

Непрозрачный курсор для следующей страницы; пустой, если страниц больше нет.
curl --request GET \  --url 'https://api.cursor.com/v1/origin/app/installations' \  --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN'

Структура ответа:

{  "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/v1/origin/app/installations/{installationId}
AuthApp JWT

Возвращает сведения об одной установке для аутентифицированного приложения.

repoSelectionMode имеет значение all или selected.

Параметры пути

installationId строка Обязательно

Идентификатор установки.

Поля ответа

id строка

Идентификатор установки, который приложение сохраняет и использует для выпуска токенов доступа установки.

appId строка

Идентификатор установленного приложения.

target object

Владелец, выбранный клиентом для этой установки.

target.slug строка

Слаг владельца в URL, используемый вместе с идентификатором владельца для идентификации владельца репозитория.

target.id строка

Идентификатор владельца Origin.

target.type строка

Тип пространства имён владельца. Только для вывода. Допустимые значения: team, user. Пропускается, если неизвестно.

createdAt строка

Временная метка создания установки в формате RFC 3339.

updatedAt строка

Временная метка последнего обновления установки в формате RFC 3339.

repoSelectionMode строка

Режим предоставления прав на репозиторий: либо все, либо выбранные.

scopes массив

Области доступа, одобренные для установки.

installedBy object

Пользователь, который изначально установил приложение, а не тот, кто последним повторно подтвердил согласие. Доступно только для вывода. Поле отсутствует, если запись об этом пользователе больше нельзя прочитать.

installedBy.id строка

Публичный идентификатор пользователя с префиксом user_.

installedBy.email строка

Адрес электронной почты пользователя.

installedBy.displayName строка

Отображаемое имя пользователя: имя и фамилия аккаунта, соединённые пробелом — то же имя, которое отображается в продукте. Не указывается, если у аккаунта нет имени.

installedBy.handle строка

Заявленный пользователем идентификатор профиля без префикса @. Указан только пока этот профиль общедоступен; в противном случае отсутствует.

suspendedAt строка

Временная метка в формате RFC 3339, которая задаётся на время приостановки установки. Пропускается, пока установка активна.

deletedAt строка

Временная метка удаления установки в формате RFC 3339. Передаётся только в snapshot webhook installation.deleted; удалённая установка больше не разрешается через API, поэтому эта конечная точка никогда её не возвращает.
curl --request GET \  --url 'https://api.cursor.com/v1/origin/app/installations/INSTALLATION_ID' \  --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN'

Структура ответа:

{  "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"  ]}

Удалить установку приложения

DELETE/v1/origin/app/installations/{installationId}
AuthApp JWT

Удаляет установку, принадлежащую аутентифицированному приложению, и предотвращает выпуск новых токенов установки. Уже выпущенные краткоживущие токены могут оставаться действительными до истечения срока действия (не более 15 минут). Тело ответа пустое.

Параметры пути

installationId строка Обязательно

Уникальный идентификатор удаляемой установки. Передаётся в пути URL; установка должна принадлежать аутентифицированному приложению.

Поля ответа

Успешные запросы не возвращают тело ответа.

curl --request DELETE \  --url 'https://api.cursor.com/v1/origin/app/installations/INSTALLATION_ID' \  --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN'

Ответ:

204 No Content

Создать токен доступа установки

POST/v1/origin/app/installations/{installationId}/access_tokens
AuthApp JWT

Создаёт токен доступа установки для аутентифицированного приложения.

Требуется аутентификация с помощью JWT, подписанного приложением, как в GetAuthenticatedApp. Токен ограничен указанной установкой, которая должна принадлежать аутентифицированному приложению. Вызывающая сторона может ограничить токен подмножеством разрешённых областей доступа установки и доступных репозиториев.

В repositoryIds можно указать зеркальный репозиторий. Полученный токен содержит области доступа установки, а Origin по-прежнему применяет ограничение зеркала к каждому запросу: см. Зеркальные репозитории.

Параметры пути

installationId строка Обязательно

Уникальный идентификатор установки, для которой создаётся токен. Передаётся в пути URL; установка должна принадлежать аутентифицированному приложению.

Тело запроса

scopes массив

Строки областей доступа, предоставляемые токену. Значения должны быть уникальными и входить в разрешённые области доступа установки. Пустое или отсутствующее значение предоставляет все разрешённые области доступа.

repositoryIds массив

Идентификаторы репозиториев, к которым токену предоставляется доступ. Значения должны быть уникальными, доступны для установки и содержать не более 50 элементов. Пустое или отсутствующее значение предоставляет доступ ко всем доступным репозиториям.

Поля ответа

token строка

Краткоживущие учётные данные установки с префиксом oit_.

expiresAt строка

Время истечения срока действия в формате RFC 3339; токен истекает не позднее чем через 15 минут и никогда не действует дольше JWT приложения, использованного для его выпуска.
curl --request POST \  --url 'https://api.cursor.com/v1/origin/app/installations/INSTALLATION_ID/access_tokens' \  --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN' \  --header 'Content-Type: application/json' \  --data '{  "scopes": [    "repository:contents:read",    "repository:pull_requests:read"  ],  "repositoryIds": [    "repo_01k2ja2000e0080000000000q4"  ]}'

Структура ответа:

{  "token": "oit_2v8xkq4m1c7p9t3w5y0z6r4b",  "expiresAt": "2026-08-01T10:30:00Z"}

Список репозиториев установки приложения

GET/v1/origin/installation/repos
AuthInstallation token

Возвращает список репозиториев, доступных аутентифицированной установке приложения.

Требуется токен доступа установки (oit_), выпущенный методом CreateInstallationAccessToken.

Партнёры обнаруживают свои репозитории через эту конечную точку. Элементы списка — это краткие сводки репозиториев; используйте Get Repo для получения полных временных меток. Get Repo включает поле cloneUrl, доступное только для вывода.

Результаты включают зеркалированные репозитории. Зеркало доступно только для чтения, пока не станет стабильным исходящим (outbound) зеркалом: см. Зеркалированные репозитории.

Параметры запроса

pageSize целое число

Максимальное количество возвращаемых репозиториев. По умолчанию — 30, если параметр не задан или равен 0. Значения выше 100 обрезаются до 100.

pageToken строка

Непрозрачный курсор из поля next_page_token предыдущего ответа. Пуст для первой страницы.

Поля ответа

repositories массив

Краткие сводки репозиториев; для полных временных меток используйте get-repository.

repositories[].id строка

Идентификатор исходного репозитория.

repositories[].name строка

Имя репозитория в аккаунте владельца.

repositories[].fullName строка

Полное имя владельца и репозитория, например acme/api.

repositories[].owner object

Ссылка на владельца репозитория.

repositories[].owner.slug строка

Слаг владельца для URL, используемый вместе с идентификатором владельца для определения владельца репозитория.

repositories[].owner.id строка

Идентификатор владельца Origin.

repositories[].owner.type строка

Тип пространства имён владельца. Только для вывода. Допустимые значения: team, user. Пропускается, если неизвестно.

repositories[].defaultBranch строка

Имя ветки по умолчанию репозитория.

repositories[].mirror object

Метаданные зеркала. Отсутствуют для нативного репозитория и до готовности первоначальной синхронизации зеркала.

repositories[].mirror.source строка

Источник зеркалирования. Допустимое значение: github.

repositories[].mirror.sourceId строка

Непрозрачный идентификатор репозитория, назначаемый источником.

repositories[].mirror.status строка

Эффективное направление зеркалирования во время перехода, до завершения переключения. Допустимые значения: inbound, outbound.

repositories[].visibility строка

Видимость репозитория. Допустимые значения: internal, private.

repositories[].allowMergeCommit boolean

Можно ли вливать pull request'ы через merge-коммиты.

repositories[].allowSquashMerge boolean

Можно ли вливать pull request'ы через squash-слияние.

repositories[].deleteBranchOnMerge boolean

Удаляется ли head-ветка автоматически при слиянии.

nextPageToken строка

Непрозрачный курсор для следующей страницы; пустой, если страниц больше нет.

repoSelectionMode строка

Указывает, предоставляет ли установка доступ ко всем репозиториям или только к выбранным.
curl --request GET \  --url 'https://api.cursor.com/v1/origin/installation/repos' \  --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN'

Структура ответа:

{  "repositories": [    {      "id": "repo_01k2ja2000e0080000000000q4",      "name": "rocket",      "fullName": "acme/rocket",      "owner": {        "slug": "acme",        "id": "ns_01k2ja2000e0080000000000p3",        "type": "team"      },      "defaultBranch": "main",      "createdAt": "2026-08-01T09:30:00Z",      "updatedAt": "2026-08-02T14:45:00Z",      "pushedAt": "2026-08-02T14:45:00Z",      "cloneUrl": "https://origin.cursor.com/git/acme/rocket.git"    }  ],  "repoSelectionMode": "selected"}

Список доставок вебхуков

GET/v1/origin/app/webhook/deliveries
AuthApp JWT

Перечисляет доставки вебхуков для аутентифицированного приложения, от новых к старым.

Доставка — это одно событие, предназначенное для одного приложения; её идентификатор — значение заголовка webhook-id, которое видит получатель. delivered=false — предикат восстановления: он выбирает все доставки, которые ни разу не получили ответ 2xx, включая доставки, у которых во время сбоя закончились попытки повторной отправки.

Доставки можно перечислять в течение семи дней после их создания и только пока у вашего приложения есть активная установка в пространстве имён доставки. События жизненного цикла, ориентированные на приложение, такие как installation.deleted, остаются видимыми после удаления установки, которое они описывают.

Параметры запроса

delivered логический

Сравнивается с delivered_at. delivered=false — предикат восстановления: он вычисляется на стороне сервера, поэтому не может пропустить доставку, у которой во время сбоя исчерпалась лестница повторных попыток, как это может произойти с заданным вызывающей стороной временным окном.

eventType строка

Точный тип события, например pull_request.created.

installationId строка

Ограничить выборку одной установкой (WebhookDelivery.installation.id).

createdAfter строка

Задаёт границу времени создания доставки. Для просмотра, не для восстановления.

createdBefore строка

pageSize целое число

По умолчанию 30, если не задано или равно 0. Значения выше 100 ограничиваются до 100.

pageToken строка

Непрозрачный курсор из next_page_token предыдущего ответа. Пуст для первой страницы.

Поля ответа

deliveries массив

Доставки веб-хуков для аутентифицированного приложения, упорядоченные от новых к старым. Идентификатор каждой доставки — webhook-id, который видит получатель.

deliveries[].id строка

Стабильный идентификатор доставки и значение webhook-id, которое видит получатель; используйте его как ключ идемпотентности.

deliveries[].event object

Событие, которое несет эта доставка.

deliveries[].event.id строка

Идентификатор события Origin-источника. Он также может присутствовать вместе со стабильным идентификатором доставки, но не является ключом идемпотентности.

deliveries[].event.type строка

Слаг события, передаваемый доставкой для маршрутизации.

deliveries[].installation object

Установка, которой принадлежит эта доставка. id — текущая активная установка для целевого владельца; не задано, если такой нет (возможно только для событий жизненного цикла, ориентированных на приложение, после деинсталляции).

deliveries[].installation.id строка

Идентификатор установки, связанный с элементом списка доставок веб-хука.

deliveries[].installation.target object

Владелец, на которого направлена установка.

deliveries[].installation.target.slug строка

Слаг владельца в URL, используемый вместе с идентификатором владельца для определения владельца репозитория.

deliveries[].installation.target.id строка

Идентификатор владельца Origin.

deliveries[].installation.target.type строка

Тип пространства имён владельца. Только для вывода. Допустимые значения: team, user. Пропускается, если неизвестно.

deliveries[].createdAt строка

Временная метка создания доставки, используемая фильтрами просмотра createdAfter и createdBefore.

deliveries[].deliveredAt строка

Отсутствие соответствует delivered=false: получатель никогда не подтверждал эту доставку ответом 2xx.

deliveries[].lastAttempt object

Последняя попытка HTTP, если таковая имелась: код состояния ответа, задержка, ошибка транспорта, триггер и время.

deliveries[].lastAttempt.id строка

Идентификатор попытки доставки вебхука.

deliveries[].lastAttempt.deliveryId строка

Постоянный идентификатор доставки, связанный с этой попыткой.

deliveries[].lastAttempt.trigger строка

Причина отправки этой попытки доставки. Допустимые значения: automatic, manual.

deliveries[].lastAttempt.responseStatusCode целое число

Не задано, если POST не вернул HTTP‑ответ (ошибка транспорта, тайм-аут).

deliveries[].lastAttempt.latencyMs целое число

Задержка попытки доставки в миллисекундах.

deliveries[].lastAttempt.errorMessage строка

Детали ошибки транспортного уровня, когда HTTP-ответ отсутствовал; в противном случае — пусто.

deliveries[].lastAttempt.attemptedAt строка

Временная метка RFC 3339 для этой попытки доставки.

nextPageToken строка

Непрозрачный курсор для следующей страницы; пустой, если страниц больше нет.
curl --request GET \  --url 'https://api.cursor.com/v1/origin/app/webhook/deliveries' \  --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN'

Структура ответа:

{  "deliveries": [    {      "id": "whd_01k2ja2000e0080000000000j9",      "event": {        "id": "evt_01k2ja2000e0080000000000r5",        "type": "pull_request.created"      },      "installation": {        "id": "inst_01k2ja2000e0080000000000b2",        "target": {          "slug": "acme",          "id": "ns_01k2ja2000e0080000000000p3",          "type": "team"        }      },      "createdAt": "2026-08-01T09:30:00Z",      "deliveredAt": "2026-08-02T14:45:05Z",      "lastAttempt": {        "id": "wha_01k2ja2000e0080000000000k0",        "deliveryId": "whd_01k2ja2000e0080000000000j9",        "trigger": "automatic",        "responseStatusCode": 200,        "latencyMs": 182,        "attemptedAt": "2026-08-02T14:45:05Z"      }    }  ]}

Пакетная повторная доставка вебхука

POST/v1/origin/app/webhook/deliveries:batchRedeliver
AuthApp JWT

Запрашивает у Origin повторную отправку доставок.

Запрос означает «обеспечить отправку каждой из них», а не «добавить ещё одну отправку». Он возвращает по одному результату для каждого уникального входного значения, а не завершает весь пакет ошибкой из-за некорректной записи, поэтому один просроченный ID не может заблокировать остальную страницу восстановления. 202 означает, что отправки поставлены в очередь; сама доставка выполняется асинхронно, поэтому отслеживайте результаты через Список доставок вебхука.

Тело запроса

deliveryIds массив Обязательно

Доставки для повторной отправки. Не более 100 уникальных записей — это соответствует максимальному значению pageSize в Список доставок вебхука. Дубликаты удаляются с сохранением порядка первого появления. Пустой список или более 100 уникальных записей возвращает InvalidArgument (HTTP 400).

Поля ответа

results массив

Принятые результаты асинхронной повторной отправки — по одному для каждого уникального идентификатора доставки — со статусом queued, already_in_flight или not_found.

results[].deliveryId строка

Запрошенный стабильный идентификатор доставки, соответствующий этому результату пакета.

results[].outcome строка

Статус повторной отправки: queued, когда создана отправка; already_in_flight, когда отправка уже выполняется; и not_found в остальных случаях. already_in_flight означает успех, а не ошибку. not_found охватывает неизвестные ID, ID старше семидневного срока хранения и пространства имён, в которых ваше приложение больше не установлено.
curl --request POST \  --url 'https://api.cursor.com/v1/origin/app/webhook/deliveries:batchRedeliver' \  --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN' \  --header 'Content-Type: application/json' \  --data '{  "deliveryIds": [    "whd_01k2ja2000e0080000000000j9"  ]}'

Структура ответа:

{  "results": [    {      "deliveryId": "whd_01k2ja2000e0080000000000j9",      "outcome": "queued"    }  ]}

Ping вебхук

POST/v1/origin/app/webhook/pings
AuthApp JWT

Отправляет тестовую доставку на URL вебхука аутентифицированного приложения и сообщает, какой ответ вернул получатель.

Используйте для проверки получателя при настройке приложения, не дожидаясь реального события. Требуется аутентификация с помощью JWT, подписанного приложением, как для Получить данные аутентифицированного приложения.

Получатель видит формат продакшена: те же заголовки и подпись v1ed, которую можно проверить с помощью ключей подписи, значение webhook-event-typeping, а полезная нагрузка содержит имя приложения. Ping не относится ни к одной установке, поэтому заголовок webhook-installation-id и поле installationId в обёртке отсутствуют.

Origin отправляет ping один раз синхронно и сообщает результат в ответе. Повторных попыток нет, и ping не является доменным событием: он никогда не появляется в Списке доставок вебхука и не может быть отправлен повторно. Сбой на стороне получателя указывается в ответе, а не возвращается как ошибка. Для приложения без настроенного URL вебхука возвращается FailedPrecondition (HTTP 400).

Тело запроса

Запрос не принимает полей. Отправьте пустой JSON-объект.

Поля ответа

deliveryId строка

webhook-id тестовой доставки, совпадающий с заголовком, который получил получатель.

eventId строка

Идентификатор события в подписанной обёртке; совпадает со значением event.id.

delivered boolean

true, если получатель ответил со статусом 2xx до истечения тайм-аута доставки. Поле присутствует всегда.

responseStatusCode integer

Код состояния HTTP ответа получателя или 0, если ответ не пришёл из-за сбоя подключения или истечения тайм-аута. Поле присутствует всегда.
curl --request POST \  --url 'https://api.cursor.com/v1/origin/app/webhook/pings' \  --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN' \  --header 'Content-Type: application/json' \  --data '{}'

Структура ответа:

{  "deliveryId": "whd_01k2ja2000e0080000000000j9",  "eventId": "evt_01k2ja2000e0080000000000r5",  "delivered": true,  "responseStatusCode": 200}

Получить приложение

GET/v1/origin/apps/{appId}
Scopeapp:settings:readAuthUser access token

Возвращает одно приложение по его идентификатору. Это операция чтения для управления, предназначенная для издателей приложения; Получить данные аутентифицированного приложения — аналогичная операция чтения собственных данных по JWT-credential самого приложения.

Path Parameters

appId string обязательный

Идентификатор приложения с prefix app_.

Response Fields

id string

Глобально уникальный идентификатор приложения с prefix app_.

displayName string

Название приложения, отображаемое пользователям.

webhookUrl string

Зарегистрированный HTTPS URL, на который приходят webhook-доставки приложения. Пустое значение, если приложение не получает доставок.

events array

Подписки на webhook-события, настроенные для приложения.

createdAt string

Timestamp создания приложения в формате RFC 3339.

updatedAt string

Timestamp последнего обновления metadata приложения в формате RFC 3339.

installationRedirectUris array

Allowlist callback-адресов установки OAuth: redirect URI, на которые может вернуться установка, инициированная приложением; сверяются точно во время авторизации.

namespaceSlug string

Слаг пространства имён, которому принадлежит приложение.

description string

Описание приложения, указанное издателем. Пустое, если не задано.

websiteUrl string

Сайт издателя. Пустое, если не задано.

defaultScopes array

Области доступа по умолчанию, предлагаемые при установке приложения, в виде строк из каталога областей доступа.
curl --request GET \  --url 'https://api.cursor.com/v1/origin/apps/{appId}' \  --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN'

Структура ответа:

{  "id": "app_01k2ja2000e0080000000000a1",  "displayName": "CI Status Bot",  "webhookUrl": "https://ci.acme.dev/webhooks/origin",  "events": [    "pull_request.created",    "pull_request.merged"  ],  "createdAt": "2026-08-01T09:30:00Z",  "updatedAt": "2026-08-02T14:45:00Z",  "installationRedirectUris": [    "https://ci.acme.dev/origin/setup"  ],  "namespaceSlug": "acme",  "description": "Posts CI status on pull requests.",  "websiteUrl": "https://ci.acme.dev",  "defaultScopes": [    "repository:contents:read",    "repository:pull_requests:read"  ]}

Обновление приложения

PATCH/v1/origin/apps/{appId}
Scopeapp:settings:writeAuthUser access token

Обновляет настройки приложения. Пропущенные поля остаются без изменений; необходимо передать хотя бы одно изменяемое поле. Сброс webhookUrl с помощью пустой строки отключает исходящую доставку webhook и отменяет ожидающие доставки приложения; если задать URL снова, отменённые доставки не возобновятся.

Параметры пути

appId строка Обязательный

Идентификатор приложения с префиксом app_.

Тело запроса

displayName строка

Новое отображаемое имя app. Если указано, не должно быть пустым.

webhookUrl строка

Новый URL для доставки исходящих webhook — абсолютный HTTPS-адрес. Пустая строка отключает доставку webhook и отменяет ожидающие доставки приложения.

events object

Полная замена подписок на webhook-события. Опустите, чтобы оставить их без изменений.

events.events array

Полный новый набор подписок приложения на события webhook. Пустой список сбрасывает их.

description строка

Новое описание app. Опустите, чтобы оставить без изменений; пустая строка сбрасывает его.

websiteUrl строка

Новый сайт издателя. Не указывайте, чтобы оставить без изменений; пустая строка сбрасывает значение.

installationRedirectUris object

Полная замена allowlist для callback установки OAuth. Не указывайте, чтобы оставить без изменений.

installationRedirectUris.installationRedirectUris массив

Новый allowlist целиком. Пустой список сбрасывает его.

defaultScopes object

Полная замена областей доступа приложения, используемых при установке по умолчанию. Опустите, чтобы оставить их без изменений.

defaultScopes.scopes массив

Полный новый набор областей доступа для установки по умолчанию. Пустой список сбрасывает их.

Поля ответа

id строка

Глобально уникальный идентификатор приложения с префиксом app_.

displayName строка

Название приложения, отображаемое пользователям.

webhookUrl строка

Зарегистрированный HTTPS-URL, на который отправляются доставки вебхуков приложения. Пусто, если приложение не получает доставок.

events array

Подписки на webhook event, настроенные для app.

createdAt строка

Временная метка создания app в формате RFC 3339.

updatedAt строка

Временная метка в формате RFC 3339 для последнего обновления метаданных приложения.

installationRedirectUris массив

Список разрешённых OAuth-колбэков установки: URI перенаправления, на которые может вернуться установка, инициированная приложением; сверяются точно при авторизации.

namespaceSlug строка

Слаг пространства имён, которому принадлежит app.

description строка

Описание app, предоставленное publisher. Пустое, если не задано.

websiteUrl строка

Сайт издателя. Пустое значение, если не задан.

defaultScopes массив

Области доступа по умолчанию, предлагаемые при установке приложения, в виде строк областей доступа из каталога.
curl --request PATCH \  --url 'https://api.cursor.com/v1/origin/apps/APP_ID' \  --header 'Authorization: Bearer YOUR_ORIGIN_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"    ]  }}'

Структура ответа:

{  "id": "app_01k2ja2000e0080000000000a1",  "displayName": "CI Status Bot",  "webhookUrl": "https://ci.acme.dev/webhooks/origin-v2",  "events": [    "pull_request.created",    "pull_request.merged",    "repository.pushed"  ],  "createdAt": "2026-08-01T09:30:00Z",  "updatedAt": "2026-08-02T14:45:00Z",  "installationRedirectUris": [    "https://ci.acme.dev/origin/setup"  ],  "namespaceSlug": "acme",  "description": "Posts CI status on pull requests.",  "websiteUrl": "https://ci.acme.dev",  "defaultScopes": [    "repository:contents:read",    "repository:pull_requests:read"  ]}

Добавление ключа подписи приложения

POST/v1/origin/apps/{appId}/signing_keys
Scopeapp:settings:writeAuthUser access token

Добавляет ключ подписи в приложение. У приложения может быть лишь ограниченное количество активных ключей подписи; при попытке добавить ключ сверх лимита возвращается FailedPrecondition (HTTP 400) — до тех пор, пока не будет отозван другой ключ. Для уже зарегистрированного ключа возвращается AlreadyExists (HTTP 409 Conflict).

параметры пути

appId строка обязательный

Идентификатор приложения с префиксом app_.

тело запроса

publicKey строка обязательный

Открытый ключ Ed25519 в формате PEM SPKI, добавляемый в набор ключей подписи приложения.

поля ответа

kid строка

Идентификатор ключа: SHA-256-дайджест DER-кодировки SPKI ключа в формате base64url. Используйте его в качестве заголовка JWT kid и для отзыва ключа.

createdAt строка

Временная метка регистрации ключа в формате RFC 3339.
curl --request POST \  --url 'https://api.cursor.com/v1/origin/apps/APP_ID/signing_keys' \  --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN' \  --header 'Content-Type: application/json' \  --data '{  "publicKey": "-----BEGIN PUBLIC KEY-----\nMCowBQYDK2VwAyEAq9zTf3hL6wXe1cVj0bYs5mKR8uDnG2oAaPp4NiEkKlM=\n-----END PUBLIC KEY-----"}'

Структура ответа:

{  "kid": "3q2xW9dK5fJm8vB1nY6cT0aZrQpLh4eGkVsN7uMxOdI",  "createdAt": "2026-08-02T14:45:00Z"}

Отзыв ключа подписи приложения

DELETE/v1/origin/apps/{appId}/signing_keys/{kid}
Scopeapp:settings:writeAuthUser access token

Отзывает ключ подписи приложения по его key ID. App JWT, подписанные отозванным ключом, перестают проходить аутентификацию. Последний активный ключ подписи отозвать нельзя — такой запрос возвращает FailedPrecondition (HTTP 400). Тело ответа пустое.

параметры пути

appId строка обязательный

Идентификатор приложения с префиксом app_.

kid строка обязательный

Key ID отзываемого ключа подписи.

поля ответа

При успешном запросе тело ответа отсутствует.

curl --request DELETE \  --url 'https://api.cursor.com/v1/origin/apps/{appId}/signing_keys/{kid}' \  --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN'

Response:

204 No Content

Список приложений пространства имён

GET/v1/origin/namespaces/{namespaceSlug}/apps
Scopenamespace:apps:readAuthUser access token

Возвращает список приложений, принадлежащих пространству имён, начиная с самых новых. В ответах передаются только метаданные для отображения; чтобы получить конфигурацию вебхука конкретного приложения, используйте Get App.

параметры пути

namespaceSlug строка обязательный

Слаг пространства имён, приложения которого нужно перечислить.

Query Parameters

pageSize integer

Максимальное количество возвращаемых приложений. По умолчанию 30, если значение не задано или равно 0. Значения больше 100 ограничиваются до 100.

pageToken строка

Непрозрачный курсор из поля next_page_token предыдущего ответа. Для первой страницы — пустая строка.

поля ответа

apps массив

Страница приложений, принадлежащих пространству имён.

apps[].id строка

Глобально уникальный идентификатор приложения с префиксом app_.

apps[].displayName строка

Название приложения, отображаемое пользователям.

apps[].description строка

Описание, указанное publisher. Пустая строка, если не задано.

nextPageToken строка

Непрозрачный курсор для следующей страницы; пустая строка, если страниц больше нет.
curl --request GET \  --url 'https://api.cursor.com/v1/origin/namespaces/{namespaceSlug}/apps' \  --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN'

Структура ответа:

{  "apps": [    {      "id": "app_01k2ja2000e0080000000000a1",      "displayName": "CI Status Bot",      "description": "Posts CI status on pull requests."    },    {      "id": "app_01k2ja2000e0080000000000a2",      "displayName": "Deploy Bot",      "description": ""    }  ],  "nextPageToken": ""}

Создать приложение

POST/v1/origin/namespaces/{namespaceSlug}/apps
Scopenamespace:apps:createAuthUser access token

Создаёт приложение, принадлежащее пространству имён. Приложения создаются приватными. Сгенерируйте пару ключей Ed25519 локально и отправьте только открытый ключ; Origin сохраняет его для проверки JWT приложения. Некорректные URL вебхуков, типы событий, URI перенаправления или области действия приводят к возврату InvalidArgument (HTTP 400).

Параметры пути

namespaceSlug строка Обязательный

Слаг пространства имён, которому будет принадлежать app.

Тело запроса

displayName строка Обязательный

Отображаемое пользователям название app. Не может быть пустым.

publicKey строка Обязательный

Открытый ключ Ed25519 в формате PEM SPKI для пары ключей подписи приложения. См. Создание ключа подписи приложения.

webhookUrl строка

URL для исходящей доставки вебхуков, абсолютный HTTPS-адрес. Пустое значение означает, что приложение не получает доставок вебхуков.

events array

Подписки на события webhook — в виде слагов событий из раздела Events. Неизвестные типы событий отклоняются.

description строка

Краткое описание приложения.

websiteUrl строка

Сайт publisher, абсолютный HTTPS URL.

installationRedirectUris массив

Список разрешённых callback-адресов установки OAuth: абсолютные HTTPS-URI без фрагмента, которые сверяются точно при авторизации.

defaultScopes массив

Области доступа по умолчанию, предлагаемые при установке приложения, в виде строк областей доступа из каталога, например repository:contents:read. При установке области доступа по-прежнему можно указать явно.

Поля ответа

id строка

Глобально уникальный идентификатор приложения с префиксом app_.

displayName строка

Отображаемое пользователям название app.

webhookUrl строка

Зарегистрированный HTTPS URL, на который приходят доставки вебхуков приложения. Пусто, если приложение не получает доставок.

events array

Подписки на webhook events, настроенные для app.

createdAt строка

timestamp создания app в формате RFC 3339.

updatedAt строка

Временная метка в формате RFC 3339 для последнего обновления метаданных приложения.

installationRedirectUris массив

Allowlist callback-адресов установки OAuth: URI перенаправления, на которые может вернуться установка, инициированная приложением; сверяются точно при авторизации.

namespaceSlug строка

Слаг пространства имён, которому принадлежит приложение.

description строка

Описание приложения, указанное издателем. Пустое, если не задано.

websiteUrl строка

Сайт publisher. Пусто, если не задано.

defaultScopes массив

Области доступа по умолчанию, предлагаемые при установке приложения, в виде строк областей доступа из каталога.
curl --request POST \  --url 'https://api.cursor.com/v1/origin/namespaces/NAMESPACE_SLUG/apps' \  --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN' \  --header 'Content-Type: application/json' \  --data '{  "displayName": "CI Status Bot",  "publicKey": "-----BEGIN PUBLIC KEY-----\nMCowBQYDK2VwAyEAv7wFoV1bC9yKq3nZ8dQmXh5uJb2tR4sEwG6aP0iN8kY=\n-----END PUBLIC KEY-----",  "webhookUrl": "https://ci.acme.dev/webhooks/origin",  "events": [    "pull_request.created",    "pull_request.merged"  ],  "description": "Posts CI status on pull requests.",  "websiteUrl": "https://ci.acme.dev",  "installationRedirectUris": [    "https://ci.acme.dev/origin/setup"  ],  "defaultScopes": [    "repository:contents:read",    "repository:pull_requests:read"  ]}'

Структура ответа:

{  "id": "app_01k2ja2000e0080000000000a1",  "displayName": "CI Status Bot",  "webhookUrl": "https://ci.acme.dev/webhooks/origin",  "events": [    "pull_request.created",    "pull_request.merged"  ],  "createdAt": "2026-08-01T09:30:00Z",  "updatedAt": "2026-08-01T09:30:00Z",  "installationRedirectUris": [    "https://ci.acme.dev/origin/setup"  ],  "namespaceSlug": "acme",  "description": "Posts CI status on pull requests.",  "websiteUrl": "https://ci.acme.dev",  "defaultScopes": [    "repository:contents:read",    "repository:pull_requests:read"  ]}

Репозитории

cloneUrl — URL для клонирования по HTTPS, доступный только для вывода. Получить репозиторий включает cloneUrl.

Партнёры находят свои репозитории через Список репозиториев установки приложения. Получение списка репозиториев в пространстве имён и их создание не входят в Partner API.

Список репозиториев

GET/v1/origin/repos/{ownerSlug}
Scopenamespace:repositories:readAuthUser access token

Возвращает список репозиториев, принадлежащих сущности-владельцу.

Параметры пути

ownerSlug строка Обязательно

Слаг родительской сущности-владельца.

Параметры запроса

pageSize целое число

Максимальное количество возвращаемых репозиториев. По умолчанию — 30, если не задано или равно 0. Значения больше 100 ограничиваются 100.

pageToken строка

Непрозрачный курсор из next_page_token предыдущего ответа. Пуст для первой страницы.

filter строка

Необязательный регистронезависимый фильтр по подстроке.

Поля ответа

repositories массив

Репозитории, принадлежащие запрошенному владельцу.

repositories[].id строка

Идентификатор исходного репозитория.

repositories[].name строка

Имя репозитория в рамках его владельца.

repositories[].fullName строка

Полное имя владельца и репозитория, например acme/api.

repositories[].owner object

Ссылка на владельца репозитория.

repositories[].owner.slug строка

Слаг владельца для URL, используемый вместе с идентификатором владельца для определения владельца репозитория.

repositories[].owner.id строка

Идентификатор владельца Origin.

repositories[].owner.type строка

Тип пространства имён владельца. Только для вывода. Допустимые значения: team, user. Пропускается, если неизвестно.

repositories[].defaultBranch строка

Имя ветки репозитория по умолчанию.

repositories[].createdAt строка

Метка времени создания репозитория в формате RFC 3339.

repositories[].updatedAt строка

Метка времени обновления репозитория в формате RFC 3339.

repositories[].pushedAt строка

Метка времени RFC 3339 для самого недавнего push, показанная в полном ответе репозитория.

repositories[].cloneUrl строка

URL для клонирования по HTTPS только для вывода; он включён в ответ get-repository.

repositories[].mirror объект

Метаданные зеркала. Отсутствуют для нативного репозитория и до завершения первоначальной синхронизации зеркала.

repositories[].mirror.source строка

Источник зеркалирования. Допустимое значение: github.

repositories[].mirror.sourceId строка

Непрозрачный идентификатор репозитория, присваиваемый источником.

repositories[].mirror.status строка

Эффективное направление зеркалирования во время перехода, до завершения переключения. Допустимые значения: inbound, outbound.

repositories[].visibility строка

Видимость репозитория. Допустимые значения: internal, private.

repositories[].allowMergeCommit логическое значение

Можно ли вливать pull request'ы в виде merge-коммитов.

repositories[].allowSquashMerge boolean

Можно ли вливать pull request'ы через squash-мерж.

repositories[].deleteBranchOnMerge логическое значение

Удаляется ли head-ветка автоматически при слиянии.

nextPageToken строка

Непрозрачный курсор для следующей страницы; пустой, когда страниц больше нет.
curl --request GET \  --url 'https://api.cursor.com/v1/origin/repos/OWNER_SLUG' \  --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN'

Структура ответа:

{  "repositories": [    {      "id": "repo_01k2ja2000e0080000000000q4",      "name": "rocket",      "fullName": "acme/rocket",      "owner": {        "slug": "acme",        "id": "ns_01k2ja2000e0080000000000p3",        "type": "team"      },      "defaultBranch": "main",      "createdAt": "2026-08-01T09:30:00Z",      "updatedAt": "2026-08-02T14:45:00Z",      "pushedAt": "2026-08-02T14:45:00Z",      "cloneUrl": "https://origin.cursor.com/git/acme/rocket.git"    }  ]}

Получить репозиторий

GET/v1/origin/repos/{ownerSlug}/{repoName}
Scoperepository:metadata:readAuthInstallation tokenUser access token

Возвращает один репозиторий по его идентификатору (owner_id, name).

cloneUrl — это URL для клонирования по HTTPS, доступный только для вывода. Операция «Получить репозиторий» включает cloneUrl.

Параметры пути

ownerSlug строка Обязательно

Уникальный слаг сущности-владельца.

repoName строка Обязательно

Имя репозитория, уникальное для сущности-владельца.

Поля ответа

id строка

Идентификатор исходного репозитория.

name строка

Имя репозитория в пределах владельца.

fullName строка

Полное имя, состоящее из имени владельца и репозитория, например acme/api.

owner object

Ссылка на владельца репозитория.

owner.slug строка

Слаг владельца в URL, используемый вместе с идентификатором владельца для идентификации владельца репозитория.

owner.id строка

Идентификатор владельца Origin.

owner.type строка

Тип пространства имён владельца. Только для чтения. Допустимые значения: team, user. Пропускается, если неизвестно.

defaultBranch строка

Имя ветки репозитория по умолчанию.

createdAt строка

Метка времени создания репозитория в формате RFC 3339.

updatedAt строка

Метка времени обновления репозитория в формате RFC 3339.

pushedAt строка

Метка времени RFC 3339 самого последнего push, показанная в полном ответе репозитория.

cloneUrl строка

URL для клонирования по HTTPS только для вывода; ответ get-repository включает его.

mirror object

Метаданные зеркала. Отсутствуют для нативного репозитория и до готовности начальной синхронизации зеркала.

mirror.source строка

Источник зеркалирования. Допустимое значение: github.

mirror.sourceId строка

Непрозрачный идентификатор репозитория, присвоенный источником.

mirror.status строка

Текущее направление зеркалирования во время перехода, до завершения переключения. Допустимые значения: inbound, outbound.

visibility строка

Видимость репозитория. Допустимые значения: internal, private.

allowMergeCommit boolean

Можно ли вливать pull request'ы через merge-коммиты.

allowSquashMerge boolean

Можно ли вливать pull request'ы через squash-merge.

deleteBranchOnMerge логическое значение

Удаляется ли head-ветка автоматически при merge.
curl --request GET \  --url 'https://api.cursor.com/v1/origin/repos/OWNER_SLUG/REPO_NAME' \  --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN'

Структура ответа:

{  "id": "repo_01k2ja2000e0080000000000q4",  "name": "rocket",  "fullName": "acme/rocket",  "owner": {    "slug": "acme",    "id": "ns_01k2ja2000e0080000000000p3",    "type": "team"  },  "defaultBranch": "main",  "createdAt": "2026-08-01T09:30:00Z",  "updatedAt": "2026-08-02T14:45:00Z",  "pushedAt": "2026-08-02T14:45:00Z",  "cloneUrl": "https://origin.cursor.com/git/acme/rocket.git"}

Update Repo

PATCH/v1/origin/repos/{ownerSlug}/{repoName}
Scoperepository:settings:writeAuthInstallation tokenUser access token

Обновляет настройки репозитория. Неуказанные поля остаются без изменений; необходимо указать хотя бы одно поле, доступное для задания.

Настройки применяются независимыми группами в фиксированном порядке: ветка по умолчанию, автоматическое удаление head-ветки, видимость, затем методы слияния. Обновление неатомарно для разных групп. Если группа отклонена, все предшествующие ей группы уже применены и остаются применёнными. Исправьте отклонённую группу и повторите попытку, чтобы получить запрошенное состояние. Ответ содержит репозиторий в состоянии после применения последней группы.

Запрос, в котором не задано ни одного поля, возвращает InvalidArgument (HTTP 400). Параллельное изменение ветки по умолчанию возвращает 409 Conflict.

Параметры пути

ownerSlug string Обязательный

Уникальный слаг сущности-владельца.

repoName string Обязательный

Имя репозитория, уникальное для сущности-владельца.

Тело запроса

defaultBranch string

Новая ветка по умолчанию. Должна называться именем существующей ветки. Поддерживается только для репозиториев, которые не выполняют pull из вышестоящего источника и не выполняют push в него; для остальных репозиториев возвращается FailedPrecondition (HTTP 400).

allowMergeCommit boolean

Могут ли pull request'ы вливаться merge-коммитами. Должно передаваться вместе с allowSquashMerge, при этом хотя бы одно из двух значений должно быть true. Если передать одно без другого, вернётся InvalidArgument (HTTP 400).

allowSquashMerge boolean

Определяет, можно ли выполнять слияние pull request'ов методом squash. Параметр должен отправляться вместе с allowMergeCommit, и по крайней мере один из этих двух должен быть true. Отправка одного без другого возвращает InvalidArgument (HTTP 400).

deleteBranchOnMerge boolean

Удаляется ли head-ветка автоматически после merge. Поддерживается только для репозиториев, pull request которых размещены в этом API; репозиторий, подтягивающий изменения из upstream-источника, возвращает FailedPrecondition (HTTP 400).

visibility string

Новый уровень видимости репозитория. Допустимые значения: internal, private. Не указывайте его, чтобы оставить видимость без изменений.

Поля ответа

id строка

Идентификатор репозитория Origin.

name строка

Название репозитория у его владельца.

fullName строка

Имя владельца и репозитория вместе, например acme/api.

owner object

Ссылка на владельца репозитория.

owner.slug string

Слаг владельца для URL, который используется вместе с ID владельца для идентификации владельца репозитория.

owner.id string

Идентификатор владельца в Origin.

owner.type string

Тип пространства имён владельца. Доступно только для вывода. Допустимые значения: team, user. Опускается, если тип неизвестен.

defaultBranch string

Название ветки репозитория по умолчанию.

createdAt string

Метка времени создания репозитория в формате RFC 3339.

updatedAt string

Временная метка обновления репозитория в формате RFC 3339.

pushedAt string

Метка времени RFC 3339 для самого последнего push, показанного в полном ответе репозитория.

cloneUrl string

URL клонирования по HTTPS только для вывода; он включён в ответ get-repository.

mirror object

Метаданные mirror. Absent для native repository, а также до того, как будет готова первичная sync для mirror.

mirror.source строка

Источник зеркала. Допустимое значение: github.

mirror.sourceId string

Непрозрачный идентификатор репозитория, присвоенный источником.

mirror.status строка

Действующее направление зеркалирования на время перехода, пока не завершится переключение. Допустимые значения: inbound, outbound.

visibility string

Видимость репозитория. Допустимые значения: internal, private.

allowMergeCommit boolean

Можно ли вливать pull request'ы merge-коммитами.

allowSquashMerge boolean

Можно ли вливать pull request’ы через squash merge.

deleteBranchOnMerge boolean

Удаляется ли основная ветка автоматически при слиянии.
curl --request PATCH \  --url 'https://api.cursor.com/v1/origin/repos/OWNER_SLUG/REPO_NAME' \  --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN' \  --header 'Content-Type: application/json' \  --data '{  "defaultBranch": "main",  "allowMergeCommit": false,  "allowSquashMerge": true,  "deleteBranchOnMerge": true,  "visibility": "private"}'

Структура ответа:

{  "id": "repo_01k2ja2000e0080000000000q4",  "name": "rocket",  "fullName": "acme/rocket",  "owner": {    "slug": "acme",    "id": "ns_01k2ja2000e0080000000000p3",    "type": "team"  },  "defaultBranch": "main",  "createdAt": "2026-08-01T09:30:00Z",  "updatedAt": "2026-08-02T14:45:00Z",  "pushedAt": "2026-08-02T14:45:00Z",  "cloneUrl": "https://origin.cursor.com/git/acme/rocket.git",  "visibility": "private",  "allowMergeCommit": false,  "allowSquashMerge": true,  "deleteBranchOnMerge": true}

Создать репозиторий

POST/v1/origin/repos/{ownerSlug}
Scopenamespace:repositories:createAuthUser access token

Создаёт репозиторий, принадлежащий владельцу.

На момент запроса владелец должен иметь право записывать в Origin. Владелец‑пользователь должен иметь тарифный план Pro, Pro Student, Pro+, Ultra или Start. Владелец‑команда должен иметь активный платный командный тарифный план, не находиться в Privacy Mode (Legacy) и не иметь Origin отключённым администратором команды. Для неподходящего владельца возвращается FailedPrecondition (HTTP 400). Чтение существующих репозиториев это требование не затрагивает.

Имена репозиториев занимаются без учёта регистра. Имя, которое отличается от уже существующего у владельца репозитория только регистром, будет отклонено, поэтому widgets и Widgets не могут существовать в одном пространстве имён. Переданное вами имя хранится в том виде, в котором вы его отправили.

Первый push в новый репозиторий может переназначить его ветку по умолчанию. Если этот push только создаёт ветки и ни одна из них не совпадает с сохранённой веткой по умолчанию репозитория, Origin устанавливает ветку по умолчанию на созданную ветку, либо на main или master, если push создаёт несколько веток и одно из этих имён присутствует среди них. В остальных случаях ветка по умолчанию остаётся без изменений. Текущее значение можно узнать через Получить репозиторий.

Параметры пути

ownerSlug строка Обязательно

Слаг родительской сущности-владельца.

Тело запроса

name строка Обязательно

Имя репозитория, уникальное для его владельца. Обязательно при создании.

defaultBranch строка

Имя ветки по умолчанию. Всегда присутствует в ответах. При создании, если не указать это поле или оставить его пустым, по умолчанию используется "main".

Поля ответа

id строка

Идентификатор исходного репозитория.

name строка

Имя репозитория у его владельца.

fullName строка

Полное имя владельца и репозитория, например acme/api.

owner object

Ссылка на владельца репозитория.

owner.slug строка

Слаг владельца в URL, используемый вместе с идентификатором владельца для определения владельца репозитория.

owner.id строка

Идентификатор владельца Origin.

owner.type строка

Тип пространства имён владельца. Только для вывода. Допустимые значения: team, user. Пропускается, если неизвестно.

defaultBranch строка

Имя ветки репозитория по умолчанию.

createdAt строка

Метка времени создания репозитория в формате RFC 3339.

updatedAt строка

Метка времени обновления репозитория в формате RFC 3339.

pushedAt строка

Отметка времени в формате RFC 3339 для самого недавнего push, показанного в полном ответе репозитория.

cloneUrl строка

URL для клонирования по HTTPS только для вывода; включён в ответ get-repository.

mirror object

Метаданные зеркала. Отсутствуют для нативного репозитория и до того, как будет готова начальная синхронизация зеркала.

mirror.source строка

Источник зеркалирования. Допустимое значение: github.

mirror.sourceId строка

Непрозрачный идентификатор репозитория, присвоенный источником.

mirror.status строка

Эффективное направление зеркалирования во время перехода, до завершения переключения. Допустимые значения: inbound, outbound.

visibility строка

Видимость репозитория. Допустимые значения: internal, private.

allowMergeCommit логическое значение

Можно ли объединять pull request'ы с помощью merge-коммитов.

allowSquashMerge логическое значение

Можно ли выполнять слияние pull request'ов методом squash merge.

deleteBranchOnMerge логическое

Удаляется ли ветка-источник автоматически при слиянии.
curl --request POST \  --url 'https://api.cursor.com/v1/origin/repos/OWNER_SLUG' \  --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN' \  --header 'Content-Type: application/json' \  --data '{  "name": "rocket",  "defaultBranch": "main"}'

Структура ответа:

{  "id": "repo_01k2ja2000e0080000000000q4",  "name": "rocket",  "fullName": "acme/rocket",  "owner": {    "slug": "acme",    "id": "ns_01k2ja2000e0080000000000p3",    "type": "team"  },  "defaultBranch": "main",  "createdAt": "2026-08-01T09:30:00Z",  "updatedAt": "2026-08-02T14:45:00Z",  "pushedAt": "2026-08-02T14:45:00Z",  "cloneUrl": "https://origin.cursor.com/git/acme/rocket.git"}

Список веток

GET/v1/origin/repos/{ownerSlug}/{repoName}/branches
Scoperepository:contents:readAuthInstallation tokenUser access token

Возвращает ветки репозитория и их последние коммиты в порядке возрастания имён с пагинацией по page_size и page_token.

Параметры пути

ownerSlug строка Обязательно

Уникальный слаг сущности-владельца.

repoName строка Обязательно

Имя репозитория, уникальное в пределах сущности-владельца.

Параметры запроса

pageSize целое число

Максимальное количество возвращаемых веток. Если не задан или равен 0, по умолчанию используется значение 30. Значения выше 100 ограничиваются 100.

pageToken строка

Непрозрачный курсор из поля next_page_token предыдущего ответа. Для первой страницы оставьте пустым. Кодирует смещение страницы, поэтому при передаче токена страницы значение page_size в последующем запросе игнорируется.

Поля ответа

branches массив

Записи веток с пагинацией, содержащие имя ветки и SHA последнего коммита.

branches[].name строка

Имя ветки.

branches[].commit object

Коммит в конце ветки.

branches[].commit.sha строка

Полный SHA коммита в шестнадцатеричном формате в конце ветки.

nextPageToken строка

Непрозрачный курсор для следующей страницы; пуст, если страниц больше нет.
curl --request GET \  --url 'https://api.cursor.com/v1/origin/repos/OWNER_SLUG/REPO_NAME/branches' \  --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN'

Структура ответа:

{  "branches": [    {      "name": "main",      "commit": {        "sha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4"      }    }  ]}

Получить tar-архив репозитория

GET/v1/origin/repos/{ownerSlug}/{repoName}/tarball/{ref}
Scoperepository:contents:readAuthInstallation tokenUser access token

Скачивает сжатый gzip tar-архив дерева репозитория по ссылке ref.

Origin связывает архив с репозиторием и коммитом, в который разрешается ref. Первый запрос для заданного коммита возвращает 200 с Content-Type: application/gzip и передаёт архив потоком в теле ответа. Последующие запросы для того же коммита возвращают 302 с пустым телом и подписанным URL для скачивания в Location, действующим 15 минут; перейдите по перенаправлению, чтобы получить данные. Файлы архива располагаются в корне tar-архива, без дополнительного каталога. Пустой репозиторий возвращает ABORTED (HTTP 409 Conflict), а Git-ссылка, которая не разрешается, — 404.

Передавайте Git-ссылку как параметр запроса вместо сегмента пути, если она содержит "/": GET /v1/origin/repos/{ownerSlug}/{repoName}/tarball?ref=refs/heads/main. Не указывайте её, чтобы архивировать ветку репозитория по умолчанию.

Параметры пути

ownerSlug строка обязательно

Уникальный слаг сущности-владельца.

repoName строка обязательно

Имя репозитория, уникальное в пределах сущности-владельца.

ref строка обязательно

SHA коммита (полный или сокращённый в шестнадцатеричном формате), имя ветки или тега без префикса, полное имя refs/heads/... или refs/tags/... либо символьная ссылка HEAD. Не является glob-шаблоном или revspec, поэтому <rev>~3 отклоняется. Пустое значение использует ветку репозитория по умолчанию.

Поля ответа

sha строка

Идентификатор object разрешённого коммита: 40 или 64 символа в шестнадцатеричном формате. Возвращается вызывающей стороне Connect и JSON; при использовании REST его можно получить из имени файла архива или подписанного URL.

downloadUrl строка

Подписанный URL для скачивания с коротким сроком действия — 15 минут. Пуст, когда архив передаётся в ответе потоком, то есть при первом запросе для этого репозитория и коммита. При использовании REST этот же URL передаётся в заголовке Location ответа 302.
curl --request GET --location --output repo.tar.gz \  --url 'https://api.cursor.com/v1/origin/repos/OWNER_SLUG/REPO_NAME/tarball/HEAD' \  --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN'

Структура ответа:

{  "downloadUrl": "https://artifacts.origin.cursor.com/tarballs/0192f7a4-6c1e-7b3a-9f21-3d54c9a7e6b0/9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4.tar.gz?Expires=1767225600&Signature=EXAMPLE&Key-Pair-Id=KEXAMPLE123",  "sha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4"}

Синхронизация зеркала

POST/v1/origin/repos/{ownerSlug}/{repoName}:syncMirror
Scoperepository:contents:readAuthInstallation tokenUser access token

Синхронизирует одну Git-ссылку зеркального репозитория с вышестоящим источником. Возвращает HTTP 200, когда цель синхронизации достигнута, или HTTP 202, если синхронизация ещё ожидается. wait=false (по умолчанию) запускает синхронизацию и обычно возвращает 202; 200 возвращается сразу, если sha уже доступен из ref. wait=true блокирует выполнение, пока цель не будет достигнута или не истечёт лимит ожидания (~2 минуты); в этом случае также возвращается 202, а синхронизация продолжается в фоновом режиме. Репозитории, не синхронизируемые с вышестоящим источником, отклоняются.

Параметры пути

ownerSlug строка Обязательный

Уникальный слаг сущности-владельца.

repoName строка Обязательный

Имя репозитория, уникальное в пределах сущности-владельца.

Тело запроса

ref строка Обязательный

Полное имя Git-ссылки для получения. Должно начинаться с refs/ и содержать имя ссылки после этого префикса, например refs/heads/main или refs/tags/v1. Короткие имена, такие как main, отклоняются с INVALID_ARGUMENT.

wait boolean

Если значение — true, выполнение блокируется, пока синхронизация не завершится или не истечёт лимит ожидания. По умолчанию — false.

sha строка

Необязательный полный идентификатор object коммита: 40- или 64-символьный шестнадцатеричный формат. Не указывайте или оставьте пустым, чтобы ждать вершину ref. Если значение задано и доступно из ref, вызов завершается раньше, не дожидаясь завершения других операций с зеркалом. Другие значения отклоняются с INVALID_ARGUMENT.

Поля ответа

synced boolean

Значение true означает, что цель синхронизации достигнута, false — что синхронизация ещё ожидается. Поле присутствует всегда и соответствует коду состояния HTTP: 200, когда true, и 202, когда false.
curl --request POST \  --url 'https://api.cursor.com/v1/origin/repos/OWNER_SLUG/REPO_NAME:syncMirror' \  --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN' \  --header 'Content-Type: application/json' \  --data '{  "ref": "refs/heads/main",  "wait": true}'

Структура ответа:

{  "synced": true}

Конечные точки перехода зеркал описаны в Origin Migration API. Синхронизация зеркала остаётся на этой странице.

Отключить зеркало репозитория

См. Отключить зеркало репозитория.

Получение задачи перехода зеркала

См. Получение задачи перехода зеркала.

Получение активной задачи перехода зеркала

См. Получение активной задачи перехода зеркала.

Force Repo Mirror Cutover

См. Force Repo Mirror Cutover.

Transition Repo Mirror

См. Transition Repo Mirror.

Проверки

  • При первом вызове upsert набор создаётся автоматически.
  • Обязательные проверки сопоставляются с устанавливающим приложением, а также с key набора и, при необходимости, key запуска. name используется только для отображения и не участвует в сопоставлении.
  • Сохраняйте значения key неизменными между попытками и понятными пользователям, так как на них основана конфигурация обязательных проверок.
  • Повторно используйте externalId для обновления попытки — при этом её предыдущий результат удаляется; для повторной попытки используйте новый externalId, чтобы предыдущая попытка сохранилась в истории.
  • Используйте checkRun.output для результатов, понятных человеку:
    • title: краткий заголовок результата, до 255 символов.
    • summary: основная сводка в Markdown, до 65 535 байт UTF-8.
    • text: расширенные сведения в Markdown, до 65 535 байт UTF-8.
  • Используйте detailsUrl для ссылки на внешнюю страницу результатов провайдера.

Отправка запуска проверки

POST/v1/origin/repos/{ownerSlug}/{repoName}/check-runs
Scoperepository:checks:writeAuthInstallation token

Выполняет вставку или обновление (upsert) набора проверок и запуска проверки с использованием токена доступа установки с правом repository:checks:write. Операция записи приписывается приложению, которому принадлежит аутентифицированная установка. Повторный вызов с теми же (repo, head_sha, suite.key, check.key) обновляет существующий запуск проверки на месте, а не создаёт дубликат.

Этот endpoint атомарно разрешает или создаёт попытку набора (suite attempt) и выполняет upsert одной попытки запуска (run attempt). Поле externalUpdatedAt упорядочивает обновления для одной и той же идентичности запуска; устаревшие повторные попытки (retries) не могут перезаписать более новое состояние.

deadlineAt задаёт необязательный крайний срок для запуска. Origin сохраняет его, возвращает при чтении и очищает, как только запуск достигает состояния completed. Крайний срок более чем на 24 часа в будущем отклоняется с ошибкой InvalidArgument (HTTP 400), а не усекается.

Когда крайний срок проходит для запуска, который всё ещё имеет статус in_progress, Origin самостоятельно завершает запуск с заключением timed_out и отправляет событие repository.check_run.completed. Истечение проверяется периодически, а не с помощью отдельного таймера для каждого запуска, поэтому запуск может ненадолго оставаться после крайнего срока, прежде чем Origin его закроет. Запуск со статусом queued никогда не истекает, как и запуск без поля deadlineAt. Если вы самостоятельно завершите запуск до крайнего срока, это снимет срок. Origin оставляет поле externalUpdatedAt запуска без изменений при тайм-ауте, поэтому более позднее завершение от вашего провайдера всё ещё может перезаписать заключение timed_out.

Параметры пути

ownerSlug string Обязательно

Уникальный слаг владеющей сущности.

repoName строка Обязательно

Имя репозитория, уникальное в пределах сущности-владельца.

Тело запроса

headSha строка Обязательно

SHA хед-коммита, в отношении которого зафиксирован запуск проверки (40- или 64-значный шестнадцатеричный код).

checkSuite объект Обязательно

Набор, которому принадлежит запуск проверки; создаётся или обновляется вместе с запуском проверки.

checkSuite.key string Обязательно

Стабильный ключ, выбранный приложением для идентификации логического набора между попытками.

checkSuite.name string Обязательно

Отображаемое пользователю название набора.

checkSuite.detailsUrl string

Необязательная ссылка на подробную информацию о наборе в целом.

checkSuite.externalId string Обязательно

Неизменяемый идентификатор, присвоенный поставщиком для этой попытки набора.

checkRun object Обязательно

Запуск проверки для вставки или обновления.

checkRun.key string Обязательно

Стабильный ключ, выбранный приложением, идентифицирующий логическую проверку между попытками.

checkRun.name string Обязательно

Понятное пользователю название запуска проверки.

checkRun.status string Обязательно

Значения, которые можно задать: CHECK_RUN_LIFECYCLE_STATUS_UNSPECIFIED, queued, in_progress, completed. В схеме также указано значение rerequested, которое задаёт только Origin при повторном запросе; запрос с этим значением возвращает InvalidArgument (HTTP 400).

checkRun.conclusion string

Обязательно тогда и только тогда, когда status == completed. Допустимые значения: CHECK_RUN_CONCLUSION_UNSPECIFIED, success, failure, neutral, cancelled, skipped, timed_out, action_required, stale.

checkRun.externalUpdatedAt строка Обязательно

Время последнего обновления внешней системы. Используется для упорядочивания одновременных обновлений, чтобы устаревшая повторная попытка не смогла перезаписать более новое состояние.

checkRun.startedAt string

Время начала выполнения проверки.

checkRun.completedAt string

Когда запуск проверки завершился.

checkRun.detailsUrl строка

Необязательная ссылка на дополнительную информацию об этом конкретном запуске проверки (например, URL задания/сборки поставщика).

checkRun.externalId string Обязательно

Неизменяемый идентификатор, назначенный поставщиком для этой попытки проверки.

checkRun.output object

Читаемые человеком выходные данные для этого запуска проверки.

checkRun.output.title string

Краткий заголовок для вывода. Максимальная длина: 255 символов.

checkRun.output.summary string

Сводка выходных данных. Может содержать Markdown. Максимальный размер в UTF-8: 65535 байт.

checkRun.output.text string

Подробный вывод. Может содержать Markdown. Максимальный размер в UTF-8: 65535 байт.

checkRun.deadlineAt string

Крайний срок для выполнения проверки в виде метки времени RFC 3339. Значения более чем на 24 часа в будущем отклоняются с ошибкой InvalidArgument (HTTP 400), а не корректируются. Не указывайте его при создании, чтобы не устанавливать крайний срок; не указывайте при обновлении, чтобы оставить сохранённый крайний срок без изменений.

checkRun.isRerequestable булево значение

Объявляет, что запуск можно выполнить повторно по запросу. Установка значения true обязывает ваше приложение подписаться на repository.check_run.rerequested и отвечать на каждую доставку, публикуя новый запуск для того же head SHA и key: либо новый запуск с новым externalId, сохраняющий предыдущую попытку в истории, либо обновление повторно запрошенного запуска с тем же externalId, обновляющее его на месте. Пока такая новая публикация не поступит, повторно запрошенный запуск отображается как ожидающий в последнем состоянии проверок коммита, поэтому обязательная проверка блокирует слияние, а pull request показывает, что запуск ожидает повторного выполнения; объявление возможности повторного запроса без ответа оставляет проверку в подвешенном состоянии. Origin не проверяет наличие подписки при вашей публикации. Не указывайте это поле, чтобы сохранить сохранённое значение, которое для нового запуска равно false; отправьте false, чтобы отозвать объявление.

Поля ответа

checkSuite object

Набор проверок, созданный или обновлённый операцией upsert.

checkSuite.id string

Идентификатор набора проверок, назначаемый сервером.

checkSuite.repository object

Ссылка на репозиторий для набора.

checkSuite.repository.id string

Идентификатор репозитория в ссылке на контейнер.

checkSuite.repository.name string

Имя репозитория в ссылке на контейнер.

checkSuite.repository.owner object

Ссылка на владельца репозитория.

checkSuite.repository.owner.slug строка

Слаг владельца в URL, используемый вместе с идентификатором владельца для определения владельца репозитория.

checkSuite.repository.owner.id string

Идентификатор владельца Origin.

checkSuite.repository.owner.type строка

Тип пространства имён владельца. Только для вывода. Допустимые значения: team, user. Пропускается, если неизвестно.

checkSuite.sha string

SHA коммита, к которому прикреплён набор.

checkSuite.key string

Стабильная выбранная приложением идентичность обязательной проверки. Обязательные проверки сопоставляются по приложению и этому ключу, а не по имени.

checkSuite.name string

Имя набора только для отображения; оно не используется для сопоставления обязательных проверок.

checkSuite.detailsUrl string

Необязательная ссылка на результаты набора у поставщика.

checkSuite.createdAt строка

Отметка времени создания набора (suite) в формате RFC 3339.

checkSuite.updatedAt строка

Метка времени RFC 3339 для последнего обновления набора.

checkSuite.externalId string

Идентификатор поставщика для этой попытки набора.

checkSuite.actor object

Публичный субъект, сформировавший набор проверок.

checkSuite.actor.user object

Вариант субъекта — пользователь. Устанавливается, когда действие выполнено пользователем.

checkSuite.actor.user.id string

Публичный идентификатор пользователя.

checkSuite.actor.user.email string

Адрес электронной почты пользователя. Всегда задаётся, когда присутствует вариант пользователя.

checkSuite.actor.user.displayName строка

Отображаемое имя пользователя: имя и фамилия из аккаунта, соединённые пробелом — то же имя, которое отображает продукт. Не указывается, если у аккаунта нет имени.

checkSuite.actor.user.handle string

Указанное пользователем имя профиля (handle) без префикса @. Присутствует только пока профиль публично видим; в противном случае отсутствует.

checkSuite.actor.app object

Вариант субъекта — приложение. Устанавливается, когда действие выполнено приложением.

checkSuite.actor.app.id string

Публичный идентификатор приложения.

checkSuite.actor.app.displayName строка

Зарегистрированное отображаемое имя приложения. Не указывается, если приложение не удаётся определить, а также для управляемого актёра собственной разработки Cursor.

checkSuite.actor.serviceAccount object

Вариант субъекта — сервисный аккаунт. Указывается, когда действие выполнено сервисным аккаунтом.

checkSuite.actor.serviceAccount.id string

Публичный идентификатор сервисного аккаунта.

checkRun object

Обновлённый или созданный запуск проверки.

checkRun.id string

Идентификатор прогона проверки, назначаемый сервером.

checkRun.repository object

Ссылка на репозиторий для запуска.

checkRun.repository.id string

Идентификатор репозитория в ссылке на контейнер.

checkRun.repository.name string

Имя репозитория в ссылке на контейнер.

checkRun.repository.owner object

Ссылка на владельца репозитория.

checkRun.repository.owner.slug строка

Слаг владельца для URL, используемый вместе с ID владельца для идентификации владельца репозитория.

checkRun.repository.owner.id string

Идентификатор владельца Origin.

checkRun.repository.owner.type строка

Тип пространства имён владельца. Только для вывода. Допустимые значения: team, user. Пропускается, если неизвестно.

checkRun.checkSuite object

Ссылка на содержащий набор проверок.

checkRun.checkSuite.id строка

Идентификатор содержащего набора проверок, присвоенный сервером.

checkRun.sha string

SHA коммита, к которому прикреплён запуск.

checkRun.key string

Стабильный логический идентификатор запуска, выбранный приложением; требуемые проверки могут совпадать по приложению, ключу набора и этому ключу.

checkRun.name строка

Название запуска только для отображения; оно не используется для сопоставления обязательных проверок.

checkRun.status string

Статус жизненного цикла: queued, in_progress, completed или rerequested. Запуск в состоянии rerequested — это завершённый запуск, для которого был запрошен повторный прогон, а владеющее им приложение ещё не ответило: считайте его ожидающим и отображайте как queued.

checkRun.conclusion string

Присутствует для завершённого или повторно запрошенного прогона: success, failure, neutral, cancelled, skipped, timed_out, action_required или stale. Для повторно запрошенного прогона это вердикт вытесненной попытки, поэтому читайте его только тогда, когда status равен completed.

checkRun.detailsUrl строка

Отдельная ссылка на страницу с полными результатами поставщика.

checkRun.externalUpdatedAt string

Внешняя отметка времени обновления используется для упорядочивания обновлений, чтобы устаревшие повторные попытки не могли заменить более новое состояние.

checkRun.startedAt string

Время начала в формате RFC 3339, указанное поставщиком, если оно предоставлено.

checkRun.completedAt string

Время завершения в формате RFC 3339, указанное поставщиком, если оно предоставлено.

checkRun.createdAt string

Метка времени создания запуска в формате RFC 3339.

checkRun.updatedAt string

Метка времени RFC 3339 для последнего сохранённого обновления выполнения.

checkRun.externalId строка

Идентификатор поставщика для одной попытки. Повторно используйте его, чтобы обновить эту попытку; для повторной попытки используйте новое значение.

checkRun.actor object

Публичный субъект, который сгенерировал прогон.

checkRun.actor.user object

Вариант субъекта — пользователь. Устанавливается, когда действие выполнено пользователем.

checkRun.actor.user.id string

Публичный идентификатор пользователя.

checkRun.actor.user.email string

Адрес электронной почты пользователя. Всегда задаётся, когда присутствует вариант пользователя.

checkRun.actor.user.displayName string

Отображаемое имя пользователя: имя и фамилия аккаунта, соединённые пробелом — то же имя, что отображает продукт. Не указывается, если в аккаунте нет имени.

checkRun.actor.user.handle string

Указанное пользователем имя профиля (handle) без префикса @. Присутствует только пока профиль публично видим; в противном случае отсутствует.

checkRun.actor.app object

Вариант субъекта — приложение. Устанавливается, когда действие выполнено приложением.

checkRun.actor.app.id string

Публичный идентификатор приложения.

checkRun.actor.app.displayName строка

Зарегистрированное отображаемое имя приложения. Не указывается, если приложение не удаётся определить, а также для управляемого актёра собственной разработки Cursor.

checkRun.actor.serviceAccount object

Вариант субъекта — сервисный аккаунт. Указывается, когда действие выполнено сервисным аккаунтом.

checkRun.actor.serviceAccount.id string

Публичный идентификатор сервисного аккаунта.

checkRun.output object

Читаемый человеком объект результата, содержащий заголовок, краткое содержание и более подробный текст, если он предоставлен.

checkRun.output.title string

Краткий заголовок для вывода. Максимальная длина: 255 символов.

checkRun.output.summary string

Сводка выходных данных. Может содержать Markdown. Максимальный размер в UTF-8: 65535 байт.

checkRun.output.text string

Подробный вывод. Может содержать Markdown. Максимальный размер в UTF-8: 65535 байт.

checkRun.deadlineAt string

Крайний срок, зафиксированный для прогона проверки, в виде метки времени по RFC 3339. Отсутствует, если у прогона нет крайнего срока, в том числе после его завершения.

checkRun.isRerequestable логическое

Указывает, объявило ли приложение, отправившее отчёт, что этот запуск можно запросить повторно.

checkRun.rerequestedAt string

Метка времени RFC 3339 для ожидающего повторного запроса. Отсутствует, если повторный запрос не ожидается, и сбрасывается, когда приложение, которому принадлежит запуск, публикует результат снова. Пока это поле установлено, status имеет значение rerequested, запуск остаётся в последнем состоянии проверок коммита и помечается как ожидающий, а conclusion и отметки времени по-прежнему отражают вытесненный результат, поэтому обязательная проверка блокирует слияние, пока приложение не ответит.

checkRun.rerequestedBy object

Лицо, запросившее повторный запуск, с теми же вариантами субъекта, что и actor. Присутствует, когда задано rerequestedAt, и сбрасывается вместе с ним.
curl --request POST \  --url 'https://api.cursor.com/v1/origin/repos/OWNER_SLUG/REPO_NAME/check-runs' \  --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN' \  --header 'Content-Type: application/json' \  --data '{  "headSha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4",  "checkSuite": {    "key": "ci-8842",    "name": "CI",    "detailsUrl": "https://ci.acme.dev/runs/8842",    "externalId": "build-8842"  },  "checkRun": {    "key": "ci-8842-unit-tests",    "name": "unit-tests",    "status": "completed",    "conclusion": "success",    "externalUpdatedAt": "2026-08-02T14:44:30Z",    "startedAt": "2026-08-02T14:40:00Z",    "completedAt": "2026-08-02T14:44:30Z",    "detailsUrl": "https://ci.acme.dev/runs/8842",    "externalId": "run-8842",    "output": {      "title": "Unit tests",      "summary": "128 tests passed.",      "text": "All suites green."    }  }}'

Структура ответа:

{  "checkSuite": {    "id": "crg_01k2ja2000e0080000000000h8",    "repository": {      "id": "repo_01k2ja2000e0080000000000q4",      "name": "rocket",      "owner": {        "slug": "acme",        "id": "ns_01k2ja2000e0080000000000p3",        "type": "team"      }    },    "sha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4",    "key": "ci-8842",    "name": "CI",    "detailsUrl": "https://ci.acme.dev/runs/8842",    "createdAt": "2026-08-01T09:30:00Z",    "updatedAt": "2026-08-02T14:45:00Z",    "externalId": "build-8842",    "actor": {      "user": {        "id": "user_01k2ja2000e0080000000000c3",        "email": "[email protected]"      }    }  },  "checkRun": {    "id": "cr_01k2ja2000e0080000000000g7",    "repository": {      "id": "repo_01k2ja2000e0080000000000q4",      "name": "rocket",      "owner": {        "slug": "acme",        "id": "ns_01k2ja2000e0080000000000p3",        "type": "team"      }    },    "checkSuite": {      "id": "crg_01k2ja2000e0080000000000h8"    },    "sha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4",    "key": "ci-8842-unit-tests",    "name": "unit-tests",    "status": "completed",    "conclusion": "success",    "detailsUrl": "https://ci.acme.dev/runs/8842",    "externalUpdatedAt": "2026-08-02T14:44:30Z",    "startedAt": "2026-08-02T14:40:00Z",    "completedAt": "2026-08-02T14:44:30Z",    "createdAt": "2026-08-01T09:30:00Z",    "updatedAt": "2026-08-02T14:45:00Z",    "externalId": "run-8842",    "actor": {      "user": {        "id": "user_01k2ja2000e0080000000000c3",        "email": "[email protected]"      }    },    "output": {      "title": "Unit tests",      "summary": "128 tests passed.",      "text": "All suites green."    }  }}

Пакетное добавление/обновление запусков проверок

POST/v1/origin/repos/{ownerSlug}/{repoName}/check-runs:batchUpsert
Scoperepository:checks:writeAuthInstallation token

Атомарно вставляет или обновляет несколько запусков проверок, принадлежащих одному набору. Запрос принимает не более 10 запусков и отклоняет дублирующиеся идентификаторы (external_id, key). Каждый запуск фиксируется, либо весь запрос откатывается.

Каждый запуск принимает тот же необязательный параметр deadlineAt, что и Post Check Run.

Параметры пути

ownerSlug string Обязательно

Уникальный слаг владельца.

repoName string Обязательно

Имя репозитория, уникальное для сущности-владельца.

Тело запроса

headSha строка Обязательно

SHA головного коммита, для которого сообщаются результаты запусков проверок (40- или 64-значное шестнадцатеричное значение).

checkSuite object Обязательный

Набор, общий для каждого прогона проверки в этом запросе.

checkSuite.key string Обязательно

Стабильный ключ, выбранный приложением, идентифицирующий логический набор между попытками.

checkSuite.name string Обязательно

Название набора, отображаемое пользователю.

checkSuite.detailsUrl string

Необязательная ссылка на более подробную информацию о комплекте в целом.

checkSuite.externalId string Обязательно

Неизменяемый идентификатор этой попытки набора, назначенный поставщиком.

checkRuns массив Обязательно

Запуски проверок для вставки или обновления в порядке ответа. Должно содержать от 1 до 10 записей с уникальными идентификаторами (external_id, key).

checkRuns[0].key string Обязательно

Стабильный ключ, выбираемый приложением, идентифицирующий логическую проверку между попытками.

checkRuns[0].name строка Обязательно

Название проверки, отображаемое пользователю.

checkRuns[0].status string Обязательно

Устанавливаемые значения: CHECK_RUN_LIFECYCLE_STATUS_UNSPECIFIED, queued, in_progress, completed. В схеме также указано rerequested, которое задаёт только Origin при повторном запросе; запрос с этим значением возвращает InvalidArgument (HTTP 400).

checkRuns[0].conclusion string

Обязательно, если status == completed. Допустимые значения: CHECK_RUN_CONCLUSION_UNSPECIFIED, success, failure, neutral, cancelled, skipped, timed_out, action_required, stale.

checkRuns[0].externalUpdatedAt string Обязательно

Время последнего обновления внешней системы. Используется для упорядочивания одновременных обновлений, чтобы устаревшая повторная попытка не смогла перезаписать более новое состояние.

checkRuns[0].startedAt string

Время начала выполнения проверки.

checkRuns[0].completedAt строка

Когда выполнение проверки завершилось.

checkRuns[0].detailsUrl string

Необязательная ссылка на дополнительные сведения об этом конкретном запуске проверки (например, URL задания/сборки поставщика).

checkRuns[0].externalId string Обязательно

Неизменяемый идентификатор этой попытки проверки, назначенный поставщиком.

checkRuns[0].output object

Читаемый человеком вывод для этого запуска проверки.

checkRuns[0].output.title string

Краткий заголовок для вывода. Максимальная длина: 255 символов.

checkRuns[0].output.summary string

Сводка выходных данных. Может содержать Markdown. Максимальный размер в UTF-8: 65535 байт.

checkRuns[0].output.text string

Подробный вывод. Может содержать Markdown. Максимальный размер в UTF-8: 65535 байт.

checkRuns[0].deadlineAt string

Крайний срок для выполнения проверки в формате метки времени RFC 3339. Значения более чем на 24 часа в будущем отклоняются с ошибкой InvalidArgument (HTTP 400), а не корректируются. Не указывайте его при создании, чтобы не устанавливать крайний срок; не указывайте его при обновлении, чтобы сохранить ранее сохранённый срок без изменений.

checkRuns[0].isRerequestable boolean

Указывает, что запуск можно повторно инициировать по запросу. Установка значения true обязывает ваше приложение подписаться на repository.check_run.rerequested и в ответ на каждую доставку публиковать новый запуск для того же head SHA и того же key: либо новый запуск с новым externalId, при этом старая попытка сохраняется в истории, либо обновление повторно запрошенного запуска с тем же externalId, что обновляет его на месте. Пока такая новая публикация не поступит, повторно запрошенный запуск отображается как ожидающий в последнем состоянии проверок коммита, поэтому требуемая проверка блокирует слияние, а pull request показывает запуск как ожидающий повторного запуска; объявление возможности повторного запроса без ответа оставляет проверку в подвешенном состоянии. Origin не проверяет наличие подписки при публикации. Пропустите это поле, чтобы сохранить хранимое значение, которое для нового запуска равно false; отправьте false, чтобы отозвать это объявление.

Поля ответа

checkSuite object

Сохранённый набор, общий для всех возвращённых запусков проверок.

checkSuite.id string

Идентификатор набора проверок, присвоенный сервером.

checkSuite.repository object

Ссылка на репозиторий для набора.

checkSuite.repository.id string

Идентификатор репозитория в ссылке на контейнер.

checkSuite.repository.name string

Имя репозитория в ссылке на контейнер.

checkSuite.repository.owner object

Ссылка на владельца репозитория.

checkSuite.repository.owner.slug строка

Слаг владельца для URL, используемый вместе с идентификатором владельца для определения владельца репозитория.

checkSuite.repository.owner.id string

Идентификатор владельца Origin.

checkSuite.repository.owner.type string

Тип пространства имён владельца. Только для вывода. Допустимые значения: team, user. Опускается, если неизвестно.

checkSuite.sha строка

SHA коммита, к которому привязан набор тестов.

checkSuite.key string

Стабильная идентичность обязательной проверки, выбранной приложением. Обязательные проверки сопоставляются по приложению и этому ключу, а не по имени.

checkSuite.name строка

Имя набора только для отображения; оно не используется для сопоставления обязательных проверок.

checkSuite.detailsUrl string

Необязательная ссылка на результаты набора проверок поставщика.

checkSuite.createdAt string

Временная метка создания набора (suite) в формате RFC 3339.

checkSuite.updatedAt string

Отметка времени в формате RFC 3339 для последнего обновления набора.

checkSuite.externalId строка

Идентификатор провайдера для этой попытки набора.

checkSuite.actor object

Публичный актёр, который создал набор.

checkSuite.actor.user object

Вариант актора для пользователя. Задаётся, когда действие выполняет пользователь.

checkSuite.actor.user.id string

Публичный идентификатор пользователя.

checkSuite.actor.user.email string

Адрес электронной почты пользователя. Всегда задаётся, когда присутствует вариант пользователя.

checkSuite.actor.user.displayName string

Отображаемое имя пользователя: имя и фамилия аккаунта, соединённые пробелом — то же имя, которое отображает продукт. Не показывается, если у аккаунта нет имени.

checkSuite.actor.user.handle string

Заявленный пользователем идентификатор профиля, без префикса @. Присутствует, только пока этот профиль общедоступен; в остальных случаях опускается.

checkSuite.actor.app object

Вариант субъекта — приложение. Устанавливается, когда действие выполнено приложением.

checkSuite.actor.app.id string

Публичный идентификатор приложения.

checkSuite.actor.app.displayName string

Зарегистрированное отображаемое имя приложения. Пропускается, если приложение не удалось определить, а также для собственного управляемого актора Cursor.

checkSuite.actor.serviceAccount object

Вариант субъекта — служебная учётная запись. Устанавливается, когда действие выполнено служебной учётной записью.

checkSuite.actor.serviceAccount.id string

Публичный идентификатор служебной учётной записи.

checkRuns массив

Сохранённые запуски проверок идут в том же порядке, что и в запросе.

checkRuns[].id строка

Идентификатор запуска проверки, присвоенный сервером.

checkRuns[].repository object

Ссылка на репозиторий для запуска.

checkRuns[].repository.id string

Идентификатор репозитория в ссылке на контейнер.

checkRuns[].repository.name string

Имя репозитория в ссылке на контейнер.

checkRuns[].repository.owner object

Ссылка на владельца репозитория.

checkRuns[].repository.owner.slug string

Слаг владельца для URL, используемый вместе с идентификатором владельца для определения владельца репозитория.

checkRuns[].repository.owner.id string

Идентификатор владельца Origin.

checkRuns[].repository.owner.type строка

Тип пространства имён владельца. Только для вывода. Допустимые значения: team, user. Опускается, если неизвестно.

checkRuns[].checkSuite object

Ссылка на содержащий набор проверок.

checkRuns[].checkSuite.id строка

Идентификатор содержащего набора проверок, назначенный сервером.

checkRuns[].sha строка

SHA коммита, к которому прикреплён запуск.

checkRuns[].key строка

Стабильный логический идентификатор запуска, выбранный приложением; обязательные проверки могут совпадать по приложению, ключу набора и этому ключу.

checkRuns[].name string

Имя запуска только для отображения; оно не используется для сопоставления обязательных проверок.

checkRuns[].status string

Статус жизненного цикла: в очереди, в_обработке, завершён или повторно запрошен. Повторно запрошенный запуск — это завершённый запуск, для которого запросили повторное выполнение, а владеющее приложение ещё не ответило: считайте его ожидающим и отображайте так же, как в очереди.

checkRuns[].conclusion string

Присутствует для завершённого или повторно запрошенного запуска: success, failure, neutral, cancelled, skipped, timed_out, action_required или stale. Для повторно запрошенного запуска это вердикт заменённой попытки, поэтому читайте его только тогда, когда status равен completed.

checkRuns[].detailsUrl string

Отдельная ссылка на страницу с полными результатами поставщика.

checkRuns[].externalUpdatedAt string

Временная метка внешнего обновления, используемая для упорядочивания обновлений, чтобы устаревшие повторные попытки не могли заменить более новое состояние.

checkRuns[].startedAt string

Время начала в формате RFC 3339, указанное поставщиком, если оно предоставлено.

checkRuns[].completedAt строка

Время завершения в формате RFC 3339, указанное поставщиком, если оно предоставлено.

checkRuns[].createdAt string

Временная метка создания запуска в формате RFC 3339.

checkRuns[].updatedAt string

Метка времени в формате RFC 3339 для последнего сохранённого обновления запуска.

checkRuns[].externalId string

Идентификатор провайдера для одной попытки. Повторно используйте его, чтобы обновить эту попытку, или укажите новое значение для повторной попытки.

checkRuns[].actor object

Публичный субъект, создавший запуск.

checkRuns[].actor.user object

Вариант актора для пользователя. Задаётся, когда действие выполняет пользователь.

checkRuns[].actor.user.id строка

Публичный идентификатор пользователя.

checkRuns[].actor.user.email string

Адрес электронной почты пользователя. Всегда задаётся, когда присутствует вариант пользователя.

checkRuns[].actor.user.displayName строка

Отображаемое имя пользователя: имя и фамилия из аккаунта, объединённые пробелом — то же имя, которое отображает продукт. Пропускается, если у аккаунта нет имени.

checkRuns[].actor.user.handle строка

Заявленный пользователем идентификатор профиля, без префикса @. Присутствует, только пока этот профиль общедоступен; в остальных случаях опускается.

checkRuns[].actor.app object

Вариант субъекта — приложение. Устанавливается, когда действие выполнено приложением.

checkRuns[].actor.app.id string

Публичный идентификатор приложения.

checkRuns[].actor.app.displayName string

Зарегистрированное отображаемое имя приложения. Пропускается, если приложение не удалось определить, а также для собственного управляемого актора Cursor.

checkRuns[].actor.serviceAccount object

Вариант субъекта — служебная учётная запись. Устанавливается, когда действие выполнено служебной учётной записью.

checkRuns[].actor.serviceAccount.id string

Публичный идентификатор служебной учётной записи.

checkRuns[].output object

Читабельный объект результата, содержащий заголовок, краткое содержание и более подробный текст, если он предоставлен.

checkRuns[].output.title string

Краткий заголовок для вывода. Максимальная длина: 255 символов.

checkRuns[].output.summary string

Сводка выходных данных. Может содержать Markdown. Максимальный размер в UTF-8: 65535 байт.

checkRuns[].output.text string

Подробный вывод. Может содержать Markdown. Максимальный размер в UTF-8: 65535 байт.

checkRuns[].deadlineAt string

Крайний срок, зафиксированный для прогона проверки, в виде временной метки RFC 3339. Отсутствует, если для прогона не задан крайний срок, в том числе после его завершения.

checkRuns[].isRerequestable boolean

Указало ли приложение для отчётов, что этот запуск можно запросить повторно.

checkRuns[].rerequestedAt string

RFC 3339 — временная метка ожидающего повторного запроса. Отсутствует, если повторный запрос не ожидается, и сбрасывается, когда приложение, которому принадлежит запуск, снова публикует результат. Пока она задана, status имеет значение rerequested, запуск остаётся в последнем состоянии проверки коммита и отображается как ожидающий, при этом conclusion и временные отметки по-прежнему содержат заменённый результат, поэтому обязательная проверка блокирует слияние, пока приложение не ответит.

checkRuns[].rerequestedBy object

Субъект, запросивший повторный запуск, с теми же вариантами актёра, что и actor. Присутствует, когда задано rerequestedAt, и сбрасывается вместе с ним.
curl --request POST \  --url 'https://api.cursor.com/v1/origin/repos/OWNER_SLUG/REPO_NAME/check-runs:batchUpsert' \  --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN' \  --header 'Content-Type: application/json' \  --data '{  "headSha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4",  "checkSuite": {    "key": "ci-8842",    "name": "CI",    "detailsUrl": "https://ci.acme.dev/runs/8842",    "externalId": "build-8842"  },  "checkRuns": [    {      "key": "ci-8842-unit-tests",      "name": "unit-tests",      "status": "completed",      "conclusion": "success",      "externalUpdatedAt": "2026-08-02T14:44:30Z",      "startedAt": "2026-08-02T14:40:00Z",      "completedAt": "2026-08-02T14:44:30Z",      "detailsUrl": "https://ci.acme.dev/runs/8842",      "externalId": "run-8842",      "output": {        "title": "Unit tests",        "summary": "128 tests passed.",        "text": "All suites green."      }    }  ]}'

Структура ответа:

{  "checkSuite": {    "id": "crg_01k2ja2000e0080000000000h8",    "repository": {      "id": "repo_01k2ja2000e0080000000000q4",      "name": "rocket",      "owner": {        "slug": "acme",        "id": "ns_01k2ja2000e0080000000000p3",        "type": "team"      }    },    "sha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4",    "key": "ci-8842",    "name": "CI",    "detailsUrl": "https://ci.acme.dev/runs/8842",    "createdAt": "2026-08-01T09:30:00Z",    "updatedAt": "2026-08-02T14:45:00Z",    "externalId": "build-8842",    "actor": {      "user": {        "id": "user_01k2ja2000e0080000000000c3",        "email": "[email protected]"      }    }  },  "checkRuns": [    {      "id": "cr_01k2ja2000e0080000000000g7",      "repository": {        "id": "repo_01k2ja2000e0080000000000q4",        "name": "rocket",        "owner": {          "slug": "acme",          "id": "ns_01k2ja2000e0080000000000p3",          "type": "team"        }      },      "checkSuite": {        "id": "crg_01k2ja2000e0080000000000h8"      },      "sha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4",      "key": "ci-8842-unit-tests",      "name": "unit-tests",      "status": "completed",      "conclusion": "success",      "detailsUrl": "https://ci.acme.dev/runs/8842",      "externalUpdatedAt": "2026-08-02T14:44:30Z",      "startedAt": "2026-08-02T14:40:00Z",      "completedAt": "2026-08-02T14:44:30Z",      "createdAt": "2026-08-01T09:30:00Z",      "updatedAt": "2026-08-02T14:45:00Z",      "externalId": "run-8842",      "actor": {        "user": {          "id": "user_01k2ja2000e0080000000000c3",          "email": "[email protected]"        }      },      "output": {        "title": "Unit tests",        "summary": "128 tests passed.",        "text": "All suites green."      }    }  ]}

Получить запуск проверки

GET/v1/origin/repos/{ownerSlug}/{repoName}/check-runs/{checkRunId}
Scoperepository:checks:readAuthInstallation tokenUser access token

Возвращает один запуск проверки по присвоенному сервером идентификатору (cr_...).

Параметры пути

ownerSlug string Обязательно

Уникальный слаг владеющей сущности.

repoName строка Обязательно

Имя репозитория, уникальное для сущности-владельца.

checkRunId string Обязательное

Идентификатор запуска проверки, назначаемый сервером (cr_...).

Поля ответа

id строка

Идентификатор прогона проверки, назначаемый сервером.

repository объект

Ссылка на репозиторий для запуска.

repository.id строка

Идентификатор репозитория в ссылке на контейнер.

repository.name строка

Имя репозитория в ссылке на контейнер.

repository.owner object

Ссылка на владельца репозитория.

repository.owner.slug string

Слаг владельца в URL, используемый вместе с идентификатором владельца для определения владельца репозитория.

repository.owner.id строка

Идентификатор владельца Origin.

repository.owner.type строка

Тип пространства имён владельца. Только для вывода. Допустимые значения: team, user. Пропускается, если неизвестно.

checkSuite object

Ссылка на содержащий набор проверок.

checkSuite.id string

Идентификатор содержащего набора проверок, назначенный сервером.

sha string

SHA коммита, к которому прикреплён запуск.

key строка

Стабильный логический идентификатор запуска, выбранный приложением; обязательные проверки могут соответствовать приложению, ключу набора и этому ключу.

name string

Имя запуска только для отображения; оно не используется для сопоставления обязательных проверок.

status string

Статус жизненного цикла: queued, in_progress, completed или rerequested. Запуск со статусом rerequested — это завершённый запуск, для которого запрошен повторный запуск, но приложение-владелец ещё не ответило: считайте его ожидающим и отображайте как queued.

conclusion string

Присутствует для завершённого или повторно запрошенного прогона: success, failure, neutral, cancelled, skipped, timed_out, action_required или stale. Для повторно запрошенного прогона это вердикт вытесненной попытки, поэтому читайте его, только когда status равен completed.

detailsUrl string

Отдельная ссылка на страницу с полными результатами поставщика.

externalUpdatedAt string

Внешняя метка времени обновления, используемая для упорядочивания обновлений, чтобы устаревшие повторы не могли заменить более новое состояние.

startedAt строка

Время начала в формате RFC 3339, указанное поставщиком, если оно предоставлено.

completedAt string

Время завершения в формате RFC 3339, указанное поставщиком, если предоставлено.

createdAt string

Временная метка создания запуска в формате RFC 3339.

updatedAt string

Метка времени RFC 3339 последнего сохранённого обновления запуска.

externalId строка

Идентификатор поставщика для одной попытки. Повторно используйте его, чтобы обновить эту попытку, а для повторной попытки используйте новое значение.

actor object

Публичный субъект, выполнивший прогон.

actor.user object

Вариант субъекта — «пользователь». Устанавливается, когда действие выполняет пользователь.

actor.user.id строка

Публичный идентификатор пользователя.

actor.user.email строка

Адрес электронной почты пользователя. Всегда задаётся, когда присутствует вариант user.

actor.user.displayName строка

Отображаемое имя пользователя: имя и фамилия учётной записи, разделённые пробелом — то же имя, которое отображает продукт. Пропускается, если у учётной записи нет имени.

actor.user.handle строка

Идентификатор профиля, указанный пользователем, без префикса @. Указывается только пока профиль публично видим; в противном случае отсутствует.

actor.app object

Вариант субъекта — «приложение». Устанавливается, когда действие выполняет приложение.

actor.app.id строка

Публичный идентификатор приложения.

actor.app.displayName строка

Отображаемое имя приложения, указанное при регистрации. Пропускается, если приложение не удаётся определить, а также для первого управляемого актёра Cursor.

actor.serviceAccount object

Вариант субъекта — сервисный аккаунт. Устанавливается, когда действие выполнено сервисным аккаунтом.

actor.serviceAccount.id строка

Публичный идентификатор сервисного аккаунта.

output object

Читабельный объект результата, содержащий заголовок, краткое содержание и более подробный текст, если они предоставлены.

output.title string

Краткий заголовок для вывода. Максимальная длина: 255 символов.

output.summary string

Сводка результатов. Может содержать Markdown. Максимальный размер (UTF-8): 65535 байт.

output.text string

Подробные результаты. Может содержать Markdown. Максимальный размер (UTF-8): 65535 байт.

deadlineAt строка

Срок выполнения для запуска проверки, зафиксированный в виде метки времени по стандарту RFC 3339. Отсутствует, если у запуска нет срока, в том числе после его завершения.

isRerequestable boolean

Указывает, пометило ли приложение для отчётов этот запуск как доступный для повторного запроса.

rerequestedAt строка

Метка времени RFC 3339 для ожидающего повторного запроса. Отсутствует, если повторный запрос не ожидается, и удаляется, когда приложение, которому принадлежит запуск, публикует результат снова. Пока она задана, status имеет значение rerequested, а запуск остаётся в последнем состоянии проверок коммита и отображается как ожидающий; при этом conclusion и временные метки по-прежнему содержат устаревший результат, поэтому обязательная проверка блокирует слияние, пока приложение не ответит.

rerequestedBy object

Принципал, запросивший повторный запуск, содержащий те же варианты актёра, что и actor. Присутствует, когда задано rerequestedAt, и сбрасывается вместе с ним.
curl --request GET \  --url 'https://api.cursor.com/v1/origin/repos/OWNER_SLUG/REPO_NAME/check-runs/CHECK_RUN_ID' \  --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN'

Структура ответа:

{  "id": "cr_01k2ja2000e0080000000000g7",  "repository": {    "id": "repo_01k2ja2000e0080000000000q4",    "name": "rocket",    "owner": {      "slug": "acme",      "id": "ns_01k2ja2000e0080000000000p3",      "type": "team"    }  },  "checkSuite": {    "id": "crg_01k2ja2000e0080000000000h8"  },  "sha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4",  "key": "ci-8842-unit-tests",  "name": "unit-tests",  "status": "completed",  "conclusion": "success",  "detailsUrl": "https://ci.acme.dev/runs/8842",  "externalUpdatedAt": "2026-08-02T14:44:30Z",  "startedAt": "2026-08-02T14:40:00Z",  "completedAt": "2026-08-02T14:44:30Z",  "createdAt": "2026-08-01T09:30:00Z",  "updatedAt": "2026-08-02T14:45:00Z",  "externalId": "run-8842",  "actor": {    "user": {      "id": "user_01k2ja2000e0080000000000c3",      "email": "[email protected]"    }  },  "output": {    "title": "Unit tests",    "summary": "128 tests passed.",    "text": "All suites green."  }}

Список аннотаций запуска проверки

GET/v1/origin/repos/{ownerSlug}/{repoName}/check-runs/{checkRunId}/annotations
Scoperepository:checks:readAuthInstallation tokenUser access token

Возвращает список аннотаций check run в порядке возрастания ID.

Идентификаторы аннотаций можно сортировать по времени, поэтому порядок идентификаторов по возрастанию соответствует порядку создания. Токен страницы фиксирует размер страницы и область действия для оставшейся последовательности, поэтому после его отправки параметр pageSize игнорируется.

Параметры пути

ownerSlug string Обязательный

Уникальный слаг сущности-владельца.

repoName string Обязательное

Имя репозитория, уникальное в пределах сущности-владельца.

checkRunId string Обязательно

Идентификатор запуска проверки, присвоенный сервером.

Параметры запроса

pageSize целое число

Максимальное количество возвращаемых аннотаций. По умолчанию — 30, если параметр опущен или равен нулю; значения свыше 100 ограничиваются до 100.

pageToken string

Непрозрачный курсор из поля nextPageToken предыдущего ответа. Для первой страницы не указывайте.

Поля ответа

annotations массив

Страница аннотаций, в порядке возрастания ID.

annotations[].id string

Стабильный идентификатор аннотации Origin. Идентификаторы можно сортировать по времени.

annotations[].checkRunId string

Идентификатор запуска проверки, которому принадлежит аннотация.

annotations[].annotationLevel string

Уровень серьёзности аннотации. Допустимые значения: notice, warning, failure.

annotations[].message string

Текст аннотации.

annotations[].title string

Заголовок аннотации. Отсутствует, если у аннотации его нет.

annotations[].rawDetails string

Исходный текст описания. Отсутствует, если у аннотации его нет.

annotations[].createdAt string

Время создания аннотации (RFC 3339).

annotations[].updatedAt string

Время последнего обновления аннотации (RFC 3339).

annotations[].location object

Расположение источника. Отсутствует для аннотации на уровне выполнения (run).

annotations[].location.path string

Канонический путь к файлу относительно репозитория.

annotations[].location.startLine целое число

Первая строка диапазона. Нумерация начинается с 1; границы включены.

annotations[].location.endLine целое число

Последняя строка диапазона. Нумерация с 1, включительно.

annotations[].location.columns object

Диапазон столбцов. Отсутствует, если аннотация охватывает более чем одну строку.

annotations[].location.columns.startColumn целое число

Первый столбец диапазона. Нумерация начинается с 1, границы включены.

annotations[].location.columns.endColumn целое число

Последний столбец диапазона. Нумерация с 1, включительно.

nextPageToken string

Непрозрачный курсор для следующей страницы. Пустой, если результатов больше нет.
curl --request GET \  --url 'https://api.cursor.com/v1/origin/repos/OWNER_SLUG/REPO_NAME/check-runs/CHECK_RUN_ID/annotations' \  --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN'

Структура ответа:

{  "annotations": [    {      "id": "cra_01k2ja2000e0080000000000v1",      "checkRunId": "cr_01k2ja2000e0080000000000g7",      "annotationLevel": "warning",      "message": "Deprecated API usage; migrate to the v2 client.",      "title": "Deprecated API",      "createdAt": "2026-08-02T14:45:00Z",      "updatedAt": "2026-08-02T14:45:00Z",      "location": {        "path": "src/telemetry.ts",        "startLine": 42,        "endLine": 42      }    }  ]}

Создать аннотации для проверки выполнения

POST/v1/origin/repos/{ownerSlug}/{repoName}/check-runs/{checkRunId}/annotations
Scoperepository:checks:writeAuthInstallation token

Добавляет от 1 до 25 аннотаций к запуску проверки одной атомарной пакетной операцией.

Один check run содержит не более 100 аннотаций. Пакет, из‑за которого этот лимит будет превышен, отклоняется с ошибкой ResourceExhausted (HTTP 429), и ничего не записывается; пакет вне диапазона от 1 до 25 отклоняется с ошибкой InvalidArgument (HTTP 400). Операция только добавляет данные и не является идемпотентной, поэтому повторная попытка после неясного сбоя транспорта может привести к добавлению дубликатов и расходованию квоты. Одинаковое содержимое допускается.

Параметры пути

ownerSlug string Обязательное

Уникальный слаг сущности-владельца.

repoName string Обязательное

Имя репозитория, уникальное для сущности-владельца.

checkRunId string Обязательный

Назначаемый сервером идентификатор проверки (check run).

Тело запроса

annotations array Обязательное

Пакет для добавления. Должен содержать от 1 до 25 записей.

annotations[].annotationLevel string Обязательное поле

Уровень важности аннотации. Допустимые значения: notice, warning, failure.

annotations[].message string Обязательное

Текст аннотации. Не должен быть пустым. Максимум 65 535 байт в UTF-8.

annotations[].title string

Название аннотации. Максимальная длина: 255 символов Юникода.

annotations[].rawDetails string

Необработанный подробный текст. Максимум 65 535 байт в UTF-8.

annotations[].location object

Место в исходном коде, на которое указывает аннотация. Не указывайте для аннотации уровня запуска, которая не привязана к строке кода.

annotations[].location.path string Обязательный

Канонический путь к файлу относительно репозитория. Максимум 4 096 байт в UTF-8.

annotations[].location.startLine integer Обязательно

Первая строка диапазона. Нумерация с 1, включительно.

annotations[].location.endLine integer Обязательное

Последняя строка диапазона. Нумерация с 1, включительно; значение должно быть не меньше startLine.

annotations[].location.columns object

Диапазон столбцов в пределах строки. Поддерживается только когда startLine и endLine находятся в одной и той же строке, и оба столбца должны быть переданы вместе.

annotations[].location.columns.startColumn целое число

Первый столбец диапазона. Нумерация с 1, включительно.

annotations[].location.columns.endColumn целое число

Последний столбец диапазона. Нумерация с 1, включительно, и не раньше startColumn.

Поля ответа

annotations array

Аннотации, созданные этим запросом.

annotations[].id string

Стабильный идентификатор аннотации Origin. Идентификаторы можно сортировать по времени.

annotations[].checkRunId string

Идентификатор запуска проверки, к которому относится аннотация.

annotations[].annotationLevel string

Уровень серьёзности аннотации. Допустимые значения: notice, warning, failure.

annotations[].message string

Текст аннотации.

annotations[].title string

Заголовок аннотации. Отсутствует, если у аннотации его нет.

annotations[].rawDetails string

Исходный текст с подробностями. Отсутствует, если у аннотации его нет.

annotations[].createdAt string

Время создания аннотации (RFC 3339).

annotations[].updatedAt string

Время последнего обновления аннотации (RFC 3339).

annotations[].location object

Расположение в исходном коде. Отсутствует для аннотации уровня run.

annotations[].location.path string

Канонический путь к файлу относительно репозитория.

annotations[].location.startLine integer

Первая строка диапазона. Нумерация начинается с 1, значение включительно.

annotations[].location.endLine целое число

Последняя строка диапазона. Нумерация с 1, включительно.

annotations[].location.columns object

Диапазон столбцов. Отсутствует, если аннотация охватывает только одну строку.

annotations[].location.columns.startColumn целое число

Первый столбец диапазона. Нумерация начинается с 1, включительно.

annotations[].location.columns.endColumn целое число

Последний столбец диапазона. Нумерация начинается с 1, значение включено.
curl --request POST \  --url 'https://api.cursor.com/v1/origin/repos/OWNER_SLUG/REPO_NAME/check-runs/CHECK_RUN_ID/annotations' \  --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN' \  --header 'Content-Type: application/json' \  --data '{  "annotations": [    {      "annotationLevel": "warning",      "message": "Deprecated API usage; migrate to the v2 client.",      "title": "Deprecated API",      "location": {        "path": "src/telemetry.ts",        "startLine": 42,        "endLine": 42      }    }  ]}'

Структура ответа:

{  "annotations": [    {      "id": "cra_01k2ja2000e0080000000000v1",      "checkRunId": "cr_01k2ja2000e0080000000000g7",      "annotationLevel": "warning",      "message": "Deprecated API usage; migrate to the v2 client.",      "title": "Deprecated API",      "createdAt": "2026-08-02T14:45:00Z",      "updatedAt": "2026-08-02T14:45:00Z",      "location": {        "path": "src/telemetry.ts",        "startLine": 42,        "endLine": 42      }    }  ]}

Повторный запрос запуска проверки

POST/v1/origin/repos/{ownerSlug}/{repoName}/check-runs/{checkRunId}/rerequest
Scoperepository:contents:writeAuthInstallation tokenUser access token

Запрашивает у приложения, сообщавшего о запуске проверки, его повторный запуск. Origin фиксирует запрос для этого запуска в поле rerequestedAt и уведомляет приложение-владельца событием repository.check_run.rerequested. Приложение отвечает публикацией нового запуска для того же head SHA и key — либо создаёт новый запуск, либо обновляет существующий; это очищает rerequestedAt и сохраняет опубликованный статус. Пока запрос остаётся незавершённым, status запуска имеет значение rerequested; его conclusion и временные метки по-прежнему описывают предыдущую попытку. Вызов возвращает запуск с установленным rerequestedAt и status rerequested.

Запуск должен быть в состоянии completed, иметь isRerequestable, быть текущей попыткой для своего key и находиться на текущей head-ветке открытого pull request. В остальных случаях возвращается FailedPrecondition (HTTP 400).

Для каждого запуска может быть активен только один повторный запрос. Повторный запрос при установленном rerequestedAt возвращает AlreadyExists (HTTP 409 Conflict), а после ответа приложения-владельца запуск снова становится доступен для повторного запроса. Любой субъект с правом repository:contents:write может повторно запросить любой такой запуск независимо от того, какое приложение о нём сообщило. Если checkRunId неизвестен или принадлежит другому репозиторию, возвращается 404.

Параметры пути

ownerSlug string Обязательно

Уникальный слаг владеющей сущности.

repoName строка Обязательно

Имя репозитория, уникальное для сущности-владельца.

checkRunId string Обязательно

Идентификатор запуска проверки, назначаемый сервером (cr_...).

Тело запроса

Запрос не содержит полей. Отправьте пустой JSON object.

Поля ответа

id строка

Идентификатор прогона проверки, назначаемый сервером.

repository объект

Ссылка на репозиторий для запуска.

repository.id строка

Идентификатор репозитория в ссылке на контейнер.

repository.name строка

Имя репозитория в ссылке на контейнер.

repository.owner object

Ссылка на владельца репозитория.

repository.owner.slug string

Слаг владельца в URL, используемый вместе с идентификатором владельца для определения владельца репозитория.

repository.owner.id строка

Идентификатор владельца Origin.

repository.owner.type строка

Тип пространства имён владельца. Только для вывода. Допустимые значения: team, user. Пропускается, если неизвестно.

checkSuite object

Ссылка на содержащий набор проверок.

checkSuite.id string

Идентификатор содержащего набора проверок, назначенный сервером.

sha string

SHA коммита, к которому прикреплён запуск.

key строка

Стабильный логический идентификатор запуска, выбранный приложением; требуемые проверки могут соответствовать приложению, ключу набора и этому ключу.

name string

Имя запуска только для отображения; оно не используется для сопоставления обязательных проверок.

status string

Статус жизненного цикла: queued, in_progress, completed или rerequested. Запуск в состоянии rerequested — это завершённый запуск, для которого запрошен повторный запуск, но приложение-владелец ещё не ответило: считайте его ожидающим и отображайте как queued.

conclusion string

Присутствует для завершённого запуска или запуска с повторным запросом; значения: success, failure, neutral, cancelled, skipped, timed_out, action_required или stale. Для запуска с повторным запросом это вердикт заменённой попытки, поэтому учитывайте его только когда status равен completed.

detailsUrl string

Отдельная ссылка на страницу с полными результатами поставщика.

externalUpdatedAt string

Внешняя метка времени обновления, используемая для упорядочивания обновлений, чтобы устаревшие повторные попытки не могли заменить более новое состояние.

startedAt строка

Время начала в формате RFC 3339, указанное поставщиком, если оно предоставлено.

completedAt string

Время завершения в формате RFC 3339, указанное поставщиком, если указано.

createdAt string

Временная метка создания запуска в формате RFC 3339.

updatedAt string

Метка времени RFC 3339 для последнего сохранённого обновления запуска.

externalId строка

Идентификатор поставщика для одной попытки. Повторно используйте его, чтобы обновить эту попытку, а для повторной попытки используйте новое значение.

actor object

Публичный субъект, выполнивший прогон.

actor.user object

Вариант субъекта — «пользователь». Устанавливается, когда действие выполняет пользователь.

actor.user.id строка

Публичный идентификатор пользователя.

actor.user.email строка

Адрес электронной почты пользователя. Всегда задаётся, когда присутствует вариант user.

actor.user.displayName строка

Отображаемое имя пользователя: имя и фамилия аккаунта, разделённые пробелом — то же имя, которое отображает продукт. Пропускается, если у аккаунта нет имени.

actor.user.handle строка

Идентификатор профиля, указанный пользователем, без префикса @. Присутствует только пока профиль публично видим; в противном случае отсутствует.

actor.app object

Вариант субъекта — «приложение». Устанавливается, когда действие выполняет приложение.

actor.app.id строка

Публичный идентификатор приложения.

actor.app.displayName строка

Отображаемое имя приложения, зарегистрированное при его добавлении. Отсутствует, если приложение не удаётся определить, а также для первого управляемого актёра Cursor.

actor.serviceAccount object

Вариант субъекта — сервисный аккаунт. Устанавливается, когда действие выполнено сервисным аккаунтом.

actor.serviceAccount.id строка

Публичный идентификатор сервисного аккаунта.

output object

Читабельный объект результата, содержащий заголовок, краткое содержание и более развернутый текст, если он предоставлен.

output.title string

Краткий заголовок для вывода. Максимальная длина: 255 символов.

output.summary string

Сводка результатов. Может содержать Markdown. Максимальный размер (UTF-8): 65535 байт.

output.text string

Подробные результаты. Может содержать Markdown. Максимальный размер (UTF-8): 65535 байт.

deadlineAt строка

Срок выполнения для запуска проверки, зафиксированный в виде метки времени RFC 3339. Отсутствует, если у запуска нет срока, в том числе после его завершения.

isRerequestable boolean

Указывает, пометило ли приложение, формирующее отчёт, этот запуск как доступный для повторного запроса.

rerequestedAt строка

Метка времени RFC 3339 незакрытого повторного запроса. Отсутствует, если повторных запросов в ожидании нет, и сбрасывается, когда приложение, которому принадлежит запуск, публикует данные снова. Пока значение задано, status равен rerequested, запуск остаётся в последнем состоянии проверок коммита и читается как ожидающий, а conclusion и временные метки по-прежнему содержат замещённый результат, поэтому обязательная проверка блокирует слияние до ответа приложения.

rerequestedBy object

Principal, запросивший повторный запуск, содержащий те же варианты actor, что и actor. Присутствует всегда, когда задано rerequestedAt, и сбрасывается вместе с ним.
curl --request POST \  --url 'https://api.cursor.com/v1/origin/repos/OWNER_SLUG/REPO_NAME/check-runs/CHECK_RUN_ID/rerequest' \  --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN' \  --header 'Content-Type: application/json' \  --data '{}'

Структура ответа:

{  "id": "cr_01k2ja2000e0080000000000g7",  "repository": {    "id": "repo_01k2ja2000e0080000000000q4",    "name": "rocket",    "owner": {      "slug": "acme",      "id": "ns_01k2ja2000e0080000000000p3",      "type": "team"    }  },  "checkSuite": {    "id": "crg_01k2ja2000e0080000000000h8"  },  "sha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4",  "key": "ci-8842-unit-tests",  "name": "unit-tests",  "status": "rerequested",  "conclusion": "failure",  "detailsUrl": "https://ci.acme.dev/runs/8842",  "externalUpdatedAt": "2026-08-02T14:44:30Z",  "startedAt": "2026-08-02T14:40:00Z",  "completedAt": "2026-08-02T14:44:30Z",  "createdAt": "2026-08-01T09:30:00Z",  "updatedAt": "2026-08-02T15:02:10Z",  "externalId": "run-8842",  "actor": {    "app": {      "id": "app_01k2ja2000e0080000000000a1",      "displayName": "Acme CI"    }  },  "output": {    "title": "Unit tests",    "summary": "3 of 128 tests failed."  },  "isRerequestable": true,  "rerequestedAt": "2026-08-02T15:02:10Z",  "rerequestedBy": {    "user": {      "id": "user_01k2ja2000e0080000000000c3",      "email": "[email protected]"    }  }}

Получить набор проверок

GET/v1/origin/repos/{ownerSlug}/{repoName}/check-suites/{checkSuiteId}
Scoperepository:checks:readAuthInstallation tokenUser access token

Возвращает метаданные набора проверок по идентификатору, назначенному сервером (crg_...). Не включает запуски проверок; для получения запусков этого набора используйте ListCheckRunsForSuite.

Параметры пути

ownerSlug string Обязательное

Уникальный слаг владельца сущности.

repoName string Обязательно

Имя репозитория, уникальное для сущности-владельца.

checkSuiteId строка Обязательно

Идентификатор набора проверок, назначаемый сервером (crg_...).

Поля ответа

id string

Идентификатор набора проверок, назначенный сервером.

repository object

Ссылка на репозиторий для набора.

repository.id строка

Идентификатор репозитория в ссылке на контейнер.

repository.name string

Имя репозитория в ссылке на контейнер.

repository.owner object

Ссылка на владельца репозитория.

repository.owner.slug string

Слаг владельца в URL, используемый вместе с идентификатором владельца для определения владельца репозитория.

repository.owner.id string

Идентификатор владельца Origin.

repository.owner.type string

Тип пространства имён владельца. Только для чтения. Допустимые значения: team, user. Оставляется пустым, если неизвестно.

sha строка

SHA коммита, к которому прикреплён набор проверок.

key string

Стабильный идентификатор обязательной проверки, выбранный приложением. Обязательные проверки сопоставляются по приложению и этому ключу, а не по имени.

name строка

Имя набора только для отображения; оно не используется для сопоставления обязательных проверок.

detailsUrl string

Необязательная ссылка на результаты набора проверок поставщика.

createdAt string

Метка времени создания набора в формате RFC 3339.

updatedAt string

Метка времени RFC 3339 для последнего обновления набора.

externalId string

Идентификатор поставщика для этой попытки набора проверок.

actor object

Публичный участник, создавший комплект.

actor.user object

Вариант субъекта — «пользователь». Устанавливается, когда действие выполнено пользователем.

actor.user.id string

Публичный идентификатор пользователя.

actor.user.email string

Адрес электронной почты пользователя. Всегда задаётся, если присутствует вариант «user».

actor.user.displayName string

Отображаемое имя пользователя: имя и фамилия аккаунта, разделённые пробелом — то же имя, которое отображается в продукте. Не показывается, если у аккаунта нет имени.

actor.user.handle string

Заявленный пользователем идентификатор профиля без префикса @. Присутствует только пока профиль виден публично; в противном случае отсутствует.

actor.app object

Вариант субъекта — «приложение». Устанавливается, когда действие выполнено приложением.

actor.app.id строка

Публичный идентификатор приложения.

actor.app.displayName string

Зарегистрированное отображаемое имя приложения. Пропускается, если приложение не удаётся определить, а также для собственного управляемого актора Cursor.

actor.serviceAccount object

Вариант субъекта — сервисный аккаунт. Устанавливается, когда действие выполнено сервисным аккаунтом.

actor.serviceAccount.id string

Публичный идентификатор для сервисного аккаунта.
curl --request GET \  --url 'https://api.cursor.com/v1/origin/repos/OWNER_SLUG/REPO_NAME/check-suites/CHECK_SUITE_ID' \  --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN'

Структура ответа:

{  "id": "crg_01k2ja2000e0080000000000h8",  "repository": {    "id": "repo_01k2ja2000e0080000000000q4",    "name": "rocket",    "owner": {      "slug": "acme",      "id": "ns_01k2ja2000e0080000000000p3",      "type": "team"    }  },  "sha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4",  "key": "ci-8842",  "name": "CI",  "detailsUrl": "https://ci.acme.dev/runs/8842",  "createdAt": "2026-08-01T09:30:00Z",  "updatedAt": "2026-08-02T14:45:00Z",  "externalId": "build-8842",  "actor": {    "user": {      "id": "user_01k2ja2000e0080000000000c3",      "email": "[email protected]"    }  }}

Список запусков проверок для набора

GET/v1/origin/repos/{ownerSlug}/{repoName}/check-suites/{checkSuiteId}/check-runs
Scoperepository:checks:readAuthInstallation tokenUser access token

Перечисляет текущие запуски проверок набора. Если ключ запуска был указан в наборе более одного раза, возвращается только последняя попытка для этого ключа; замещённые попытки опускаются. Запуск, запрошенный повторно, остаётся в перечислении и отображается как ожидающий: поле status имеет значение rerequested, поле rerequestedAt задано, а его замещённые conclusion и отметки времени остаются без изменений, пока владеющее им приложение не ответит. Просмотреть замещённую попытку по её идентификатору можно с помощью Получить запуск проверки. Поддерживается постраничная навигация.

Параметры пути

ownerSlug string Обязательно

Уникальный slug владеющей сущности.

repoName string Обязательно

Имя репозитория, уникальное для сущности-владельца.

checkSuiteId string Обязательно

Идентификатор набора проверок, назначенный сервером (crg_...).

Параметры запроса

pageSize integer

Максимальное количество возвращаемых запусков проверок. По умолчанию — 30, если не задано или равно 0. Значения выше 100 ограничиваются 100.

pageToken строка

Непрозрачный курсор из поля next_page_token предыдущего ответа. Для первой страницы — пустой. Кодирует идентификатор последнего просмотренного check-run в пределах этого набора (suite), поэтому при передаче токена параметр page_size в последующем запросе игнорируется.

Поля ответа

checkRuns массив

Постраничные прогоны проверок, принадлежащие указанному набору.

checkRuns[].id string

Идентификатор запуска проверки, присвоенный сервером.

checkRuns[].repository объект

Ссылка на репозиторий для запуска.

checkRuns[].repository.id string

Идентификатор репозитория в ссылке на контейнер.

checkRuns[].repository.name string

Имя репозитория в ссылке на контейнер.

checkRuns[].repository.owner object

Ссылка на владельца репозитория.

checkRuns[].repository.owner.slug строка

Слаг владельца в URL, используемый вместе с идентификатором владельца для идентификации владельца репозитория.

checkRuns[].repository.owner.id string

Идентификатор владельца Origin.

checkRuns[].repository.owner.type string

Тип пространства имён владельца. Только для вывода. Допустимые значения: team, user. Пропускается, если неизвестно.

checkRuns[].checkSuite object

Ссылка на содержащий набор проверок.

checkRuns[].checkSuite.id строка

Идентификатор содержащего набора проверок, присвоенный сервером.

checkRuns[].sha строка

SHA коммита, к которому прикреплён запуск.

checkRuns[].key string

Стабильный логический идентификатор запуска, выбранный приложением; обязательные проверки могут совпадать по приложению, ключу набора и этому ключу.

checkRuns[].name строка

Название запуска отображается только для справки и не используется для сопоставления обязательных проверок.

checkRuns[].status строка

Статус жизненного цикла: queued, in_progress, completed или rerequested. Запуск со статусом rerequested — это завершённый запуск, для которого запрошен повторный запуск, но владеющее приложение ещё не ответило: считайте его ожидающим и отображайте как queued.

checkRuns[].conclusion string

Присутствует для завершённого или повторно запрошенного запуска: success, failure, neutral, cancelled, skipped, timed_out, action_required или stale. В случае повторного запроса это вердикт замещённой попытки, поэтому читайте его только когда status равен completed.

checkRuns[].detailsUrl строка

Отдельная ссылка на полную страницу результатов поставщика.

checkRuns[].externalUpdatedAt строка

Внешняя метка времени обновления, используемая для упорядочивания обновлений, чтобы устаревшие повторные попытки не могли заменить более новое состояние.

checkRuns[].startedAt строка

Время начала в формате RFC 3339, сообщённое поставщиком, если указано.

checkRuns[].completedAt строка

Время завершения в формате RFC 3339, указанное поставщиком, если предоставлено.

checkRuns[].createdAt string

Отметка времени создания запуска в формате RFC 3339.

checkRuns[].updatedAt строка

Метка времени в формате RFC 3339 для последнего сохранённого обновления запуска.

checkRuns[].externalId string

Идентификатор провайдера для одной попытки. Повторно используйте его, чтобы обновить эту попытку, а для повтора используйте новое значение.

checkRuns[].actor object

Публичный участник, выполнивший прогон.

checkRuns[].actor.user object

Пользовательский вариант субъекта. Устанавливается, когда действие выполнено пользователем.

checkRuns[].actor.user.id string

Публичный идентификатор пользователя.

checkRuns[].actor.user.email string

Адрес электронной почты пользователя. Всегда задаётся, если присутствует вариант пользователя.

checkRuns[].actor.user.displayName string

Отображаемое имя пользователя: имя и фамилия аккаунта, разделённые пробелом — то же имя, что отображает продукт. Опускается, если у аккаунта нет имени.

checkRuns[].actor.user.handle строка

Идентификатор профиля, указанный пользователем, без префикса @. Отображается только тогда, когда профиль публично доступен; в противном случае опускается.

checkRuns[].actor.app object

Вариант субъекта — приложение. Устанавливается, когда действие выполнено приложением.

checkRuns[].actor.app.id строка

Публичный идентификатор приложения.

checkRuns[].actor.app.displayName строка

Зарегистрированное отображаемое имя приложения. Опускается, если приложение не удаётся определить, а также для управляемого Cursor первого лица (first-party) актора.

checkRuns[].actor.serviceAccount object

Вариант субъекта — сервисный аккаунт. Устанавливается, когда действие выполнено сервисным аккаунтом.

checkRuns[].actor.serviceAccount.id string

Публичный идентификатор служебной учётной записи.

checkRuns[].output object

Человеко-понятный объект результата, содержащий заголовок, краткое содержание и более полный текст, если он предоставлен.

checkRuns[].output.title строка

Краткий заголовок для вывода. Максимальная длина: 255 символов.

checkRuns[].output.summary string

Сводка результатов. Может содержать Markdown. Максимальный размер (UTF-8): 65535 байт.

checkRuns[].output.text string

Подробный вывод. Может содержать Markdown. Максимальный размер в UTF-8: 65535 байт.

checkRuns[].deadlineAt строка

Срок, зафиксированный для прогона проверки, в виде метки времени RFC 3339. Отсутствует, если у прогона нет срока, в том числе после его завершения.

checkRuns[].isRerequestable логическое

Указало ли приложение, сообщившее об этом запуске, что его можно запросить повторно.

checkRuns[].rerequestedAt string

Метка времени RFC 3339 для ожидающего повторного запроса. Отсутствует, если повторный запрос не ожидается, и сбрасывается, когда приложение‑владелец запуска снова публикует результат. Пока она задана, status имеет значение rerequested, запуск остаётся в последнем состоянии проверок коммита и отображается как ожидающий, при этом conclusion и тайминги по‑прежнему содержат устаревший результат, поэтому обязательная проверка блокирует слияние, пока приложение не ответит.

checkRuns[].rerequestedBy object

Субъект, запросивший повторный запуск, с теми же вариантами актёра, что и actor. Присутствует, когда установлено rerequestedAt, и очищается вместе с ним.

nextPageToken строка

Непрозрачный курсор для следующей страницы; пустой, если следующих страниц нет.
curl --request GET \  --url 'https://api.cursor.com/v1/origin/repos/OWNER_SLUG/REPO_NAME/check-suites/CHECK_SUITE_ID/check-runs' \  --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN'

Структура ответа:

{  "checkRuns": [    {      "id": "cr_01k2ja2000e0080000000000g7",      "repository": {        "id": "repo_01k2ja2000e0080000000000q4",        "name": "rocket",        "owner": {          "slug": "acme",          "id": "ns_01k2ja2000e0080000000000p3",          "type": "team"        }      },      "checkSuite": {        "id": "crg_01k2ja2000e0080000000000h8"      },      "sha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4",      "key": "ci-8842-unit-tests",      "name": "unit-tests",      "status": "completed",      "conclusion": "success",      "detailsUrl": "https://ci.acme.dev/runs/8842",      "externalUpdatedAt": "2026-08-02T14:44:30Z",      "startedAt": "2026-08-02T14:40:00Z",      "completedAt": "2026-08-02T14:44:30Z",      "createdAt": "2026-08-01T09:30:00Z",      "updatedAt": "2026-08-02T14:45:00Z",      "externalId": "run-8842",      "actor": {        "user": {          "id": "user_01k2ja2000e0080000000000c3",          "email": "[email protected]"        }      },      "output": {        "title": "Unit tests",        "summary": "128 tests passed.",        "text": "All suites green."      }    }  ]}

Список запусков проверок для коммита

GET/v1/origin/repos/{ownerSlug}/{repoName}/commits/{sha}/check-runs
Scoperepository:checks:readAuthInstallation tokenUser access token

Перечисляет текущие запуски проверок для коммита по всем наборам: только запуски, принадлежащие последней попытке каждого набора, и внутри каждого набора — только последнюю попытку для каждого ключа запуска. Заменённые попытки опущены. Повторно запрошенный запуск остаётся в списке и отображается как ожидающий, при этом status равен rerequested, задано rerequestedAt, а его заменённые conclusion и временные метки остаются без изменений, пока приложение-владелец не ответит. Получить заменённую попытку по её собственному идентификатору можно с помощью Get Check Run. Опционально фильтруется по имени проверки и статусу. Поддерживается постраничная навигация.

Фильтры применяются к свернутому набору, поэтому запуск соответствует по статусу его последней попытки, и фильтр никогда не возвращает вытесненную попытку. Токены страниц содержат фильтры, при которых они были созданы, поэтому токен, воспроизведённый с другими фильтрами, отклоняется; при изменении фильтра начните пагинацию заново.

Параметры пути

ownerSlug string Обязательно

Уникальный слаг владеющей сущности.

repoName string Обязательно

Имя репозитория, уникальное в пределах сущности-владельца.

sha string Обязательно

SHA коммита (40- или 64-символьный шестнадцатеричный) для перечисления check runs.

Параметры запроса

pageSize целое число

Максимальное число возвращаемых запусков проверок. По умолчанию — 30, если не задано или равно 0. Значения свыше 100 ограничиваются до 100.

pageToken строка

Непрозрачный курсор из next_page_token предыдущего ответа. Для первой страницы — пустой. Кодирует идентификатор последнего увиденного check-run, привязанный к этому коммиту и к приведённым ниже фильтрам; поэтому при наличии токена параметр page_size в последующем запросе игнорируется, а повторное использование токена с другими фильтрами возвращает ошибку InvalidArgument (HTTP 400).

checkName string

Необязательный фильтр по точному имени проверки (check-run), сопоставляемый с checkRuns[].name. Оставьте пустым, чтобы перечислить запуски с любым именем.

status string

Необязательный фильтр по статусу. Допустимые значения: queued, in_progress, completed, rerequested. Любое другое значение возвращает InvalidArgument (HTTP 400). Опустите, чтобы получить список запусков в любом статусе.

Поля ответа

checkRuns массив

Постраничные запуски проверок, прикреплённые к указанному SHA коммита.

checkRuns[].id string

Идентификатор запуска проверки, назначаемый сервером.

checkRuns[].repository object

Ссылка на репозиторий для запуска.

checkRuns[].repository.id string

Идентификатор репозитория в ссылке на контейнер.

checkRuns[].repository.name string

Имя репозитория в ссылке на контейнер.

checkRuns[].repository.owner object

Ссылка на владельца репозитория.

checkRuns[].repository.owner.slug string

Слаг владельца, отображаемый в URL, используемый вместе с идентификатором владельца для идентификации владельца репозитория.

checkRuns[].repository.owner.id string

Идентификатор владельца Origin.

checkRuns[].repository.owner.type строка

Тип пространства имён владельца. Только для вывода. Допустимые значения: team, user. Пропускается, если неизвестно.

checkRuns[].checkSuite object

Ссылка на содержащий набор проверок.

checkRuns[].checkSuite.id string

Идентификатор содержащего набора проверок, назначенный сервером.

checkRuns[].sha string

SHA коммита, к которому прикреплён запуск.

checkRuns[].key string

Стабильный логический идентификатор запуска, выбранный приложением; обязательные проверки могут соответствовать приложению, ключу набора и этому ключу.

checkRuns[].name string

Имя запуска только для отображения; оно не используется для сопоставления обязательных проверок.

checkRuns[].status string

Статус жизненного цикла: queued, in_progress, completed или rerequested. Запуск в статусе rerequested — это завершённый запуск, для которого запросили повторный прогон, но владеющее приложение ещё не ответило: считайте его ожидающим и отображайте так же, как queued.

checkRuns[].conclusion string

Присутствует для завершённого или повторно запрошенного прогона: success, failure, neutral, cancelled, skipped, timed_out, action_required или stale. Для повторно запрошенного прогона это решение вытеснённой попытки, поэтому читайте его только когда status равен completed.

checkRuns[].detailsUrl string

Отдельная ссылка на страницу с полными результатами поставщика.

checkRuns[].externalUpdatedAt string

Внешняя отметка времени обновления используется для упорядочивания обновлений, чтобы устаревшие повторные попытки не могли заменить более новое состояние.

checkRuns[].startedAt string

Время начала в формате RFC 3339, указанное поставщиком, если предоставлено.

checkRuns[].completedAt string

Время завершения в формате RFC 3339, указанное поставщиком, если оно предоставлено.

checkRuns[].createdAt string

Временная метка создания запуска в формате RFC 3339.

checkRuns[].updatedAt string

Временная метка RFC 3339 для последнего сохранённого обновления выполнения.

checkRuns[].externalId string

Идентификатор поставщика для одной попытки. Повторно используйте его, чтобы обновить эту попытку, и используйте новое значение для повторной попытки.

checkRuns[].actor object

Публичный участник, создавший запуск.

checkRuns[].actor.user object

Вариант субъекта — пользователь. Устанавливается, когда действие выполняет пользователь.

checkRuns[].actor.user.id string

Публичный идентификатор пользователя.

checkRuns[].actor.user.email строка

Адрес электронной почты пользователя. Всегда задан, если присутствует вариант user.

checkRuns[].actor.user.displayName string

Отображаемое имя пользователя: имя и фамилия аккаунта, разделённые пробелом — то же имя, что и отображается в продукте. Не выводится, если у аккаунта нет имени.

checkRuns[].actor.user.handle string

Заявленный псевдоним профиля пользователя без префикса @. Показывается только пока профиль общедоступен; в противном случае отсутствует.

checkRuns[].actor.app object

Вариант актёра — приложение. Устанавливается, когда действие выполняет приложение.

checkRuns[].actor.app.id строка

Публичный идентификатор приложения.

checkRuns[].actor.app.displayName string

Отображаемое имя приложения, указанное при регистрации. Пропускается, если приложение не удаётся определить, а также для управляемого first-party актёра Cursor.

checkRuns[].actor.serviceAccount object

Вариант субъекта — сервисный аккаунт. Устанавливается, когда действие выполнено сервисным аккаунтом.

checkRuns[].actor.serviceAccount.id строка

Публичный идентификатор для сервисного аккаунта.

checkRuns[].output object

Читаемый человеком объект результата, содержащий заголовок, краткое содержание и более подробный текст, если он предоставлен.

checkRuns[].output.title string

Краткий заголовок для вывода. Максимальная длина: 255 символов.

checkRuns[].output.summary строка

Сводка результатов. Может содержать Markdown. Максимальный размер (UTF-8): 65535 байт.

checkRuns[].output.text строка

Подробные результаты. Могут содержать Markdown. Максимальный размер в UTF-8: 65535 байт.

checkRuns[].deadlineAt string

Крайний срок, зафиксированный для прогона проверки, в виде метки времени RFC 3339. Отсутствует, если у прогона нет крайнего срока, в том числе после его завершения.

checkRuns[].isRerequestable boolean

Указало ли приложение отчёта, что этот запуск можно запросить повторно.

checkRuns[].rerequestedAt string

Метка времени RFC 3339 для ожидаемого повторного запроса. Отсутствует, если повторный запрос не ожидается, и очищается, когда приложение, владеющее запуском, публикует снова. Пока она установлена, status равен rerequested, а запуск остаётся в последнем состоянии проверок коммита и отображается как ожидающий, при этом conclusion и временные метки всё ещё содержат вытесненный результат, поэтому требуемая проверка блокирует слияние до ответа приложения.

checkRuns[].rerequestedBy object

Субъект, запросивший повторный запуск, содержащий те же варианты актёра, что и actor. Присутствует, когда задано rerequestedAt, и сбрасывается вместе с ним.

nextPageToken строка

Непрозрачный курсор для следующей страницы; пустой, когда других страниц нет.
curl --request GET \  --url 'https://api.cursor.com/v1/origin/repos/OWNER_SLUG/REPO_NAME/commits/SHA/check-runs' \  --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN'

Структура ответа:

{  "checkRuns": [    {      "id": "cr_01k2ja2000e0080000000000g7",      "repository": {        "id": "repo_01k2ja2000e0080000000000q4",        "name": "rocket",        "owner": {          "slug": "acme",          "id": "ns_01k2ja2000e0080000000000p3",          "type": "team"        }      },      "checkSuite": {        "id": "crg_01k2ja2000e0080000000000h8"      },      "sha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4",      "key": "ci-8842-unit-tests",      "name": "unit-tests",      "status": "completed",      "conclusion": "success",      "detailsUrl": "https://ci.acme.dev/runs/8842",      "externalUpdatedAt": "2026-08-02T14:44:30Z",      "startedAt": "2026-08-02T14:40:00Z",      "completedAt": "2026-08-02T14:44:30Z",      "createdAt": "2026-08-01T09:30:00Z",      "updatedAt": "2026-08-02T14:45:00Z",      "externalId": "run-8842",      "actor": {        "user": {          "id": "user_01k2ja2000e0080000000000c3",          "email": "[email protected]"        }      },      "output": {        "title": "Unit tests",        "summary": "128 tests passed.",        "text": "All suites green."      }    }  ]}

Список наборов проверок для коммита

GET/v1/origin/repos/{ownerSlug}/{repoName}/commits/{sha}/check-suites
Scoperepository:checks:readAuthInstallation tokenUser access token

Возвращает список наборов проверок для коммита. Возвращается только последняя попытка каждого набора — по каждому отчитывающемуся субъекту и ключу набора; замещённые попытки не включаются. Замещённую попытку можно прочитать по её собственному идентификатору через Get Check Suite. Возвращает только метаданные набора (без вложенных запусков). Поддерживает пагинацию.

Параметры пути

ownerSlug string Обязательное

Уникальный слаг владельца сущности.

repoName строка Обязательно

Имя репозитория, уникальное для сущности-владельца.

sha string Обязательно

SHA коммита (40- или 64-символьное шестнадцатеричное значение), для которого нужно перечислить наборы.

Параметры запроса

pageSize integer

Максимальное число возвращаемых наборов. По умолчанию — 30, если не установлено или равно 0. Значения выше 100 ограничиваются до 100.

pageToken строка

Непрозрачный курсор из поля next_page_token предыдущего ответа. Для первой страницы пустой. Кодирует идентификатор последнего встреченного check-suite, относящийся к этому коммиту, поэтому при наличии токена параметр page_size в последующем запросе игнорируется.

Поля ответа

checkSuites массив

Постраничные наборы проверок, прикреплённые к разрешённому SHA коммита.

checkSuites[].id string

Идентификатор набора проверок, назначаемый сервером.

checkSuites[].repository object

Ссылка на репозиторий для набора.

checkSuites[].repository.id string

Идентификатор репозитория в ссылке на контейнер.

checkSuites[].repository.name string

Имя репозитория в ссылке на контейнер.

checkSuites[].repository.owner object

Ссылка на владельца репозитория.

checkSuites[].repository.owner.slug строка

Слаг владельца в URL, используемый вместе с идентификатором владельца для идентификации владельца репозитория.

checkSuites[].repository.owner.id string

Идентификатор владельца Origin.

checkSuites[].repository.owner.type string

Тип пространства имён владельца. Только для чтения. Допустимые значения: team, user. Не указывается, если неизвестно.

checkSuites[].sha строка

SHA коммита, к которому прикреплён набор тестов.

checkSuites[].key string

Стабильный идентификатор обязательной проверки, выбранный приложением. Обязательные проверки сопоставляются по приложению и этому ключу, а не по имени.

checkSuites[].name строка

Название набора только для отображения; оно не используется для сопоставления обязательных проверок.

checkSuites[].detailsUrl string

Необязательная ссылка на результаты набора тестов поставщика.

checkSuites[].createdAt string

Отметка времени создания набора в формате RFC 3339.

checkSuites[].updatedAt string

Временная метка RFC 3339 для последнего обновления набора.

checkSuites[].externalId строка

Идентификатор поставщика для этой попытки набора.

checkSuites[].actor object

Публичный субъект, создавший набор.

checkSuites[].actor.user object

Вариант субъекта. Устанавливается, когда действие выполняет пользователь.

checkSuites[].actor.user.id строка

Публичный идентификатор пользователя.

checkSuites[].actor.user.email string

Адрес электронной почты пользователя. Всегда задаётся, когда присутствует вариант пользователя.

checkSuites[].actor.user.displayName string

Отображаемое имя пользователя: имя и фамилия аккаунта, разделённые пробелом — то же имя, которое отображает продукт. Не указывается, если у аккаунта нет имени.

checkSuites[].actor.user.handle string

Указанный пользователем хэндл профиля без префикса @. Присутствует только когда профиль общедоступен; в противном случае отсутствует.

checkSuites[].actor.app object

Вариант субъекта — приложение. Устанавливается, когда действие выполняет приложение.

checkSuites[].actor.app.id string

Публичный идентификатор приложения.

checkSuites[].actor.app.displayName string

Зарегистрированное отображаемое имя приложения. Не указывается, если приложение не удаётся разрешить, а также для управляемого актора первой стороны Cursor.

checkSuites[].actor.serviceAccount object

Вариант субъекта — сервисный аккаунт. Устанавливается, когда действие выполнено сервисным аккаунтом.

checkSuites[].actor.serviceAccount.id string

Публичный идентификатор сервисного аккаунта.

nextPageToken строка

Непрозрачный курсор для следующей страницы; пустой, если страниц больше нет.
curl --request GET \  --url 'https://api.cursor.com/v1/origin/repos/OWNER_SLUG/REPO_NAME/commits/SHA/check-suites' \  --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN'

Структура ответа:

{  "checkSuites": [    {      "id": "crg_01k2ja2000e0080000000000h8",      "repository": {        "id": "repo_01k2ja2000e0080000000000q4",        "name": "rocket",        "owner": {          "slug": "acme",          "id": "ns_01k2ja2000e0080000000000p3",          "type": "team"        }      },      "sha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4",      "key": "ci-8842",      "name": "CI",      "detailsUrl": "https://ci.acme.dev/runs/8842",      "createdAt": "2026-08-01T09:30:00Z",      "updatedAt": "2026-08-02T14:45:00Z",      "externalId": "build-8842",      "actor": {        "user": {          "id": "user_01k2ja2000e0080000000000c3",          "email": "[email protected]"        }      }    }  ]}

Коммиты и содержимое

Коммит отделяет метаданные Git-объекта в commit от связей репозитория верхнего уровня. В ответах со списками отсутствует stats; Get Commit включает сводную stats для всего коммита. Изменённые файлы возвращаются только в поддерживающей пагинацию коллекции List Commit Files. author и committer — это Git-идентификаторы, записанные в коммите, а не объекты пользователей Origin.

Сравнение содержит только сводную информацию: в него никогда не включаются списки коммитов или диффы файлов. status имеет строго одно из значений: identical, ahead, behind или diverged; aheadBy и behindBy — это количество коммитов. baseCommit, headCommit и mergeBaseCommit используют сокращённое представление коммита (без stats и файлов).

Список коммитов

GET/v1/origin/repos/{ownerSlug}/{repoName}/commits
Scoperepository:contents:readAuthInstallation tokenUser access token

Перечисляет коммиты в ветке или начиная с указанной ссылки.

В результатах списка отсутствует stats. Используйте Get Commit для получения сводной статистики и List Commit Files для постраничного получения диффа файлов.

Параметры пути

ownerSlug строка Обязательно

Уникальный слаг владеющей сущности.

repoName строка Обязательно

Имя репозитория, уникальное для сущности-владельца.

Параметры запроса

sha строка

SHA, ветка, тег или символическая ссылка (например, HEAD), с которой начинать перечисление. Пустое значение означает ветку по умолчанию репозитория.

pageSize целое число

Максимальное число коммитов для возврата. По умолчанию 30, если не задано или равно 0. Значения выше 100 ограничиваются 100.

pageToken строка

Непрозрачный курсор из next_page_token предыдущего ответа. Для первой страницы пуст. Кодирует начальный ref и страницу, поэтому при наличии токена значения sha/page_size в последующем запросе игнорируются.

Поля ответа

commits массив

Свернутые коммиты без статистики; изменённые файлы не встроены.

commits[].sha строка

Полный SHA коммита.

commits[].commit object

Метаданные объекта Git, вложенные отдельно от отношений репозитория верхнего уровня.

commits[].commit.author object

Идентификатор автора Git, записанный в коммите, а не объект пользователя Origin.

commits[].commit.author.name строка

Имя, указанное в идентификации автора Git.

commits[].commit.author.email строка

Адрес электронной почты, указанный в идентификаторе автора Git.

commits[].commit.author.date строка

Дата в формате RFC 3339, указанная в идентификаторе автора Git.

commits[].commit.committer object

Идентификатор коммитера Git, записанный в коммите, а не объект пользователя Origin.

commits[].commit.committer.name строка

Имя, указанное в идентификации Git.

commits[].commit.committer.email строка

Электронная почта, указанная в идентичности Git.

commits[].commit.committer.date строка

Метка времени в формате ISO-8601, сохраняющая исходное смещение часового пояса подписи Git (например, "2014-11-07T22:01:45+01:00").

commits[].commit.message строка

Сообщение коммита.

commits[].commit.tree object

Дерево, на которое ссылается коммит.

commits[].commit.tree.sha строка

SHA дерева, на которое ссылается коммит.

commits[].parents массив

Ссылки на родительские коммиты, каждая содержит SHA.

commits[].parents[].sha строка

SHA родительского коммита.

nextPageToken строка

Непрозрачный курсор для следующей страницы; пустой, если страниц больше нет.
curl --request GET \  --url 'https://api.cursor.com/v1/origin/repos/OWNER_SLUG/REPO_NAME/commits' \  --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN'

Структура ответа:

{  "commits": [    {      "sha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4",      "commit": {        "author": {          "name": "Jane Doe",          "email": "[email protected]",          "date": "2026-08-01T09:30:00Z"        },        "committer": {          "name": "Jane Doe",          "email": "[email protected]",          "date": "2026-08-01T09:30:00Z"        },        "message": "Add launch telemetry",        "tree": {          "sha": "a7b6c5d4e3f2a1b0c9d8e7f6a5b4c3d2e1f0a9b8"        }      },      "parents": [        {          "sha": "3b1f9c2d8a7e6f5049c8b7a6d5e4f3a2b1c0d9e8"        }      ],      "stats": {        "additions": 128,        "deletions": 46,        "total": 174      }    }  ]}

Получить коммит

GET/v1/origin/repos/{ownerSlug}/{repoName}/commits/{sha}
Scoperepository:contents:readAuthInstallation tokenUser access token

Возвращает один коммит по SHA или ссылке (ref) с агрегированной статистикой всего коммита stats. Изменённые файлы не включены; используйте Список файлов коммита.

author и committer — это идентичности Git, записанные в коммите, а не объекты пользователей Origin.

Параметры пути

ownerSlug строка Обязательно

Уникальный слаг владельца сущности.

repoName строка Обязательно

Имя репозитория, уникальное для сущности-владельца.

sha строка Обязательно

SHA, ветка, тег или символическая ссылка (например, HEAD) коммита для получения.

Поля ответа

sha строка

Полный SHA коммита.

commit object

Метаданные Git-объекта, вложенные отдельно от верхнеуровневых связей репозитория.

commit.author object

Идентификационные данные автора Git записаны в коммите, а не являются объектом пользователя Origin.

commit.author.name строка

Имя, указанное в идентификаторе автора Git.

commit.author.email строка

Адрес электронной почты, указанный в идентификаторе автора Git.

commit.author.date строка

Дата в формате RFC 3339, указанная в идентификаторе автора Git.

commit.committer object

Идентификатор коммиттера Git записан в коммите, а не является объектом пользователя Origin.

commit.committer.name строка

Имя, указанное в идентификации Git.

commit.committer.email строка

Адрес электронной почты, указанный в идентификаторе Git.

commit.committer.date строка

Метка времени в формате ISO-8601, сохраняющая исходное смещение часового пояса подписи git (например, "2014-11-07T22:01:45+01:00").

commit.message строка

Сообщение коммита.

commit.tree object

Дерево, на которое ссылается коммит.

commit.tree.sha строка

SHA дерева, на которое ссылается коммит.

parents массив

Ссылки на родительские коммиты, каждая из которых содержит SHA.

parents[].sha строка

SHA родительского коммита.

stats object

Суммарные добавления, удаления и итог по всему коммиту; включается в get-commit и исключается из проекций списка.

stats.additions целое число

Общее количество добавленных строк в коммите.

stats.deletions целое число

Общее количество удалённых строк в коммите.

stats.total целое число

Суммарное количество добавлений и удалений в коммите.
curl --request GET \  --url 'https://api.cursor.com/v1/origin/repos/OWNER_SLUG/REPO_NAME/commits/SHA' \  --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN'

Структура ответа:

{  "sha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4",  "commit": {    "author": {      "name": "Jane Doe",      "email": "[email protected]",      "date": "2026-08-01T09:30:00Z"    },    "committer": {      "name": "Jane Doe",      "email": "[email protected]",      "date": "2026-08-01T09:30:00Z"    },    "message": "Add launch telemetry",    "tree": {      "sha": "a7b6c5d4e3f2a1b0c9d8e7f6a5b4c3d2e1f0a9b8"    }  },  "parents": [    {      "sha": "3b1f9c2d8a7e6f5049c8b7a6d5e4f3a2b1c0d9e8"    }  ],  "stats": {    "additions": 128,    "deletions": 46,    "total": 174  }}

Список файлов коммита

GET/v1/origin/repos/{ownerSlug}/{repoName}/commits/{sha}/files
Scoperepository:contents:readAuthInstallation tokenUser access token

Возвращает список файлов, изменённых коммитом.

sha может быть SHA коммита, веткой, тегом или символической ссылкой, например HEAD. По умолчанию возвращаются 30 файлов, максимум — 100. Токен страницы фиксирует разрешённый коммит, размер страницы и курсор по файлам; в последующих запросах sha и pageSize должны совпадать с токеном. Для каждого файла указываются filename, status, additions, deletions, changes, patch и previousFilename, если файл был переименован или скопирован. Для бинарных файлов patch пуст.

Параметры пути

ownerSlug строка Обязательно

Уникальный слаг сущности-владельца.

repoName строка Обязательно

Имя репозитория, уникальное для сущности-владельца.

sha строка Обязательно

SHA, ветка, тег или символьная ссылка (например, HEAD) коммита, файлы которого нужно перечислить.

Параметры запроса

pageSize integer

Максимальное число возвращаемых изменённых файлов. По умолчанию — 30, если не указано или равно 0. Значения выше 100 ограничиваются 100.

pageToken строка

Непрозрачный курсор из поля next_page_token предыдущего ответа. Пуст для первой страницы. Токен фиксирует выбранный коммит, размер страницы и позицию курсора файла, поэтому параметры sha и page_size в последующем запросе должны соответствовать токену.

Поля ответа

files массив

Изменённые файлы с постраничной навигацией: имя файла, статус, количество строк, патч и previousFilename для переименованных или скопированных файлов. Для бинарных патчей поле пустое.

files[].filename строка

Путь к изменённому файлу.

files[].status строка

Статус изменения: добавлен, удалён, изменён, переименован или скопирован.

files[].additions integer

Добавлено количество строк в файле.

files[].deletions integer

Количество удалённых строк в файле.

files[].changes integer

Общее количество изменённых строк в файле.

files[].patch строка

Унифицированный патч; для бинарных файлов пусто.

files[].previousFilename строка

Предыдущий путь при переименовании или копировании файла.

nextPageToken строка

Токен фиксирует выбранный коммит, размер страницы и курсор файла; последующие значения sha и pageSize должны соответствовать ему.
curl --request GET \  --url 'https://api.cursor.com/v1/origin/repos/OWNER_SLUG/REPO_NAME/commits/SHA/files' \  --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN'

Структура ответа:

{  "files": [    {      "filename": "src/telemetry.ts",      "status": "modified",      "additions": 6,      "deletions": 3,      "changes": 9,      "patch": "@@ -12,6 +12,9 @@\n import { ignite } from \"./ignition\";\n+import { emitLaunchTelemetry } from \"./telemetry\";\n"    }  ]}

Сравнение коммитов

GET/v1/origin/repos/{ownerSlug}/{repoName}/compare/{basehead}
Scoperepository:contents:readAuthInstallation tokenUser access token

Сравнивает коммиты, refs или теги относительно их базы слияния. basehead имеет вид "{base}...{head}"; refs, содержащие "/", должны указываться по их SHA.

base и head могут быть SHA, веткой, тегом или символической ссылкой, такой как HEAD. Ответ — непагинированная сводка: status принимает значения identical, ahead, behind или diverged; три объекта коммита являются разреженными и не содержат stats и файлов. Поля totalCommits, вложенные commits и files не возвращаются. Для несвязанных историй возвращается 404.

Параметры пути

ownerSlug строка Обязательно

Уникальный слаг владеющей сущности.

repoName строка Обязательно

Имя репозитория, уникальное для сущности-владельца.

basehead строка Обязательно

"{base}...{head}", где любая из ревизий может быть SHA, веткой, тегом или символической ссылкой (например, HEAD).

Поля ответа

status строка

Состояние сравнения: полностью идентичны, впереди, отстает или разошлись.

aheadBy целое число

Число коммитов, на которое ветка head опережает базовую.

behindBy целое число

Количество коммитов, на которое ветка head отстаёт.

baseCommit object

Разреженный разрешённый базовый коммит без статистики и файлов.

baseCommit.sha строка

Полный SHA коммита.

baseCommit.commit object

Метаданные git-объекта вложены отдельно от верхнеуровневых связей репозитория.

baseCommit.commit.author object

Данные об авторе Git записаны в коммите, а не как объект пользователя Origin.

baseCommit.commit.author.name строка

Имя, указанное в идентификационных данных автора Git.

baseCommit.commit.author.email строка

Адрес электронной почты, указанный в идентичности автора Git.

baseCommit.commit.author.date строка

Дата в формате RFC 3339, указанная в идентификаторе автора Git.

baseCommit.commit.committer object

Идентификатор коммиттера Git, записанный в коммите, а не объект пользователя Origin.

baseCommit.commit.committer.name строка

Имя, указанное в идентификаторе Git.

baseCommit.commit.committer.email строка

Электронная почта, указанная в идентификаторе Git.

baseCommit.commit.committer.date строка

Метка времени в формате ISO-8601, сохраняющая исходное смещение часового пояса подписи git (например, "2014-11-07T22:01:45+01:00").

baseCommit.commit.message строка

Сообщение коммита.

baseCommit.commit.tree object

Дерево, на которое ссылается коммит.

baseCommit.commit.tree.sha строка

SHA дерева, на которое ссылается коммит.

baseCommit.parents массив

Ссылки на родительские коммиты, каждая из которых содержит SHA.

baseCommit.parents[].sha строка

SHA родительского коммита.

headCommit object

Разрешённый неполный коммит head'а без статистики и файлов.

headCommit.sha строка

Полный SHA коммита.

headCommit.commit object

Метаданные git-объекта вложены отдельно от верхнеуровневых связей репозитория.

headCommit.commit.author object

Данные об авторе Git записаны в коммите, а не как объект пользователя Origin.

headCommit.commit.author.name строка

Имя, указанное в идентификационных данных автора Git.

headCommit.commit.author.email строка

Адрес электронной почты, указанный в идентичности автора Git.

headCommit.commit.author.date строка

Дата в формате RFC 3339, указанная в идентификаторе автора Git.

headCommit.commit.committer object

Идентификатор коммиттера Git, записанный в коммите, а не объект пользователя Origin.

headCommit.commit.committer.name строка

Имя, указанное в идентификации Git.

headCommit.commit.committer.email строка

Электронная почта, указанная в идентичности Git.

headCommit.commit.committer.date строка

Метка времени в формате ISO-8601, сохраняющая исходное смещение часового пояса подписи git (например, "2014-11-07T22:01:45+01:00").

headCommit.commit.message строка

Сообщение коммита.

headCommit.commit.tree объект

Дерево, на которое ссылается коммит.

headCommit.commit.tree.sha строка

SHA дерева, на которое ссылается коммит.

headCommit.parents массив

Ссылки на родительские коммиты, каждая из которых содержит SHA.

headCommit.parents[].sha строка

SHA родительского коммита.

mergeBaseCommit object

Спарс-коммит базы слияния без статистики и файлов.

mergeBaseCommit.sha строка

Полный SHA коммита.

mergeBaseCommit.commit object

Метаданные git-объекта вложены отдельно от верхнеуровневых связей репозитория.

mergeBaseCommit.commit.author object

Данные об авторе Git записаны в коммите, а не как объект пользователя Origin.

mergeBaseCommit.commit.author.name строка

Имя, указанное в идентификационных данных автора Git.

mergeBaseCommit.commit.author.email строка

Адрес электронной почты, указанный в идентичности автора Git.

mergeBaseCommit.commit.author.date строка

Дата в формате RFC 3339, указанная в идентификаторе автора Git.

mergeBaseCommit.commit.committer object

Идентификатор автора коммита Git, записанный в самом коммите, а не объект пользователя Origin.

mergeBaseCommit.commit.committer.name строка

Имя, указанное в идентификации Git.

mergeBaseCommit.commit.committer.email строка

Электронная почта, указанная в идентификаторе Git.

mergeBaseCommit.commit.committer.date строка

Метка времени в формате ISO-8601, сохраняющая исходное смещение часового пояса подписи git (например, "2014-11-07T22:01:45+01:00").

mergeBaseCommit.commit.message строка

Сообщение коммита.

mergeBaseCommit.commit.tree object

Дерево, на которое ссылается коммит.

mergeBaseCommit.commit.tree.sha строка

SHA дерева, на которое ссылается коммит.

mergeBaseCommit.parents массив

Ссылки на родительские коммиты, каждая из которых содержит SHA.

mergeBaseCommit.parents[].sha строка

SHA родительского коммита.
curl --request GET \  --url 'https://api.cursor.com/v1/origin/repos/OWNER_SLUG/REPO_NAME/compare/BASE...HEAD' \  --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN'

Структура ответа:

{  "status": "ahead",  "aheadBy": 2,  "behindBy": 0,  "baseCommit": {    "sha": "3b1f9c2d8a7e6f5049c8b7a6d5e4f3a2b1c0d9e8",    "commit": {      "author": {        "name": "Jane Doe",        "email": "[email protected]",        "date": "2026-08-01T09:30:00Z"      },      "committer": {        "name": "Jane Doe",        "email": "[email protected]",        "date": "2026-08-01T09:30:00Z"      },      "message": "Add launch telemetry",      "tree": {        "sha": "a7b6c5d4e3f2a1b0c9d8e7f6a5b4c3d2e1f0a9b8"      }    },    "parents": [      {        "sha": "3b1f9c2d8a7e6f5049c8b7a6d5e4f3a2b1c0d9e8"      }    ],    "stats": {      "additions": 128,      "deletions": 46,      "total": 174    }  },  "headCommit": {    "sha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4",    "commit": {      "author": {        "name": "Jane Doe",        "email": "[email protected]",        "date": "2026-08-01T09:30:00Z"      },      "committer": {        "name": "Jane Doe",        "email": "[email protected]",        "date": "2026-08-01T09:30:00Z"      },      "message": "Add launch telemetry",      "tree": {        "sha": "a7b6c5d4e3f2a1b0c9d8e7f6a5b4c3d2e1f0a9b8"      }    },    "parents": [      {        "sha": "3b1f9c2d8a7e6f5049c8b7a6d5e4f3a2b1c0d9e8"      }    ],    "stats": {      "additions": 128,      "deletions": 46,      "total": 174    }  },  "mergeBaseCommit": {    "sha": "3b1f9c2d8a7e6f5049c8b7a6d5e4f3a2b1c0d9e8",    "commit": {      "author": {        "name": "Jane Doe",        "email": "[email protected]",        "date": "2026-08-01T09:30:00Z"      },      "committer": {        "name": "Jane Doe",        "email": "[email protected]",        "date": "2026-08-01T09:30:00Z"      },      "message": "Add launch telemetry",      "tree": {        "sha": "a7b6c5d4e3f2a1b0c9d8e7f6a5b4c3d2e1f0a9b8"      }    },    "parents": [      {        "sha": "3b1f9c2d8a7e6f5049c8b7a6d5e4f3a2b1c0d9e8"      }    ],    "stats": {      "additions": 128,      "deletions": 46,      "total": 174    }  }}

Список файлов для сравнения

GET/v1/origin/repos/{ownerSlug}/{repoName}/compare/{basehead}/files
Scoperepository:contents:readAuthInstallation tokenUser access token

Возвращает список файлов, изменённых при сравнении: дифф head с базой слияния base и head.

basehead — это "{base}...{head}"; для ссылок (refs), содержащих "/", необходимо использовать их SHA. Список файлов всегда соответствует сводке из Compare Commits, поэтому при сравнении identical или behind возвращается пустой список, а для несвязанных историй возвращается 404. По умолчанию возвращается 30 файлов, максимум — 100. Для каждого файла присутствуют те же поля, что и в List Commit Files.

Параметры пути

ownerSlug строка Обязательно

Уникальный слаг сущности-владельца.

repoName строка Обязательно

Имя репозитория, уникальное для сущности-владельца.

basehead строка Обязательно

"{base}...{head}", где каждая из ревизий может быть SHA, веткой, тегом или символической ссылкой, например HEAD.

Параметры запроса

pageSize integer

Максимальное число возвращаемых изменённых файлов. По умолчанию — 30, если не задано или равно 0. Значения выше 100 ограничиваются 100.

pageToken строка

Непрозрачный курсор из поля next_page_token предыдущего ответа. Пуст для первой страницы. Токен привязан к разрешённому сравнению, размеру страницы и положению курсора файла, поэтому параметры basehead и page_size в последующем запросе должны совпадать с токеном. Origin повторно разрешает сравнение на каждой странице; если его коммиты с момента выдачи токена переместились, запрос возвращает InvalidArgument (HTTP 400), и перечисление необходимо начать заново с первой страницы.

Поля ответа

files массив

Изменённые файлы с постраничной навигацией: имя файла, статус, количество строк, патч и previousFilename для переименованных или скопированных файлов. Для бинарных патчей поле пусто.

files[].filename строка

Путь к изменённому файлу.

files[].status строка

Статус изменения: добавлен, удалён, изменён, переименован или скопирован.

files[].additions целое число

Добавлено количество строк в файле.

files[].deletions integer

Количество удалённых строк в файле.

files[].changes integer

Общее количество изменённых строк в файле.

files[].patch строка

Унифицированный патч; пуст для бинарных файлов.

files[].previousFilename строка

Предыдущий путь до переименования или копирования файла.

nextPageToken строка

Непрозрачный курсор для следующей страницы; пустой, если файлов больше нет.
curl --request GET \  --url 'https://api.cursor.com/v1/origin/repos/OWNER_SLUG/REPO_NAME/compare/BASE...HEAD/files' \  --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN'

Структура ответа:

{  "files": [    {      "filename": "src/telemetry.ts",      "status": "modified",      "additions": 6,      "deletions": 3,      "changes": 9,      "patch": "@@ -12,6 +12,9 @@\n import { ignite } from \"./ignition\";\n+import { emitLaunchTelemetry } from \"./telemetry\";\n"    }  ]}

Получить содержимое

GET/v1/origin/repos/{ownerSlug}/{repoName}/contents
Scoperepository:contents:readAuthInstallation tokenUser access token

Возвращает содержимое файла или каталога для указанной Git-ссылки. Путь к файлу передаётся в параметре запроса path (поддерживаются вложенные пути); не указывайте его или оставьте пустым, чтобы получить содержимое корневого каталога репозитория. Файлы размером более 1 МиБ (после декодирования) отклоняются с ошибкой FailedPrecondition (HTTP 400).

Файлы содержат данные в кодировке base64. Каталоги содержат непосредственные дочерние элементы в entries. Записи каталога — это сокращённые дочерние элементы, содержащие type, name, path, sha и size; чтобы прочитать содержимое дочернего элемента, получите его по пути.

Параметры пути

ownerSlug строка Обязательный

Уникальный слаг сущности-владельца.

repoName строка Обязательный

Имя репозитория, уникальное в рамках сущности-владельца.

Параметры запроса

path строка

Путь к файлу или каталогу относительно корня репозитория. При пустом значении возвращается корневой каталог.

ref строка

Коммит, ветка, тег или символическая Git-ссылка (например, HEAD), содержимое которых нужно прочитать. При пустом значении используется ветка репозитория по умолчанию.

Поля ответа

type строка

Тип содержимого: файл или каталог.

encoding строка

Кодировка файла; в ответах для файлов используется base64.

size строка

Размер декодированного содержимого в байтах, закодированный как строка JSON в соответствии с принятой в API конвенцией 64-битных целых чисел. Полезные нагрузки файлов размером более 1 МиБ отклоняются.

name строка

Базовое имя файла или каталога.

path строка

Путь относительно корня репозитория.

sha строка

Blob SHA для файла или tree SHA для каталога.

content строка

Содержимое файла в кодировке Base64; присутствует для запрошенного файла.

entries массив

Непосредственные сокращённые дочерние элементы каталога. Записи содержат type, name, path, sha и size; чтобы прочитать содержимое дочернего элемента, получите его по пути.
curl --request GET \  --url 'https://api.cursor.com/v1/origin/repos/OWNER_SLUG/REPO_NAME/contents' \  --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN'

Структура ответа:

{  "type": "file",  "encoding": "base64",  "size": "312",  "name": "telemetry.ts",  "path": "src/telemetry.ts",  "sha": "c9d8e7f6a5b4c3d2e1f0a9b8c7d6e5f4a3b2c1d0",  "content": "Y29uc29sZS5sb2coImxhdW5jaCIpOwo="}

Пакетное получение содержимого

POST/v1/origin/repos/{ownerSlug}/{repoName}/contents:batchGet
Scoperepository:contents:readAuthInstallation tokenUser access token

Возвращает содержимое нескольких явно указанных путей в заданном ref одним запросом. Для каждого запрошенного пути возвращается результат с указанием, найден ли он; найденный путь имеет ту же структуру Content, что и в GetContents (файлы — в base64, каталоги — с непосредственными entries, символические ссылки — как файлы). Пути сопоставляются точно, без glob-выражений или шаблонов; можно запросить не более 20 путей, дубликаты удаляются. Результаты ответа сохраняют порядок первого появления в запросе. Один файл, превышающий ограничение в 1 МиБ, установленное для Get Contents, приводит к ошибке всего пакета FailedPrecondition (HTTP 400). Используется POST, поскольку список путей передаётся в теле запроса.

Параметры пути

ownerSlug строка Обязательно

Уникальный слаг владеющей сущности.

repoName строка Обязательно

Имя репозитория, уникальное для сущности-владельца.

Тело запроса

paths массив Обязательно

Точные пути для получения относительно корня репозитория (без glob-выражений или шаблонов). Не более 20 записей; дубликаты удаляются. Пустая строка запрашивает корневой каталог репозитория.

ref строка

Коммит, ветка, тег или символическая ссылка (например, HEAD), из которых читать. Пустое значение означает ветку по умолчанию репозитория.

Поля ответа

results массив

По одному результату для каждого возвращаемого точного пути, с сохранением порядка запросов по принципу «первый пришёл — первый показан».

results[].path строка

Запрошенный путь, соответствующий этому результату.

results[].found логическое значение

Существует ли запрошенный путь в указанном коммите.

results[].content object

Значение содержимого: присутствует, когда found равно true; опускается, когда found равно false.

results[].content.type строка

Тип содержимого: файл или каталог.

results[].content.encoding строка

Кодировка файла; ответы с содержимым файлов передаются в base64.

results[].content.size строка

Размер декодированного содержимого в байтах, закодированный как JSON-строка в соответствии с соглашением API о 64-битных целых числах. Файлы с полезной нагрузкой больше 1 МиБ отклоняются.

results[].content.name строка

Имя файла или каталога без пути.

results[].content.path строка

Путь относительно корня репозитория.

results[].content.sha строка

SHA блоба для файла или SHA дерева для каталога.

results[].content.content строка

Тело файла в кодировке Base64; присутствует для полученного файла.

results[].content.entries массив

Непосредственные разрежённые дочерние элементы директории. Записи содержат тип, имя, путь, sha и размер; получите путь дочернего элемента, чтобы прочитать его содержимое.

resolvedCommitSha строка

SHA коммита, в который разрешился запрошенный ref.
curl --request POST \  --url 'https://api.cursor.com/v1/origin/repos/OWNER_SLUG/REPO_NAME/contents:batchGet' \  --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN' \  --header 'Content-Type: application/json' \  --data '{  "paths": [    "src/telemetry.ts"  ],  "ref": "main"}'

Структура ответа:

{  "results": [    {      "path": "src/telemetry.ts",      "found": true,      "content": {        "type": "file",        "encoding": "base64",        "size": "312",        "name": "telemetry.ts",        "path": "src/telemetry.ts",        "sha": "c9d8e7f6a5b4c3d2e1f0a9b8c7d6e5f4a3b2c1d0",        "content": "Y29uc29sZS5sb2coImxhdW5jaCIpOwo="      }    }  ],  "resolvedCommitSha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4"}

Поиск по содержимому

POST/v1/origin/repos/{ownerSlug}/{repoName}:grep
Scoperepository:contents:readAuthInstallation tokenUser access token

Выполняет поиск по тексту файлов репозитория на указанной Git-ссылке и возвращает совпавшие строки, а также запрошенные строки окружающего контекста. Поиск построчный: шаблон никогда не совпадает через перенос строки, и каждая возвращаемая запись — это одна строка. Репозиторий сканируется при каждом запросе, поэтому пагинация и курсор не используются; ответ считается полным, только если limitHit равно false. Пустой репозиторий без Git-ссылок возвращает пустой список совпадений и limitHit false. Используется POST, поскольку параметры поиска передаются в теле запроса.

Параметры пути

ownerSlug string Обязательный

Уникальный слаг сущности-владельца.

repoName строка Обязательный

Имя репозитория, уникальное в пределах сущности-владельца.

Тело запроса

ref строка

Коммит, ветка, тег или символьная ссылка (например, HEAD) для поиска. Если пусто, используется ветка по умолчанию для репозитория.

query string Обязательный

Шаблон для поиска. По умолчанию это регулярное выражение, поддерживающее классы символов, квантификаторы, альтернативы, группы и якоря; чтобы искать точное совпадение текста, установите literal. Пробелы значимы и учитываются при поиске. Пустой шаблон возвращает InvalidArgument (HTTP 400). Максимальный размер в UTF-8: 4096 байт.

literal boolean

Ищите query как точный текст, а не как регулярное выражение.

caseInsensitive boolean

Считать верхний и нижний регистр равнозначными.

wholeWord boolean

Искать только слово целиком.

contextBefore integer

Сколько строк непосредственно перед каждой совпавшей строкой возвращать в качестве контекста. Значения больше 10 приводятся к 10.

contextAfter integer

Сколько строк сразу после каждой совпавшей строки возвращать в качестве контекста. Значения больше 10 приводятся к 10.

filterPath строка

Ограничьте область поиска этим файлом или каталогом относительно корня репозитория. При пустом значении выполняется поиск по всему репозиторию. Максимальный размер в UTF-8: 4096 байт.

includes массив

Глобальные шаблоны, задающие пути для поиска. Сопоставление регистронезависимое; шаблон без / соответствует на любой глубине, * соответствует внутри одного сегмента пути, а ** — через несколько сегментов. Если указано хотя бы одно включение (include), путь, не соответствующий ни одному из них, не ищется. Не более 20 записей. Максимальный размер шаблона в UTF-8: 4096 байт.

excludes массив

Глобальные шаблоны путей для исключения, в том же синтаксисе, что и у includes. Исключение имеет приоритет над включением, и исключение каталога исключает всё, что находится внутри него. Не более 20 записей. Максимальный размер шаблона в UTF-8: 4096 байт.

maxResults integer

Максимальное число наиболее подходящих совпадений для возврата. При значении 0 используется значение по умолчанию — 1000, а значения выше 1000 ограничиваются до 1000. Строки контекста не учитываются в этом ограничении.

Поля ответа

matches массив

Совпавшие строки и окружающие их строки контекста. Порядок вывода файлов и строк не определён и может различаться для одинаковых запросов.

matches[].path строка

Путь к файлу относительно корня репозитория.

matches[].lineNumber integer

Номер этой строки в файле (нумерация начинается с единицы).

matches[].line строка

Текст строки без завершающего символа перевода строки.

matches[].kind строка

Указывает, содержит ли эта строка совпадения или возвращена в качестве контекста. Допустимые значения: match, context.

matches[].submatches массив

Расположение совпадений внутри line. Для строки контекста всегда пусто. Если limitHit равно true, последняя совпавшая строка может содержать лишь часть своих совпадений. Диапазоны, полностью выходящие за пределы line, опускаются, а диапазоны, частично выходящие за line, обрезаются до оставшихся байтов.

matches[].submatches[].start integer

Смещение первого байта совпадения в пределах строки.

matches[].submatches[].end integer

Смещение в байтах, следующее сразу за последним байтом совпадения в строке.

limitHit boolean

Достиг ли поиск значения maxResults. Сузьте query, filterPath или списки glob, чтобы выполнить поиск по меньшему набору файлов.
curl --request POST \  --url 'https://api.cursor.com/v1/origin/repos/OWNER_SLUG/REPO_NAME:grep' \  --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN' \  --header 'Content-Type: application/json' \  --data '{  "ref": "main",  "query": "emitLaunchTelemetry\\(",  "contextBefore": 1,  "contextAfter": 1,  "includes": [    "*.ts"  ],  "excludes": [    "**/node_modules/**"  ],  "maxResults": 50}'
{  "matches": [    {      "path": "src/telemetry.ts",      "lineNumber": 11,      "line": "export function emitLaunchTelemetry(stage: string): void {",      "kind": "match",      "submatches": [        {          "start": 16,          "end": 37        }      ]    },    {      "path": "src/telemetry.ts",      "lineNumber": 12,      "line": "  console.log(\"launch\", stage);",      "kind": "context",      "submatches": []    }  ],  "limitHit": false}

Данные Git

Низкоуровневые Git-object. Для чтения требуется repository:contents:read, а для пустого репозитория возвращается 409. Create Commit From Files и Create Git Ref записывают Git-object и требуют repository:contents:write.

Получить blob

GET/v1/origin/repos/{ownerSlug}/{repoName}/git/blobs/{sha}
Scoperepository:contents:readAuthInstallation tokenUser access token

Возвращает Git-object blob по SHA. По умолчанию возвращается JSON, где content содержит данные в base64 с MIME-переносами. Чтобы получить необработанные байты blob, передайте в REST-запросе Accept: application/vnd.origin.raw+json (или application/vnd.origin.raw). Blob размером более 4 МиБ в декодированном виде отклоняются; для файлов большего размера клонируйте репозиторий по Git HTTPS. Для пустых репозиториев возвращается ошибка 409 Conflict.

Параметры пути

ownerSlug строка обязательный

Уникальный слаг сущности-владельца.

repoName строка обязательный

Имя репозитория, уникальное в пределах сущности-владельца.

sha строка обязательный

Полный или сокращённый SHA Git-object blob в шестнадцатеричном формате.

Поля ответа

sha строка

SHA Git-object blob.

size целое число

Размер декодированного blob в виде числа JSON; blob размером более 4 МиБ отклоняются JSON-эндпоинтом.

encoding строка

В JSON-ответах для blob используется кодирование base64.

content строка

Байты blob, закодированные в base64; вызывающая сторона может запросить необработанные байты с Accept: application/vnd.origin.raw.
curl --request GET \  --url 'https://api.cursor.com/v1/origin/repos/OWNER_SLUG/REPO_NAME/git/blobs/SHA' \  --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN'

Структура ответа:

{  "sha": "c9d8e7f6a5b4c3d2e1f0a9b8c7d6e5f4a3b2c1d0",  "size": 312,  "encoding": "base64",  "content": "Y29uc29sZS5sb2coImxhdW5jaCIpOwo="}

Получить Git-коммит

GET/v1/origin/repos/{ownerSlug}/{repoName}/git/commits/{sha}
Scoperepository:contents:readAuthInstallation tokenUser access token

Возвращает объект коммита Git по SHA (или разрешимой ревизии). Это низкоуровневое представление коммита в Git Database (плоская структура author/message/tree), а не ресурс более высокого уровня GetCommit по пути /commits/{sha}. В sha можно передать SHA коммита, ветку, тег или символическую ссылку, например HEAD. Для пустых репозиториев возвращается ошибка 409 Conflict.

Параметры пути

ownerSlug строка Обязательно

Уникальный слаг сущности-владельца.

repoName строка Обязательно

Имя репозитория, уникальное для сущности-владельца.

sha строка Обязательно

Полный или сокращённый шестнадцатеричный SHA объекта коммита, либо ветка, тег или символьная ссылка, например HEAD.

Поля ответа

sha строка

Полный SHA коммита в шестнадцатеричном формате.

author object

Подпись автора из объекта git.

author.name строка

Имя, указанное в идентификации Git.

author.email строка

Электронная почта, указанная в идентичности Git.

author.date строка

Метка времени в формате ISO-8601 с сохранением исходного смещения часового пояса подписи git (например, "2014-11-07T22:01:45+01:00").

committer object

Подпись коммиттера из объекта git.

committer.name строка

Имя, указанное в идентификации Git.

committer.email строка

Электронная почта, указанная в идентичности Git.

committer.date строка

Метка времени в формате ISO-8601 с сохранением исходного смещения часового пояса подписи git (например, "2014-11-07T22:01:45+01:00").

message строка

Полное сообщение коммита.

tree object

Дерево, на которое указывает этот коммит.

tree.sha строка

SHA дерева, на которое ссылается коммит.

parents массив

SHA родительских коммитов (пусто для корневого коммита).

parents[].sha строка

SHA родительского коммита.
curl --request GET \  --url 'https://api.cursor.com/v1/origin/repos/OWNER_SLUG/REPO_NAME/git/commits/SHA' \  --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN'

Структура ответа:

{  "sha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4",  "author": {    "name": "Jane Doe",    "email": "[email protected]",    "date": "2026-08-01T09:30:00Z"  },  "committer": {    "name": "Jane Doe",    "email": "[email protected]",    "date": "2026-08-01T09:30:00Z"  },  "message": "Add launch telemetry",  "tree": {    "sha": "a7b6c5d4e3f2a1b0c9d8e7f6a5b4c3d2e1f0a9b8"  },  "parents": [    {      "sha": "3b1f9c2d8a7e6f5049c8b7a6d5e4f3a2b1c0d9e8"    }  ]}

Создать коммит из файлов

POST/v1/origin/repos/{ownerSlug}/{repoName}/git/commits:createFromFiles
Scoperepository:contents:writeAuthInstallation tokenUser access token

Создаёт коммит в ветке на основе inline-изменений файлов и переводит ветку на него.

Изменения применяются к дереву на expectedHeadSha, который становится родителем нового коммита. Если ветка сместилась или не существует, набор изменений не меняет дерево, удаляется путь, которого нет в дереве, запись блокируется набором правил push либо содержимое репозитория зеркалируется с другого хоста — во всех этих случаях возвращается FailedPrecondition (HTTP 400).

Один запрос может содержать не более 1000 изменений файлов, 8 МиБ на файл и 32 МиБ содержимого суммарно. При превышении лимита, повторении пути или отправке некорректного поля возвращается InvalidArgument (HTTP 400), а в нарушениях полей google.rpc.BadRequest указывается проблемная запись files[i].

Ветка должна уже существовать. Сначала создайте её с помощью Create Git Ref, а затем делайте в неё коммиты.

Параметры пути

ownerSlug string Обязательный

Уникальный слаг сущности-владельца.

repoName string Обязательный

Имя репозитория, уникальное в пределах сущности-владельца.

Тело запроса

targetBranch string Обязательный

Ветка, в которую попадёт commit, в формате <branch>, heads/<branch> или refs/heads/<branch>. Ветка должна уже существовать. HEAD отклоняется в любом написании.

expectedHeadSha string Обязательный

Полный SHA в шестнадцатеричном формате, на который в данный момент должна указывать целевая ветка. Он становится родительским коммитом для нового коммита. SHA, состоящий из одних нулей, отклоняется.

message string Обязательно

Сообщение коммита.

author object Обязательный

Автор коммита. Временные метки проставляются сервером.

author.name string Обязательное

Name, записанный в identity Git.

author.email string Обязательный

Email, записанный в Git identity.

committer object

Коммиттер коммита. Если не указан, используется значение author.

committer.name string

Имя, записываемое в Git identity. Обязательно, если указан committer.

committer.email string

Email, указанный в Git identity. Обязателен, если присутствует committer.

files массив Обязательный

Изменения файлов, применяемые к дереву вершины ветки. Требуется как минимум одно изменение, а пути должны быть уникальными в пределах запроса.

files[].path string Обязательно

Путь относительно корня репозитория с разделителями /, например docs/changelog.md.

files[].content string

Новое содержимое файла, закодированное в соответствии с files[].encoding. Создаёт файл или заменяет его содержимое. Задайте ровно одно из полей: files[].content или files[].delete.

files[].delete boolean

Удаляет файл. Если задано, значение должно быть true. Задайте ровно одно из полей: files[].content или files[].delete.

files[].encoding string

Кодировка files[].content. Допустимые значения: utf-8 (по умолчанию), base64. Игнорируется при удалении.

files[].mode string

Режим файла для files[].content. Допустимые значения: file (по умолчанию), executable, symlink — в этом случае содержимое задаёт цель ссылки. Игнорируется при удалении.

Поля ответа

sha string

SHA нового commit, который теперь является tip ветки.

treeSha string

SHA корневого дерева нового commit.

previousHeadSha string

Вершина ветки до записи; родитель нового коммита.
curl --request POST \  --url 'https://api.cursor.com/v1/origin/repos/OWNER_SLUG/REPO_NAME/git/commits:createFromFiles' \  --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN' \  --header 'Content-Type: application/json' \  --data '{  "targetBranch": "feature/login",  "expectedHeadSha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4",  "message": "Add login telemetry",  "author": {    "name": "Jane Doe",    "email": "[email protected]"  },  "files": [    {      "path": "src/login/telemetry.ts",      "content": "export const LOGIN_EVENT = 1;"    },    {      "path": "assets/login.png",      "content": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNkYPhfDwAChwGA60e6kgAAAABJRU5ErkJggg==",      "encoding": "base64"    },    {      "path": "src/login/legacy.ts",      "delete": true    }  ]}'

Структура ответа:

{  "sha": "5c4d3e2f1a0b9c8d7e6f5a4b3c2d1e0f9a8b7c6d",  "treeSha": "a7b6c5d4e3f2a1b0c9d8e7f6a5b4c3d2e1f0a9b8",  "previousHeadSha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4"}

Получить Git-ссылку

GET/v1/origin/repos/{ownerSlug}/{repoName}/git/ref/{ref}
Scoperepository:contents:readAuthInstallation tokenUser access token

Возвращает одну Git-ссылку по имени. ref обычно имеет вид heads/<branch> или tags/<tag> (с префиксом refs/ или без него), либо символьную ссылку HEAD. Поддерживается только точное совпадение; для поиска по префиксу используйте ListMatchingGitRefs. Для пустых репозиторев возвращается ошибка 409 Conflict.

Параметры пути

ownerSlug строка Обязательный

Уникальный слаг сущности-владельца.

repoName строка Обязательный

Имя репозитория, уникальное в пределах сущности-владельца.

ref строка Обязательный

Имя Git-ссылки. Обычно heads/<branch> или tags/<tag>; префикс refs/ принимается и нормализуется. Также принимается символьная ссылка HEAD (возвращается как ref: "HEAD" с последним коммитом). Выполняется точное сопоставление по полному имени Git-ссылки.

Поля ответа

ref строка

Полное имя Git-ссылки, например "refs/heads/main".

object object

Объект, на который напрямую указывает эта Git-ссылка (без разыменования). Для аннотированных тегов object.type имеет значение "tag", а object.sha — SHA объекта тега.

object.sha строка

SHA целевого объекта в шестнадцатеричном формате.

object.type строка

Одно из значений: "commit", "tree", "blob" или "tag".
curl --request GET \  --url 'https://api.cursor.com/v1/origin/repos/OWNER_SLUG/REPO_NAME/git/ref/REF' \  --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN'

Структура ответа:

{  "ref": "refs/heads/main",  "object": {    "sha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4",    "type": "commit"  }}

Создание Git-ссылки

POST/v1/origin/repos/{ownerSlug}/{repoName}/git/refs
Scoperepository:contents:writeAuthInstallation tokenUser access token

Создаёт ссылку на ветку, указывающую на существующий коммит.

Создавать можно только ссылки на ветки. Тег, любое другое пространство имён ссылок, а также sha, не являющийся полным шестнадцатеричным SHA коммита в репозитории, приводят к ошибке InvalidArgument (HTTP 400). Создание ветки, которая уже указывает на sha, завершается успешно и возвращает существующую ссылку; если ветка существует и указывает на другой коммит, возвращается AlreadyExists (HTTP 409 Conflict). Если создание блокируется набором правил push либо выполняется в репозитории, содержимое которого зеркалируется с другого хоста, возвращается FailedPrecondition (HTTP 400).

Path Parameters

ownerSlug string Обязательный

Уникальный слаг сущности-владельца.

repoName string Обязательный

Имя репозитория, уникальное в пределах сущности-владельца.

Request Body

ref string Обязательный

Создаваемая ссылка на ветку в формате refs/heads/<branch> или heads/<branch>.

sha string Обязательный

Полный шестнадцатеричный SHA существующего коммита, на который указывает новая ветка.

Response Fields

ref string

Полное имя ссылки, напр. "refs/heads/main".

object object

Объект, на который эта ссылка указывает напрямую (без разыменования). Для ветки object.type равен "commit".

object.sha string

Шестнадцатеричный SHA целевого объекта.

object.type string

Одно из значений: "commit", "tree", "blob" или "tag".
curl --request POST \  --url 'https://api.cursor.com/v1/origin/repos/OWNER_SLUG/REPO_NAME/git/refs' \  --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN' \  --header 'Content-Type: application/json' \  --data '{  "ref": "refs/heads/feature/login",  "sha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4"}'

Структура ответа:

{  "ref": "refs/heads/feature/login",  "object": {    "sha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4",    "type": "commit"  }}

Список Git-ссылок по префиксу

GET/v1/origin/repos/{ownerSlug}/{repoName}/git/matching-refs
Scoperepository:contents:readAuthInstallation tokenUser access token

Возвращает список Git-ссылок, имена которых начинаются с указанного префикса. REST-ответы разворачиваются в JSON-массив (через response_body). Завершающий слеш в ref сохраняется (heads/refs/heads/). Символьная ссылка HEAD сопоставляется точно (она не входит в refs/). Для пустых репозиториев возвращается ошибка 409 Conflict.

Параметры пути

ownerSlug строка Обязательный

Уникальный слаг сущности-владельца.

repoName строка Обязательный

Имя репозитория, уникальное в пределах сущности-владельца.

Параметры запроса

ref строка

Префикс для сопоставления. Обычно heads/<prefix> или tags/<prefix>; префикс refs/ принимается и нормализуется. Если значение пустое, выводятся все Git-ссылки (REST-привязка без завершающего сегмента пути).

Поля ответа

Ответ представляет собой массив. Каждый элемент содержит:

ref строка

Полное имя Git-ссылки, например "refs/heads/main".

object object

Объект, на который эта Git-ссылка указывает напрямую (без разыменования). Для аннотированных тегов object.type имеет значение "tag", а object.sha — SHA объекта тега.

object.sha строка

SHA целевого объекта в шестнадцатеричном формате.

object.type строка

Одно из значений: "commit", "tree", "blob" или "tag".
curl --request GET \  --url 'https://api.cursor.com/v1/origin/repos/OWNER_SLUG/REPO_NAME/git/matching-refs' \  --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN'

Структура ответа:

{  "refs": [    {      "ref": "refs/heads/main",      "object": {        "sha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4",        "type": "commit"      }    }  ]}

Список Git-ссылок, соответствующих пути

GET/v1/origin/repos/{ownerSlug}/{repoName}/git/matching-refs/{ref}
Scoperepository:contents:readAuthInstallation tokenUser access token

Возвращает Git-ссылки, имена которых начинаются с указанного префикса. REST-ответы разворачиваются в JSON-массив (через response_body). Завершающий слеш в ref сохраняется (heads/refs/heads/). Символьная ссылка HEAD сопоставляется строго (она не находится в refs/). Для пустых репозиториев возвращается ошибка 409 Conflict.

Параметры пути

ownerSlug строка Обязательный

Уникальный слаг сущности-владельца.

repoName строка Обязательный

Имя репозитория, уникальное в пределах сущности-владельца.

ref строка Обязательный

Префикс для сопоставления. Обычно heads/<prefix> или tags/<prefix>; префикс refs/ принимается и нормализуется. Пустое значение возвращает все Git-ссылки (REST-привязка без завершающего сегмента пути).

Поля ответа

Ответ представляет собой массив. Каждый элемент содержит:

ref строка

Полное имя Git-ссылки, например "refs/heads/main".

object object

Объект, на который эта Git-ссылка указывает напрямую (без разыменования). Для аннотированных тегов object.type имеет значение "tag", а object.sha — SHA объекта тега.

object.sha строка

SHA целевого объекта в шестнадцатеричном формате.

object.type строка

Одно из значений: "commit", "tree", "blob" или "tag".
curl --request GET \  --url 'https://api.cursor.com/v1/origin/repos/OWNER_SLUG/REPO_NAME/git/matching-refs/REF' \  --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN'

Структура ответа:

{  "refs": [    {      "ref": "refs/heads/main",      "object": {        "sha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4",        "type": "commit"      }    }  ]}

Получить тег

GET/v1/origin/repos/{ownerSlug}/{repoName}/git/tags/{sha}
Scoperepository:contents:readAuthInstallation tokenUser access token

Возвращает объект аннотированного Git-тега по SHA. Облегчённые теги не являются объектами тегов и возвращают NotFound. Для пустых репозиториев возвращается 409 Conflict.

Параметры пути

ownerSlug string Обязательный

Уникальный слаг сущности-владельца.

repoName string Обязательный

Имя репозитория, уникальное в пределах сущности-владельца.

sha string Обязательный

Полный или сокращённый SHA объекта аннотированного тега в шестнадцатеричном формате.

Поля ответа

sha string

SHA объекта тега в шестнадцатеричном формате.

tag string

Имя тега, например "v1.0".

message string

Сообщение тега.

tagger object

Подпись автора тега из объекта тега.

tagger.name string

Имя, указанное в идентификационных данных Git.

tagger.email string

Электронная почта, указанная в идентификационных данных Git.

tagger.date string

Метка времени ISO-8601 с сохранением исходного смещения часового пояса подписи Git (например, "2014-11-07T22:01:45+01:00").

object object

Объект, на который указывает этот тег.

object.sha string

SHA целевого объекта в шестнадцатеричном формате.

object.type string

Одно из значений: "commit", "tree", "blob" или "tag".
curl --request GET \  --url 'https://api.cursor.com/v1/origin/repos/OWNER_SLUG/REPO_NAME/git/tags/SHA' \  --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN'

Структура ответа:

{  "sha": "e1f0a9b8c7d6e5f4a3b2c1d0e9f8a7b6c5d4e3f2",  "tag": "v1.2.0",  "message": "Release v1.2.0",  "tagger": {    "name": "Jane Doe",    "email": "[email protected]",    "date": "2026-08-01T09:30:00Z"  },  "object": {    "sha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4",    "type": "commit"  }}

Получить дерево

GET/v1/origin/repos/{ownerSlug}/{repoName}/git/trees/{sha}
Scoperepository:contents:readAuthInstallation tokenUser access token

Возвращает объект дерева Git по SHA или разрешимой ревизии. sha принимает SHA дерева, SHA коммита, ветку, тег или символическую ссылку, такую как HEAD. Установите recursive=true (или 1), чтобы обойти всё дерево; если не указывать этот параметр или передать любое другое значение, будут перечислены только непосредственные элементы. Рекурсивные списки усекаются после 100 000 записей или 7 МиБ и устанавливают truncated=true. Пустые репозитории возвращают 409 Conflict.

Параметры пути

ownerSlug string Обязательный

Уникальный слаг сущности-владельца.

repoName string Обязательно

Имя репозитория, уникальное для сущности-владельца.

sha string Обязательный

SHA дерева, SHA коммита, ветка, тег или символическая ссылка, например HEAD.

Параметры запроса

recursive boolean

Если значение равно true, возвращается полный рекурсивный обход дерева. Значения параметра запроса true и 1 включают рекурсию; если не указывать параметр или передать любое другое значение (включая false и 0), будут перечислены только непосредственные потомки.

Поля ответа

sha string

SHA объекта дерева (шестнадцатеричный).

tree array

Записи в этом дереве (непосредственные потомки или полный рекурсивный обход).

tree[].path string

Путь относительно корня запрошенного дерева.

tree[].mode string

Режим Git в виде восьмеричной строки: "100644", "100755", "040000", "120000", "160000".

tree[].type string

Одно из: «blob», «tree» или «commit» (gitlink/подмодуль).

tree[].sha string

SHA объекта (шестнадцатеричный).

tree[].size integer

Размер blob в байтах. Не задан для деревьев и gitlink'ов. int32 гарантирует, что REST JSON возвращает число; отдельные blob размером более 2 ГиБ не представимы.

truncated boolean

Может быть true, когда рекурсивный список дерева усечён.
curl --request GET \  --url 'https://api.cursor.com/v1/origin/repos/OWNER_SLUG/REPO_NAME/git/trees/SHA' \  --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN'

Структура ответа:

{  "sha": "a7b6c5d4e3f2a1b0c9d8e7f6a5b4c3d2e1f0a9b8",  "tree": [    {      "path": "src/telemetry.ts",      "mode": "100644",      "type": "blob",      "sha": "c9d8e7f6a5b4c3d2e1f0a9b8c7d6e5f4a3b2c1d0",      "size": 312    }  ],  "truncated": false}

Grants

Grant связывает один principal с одним repository или одним owner и одним правом доступа. Эти конечные точки читают, задают и удаляют grants, назначенные непосредственно на resource, — благодаря этому изменения доступа можно описывать скриптами и проверять так же, как код. Операции write используют те же проверки, что и Codebase permissions UI, и записывают те же audit events repository.access_changed и namespace.access_changed. О видах principal, двух уровнях прав доступа и о том, как grants уровня owner взаимодействуют с grants уровня repository, читайте в разделе Origin Grants API.

Список разрешений репозитория

GET/v1/origin/repos/{ownerSlug}/{repoName}/grants
Scoperepository:settings:readAuthInstallation tokenUser access token

Возвращает список пользователей, групп и групп владеющей команды, обладающих правом доступа, выданным непосредственно на репозиторий. Права доступа, унаследованные от владельца репозитория, не включаются.

Параметры пути

ownerSlug строка Обязательный

Уникальный слаг сущности-владельца.

repoName строка Обязательный

Имя репозитория, уникальное в пределах сущности-владельца.

Параметры запроса

pageSize integer

Максимальное количество возвращаемых grants. По умолчанию — 30, если не задано или равно 0. Значения больше 100 ограничиваются до 100. Игнорируется, если задан pageToken.

pageToken строка

Непрозрачный курсор из поля next_page_token предыдущего ответа. Для первой страницы оставьте пустым.

Поля ответа

grants массив

Grants, выданные непосредственно на репозиторий, отсортированные по типу principal (groups, администраторы команды-владельца, участники команды-владельца, пользователи), а затем по id. Principal, который больше не сопоставляется с активным пользователем, группой или командой-владельцем, пропускается, поэтому страница может содержать меньше pageSize grants.

grants[].user object

Principal пользователя. Присутствует ровно одно из полей: user, group или teamGroup.

grants[].user.id строка

Публичный идентификатор пользователя с префиксом user_.

grants[].user.email строка

Адрес электронной почты пользователя.

grants[].user.displayName строка

Отображаемое имя пользователя: имя и фамилия из аккаунта, соединённые пробелом, — то же имя, которое отображает продукт. Не указывается, если у аккаунта нет имени.

grants[].user.handle строка

Закреплённый за пользователем идентификатор профиля без префикса @. Передаётся только в том случае, если профиль общедоступен; в остальных случаях отсутствует.

grants[].group object

Принципал группы организации Cursor.

grants[].group.id строка

Публичный идентификатор группы с префиксом grp_.

grants[].teamGroup object

Одна из встроенных групп команды-владельца, назначенная непосредственно на репозитории и отличная от группы, унаследованной от владельца.

grants[].teamGroup.kind строка

Встроенная группа, которой выдано разрешение. Допустимые значения: members, admins.

grants[].permission строка

Право доступа, которым принципал обладает в репозитории. Допустимые значения: read, write, admin, custom. Значение custom указывает на пользовательскую политику, которую Upsert Repository Grant не принимает.

repository object

Репозиторий, которому принадлежит каждый grant в этом response. Содержит те же fields, что и Получить репозиторий.

nextPageToken строка

Непрозрачный курсор для следующей страницы; пустой, если страниц больше нет.
curl --request GET \  --url 'https://api.cursor.com/v1/origin/repos/{ownerSlug}/{repoName}/grants' \  --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN'

Структура ответа:

{  "grants": [    {      "group": {        "id": "grp_01k2ja2000e0080000000000n2"      },      "permission": "admin"    },    {      "teamGroup": {        "kind": "admins"      },      "permission": "admin"    },    {      "teamGroup": {        "kind": "members"      },      "permission": "write"    },    {      "user": {        "id": "user_01k2ja2000e0080000000000c3",        "email": "[email protected]"      },      "permission": "read"    }  ],  "repository": {    "id": "repo_01k2ja2000e0080000000000q4",    "name": "rocket",    "owner": {      "slug": "acme",      "id": "ns_01k2ja2000e0080000000000p3",      "type": "team"    }  },  "nextPageToken": ""}

Upsert repository grant

POST/v1/origin/repos/{ownerSlug}/{repoName}/grants
Scoperepository:settings:writeAuthInstallation tokenUser access token

Задаёт право доступа, которым пользователь, группа или группа владеющей команды обладает непосредственно в репозитории, заменяя любое право доступа, ранее выданное этому principal напрямую. Повторная выдача права доступа, которое у principal уже есть, завершается успешно и ничего не меняет. Пользователь должен быть активным участником команды или организации владельца репозитория, а группа — активной группой этой организации; иначе запрос возвращает FailedPrecondition (HTTP 400).

Параметры пути

ownerSlug строка Обязательный

Уникальный слаг сущности-владельца.

repoName строка Обязательный

Имя репозитория, уникальное в пределах сущности-владельца.

Тело запроса

user object

Принципал пользователя. Присутствует ровно одно из полей: user, group или teamGroup.

user.id строка

Публичный идентификатор пользователя с префиксом user_.

user.email строка

Адрес электронной почты пользователя.

user.displayName строка

Отображаемое имя пользователя: имя и фамилия из аккаунта, объединённые пробелом, — то же имя, которое отображает продукт. Опускается, если у аккаунта нет имени.

user.handle строка

Закреплённый за пользователем идентификатор профиля без префикса @. Присутствует, только пока профиль общедоступен; в остальных случаях опускается.

group object

Принципал группы организации Cursor.

group.id строка

Публичный идентификатор группы с префиксом grp_.

teamGroup object

Одна из встроенных групп команды-владельца, назначенная на самом репозитории и отличная от группы, унаследованной от владельца.

teamGroup.kind строка

Встроенная группа, которой принадлежит разрешение. Допустимые значения: members, admins.

permission строка Обязательное

Предоставляемое право доступа. Допустимые значения: read, write, admin. Значение custom возвращает InvalidArgument (HTTP 400); пользовательские политики выходят за рамки этого API.

Поля ответа

user object

Принципал пользователя. Присутствует ровно одно из полей: user, group или teamGroup.

user.id строка

Публичный идентификатор пользователя с префиксом user_.

user.email строка

Адрес электронной почты пользователя.

user.displayName строка

Отображаемое имя пользователя: имя и фамилия из аккаунта, объединённые пробелом, — то же имя, которое показывает продукт. Опускается, если у аккаунта нет имени.

user.handle строка

Занятый пользователем идентификатор профиля, без префикса @. Возвращается, только пока профиль общедоступен; в остальных случаях опускается.

group object

Принципал группы организации Cursor.

group.id строка

Публичный идентификатор группы с префиксом grp_.

teamGroup object

Одна из встроенных групп команды-владельца, выданная на уровне самого репозитория и отличная от группы, унаследованной от владельца.

teamGroup.kind строка

Встроенная группа, которой выдано разрешение. Допустимые значения: members, admins.

permission строка

Текущее право доступа principal к repository.
curl --request POST \  --url 'https://api.cursor.com/v1/origin/repos/OWNER_SLUG/REPO_NAME/grants' \  --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN' \  --header 'Content-Type: application/json' \  --data '{  "user": {    "id": "user_01k2ja2000e0080000000000c3"  },  "permission": "write"}'

Response shape:

{  "user": {    "id": "user_01k2ja2000e0080000000000c3",    "email": "[email protected]"  },  "permission": "write"}

Удаление права доступа к репозиторию

DELETE/v1/origin/repos/{ownerSlug}/{repoName}/grants
Scoperepository:settings:writeAuthInstallation tokenUser access token

Удаляет право доступа, выданное пользователю, группе или группе команды-владельца непосредственно на репозиторий. Права, унаследованные от владельца репозитория, не затрагиваются, поэтому для группы команды-владельца применяется значение по умолчанию с уровня владельца. Попытка удалить право доступа, которым principal не обладает напрямую, завершается успешно и ничего не меняет. Тело ответа пустое.

Path Parameters

ownerSlug строка обязательный

Уникальный слаг сущности-владельца.

repoName строка обязательный

Имя репозитория, уникальное в пределах сущности-владельца.

Request Body

user object

Principal типа «пользователь». Присутствует ровно одно из полей: user, group или teamGroup.

user.id строка

Публичный идентификатор пользователя с префиксом user_.

user.email строка

Адрес электронной почты пользователя.

user.displayName строка

Отображаемое имя пользователя: имя и фамилия из аккаунта, соединённые пробелом, — то же имя, которое показывает продукт. Опускается, если у аккаунта нет имени.

user.handle строка

Handle профиля, закреплённый за пользователем, без префикса @. Присутствует, только пока этот профиль виден публично; в остальных случаях опускается.

group object

Principal типа «группа Cursor organization».

group.id строка

Публичный идентификатор группы с префиксом grp_.

teamGroup object

Одна из встроенных групп команды-владельца, которой право доступа выдано непосредственно на репозиторий, отдельно от права, унаследованного от владельца.

teamGroup.kind строка

Какая встроенная группа обладает правом доступа. Допустимые значения: members, admins.

Response Fields

При успешных запросах тело ответа отсутствует.

curl --request DELETE \  --url 'https://api.cursor.com/v1/origin/repos/OWNER_SLUG/REPO_NAME/grants' \  --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN' \  --header 'Content-Type: application/json' \  --data '{  "group": {    "id": "grp_01k2ja2000e0080000000000n2"  }}'

Ответ:

204 No Content

Список разрешений пространства имён

GET/v1/origin/owners/{ownerSlug}/grants
Scopenamespace:settings:readAuthInstallation tokenUser access token

Возвращает список тех, кому предоставлен доступ к владельцу: пользователей, группы, а также встроенные группы admin и member владеющей команды. Каждый грант несёт разрешение, которое он даёт для каждого репозитория этого владельца. Гранты, выданные на отдельные репозитории, не включаются; их можно получить через List Repository Grants.

Параметры пути

ownerSlug строка Обязательный

Слаг владельца, чьи гранты нужно вывести списком.

Query Parameters

pageSize integer

Максимальное число возвращаемых грантов. По умолчанию — 30, если значение не задано или равно 0. Значения свыше 100 ограничиваются до 100. Игнорируется, если задан pageToken.

pageToken строка

Непрозрачный курсор из поля next_page_token предыдущего ответа. Для первой страницы оставьте пустым.

Поля ответа

grants массив

Разрешения на этой странице. Сначала идут разрешения администраторов; в рамках каждого прогона разрешения сортируются по типу principal (группы, администраторы команды-владельца, участники команды-владельца, пользователи), а затем по id. Principal, которому больше не соответствует активный пользователь, группа или команда-владелец, пропускается, поэтому на странице может оказаться меньше разрешений, чем pageSize.

grants[].user object

Principal пользователя. Присутствует ровно одно из полей: user, group или teamGroup.

grants[].user.id строка

Публичный идентификатор пользователя с префиксом user_.

grants[].user.email строка

Адрес электронной почты пользователя.

grants[].user.displayName строка

Отображаемое имя пользователя: имя и фамилия из аккаунта, соединённые пробелом, — то же имя, которое показывает продукт. Не указывается, если у аккаунта нет имени.

grants[].user.handle строка

Закреплённый за пользователем идентификатор профиля без префикса @. Присутствует, только пока профиль общедоступен; в остальных случаях опускается.

grants[].group object

Принципал группы организации Cursor.

grants[].group.id строка

Публичный идентификатор группы с префиксом grp_.

grants[].teamGroup object

Одна из встроенных групп команды-владельца: доступ команды к владельцу по умолчанию.

grants[].teamGroup.kind строка

Встроенная группа, которой предоставлен доступ. Допустимые значения: members, admins.

grants[].permission строка

Право доступа, которым principal обладает во всех repository, принадлежащих owner. Допустимые значения: PERMISSION_READ, PERMISSION_CONTRIBUTOR, PERMISSION_WRITE, PERMISSION_ADMIN, PERMISSION_CUSTOM. Значение PERMISSION_CUSTOM означает custom policy, которую Upsert Namespace Grant не принимает.

nextPageToken строка

Непрозрачный курсор для следующей страницы; пустая строка, если страниц больше нет.
curl --request GET \  --url 'https://api.cursor.com/v1/origin/owners/{ownerSlug}/grants' \  --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN'

Структура ответа:

{  "grants": [    {      "group": {        "id": "grp_01k2ja2000e0080000000000n2"      },      "permission": "PERMISSION_ADMIN"    },    {      "teamGroup": {        "kind": "admins"      },      "permission": "PERMISSION_ADMIN"    },    {      "teamGroup": {        "kind": "members"      },      "permission": "PERMISSION_CONTRIBUTOR"    },    {      "user": {        "id": "user_01k2ja2000e0080000000000c3",        "email": "[email protected]"      },      "permission": "PERMISSION_WRITE"    }  ],  "nextPageToken": ""}

Upsert-обновление гранта пространства имён

POST/v1/origin/owners/{ownerSlug}/grants
Scopenamespace:settings:writeAuthInstallation tokenUser access token

Задаёт право доступа, которым пользователь, группа или группа владеющей команды напрямую обладает на owner, заменяя право доступа, ранее выданное этому principal напрямую. Повторная выдача права доступа, которое principal уже имеет, завершается успешно и ничего не меняет. Запрос возвращает FailedPrecondition (HTTP 400), если пользователь не является активным участником владеющей команды или её организации, если группа не является активной группой этой организации либо если запись оставит owner без администратора.

Параметры пути

ownerSlug строка Обязательный

Слаг владельца.

Тело запроса

user object

Principal пользователя. Присутствует ровно одно из полей: user, group или teamGroup.

user.id строка

Публичный идентификатор пользователя с префиксом user_.

user.email строка

Адрес электронной почты пользователя.

user.displayName строка

Отображаемое имя пользователя: имя и фамилия из аккаунта, разделённые пробелом, — то же имя, которое показывает продукт. Отсутствует, если у аккаунта нет имени.

user.handle строка

Занятый пользователем идентификатор профиля, без префикса @. Передаётся, только пока профиль общедоступен; в остальных случаях не передаётся.

group object

Принципал группы организации Cursor.

group.id строка

Публичный идентификатор группы с префиксом grp_.

teamGroup object

Одна из встроенных групп команды-владельца: доступ команды к владельцу по умолчанию.

teamGroup.kind строка

Встроенная группа, которой предоставлено право доступа. Допустимые значения: members, admins.

permission строка Обязательное

Выдаваемое право доступа. Допустимые значения: PERMISSION_READ, PERMISSION_CONTRIBUTOR, PERMISSION_WRITE, PERMISSION_ADMIN. Значения PERMISSION_READ, PERMISSION_CONTRIBUTOR и PERMISSION_WRITE задают соответствующий уровень доступа к внутренним репозиториям владельца, а PERMISSION_ADMIN даёт права на администрирование самого владельца. PERMISSION_CUSTOM возвращает InvalidArgument (HTTP 400).

Поля ответа

user object

Principal пользователя. Присутствует ровно одно из полей: user, group или teamGroup.

user.id строка

Публичный идентификатор пользователя с префиксом user_.

user.email строка

Адрес электронной почты пользователя.

user.displayName строка

Отображаемое имя пользователя: имя и фамилия из аккаунта, разделённые пробелом, — то же имя, которое показывает продукт. Не указывается, если у аккаунта нет имени.

user.handle строка

Закреплённый за пользователем идентификатор профиля без префикса @. Присутствует, только пока профиль общедоступен; в остальных случаях не возвращается.

group object

Принципал группы организации Cursor.

group.id строка

Публичный идентификатор группы с префиксом grp_.

teamGroup object

Одна из встроенных групп команды-владельца: доступ команды к владельцу по умолчанию.

teamGroup.kind строка

Встроенная группа, которой выдан доступ. Допустимые значения: members, admins.

permission строка

Право доступа, которым principal теперь обладает в отношении каждого repository, принадлежащего owner.
curl --request POST \  --url 'https://api.cursor.com/v1/origin/owners/OWNER_SLUG/grants' \  --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN' \  --header 'Content-Type: application/json' \  --data '{  "user": {    "id": "user_01k2ja2000e0080000000000c3"  },  "permission": "PERMISSION_WRITE"}'

Структура ответа:

{  "user": {    "id": "user_01k2ja2000e0080000000000c3",    "email": "[email protected]"  },  "permission": "PERMISSION_WRITE"}

Удаление права доступа к пространству имён

DELETE/v1/origin/owners/{ownerSlug}/grants
Scopenamespace:settings:writeAuthInstallation tokenUser access token

Удаляет право доступа, которым пользователь, группа или группа владеющей команды обладает непосредственно на уровне owner. Права доступа для репозитория не затрагиваются. Удаление права доступа, которым principal не обладает напрямую, завершается успешно и ничего не меняет, а удаление, после которого у owner не останется ни одного администратора, возвращает FailedPrecondition (HTTP 400). Тело ответа пустое.

Параметры пути

ownerSlug строка обязательный

Слаг owner.

Тело запроса

user object

Principal пользователя. Присутствует ровно одно из полей: user, group или teamGroup.

user.id строка

Публичный идентификатор пользователя с префиксом user_.

user.email строка

Адрес электронной почты пользователя.

user.displayName строка

Отображаемое имя пользователя: имя и фамилия из аккаунта, разделённые пробелом, — то же имя, которое показывает продукт. Отсутствует, если у аккаунта нет имени.

user.handle строка

Закреплённый за пользователем handle профиля без префикса @. Присутствует, только пока профиль виден публично; в остальных случаях отсутствует.

group object

Principal группы организации Cursor.

group.id строка

Публичный идентификатор группы с префиксом grp_.

teamGroup object

Одна из встроенных групп владеющей команды: доступ команды к owner по умолчанию.

teamGroup.kind строка

Какая встроенная группа обладает правом доступа. Допустимые значения: members, admins.

Поля ответа

При успешном запросе тело ответа отсутствует.

curl --request DELETE \  --url 'https://api.cursor.com/v1/origin/owners/OWNER_SLUG/grants' \  --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN' \  --header 'Content-Type: application/json' \  --data '{  "group": {    "id": "grp_01k2ja2000e0080000000000n2"  }}'

Ответ:

204 No Content

Метки

Определение метки принадлежит одному репозиторию и идентифицируется по имени. Назначение меток pull request — отдельная операция; см. Назначение меток pull request.

Список меток

GET/v1/origin/repos/{ownerSlug}/{repoName}/labels
Scoperepository:labels:readAuthInstallation tokenUser access token

Возвращает список меток, определённых в репозитории, отсортированный по имени.

Токены страниц привязаны к репозиторию, для которого они были выпущены. Повторное использование токена для другого репозитория, как и любой другой некорректный токен, приводит к ошибке InvalidArgument (HTTP 400).

Параметры пути

ownerSlug строка Обязательный

Уникальный слаг сущности-владельца.

repoName строка Обязательный

Имя репозитория, уникальное в пределах сущности-владельца.

Параметры запроса

pageSize целое число

Максимальное количество возвращаемых меток. По умолчанию — 30, если параметр не указан или равен нулю; значения выше 100 ограничиваются до 100.

pageToken строка

Непрозрачный курсор из nextPageToken предыдущего ответа. Для первой страницы не указывайте.

Поля ответа

labels array

Страница определений меток, отсортированных по имени.

labels[].id строка

Публичный идентификатор метки.

labels[].name строка

Имя метки, уникальное в репозитории. По имени метки обращаются к ней в конечных точках чтения и записи.

labels[].color строка

Шестизначный цвет в шестнадцатеричном формате без начального #.

labels[].description строка

Описание метки. Отсутствует, если у метки нет описания.

nextPageToken строка

Непрозрачный курсор для следующей страницы. Пустой, если результатов больше нет.
curl --request GET \  --url 'https://api.cursor.com/v1/origin/repos/OWNER_SLUG/REPO_NAME/labels' \  --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN'

Структура ответа:

{  "labels": [    {      "id": "lbl_01k2ja2000e0080000000000m1",      "name": "bug",      "color": "d73a4a",      "description": "Something isn't working"    }  ]}

Создать метку

POST/v1/origin/repos/{ownerSlug}/{repoName}/labels
Scoperepository:labels:writeAuthInstallation tokenUser access token

Создаёт метку в репозитории.

Если это имя уже используется другой меткой в репозитории, возвращается AlreadyExists (HTTP 409 Conflict). Если color содержит не шесть шестнадцатеричных символов, name длиннее 50 символов или description длиннее 255 символов, возвращается InvalidArgument (HTTP 400).

Параметры пути

ownerSlug строка Обязательный

Уникальный слаг сущности-владельца.

repoName строка Обязательный

Имя репозитория, уникальное в пределах сущности-владельца.

Тело запроса

name строка Обязательный

Имя метки. Пробелы в начале и конце удаляются. Максимальная длина: 50 символов.

color строка Обязательный

Шестизначный цвет в шестнадцатеричном формате без начального #. Заглавные буквы во входных данных сохраняются в нижнем регистре.

description строка

Описание метки. Максимальная длина: 255 символов.

Поля ответа

id строка

Публичный идентификатор метки.

name строка

Имя метки, уникальное в репозитории. Имена используются для обращения к метке в конечных точках чтения и записи.

color строка

Шестизначный цвет в шестнадцатеричном формате без начального #.

description строка

Описание метки. Отсутствует, если у метки нет описания.
curl --request POST \  --url 'https://api.cursor.com/v1/origin/repos/OWNER_SLUG/REPO_NAME/labels' \  --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN' \  --header 'Content-Type: application/json' \  --data '{  "name": "bug",  "color": "d73a4a",  "description": "Something isn'\''t working"}'

Структура ответа:

{  "id": "lbl_01k2ja2000e0080000000000m1",  "name": "bug",  "color": "d73a4a",  "description": "Something isn't working"}

Получить метку

GET/v1/origin/repos/{ownerSlug}/{repoName}/labels/{labelName}
Scoperepository:labels:readAuthInstallation tokenUser access token

Возвращает метку репозитория по имени.

Если имя неизвестно, возвращается 404. Если labelName пуст, возвращается InvalidArgument (HTTP 400).

Параметры пути

ownerSlug строка Обязательный

Уникальный слаг сущности-владельца.

repoName строка Обязательный

Имя репозитория, уникальное в пределах сущности-владельца.

labelName строка Обязательный

Имя метки. Пробелы в начале и конце удаляются перед поиском.

Поля ответа

id строка

Публичный идентификатор метки.

name строка

Имя метки, уникальное в пределах репозитория. По имени метки к ней обращаются в конечных точках чтения и записи.

color строка

Шестизначный цвет в шестнадцатеричном формате без начального #.

description строка

Описание метки. Отсутствует, если у метки нет описания.
curl --request GET \  --url 'https://api.cursor.com/v1/origin/repos/OWNER_SLUG/REPO_NAME/labels/LABEL_NAME' \  --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN'

Структура ответа:

{  "id": "lbl_01k2ja2000e0080000000000m1",  "name": "bug",  "color": "d73a4a",  "description": "Something isn't working"}

Удаление метки

DELETE/v1/origin/repos/{ownerSlug}/{repoName}/labels/{labelName}
Scoperepository:labels:writeAuthInstallation tokenUser access token

Удаляет метку репозитория по имени. Тело ответа пустое.

При удалении метка также удаляется из всех pull request, которым она была назначена. Для неизвестного имени возвращается 404. Если labelName пуст, возвращается InvalidArgument (HTTP 400).

Параметры пути

ownerSlug строка Обязательно

Уникальный слаг сущности-владельца.

repoName строка Обязательно

Имя репозитория, уникальное для сущности-владельца.

labelName строка Обязательно

Имя метки. Пробелы в начале и конце удаляются перед поиском.

Поля ответа

При успешном запросе тело ответа отсутствует.

curl --request DELETE \  --url 'https://api.cursor.com/v1/origin/repos/OWNER_SLUG/REPO_NAME/labels/LABEL_NAME' \  --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN'

Ответ:

204 No Content

Обновить метку

PATCH/v1/origin/repos/{ownerSlug}/{repoName}/labels/{labelName}
Scoperepository:labels:writeAuthInstallation tokenUser access token

Обновляет метку репозитория, указанную по её текущему имени.

Пропущенные поля остаются без изменений. Если не указано ни одно из трёх полей, запрос возвращает метку в текущем состоянии. Попытка переименовать метку в имя, уже используемое другой меткой, возвращает AlreadyExists (HTTP 409 Conflict). Если labelName неизвестен, возвращается 404.

Параметры пути

ownerSlug строка Обязательный

Уникальный слаг сущности-владельца.

repoName строка Обязательный

Имя репозитория, уникальное в пределах сущности-владельца.

labelName строка Обязательный

Текущее имя метки. Пробелы в начале и конце удаляются перед поиском.

Тело запроса

name строка

Новое имя метки. Пробелы в начале и конце удаляются. Максимальная длина — 50 символов. Не указывайте, чтобы не изменять.

color строка

Шестизначный цвет в шестнадцатеричном формате без начального #. Не указывайте, чтобы не изменять.

description строка

Описание метки. Максимальная длина — 255 символов. Не указывайте, чтобы не изменять.

Поля ответа

id строка

Публичный идентификатор метки.

name строка

Имя метки, уникальное в репозитории. По имени метки к ней обращаются через конечные точки чтения и записи.

color строка

Шестизначный цвет в шестнадцатеричном формате без начального #.

description строка

Описание метки. Отсутствует, если у метки нет описания.
curl --request PATCH \  --url 'https://api.cursor.com/v1/origin/repos/OWNER_SLUG/REPO_NAME/labels/LABEL_NAME' \  --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN' \  --header 'Content-Type: application/json' \  --data '{  "color": "b60205"}'

Структура ответа:

{  "id": "lbl_01k2ja2000e0080000000000m1",  "name": "bug",  "color": "b60205",  "description": "Something isn't working"}

Pull requests

Закрытые или смерженные pull request могут дополнительно включать closedAt, mergedAt и mergeCommitSha. Считайте head.ref и base.ref непрозрачными строками Git-ссылок Origin: это могут быть короткие имена веток или полные значения refs/heads/….

verdict ревью принимает значения approve, request_changes или comment. submittedAt отсутствует у неотправленного черновика ревью. dismissal отсутствует, пока вердикт активен. Отклонённые ревью остаются видимыми в списках ревью. Ревью, автоматически заменённые более новым решением, содержат сообщение, сгенерированное сервером.

Комментарии содержат ссылку на thread для группировки. При ответе запросы на создание комментария по-прежнему принимают скалярный параметр команды threadId. Разрешите или повторно откройте тред с помощью Обновление треда pull request.

Список пул-реквестов

GET/v1/origin/repos/{ownerSlug}/{repoName}/pulls
Scoperepository:pull_requests:readAuthInstallation tokenUser access token

Возвращает список pull request в репозитории с возможностью фильтрации по head-ветке, base-ветке, автору, диапазону времени создания и состоянию. Для каждого pull request указаны назначенные ему метки.

Результаты сортируются по порядку создания или по времени последнего обновления, выбираемому с помощью sortBy — сначала самые новые. Установите direction=asc для обратного порядка. Токены страниц встраивают информацию о сортировке и фильтрах, при которых они были созданы, поэтому токен, воспроизведённый с другой сортировкой или набором фильтров, отклоняется; при изменении любого из них перезапустите пагинацию.

Параметры пути

ownerSlug string Обязательно

Уникальный слаг сущности-владельца.

repoName string Обязательно

Имя репозитория, уникальное для сущности-владельца.

Параметры запроса

head string

Необязательный фильтр по точному имени ветки (head-ref). Оставьте пустым, чтобы перечислять по всем веткам.

state string

Фильтр по жизненному циклу. Допустимые значения: open (по умолчанию), closed, merged, all. closed охватывает все pull request, которые больше не открыты, включая влитые; merged ограничивает выборку только влитыми. При любом другом значении возвращается InvalidArgument (HTTP 400).

pageSize целое число

Максимальное количество возвращаемых результатов. По умолчанию — 30; максимум — 100.

pageToken string

Непрозрачный курсор из nextPageToken предыдущего ответа. Не указывайте его для первой страницы.

author string

Необязательный фильтр по автору. Передайте публичный идентификатор участника точно так, как эта конечная точка возвращает его в pullRequests[].author.user.id, pullRequests[].author.app.id или pullRequests[].author.serviceAccount.id (user_…, app_… или sa_…), либо точный адрес электронной почты пользователя. Сопоставление адресов электронной почты нечувствительно к регистру. У приложений и сервисных аккаунтов нет почтового адреса, поэтому таким образом можно выбрать только авторов-пользователей. Для автора без pull request'ов возвращается пустой список, как и в случае, если адрес электронной почты не соответствует ровно одному пользователю. Любое другое значение, включая общий идентификатор origin-cursor-managed-actor, возвращает InvalidArgument (HTTP 400).

base string

Необязательный фильтр по точному имени базовой ветки. Принимает короткое имя (main) или полностью квалифицированный ref (refs/heads/main). Оставьте пустым, чтобы вывести список по всем базам.

direction string

Направление сортировки по sortBy. По умолчанию используется "desc": при sortBy=created сначала возвращаются недавно созданные, а при sortBy=updated — недавно обновлённые. "asc" меняет порядок на обратный. При любом другом значении возвращается InvalidArgument (HTTP 400).

since string

Необязательная включительная нижняя граница по времени создания в формате RFC 3339, например 2026-08-01T00:00:00Z. Возвращаются только pull request, созданные в этот момент или позже. Некорректная метка времени возвращает InvalidArgument (HTTP 400).

until string

Необязательная включительная верхняя граница времени создания в том же формате RFC 3339, что и since. Возвращаются только pull request'ы, созданные в этот момент или ранее. Некорректная метка времени возвращает InvalidArgument (HTTP 400).

sortBy строка

Ключ сортировки. Допустимые значения: created (порядок создания, значение по умолчанию) или updated (время последнего обновления). При любом другом значении возвращается InvalidArgument (HTTP 400).

Поля ответа

pullRequests массив

Страница снимков PullRequest; номера ответов и номера версий — JSON-строки.

pullRequests[].id string

Идентификатор pull request в Stable Origin.

pullRequests[].number строка

Номер pull request в локальном репозитории, закодированный как JSON-строка.

pullRequests[].state string

Состояние pull request: open (открыт) или closed (закрыт). Влитые pull request закрыты, а поле merged установлено в true.

pullRequests[].draft логическое значение

Является ли pull request черновиком.

pullRequests[].merged boolean

Был ли pull request влит.

pullRequests[].title string

Заголовок pull request'а.

pullRequests[].body string

Текст описания pull request.

pullRequests[].head object

Исходная сторона изменения — то, что сливается.

pullRequests[].head.ref строка

Git‑ссылка, на которую указывает эта сторона, в том виде, как её зафиксировал Origin.

pullRequests[].head.sha строка

SHA коммита этой стороны в последней версии изменения.

pullRequests[].base object

Целевая сторона изменения — то, в что оно сливается.

pullRequests[].base.ref строка

Git‑ссылка, на которую указывает эта сторона, в том виде, как её зафиксировал Origin.

pullRequests[].base.sha string

SHA последнего коммита этой стороны в последней версии изменения.

pullRequests[].author object

Публичный участник, открывший pull request.

pullRequests[].author.user object

Вариант субъекта — пользователь. Устанавливается, когда действие выполняет пользователь.

pullRequests[].author.user.id string

Публичный идентификатор пользователя.

pullRequests[].author.user.email string

Адрес электронной почты пользователя. Всегда задаётся, когда присутствует вариант user.

pullRequests[].author.user.displayName string

Отображаемое имя пользователя: имя и фамилия аккаунта, разделённые пробелом — то же имя, которое отображает продукт. Не показывается, если у аккаунта нет имени.

pullRequests[].author.user.handle string

Идентификатор профиля, указанный пользователем, без префикса @. Указывается только пока профиль общедоступен; в противном случае отсутствует.

pullRequests[].author.app object

Вариант приложения субъекта. Устанавливается, когда действие выполнено приложением.

pullRequests[].author.app.id string

Публичный идентификатор приложения.

pullRequests[].author.app.displayName string

Зарегистрированное отображаемое имя приложения. Пропускается, если приложение нельзя разрешить, а также для управляемого актёра первой стороны Cursor.

pullRequests[].author.serviceAccount object

Вариант субъекта действия — сервисный аккаунт. Устанавливается, когда действие выполнено сервисным аккаунтом.

pullRequests[].author.serviceAccount.id string

Публичный идентификатор учетной записи службы.

pullRequests[].createdAt string

Метка времени создания pull request в формате RFC 3339.

pullRequests[].updatedAt string

Метка времени в формате RFC 3339 для последнего обновления pull request.

pullRequests[].closedAt string

Отметка времени закрытия в формате RFC 3339; может отображаться в закрытых или влитых pull request.

pullRequests[].mergedAt string

Метка времени слияния в формате RFC 3339; может отображаться в объединённых pull request.

pullRequests[].mergeCommitSha string

SHA коммита слияния; может появляться после слияния.

pullRequests[].additions целое число

Строки, добавленные в текущую версию pull request.

pullRequests[].deletions целое число

Удалённые строки в текущей версии pull request.

pullRequests[].changedFiles целое число

Количество изменённых файлов в текущей версии pull request.

pullRequests[].labels массив

Метки, назначенные этому pull request, отсортированы по имени. Пусто, если метки не назначены.

pullRequests[].labels[].id string

Публичный идентификатор метки.

pullRequests[].labels[].name строка

Имя метки, уникальное в репозитории. Имена используются для обращения к метке в конечных точках записи.

pullRequests[].labels[].color string

Шестизначный шестнадцатеричный цвет без ведущего #.

pullRequests[].labels[].description string

Описание метки. Отсутствует, если у метки нет описания.

pullRequests[].version object

Текущая пронумерованная версия pull request и SHA её head/base.

pullRequests[].version.number строка

Монотонно возрастающий номер версии pull request, представленный в виде JSON-строки.

pullRequests[].version.headSha строка

SHA хэда, зафиксированная в этой версии pull request.

pullRequests[].version.baseSha string

SHA базовой ветки, зафиксированный в этой версии pull request.

pullRequests[].version.createdAt string

Метка времени RFC 3339 для создания этой версии pull request.

nextPageToken string

Непрозрачный токен продолжения, возвращаемый в ответе на запрос списка; пустая строка означает отсутствие следующей страницы. Не просматривайте и не создавайте его, и при изменении репозитория или фильтров начните пагинацию заново.
curl --request GET \  --url 'https://api.cursor.com/v1/origin/repos/OWNER_SLUG/REPO_NAME/pulls' \  --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN'

Структура ответа:

{  "pullRequests": [    {      "id": "pr_01k2ja2000e0080000000000d4",      "number": "17",      "state": "open",      "draft": false,      "merged": false,      "title": "Add launch telemetry",      "body": "Adds structured launch telemetry to the ignition path.",      "head": {        "ref": "add-telemetry",        "sha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4"      },      "base": {        "ref": "main",        "sha": "3b1f9c2d8a7e6f5049c8b7a6d5e4f3a2b1c0d9e8"      },      "author": {        "user": {          "id": "user_01k2ja2000e0080000000000c3",          "email": "[email protected]"        }      },      "createdAt": "2026-08-01T09:30:00Z",      "updatedAt": "2026-08-02T14:45:00Z",      "additions": 128,      "deletions": 46,      "changedFiles": 5,      "labels": [        {          "id": "lbl_01k2ja2000e0080000000000m1",          "name": "bug",          "color": "d73a4a",          "description": "Something isn't working"        }      ],      "version": {        "number": "3",        "headSha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4",        "baseSha": "3b1f9c2d8a7e6f5049c8b7a6d5e4f3a2b1c0d9e8",        "createdAt": "2026-08-01T09:30:00Z"      }    }  ]}

Получить Pull Request

GET/v1/origin/repos/{ownerSlug}/{repoName}/pulls/{pullNumber}
Scoperepository:pull_requests:readAuthInstallation tokenUser access token

Возвращает один pull request вместе с назначенными ему метками.

Закрытые или объединённые pull request'ы могут дополнительно включать closedAt, mergedAt и mergeCommitSha. Рассматривайте head.ref и base.ref как непрозрачные строки ref Origin; это могут быть короткие имена веток или полностью квалифицированные значения refs/heads/….

Параметры пути

ownerSlug string Обязательно

Уникальный слаг владельца сущности.

repoName string Обязательно

Имя репозитория, уникальное для сущности-владельца.

pullNumber string Обязательно

Поля ответа

id строка

Идентификатор pull request в Stable Origin.

number string

Номер pull request в локальном репозитории, закодированный как JSON-строка.

state string

Состояние pull request: открытый или закрытый. Слитые pull request считаются закрытыми, а поле merged установлено в true.

draft boolean

Является ли запрос на вытягивание (pull request) черновиком.

merged boolean

Слился ли pull request.

title string

Заголовок pull request.

body string

Текст описания pull request.

head object

Исходная сторона изменения — то, что вносится.

head.ref string

Git‑ссылка, на которую указывает эта сторона, в том виде, как её записывает Origin.

head.sha string

SHA последнего коммита этой стороны в последней версии изменения.

base object

Целевая сторона изменения — то, во что оно сливается.

base.ref string

Git‑ссылка, на которую указывает эта сторона, в том виде, как её записывает Origin.

base.sha string

SHA последнего коммита этой стороны в последней версии изменения.

author object

Публичный актор, открывший pull request.

author.user object

Вариант субъекта — пользователь. Устанавливается, когда действие выполнено пользователем.

author.user.id строка

Публичный идентификатор пользователя.

author.user.email строка

Адрес электронной почты пользователя. Всегда задаётся, когда присутствует вариант user.

author.user.displayName строка

Отображаемое имя пользователя: имя и фамилия аккаунта, соединённые пробелом, — то же имя, которое показывает продукт. Отсутствует, если у аккаунта нет имени.

author.user.handle строка

Заявленный пользователем идентификатор профиля без префикса @. Присутствует только пока профиль общедоступен; в противном случае отсутствует.

author.app object

Вариант субъекта: приложение. Устанавливается, когда действие выполнено приложением.

author.app.id строка

Публичный идентификатор приложения.

author.app.displayName строка

Зарегистрированное отображаемое имя приложения. Не указывается, если приложение не удаётся разрешить, а также для собственного управляемого актора Cursor.

author.serviceAccount object

Вариант участника — сервисный аккаунт. Устанавливается, когда действие выполнено сервисным аккаунтом.

author.serviceAccount.id string

Публичный идентификатор служебной учётной записи.

createdAt string

Временная метка создания pull request в формате RFC 3339.

updatedAt строка

Метка времени RFC 3339 для последнего обновления pull request.

closedAt строка

Временная метка закрытия в формате RFC 3339; может присутствовать в закрытых или объединённых pull request.

mergedAt string

Временная метка слияния в формате RFC 3339; может отображаться в объединённых pull request.

mergeCommitSha string

SHA merge-коммита; может появляться после слияния.

additions целое число

Строки, добавленные в текущей версии pull request.

deletions целое число

Строки, удалённые в текущей версии pull request.

changedFiles целое число

Количество изменённых файлов в текущей версии pull request.

labels массив

Метки, назначенные этому pull request, отсортированы по имени. Пусто, если меток нет.

labels[].id строка

Публичный идентификатор метки.

labels[].name строка

Имя метки, уникальное в репозитории. Имена используются для обращения к метке в конечных точках записи.

labels[].color строка

Шестизначный шестнадцатеричный цвет без ведущего символа #.

labels[].description строка

Описание метки. Отсутствует, если у метки нет описания.

version object

Текущая пронумерованная версия pull request и SHA её head- и base-веток.

version.number string

Монотонно возрастающий номер версии pull request, закодированный в виде JSON-строки.

version.headSha строка

SHA головы (Head), зафиксированный этой версией pull request.

version.baseSha строка

SHA базовой ветки, зафиксированный этой версией pull request.

version.createdAt string

Метка времени создания этой версии pull request в формате RFC 3339.
curl --request GET \  --url 'https://api.cursor.com/v1/origin/repos/OWNER_SLUG/REPO_NAME/pulls/PULL_NUMBER' \  --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN'

Структура ответа:

{  "id": "pr_01k2ja2000e0080000000000d4",  "number": "17",  "state": "open",  "draft": false,  "merged": false,  "title": "Add launch telemetry",  "body": "Adds structured launch telemetry to the ignition path.",  "head": {    "ref": "add-telemetry",    "sha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4"  },  "base": {    "ref": "main",    "sha": "3b1f9c2d8a7e6f5049c8b7a6d5e4f3a2b1c0d9e8"  },  "author": {    "user": {      "id": "user_01k2ja2000e0080000000000c3",      "email": "[email protected]"    }  },  "createdAt": "2026-08-01T09:30:00Z",  "updatedAt": "2026-08-02T14:45:00Z",  "additions": 128,  "deletions": 46,  "changedFiles": 5,  "labels": [    {      "id": "lbl_01k2ja2000e0080000000000m1",      "name": "bug",      "color": "d73a4a",      "description": "Something isn't working"    }  ],  "version": {    "number": "3",    "headSha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4",    "baseSha": "3b1f9c2d8a7e6f5049c8b7a6d5e4f3a2b1c0d9e8",    "createdAt": "2026-08-01T09:30:00Z"  }}

Создать запрос на перенос (Pull Request)

POST/v1/origin/repos/{ownerSlug}/{repoName}/pulls
Scoperepository:pull_requests:writeAuthInstallation tokenUser access token

Создаёт pull request из head в base.

Необязательный параметр parent_pull_number помещает это изменение в стек поверх другого открытого или черновикового pull request в том же репозитории.

Если title длиннее 256 символов или body длиннее 65 536 символов, возвращается InvalidArgument (HTTP 400). Оба ограничения учитывают кодовые точки Unicode.

Если у head нет общей истории с base, возвращается InvalidArgument (HTTP 400) и ничего не создаётся. Если позже push приведёт к тому, что head открытого pull request перестанет иметь общую историю с его base, Origin закроет pull request и отправит pull_request.closed; последующий связанный push не откроет его снова.

Параметры пути

ownerSlug string Обязательно

Уникальный слаг владеющей сущности.

repoName string Обязательно

Имя репозитория, уникальное в пределах сущности-владельца.

Тело запроса

title string Обязательно

Заголовок pull request. Максимальная длина: 256 символов.

body строка

Тело или описание pull request. Может быть пустым. Максимальная длина: 65 536 символов.

head string Обязательно

Имя исходной ветки (вершина изменения). Должно разрешаться в репозитории во время вызова.

base string Обязательно

Имя целевой ветки (в которую сливается изменение). Должно указывать на ветку, существующую в репозитории на момент вызова. SHA коммита, имя тега или несуществующая ветка приводят к возврату InvalidArgument (HTTP 400).

draft boolean

Если true — создать черновик. Если false или параметр не указан — создать открытый (готовый к ревью).

parentPullNumber string

Необязательный номер родительского pull request при наложении этого изменения на другое открытое или черновое изменение в том же репозитории.

Поля ответа

id строка

Идентификатор pull request для Stable Origin.

number string

Номер pull request в локальном репозитории, закодированный как JSON-строка.

state строка

Состояние pull request: открытый или закрытый. Объединённые pull request закрыты, при этом поле merged установлено в true.

draft boolean

Является ли pull request черновиком.

merged boolean

Был ли pull request объединён.

title строка

Заголовок pull request.

body строка

Тело описания pull request.

head object

Исходная сторона изменения — то, что сливается.

head.ref строка

Git‑ссылка, на которую указывает эта сторона, согласно записям Origin.

head.sha string

SHA последнего коммита этой стороны в последней версии изменения.

base object

Целевая сторона изменения — то, с чем оно сливается.

base.ref строка

Git‑ссылка, на которую указывает эта сторона, согласно записям Origin.

base.sha строка

SHA последнего коммита этой стороны в последней версии изменения.

author object

Публичный участник, открывший pull request.

author.user object

Вариант субъекта — пользователь. Устанавливается, когда действие выполнил пользователь.

author.user.id string

Публичный идентификатор пользователя.

author.user.email string

Адрес электронной почты пользователя. Всегда указывается, когда присутствует вариант user.

author.user.displayName string

Отображаемое имя пользователя: имя и фамилия аккаунта, разделённые пробелом, то же имя, которое отображает продукт. Не указывается, если у аккаунта нет имени.

author.user.handle string

Идентификатор заявленного пользователем профиля без префикса @. Присутствует только, пока этот профиль публично видим; в противном случае отсутствует.

author.app object

Вариант актёра — приложение. Устанавливается, когда действие выполняет приложение.

author.app.id string

Публичный идентификатор приложения.

author.app.displayName string

Зарегистрированное отображаемое имя приложения. Опускается, если приложение не удаётся разрешить, а также для собственного управляемого субъекта Cursor.

author.serviceAccount object

Вариант субъекта — сервисный аккаунт. Устанавливается, когда действие выполнено сервисным аккаунтом.

author.serviceAccount.id строка

Публичный идентификатор служебной учётной записи.

createdAt string

Метка времени создания pull request в формате RFC 3339.

updatedAt строка

Метка времени в формате RFC 3339 для последнего обновления pull request.

closedAt строка

Временная метка закрытия в формате RFC 3339; может отображаться для закрытых или объединённых pull request.

mergedAt строка

Временная метка слияния в формате RFC 3339; может появляться в объединённых pull request.

mergeCommitSha string

SHA коммита слияния; может отображаться после слияния.

additions целое число

Строки, добавленные в текущей версии pull request.

deletions целое число

Удалённые строки в текущей версии pull request.

changedFiles целое число

Количество изменённых файлов в текущей версии pull request.

labels массив

Метки, назначенные этому pull request, отсортированные по имени. Пусто, если меток нет.

labels[].id строка

Публичный идентификатор метки.

labels[].name string

Имя метки, уникальное в репозитории. По имени метка адресуется в конечных точках записи.

labels[].color string

Шестизначный шестнадцатеричный цвет без ведущего символа #.

labels[].description строка

Описание метки. Отсутствует, если у метки его нет.

version object

Текущая пронумерованная версия pull request и SHA-значения head/base.

version.number строка

Монотонно возрастающий номер версии pull request, представленный в виде JSON-строки.

version.headSha строка

SHA коммита в HEAD, зафиксированный этой версией pull request.

version.baseSha string

Базовый SHA, зафиксированный этой версией pull request.

version.createdAt строка

Метка времени RFC 3339 для создания этой версии запроса на внесение изменений.
curl --request POST \  --url 'https://api.cursor.com/v1/origin/repos/OWNER_SLUG/REPO_NAME/pulls' \  --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN' \  --header 'Content-Type: application/json' \  --data '{  "title": "Add launch telemetry",  "body": "Adds structured launch telemetry to the ignition path.",  "head": "add-telemetry",  "base": "main",  "draft": false}'

Структура ответа:

{  "id": "pr_01k2ja2000e0080000000000d4",  "number": "17",  "state": "open",  "draft": false,  "merged": false,  "title": "Add launch telemetry",  "body": "Adds structured launch telemetry to the ignition path.",  "head": {    "ref": "add-telemetry",    "sha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4"  },  "base": {    "ref": "main",    "sha": "3b1f9c2d8a7e6f5049c8b7a6d5e4f3a2b1c0d9e8"  },  "author": {    "user": {      "id": "user_01k2ja2000e0080000000000c3",      "email": "[email protected]"    }  },  "createdAt": "2026-08-01T09:30:00Z",  "updatedAt": "2026-08-02T14:45:00Z",  "additions": 128,  "deletions": 46,  "changedFiles": 5,  "labels": [    {      "id": "lbl_01k2ja2000e0080000000000m1",      "name": "bug",      "color": "d73a4a",      "description": "Something isn't working"    }  ],  "version": {    "number": "3",    "headSha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4",    "baseSha": "3b1f9c2d8a7e6f5049c8b7a6d5e4f3a2b1c0d9e8",    "createdAt": "2026-08-01T09:30:00Z"  }}

Обновить pull request

PATCH/v1/origin/repos/{ownerSlug}/{repoName}/pulls/{pullNumber}
Scoperepository:pull_requests:writeAuthInstallation tokenUser access token

Обновляет заголовок, описание, базовую ветку и/или состояние жизненного цикла pull request'а.

Пропущенные поля остаются без изменений. Переданные поля применяются в следующем порядке: metadata, затем reopen/draft/ready-for-review, затем base, затем close. Операция close выполняется последней, поэтому смена целевой ветки в том же запросе всё ещё может увидеть открытое изменение; reopen выполняется до base, поэтому для закрытого pull request можно сменить целевую ветку. Если один из последующих шагов завершится ошибкой, предыдущие шаги уже могут быть применены.

Если длина title больше 256 символов или длина body больше 65 536 символов, возвращается InvalidArgument (HTTP 400). Оба ограничения считаются в кодовых точках Unicode.

Параметры пути

ownerSlug string Обязательно

Уникальный слаг сущности-владельца.

repoName string Обязательно

Имя репозитория, уникальное для сущности-владельца.

pullNumber string Обязательное

Тело запроса

title string

Новое название. Пропущенные поля остаются без изменений. Максимальная длина: 256 символов.

body string

Новое содержимое/описание. Пустая строка очищает содержимое. Максимальная длина: 65 536 символов.

state строка

"open" или "closed". "closed" закрывает pull request. "open" без draft: true переводит его в состояние готовности к ревью, в том числе публикует существующий черновик. Состояние Merged нельзя изменить. Используйте MergePullRequest.

draft boolean

true помечает pull request как черновик; false — как готовый к ревью (и повторно открывает его, если он закрыт). Игнорируется, когда state равно "closed".

base строка

Новая базовая ветка. Перенаправляет pull request и может обновить родительские связи стека, если новая база — это head другой правки (или ветка по умолчанию). Должна указывать на ветку, существующую в репозитории на момент вызова; SHA коммита, имя тега или несуществующая ветка приводят к возврату InvalidArgument (HTTP 400).

Поля ответа

id string

Идентификатор pull request для Stable Origin.

number string

Номер пулл-реквеста в пределах репозитория, закодированный как JSON-строка.

state строка

Состояние pull request: открытый или закрытый. Объединённые pull request закрыты, при этом merged установлено в true.

draft boolean

Является ли pull request черновиком.

merged boolean

Объединён ли pull request.

title string

Заголовок pull request.

body string

Тело описания pull request.

head объект

Исходная сторона изменения — то, что сливается в текущую ветку.

head.ref строка

Git‑ссылка, на которую указывает эта сторона, согласно записям Origin.

head.sha string

SHA последнего коммита этой стороны в самой последней версии изменения.

base object

Целевая сторона изменения — то, с чем оно сливается.

base.ref строка

Git‑ссылка, на которую указывает эта сторона, согласно записям Origin.

base.sha string

SHA последнего коммита этой стороны в самой последней версии изменения.

author object

Публичный участник, открывший pull request.

author.user object

Вариант субъекта — пользователь. Устанавливается, когда действие выполняет пользователь.

author.user.id string

Публичный идентификатор пользователя.

author.user.email string

Адрес электронной почты пользователя. Всегда задаётся при наличии варианта пользователя.

author.user.displayName string

Отображаемое имя пользователя: имя и фамилия учётной записи, разделённые пробелом — то же имя, которое отображает продукт. Не показывается, если у учётной записи нет имени.

author.user.handle string

Заявленный пользователем handle профиля, без префикса @. Присутствует, только пока этот профиль публично доступен; в остальных случаях отсутствует.

author.app object

Вариант приложения субъекта. Устанавливается, когда действие выполнено приложением.

author.app.id string

Публичный идентификатор приложения.

author.app.displayName string

Зарегистрированное отображаемое имя приложения. Опускается, если приложение не удаётся определить, а также для собственного управляемого субъекта Cursor.

author.serviceAccount object

Вариант субъекта — сервисный аккаунт. Устанавливается, когда действие выполнено сервисным аккаунтом.

author.serviceAccount.id строка

Публичный идентификатор сервисного аккаунта.

createdAt string

Временная метка создания pull request в формате RFC 3339.

updatedAt string

Метка времени RFC 3339 для последнего обновления pull request.

closedAt строка

Временная метка закрытия в формате RFC 3339; может присутствовать у закрытых или объединённых pull request'ов.

mergedAt string

Временная метка слияния в формате RFC 3339; может появляться в объединённых pull request.

mergeCommitSha string

SHA коммита слияния; может появляться после слияния.

additions целое число

Строки, добавленные в текущей версии pull request.

deletions целое число

Удалённые строки в текущей версии pull request.

changedFiles целое число

Количество изменённых файлов в текущей версии pull request.

labels массив

Метки, назначенные этому pull request, отсортированные по имени. Пусто, если метки не назначены.

labels[].id string

Публичный идентификатор метки.

labels[].name string

Имя метки, уникальное в пределах репозитория. По имени метка адресуется в конечных точках записи.

labels[].color string

Шестизначный шестнадцатеричный цвет без ведущего символа #.

labels[].description строка

Описание метки. Отсутствует, если у метки нет описания.

version object

Текущая пронумерованная версия pull request и SHA его head- и base-веток.

version.number строка

Монотонно возрастающий номер версии pull request, закодированный как строка JSON.

version.headSha строка

SHA коммита, зафиксированный этой версией pull request.

version.baseSha string

SHA base-ветки, зафиксированный этой версией pull request.

version.createdAt string

Метка времени RFC 3339 для создания этой версии pull request.
curl --request PATCH \  --url 'https://api.cursor.com/v1/origin/repos/OWNER_SLUG/REPO_NAME/pulls/PULL_NUMBER' \  --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN' \  --header 'Content-Type: application/json' \  --data '{  "title": "Add launch telemetry",  "body": "Adds structured launch telemetry to the ignition path.",  "state": "open",  "draft": false,  "base": "main"}'

Структура ответа:

{  "id": "pr_01k2ja2000e0080000000000d4",  "number": "17",  "state": "open",  "draft": false,  "merged": false,  "title": "Add launch telemetry",  "body": "Adds structured launch telemetry to the ignition path.",  "head": {    "ref": "add-telemetry",    "sha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4"  },  "base": {    "ref": "main",    "sha": "3b1f9c2d8a7e6f5049c8b7a6d5e4f3a2b1c0d9e8"  },  "author": {    "user": {      "id": "user_01k2ja2000e0080000000000c3",      "email": "[email protected]"    }  },  "createdAt": "2026-08-01T09:30:00Z",  "updatedAt": "2026-08-02T14:45:00Z",  "additions": 128,  "deletions": 46,  "changedFiles": 5,  "labels": [    {      "id": "lbl_01k2ja2000e0080000000000m1",      "name": "bug",      "color": "d73a4a",      "description": "Something isn't working"    }  ],  "version": {    "number": "3",    "headSha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4",    "baseSha": "3b1f9c2d8a7e6f5049c8b7a6d5e4f3a2b1c0d9e8",    "createdAt": "2026-08-01T09:30:00Z"  }}

Список комментариев к pull request

GET/v1/origin/repos/{ownerSlug}/{repoName}/pulls/{pullNumber}/comments
Scoperepository:pull_requests:reviews:readAuthInstallation tokenUser access token

Перечисляет все комментарии к pull request в хронологическом порядке, при необходимости ограничивая выборку окном по времени создания. Каждый комментарий содержит полный тред: идентификатор, привязку к диффу и статус разрешения. Группируйте плоский ответ по thread.id без дополнительного запроса.

Токены страниц содержат фильтры, с которыми они были выпущены, поэтому токен, повторно использованный с другими фильтрами, будет отклонён; при изменении фильтра начните пагинацию заново.

Параметры пути

ownerSlug string Обязательно

Уникальный слаг владеющей сущности.

repoName string Обязательно

Имя репозитория, уникальное для сущности-владельца.

pullNumber string Обязательно

Параметры запроса

pageSize целое число

Максимальное количество возвращаемых комментариев. По умолчанию 30; максимум 100.

pageToken строка

Непрозрачный курсор из nextPageToken предыдущего ответа. Для первой страницы не указывайте.

since string

Необязательная включающая нижняя граница времени создания комментария в формате RFC 3339, например 2026-08-01T00:00:00Z. Возвращаются только комментарии, созданные в этот момент или позже. При некорректной метке времени возвращается InvalidArgument (HTTP 400).

until string

Необязательная верхняя включительная граница времени создания комментария в том же формате RFC 3339, что и since. Возвращаются только комментарии, созданные в этот момент или ранее. При неверном формате метки времени возвращается ошибка InvalidArgument (HTTP 400).

threadIds массив

Необязательные идентификаторы потоков, ограничивающие список комментариями из этих потоков. Не указывайте этот параметр, чтобы вернуть все комментарии к pull request. Дубликаты игнорируются, поэтому ограничение в 20 применяется к уникальным идентификаторам. Более длинный список или пустой идентификатор возвращают InvalidArgument (HTTP 400).

Поля ответа

comments массив

Видимые общие и встроенные комментарии в одном плоском хронологическом списке; группируйте их по thread.id.

comments[].id string

Стабильный идентификатор комментария к pull request.

comments[].thread object

Тема, к которой относится этот комментарий, включая якорь в diff и состояние разрешения.

comments[].thread.id string

Стабильный идентификатор потока. Группируйте комментарии в одном обсуждении по этому значению.

comments[].thread.version object

Версия pull request, к которой относится ветка обсуждения, включая SHA для head и base. Якорь закреплён за этой версией и не перемещается по мере появления новых версий pull request.

comments[].thread.version.number строка

Монотонно возрастающий номер версии pull request, представленный в виде JSON-строки.

comments[].thread.version.headSha строка

SHA головы (head), зафиксированный этой версией pull request.

comments[].thread.version.baseSha строка

SHA базы, зафиксированный этой версией pull request.

comments[].thread.version.createdAt string

Метка времени в формате RFC 3339 для создания этой версии pull request.

comments[].thread.path строка

Путь к файлу, к которому привязан якорь diff треда. Пусто для тредов общего обсуждения.

comments[].thread.side строка

Сторона отличий (diff), к которой привязан якорь. Допустимые значения: left, right. Не задано для веток общего обсуждения.

comments[].thread.startLine целое число

Первая строка закреплённого диапазона в версии файла side. 0 — для веток уровня файла и общих обсуждений.

comments[].thread.endLine целое число

Последняя строка якорного диапазона (включительно). 0, если якорь состоит из одной строки или не имеет диапазона строк.

comments[].thread.resolvedAt string

Метка времени RFC 3339, указывающая, когда тред был разрешён. Не задана, пока тред открыт.

comments[].thread.createdAt string

Метка времени создания треда в формате RFC 3339.

comments[].thread.updatedAt строка

Метка времени RFC 3339 для последнего обновления треда.

comments[].body string

Текст комментария.

comments[].author object

Публичное лицо, написавшее комментарий.

comments[].author.user object

Вариант субъекта для пользователя. Задаётся, когда действие выполнил пользователь.

comments[].author.user.id строка

Публичный идентификатор пользователя.

comments[].author.user.email string

Адрес электронной почты пользователя. Всегда задаётся, когда присутствует вариант user.

comments[].author.user.displayName строка

Отображаемое имя пользователя: имя и фамилия учётной записи, соединённые пробелом — то же имя, которое отображает продукт. Опускается, если у учётной записи нет имени.

comments[].author.user.handle string

Заявленный пользователем идентификатор профиля (handle) без префикса @. Присутствует только пока профиль общедоступен; в противном случае отсутствует.

comments[].author.app object

Вариант приложения субъекта. Устанавливается, когда действие выполнено приложением.

comments[].author.app.id строка

Публичный идентификатор приложения.

comments[].author.app.displayName строка

Зарегистрированное отображаемое имя приложения. Пропускается, если приложение не удаётся определить, а также для управляемого актёра первой стороны Cursor.

comments[].author.serviceAccount object

Вариант субъекта действия — служебная учётная запись. Устанавливается, когда действие выполняет служебная учётная запись.

comments[].author.serviceAccount.id строка

Публичный идентификатор учётной записи сервиса.

comments[].createdAt string

Метка времени создания комментария в формате RFC 3339.

comments[].updatedAt строка

Метка времени RFC 3339 для последнего редактирования комментария.

pullRequest object

Контейнер PullRequestReference включён вместе со страницей комментариев.

pullRequest.id строка

Постоянный идентификатор pull request.

pullRequest.number строка

Номер pull request в локальном репозитории, закодированный как JSON-строка.

pullRequest.repository объект

Ссылка на контейнер репозитория для pull request.

pullRequest.repository.id string

Идентификатор репозитория в ссылке на контейнер.

pullRequest.repository.name string

Имя репозитория в ссылке на контейнер.

pullRequest.repository.owner object

Ссылка на владельца репозитория.

pullRequest.repository.owner.slug строка

Слаг владельца, используемый в URL вместе с идентификатором владельца для определения владельца репозитория.

pullRequest.repository.owner.id строка

Идентификатор владельца Origin.

pullRequest.repository.owner.type строка

Тип пространства имён владельца. Только для чтения. Допустимые значения: team, user. Не указывается, если неизвестно.

nextPageToken string

Непрозрачный курсор для следующей страницы; пусто, если комментариев больше нет.
curl --request GET \  --url 'https://api.cursor.com/v1/origin/repos/OWNER_SLUG/REPO_NAME/pulls/PULL_NUMBER/comments' \  --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN'

Структура ответа:

{  "comments": [    {      "id": "cmt_01k2ja2000e0080000000000e5",      "thread": {        "id": "cth_01k2ja2000e0080000000000s6",        "version": {          "number": "3",          "headSha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4",          "baseSha": "3b1f9c2d8a7e6f5049c8b7a6d5e4f3a2b1c0d9e8",          "createdAt": "2026-08-01T09:30:00Z"        },        "path": "src/telemetry/retry.ts",        "side": "right",        "startLine": 42,        "endLine": 45,        "createdAt": "2026-08-01T09:30:00Z",        "updatedAt": "2026-08-02T14:45:00Z"      },      "body": "Should the retry budget be configurable?",      "author": {        "user": {          "id": "user_01k2ja2000e0080000000000c3",          "email": "[email protected]"        }      },      "createdAt": "2026-08-01T09:30:00Z",      "updatedAt": "2026-08-02T14:45:00Z"    }  ],  "pullRequest": {    "id": "pr_01k2ja2000e0080000000000d4",    "number": "17",    "repository": {      "id": "repo_01k2ja2000e0080000000000q4",      "name": "rocket",      "owner": {        "slug": "acme",        "id": "ns_01k2ja2000e0080000000000p3",        "type": "team"      }    }  }}

Получить комментарий к pull request

GET/v1/origin/repos/{ownerSlug}/{repoName}/pulls/comments/{commentId}
Scoperepository:pull_requests:reviews:readAuthInstallation tokenUser access token

Возвращает один комментарий к pull request по его стабильному идентификатору Origin. Комментарий за пределами авторизованного репозитория или комментарий из ожидающего рассмотрения ревью, недоступный вызывающей стороне, возвращает 404.

Параметры пути

ownerSlug string Обязательный

Уникальный слаг сущности-владельца.

repoName string Обязательно

Имя репозитория, уникальное для сущности-владельца.

commentId string Обязательно

Поля ответа

id string

Стабильный идентификатор комментария к pull request.

thread object

Тред, к которому относится этот комментарий, включая якорь diff и состояние разрешения.

thread.id string

Стабильный идентификатор потока. Группируйте комментарии в одном обсуждении по этому значению.

thread.version object

Версия pull request, к которой относится обсуждение, включая SHA для ветвей head и base. Якорь привязан к этой версии и не перемещается при появлении новых версий pull request.

thread.version.number string

Монотонно возрастающий номер версии pull request, закодированный в виде JSON-строки.

thread.version.headSha string

SHA коммита head-ветки, зафиксированный в этой версии pull request.

thread.version.baseSha string

Базовый SHA, зафиксированный этой версией pull request.

thread.version.createdAt string

Метка времени RFC 3339 для создания этой версии pull request.

thread.path string

Путь к файлу, к которому привязан дифф треда. Для тредов общего обсуждения пусто.

thread.side string

Сторона diff-якоря. Допустимые значения: left, right. Не задано для тредов общего обсуждения.

thread.startLine integer

Первая строка закреплённого диапазона в версии файла side. 0 — для тредов на уровне файла и общего обсуждения.

thread.endLine integer

Включительная последняя строка закреплённого диапазона. 0, если якорь — одна строка или не имеет диапазона строк.

thread.resolvedAt string

Метка времени (RFC 3339), указывающая, когда тред был разрешён. Не установлена, пока тред открыт.

thread.createdAt string

Метка времени создания треда в формате RFC 3339.

thread.updatedAt string

Метка времени RFC 3339 для последнего обновления треда.

body string

Текст комментария.

author object

Публичный участник, создавший комментарий.

author.user object

Вариант субъекта — пользователь. Устанавливается, когда действие выполняет пользователь.

author.user.id string

Публичный идентификатор пользователя.

author.user.email string

Адрес электронной почты пользователя. Всегда задаётся, когда присутствует вариант user.

author.user.displayName string

Отображаемое имя пользователя: имя и фамилия аккаунта, разделённые пробелом — то же имя, что отображает продукт. Не указывается, если у аккаунта нет имени.

author.user.handle string

Идентификатор профиля, заявленный пользователем, без префикса @. Указывается только пока этот профиль публично виден; иначе не указывается.

author.app object

Вариант субъекта — приложение. Устанавливается, когда действие выполнено приложением.

author.app.id string

Публичный идентификатор приложения.

author.app.displayName string

Зарегистрированное отображаемое имя приложения. Не указывается, если приложение не удаётся определить, а также для управляемого Cursor собственными силами актёра первой стороны.

author.serviceAccount object

Вариант участника — сервисный аккаунт. Устанавливается, когда действие выполнено сервисным аккаунтом.

author.serviceAccount.id string

Публичный идентификатор служебной учетной записи.

createdAt string

Метка времени создания комментария в формате RFC 3339.

updatedAt string

Метка времени RFC 3339 для последнего редактирования комментария.
curl --request GET \  --url 'https://api.cursor.com/v1/origin/repos/OWNER_SLUG/REPO_NAME/pulls/comments/COMMENT_ID' \  --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN'

Структура ответа:

{  "id": "cmt_01k2ja2000e0080000000000e5",  "thread": {    "id": "cth_01k2ja2000e0080000000000s6",    "version": {      "number": "3",      "headSha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4",      "baseSha": "3b1f9c2d8a7e6f5049c8b7a6d5e4f3a2b1c0d9e8",      "createdAt": "2026-08-01T09:30:00Z"    },    "path": "src/telemetry/retry.ts",    "side": "right",    "startLine": 42,    "endLine": 45,    "createdAt": "2026-08-01T09:30:00Z",    "updatedAt": "2026-08-02T14:45:00Z"  },  "body": "Should the retry budget be configurable?",  "author": {    "user": {      "id": "user_01k2ja2000e0080000000000c3",      "email": "[email protected]"    }  },  "createdAt": "2026-08-01T09:30:00Z",  "updatedAt": "2026-08-02T14:45:00Z"}

Создать комментарий к pull request

POST/v1/origin/repos/{ownerSlug}/{repoName}/pulls/{pullNumber}/comments
Scoperepository:pull_requests:reviews:writeAuthInstallation tokenUser access token

Создаёт комментарий к Origin pull request. Комментарий относится ровно к одному из четырёх вариантов: threadId отвечает в существующем треде — как для общего обсуждения, так и для inline; inline создаёт новый тред, привязанный к диапазону строк в диффе версии pull request; file создаёт новый тред для всего файла в этом диффе; если не указано ни одно из них, создаётся новый тред общего обсуждения. Тела длиной более 65 536 символов отклоняются с ошибкой InvalidArgument (HTTP 400).

Привязка inline должна ссылаться на дифф версии. path должен быть частью этого диффа, и на указанной side должно быть содержимое, поэтому привязка left к добавленному файлу или right к удалённому файлу отклоняется с ошибкой InvalidArgument (HTTP 400). Любая строка изменённого файла может быть якорем, и диапазон не ограничен хунками диффа. Диапазон должен укладываться в файл на привязанной стороне: left читается на base-коммите, а right — на head; диапазон, выходящий за последнюю строку, отклоняется с ошибкой InvalidArgument (HTTP 400). Origin никогда не переходит на комментарий общего обсуждения, когда якорь недействителен.

Якорь file содержит только путь. Origin определяет сторону по типу изменения файла: для удалённого файла — base-версию, в остальных случаях — head-версию, и возвращает её в thread.side. Для удаления отправляйте путь удалённого файла, для любого другого изменения — путь из head-версии. Путь, выходящий за пределы диффа, отклоняется с ошибкой InvalidArgument (HTTP 400), как и исходный путь переименованного файла до переименования.

Параметры пути

ownerSlug строка Обязательно

Уникальный слаг сущности-владельца.

repoName string Обязательно

Имя репозитория, уникальное для сущности-владельца.

pullNumber строка Обязательно

Тело запроса

body string Обязательно

Текст комментария. Максимальная длина: 65 536 символов, учитывается число кодовых точек Unicode.

threadId string

Идентификатор существующей ветки, на которую нужно ответить. Оставьте пустым, чтобы открыть новую ветку. Нельзя использовать вместе с versionNumber.

inline object

Якорь diff для нового встроенного обсуждения. Нельзя использовать вместе с threadId.

inline.path строка Обязательно

Путь к файлу в диффе версии pull request.

inline.side string Обязательно

Сторона диффа якоря. Допустимые значения: left — для базовой версии файла, right — для head-версии.

inline.startLine целое число Обязательно

Первая (считая с 1) строка привязанного диапазона в версии файла «side». Диапазон не должен выходить за конец этого файла.

inline.endLine целое число

Включающая последняя строка закреплённого диапазона. Должна быть больше или равна startLine. Не указывать для однострочного якоря.

file object

Якорь для нового треда на уровне файла, относящегося ко всему файлу в диффе версии pull request. Нельзя использовать вместе с threadId или inline.

file.path string Обязательно

Путь к файлу в diff-версии pull request: для удаления — удалённый путь, в других случаях — путь в head-версии.

versionNumber string

Номер версии pull request, против которой создаётся новый тред. 0 или отсутствие значения означает последнюю версию на момент вызова. Имеет значение только для новых тредов.

Поля ответа

id string

Стабильный идентификатор комментария к pull request.

thread object

Тред, к которому принадлежит этот комментарий. Ответ содержит только идентификатор треда; новый тред общего обсуждения содержит идентификатор и метки времени; новый встроенный тред содержит полный якорь. Полное состояние треда см. в разделах Get Pull Request Comment и List Pull Request Comments.

thread.id string

Стабильный идентификатор темы. Группируйте комментарии в одном обсуждении по этому значению.

thread.version object

Версия pull request, против которой был создан тред, включая SHA для head и base. Якорь закреплён за этой версией и не перемещается по мере появления новых версий pull request.

thread.version.number строка

Монотонно возрастающий номер версии pull request, закодированный в виде JSON-строки.

thread.version.headSha string

SHA коммита, зафиксированный в этой версии pull request.

thread.version.baseSha строка

Базовый SHA, зафиксированный этой версией pull request.

thread.version.createdAt string

Временная метка в формате RFC 3339 для создания этой версии pull request.

thread.path строка

Путь к файлу, к которому привязан diff-якорь треда. Пусто для тредов общего обсуждения.

thread.side string

Сторона якоря для diff. Допустимые значения: left, right. Не задано для тредов общего обсуждения.

thread.startLine целое число

Первая строка привязанного диапазона в версии файла side. 0 — для тредов на уровне файла и общего обсуждения.

thread.endLine целое число

Включительная последняя строка закреплённого диапазона. 0, если якорь находится в одной строке или не имеет диапазона строк.

thread.resolvedAt строка

Временная метка RFC 3339, указывающая момент, когда поток был закрыт. Не установлена, пока поток открыт.

thread.createdAt string

Временная метка создания треда в формате RFC 3339.

thread.updatedAt строка

Временная метка в формате RFC 3339 для последнего обновления треда.

body string

Текст комментария.

author object

Публичный участник, оставивший комментарий.

author.user object

Вариант субъекта — пользователь. Устанавливается, когда действие выполняет пользователь.

author.user.id string

Публичный идентификатор пользователя.

author.user.email string

Адрес электронной почты пользователя. Всегда задаётся, когда присутствует вариант user.

author.user.displayName string

Отображаемое имя пользователя: имя и фамилия аккаунта, разделённые пробелом — то же имя, которое отображает продукт. Не указывается, если у аккаунта нет имени.

author.user.handle строка

Имя профиля, заявленное пользователем, без префикса @. Указывается только когда профиль общедоступен; в противном случае опускается.

author.app object

Вариант приложения для субъекта. Устанавливается, когда действие было выполнено приложением.

author.app.id string

Публичный идентификатор приложения.

author.app.displayName string

Зарегистрированное отображаемое имя приложения. Пропускается, если приложение не удаётся определить, а также для собственного управляемого субъекта Cursor.

author.serviceAccount object

Вариант субъекта — сервисный аккаунт. Устанавливается, когда действие выполнено сервисным аккаунтом.

author.serviceAccount.id string

Публичный идентификатор сервисного аккаунта.

createdAt string

Временная метка создания комментария в формате RFC 3339.

updatedAt string

Временная метка последнего редактирования комментария в формате RFC 3339.
curl --request POST \  --url 'https://api.cursor.com/v1/origin/repos/OWNER_SLUG/REPO_NAME/pulls/PULL_NUMBER/comments' \  --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN' \  --header 'Content-Type: application/json' \  --data '{  "body": "Should the retry budget be configurable?"}'

Структура ответа:

{  "id": "cmt_01k2ja2000e0080000000000e5",  "thread": {    "id": "cth_01k2ja2000e0080000000000s6",    "version": {      "number": "3",      "headSha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4",      "baseSha": "3b1f9c2d8a7e6f5049c8b7a6d5e4f3a2b1c0d9e8",      "createdAt": "2026-08-01T09:30:00Z"    },    "path": "src/telemetry/retry.ts",    "side": "right",    "startLine": 42,    "endLine": 45,    "createdAt": "2026-08-01T09:30:00Z",    "updatedAt": "2026-08-02T14:45:00Z"  },  "body": "Should the retry budget be configurable?",  "author": {    "user": {      "id": "user_01k2ja2000e0080000000000c3",      "email": "[email protected]"    }  },  "createdAt": "2026-08-01T09:30:00Z",  "updatedAt": "2026-08-02T14:45:00Z"}

Обновить комментарий к pull request

PATCH/v1/origin/repos/{ownerSlug}/{repoName}/pulls/comments/{commentId}
Scoperepository:pull_requests:reviews:writeAuthInstallation tokenUser access token

Обновляет комментарий к pull request по его стабильному идентификатору Origin.

Заменяет текст комментария. Комментарий должен принадлежать репозиторию, указанному в пути, быть видимым для вызывающего и быть создан этим же вызывающим. Комментарии из другого репозитория и скрытые комментарии в статусе ожидания ревью возвращают 404; видимый комментарий, принадлежащий другому участнику, возвращает 403. Тела длиной более 65 536 символов отклоняются с ошибкой InvalidArgument (HTTP 400).

Параметры пути

ownerSlug строка Обязательно

Уникальный слаг владельца сущности.

repoName string Обязательно

Имя репозитория, уникальное для сущности-владельца.

commentId string Обязательно

Тело запроса

body string Обязательно

Новый текст комментария. Максимальная длина: 65 536 символов, считается в кодовых точках Unicode.

Поля ответа

id string

Стабильный идентификатор комментария pull request.

thread object

Тред, к которому принадлежит этот комментарий, включая якорь диффа и состояние разрешения.

thread.id string

Стабильный идентификатор потока. Группируйте комментарии в одном обсуждении по этому значению.

thread.version object

Версия pull request, против которой было открыто обсуждение, включая SHA для head и base. Якорь зафиксирован на этой версии и не перемещается по мере появления новых версий pull request.

thread.version.number string

Монотонно возрастающий номер версии pull request, закодированный в виде JSON-строки.

thread.version.headSha строка

SHA коммита (head), зафиксированный этой версией pull request.

thread.version.baseSha string

SHA базовой ветки, зафиксированный в этой версии pull request.

thread.version.createdAt строка

Временная метка RFC 3339 для создания этой версии pull request.

thread.path строка

Путь к файлу якоря diff треда. Пуст для тредов общего обсуждения.

thread.side строка

Сторона привязки для диффа. Допустимые значения: left, right. Не задано для тредов общего обсуждения.

thread.startLine целое число

Первая строка закреплённого диапазона в версии файла side. 0 — для тредов на уровне файла и общих обсуждений.

thread.endLine целое число

Включаемая последняя строка привязанного диапазона. 0, если привязка состоит из одной строки или не имеет диапазона строк.

thread.resolvedAt строка

Временная метка в формате RFC 3339, указывающая, когда тред был закрыт. Не задана, пока тред открыт.

thread.createdAt string

Временная метка создания потока в формате RFC 3339.

thread.updatedAt string

Временная метка последнего обновления треда в формате RFC 3339.

body string

Текст комментария.

author object

Публичное лицо, написавшее комментарий.

author.user object

Вариант исполнителя — пользователь. Устанавливается, когда действие выполняет пользователь.

author.user.id string

Публичный идентификатор пользователя.

author.user.email string

Адрес электронной почты пользователя. Всегда задаётся, когда присутствует вариант user.

author.user.displayName string

Отображаемое имя пользователя: имя и фамилия аккаунта, объединённые пробелом — то же имя, что и отображается в продукте. Не указывается, если у аккаунта нет имени.

author.user.handle строка

Идентификатор профиля, заявленный пользователем, без префикса @. Указывается только пока профиль общедоступен; в противном случае отсутствует.

author.app object

Вариант приложения субъекта. Устанавливается, когда действие выполнено приложением.

author.app.id string

Публичный идентификатор приложения.

author.app.displayName string

Зарегистрированное отображаемое имя приложения. Пропускается, если приложение не удаётся определить, а также для управляемого первого лица Cursor.

author.serviceAccount object

Вариант субъекта — сервисный аккаунт. Указывается, когда действие выполнено сервисным аккаунтом.

author.serviceAccount.id string

Публичный идентификатор сервисного аккаунта.

createdAt string

Временная метка создания комментария в формате RFC 3339.

updatedAt string

Временная метка RFC 3339 для последнего редактирования комментария.
curl --request PATCH \  --url 'https://api.cursor.com/v1/origin/repos/OWNER_SLUG/REPO_NAME/pulls/comments/COMMENT_ID' \  --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN' \  --header 'Content-Type: application/json' \  --data '{  "body": "Should the retry budget be configurable?"}'

Структура ответа:

{  "id": "cmt_01k2ja2000e0080000000000e5",  "thread": {    "id": "cth_01k2ja2000e0080000000000s6",    "version": {      "number": "3",      "headSha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4",      "baseSha": "3b1f9c2d8a7e6f5049c8b7a6d5e4f3a2b1c0d9e8",      "createdAt": "2026-08-01T09:30:00Z"    },    "path": "src/telemetry/retry.ts",    "side": "right",    "startLine": 42,    "endLine": 45,    "createdAt": "2026-08-01T09:30:00Z",    "updatedAt": "2026-08-02T14:45:00Z"  },  "body": "Should the retry budget be configurable?",  "author": {    "user": {      "id": "user_01k2ja2000e0080000000000c3",      "email": "[email protected]"    }  },  "createdAt": "2026-08-01T09:30:00Z",  "updatedAt": "2026-08-02T14:45:00Z"}

Обновление треда Pull Request

PATCH/v1/origin/repos/{ownerSlug}/{repoName}/pulls/threads/{threadId}
Scoperepository:pull_requests:reviews:writeAuthInstallation tokenUser access token

Разрешает или повторно открывает поток комментариев запроса на вытягивание и возвращает его обновлённое состояние. Попытка разрешить уже разрешённый поток или повторно открыть уже открытый не выполняет никаких действий.

Тред должен принадлежать репозиторию, указанному в пути; для треда, хранящегося в другом репозитории, возвращается 404. Отвечать в разрешённом треде с помощью Create Pull Request Comment разрешено — это не открывает его заново.

Параметры пути

ownerSlug string Обязательное

Уникальный слаг владеющей сущности.

repoName string Обязательное

Имя репозитория, уникальное для сущности-владельца.

threadId string Обязательный

Постоянный идентификатор потока Origin.

Тело запроса

resolved boolean Обязательное

Целевое состояние разрешения. true закрывает тред; false снова открывает его.

Поля ответа

id string

Постоянный идентификатор ветки. Группируйте комментарии в одно обсуждение по этому значению.

version object

Версия pull request, с которой был связан этот тред, включая SHA для веток head и base. Якорь прикреплён к этой версии и не перемещается по мере появления новых версий pull request.

version.number string

Монотонно возрастающий номер версии pull request, закодированный в виде строки JSON.

version.headSha строка

SHA коммита (head), зафиксированный в этой версии pull request.

version.baseSha string

SHA базы, зафиксированный этой версией pull request.

version.createdAt string

Временная метка RFC 3339 для создания этой версии pull request.

path string

Путь к файлу, к которому привязан дифф треда. Пусто для тредов общего обсуждения.

side string

Сторона диффа, к которой привязан якорь. Допустимые значения: left, right. Не задаётся для тредов общего обсуждения.

startLine целое число

Первая строка закреплённого диапазона в версии файла side. 0 — для тредов уровня файла и общих обсуждений.

endLine целое число

Последняя строка закреплённого диапазона (включительно). 0, если якорь указывает на одну строку или не задаёт диапазон строк.

resolvedAt string

Временная метка в формате RFC 3339, указывающая время разрешения треда. Не задана, пока тред открыт.

createdAt string

Временная метка создания треда в формате RFC 3339.

updatedAt string

Отметка времени в формате RFC 3339 для последнего обновления треда.
curl --request PATCH \  --url 'https://api.cursor.com/v1/origin/repos/OWNER_SLUG/REPO_NAME/pulls/threads/THREAD_ID' \  --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN' \  --header 'Content-Type: application/json' \  --data '{  "resolved": true}'

Структура ответа:

{  "id": "cth_01k2ja2000e0080000000000s6",  "version": {    "number": "3",    "headSha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4",    "baseSha": "3b1f9c2d8a7e6f5049c8b7a6d5e4f3a2b1c0d9e8",    "createdAt": "2026-08-01T09:30:00Z"  },  "path": "src/telemetry/retry.ts",  "side": "right",  "startLine": 42,  "endLine": 45,  "resolvedAt": "2026-08-03T10:00:00Z",  "createdAt": "2026-08-01T09:30:00Z",  "updatedAt": "2026-08-03T10:00:00Z"}

Список коммитов в pull request

GET/v1/origin/repos/{ownerSlug}/{repoName}/pulls/{pullNumber}/commits
Scoperepository:pull_requests:readAuthInstallation tokenUser access token

Возвращает список коммитов в pull request.

Возвращает коммиты pull request в виде упрощённых объектов Commit (без stats). По умолчанию возвращается 30 результатов, максимум — 100, при этом всего доступно не более 250 коммитов. Токен страницы фиксирует версию pull request, размер страницы и курсор коммитов; в последующих запросах pageSize должен совпадать со значением в токене, а токен, который больше не соответствует текущим head или base, возвращает 400.

Параметры пути

ownerSlug string Обязательно

Уникальный слаг владеющей сущности.

repoName string Обязательно

Имя репозитория, уникальное для сущности-владельца.

pullNumber string Обязательно

Параметры запроса

pageSize целое число

Максимальное количество возвращаемых коммитов. По умолчанию 30, если не задано или равно 0. Значения выше 100 ограничиваются 100.

pageToken string

Непрозрачный курсор из next_page_token предыдущего ответа. Пустой для первой страницы. Токен привязан к репозиторию, версии pull request, размеру страницы и смещению коммита.

Поля ответа

commits массив

Разрежённые коммиты без статистики; всего отображается не более 250 коммитов.

commits[].sha string

Полный SHA коммита.

commits[].commit object

Метаданные объекта Git вложены отдельно от верхнеуровневых отношений репозитория.

commits[].commit.author object

Идентификационные данные автора Git, записанные в коммите, а не объект пользователя Origin.

commits[].commit.author.name string

Имя, указанное в данных об авторе Git.

commits[].commit.author.email string

Адрес электронной почты, указанный в данных автора Git.

commits[].commit.author.date string

Дата в формате RFC 3339, указанная в данных об авторе Git.

commits[].commit.committer object

Идентификационные данные коммиттера Git, записанные в коммите, а не объект пользователя Origin.

commits[].commit.committer.name string

Имя, указанное в идентификаторе Git.

commits[].commit.committer.email string

Адрес электронной почты, указанный в профиле Git.

commits[].commit.committer.date string

Отметка времени в формате ISO-8601, сохраняющая исходное смещение часового пояса подписи Git (например, "2014-11-07T22:01:45+01:00").

commits[].commit.message string

Сообщение коммита.

commits[].commit.tree object

Дерево, на которое ссылается коммит.

commits[].commit.tree.sha string

SHA дерева, на которое ссылается коммит.

commits[].parents массив

Ссылки на родительские коммиты, каждая из которых содержит SHA.

commits[].parents[].sha string

SHA родительского коммита.

nextPageToken string

Токен фиксирует версию pull request, размер страницы и курсор коммита; устаревший по отношению к текущему head или base токен возвращает 400.
curl --request GET \  --url 'https://api.cursor.com/v1/origin/repos/OWNER_SLUG/REPO_NAME/pulls/PULL_NUMBER/commits' \  --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN'

Структура ответа:

{  "commits": [    {      "sha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4",      "commit": {        "author": {          "name": "Jane Doe",          "email": "[email protected]",          "date": "2026-08-01T09:30:00Z"        },        "committer": {          "name": "Jane Doe",          "email": "[email protected]",          "date": "2026-08-01T09:30:00Z"        },        "message": "Add launch telemetry",        "tree": {          "sha": "a7b6c5d4e3f2a1b0c9d8e7f6a5b4c3d2e1f0a9b8"        }      },      "parents": [        {          "sha": "3b1f9c2d8a7e6f5049c8b7a6d5e4f3a2b1c0d9e8"        }      ],      "stats": {        "additions": 128,        "deletions": 46,        "total": 174      }    }  ]}

Список файлов pull request

GET/v1/origin/repos/{ownerSlug}/{repoName}/pulls/{pullNumber}/files
Scoperepository:pull_requests:readAuthInstallation tokenUser access token

Возвращает список файлов, изменённых в pull request.

Возвращает имя файла, статус, количество строк, патч и необязательное предыдущее имя файла. По умолчанию возвращается 30 файлов, максимум — 100. Токен страницы фиксирует версию pull request, размер страницы и курсор файла; в последующих запросах pageSize должен совпадать с токеном, а токен, который больше не соответствует текущей head-ветке или base-ветке, возвращает 400.

Параметры пути

ownerSlug string Обязательное

Уникальный слаг владельца сущности.

repoName string Обязательно

Имя репозитория, уникальное для сущности-владельца.

pullNumber string Обязательное

Параметры запроса

pageSize integer

Максимальное число возвращаемых изменённых файлов. По умолчанию — 30, если не задано или равно 0. Значения выше 100 обрезаются до 100.

pageToken string

Непрозрачный курсор из поля next_page_token предыдущего ответа. Для первой страницы пуст. Токен привязан к репозиторию, версии pull request, размеру страницы и курсору изменённых файлов.

Поля ответа

files массив

Сведения об изменённых файлах для текущей версии запроса на слияние.

files[].filename string

Путь к изменённому файлу pull request.

files[].status string

Статус изменения: добавлен, удалён, изменён, переименован или скопирован.

files[].additions integer

Добавлено количество строк в файле.

files[].deletions integer

Количество удалённых строк в файле.

files[].changes integer

Общее количество изменённых строк в файле.

files[].patch string

Патч в унифицированном формате для файла.

files[].previousFilename string

Предыдущий путь, когда файл был переименован или скопирован.

nextPageToken string

Токен фиксирует версию pull request, размер страницы и курсор файла; устаревший по отношению к текущей ветке head или base возвращает 400.
curl --request GET \  --url 'https://api.cursor.com/v1/origin/repos/OWNER_SLUG/REPO_NAME/pulls/PULL_NUMBER/files' \  --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN'

Структура ответа:

{  "files": [    {      "filename": "src/telemetry.ts",      "status": "modified",      "additions": 6,      "deletions": 3,      "changes": 9,      "patch": "@@ -12,6 +12,9 @@\n import { ignite } from \"./ignition\";\n+import { emitLaunchTelemetry } from \"./telemetry\";\n"    }  ]}

Список меток pull request

GET/v1/origin/repos/{ownerSlug}/{repoName}/pulls/{pullNumber}/labels
Scoperepository:pull_requests:readAuthInstallation tokenUser access token

Возвращает все метки, назначенные pull request, отсортированные по имени.

Ответ содержит полный список назначенных меток, а не его страницу, поэтому эта конечная точка не принимает параметры пагинации. Pull request может иметь не более 100 меток. Если pull request не найден, возвращается 404.

Параметры пути

ownerSlug string Обязательный

Уникальный слаг сущности-владельца.

repoName string Обязательный

Имя репозитория, уникальное в пределах сущности-владельца.

pullNumber string Обязательный

Поля ответа

labels array

Все метки, назначенные pull request, отсортированные по имени.

labels[].id string

Публичный идентификатор метки.

labels[].name string

Имя метки, уникальное в репозитории. Имена используются для обращения к меткам в конечных точках записи.

labels[].color string

Шестизначный цвет в шестнадцатеричном формате без начального символа #.

labels[].description string

Описание метки. Отсутствует, если у метки нет описания.
curl --request GET \  --url 'https://api.cursor.com/v1/origin/repos/OWNER_SLUG/REPO_NAME/pulls/PULL_NUMBER/labels' \  --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN'

Структура ответа:

{  "labels": [    {      "id": "lbl_01k2ja2000e0080000000000m1",      "name": "bug",      "color": "d73a4a",      "description": "Something isn't working"    }  ]}

Задать метки pull request

PUT/v1/origin/repos/{ownerSlug}/{repoName}/pulls/{pullNumber}/labels
Scoperepository:pull_requests:writeAuthInstallation tokenUser access token

Заменяет все метки pull request указанными метками.

Пустой список удаляет все назначенные метки. Метки должны уже существовать в репозитории; неизвестное имя метки или неизвестный pull request возвращает 404. К pull request можно назначить не более 100 меток, поэтому при указании более 100 возвращается FailedPrecondition (HTTP 400). В ответе возвращается список меток, назначенных после замены, отсортированный по имени.

Параметры пути

ownerSlug string Обязательный

Уникальный слаг сущности-владельца.

repoName string Обязательный

Имя репозитория, уникальное в пределах сущности-владельца.

pullNumber string Обязательный

Тело запроса

labels array

Имена назначаемых меток. Не более 100. Пустой список удаляет все назначенные метки. Повторяющиеся имена игнорируются.

Поля ответа

labels array

Метки, назначенные после замены, отсортированные по имени. Каждая запись содержит id, name, color и description.
curl --request PUT \  --url 'https://api.cursor.com/v1/origin/repos/OWNER_SLUG/REPO_NAME/pulls/PULL_NUMBER/labels' \  --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN' \  --header 'Content-Type: application/json' \  --data '{  "labels": [    "bug"  ]}'

Структура ответа:

{  "labels": [    {      "id": "lbl_01k2ja2000e0080000000000m1",      "name": "bug",      "color": "d73a4a",      "description": "Something isn't working"    }  ]}

Добавление меток к pull request

POST/v1/origin/repos/{ownerSlug}/{repoName}/pulls/{pullNumber}/labels
Scoperepository:pull_requests:writeAuthInstallation tokenUser access token

Добавляет к pull request существующие метки репозитория.

Метки, уже назначенные pull request, сохраняются. Метки должны уже существовать в репозитории; при неизвестном имени или неизвестном pull request возвращается 404. В запросе необходимо указать от 1 до 100 меток, а pull request может иметь в общей сложности не более 100 меток, поэтому запрос, который превысит этот лимит, вернёт FailedPrecondition (HTTP 400). Ответ содержит только указанные вами метки, а не полный набор меток pull request; чтобы получить полный набор, используйте Список меток pull request.

Параметры пути

ownerSlug string Обязательный

Уникальный слаг сущности-владельца.

repoName string Обязательный

Имя репозитория, уникальное в пределах сущности-владельца.

pullNumber string Обязательный

Тело запроса

labels array Обязательный

Имена добавляемых меток. Максимум 100. Повторяющиеся имена игнорируются.

Поля ответа

labels array

Метки, указанные в запросе. Каждая запись содержит id, name, color и description.
curl --request POST \  --url 'https://api.cursor.com/v1/origin/repos/OWNER_SLUG/REPO_NAME/pulls/PULL_NUMBER/labels' \  --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN' \  --header 'Content-Type: application/json' \  --data '{  "labels": [    "bug"  ]}'

Структура ответа:

{  "labels": [    {      "id": "lbl_01k2ja2000e0080000000000m1",      "name": "bug",      "color": "d73a4a",      "description": "Something isn't working"    }  ]}

Удалить все метки pull request

DELETE/v1/origin/repos/{ownerSlug}/{repoName}/pulls/{pullNumber}/labels
Scoperepository:pull_requests:writeAuthInstallation tokenUser access token

Удаляет все метки у pull request.

Запрос выполняется успешно, если у pull request нет меток. Если pull request не найден, возвращается 404. Тело ответа пустое.

Параметры пути

ownerSlug string Обязательный

Уникальный слаг сущности-владельца.

repoName string Обязательный

Имя репозитория, уникальное в пределах сущности-владельца.

pullNumber string Обязательный

Поля ответа

При успешном запросе тело ответа отсутствует.

curl --request DELETE \  --url 'https://api.cursor.com/v1/origin/repos/OWNER_SLUG/REPO_NAME/pulls/PULL_NUMBER/labels' \  --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN'

Ответ:

204 No Content

Удалить метку pull request

DELETE/v1/origin/repos/{ownerSlug}/{repoName}/pulls/{pullNumber}/labels/{labelName}
Scoperepository:pull_requests:writeAuthInstallation tokenUser access token

Удаляет метку из pull request.

Если метка не назначена pull request, как и если pull request не существует, возвращается 404. В ответе перечислены оставшиеся метки pull request, отсортированные по имени.

Параметры пути

ownerSlug string Обязательный

Уникальный слаг сущности-владельца.

repoName string Обязательный

Имя репозитория, уникальное в пределах сущности-владельца.

pullNumber string Обязательный

labelName string Обязательный

Имя удаляемой метки.

Поля ответа

labels array

Оставшиеся метки pull request, отсортированные по имени. Каждая запись содержит id, name, color и description.
curl --request DELETE \  --url 'https://api.cursor.com/v1/origin/repos/OWNER_SLUG/REPO_NAME/pulls/PULL_NUMBER/labels/LABEL_NAME' \  --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN'

Структура ответа:

{  "labels": [    {      "id": "lbl_01k2ja2000e0080000000000m1",      "name": "bug",      "color": "d73a4a",      "description": "Something isn't working"    }  ]}

Слияние Pull Request

POST/v1/origin/repos/{ownerSlug}/{repoName}/pulls/{pullNumber}/merge
Scoperepository:contents:writeAuthInstallation tokenUser access token

Выполняет слияние pull request в базовую ветку.

Для pull request в stack выполняет merge всего префикса от root до target, заканчивающегося на этом номере. а не только этого pull request. Поддерживается только для нативных репозиториев Origin; зеркалируемые репозитории отклоняются.

Параметры пути

ownerSlug string Обязательный

Уникальный слаг сущности-владельца.

repoName string Обязательное

Имя репозитория, уникальное для сущности-владельца.

pullNumber string Обязательно

Номер pull request для слияния. Если этот pull request находится в стеке, при слиянии будут влиты все pull request от корня стека до этого номера.

Тело запроса

expectedHeadSha строка

Защита от слияния с head, который ваше приложение ещё не видело: полный SHA коммита (40 или 64 шестнадцатеричных символа), ожидаемый в качестве текущего head pull request. Если head сместился, слияние отклоняется с кодом ABORTED (HTTP 409 Conflict) и ничего не сливается. Значения, не являющиеся полным SHA коммита, отклоняются с кодом InvalidArgument (HTTP 400). Опустите параметр, чтобы слить то, что является текущим head. Не проверяется, если pull request уже слит — в этом случае возвращается идемпотентный успешный ответ.

mergeMethod строка

Способ слияния pull request. Допустимые значения: merge — создаёт merge-коммит, и squash — создаёт один squash-коммит. Метод, который репозиторий не разрешает, отклоняется с ошибкой FailedPrecondition (HTTP 400), а любое другое значение — с InvalidArgument (HTTP 400). Пропустите этот параметр, чтобы использовать значение по умолчанию для репозитория: merge-коммит, если репозиторий его разрешает, иначе squash; squash также применяется, если base-ветка требует линейной истории.

Поля ответа

mergeCommitSha string

SHA коммита слияния, записанный в базовую ветку.

mergedPullNumbers массив

JSON-строка с номерами pull request, смерженных от корня стека до целевой ветки.

pullRequest object

Целевой PullRequest после слияния; объявленный тип ответа — полный ресурс, хотя пример сокращён.

pullRequest.id строка

Идентификатор pull request в Stable Origin.

pullRequest.number строка

Номер pull request в репозитории, закодированный как JSON-строка.

pullRequest.state строка

Состояние pull request: open или closed. Смерженные pull request имеют состояние closed, а поле merged установлено в true.

pullRequest.draft boolean

Является ли pull request'ом черновиком.

pullRequest.merged boolean

Был ли pull request слит.

pullRequest.title string

Заголовок pull request.

pullRequest.body string

Основной текст описания pull request.

pullRequest.head object

Исходная сторона изменения — то, что сливается.

pullRequest.head.ref string

Git‑ссылка, на которую указывает эта сторона, в том виде, в котором её зафиксировал Origin.

pullRequest.head.sha строка

SHA коммита этой стороны в последней версии изменения.

pullRequest.base object

Целевая сторона изменения — то, с чем оно сливается.

pullRequest.base.ref строка

Git‑ссылка, на которую указывает эта сторона, в том виде, в котором её зафиксировал Origin.

pullRequest.base.sha строка

SHA коммита этой стороны в самой последней версии изменения.

pullRequest.author object

Публичный участник, открывший pull request.

pullRequest.author.user object

Пользовательский вариант актёра. Устанавливается, когда действие выполняет пользователь.

pullRequest.author.user.id строка

Публичный идентификатор пользователя.

pullRequest.author.user.email string

Адрес электронной почты пользователя. Всегда задаётся, когда присутствует вариант user.

pullRequest.author.user.displayName строка

Отображаемое имя пользователя: имя и фамилия учётной записи, разделённые пробелом — то же имя, которое отображает продукт. Пропускается, если у учётной записи нет имени.

pullRequest.author.user.handle строка

Заявленный пользователем идентификатор профиля без префикса @. Присутствует только когда профиль общедоступен; в противном случае отсутствует.

pullRequest.author.app object

Вариант актёра — приложение. Устанавливается, когда действие выполняет приложение.

pullRequest.author.app.id строка

Публичный идентификатор приложения.

pullRequest.author.app.displayName строка

Зарегистрированное отображаемое имя приложения. Не указывается, если приложение не удаётся разрешить, а также для управляемого Cursor собственного субъекта.

pullRequest.author.serviceAccount object

Вариант субъекта действия для сервисного аккаунта. Устанавливается, когда действие выполнено сервисным аккаунтом.

pullRequest.author.serviceAccount.id string

Публичный идентификатор учётной записи сервиса.

pullRequest.createdAt string

Время создания pull request в формате RFC 3339.

pullRequest.updatedAt string

Временная метка в формате RFC 3339 для последнего обновления pull request.

pullRequest.closedAt строка

Временная метка закрытия в формате RFC 3339; может встречаться в закрытых или объединённых pull request.

pullRequest.mergedAt string

Временная метка слияния в формате RFC 3339; может отображаться в объединённых pull request.

pullRequest.mergeCommitSha string

SHA merge-коммита; может появиться после слияния.

pullRequest.additions целое число

Добавленные строки в текущей версии pull request.

pullRequest.deletions целое число

Удалённые строки в текущей версии pull request.

pullRequest.changedFiles целое число

Количество изменённых файлов в текущей версии pull request.

pullRequest.labels массив

Метки, назначенные этому pull request, отсортированные по имени. Пусто, если меток нет.

pullRequest.labels[].id string

Публичный идентификатор метки.

pullRequest.labels[].name строка

Имя метки, уникальное в репозитории. По имени к метке обращаются в конечных точках записи.

pullRequest.labels[].color string

Шестизначный шестнадцатеричный цвет без ведущего #.

pullRequest.labels[].description string

Описание метки. Отсутствует, если у метки нет описания.

pullRequest.version object

Текущая пронумерованная версия pull request и SHA его head- и base-веток.

pullRequest.version.number string

Монотонно возрастающий номер версии pull request, закодированный в виде JSON-строки.

pullRequest.version.headSha string

SHA HEAD, зафиксированный этой версией pull request.

pullRequest.version.baseSha строка

SHA базовой ветки, зафиксированный этой версией pull request.

pullRequest.version.createdAt строка

Метка времени RFC 3339 для создания этой версии pull request.
curl --request POST \  --url 'https://api.cursor.com/v1/origin/repos/OWNER_SLUG/REPO_NAME/pulls/PULL_NUMBER/merge' \  --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN' \  --header 'Content-Type: application/json' \  --data '{  "expectedHeadSha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4",  "mergeMethod": "squash"}'

Структура ответа:

{  "mergeCommitSha": "5c4d3e2f1a0b9c8d7e6f5a4b3c2d1e0f9a8b7c6d",  "mergedPullNumbers": [    "17"  ],  "pullRequest": {    "id": "pr_01k2ja2000e0080000000000d4",    "number": "17",    "state": "closed",    "draft": false,    "merged": true,    "title": "Add launch telemetry",    "body": "Adds structured launch telemetry to the ignition path.",    "head": {      "ref": "add-telemetry",      "sha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4"    },    "base": {      "ref": "main",      "sha": "3b1f9c2d8a7e6f5049c8b7a6d5e4f3a2b1c0d9e8"    },    "author": {      "user": {        "id": "user_01k2ja2000e0080000000000c3",        "email": "[email protected]"      }    },    "createdAt": "2026-08-01T09:30:00Z",    "updatedAt": "2026-08-02T14:45:00Z",    "closedAt": "2026-08-03T10:15:00Z",    "mergedAt": "2026-08-03T10:15:00Z",    "mergeCommitSha": "5c4d3e2f1a0b9c8d7e6f5a4b3c2d1e0f9a8b7c6d",    "additions": 128,    "deletions": 46,    "changedFiles": 5,    "labels": [      {        "id": "lbl_01k2ja2000e0080000000000m1",        "name": "bug",        "color": "d73a4a",        "description": "Something isn't working"      }    ],    "version": {      "number": "3",      "headSha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4",      "baseSha": "3b1f9c2d8a7e6f5049c8b7a6d5e4f3a2b1c0d9e8",      "createdAt": "2026-08-01T09:30:00Z"    }  }}

Получение сведений о возможности слияния pull request

GET/v1/origin/repos/{ownerSlug}/{repoName}/pulls/{pullNumber}/mergeability
Scoperepository:pull_requests:readAuthInstallation tokenUser access token
PreviewThis endpoint is in preview and may change before it is generally available.

Возвращает, можно ли объединить pull request и, если нельзя — какие условия этому препятствуют. Вердикт оценивается по тем же условиям, которые применяет Merge Pull Request, поэтому вердикт mergeable означает, что объединение для той же ветки head должно завершиться успешно. Для составного (stacked) pull request вердикт охватывает все pull request от корня стека до текущего, и каждый блокер указывает, к какому pull request он относится.

Для stack, содержащего в сумме более 200 pull request, включая уже смерженных предшественников, возвращается FailedPrecondition (HTTP 400).

Эта операция находится в предварительном просмотре, и её структура может измениться, пока контракт уточняется. Декодируйте ответы, допуская неизвестные поля и неизвестные значения перечислений; считайте нераспознанный verdict как blocked и отображайте blockers[].message, если не распознаёте blockers[].kind.

Параметры пути

ownerSlug строка Обязательный

Уникальный слаг сущности-владельца.

repoName строка Обязательный

Имя репозитория, уникальное в пределах сущности-владельца.

pullNumber строка Обязательный

Номер pull request в репозитории.

Параметры запроса

expectedHeadSha строка

Необязательная защита: полный SHA коммита (40 или 64 шестнадцатеричных символа), ожидаемый как текущая head-ревизия pull request. Если он задан, но проверяемая head-ревизия отличается, запрос возвращает Aborted (HTTP 409 Conflict) вместо результата. Значение, которое не является полным SHA коммита, возвращает InvalidArgument (HTTP 400).

Поля ответа

pullRequest object

Pull request, к которому относится решение.

pullRequest.id строка

Постоянный идентификатор pull request.

pullRequest.number строка

Номер pull request в пределах репозитория, закодированный в виде JSON-строки.

pullRequest.repository object

Ссылка на контейнер репозитория для pull request.

pullRequest.repository.id строка

Идентификатор репозитория в ссылке на контейнер.

pullRequest.repository.name строка

Имя репозитория в ссылке на контейнер.

pullRequest.repository.owner object

Ссылка на владельца репозитория.

pullRequest.repository.owner.slug строка

Слаг владельца для URL, который вместе с ID владельца определяет владельца репозитория.

pullRequest.repository.owner.id строка

Идентификатор владельца в Origin.

pullRequest.repository.owner.type строка

Тип пространства имён владельца. Только для вывода. Допустимые значения: team, user. Пропускается, если неизвестно.

verdict строка

Общий ответ для всех pull request в evaluatedPullRequests. Допустимые значения: mergeable — слияние pullRequest приводит к слиянию всех pull request — и blocked. Нераспознанное значение считайте blocked.

blockers массив

Всё, что мешает выполнить merge; отсортировано по pull request, к которому относится (сначала root стека), а затем по виду. Пусто, если verdict равен mergeable. Не более одного blocker на pull request для каждого вида, кроме required_checks — по одному на каждый state, а также rule_failure и ruleset_error — по одному на каждое отдельное message.

blockers[].pullRequest object

Pull request из evaluatedPullRequests, к которому относится этот блокировщик. Содержит те же поля, что и pullRequest.

blockers[].kind строка

Категория блокера. Допустимые значения: draft, closed, merged, merge_conflict, required_checks, required_approvals, codeowner_approval, behind_base, needs_restack, restack_pending, conflict_check_pending, invalid_stack, ruleset_error, rule_failure. Новые виды добавляются со временем; блокер, вид которого появился позже вашей версии клиента, декодируется с незаданным kind, но по-прежнему блокирует.

blockers[].message строка

Понятное человеку описание блокера и того, как его сбросить. Никогда не бывает пустым, поэтому именно его следует отображать, если значение kind не распознано.

blockers[].requiredChecks object

Задаётся для блокировщика required_checks.

blockers[].requiredChecks.state строка

Состояние, общее для каждой проверки в этом блокере. Допустимые значения: missing, pending, failing, action_required.

blockers[].requiredChecks.checks массив

Обязательные проверки в этом состоянии.

blockers[].requiredChecks.checks[].name строка

Укажите репозиторий, для которого требуется правило.

blockers[].requiredChecks.checks[].owner object

Принципал, который должен зарегистрировать проверку, включая те же варианты actor, что и у actor при запуске проверки.

blockers[].requiredChecks.checks[].checkRun object

Запуск проверки на headSha, соответствующий этому требованию, в виде ссылки. Опускается, если ни один не был зарегистрирован — это состояние missing. Содержит только id, name и checkSuite.id, поскольку для чтения этой операции достаточно repository:pull_requests:read, тогда как для статуса, заключения, выходных данных и URL с подробностями запуска требуется repository:checks:read; их можно получить через Получить запуск проверки.

blockers[].requiredApprovals object

Задаётся для блокера required_approvals.

blockers[].requiredApprovals.requiredCount integer

Одобряющие ревью, требуемые правилами репозитория.

blockers[].requiredApprovals.approvedCount integer

Одобряющие ревью, которые сейчас засчитываются в счёт требования.

blockers[].codeownerApproval object

Задаётся при блокировке codeowner_approval.

blockers[].codeownerApproval.requirements массив

Наборы владельца, которым всё ещё требуется одобрение.

blockers[].codeownerApproval.requirements[].owners массив

Владельцы кода — требование считается выполненным, если его выполнит любой из них.

blockers[].codeownerApproval.requirements[].paths массив

Изменённые пути, которые охватывает этот набор владельцев.

blockers[].mergeConflict object

Задаётся для блокера merge_conflict.

blockers[].mergeConflict.conflictedPaths массив

Пути, конфликтующие с base-веткой. Отображается не более 100 путей.

blockers[].mergeConflict.truncated логическое значение

Превышает ли число конфликтующих путей число указанных в списке.

blockers[].mergeConflict.inheritedFromDownstack boolean

Вызван ли конфликт pull request'ом, расположенным ниже в стеке: в этом случае текущий pull request ожидает его, а не конфликтует сам.

blockers[].stackShape object

Устанавливается при блокировке invalid_stack.

blockers[].stackShape.reason строка

Причина, по которой стек не может быть обработан. Допустимые значения: partially_merged, cycle, missing_parent, cross_repository_parent, base_branch_missing.

blockers[].stackShape.relatedPullRequests массив

Другие связанные pull request, если они указаны в причине. Каждый содержит те же поля, что и pullRequest.

evaluatedPullRequests массив

Pull request'ы, которые попадут в целевую ветку при merge pullRequest: сначала root стека, последним — сам pullRequest. Предшествующие изменения, уже прошедшие merge, относятся к history и не перечисляются. Для pull request'а вне стека — ровно один element. Каждый содержит те же fields, что и pullRequest.

headSha строка

Head-коммит pullRequest, прошедший оценку.

baseRef строка

Ветка, в которую вливаются оцениваемые pull request'ы: base-ветка корня стека, а не собственная base-ветка этого pull request'а, если он входит в стек.

baseSha строка

Последний коммит ветки baseRef на момент evaluatedAt. Последующий пуш в baseRef может изменить вердикт. Пусто, если базовую ветку не удалось определить, например при некорректном стеке.

evaluatedAt строка

Временная метка в формате RFC 3339, указывающая, когда был вычислен этот результат. Изменения, произошедшие после этого момента, не учитываются; чтобы получить их, выполните запрос повторно.
curl --request GET \  --url 'https://api.cursor.com/v1/origin/repos/OWNER_SLUG/REPO_NAME/pulls/PULL_NUMBER/mergeability' \  --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN'
{  "pullRequest": {    "id": "pr_01k2ja2000e0080000000000d4",    "number": "17",    "repository": {      "id": "repo_01k2ja2000e0080000000000a1",      "name": "launch-control",      "owner": {        "slug": "acme",        "id": "ns_01k2ja2000e0080000000000b2"      }    }  },  "verdict": "blocked",  "blockers": [    {      "pullRequest": {        "id": "pr_01k2ja2000e0080000000000d4",        "number": "17",        "repository": {          "id": "repo_01k2ja2000e0080000000000a1",          "name": "launch-control",          "owner": {            "slug": "acme",            "id": "ns_01k2ja2000e0080000000000b2"          }        }      },      "kind": "required_approvals",      "message": "Количество одобряющих ревью: 0; требуется: 1. Запросите ревью и дождитесь необходимого одобрения.",      "requiredApprovals": {        "requiredCount": 1,        "approvedCount": 0      }    },    {      "pullRequest": {        "id": "pr_01k2ja2000e0080000000000d4",        "number": "17",        "repository": {          "id": "repo_01k2ja2000e0080000000000a1",          "name": "launch-control",          "owner": {            "slug": "acme",            "id": "ns_01k2ja2000e0080000000000b2"          }        }      },      "kind": "required_checks",      "message": "Обязательные проверки статуса ещё выполняются. Дождитесь завершения проверок или исправьте неуспешные проверки.",      "requiredChecks": {        "state": "pending",        "checks": [          {            "name": "ci / build",            "owner": {              "app": {                "id": "app_01k2ja2000e0080000000000e5",                "displayName": "Launch CI"              }            },            "checkRun": {              "id": "cr_01k2ja2000e0080000000000f6",              "name": "ci / build",              "checkSuite": {                "id": "crg_01k2ja2000e0080000000000f7"              }            }          }        ]      }    }  ],  "evaluatedPullRequests": [    {      "id": "pr_01k2ja2000e0080000000000d4",      "number": "17",      "repository": {        "id": "repo_01k2ja2000e0080000000000a1",        "name": "launch-control",        "owner": {          "slug": "acme",          "id": "ns_01k2ja2000e0080000000000b2"        }      }    }  ],  "headSha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4",  "baseRef": "main",  "baseSha": "3b1f9c2d8a7e6f5049c8b7a6d5e4f3a2b1c0d9e8",  "evaluatedAt": "2026-08-02T14:45:00Z"}

Список запрошенных ревьюеров pull request

GET/v1/origin/repos/{ownerSlug}/{repoName}/pulls/{pullNumber}/requested_reviewers
Scoperepository:pull_requests:reviews:readAuthInstallation tokenUser access token

Возвращает пользователей и группы, у которых сейчас запрошено ревью pull request.

Прямой запрос снимается, когда этот пользователь отправляет ревью, а запрос к группе — когда ревью отправляет любой текущий участник группы. Неотправленные черновики ревью оставляют запрос в ожидании, а повторный запрос ревью после отправки возвращает ревьюера в этот список. Группы без читаемого публичного идентификатора не включаются.

Параметры пути

ownerSlug string Обязательный

Уникальный слаг сущности-владельца.

repoName string Обязательный

Имя репозитория, уникальное в пределах сущности-владельца.

pullNumber string Обязательный

Номер pull request в пределах репозитория.

Поля ответа

users array

Пользователи, у которых запрошено ревью. Пустой список, если запросов в ожидании нет.

users[].id string

Закодированный идентификатор пользователя (user_…) в том же формате, который использует API организации.

users[].email string

Адрес электронной почты пользователя. Пусто, если у аккаунта его нет.

users[].displayName string

Отображаемое имя пользователя: имя и фамилия аккаунта, объединённые пробелом; это же имя отображает продукт. Не включается, если у аккаунта нет имени.

users[].handle string

Заявленный идентификатор профиля пользователя без префикса @. Присутствует только пока этот профиль виден публично; иначе не включается.

groups array

Группы, у которых запрошено ревью. Пустой список, если запросов в ожидании нет.

groups[].id string

Публичный идентификатор группы (grp_…).
curl --request GET \  --url 'https://api.cursor.com/v1/origin/repos/OWNER_SLUG/REPO_NAME/pulls/PULL_NUMBER/requested_reviewers' \  --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN'

Структура ответа:

{  "users": [    {      "id": "user_01k2ja2000e0080000000000c3",      "email": "[email protected]"    }  ],  "groups": [    {      "id": "grp_01k2ja2000e0080000000000n2"    }  ]}

Запрос ревьюеров pull request

POST/v1/origin/repos/{ownerSlug}/{repoName}/pulls/{pullNumber}/requested_reviewers
Scoperepository:pull_requests:reviews:writeAuthInstallation tokenUser access token

Запрашивает ревью у указанных пользователей и групп по pull request и возвращает ревьюеров, запрошенных этим вызовом.

Идентификаторы сопоставляются с кандидатами в ревьюеры репозитория по публичному идентификатору, электронной почте пользователя или слагу группы. Отображаемые имена не сопоставляются. Неизвестный или неоднозначный идентификатор возвращает ошибку InvalidArgument (HTTP 400) с указанием этого идентификатора, и требуется как минимум одна непустая запись в полях users или groups.

Повторный запрос уже запрошенного ревьюера обновляет отметку времени запроса, поэтому ревьюер, уже отправивший ревью, снова становится ожидающим. Если ревьюер не является кандидатом для репозитория, возвращается PermissionDenied (HTTP 403).

Параметры пути

ownerSlug string Обязательное

Уникальный слаг сущности-владельца.

repoName string Обязательное

Имя репозитория, уникальное для сущности-владельца.

pullNumber string Обязательное

Номер pull request в пределах репозитория.

Тело запроса

users array

Идентификаторы пользователей для запроса. Каждая запись должна однозначно соответствовать кандидату в пользователи репозитория по публичному идентификатору user_… или адресу электронной почты.

groups array

Идентификаторы запрашиваемых групп. Каждая запись должна однозначно соответствовать кандидату-группе для репозитория по публичному идентификатору grp_…, квалифицированному слагу группы или слагу группы.

Поля ответа

users array

Пользователи, запрошенные этим вызовом.

users[].id string

Закодированный идентификатор пользователя (user_…), тот же формат, который использует API организации.

users[].email string

Адрес электронной почты пользователя. Пустой, если у аккаунта его нет.

users[].displayName string

Отображаемое имя пользователя: имя и фамилия аккаунта, разделённые пробелом — то же имя, которое выводит продукт. Не указывается, если у аккаунта нет имени.

users[].handle string

Идентификатор заявленного пользователем профиля без префикса @. Указывается только пока профиль общедоступен; в противном случае опускается.

groups array

Группы, запрошенные этим вызовом.

groups[].id string

Публичный идентификатор группы (grp_…).
curl --request POST \  --url 'https://api.cursor.com/v1/origin/repos/OWNER_SLUG/REPO_NAME/pulls/PULL_NUMBER/requested_reviewers' \  --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN' \  --header 'Content-Type: application/json' \  --data '{  "users": [    "user_01k2ja2000e0080000000000c3"  ],  "groups": [    "grp_01k2ja2000e0080000000000n2"  ]}'

Структура ответа:

{  "users": [    {      "id": "user_01k2ja2000e0080000000000c3",      "email": "[email protected]"    }  ],  "groups": [    {      "id": "grp_01k2ja2000e0080000000000n2"    }  ]}

Удаление запрошенных ревьюеров pull request

DELETE/v1/origin/repos/{ownerSlug}/{repoName}/pulls/{pullNumber}/requested_reviewers
Scoperepository:pull_requests:reviews:writeAuthInstallation tokenUser access token

Отменяет запросы на ревью для указанных пользователей и групп в pull request. Тело ответа пустое.

Идентификаторы сопоставляются с кандидатами в ревьюеры репозитория по публичному идентификатору, email пользователя или слагу группы. Отображаемые имена не сопоставляются. Неизвестный или неоднозначный идентификатор приводит к ошибке InvalidArgument (HTTP 400) с указанием этого идентификатора; в полях users и groups должна быть хотя бы одна непустая запись.

Удаление пользователя или группы, у которых ревью не запрошено, ничего не меняет. Идентификатор, который больше не является кандидатом в ревьюеры, всё равно принимается, если это стабильный публичный идентификатор (user_… или grp_…), поэтому ревьюера, покинувшего репозиторий, можно удалить.

Параметры пути

ownerSlug string Обязательный

Уникальный слаг сущности-владельца.

repoName string Обязательный

Имя репозитория, уникальное в пределах сущности-владельца.

pullNumber string Обязательный

Номер pull request в пределах репозитория.

Тело запроса

users array

Идентификаторы пользователей для удаления. Каждая запись должна однозначно соответствовать кандидату-пользователю репозитория по публичному идентификатору user_… или email.

groups array

Идентификаторы групп для удаления. Каждая запись должна однозначно соответствовать кандидату-группе репозитория по публичному идентификатору grp_…, полному слагу группы или слагу группы.

Поля ответа

Успешные запросы не возвращают тело ответа.

curl --request DELETE \  --url 'https://api.cursor.com/v1/origin/repos/OWNER_SLUG/REPO_NAME/pulls/PULL_NUMBER/requested_reviewers' \  --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN' \  --header 'Content-Type: application/json' \  --data '{  "users": [    "user_01k2ja2000e0080000000000c3"  ],  "groups": [    "grp_01k2ja2000e0080000000000n2"  ]}'

Ответ:

204 No Content

Список ревью pull request

GET/v1/origin/repos/{ownerSlug}/{repoName}/pulls/{pullNumber}/reviews
Scoperepository:pull_requests:reviews:readAuthInstallation tokenUser access token

Возвращает отправленные ревью для pull request, отсортированные по submitted_at в порядке возрастания. Незавершённые ревью не включаются.

Параметры пути

ownerSlug string Обязательно

Уникальный slug владеющей сущности.

repoName string Обязательно

Имя репозитория, уникальное для сущности-владельца.

pullNumber string Обязательное

Параметры запроса

pageSize целое число

Максимальное количество возвращаемых отзывов. По умолчанию — 30; максимум — 100.

pageToken строка

Непрозрачный курсор из nextPageToken предыдущего ответа. Не указывайте его для первой страницы.

Поля ответа

reviews массив

Отправленные отзывы упорядочены по полю submittedAt в порядке возрастания; неотправленные черновики исключены.

reviews[].id string

Стабильный идентификатор обзора.

reviews[].author object

Публичное лицо, которое написало отзыв.

reviews[].author.user object

Вариант субъекта — пользователь. Устанавливается, когда действие выполняет пользователь.

reviews[].author.user.id string

Публичный идентификатор пользователя.

reviews[].author.user.email string

Адрес электронной почты пользователя. Всегда задан, если присутствует вариант user.

reviews[].author.user.displayName string

Отображаемое имя пользователя: имя и фамилия из аккаунта, объединённые пробелом — то же имя, которое отображает продукт. Не указывается, если у аккаунта нет имени.

reviews[].author.user.handle string

Идентификатор профиля, указанный пользователем, без префикса @. Присутствует только пока профиль общедоступен; в противном случае отсутствует.

reviews[].author.app object

Вариант приложения субъекта. Устанавливается, когда действие выполнено приложением.

reviews[].author.app.id строка

Публичный идентификатор приложения.

reviews[].author.app.displayName string

Зарегистрированное отображаемое имя приложения. Пропускается, если приложение невозможно определить, а также для управляемого актера первой стороны Cursor.

reviews[].author.serviceAccount object

Вариант субъекта — сервисный аккаунт. Устанавливается, когда действие выполнено сервисным аккаунтом.

reviews[].author.serviceAccount.id string

Публичный идентификатор сервисного аккаунта.

reviews[].verdict string

Решение по обзору: одобрить, запросить_изменения или прокомментировать.

reviews[].body string

Текст итогов ревью.

reviews[].submittedAt string

Метка времени отправки в формате RFC 3339; отсутствует для неотправленного черновика отзыва.

reviews[].pullRequestVersion object

Версия pull request, к которой относится обзор.

reviews[].pullRequestVersion.number строка

Монотонно возрастающий номер версии pull request, представленный в виде JSON-строки.

reviews[].pullRequestVersion.headSha строка

SHA коммита, зафиксированный в этой версии pull request.

reviews[].pullRequestVersion.baseSha string

SHA базовой ветки, зафиксированный в этой версии pull request.

reviews[].pullRequestVersion.createdAt строка

Метка времени RFC 3339 для создания этой версии pull request.

reviews[].dismissal object

Отображается после отклонения отзыва; отклонённые отзывы остаются видимыми в списках.

reviews[].dismissal.dismissedBy object

Публичный субъект, который отклонил обзор при раскрытии.

reviews[].dismissal.dismissedBy.user object

Вариант субъекта — пользователь. Устанавливается, когда действие выполняет пользователь.

reviews[].dismissal.dismissedBy.user.id строка

Публичный идентификатор пользователя.

reviews[].dismissal.dismissedBy.user.email string

Адрес электронной почты пользователя. Всегда задан, если присутствует вариант user.

reviews[].dismissal.dismissedBy.user.displayName строка

Отображаемое имя пользователя: имя и фамилия учетной записи, объединённые пробелом, то же, что отображает продукт. Не указывается, если у учетной записи нет имени.

reviews[].dismissal.dismissedBy.user.handle string

Идентификатор профиля, заявленный пользователем, без префикса @. Указывается только если профиль общедоступен; в противном случае отсутствует.

reviews[].dismissal.dismissedBy.app object

Вариант приложения субъекта. Устанавливается, когда действие выполнено приложением.

reviews[].dismissal.dismissedBy.app.id string

Публичный идентификатор приложения.

reviews[].dismissal.dismissedBy.app.displayName string

Зарегистрированное отображаемое имя приложения. Не указывается, если приложение нельзя разрешить, а также для управляемого актёра первой стороны Cursor.

reviews[].dismissal.dismissedBy.serviceAccount object

Вариант субъекта — сервисный аккаунт. Устанавливается, когда действие выполнено сервисным аккаунтом.

reviews[].dismissal.dismissedBy.serviceAccount.id string

Публичный идентификатор сервисного аккаунта.

reviews[].dismissal.dismissedAt string

Метка времени отзыва в формате RFC 3339.

reviews[].dismissal.message string

Причина отклонения; при автоматическом замещении используется сообщение, сгенерированное сервером.

pullRequest object

Контейнер PullRequestReference, включённый вместе со страницей отзывов.

pullRequest.id строка

Постоянный идентификатор pull request.

pullRequest.number строка

Номер pull request в репозитории, закодированный как JSON-строка.

pullRequest.repository объект

Ссылка на контейнер репозитория для pull request.

pullRequest.repository.id string

Идентификатор репозитория в ссылке на контейнер.

pullRequest.repository.name строка

Имя репозитория в ссылке на контейнер.

pullRequest.repository.owner object

Ссылка на владельца репозитория.

pullRequest.repository.owner.slug string

Слаг владельца в URL, используемый вместе с идентификатором владельца для идентификации владельца репозитория.

pullRequest.repository.owner.id строка

Идентификатор владельца источника.

pullRequest.repository.owner.type строка

Тип пространства имён владельца. Только для вывода. Допустимые значения: team, user. Не указывается, если неизвестно.

nextPageToken string

Непрозрачный курсор для следующей страницы; пустой, когда отзывов больше не осталось.
curl --request GET \  --url 'https://api.cursor.com/v1/origin/repos/OWNER_SLUG/REPO_NAME/pulls/PULL_NUMBER/reviews' \  --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN'

Структура ответа:

{  "reviews": [    {      "id": "rev_01k2ja2000e0080000000000f6",      "author": {        "user": {          "id": "user_01k2ja2000e0080000000000c3",          "email": "[email protected]"        }      },      "verdict": "approve",      "body": "Approving. The telemetry schema matches the spec.",      "submittedAt": "2026-08-02T15:00:00Z",      "pullRequestVersion": {        "number": "3",        "headSha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4",        "baseSha": "3b1f9c2d8a7e6f5049c8b7a6d5e4f3a2b1c0d9e8",        "createdAt": "2026-08-01T09:30:00Z"      }    }  ],  "pullRequest": {    "id": "pr_01k2ja2000e0080000000000d4",    "number": "17",    "repository": {      "id": "repo_01k2ja2000e0080000000000q4",      "name": "rocket",      "owner": {        "slug": "acme",        "id": "ns_01k2ja2000e0080000000000p3",        "type": "team"      }    }  }}

Создать обзор Pull Request

POST/v1/origin/repos/{ownerSlug}/{repoName}/pulls/{pullNumber}/reviews
Scoperepository:pull_requests:reviews:writeAuthInstallation tokenUser access token

Создаёт и отправляет ревью pull request, при необходимости вместе с комментариями одним атомарным запросом. Для каждого комментария доступны те же варианты привязки, что и в Создать комментарий к Pull Request: comments[].inline для диапазона строк, comments[].file для всего файла, comments[].threadId для ответа или ни один из них для общего обсуждения.

Ревью отправляется сразу. Новое ревью approve или request_changes заменяет предыдущее активное решение вызывающего для того же pull request, которое при этом отклоняется. Авторы pull request не могут approve собственный pull request. Операция завершается с ошибкой FAILED_PRECONDITION, если у вызывающего есть неотправленное черновое ревью для этого pull request.

Если задан параметр comments, каждый якорь проверяется по диффу проверяемой версии перед записью, с использованием той же проверки в диффе, что и в Create Pull Request Comment. Если один комментарий не проходит проверку, весь запрос завершается с ошибкой InvalidArgument (HTTP 400) и ничего не публикуется. Комментарии становятся видимыми атомарно вместе с обзором: ни один комментарий или событие не наблюдаемы до отправки обзора, а затем каждый комментарий генерирует собственный webhook pull_request.comment.created наряду с событием обзора.

Операция не содержит ключа идемпотентности, поэтому повторная попытка после неоднозначного сбоя транспорта может создать второе ревью. Перед повторной попыткой вызовите Список ревью pull request.

Параметры пути

ownerSlug string Обязательно

Уникальный слаг сущности-владельца.

repoName string Обязательное

Имя репозитория, уникальное для сущности-владельца.

pullNumber string Обязательно

Тело запроса

verdict string Обязательно

Решение по проверке. Допустимые значения: PULL_REQUEST_REVIEW_VERDICT_UNSPECIFIED, approve, request_changes, comment.

body строка

Резюме отзыва в свободной форме. Может быть пустым.

versionNumber строка

Номер версии pull request, к которой относится обзор (см. PullRequestVersion.number). Оставьте пустым, чтобы просмотреть последнюю версию на момент вызова. Комментарии привязаны к той же версии.

comments массив

Комментарии публикуются атомарно вместе с обзором. Максимум 50 в запросе.

comments[].body строка Обязательно

Текст комментария. Должен содержать хотя бы один непробельный символ.

comments[].inline object

Якорь диффа для нового inline-треда в диффе проверяемой версии. Та же структура и валидация, что и у inline в Создать комментарий к Pull Request. Нельзя сочетать с comments[].threadId.

comments[].inline.path строка Обязательно

Путь к файлу в диффе версии, к которой относится ревью.

comments[].inline.side string Обязательно

Сторона диффа, к которой привязан якорь. Допустимые значения: left для базовой версии файла, right для версии head.

comments[].inline.startLine целое число Обязательно

Первая строка (нумерация с 1) закреплённого диапазона в версии файла side. Диапазон не должен выходить за пределы этого файла.

comments[].inline.endLine целое число

Включительная последняя строка привязанного диапазона. Должна быть больше или равна startLine. Не указывайте для якоря, занимающего одну строку.

comments[].threadId строка

Идентификатор существующей ветки обсуждения (thread) в этом pull request, на который нужно ответить. Ответ остаётся скрытым, пока ревью не будет опубликовано. Не указывайте comments[].inline, comments[].file и это поле, чтобы открыть новый общий тред обсуждения.

comments[].file object

Якорь для нового треда уровня файла, охватывающего весь файл, в диффе рецензируемой версии. Та же структура, определение стороны и валидация, что и у file в Создать комментарий к Pull Request. Нельзя сочетать с comments[].inline или comments[].threadId.

comments[].file.path строка Обязательно

Путь к файлу в диффе просматриваемой версии: при удалении — путь удалённого файла, иначе — путь в head.

Поля ответа

id string

Стабильный идентификатор обзора.

author object

Публичный участник, написавший отзыв.

author.user object

Вариант user для субъекта. Задаётся, если действие выполнил пользователь.

author.user.id строка

Публичный идентификатор пользователя.

author.user.email string

Адрес электронной почты пользователя. Всегда задаётся, когда присутствует вариант пользователя.

author.user.displayName строка

Отображаемое имя пользователя: имя и фамилия аккаунта, разделённые пробелом; то же имя, которое отображается в продукте. Не указывается, если у аккаунта нет имени.

author.user.handle строка

Указанный пользователем идентификатор профиля без префикса @. Присутствует только тогда, когда профиль общедоступен; в противном случае отсутствует.

author.app object

Вариант приложения субъекта. Устанавливается, когда действие было выполнено приложением.

author.app.id строка

Публичный идентификатор приложения.

author.app.displayName string

Зарегистрированное отображаемое имя приложения. Опускается, если приложение не удаётся определить, а также для собственного управляемого субъекта Cursor.

author.serviceAccount object

Вариант субъекта: служебный аккаунт. Устанавливается, когда действие выполнено служебным аккаунтом.

author.serviceAccount.id строка

Публичный идентификатор сервисного аккаунта.

verdict string

Решение ревью: approve, request_changes или comment.

body строка

Текст итогов ревью.

submittedAt строка

Метка времени отправки в формате RFC 3339; отсутствует для неотправленного черновика отзыва.

pullRequestVersion object

Версия pull request, к которой относится ревью.

pullRequestVersion.number строка

Монотонно возрастающий номер версии pull request, закодированный в виде JSON-строки.

pullRequestVersion.headSha string

SHA головы, зафиксированный этой версией pull request.

pullRequestVersion.baseSha string

Базовый SHA, зафиксированный этой версией pull request.

pullRequestVersion.createdAt строка

Метка времени RFC 3339 для создания этой версии pull request.

dismissal object

Появляется после отклонения отзыва; отклонённые отзывы остаются видимыми в списках.

dismissal.dismissedBy object

Публичный субъект, отклонивший ревью, если он раскрывается.

dismissal.dismissedBy.user object

Вариант user для субъекта. Задаётся, если действие выполнил пользователь.

dismissal.dismissedBy.user.id строка

Публичный идентификатор пользователя.

dismissal.dismissedBy.user.email строка

Адрес электронной почты пользователя. Всегда задаётся, когда присутствует вариант пользователя.

dismissal.dismissedBy.user.displayName строка

Отображаемое имя пользователя: имя и фамилия аккаунта, разделённые пробелом; то же имя, которое отображается в продукте. Не указывается, если у аккаунта нет имени.

dismissal.dismissedBy.user.handle строка

Указанный пользователем идентификатор профиля без префикса @. Присутствует только тогда, когда профиль общедоступен; в противном случае отсутствует.

dismissal.dismissedBy.app object

Вариант приложения субъекта. Устанавливается, когда действие было выполнено приложением.

dismissal.dismissedBy.app.id строка

Публичный идентификатор приложения.

dismissal.dismissedBy.app.displayName строка

Зарегистрированное отображаемое имя приложения. Опускается, если приложение не удаётся определить, а также для собственного управляемого субъекта Cursor.

dismissal.dismissedBy.serviceAccount object

Вариант субъекта: служебный аккаунт. Устанавливается, когда действие выполнено служебным аккаунтом.

dismissal.dismissedBy.serviceAccount.id строка

Публичный идентификатор сервисного аккаунта.

dismissal.dismissedAt строка

Временная метка отзыва в формате RFC 3339.

dismissal.message строка

Причина отклонения; при автоматической замене используется сообщение, сформированное сервером.
curl --request POST \  --url 'https://api.cursor.com/v1/origin/repos/OWNER_SLUG/REPO_NAME/pulls/PULL_NUMBER/reviews' \  --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN' \  --header 'Content-Type: application/json' \  --data '{  "verdict": "approve",  "body": "Approving. The telemetry schema matches the spec.",  "versionNumber": "3"}'

Структура ответа:

{  "id": "rev_01k2ja2000e0080000000000f6",  "author": {    "user": {      "id": "user_01k2ja2000e0080000000000c3",      "email": "[email protected]"    }  },  "verdict": "approve",  "body": "Approving. The telemetry schema matches the spec.",  "submittedAt": "2026-08-02T15:00:00Z",  "pullRequestVersion": {    "number": "3",    "headSha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4",    "baseSha": "3b1f9c2d8a7e6f5049c8b7a6d5e4f3a2b1c0d9e8",    "createdAt": "2026-08-01T09:30:00Z"  }}

Обновить обзор pull request

PATCH/v1/origin/repos/{ownerSlug}/{repoName}/pulls/{pullNumber}/reviews/{reviewId}
Scoperepository:pull_requests:reviews:writeAuthInstallation tokenUser access token

Обновляет текст ревью. Обновить его может только автор ревью; остальные вызывающие стороны получают PERMISSION_DENIED. Если ревью не относится к указанному pull request, возвращается NOT_FOUND.

Неотправленные черновые обзоры также можно обновлять; у ответа черновика нет submitted_at.

Параметры пути

ownerSlug string Обязательно

Уникальный слаг владеющей сущности.

repoName string Обязательно

Имя репозитория, уникальное для сущности-владельца.

pullNumber строка Обязательно

reviewId string Обязательное

Тело запроса

body string Обязательно

Текст новой сводки ревью; полностью заменяет предыдущее содержимое. Должен содержать хотя бы один непробельный символ; иначе INVALID_ARGUMENT.

Поля ответа

id строка

Постоянный идентификатор отзыва.

author object

Публичный пользователь, который написал отзыв.

author.user object

Вариант субъекта — пользователь. Устанавливается, когда действие выполняет пользователь.

author.user.id string

Публичный идентификатор пользователя.

author.user.email string

Адрес электронной почты пользователя. Всегда задаётся, когда присутствует вариант «user».

author.user.displayName строка

Отображаемое имя пользователя: имя и фамилия аккаунта, разделённые пробелом — то же имя, которое отображается в продукте. Не указывается, если у аккаунта нет имени.

author.user.handle string

Заявленный идентификатор профиля пользователя без префикса @. Присутствует только пока профиль общедоступен; в противном случае отсутствует.

author.app object

Вариант субъекта — приложение. Устанавливается, когда действие выполнено приложением.

author.app.id string

Публичный идентификатор для приложения.

author.app.displayName строка

Зарегистрированное отображаемое имя приложения. Не указывается, если приложение не удаётся разрешить, а также для управляемого первого лица Cursor.

author.serviceAccount object

Вариант субъекта — служебная учетная запись. Устанавливается, когда действие выполнено служебной учетной записью.

author.serviceAccount.id строка

Публичный идентификатор аккаунта службы.

verdict строка

Решение по обзору: одобрить, запросить_изменения или прокомментировать.

body string

Текст итогового обзора.

submittedAt строка

Метка времени отправки в формате RFC 3339; отсутствует для неотправленного чернового обзора.

pullRequestVersion object

Версия pull request, к которой относится обзор.

pullRequestVersion.number строка

Монотонно возрастающий номер версии pull request, закодированный как JSON-строка.

pullRequestVersion.headSha string

SHA head-коммита, зафиксированный этой версией pull request.

pullRequestVersion.baseSha строка

Базовый SHA, зафиксированный в этой версии pull request.

pullRequestVersion.createdAt string

Метка времени RFC 3339 для создания этой версии pull request.

dismissal object

Появляется после отклонения отзыва; отклонённые отзывы остаются видимыми в списках.

dismissal.dismissedBy object

Публичный актор, который отклонил обзор, когда был разоблачён.

dismissal.dismissedBy.user object

Вариант субъекта — пользователь. Устанавливается, когда действие выполняет пользователь.

dismissal.dismissedBy.user.id строка

Публичный идентификатор пользователя.

dismissal.dismissedBy.user.email строка

Адрес электронной почты пользователя. Всегда задаётся, когда присутствует вариант «user».

dismissal.dismissedBy.user.displayName строка

Отображаемое имя пользователя: имя и фамилия аккаунта, соединённые пробелом — то же имя, которое отображается в продукте. Пропускается, если у аккаунта нет имени.

dismissal.dismissedBy.user.handle string

Заявленный идентификатор профиля пользователя без префикса @. Отображается только пока профиль общедоступен; в противном случае отсутствует.

dismissal.dismissedBy.app object

Вариант субъекта — приложение. Устанавливается, когда действие выполнено приложением.

dismissal.dismissedBy.app.id строка

Публичный идентификатор приложения.

dismissal.dismissedBy.app.displayName string

Зарегистрированное отображаемое имя приложения. Не указывается, если приложение не удаётся разрешить, а также для управляемого актёра первой стороны Cursor.

dismissal.dismissedBy.serviceAccount object

Вариант субъекта — служебная учётная запись. Устанавливается, когда действие выполнено служебной учётной записью.

dismissal.dismissedBy.serviceAccount.id string

Публичный идентификатор служебной учетной записи.

dismissal.dismissedAt строка

Отметка времени отзыва в формате RFC 3339.

dismissal.message строка

Причина увольнения; при автоматическом замещении используется сообщение, сгенерированное сервером.
curl --request PATCH \  --url 'https://api.cursor.com/v1/origin/repos/OWNER_SLUG/REPO_NAME/pulls/PULL_NUMBER/reviews/REVIEW_ID' \  --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN' \  --header 'Content-Type: application/json' \  --data '{  "body": "Approving. The telemetry schema matches the spec."}'

Структура ответа:

{  "id": "rev_01k2ja2000e0080000000000f6",  "author": {    "user": {      "id": "user_01k2ja2000e0080000000000c3",      "email": "[email protected]"    }  },  "verdict": "approve",  "body": "Одобрено. Схема телеметрии соответствует спецификации.",  "submittedAt": "2026-08-02T15:00:00Z",  "pullRequestVersion": {    "number": "3",    "headSha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4",    "baseSha": "3b1f9c2d8a7e6f5049c8b7a6d5e4f3a2b1c0d9e8",    "createdAt": "2026-08-01T09:30:00Z"  }}

Отклонить обзор запроса на внесение изменений

PUT/v1/origin/repos/{ownerSlug}/{repoName}/pulls/{pullNumber}/reviews/{reviewId}/dismissals
Scoperepository:pull_requests:reviews:writeAuthInstallation tokenUser access token

Отменяет отправленное ревью, чтобы его вердикт больше не учитывался при определении состояния ревью pull request'а. Само ревью сохраняется и продолжает отображаться в ListPullRequestReviews с установленным полем dismissal.

Чтобы отклонить ревью, необязательно быть его автором; достаточно права доступа на запись в ревью pull request репозитория.

Отменить можно только ревью типов approve и request_changes, и только один раз: ревью типа comment, неотправленное черновое ревью или уже отменённое ревью возвращает FAILED_PRECONDITION, а повторный вызов оставляет первую отмену в силе. Ревью, которое не принадлежит указанному pull request, возвращает NOT_FOUND.

Параметры пути

ownerSlug string Обязательно

Уникальный слаг владельца сущности.

repoName string Обязательно

Имя репозитория, уникальное для сущности-владельца.

pullNumber string Обязательно

reviewId string Обязательное

Идентификатор обзора Stable Origin, возвращаемый ListPullRequestReviews.

Тело запроса

message string Обязательно

Причина, указанная при увольнении. Должна содержать хотя бы один непробельный символ; в противном случае INVALID_ARGUMENT.

Поля ответа

id строка

Постоянный идентификатор обзора.

author object

Публичный участник, автор отзыва.

author.user object

Пользовательская версия субъекта. Устанавливается, когда действие выполняет пользователь.

author.user.id строка

Публичный идентификатор пользователя.

author.user.email string

Адрес электронной почты пользователя. Всегда задаётся, если присутствует вариант пользователя.

author.user.displayName string

Отображаемое имя пользователя: имя и фамилия аккаунта, соединённые пробелом — то же имя, которое отображается в продукте. Отсутствует, если у аккаунта нет имени.

author.user.handle строка

Заявленный пользователем идентификатор профиля без префикса @. Присутствует только пока профиль общедоступен; в противном случае отсутствует.

author.app object

Вариант субъекта: приложение. Устанавливается, когда действие выполнено приложением.

author.app.id строка

Публичный идентификатор приложения.

author.app.displayName string

Зарегистрированное отображаемое имя приложения. Пропускается, если приложение не удаётся определить, а также для управляющего субъекта первой стороны Cursor.

author.serviceAccount object

Вариант субъекта — сервисный аккаунт. Устанавливается, когда действие выполнено сервисным аккаунтом.

author.serviceAccount.id string

Публичный идентификатор для сервисного аккаунта.

verdict строка

Решение по ревью: approve, request_changes или comment.

body string

Текст итогового обзора.

submittedAt строка

Временная метка отправки в формате RFC 3339; отсутствует для неотправленного чернового отзыва.

pullRequestVersion object

Версия pull request, к которой относится обзор.

pullRequestVersion.number строка

Монотонно возрастающий номер версии pull request, закодированный в виде JSON-строки.

pullRequestVersion.headSha string

SHA заголовка, зафиксированный этой версией pull request.

pullRequestVersion.baseSha string

SHA базовой ветки, зафиксированный в этой версии pull request.

pullRequestVersion.createdAt строка

Метка времени RFC 3339 для создания этой версии pull request.

dismissal object

Появляется после отклонения отзыва; отклонённые отзывы остаются видимыми в списках.

dismissal.dismissedBy object

Публичный субъект, отклонивший ревью, если он раскрывается.

dismissal.dismissedBy.user object

Пользовательский вариант субъекта. Задаётся, когда действие выполнил пользователь.

dismissal.dismissedBy.user.id string

Публичный идентификатор пользователя.

dismissal.dismissedBy.user.email строка

Адрес электронной почты пользователя. Всегда указывается, если присутствует вариант пользователя.

dismissal.dismissedBy.user.displayName строка

Отображаемое имя пользователя: имя и фамилия аккаунта, соединённые пробелом — то же имя, что отображается в продукте. Отсутствует, если у аккаунта нет имени.

dismissal.dismissedBy.user.handle string

Заявленный пользователем идентификатор профиля без префикса @. Присутствует, только пока профиль общедоступен; в противном случае отсутствует.

dismissal.dismissedBy.app object

Вариант субъекта: приложение. Устанавливается, когда действие выполнено приложением.

dismissal.dismissedBy.app.id строка

Публичный идентификатор приложения.

dismissal.dismissedBy.app.displayName строка

Зарегистрированное отображаемое имя приложения. Пропускается, если приложение не удаётся определить, а также для управляющего субъекта первой стороны Cursor.

dismissal.dismissedBy.serviceAccount object

Вариант субъекта — сервисный аккаунт. Устанавливается, когда действие выполнено сервисным аккаунтом.

dismissal.dismissedBy.serviceAccount.id строка

Публичный идентификатор для сервисного аккаунта.

dismissal.dismissedAt строка

Временная метка отклонения в формате RFC 3339.

dismissal.message строка

Причина увольнения; при автоматической замене используется сообщение, сгенерированное сервером.
curl --request PUT \  --url 'https://api.cursor.com/v1/origin/repos/OWNER_SLUG/REPO_NAME/pulls/PULL_NUMBER/reviews/REVIEW_ID/dismissals' \  --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN' \  --header 'Content-Type: application/json' \  --data '{  "message": "Superseded by a newer review."}'

Структура ответа:

{  "id": "rev_01k2ja2000e0080000000000f6",  "author": {    "user": {      "id": "user_01k2ja2000e0080000000000c3",      "email": "[email protected]"    }  },  "verdict": "approve",  "body": "Approving. The telemetry schema matches the spec.",  "submittedAt": "2026-08-02T15:00:00Z",  "pullRequestVersion": {    "number": "3",    "headSha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4",    "baseSha": "3b1f9c2d8a7e6f5049c8b7a6d5e4f3a2b1c0d9e8",    "createdAt": "2026-08-01T09:30:00Z"  },  "dismissal": {    "dismissedBy": {      "user": {        "id": "user_01k2ja2000e0080000000000c3",        "email": "[email protected]"      }    },    "dismissedAt": "2026-08-02T15:00:00Z",    "message": "Superseded by a newer review."  }}

Наборы правил

Список наборов правил

GET/v1/origin/repos/{ownerSlug}/{repoName}/rulesets
Scoperepository:rulesets:readAuthInstallation tokenUser access token

Возвращает список всех наборов правил, настроенных для репозитория.

Наборы правил для каждого репозитория имеют ограниченный размер, поэтому полный список возвращается в одном ответе, а этот endpoint не поддерживает разбивку на страницы. repository указывается один раз и описывает репозиторий, общий для всех наборов правил в ответе.

Параметры пути

ownerSlug string Обязательное поле

Уникальный слаг сущности-владельца.

repoName string Обязательное

Имя репозитория, уникальное для сущности-владельца.

Поля ответа

rulesets массив

Наборы правил, настроенные для репозитория.

rulesets[].id string

Идентификатор набора правил Stable Origin.

rulesets[].name string

Название набора правил.

rulesets[].description строка

Описание набора правил.

rulesets[].enforcement string

Как Origin применяет набор правил. Допустимые значения: active, evaluate, disabled.

rulesets[].kind строка

Операция, которую защищает набор правил. Допустимые значения: merge_branch, push_branch, push_tag, push_repository.

rulesets[].includedRefNames массив

Шаблоны имён Git-ссылок, включённые в этот набор правил. Поддерживаются glob-шаблоны и токены ~ALL и ~DEFAULT_BRANCH.

rulesets[].excludedRefNames массив

Шаблоны имён ссылок (ref), которые исключает этот набор правил. Тот же язык шаблонов, что и в rulesets[].includedRefNames.

rulesets[].rules массив

Правила защиты в этом наборе правил.

rulesets[].rules[].id string

Постоянный идентификатор Origin для этого правила.

rulesets[].rules[].ruleType string

Тип правила, например pull_request, require_status_checks, require_branch_up_to_date, deletion или non_fast_forward.

rulesets[].rules[].parameters object

Параметры для конкретного типа в виде JSON object. Структура зависит от rulesets[].rules[].ruleType.

rulesets[].bypassActors массив

Субъекты, которые могут обходить этот набор правил. Субъект обхода, чью сохранённую идентичность нельзя прочитать, опускается в ответе.

rulesets[].bypassActors[].id string

Стабильный идентификатор Origin для этого обходного субъекта.

rulesets[].bypassActors[].bypassMode string

Когда применяется обход. Допустимые значения: always, pull_request_only.

rulesets[].bypassActors[].user object

Субъект-пользователь. Указывается ровно одно из полей: user, team, app или originRole.

rulesets[].bypassActors[].user.id string

Числовой идентификатор пользователя Cursor, закодированный в виде десятичной строки.

rulesets[].bypassActors[].team object

Руководитель команды.

rulesets[].bypassActors[].team.organizationPublicId строка

Неизменяемый публичный идентификатор организации.

rulesets[].bypassActors[].team.groupPublicId string

Неизменяемый публичный идентификатор группы.

rulesets[].bypassActors[].app object

Принципал приложения.

rulesets[].bypassActors[].app.id string

Идентификатор приложения с префиксом app_.

rulesets[].bypassActors[].originRole object

Субъект, имеющий роль Origin.

rulesets[].bypassActors[].originRole.role string

Допустимые значения: namespace_admin, repository_admin, repository_write.

repository object

Репозиторий, используемый всеми наборами правил в этом ответе.

repository.id string

Идентификатор репозитория в ссылке на контейнер.

repository.name string

Имя репозитория в ссылке на контейнер.

repository.owner object

Ссылка на владельца репозитория.

repository.owner.slug строка

Слаг владельца для URL, используемый вместе с идентификатором владельца для идентификации владельца репозитория.

repository.owner.id string

Идентификатор владельца Origin.

repository.owner.type строка

Тип пространства имён владельца. Только для чтения. Допустимые значения: team, user. Не указывается, если неизвестно.
curl --request GET \  --url 'https://api.cursor.com/v1/origin/repos/OWNER_SLUG/REPO_NAME/rulesets' \  --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN'

Структура ответа:

{  "rulesets": [    {      "id": "rs_01k2ja2000e0080000000000t7",      "name": "require-review",      "description": "Require an approving review before merging to main.",      "enforcement": "active",      "kind": "merge_branch",      "includedRefNames": [        "refs/heads/main"      ],      "rules": [        {          "id": "rsr_01k2ja2000e0080000000000v8",          "ruleType": "pull_request",          "parameters": {            "requiredApprovingReviewCount": 1          }        }      ],      "bypassActors": [        {          "id": "rsba_01k2ja2000e0080000000000w9",          "bypassMode": "always",          "user": {            "id": "act_01k2ja2000e0080000000000x0"          }        }      ]    }  ],  "repository": {    "id": "repo_01k2ja2000e0080000000000q4",    "name": "rocket",    "owner": {      "slug": "acme",      "id": "ns_01k2ja2000e0080000000000p3",      "type": "team"    }  }}

Создать набор правил

POST/v1/origin/repos/{ownerSlug}/{repoName}/rulesets
Scoperepository:rulesets:writeAuthInstallation tokenUser access token

Создаёт набор правил для репозитория.

Ответ содержит сохранённый набор правил, включая идентификаторы, которые Origin присваивает каждому правилу и субъекту обхода. Пустое поле name отклоняется с ошибкой InvalidArgument (HTTP 400).

Параметры пути

ownerSlug string Обязательное

Уникальный слаг сущности-владельца.

repoName string Обязательно

Имя репозитория, уникальное для сущности-владельца.

Тело запроса

name string Обязательно

Название набора правил.

description строка

Описание набора правил.

enforcement string Обязательно

Как Origin применяет набор правил. Допустимые значения: active, evaluate, disabled.

kind string Обязательный

Операция, которую защищает набор правил. Допустимые значения: merge_branch, push_branch, push_tag, push_repository.

includedRefNames массив

Шаблоны имён ref, включаемые этим набором правил. Поддерживаются glob-шаблоны и токены ~ALL и ~DEFAULT_BRANCH. Значения с количеством записей более 64 отклоняются с ошибкой InvalidArgument (HTTP 400).

excludedRefNames массив

Шаблоны имён ссылок (ref), которые исключает этот набор правил. Используется тот же язык шаблонов и то же ограничение в 64 записи, что и для includedRefNames.

rules массив

Правила защиты для сохранения. Каждая запись содержит ruleType и необязательное поле parameters; Origin присваивает каждому правилу id. Значения с более чем 20 записями отклоняются с ошибкой InvalidArgument (HTTP 400).

bypassActors массив

Субъекты обхода для хранилища. В каждой записи указаны bypassMode и ровно одно из: user, team, app или originRole; Origin присваивает id каждому актору. Значения с более чем 15 записями отклоняются с ошибкой InvalidArgument (HTTP 400).

Поля ответа

id строка

Идентификатор набора правил Stable Origin.

name строка

Название набора правил.

description строка

Описание набора правил.

enforcement строка

Как Origin применяет набор правил. Допустимые значения: active, evaluate, disabled.

kind строка

Операция, которую защищает набор правил. Допустимые значения: merge_branch, push_branch, push_tag, push_repository.

includedRefNames массив

Шаблоны имён ссылок (ref), включаемые этим набором правил. Поддерживаются glob-маски и токены ~ALL и ~DEFAULT_BRANCH.

excludedRefNames массив

Шаблоны имён ссылок (ref), которые исключает этот набор правил. Используется тот же язык шаблонов, что и в includedRefNames.

rules массив

Правила защиты в этом наборе правил.

rules[].id строка

Стабильный идентификатор Origin для этого правила.

rules[].ruleType string

Тип правила, например pull_request, require_status_checks, require_branch_up_to_date, deletion или non_fast_forward.

rules[].parameters object

Параметры, специфичные для типа, в виде JSON-объекта. Структура зависит от rules[].ruleType.

bypassActors массив

Субъекты, которые могут обходить этот набор правил. Субъект обхода, чья сохранённая идентификация не может быть прочитана, исключается из ответа.

bypassActors[].id string

Стабильный идентификатор Origin для этого обходного актера.

bypassActors[].bypassMode string

Когда применяется обход. Допустимые значения: always, pull_request_only.

bypassActors[].user object

Субъект-пользователь. Присутствует ровно одно из полей: user, team, app или originRole.

bypassActors[].user.id string

Числовой идентификатор пользователя Cursor, закодированный в виде десятичной строки.

bypassActors[].team object

Руководитель команды.

bypassActors[].team.organizationPublicId string

Неизменяемый публичный идентификатор организации.

bypassActors[].team.groupPublicId string

Неизменяемый публичный идентификатор группы.

bypassActors[].app object

Основной объект приложения.

bypassActors[].app.id string

Идентификатор приложения, с префиксом app_.

bypassActors[].originRole object

Принципал, имеющий роль Origin.

bypassActors[].originRole.role строка

Допустимые значения: namespace_admin, repository_admin, repository_write.
curl --request POST \  --url 'https://api.cursor.com/v1/origin/repos/OWNER_SLUG/REPO_NAME/rulesets' \  --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN' \  --header 'Content-Type: application/json' \  --data '{  "name": "require-review",  "description": "Require an approving review before merging to main.",  "enforcement": "active",  "kind": "merge_branch",  "includedRefNames": [    "refs/heads/main"  ],  "rules": [    {      "ruleType": "pull_request",      "parameters": {        "requiredApprovingReviewCount": 1      }    }  ],  "bypassActors": [    {      "bypassMode": "always",      "user": {        "id": "act_01k2ja2000e0080000000000x0"      }    }  ]}'

Структура ответа:

{  "id": "rs_01k2ja2000e0080000000000t7",  "name": "require-review",  "description": "Require an approving review before merging to main.",  "enforcement": "active",  "kind": "merge_branch",  "includedRefNames": [    "refs/heads/main"  ],  "rules": [    {      "id": "rsr_01k2ja2000e0080000000000v8",      "ruleType": "pull_request",      "parameters": {        "requiredApprovingReviewCount": 1      }    }  ],  "bypassActors": [    {      "id": "rsba_01k2ja2000e0080000000000w9",      "bypassMode": "always",      "user": {        "id": "act_01k2ja2000e0080000000000x0"      }    }  ]}

Получить набор правил

GET/v1/origin/repos/{ownerSlug}/{repoName}/rulesets/{rulesetId}
Scoperepository:rulesets:readAuthInstallation tokenUser access token

Возвращает набор правил репозитория по его постоянному идентификатору Origin.

И неизвестный репозиторий, и неизвестный набор правил возвращают 404; сообщение позволяет их различить.

Параметры пути

ownerSlug string Обязательное поле

Уникальный слаг сущности-владельца.

repoName string Обязательный

Имя репозитория, уникальное для сущности владельца.

rulesetId string Обязательно

Идентификатор набора правил Stable Origin.

Поля ответа

id строка

Стабильный идентификатор набора правил Origin.

name string

Название набора правил.

description строка

Описание набора правил.

enforcement строка

Как Origin применяет набор правил. Допустимые значения: active, evaluate, disabled.

kind string

Операция, которую защищает набор правил. Допустимые значения: merge_branch, push_branch, push_tag, push_repository.

includedRefNames массив

Шаблоны имён ссылок (ref), которые включает этот набор правил. Поддерживаются glob‑шаблоны и токены ~ALL и ~DEFAULT_BRANCH.

excludedRefNames массив

Шаблоны имён ссылок (ref), которые исключает этот набор правил. Используется тот же язык шаблонов, что и в includedRefNames.

rules массив

Правила защиты в этом наборе правил.

rules[].id string

Постоянный идентификатор Origin для этого правила.

rules[].ruleType string

Тип правила, например: pull_request, require_status_checks, require_branch_up_to_date, deletion или non_fast_forward.

rules[].parameters object

Параметры, специфичные для типа, в виде JSON-объекта. Структура зависит от rules[].ruleType.

bypassActors массив

Субъекты, которые могут обходить этот набор правил. Субъект обхода, чья сохранённая идентификация не может быть прочитана, исключается из ответа.

bypassActors[].id строка

Постоянный идентификатор Origin для этого субъекта обхода.

bypassActors[].bypassMode string

Когда применяется обход. Допустимые значения: always, pull_request_only.

bypassActors[].user object

Основной субъект — пользователь. Присутствует ровно один из: user, team, app или originRole.

bypassActors[].user.id string

Числовой идентификатор пользователя Cursor, закодированный в виде десятичной строки.

bypassActors[].team object

Руководитель команды.

bypassActors[].team.organizationPublicId строка

Неизменяемый публичный идентификатор организации.

bypassActors[].team.groupPublicId string

Неизменяемый публичный идентификатор группы.

bypassActors[].app object

Приложение — основной субъект.

bypassActors[].app.id string

Идентификатор приложения, с префиксом app_.

bypassActors[].originRole object

Субъект, исполняющий роль Origin.

bypassActors[].originRole.role string

Допустимые значения: namespace_admin, repository_admin, repository_write.
curl --request GET \  --url 'https://api.cursor.com/v1/origin/repos/OWNER_SLUG/REPO_NAME/rulesets/RULESET_ID' \  --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN'

Структура ответа:

{  "id": "rs_01k2ja2000e0080000000000t7",  "name": "require-review",  "description": "Require an approving review before merging to main.",  "enforcement": "active",  "kind": "merge_branch",  "includedRefNames": [    "refs/heads/main"  ],  "rules": [    {      "id": "rsr_01k2ja2000e0080000000000v8",      "ruleType": "pull_request",      "parameters": {        "requiredApprovingReviewCount": 1      }    }  ],  "bypassActors": [    {      "id": "rsba_01k2ja2000e0080000000000w9",      "bypassMode": "always",      "user": {        "id": "act_01k2ja2000e0080000000000x0"      }    }  ]}

Обновить набор правил

PUT/v1/origin/repos/{ownerSlug}/{repoName}/rulesets/{rulesetId}
Scoperepository:rulesets:writeAuthInstallation tokenUser access token

Обновляет существующий набор правил репозитория.

Запрос заменяет всю конфигурацию набора правил. rules и bypassActors заменяются целиком, а не объединяются, и Origin присваивает сохранённым записям новые идентификаторы, поэтому отправьте все правила и субъекты обхода, которые вы хотите сохранить.

Параметры пути

ownerSlug строка Обязательное поле

Уникальный слаг владеющей сущности.

repoName строка Обязательный

Имя репозитория, уникальное для сущности-владельца.

rulesetId string Обязательно

Идентификатор набора правил Stable Origin.

Тело запроса

name string Обязательное

Название набора правил.

description строка

Описание набора правил.

enforcement string Обязательно

Как Origin применяет набор правил. Допустимые значения: active, evaluate, disabled.

kind string Обязательное

Операция, которую защищает набор правил. Допустимые значения: merge_branch, push_branch, push_tag, push_repository.

includedRefNames массив

Шаблоны имён ссылок (ref), включённые в этот набор правил. Поддерживаются glob-шаблоны и токены ~ALL и ~DEFAULT_BRANCH. Значения с более чем 64 записями отклоняются с ошибкой InvalidArgument (HTTP 400).

excludedRefNames массив

Шаблоны имён ссылок (ref), которые исключает этот набор правил. Используется тот же язык шаблонов и ограничение в 64 записи, что и для includedRefNames.

rules массив

Правила защиты для сохранения. Каждая запись содержит ruleType и необязательные parameters; Origin присваивает каждому правилу id. Значения при количестве записей более 20 отклоняются с ошибкой InvalidArgument (HTTP 400).

bypassActors массив

Принципалы обхода для сохранения. Каждая запись содержит bypassMode и ровно одно из полей: user, team, app или originRole; Origin присваивает id каждому субъекту. Значения, превышающие 15 записей, отклоняются с ошибкой InvalidArgument (HTTP 400).

Поля ответа

id строка

Идентификатор набора правил Stable Origin.

name строка

Название набора правил.

description строка

Описание набора правил.

enforcement строка

Как Origin применяет набор правил. Допустимые значения: active, evaluate, disabled.

kind строка

Операция, которую защищает набор правил. Допустимые значения: merge_branch, push_branch, push_tag, push_repository.

includedRefNames массив

Шаблоны имён ref, включаемые в этот набор правил. Поддерживаются glob‑шаблоны и токены ~ALL и ~DEFAULT_BRANCH.

excludedRefNames массив

Шаблоны имён ссылок (ref), которые исключает этот набор правил. Тот же язык шаблонов, что и в includedRefNames.

rules массив

Правила защиты в этом наборе правил.

rules[].id string

Постоянный идентификатор Origin для этого правила.

rules[].ruleType строка

Тип правила, например: pull_request, require_status_checks, require_branch_up_to_date, deletion или non_fast_forward.

rules[].parameters object

Параметры для конкретного типа в виде JSON-объекта. Структура зависит от rules[].ruleType.

bypassActors массив

Субъекты, которые могут обходить этот набор правил. Субъект обхода, чью сохранённую идентификацию нельзя прочитать, не включается в ответ.

bypassActors[].id string

Стабильный идентификатор Origin для этого субъекта обхода.

bypassActors[].bypassMode string

Когда применяется обход. Допустимые значения: always, pull_request_only.

bypassActors[].user object

Принципал пользователя. Присутствует ровно один из: user, team, app или originRole.

bypassActors[].user.id string

Числовой идентификатор пользователя Cursor, закодированный в виде десятичной строки.

bypassActors[].team object

Руководитель команды.

bypassActors[].team.organizationPublicId строка

Неизменяемый публичный идентификатор организации.

bypassActors[].team.groupPublicId string

Неизменяемый публичный идентификатор группы.

bypassActors[].app object

Основной субъект приложения.

bypassActors[].app.id string

Идентификатор приложения, с префиксом app_.

bypassActors[].originRole object

Субъект, имеющий роль Origin.

bypassActors[].originRole.role string

Допустимые значения: namespace_admin, repository_admin, repository_write.
curl --request PUT \  --url 'https://api.cursor.com/v1/origin/repos/OWNER_SLUG/REPO_NAME/rulesets/RULESET_ID' \  --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN' \  --header 'Content-Type: application/json' \  --data '{  "name": "require-review",  "description": "Require an approving review before merging to main.",  "enforcement": "active",  "kind": "merge_branch",  "includedRefNames": [    "refs/heads/main"  ],  "rules": [    {      "ruleType": "pull_request",      "parameters": {        "requiredApprovingReviewCount": 1      }    }  ],  "bypassActors": [    {      "bypassMode": "always",      "user": {        "id": "act_01k2ja2000e0080000000000x0"      }    }  ]}'

Структура ответа:

{  "id": "rs_01k2ja2000e0080000000000t7",  "name": "require-review",  "description": "Require an approving review before merging to main.",  "enforcement": "active",  "kind": "merge_branch",  "includedRefNames": [    "refs/heads/main"  ],  "rules": [    {      "id": "rsr_01k2ja2000e0080000000000v8",      "ruleType": "pull_request",      "parameters": {        "requiredApprovingReviewCount": 1      }    }  ],  "bypassActors": [    {      "id": "rsba_01k2ja2000e0080000000000w9",      "bypassMode": "always",      "user": {        "id": "act_01k2ja2000e0080000000x0"      }    }  ]}

Удалить набор правил

DELETE/v1/origin/repos/{ownerSlug}/{repoName}/rulesets/{rulesetId}
Scoperepository:rulesets:writeAuthInstallation tokenUser access token

Удаляет набор правил репозитория по его стабильному идентификатору Origin. Тело ответа пустое.

И неизвестный репозиторий, и неизвестный набор правил возвращают 404; различить их позволяет сообщение. Набор правил из другого репозитория считается неизвестным. Пустой rulesetId возвращает InvalidArgument (HTTP 400).

Параметры пути

ownerSlug string обязательный

Уникальный слаг сущности-владельца.

repoName string обязательный

Имя репозитория, уникальное в пределах сущности-владельца.

rulesetId string обязательный

Стабильный идентификатор набора правил Origin.

Поля ответа

При успешном запросе тело ответа отсутствует.

curl --request DELETE \  --url 'https://api.cursor.com/v1/origin/repos/OWNER_SLUG/REPO_NAME/rulesets/RULESET_ID' \  --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN'

Ответ:

204 No Content

Вебхуки

Origin отправляет подписанные HTTP-запросы POST на зарегистрированный HTTPS URL вебхука приложения с content-type: application/json.

Доставка гарантируется как минимум один раз. Устраняйте дубликаты повторных попыток по webhook-id, надёжно принимайте запрос, быстро возвращайте 2xx и обрабатывайте событие асинхронно.

Origin повторяет попытки при транспортных ошибках, ответах 429 и 5xx — всего до семи попыток. Задержки между повторными попытками: 5 секунд, 30 секунд, 1 минута, 2 минуты, 4 минуты и 8 минут. Другие ответы 4xx считаются окончательными.

Чтобы убедиться, что получатель работает до поступления первого реального события, вызовите Проверить вебхук.

Origin доставляет события для зеркалированных репозиториев, а полезные нагрузки событий установки указывают их в массивах выбранных репозиториев. Доставка не расширяет возможности вызовов установки: см. Зеркалированные репозитории.

Заголовки

ЗаголовокОписание
content-typeapplication/json
user-agentCursor-Origin-Webhook/1.0
webhook-idСтабильный идентификатор доставки и ключ идемпотентности.
webhook-timestampМетка времени Unix, включённая в подпись.
webhook-signaturev1ed,BASE64_SIGNATURE
webhook-event-typeСлаг события для маршрутизации.
webhook-event-idИдентификатор исходного события Origin, дублируемый из подписанного тела.
webhook-app-idИдентификатор целевого приложения.
webhook-installation-idИдентификатор целевой установки.

Заголовки маршрутизации предназначены для удобства. После проверки подписи источником истины считается тело.

Проверка подписи

Используйте сырое тело запроса до его обработки. Сформируйте:

lowercaseHex(SHA-256("<webhook-id>.<webhook-timestamp>.<raw-request-body>"))

Проверьте подпись Ed25519 для UTF-8-байтов этого шестнадцатеричного дайджеста по активному ключу Origin JWKS. Отклоняйте временные метки, отличающиеся от текущего времени более чем на пять минут.

import {  createHash,  createPublicKey,  verify,  type JsonWebKeyInput,} from "node:crypto";export async function verifyOriginWebhook(  body: Buffer,  headers: Record<string, string | undefined>): Promise<boolean> {  const id = headers["webhook-id"];  const timestamp = Number(headers["webhook-timestamp"]);  const signature = headers["webhook-signature"]    ?.split(/\s+/)    .find((value) => value.startsWith("v1ed,"));  const now = Math.floor(Date.now() / 1000);  if (    !id ||    !signature ||    !Number.isInteger(timestamp) ||    Math.abs(now - timestamp) > 300  ) {    return false;  }  const digest = createHash("sha256")    .update(`${id}.${timestamp}.`)    .update(body)    .digest("hex");  // В продакшене кэшируйте этот ответ.  const { keys } = await fetch(    "https://api.cursor.com/v1/origin/keys"  ).then((response) => response.json()) as {    keys: JsonWebKeyInput[];  };  return keys.some((jwk) => {    try {      return verify(        null,        Buffer.from(digest),        createPublicKey({ key: jwk, format: "jwk" }),        Buffer.from(signature.slice(5), "base64")      );    } catch {      return false;    }  });}

Обёртка доставки

Каждый запрос содержит полезную нагрузку события и идентификаторы доставки, приложения и установки:

{  "deliveryId": "whd_01...",  "appId": "app_01...",  "installationId": "i_01...",  "event": {    "id": "evt_01...",    "type": "pull_request.comment.created",    "eventTime": "2026-07-01T10:03:00Z",    "payload": {}  }}

deliveryId не меняется при повторных попытках. event.id идентифицирует исходное событие домена.

Восстановление

Используйте JWT приложения для запроса GET /app/webhook/deliveries. Фильтруйте по статусу доставки, типу события, установке, временному диапазону или токену страницы. delivered=false возвращает все доставки, которые получатель ещё ни разу не подтвердил ответом 2xx. Доставки остаются доступными для просмотра в течение семи дней, поэтому восстановление нужно выполнить в этот срок.

Используйте POST /app/webhook/deliveries:batchRedeliver, чтобы поставить в очередь повторную отправку до 100 идентификаторов доставок. Операция удаляет повторяющиеся идентификаторы и возвращает результат для каждой доставки.

Владелец может приостановить доставку вебхуков приложения в его настройках, а Origin может сделать это самостоятельно: приложение, получатель которого не справился как минимум с 20 раундами доставки в течение 72-часового окна, при отсутствии успешных доставок в этом окне и при сбоях, затрагивающих более одного пространства имён установщика, отключается автоматически. В любом случае доставка останавливается, пока владелец её не возобновит, запросы на повторную отправку возвращают FailedPrecondition (HTTP 400) и ничего не ставится в очередь, а API не предоставляет поля для приостановленного состояния — поэтому считайте сигналом именно FailedPrecondition при повторной отправке. Сброс webhookUrl приложения через Update App действует сильнее: он полностью отменяет ожидающие доставки, и повторная установка URL их не вернёт.

Справочник по вебхукам

Все события, которые доставляет Origin, и полезная нагрузка каждого события с описанием каждого поля. О механике подписки, заголовках, проверке подписи, обёртке доставки и повторных попытках см. Вебхуки.

События

СобытиеДоставляется, когда
repository.createdРепозиторий создаётся.
repository.deletedРепозиторий удаляется.
repository.pushedПри push изменяется одна или несколько Git-ссылок.
repository.metadata.updatedИзменяется ветка по умолчанию репозитория.
pull_request.createdОткрывается pull request.
pull_request.head_ref.pushedПродвигается head-ветка pull request.
pull_request.base_ref.updatedИзменяется базовая Git-ссылка или определённый базовый коммит.
pull_request.metadata.updatedИзменяется заголовок или описание.
pull_request.closedPull request закрывается без слияния, в том числе когда Origin закрывает его, поскольку после push его head-ветка не имеет общей истории с base-веткой.
pull_request.mergedPull request сливается.
pull_request.reopenedЗакрытый pull request открывается снова.
pull_request.publishedЧерновик становится открытым pull request.
pull_request.comment.createdСоздаётся видимый комментарий к pull request.
pull_request.review.submittedРевью отправляется с любым вердиктом.
pull_request.review.dismissedОтправленное ревью отклоняется явно или заменяется другим.
pull_request.reviewer.addedЗапрашивается ревьюер.
pull_request.reviewer.removedРевьюер удаляется.
pull_request.reviewer.rerequestedРевьюер запрашивается повторно.
repository.check_run.createdСоздаётся запуск проверки.
repository.check_run.completedЗапуск проверки завершается.
repository.check_run.rerequestedЗавершённый запуск проверки запрашивается повторно. Доставляется только приложению, которому принадлежит запуск.
installation.createdПриложение устанавливается.
installation.updatedИзменяются области доступа, выбор репозитория или slug пространства имён владельца.
installation.suspendedУстановка приостанавливается.
installation.unsuspendedПриостановленная установка восстанавливается.
installation.deletedПриложение удаляется.

Структура полезной нагрузки каждого события описана поле за полем в разделе Полезная нагрузка событий.

Пять событий installation.* направляются самому приложению, а не подписке репозитория. Origin всегда отправляет их, поэтому они не отображаются в списке событий, доступных для выбора в приложении. Все остальные события в этой таблице — подписки на уровне репозитория.

Origin не отправляет repository.pushed для репозитория, зеркалированного из GitHub. Эти push принадлежат GitHub, и он отправляет собственные push-вебхуки, поэтому доставка от Origin была бы дублированием. Push в нативные репозитории Origin и в исходящие зеркала доставляются как обычно, а состояние зеркала не влияет ни на какие другие события. repository.deleted отправляется для репозитория, зеркалированного из GitHub: остановка синхронизации удаляет только репозиторий на стороне Cursor, и GitHub ничего для него не отправляет.

Event payloads

Обёртка каждого события содержит его полезную нагрузку в виде object в поле payload. События с одинаковой структурой относятся к одному семейству полезной нагрузки; для каждого семейства ниже описаны доставляющие его события, его поля и пример полезной нагрузки, сгенерированный из спецификация OpenAPI.

Репозиторий создан

EVENTrepository.created

Поля payload

repository object

Созданный репозиторий.

repository.id string

repository.name string Обязательное

Имя репозитория, уникальное в рамках его владельца. Обязательно при создании.

repository.fullName string

"{owner.login}/{name}". Вычисляемый.

repository.owner object

Сущность-владелец. Определяется родительской веткой при создании; напрямую задать нельзя.

repository.owner.slug string

Уникальное имя владельца, пригодное для использования в URL.

repository.owner.id string

Уникальный идентификатор пространства имён владельца.

repository.owner.type string

team или user. Доступно только для вывода; не задано, если значение неизвестно. Одно из: team, user.

repository.defaultBranch string

Имя ветки по умолчанию. Всегда задаётся в ответах. При создании, если это поле опущено или пустое, используется значение "main".

repository.createdAt string

Временная метка в формате RFC 3339.

repository.updatedAt string

Временная метка в формате RFC 3339.

repository.pushedAt string

Временная метка последнего push в любой ветке; отсутствует до первого push. Метка в формате RFC 3339.

repository.cloneUrl string

HTTPS URL для клонирования репозитория.

repository.mirror object

Метаданные зеркала. Отсутствуют для native-репозитория, а также до завершения первоначальной синхронизации зеркала.

repository.mirror.source string

Одно из значений: github.

repository.mirror.sourceId string

Непрозрачный идентификатор репозитория, назначенный источником.

repository.mirror.status string

Фактическое направление во время перехода, пока не завершится переключение. Одно из значений: inbound, outbound.

repository.visibility string

Видимость репозитория: internal или private. Одно из значений: internal, private.

repository.allowMergeCommit boolean

Можно ли вливать pull request'ы в виде merge-коммитов.

repository.allowSquashMerge boolean

Можно ли вливать pull request'ы через squash merge.

repository.deleteBranchOnMerge boolean

Удаляется ли head-ветка автоматически при merge.

Пример event.payload:

{  "repository": {    "id": "repo_01k2ja2000e0080000000000q4",    "name": "rocket",    "fullName": "acme/rocket",    "owner": {      "slug": "acme",      "id": "ns_01k2ja2000e0080000000000p3",      "type": "team"    },    "defaultBranch": "main",    "createdAt": "2026-08-01T09:30:00Z",    "updatedAt": "2026-08-01T09:30:00Z",    "cloneUrl": "https://origin.cursor.com/git/acme/rocket.git"  }}

Репозиторий удалён

EVENTrepository.deleted

Поля полезной нагрузки

repository object

Удалённый репозиторий. Только ссылка: после удаления репозиторий больше не разрешается через API.

repository.id string

repository.name string

repository.owner object

Владелец репозитория.

repository.owner.slug string

Уникальное имя владельца, пригодное для использования в URL.

repository.owner.id string

Уникальный ID пространства имён владельца.

repository.owner.type string

team или user. Доступно только для вывода; не задано, если неизвестно. Одно из значений: team, user.

deletedAt string

Время удаления репозитория. Метка времени в формате RFC 3339.

Пример event.payload:

{  "repository": {    "id": "repo_01k2ja2000e0080000000000q4",    "name": "rocket",    "owner": {      "slug": "acme",      "id": "ns_01k2ja2000e0080000000000p3",      "type": "team"    }  },  "deletedAt": "2026-08-03T08:15:00Z"}

Отправка в репозиторий

EVENTrepository.pushed

Один атомарный push, который может обновить несколько Git-ссылок. Массив commits отсутствует; каждое обновление Git-ссылки содержит только метаданные tip, предоставляемые по мере возможности.

Поля payload

repository object

Репозиторий, в который был выполнен push.

repository.id string

repository.name string

repository.owner object

Владелец репозитория.

repository.owner.slug string

Уникальное имя владельца, пригодное для использования в URL.

repository.owner.id string

Уникальный идентификатор пространства имён владельца.

repository.owner.type string

team или user. Только для вывода; не задано, если неизвестно. Одно из значений: team, user.

refUpdates массив

Git-ссылки, включённые в этот push (не более 100).

refUpdates[].ref string

Полная Git-ссылка, которая была отправлена. Например: refs/heads/main или refs/tags/v3.14.1.

refUpdates[].before string

SHA последнего коммита в ref до push. Состоит из одних нулей (0000000000000000000000000000000000000000), если Git-ссылка была только что создана.

refUpdates[].after string

SHA последнего коммита в ref после push. Содержит только нули (0000000000000000000000000000000000000000), если Git-ссылка была удалена.

refUpdates[].created boolean

Была ли Git-ссылка создана этим push.

refUpdates[].deleted boolean

Была ли Git-ссылка удалена этим push.

refUpdates[].forced логическое значение

Перезаписал ли этот push историю: обновление существующей Git-ссылки не через fast-forward (новая вершина не является потомком прежней). False — для создания и удаления Git-ссылок, обновлений через fast-forward, а также для push, зафиксированных до того, как Origin начал отслеживать статус force-push.

refUpdates[].headCommit object

Метаданные коммита на раскрытом новом tip, собираемые по мере возможности. Не задаются при удалениях, для Git-ссылок, указывающих не на коммит, для исторических push и при ошибках извлечения.

refUpdates[].headCommit.sha string

refUpdates[].headCommit.author object

Git-идентификация и метка времени автора коммита или того, кто его закоммитил. Это идентификация, записанная в объекте коммита, а не связанный аккаунт пользователя.

refUpdates[].headCommit.author.name string

refUpdates[].headCommit.author.email string

refUpdates[].headCommit.author.date string

Временная метка в формате ISO-8601, сохраняющая исходное смещение часового пояса из подписи git (например, "2014-11-07T22:01:45+01:00").

refUpdates[].headCommit.committer object

Git-идентификатор и временная метка автора или коммиттера коммита. Это идентификатор, записанный в object коммита, а не связанный аккаунт пользователя.

refUpdates[].headCommit.committer.name string

refUpdates[].headCommit.committer.email string

refUpdates[].headCommit.committer.date string

Временная метка в формате ISO-8601, сохраняющая исходное смещение часового пояса из git-подписи (например, "2014-11-07T22:01:45+01:00").

refUpdates[].headCommit.message string

pushedAt string

Когда Origin зафиксировал push. Timestamp в формате RFC 3339.

pusher object

Принципал, выполнивший push, по результатам проверки Origin. Отсутствует, если push выполнил сам Origin — например, merge-push, который продвигает base ref при слиянии pull request.

pusher.user object

pusher.user.id string

pusher.user.email string Обязательный

pusher.user.displayName string

Человекочитаемое отображаемое имя: имя и фамилия аккаунта, у каждого из которых удалены пробелы по краям, объединённые пробелом, — ровно то имя, которое отображает UI продукта. Опускается, если у аккаунта нет имени; никогда не формируется из email, id или любого другого поля. Также может отсутствовать в payload вебхуков, для которых не удалось определить actor.

pusher.user.handle string

Занятый пользователем handle профиля (identity, стоящий за cursor.com /@handle), без префикса @. Передаётся только пока профиль пользователя публично доступен; отсутствует для пользователей без занятого handle и для непубличных профилей.

pusher.app object

pusher.app.id string

pusher.app.displayName string

Зарегистрированное отображаемое имя приложения; если поле присутствует, оно никогда не бывает пустым. Не включается в payload, для которых не удалось определить приложение, а также для собственного фасадного актора Cursor.

pusher.serviceAccount object

pusher.serviceAccount.id string

refUpdatesCount integer

Количество обновлений Git-ссылок в атомарном push. Список ref_updates может быть короче, если источник ограничил его длину.

Пример event.payload:

{  "repository": {    "id": "repo_01k2ja2000e0080000000000q4",    "name": "rocket",    "owner": {      "slug": "acme",      "id": "ns_01k2ja2000e0080000000000p3",      "type": "team"    }  },  "refUpdates": [    {      "ref": "refs/heads/add-telemetry",      "before": "5c8d7e6f5a4b3c2d1e0f9a8b7c6d5e4f3a2b1c0d",      "after": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4",      "created": false,      "deleted": false,      "forced": false,      "headCommit": {        "sha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4",        "author": {          "name": "Jane Doe",          "email": "[email protected]",          "date": "2026-08-01T09:30:00Z"        },        "committer": {          "name": "Jane Doe",          "email": "[email protected]",          "date": "2026-08-01T09:30:00Z"        },        "message": "Add launch telemetry"      }    }  ],  "pushedAt": "2026-08-02T14:45:00Z",  "pusher": {    "user": {      "id": "user_01k2ja2000e0080000000000c3",      "email": "[email protected]"    }  },  "refUpdatesCount": 1}

Метаданные репозитория обновлены

EVENTrepository.metadata.updated

Содержит полный снимок репозитория без delta и без актора, выполнившего обновление. Чтобы узнать, что изменилось, сравните последовательные снимки или повторно запросите репозиторий.

Поля payload

repository object

Полный snapshot репозитория после update.

repository.id string

repository.name string Обязательное

Имя репозитория, уникальное в рамках его владельца. Обязательно при создании.

repository.fullName string

"{owner.login}/{name}". Вычисляемое.

repository.owner object

Сущность-владелец. Определяется по родительской ветке при создании; напрямую задать нельзя.

repository.owner.slug string

Уникальное имя владельца, пригодное для использования в URL.

repository.owner.id string

Уникальный идентификатор пространства имён владельца.

repository.owner.type string

team или user. Только для вывода; не задано, если значение неизвестно. Одно из: team, user.

repository.defaultBranch string

Имя ветки по умолчанию. В ответах задаётся всегда. При создании, если поле не указано или оставлено пустым, используется значение "main".

repository.createdAt string

Временная метка в формате RFC 3339.

repository.updatedAt string

Временная метка в формате RFC 3339.

repository.pushedAt string

Timestamp последнего push в любой branch; отсутствует до первого push. Timestamp в формате RFC 3339.

repository.cloneUrl string

HTTPS URL для клонирования репозитория.

repository.mirror object

Метаданные зеркала. Отсутствуют для нативного репозитория, а также до завершения первичной синхронизации зеркала.

repository.mirror.source string

Одно из значений: github.

repository.mirror.sourceId string

Непрозрачный идентификатор репозитория, назначенный источником.

repository.mirror.status string

Действующее направление на время перехода, пока не завершится переключение. Одно из значений: inbound, outbound.

repository.visibility string

Видимость репозитория: internal или private. Одно из значений: internal, private.

repository.allowMergeCommit boolean

Могут ли pull request'ы вливаться в виде merge commit'ов.

repository.allowSquashMerge boolean

Разрешено ли вливать pull request'ы с помощью squash merge.

repository.deleteBranchOnMerge boolean

Удаляется ли head-ветка автоматически при merge.

Пример event.payload:

{  "repository": {    "id": "repo_01k2ja2000e0080000000000q4",    "name": "rocket",    "fullName": "acme/rocket",    "owner": {      "slug": "acme",      "id": "ns_01k2ja2000e0080000000000p3",      "type": "team"    },    "defaultBranch": "release",    "createdAt": "2026-08-01T09:30:00Z",    "updatedAt": "2026-08-03T08:15:00Z",    "cloneUrl": "https://origin.cursor.com/git/acme/rocket.git",    "pushedAt": "2026-08-02T14:45:00Z"  }}

События pull request

СОБЫТИЕpull_request.createdpull_request.publishedpull_request.reopenedpull_request.closedpull_request.mergedpull_request.metadata.updatedpull_request.head_ref.pushedpull_request.base_ref.updated

Изменение жизненного цикла pull request. Действие жизненного цикла передаётся в event.type обёртки; отдельного поля действия нет.

Поля payload

pullRequest object

Снимок pull request. Назначенные метки не включаются — получить их можно через GetPullRequest.

pullRequest.id string

Постоянный идентификатор pull request в Origin.

pullRequest.number string

Номер pull request в рамках репозитория.

pullRequest.state string

"open" или "closed". Черновик имеет статус "open"; влитые и закрытые pull request имеют статус "closed".

pullRequest.draft boolean

Остаётся ли pull request черновиком.

pullRequest.merged boolean

Был ли pull request влит (merged).

pullRequest.title string

Заголовок pull request.

pullRequest.body string

Описание пул-реквеста.

pullRequest.head object

Исходная сторона pull request — то, что вливается.

pullRequest.head.ref string

Git-ссылка, на которую указывает эта сторона, в том виде, в котором её сохраняет Origin.

pullRequest.head.sha string

SHA последнего коммита этой стороны в последней версии изменения.

pullRequest.base object

Целевая сторона pull request — ветка, в которую он вливается.

pullRequest.base.ref строка

Git-ссылка, на которую указывает эта сторона, в том виде, как её записал Origin.

pullRequest.base.sha string

SHA последнего коммита этой стороны в актуальной версии изменения.

pullRequest.author object

Принципал, открывший pull request.

pullRequest.author.user object

pullRequest.author.user.id string

pullRequest.author.user.email string Обязательное

pullRequest.author.user.displayName string

Понятное человеку отображаемое имя: имя и фамилия аккаунта, каждое без лишних пробелов, объединённые пробелом — ровно то имя, которое отображает UI продукта. Опускается, если у аккаунта нет имени; никогда не формируется из email, id или любого другого поля. Также может отсутствовать в payload вебхуков, для которых не удалось определить actor.

pullRequest.author.user.handle string

Занятый пользователем handle профиля (идентификатор, за которым стоит cursor.com /@handle), без префикса @. Передаётся только пока профиль пользователя публично виден; не указывается для пользователей без занятого handle и для непубличных профилей.

pullRequest.author.app object

pullRequest.author.app.id string

pullRequest.author.app.displayName string

Зарегистрированное отображаемое имя приложения; если поле присутствует, оно никогда не бывает пустым. Не включается в payload, для которых не удалось определить приложение, а также для собственного фасадного актора Cursor.

pullRequest.author.serviceAccount object

pullRequest.author.serviceAccount.id string

pullRequest.createdAt string

Время открытия pull request. Метка времени в формате RFC 3339.

pullRequest.updatedAt string

Время последнего обновления pull request. Временная метка в формате RFC 3339.

pullRequest.closedAt string

Когда pull request был закрыт или влит; не задано, пока он открыт. Отметка времени в формате RFC 3339.

pullRequest.mergedAt string

Время слияния pull request; не задано, если он не был влит. Временная метка в формате RFC 3339.

pullRequest.mergeCommitSha string

SHA итогового merge commit; задаётся после выполнения merge.

pullRequest.additions integer

Строки, добавленные в последней версии pull request.

pullRequest.deletions целое число

Строки, удалённые в последней версии pull request.

pullRequest.changedFiles integer

Файлы, изменённые в последней версии pull request.

pullRequest.version object

Последняя версия pull request.

pullRequest.version.number string

Монотонно возрастающий номер версии в рамках изменения (нумерация с 1).

pullRequest.version.headSha string

SHA head-коммита для этой версии.

pullRequest.version.baseSha string

SHA базового commit, с которым сравнивается эта версия.

pullRequest.version.createdAt string

Время создания этой версии. Метка времени в формате RFC 3339.

repository object

Репозиторий, к которому относится pull request.

repository.id string

repository.name string

repository.owner object

Владелец репозитория.

repository.owner.slug string

Уникальное имя владельца, подходящее для использования в URL.

repository.owner.id string

Уникальный идентификатор пространства имён владельца.

repository.owner.type string

team или user. Доступно только для вывода; не задано, если неизвестно. Одно из значений: team, user.

Пример event.payload:

{  "pullRequest": {    "id": "pr_01k2ja2000e0080000000000d4",    "number": "17",    "state": "open",    "draft": false,    "merged": false,    "title": "Add launch telemetry",    "body": "Adds structured launch telemetry to the ignition path.",    "head": {      "ref": "add-telemetry",      "sha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4"    },    "base": {      "ref": "main",      "sha": "3b1f9c2d8a7e6f5049c8b7a6d5e4f3a2b1c0d9e8"    },    "author": {      "user": {        "id": "user_01k2ja2000e0080000000000c3",        "email": "[email protected]"      }    },    "createdAt": "2026-08-01T09:30:00Z",    "updatedAt": "2026-08-02T14:45:00Z",    "additions": 128,    "deletions": 46,    "changedFiles": 5,    "version": {      "number": "3",      "headSha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4",      "baseSha": "3b1f9c2d8a7e6f5049c8b7a6d5e4f3a2b1c0d9e8",      "createdAt": "2026-08-01T09:30:00Z"    }  },  "repository": {    "id": "repo_01k2ja2000e0080000000000q4",    "name": "rocket",    "owner": {      "slug": "acme",      "id": "ns_01k2ja2000e0080000000000p3",      "type": "team"    }  }}

Комментарий к pull request

СОБЫТИЕpull_request.comment.created

Комментарий, созданный в pull request. Комментарии, добавленные в рамках ревью, отправляются в момент публикации ревью — по одному событию на каждый комментарий.

Поля payload

pullRequest object

Pull request, к которому оставлен комментарий.

pullRequest.id string

Неизменяемый идентификатор изменения в Origin.

pullRequest.number строка

pullRequest.repository object

Ссылка на репозиторий для этого pull request.

pullRequest.repository.id string

pullRequest.repository.name string

pullRequest.repository.owner object

Владелец репозитория.

pullRequest.repository.owner.slug string

Уникальное имя владельца, пригодное для использования в URL.

pullRequest.repository.owner.id string

Уникальный идентификатор пространства имён владельца.

pullRequest.repository.owner.type string

team или user. Только для вывода; не задано, если неизвестно. Одно из значений: team, user.

comment object

Созданный комментарий. Комментарий, открывший тред, содержит якорь в диффе этого треда непосредственно в себе; ответ содержит только comment.thread.id. Состояние разрешения треда в событие не входит — получить его можно через GetPullRequestComment.

comment.id string

comment.thread object

Тред, к которому относится этот комментарий, включая его якорь в диффе и статус разрешения.

comment.thread.id string

comment.thread.version object

Версия pull request, для которой был создан тред, включая SHA его head- и base-веток (см. PullRequestReview.pull_request_version).

comment.thread.version.number string

Монотонно возрастающий номер версии в рамках изменения (нумерация с 1).

comment.thread.version.headSha string

SHA head-коммита для этой версии.

comment.thread.version.baseSha строка

SHA базового коммита, с которым сравнивается эта версия.

comment.thread.version.createdAt string

Время создания этой версии. Метка времени в формате RFC 3339.

comment.thread.path string

Путь к файлу якоря треда в диффе. Пусто для тредов с общим обсуждением.

comment.thread.side string

Сторона диффа, к которой привязан якорь. Не задана для тредов общего обсуждения. Одно из значений: left, right.

comment.thread.startLine целое число

Первая строка привязанного диапазона в версии файла side. 0 для тредов уровня файла и тредов общего обсуждения.

comment.thread.endLine integer

Последняя строка привязанного диапазона (включительно). Равна 0, если якорь указывает на одну строку или не задаёт диапазон строк.

comment.thread.resolvedAt string

Время, когда тред был разрешён. Не задано, пока тред открыт. Метка времени в формате RFC 3339.

comment.thread.createdAt string

Временная метка в формате RFC 3339.

comment.thread.updatedAt string

Временная метка в формате RFC 3339.

comment.body string

comment.author object

Пользователь, приложение или сервисный аккаунт, выполнивший внешне заметное действие.

comment.author.user object

comment.author.user.id string

comment.author.user.email string Обязательный

comment.author.user.displayName строка

Читаемое человеком отображаемое имя: имя и фамилия аккаунта, каждое без лишних пробелов, соединённые пробелом — ровно то имя, которое показывает интерфейс продукта. Опускается, если у аккаунта нет имени; никогда не формируется из email, id или какого-либо другого поля. Также может отсутствовать в payload вебхуков, для которых не удалось определить actor.

comment.author.user.handle string

Занятый пользователем handle профиля (идентификатор, стоящий за cursor.com /@handle), без префикса @. Передаётся только пока профиль пользователя виден публично; отсутствует для пользователей без занятого handle и для непубличных профилей.

comment.author.app object

comment.author.app.id строка

comment.author.app.displayName строка

Зарегистрированное отображаемое имя приложения; если поле присутствует, оно никогда не бывает пустым. Отсутствует в payload, для которых не удалось определить приложение, а также у собственного фасадного актора Cursor.

comment.author.serviceAccount object

comment.author.serviceAccount.id string

comment.createdAt string

Timestamp в формате RFC 3339.

comment.updatedAt string

Временная метка в формате RFC 3339.

Пример event.payload:

{  "pullRequest": {    "id": "pr_01k2ja2000e0080000000000d4",    "number": "17",    "repository": {      "id": "repo_01k2ja2000e0080000000000q4",      "name": "rocket",      "owner": {        "slug": "acme",        "id": "ns_01k2ja2000e0080000000000p3",        "type": "team"      }    }  },  "comment": {    "id": "cmt_01k2ja2000e0080000000000e5",    "thread": {      "id": "cth_01k2ja2000e0080000000000s6",      "version": {        "number": "3",        "headSha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4",        "baseSha": "3b1f9c2d8a7e6f5049c8b7a6d5e4f3a2b1c0d9e8",        "createdAt": "2026-08-01T09:30:00Z"      },      "path": "src/telemetry/retry.ts",      "side": "right",      "startLine": 42,      "endLine": 45,      "createdAt": "2026-08-01T09:30:00Z",      "updatedAt": "2026-08-02T14:45:00Z"    },    "body": "Should the retry budget be configurable?",    "author": {      "user": {        "id": "user_01k2ja2000e0080000000000c3",        "email": "[email protected]"      }    },    "createdAt": "2026-08-01T09:30:00Z",    "updatedAt": "2026-08-02T14:45:00Z"  }}

События ревью pull request

EVENTpull_request.review.submittedpull_request.review.dismissed

Поля payload

pullRequest object

Pull request, к которому относится ревью.

pullRequest.id string

Неизменяемый идентификатор изменения в Origin.

pullRequest.number строка

pullRequest.repository object

Ссылка на репозиторий для этого пул-реквеста.

pullRequest.repository.id string

pullRequest.repository.name string

pullRequest.repository.owner object

Владелец репозитория.

pullRequest.repository.owner.slug string

Уникальное имя владельца, пригодное для использования в URL.

pullRequest.repository.owner.id string

Уникальный идентификатор пространства имён владельца.

pullRequest.repository.owner.type string

team или user. Только для вывода; не задано, если значение неизвестно. Одно из значений: team, user.

review object

Ревью, которое было отправлено или отклонено. При отклонении задаётся поле review.dismissal.

review.id string

Постоянный идентификатор ревью в Origin.

review.author object

Принципал, создавший ревью.

review.author.user object

review.author.user.id string

review.author.user.email string Обязательное

review.author.user.displayName string

Понятное человеку отображаемое имя: имя и фамилия аккаунта, каждое из которых очищено от пробелов по краям, соединённые пробелом, — ровно то имя, которое показывает интерфейс продукта. Не указывается, если у аккаунта нет имени; никогда не формируется из email, идентификатора или другого поля. Также может отсутствовать в payload вебхуков, для которых не удалось определить actor.

review.author.user.handle string

Занятый пользователем handle профиля (идентификатор, скрытый за cursor.com /@handle), без префикса @. Присутствует, только пока профиль пользователя виден публично; отсутствует у пользователей без занятого handle и у непубличных профилей.

review.author.app object

review.author.app.id string

review.author.app.displayName string

Зарегистрированное отображаемое имя приложения; если поле присутствует, оно никогда не бывает пустым. Отсутствует в payload, для которых не удалось определить приложение, а также у собственного фасадного актора Cursor.

review.author.serviceAccount object

review.author.serviceAccount.id string

review.verdict string

Одно из значений: approve, request_changes, comment.

review.body string

Текстовое резюме ревью в свободной форме. Пустое, если ревьюер не оставил резюме.

review.submittedAt string

Когда было отправлено ревью. Не задано для неотправленного черновика ревью. Временная метка в формате RFC 3339.

review.pullRequestVersion object

Версия pull request и SHA коммита head, к которым относится решение.

review.pullRequestVersion.number string

Монотонно возрастающий номер версии в рамках изменения (нумерация с 1).

review.pullRequestVersion.headSha string

SHA head-коммита этой версии.

review.pullRequestVersion.baseSha string

SHA базового коммита, с которым сравнивается эта версия.

review.pullRequestVersion.createdAt string

Время создания этой версии. Timestamp в формате RFC 3339.

review.dismissal object

Задаётся после того, как ревью отклонено; отсутствует, пока вердикт всё ещё учитывается в review state для pull request.

review.dismissal.dismissedBy object

Субъект, отклонивший ревью. Отсутствует, если отклонение было зафиксировано для типа участника, который этот API не раскрывает.

review.dismissal.dismissedBy.user object

review.dismissal.dismissedBy.user.id string

review.dismissal.dismissedBy.user.email string Обязательный

review.dismissal.dismissedBy.user.displayName string

Читаемое человеком отображаемое имя: имя и фамилия аккаунта, каждое без начальных и конечных пробелов, соединённые пробелом — ровно то имя, которое отображает UI продукта. Опускается, если у аккаунта нет имени; никогда не формируется из email, id или любого другого поля. Также может отсутствовать в payload webhook, для которых не удалось определить actor.

review.dismissal.dismissedBy.user.handle string

Занятый пользователем handle профиля (идентификатор за ссылкой cursor.com /@handle), без префикса @. Передаётся, только пока профиль пользователя публично доступен; не передаётся для пользователей без занятого handle и для непубличных профилей.

review.dismissal.dismissedBy.app object

review.dismissal.dismissedBy.app.id string

review.dismissal.dismissedBy.app.displayName string

Зарегистрированное отображаемое имя приложения; если поле присутствует, оно никогда не бывает пустым. Не включается в payload, для которых не удалось определить приложение, а также для собственного фасадного актора Cursor.

review.dismissal.dismissedBy.serviceAccount object

review.dismissal.dismissedBy.serviceAccount.id string

review.dismissal.dismissedAt string

Когда ревью было отклонено. Временная метка в формате RFC 3339.

review.dismissal.message string

Причина, зафиксированная при отклонении. Для ревью, автоматически снятых из-за того, что их автор отправил более свежий вердикт, причина формируется сервером.

Пример event.payload:

{  "pullRequest": {    "id": "pr_01k2ja2000e0080000000000d4",    "number": "17",    "repository": {      "id": "repo_01k2ja2000e0080000000000q4",      "name": "rocket",      "owner": {        "slug": "acme",        "id": "ns_01k2ja2000e0080000000000p3",        "type": "team"      }    }  },  "review": {    "id": "rev_01k2ja2000e0080000000000f6",    "author": {      "user": {        "id": "user_01k2ja2000e0080000000000c3",        "email": "[email protected]"      }    },    "verdict": "approve",    "body": "Approving. The telemetry schema matches the spec.",    "submittedAt": "2026-08-02T15:00:00Z",    "pullRequestVersion": {      "number": "3",      "headSha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4",      "baseSha": "3b1f9c2d8a7e6f5049c8b7a6d5e4f3a2b1c0d9e8",      "createdAt": "2026-08-01T09:30:00Z"    }  }}

События ревьюера pull request

EVENTpull_request.reviewer.addedpull_request.reviewer.removedpull_request.reviewer.rerequested

Изменение списка запрошенных ревьюеров pull request. Текущий набор ожидающих ревьюеров можно получить через ListPullRequestRequestedReviewers.

Поля payload

pullRequest object

Pull request, в котором изменился список запрошенных ревьюеров.

pullRequest.id string

Неизменяемый идентификатор изменения в Origin.

pullRequest.number строка

pullRequest.repository object

Ссылка на репозиторий для этого pull request.

pullRequest.repository.id string

pullRequest.repository.name string

pullRequest.repository.owner object

Владелец репозитория.

pullRequest.repository.owner.slug string

Уникальное имя владельца, пригодное для использования в URL.

pullRequest.repository.owner.id string

Уникальный идентификатор пространства имён владельца.

pullRequest.repository.owner.type string

team или user. Доступно только для вывода; не задано, если значение неизвестно. Одно из: team, user.

reviewer object

Запрошенный ревьюер, которого касается событие.

reviewer.user object

reviewer.user.id string

reviewer.user.email string Обязательное

reviewer.user.displayName string

Человекочитаемое отображаемое имя: имя и фамилия аккаунта, каждое без лишних пробелов, соединённые пробелом, — ровно то имя, которое показывает UI продукта. Опускается, если у аккаунта нет имени; никогда не формируется из email, id или любого другого поля. Также может отсутствовать в payload webhook, для которых не удалось определить actor.

reviewer.user.handle string

Закреплённый за пользователем handle профиля (идентификатор, стоящий за cursor.com /@handle), без префикса @. Присутствует только пока профиль пользователя доступен публично; не возвращается для пользователей без закреплённого handle и для непубличных профилей.

reviewer.group object

Публичный идентификатор группы Origin (grp_…). Пока содержит только id.

reviewer.group.id string

createdVia string

Как был создан запрос на ревью. Одно из значений: manual, codeowners.

createdBy object

Принципал, создавший запрос на ревью, если он известен.

createdBy.user object

createdBy.user.id string

createdBy.user.email string Обязательный

createdBy.user.displayName string

Отображаемое имя, удобное для чтения: имя и фамилия из аккаунта, каждое очищено от пробелов по краям и соединено пробелом — ровно то имя, которое отображает UI продукта. Не включается, если у аккаунта нет имени; никогда не формируется из email, id или другого поля. Также может отсутствовать в payload вебхуков, для которых не удалось определить actor.

createdBy.user.handle string

Занятый пользователем handle профиля (identity за cursor.com /@handle), без префикса @. Передаётся только тогда, когда профиль пользователя доступен публично; для пользователей без занятого handle и для непубличных профилей не передаётся.

createdBy.app object

createdBy.app.id string

createdBy.app.displayName string

Зарегистрированное отображаемое имя приложения; если поле присутствует, оно никогда не бывает пустым. Не включается в payload, для которых не удалось определить приложение, а также для собственного фасадного актора Cursor.

createdBy.serviceAccount object

createdBy.serviceAccount.id string

createdAt string

Когда был создан запрос на ревью. Метка времени в формате RFC 3339.

Пример event.payload:

{  "pullRequest": {    "id": "pr_01k2ja2000e0080000000000d4",    "number": "17",    "repository": {      "id": "repo_01k2ja2000e0080000000000q4",      "name": "rocket",      "owner": {        "slug": "acme",        "id": "ns_01k2ja2000e0080000000000p3",        "type": "team"      }    }  },  "reviewer": {    "user": {      "id": "user_01k2ja2000e0080000000000c3",      "email": "[email protected]"    }  },  "createdVia": "codeowners",  "createdAt": "2026-08-02T14:45:00Z"}

События проверочных запусков

EVENTrepository.check_run.createdrepository.check_run.completed

Зафиксированный снимок для события жизненного цикла check-run в Origin.

Поля полезной нагрузки

repository object

Репозиторий, которому принадлежит запуск проверки.

repository.id string

repository.name string

repository.owner object

Владелец репозитория.

repository.owner.slug string

Уникальное имя владельца, пригодное для использования в URL.

repository.owner.id string

Уникальный идентификатор пространства имён владельца.

repository.owner.type string

team или user. Только для вывода; не устанавливается, если неизвестно. Одно из: team, user.

checkSuite object

Набор проверок (suite), к которому относится данный check run.

checkSuite.id string

Уникальный идентификатор набора, назначенный сервером.

checkSuite.repository object

Репозиторий, к которому относится набор.

checkSuite.repository.id string

checkSuite.repository.name string

checkSuite.repository.owner object

Владелец репозитория.

checkSuite.repository.owner.slug string

Уникальное имя владельца, пригодное для использования в URL.

checkSuite.repository.owner.id string

Уникальный идентификатор пространства имён владельца.

checkSuite.repository.owner.type string

team или user. Только для вывода; не устанавливается, если неизвестно. Одно из: team, user.

checkSuite.sha string

SHA хеша head-коммита, к которому прикреплён набор (строчные шестнадцатеричные символы).

checkSuite.key строка

Заданный приложением ключ идемпотентности для набора.

checkSuite.name string

Отображаемое пользователю название набора.

checkSuite.detailsUrl string

Ссылка на подробную информацию о наборе в целом, если указано.

checkSuite.createdAt string

Временная метка в формате RFC 3339.

checkSuite.updatedAt string

Временная метка в формате RFC 3339.

checkSuite.externalId строка

Неизменяемый идентификатор этой попытки выполнения набора, назначенный провайдером.

checkSuite.actor object

Принципал, который создал комплект.

checkSuite.actor.user object

checkSuite.actor.user.id string

checkSuite.actor.user.email string Обязательно

checkSuite.actor.user.displayName string

Понятное человеку отображаемое имя: имя и фамилия аккаунта, каждое обрезано от лишних пробелов и соединено пробелом — ровно то имя, которое отображает интерфейс продукта. Пропускается, если у аккаунта отсутствует имя; никогда не формируется из электронной почты, идентификатора или любого другого поля. Также может отсутствовать в полезных нагрузках webhook, для которых не удалось определить автора (actor).

checkSuite.actor.user.handle string

Заявленный пользователем идентификатор профиля (имя за cursor.com /@handle), без префикса @. Отображается только пока профиль пользователя виден публично; пропускается для пользователей без заявленного идентификатора и для непубличных профилей.

checkSuite.actor.app object

checkSuite.actor.app.id string

checkSuite.actor.app.displayName string

Зарегистрированное отображаемое имя приложения; если поле присутствует, оно никогда не пустое. Опускается в полезных нагрузках, для которых не удалось определить приложение, а также для собственного фасадного актора Cursor.

checkSuite.actor.serviceAccount object

checkSuite.actor.serviceAccount.id string

checkRun object

Снимок check run на этой точке lifecycle.

checkRun.id string

Уникальный идентификатор check run, присвоенный сервером.

checkRun.repository object

Репозиторий, которому принадлежит check run.

checkRun.repository.id string

checkRun.repository.name string

checkRun.repository.owner object

Владелец репозитория.

checkRun.repository.owner.slug строка

Уникальное имя владельца, пригодное для использования в URL.

checkRun.repository.owner.id string

Уникальный идентификатор пространства имён владельца.

checkRun.repository.owner.type string

team или user. Только для вывода; не устанавливается, если неизвестно. Одно из: team, user.

checkRun.checkSuite object

Пакет, к которому принадлежит этот запуск проверки.

checkRun.checkSuite.id string

checkRun.sha string

SHA конечного (head) коммита, к которому привязан check run (строчными шестнадцатеричными символами).

checkRun.key string

Заданный приложением ключ идемпотентности для check run.

checkRun.name string

Отображаемое пользователю имя проверки (check-run).

checkRun.status string

Состояние жизненного цикла. rerequested — завершённый запуск, повторное выполнение которого было запрошено, но владеющее приложение ещё не ответило: для читателей он в состоянии ожидания (отображается как queued), при этом conclusion и временные метки по-прежнему описывают вытесненную попытку. Устанавливается только Origin при повторном запросе (RerequestCheckRun); приложения не могут его публиковать. Одно из: queued, in_progress, completed, rerequested.

checkRun.conclusion string

Присутствует только если status имеет значение completed или rerequested. Для запуска со статусом rerequested это решение вытесненной попытки: считайте запуск ожидающим и читайте conclusion только когда status == completed. Одно из: success, failure, neutral, cancelled, skipped, timed_out, action_required, stale.

checkRun.detailsUrl string

Ссылка на более подробную информацию об этом запуске проверки, если указано.

checkRun.externalUpdatedAt string

Время последнего обновления во внешней системе, используемое для упорядочивания. Отметка времени в формате RFC 3339.

checkRun.startedAt string

Время начала запуска проверки, если оно указано. Отметка времени в формате RFC 3339.

checkRun.completedAt string

Время завершения выполнения проверки, если оно указано. Отметка времени в формате RFC 3339.

checkRun.createdAt string

Временная метка в формате RFC 3339.

checkRun.updatedAt string

Временная метка в формате RFC 3339.

checkRun.externalId string

Неизменяемый идентификатор, присвоенный поставщиком для этой попытки проверки (см. CheckRunInput.external_id: рекомендуется по одному на выполнение).

checkRun.actor object

Лицо, выпустившее запуск проверки.

checkRun.actor.user object

checkRun.actor.user.id string

checkRun.actor.user.email string Обязательное

checkRun.actor.user.displayName string

Понятное человеку отображаемое имя: имя и фамилия аккаунта, каждое обрезано от лишних пробелов и объединено пробелом — ровно то имя, которое отображает интерфейс продукта. Опускается, если у аккаунта нет имени; никогда не формируется из адреса электронной почты, идентификатора (id) или любого другого поля. Также может отсутствовать в полезных нагрузках (payload) вебхуков, для которых не удалось определить актера.

checkRun.actor.user.handle string

Заявленный пользователем идентификатор профиля (личность за cursor.com/@handle), без префикса @. Отображается только пока профиль пользователя публичен; опускается для пользователей без заявленного идентификатора и для непубличных профилей.

checkRun.actor.app object

checkRun.actor.app.id string

checkRun.actor.app.displayName string

Зарегистрированное отображаемое имя приложения — если поле присутствует, оно никогда не бывает пустым. Пропускается в полезных данных (payload), для которых не удалось определить приложение, а также для фасадного актора Cursor первой стороны.

checkRun.actor.serviceAccount object

checkRun.actor.serviceAccount.id string

checkRun.output object

Понятный человеку вывод для этого запуска проверки, если задан.

checkRun.output.title string

Краткий заголовок для вывода. Максимальная длина: 255 символов.

checkRun.output.summary string

Сводка выходных данных. Может содержать Markdown. Максимальный размер в UTF-8: 65535 байт.

checkRun.output.text string

Подробные результаты. Могут содержать Markdown. Максимальный размер в UTF-8: 65535 байт.

checkRun.deadlineAt string

Необязательный крайний срок. Если параметр опущен или не задан, срок действия не ограничен. Метка времени в формате RFC 3339.

checkRun.isRerequestable boolean

Объявило ли приложение для отчётов этот запуск доступным для повторного запроса (CheckRunInput.is_rerequestable).

checkRun.rerequestedAt string

Устанавливается, пока ожидается повторный запрос; сбрасывается, когда провайдер снова публикует данные. Если не установлен, повторный запрос не ожидается. Пока установлен, status имеет значение rerequested, а запуск остаётся в состоянии ожидания CI коммита (conclusion и тайминги — устаревшие результаты); владеющее приложение отвечает, опубликовав запуск, на который оно ссылается, объявив is_rerequestable — это может быть новый запуск с тем же key или обновление этого запуска (что очищает это поле) — после чего запуск можно снова запросить. Метка времени в формате RFC 3339.

checkRun.rerequestedBy object

Принципал, повторно запросивший запуск. Присутствует только если задано rerequested_at; сбрасывается вместе с ним, когда отвечает владеющее приложение.

checkRun.rerequestedBy.user object

checkRun.rerequestedBy.user.id string

checkRun.rerequestedBy.user.email string Обязательно

checkRun.rerequestedBy.user.displayName string

Понятное человеку отображаемое имя: имя и фамилия аккаунта, каждое с обрезанными пробелами и соединённые пробелом — точно то имя, которое отображает интерфейс продукта. Отсутствует, если у аккаунта нет имени; никогда не синтезируется из адреса электронной почты, идентификатора или какого‑либо другого поля. Также может отсутствовать в payload вебхуков, для которых не удалось определить актёра.

checkRun.rerequestedBy.user.handle string

Занятый пользователем handle профиля (идентификатор, стоящий за cursor.com /@handle), без префикса @. Присутствует, только пока профиль пользователя виден публично; не указывается для пользователей без занятого handle и для непубличных профилей.

checkRun.rerequestedBy.app object

checkRun.rerequestedBy.app.id string

checkRun.rerequestedBy.app.displayName string

Зарегистрированное отображаемое имя приложения — если поле присутствует, оно никогда не пустое. Опускается в полезных нагрузках, для которых не удалось определить приложение, а также для собственного фасадного актёра Cursor.

checkRun.rerequestedBy.serviceAccount object

checkRun.rerequestedBy.serviceAccount.id string

actor object

Субъект, создавший запуск проверки.

actor.user object

actor.user.id string

actor.user.email string Обязательное

actor.user.displayName string

Понятное человеку отображаемое имя: имя и фамилия аккаунта, каждое обрезанное от лишних пробелов и соединённые пробелом — ровно то имя, которое отображает интерфейс продукта. Пропускается, если у аккаунта нет имени; никогда не формируется из адреса электронной почты, идентификатора или любого другого поля. Также может отсутствовать в полезных нагрузках webhook, для которых не удалось определить актёра.

actor.user.handle string

Заявленный пользователем идентификатор профиля (личность за cursor.com/@handle), без префикса @. Появляется только пока профиль пользователя публично видим; опускается для пользователей без заявленного идентификатора и для непубличных профилей.

actor.app object

actor.app.id string

actor.app.displayName string

Зарегистрированное отображаемое имя приложения; если поле присутствует, оно никогда не пустое. Опускается в полезных нагрузках, для которых не удалось определить приложение, а также для собственно первого фасадного актера Cursor.

actor.serviceAccount object

actor.serviceAccount.id string

Пример event.payload:

{  "repository": {    "id": "repo_01k2ja2000e0080000000000q4",    "name": "rocket",    "owner": {      "slug": "acme",      "id": "ns_01k2ja2000e0080000000000p3",      "type": "team"    }  },  "checkSuite": {    "id": "crg_01k2ja2000e0080000000000h8",    "repository": {      "id": "repo_01k2ja2000e0080000000000q4",      "name": "rocket",      "owner": {        "slug": "acme",        "id": "ns_01k2ja2000e0080000000000p3",        "type": "team"      }    },    "sha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4",    "key": "ci-8842",    "name": "CI",    "detailsUrl": "https://ci.acme.dev/runs/8842",    "createdAt": "2026-08-01T09:30:00Z",    "updatedAt": "2026-08-02T14:45:00Z",    "externalId": "build-8842",    "actor": {      "user": {        "id": "user_01k2ja2000e0080000000000c3",        "email": "[email protected]"      }    }  },  "checkRun": {    "id": "cr_01k2ja2000e0080000000000g7",    "repository": {      "id": "repo_01k2ja2000e0080000000000q4",      "name": "rocket",      "owner": {        "slug": "acme",        "id": "ns_01k2ja2000e0080000000000p3",        "type": "team"      }    },    "checkSuite": {      "id": "crg_01k2ja2000e0080000000000h8"    },    "sha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4",    "key": "ci-8842-unit-tests",    "name": "unit-tests",    "status": "completed",    "conclusion": "success",    "detailsUrl": "https://ci.acme.dev/runs/8842",    "externalUpdatedAt": "2026-08-02T14:44:30Z",    "startedAt": "2026-08-02T14:40:00Z",    "completedAt": "2026-08-02T14:44:30Z",    "createdAt": "2026-08-01T09:30:00Z",    "updatedAt": "2026-08-02T14:45:00Z",    "externalId": "run-8842",    "actor": {      "user": {        "id": "user_01k2ja2000e0080000000000c3",        "email": "[email protected]"      }    },    "output": {      "title": "Unit tests",      "summary": "128 tests passed.",      "text": "All suites green."    }  },  "actor": {    "user": {      "id": "user_01k2ja2000e0080000000000c3",      "email": "[email protected]"    }  }}

Повторный запрос проверки выполнения

EVENTrepository.check_run.rerequested

Payload вебхука repository.check_run.rerequested доставляется только приложению, которому принадлежит check run. В ответ опубликуйте новый run для того же SHA коммита head и того же key — либо новый run (новый external_id), либо обновление повторно запрошенного run. Зафиксированный run имеет status: rerequested (его conclusion и тайминги являются замененным результатом), пока ответная публикация не сбросит rerequested_at. Каждый принятый повторный запрос порождает одно событие, и после ответа run можно запросить повторно снова, поэтому дедупликацию повторных отправок выполняйте только по идентификатору события; в check_run.rerequested_at хранится непогашенная отметка. Payload не содержит контекста pull request (check runs привязываются к (repository, sha)): потребителю, которому нужен pull request, следует определить его по check_run.sha через собственное сопоставление head-веток либо через ListPullRequests с фильтром по той head branch, которую он собирал.

Поля полезной нагрузки

repository object

Репозиторий, к которому относится запуск проверки.

repository.id string

repository.name string

repository.owner object

Владелец репозитория.

repository.owner.slug string

Уникальное имя владельца, пригодное для использования в URL.

repository.owner.id string

Уникальный идентификатор пространства имён владельца.

repository.owner.type string

team или user. Только для вывода; не задаётся, если неизвестно. Одно из: team, user.

checkSuite object

Набор проверок (suite), к которому относится данный запуск проверки.

checkSuite.id string

Уникальный идентификатор набора, назначенный сервером.

checkSuite.repository object

Репозиторий, которому принадлежит набор.

checkSuite.repository.id string

checkSuite.repository.name string

checkSuite.repository.owner object

Владелец репозитория.

checkSuite.repository.owner.slug string

Уникальное имя владельца, пригодное для использования в URL.

checkSuite.repository.owner.id string

Уникальный идентификатор пространства имён владельца.

checkSuite.repository.owner.type string

team или user. Только для вывода; не устанавливается, если неизвестно. Одна из: team, user.

checkSuite.sha string

SHA головного коммита, к которому прикреплён набор (строчные шестнадцатеричные символы).

checkSuite.key строка

Заданный приложением ключ идемпотентности для набора.

checkSuite.name string

Отображаемое пользователю название набора.

checkSuite.detailsUrl string

Ссылка на подробную информацию о suite в целом, если задана.

checkSuite.createdAt string

Временная метка в формате RFC 3339.

checkSuite.updatedAt string

Временная метка в формате RFC 3339.

checkSuite.externalId строка

Неизменяемый идентификатор этой попытки набора, назначенный провайдером.

checkSuite.actor object

Principal, создавший набор.

checkSuite.actor.user object

checkSuite.actor.user.id string

checkSuite.actor.user.email string Обязательно

checkSuite.actor.user.displayName string

Понятное человеку отображаемое имя: имя и фамилия аккаунта, каждое с обрезанными пробелами, объединённые пробелом — ровно то имя, которое отображает интерфейс продукта. Опускается, если у аккаунта нет имени; никогда не формируется из адреса электронной почты, идентификатора или любого другого поля. Также может отсутствовать в полезных нагрузках вебхука, для которых не удалось определить актёра.

checkSuite.actor.user.handle string

Занятый пользователем handle профиля (идентификатор, стоящий за cursor.com /@handle), без префикса @. Присутствует, только пока профиль пользователя виден публично; не указывается для пользователей без занятого handle и для непубличных профилей.

checkSuite.actor.app object

checkSuite.actor.app.id string

checkSuite.actor.app.displayName string

Зарегистрированное отображаемое имя приложения; если поле присутствует, оно никогда не бывает пустым. Пропускается в полезных нагрузках, для которых не удалось определить приложение, а также у родного фасадного актора Cursor.

checkSuite.actor.serviceAccount object

checkSuite.actor.serviceAccount.id string

checkRun object

Повторно запрошенный запуск проверки (status: rerequested): отметка времени сохраняется в check_run.rerequested_at, а инициатор запроса — в check_run.rerequested_by.

checkRun.id string

Уникальный идентификатор прогона проверки, присвоенный сервером.

checkRun.repository object

Репозиторий, которому принадлежит запуск проверки.

checkRun.repository.id string

checkRun.repository.name string

checkRun.repository.owner object

Владелец репозитория.

checkRun.repository.owner.slug строка

Уникальное имя владельца, пригодное для использования в URL.

checkRun.repository.owner.id string

Уникальный идентификатор пространства имён владельца.

checkRun.repository.owner.type string

team или user. Только для вывода; не задаётся, если неизвестно. Одно из: team, user.

checkRun.checkSuite object

Suite, к которому относится данный check run.

checkRun.checkSuite.id string

checkRun.sha string

SHA итогового (head) коммита, к которому прикреплён запуск проверки (строчные шестнадцатеричные символы).

checkRun.key string

Заданный приложением ключ идемпотентности для проверки (check run).

checkRun.name string

Отображаемое пользователю название check-run.

checkRun.status string

Состояние жизненного цикла. rerequested — это завершённый run, повторный запуск которого был запрошен, но владеющее приложение на него ещё не ответило: для читателей он считается ожидающим (отображайте его как queued), при этом conclusion и тайминги по-прежнему описывают вытесненную попытку. Задаётся только Origin при повторном запросе (RerequestCheckRun); приложения не могут его публиковать. Одно из: queued, in_progress, completed, rerequested.

checkRun.conclusion string

Присутствует только если status равен completed или rerequested. Для повторно запрошенного запуска это вердикт вытесненной попытки: рассматривайте запуск как ожидающий и читайте conclusion только когда status == completed. Одно из: success, failure, neutral, cancelled, skipped, timed_out, action_required, stale.

checkRun.detailsUrl string

Ссылка на подробные сведения об этом конкретном запуске проверки, если указано.

checkRun.externalUpdatedAt string

Время последнего обновления во внешней системе, используемое для упорядочивания. Метка времени в формате RFC 3339.

checkRun.startedAt string

Время начала запуска проверки, если оно указано. Метка времени в формате RFC 3339.

checkRun.completedAt string

Время завершения выполнения проверки, если указано. Метка времени в формате RFC 3339.

checkRun.createdAt string

Временная метка в формате RFC 3339.

checkRun.updatedAt string

Временная метка в формате RFC 3339.

checkRun.externalId string

Неизменяемый идентификатор, присвоенный провайдером для этой попытки проверки (см. CheckRunInput.external_id: рекомендуется по одному на выполнение).

checkRun.actor object

Субъект, создавший запуск проверки.

checkRun.actor.user object

checkRun.actor.user.id string

checkRun.actor.user.email string Обязательное

checkRun.actor.user.displayName string

Понятное человеку отображаемое имя: имя и фамилия аккаунта, каждое с обрезанными пробелами, соединённые одним пробелом — ровно то имя, которое отображает интерфейс продукта. Отсутствует, если у аккаунта нет имени; никогда не формируется из адреса электронной почты, идентификатора или какого-либо другого поля. Также может отсутствовать в полезных нагрузках вебхука, актор в которых не удалось определить.

checkRun.actor.user.handle string

Заявленный пользователем идентификатор профиля (имя за cursor.com /@handle), без префикса @. Появляется только пока профиль пользователя общедоступен; не указывается для пользователей без заявленного идентификатора и для непубличных профилей.

checkRun.actor.app object

checkRun.actor.app.id string

checkRun.actor.app.displayName string

Зарегистрированное отображаемое имя приложения; если присутствует, оно никогда не бывает пустым. Пропускается в полезных нагрузках, для которых не удалось определить приложение, а также у первого фасадного актора Cursor.

checkRun.actor.serviceAccount object

checkRun.actor.serviceAccount.id string

checkRun.output object

Читаемые человеком результаты этого запуска проверки, если заданы.

checkRun.output.title string

Краткий заголовок для вывода. Максимальная длина: 255 символов.

checkRun.output.summary string

Сводка результатов. Может содержать Markdown. Максимальный размер в UTF-8: 65535 байт.

checkRun.output.text string

Подробные результаты. Могут содержать Markdown. Максимальный размер в UTF-8: 65535 байт.

checkRun.deadlineAt string

Необязательный крайний срок. Если опущен или не задан, означает отсутствие срока действия. Метка времени в формате RFC 3339.

checkRun.isRerequestable boolean

Указало ли приложение, передающее отчёт, что этот запуск можно запросить повторно (CheckRunInput.is_rerequestable).

checkRun.rerequestedAt string

Задаётся, пока повторный запрос не обработан; сбрасывается, когда provider публикует данные снова. Если значение не задано, ожидающих повторных запросов нет. Пока значение задано, status равен rerequested, а run остаётся в состоянии CI коммита как ожидающий (conclusion и временные метки содержат вытесненный результат); владеющее приложение отвечает, публикуя run, к которому оно обязалось, объявив is_rerequestable, — новый run с тем же key либо обновление этого run (что сбрасывает данное поле), — после чего run можно запросить повторно. Метка времени в формате RFC 3339.

checkRun.rerequestedBy object

Субъект, который повторно запросил запуск. Присутствует только если установлено rerequested_at; сбрасывается вместе с ним, когда отвечающее приложение отвечает.

checkRun.rerequestedBy.user object

checkRun.rerequestedBy.user.id string

checkRun.rerequestedBy.user.email string Обязательное

checkRun.rerequestedBy.user.displayName string

Понятное человеку отображаемое имя: имя и фамилия аккаунта, каждое с обрезанными пробелами, соединённые пробелом — ровно то имя, которое отображает интерфейс продукта. Опускается, если у аккаунта нет имени; никогда не формируется из адреса электронной почты, идентификатора или любого другого поля. Также может отсутствовать в полезных нагрузках вебхука, для которых не удалось определить актёра.

checkRun.rerequestedBy.user.handle string

Заявленный пользователем идентификатор профиля (личность за cursor.com /@handle), без символа @. Отображается только пока профиль пользователя публично видим; отсутствует для пользователей без заявленного идентификатора и для непубличных профилей.

checkRun.rerequestedBy.app object

checkRun.rerequestedBy.app.id string

checkRun.rerequestedBy.app.displayName string

Зарегистрированное отображаемое имя приложения; если поле присутствует, оно никогда не бывает пустым. Пропускается в полезных нагрузках, для которых не удалось определить приложение, а также у первого фасадного актора Cursor.

checkRun.rerequestedBy.serviceAccount object

checkRun.rerequestedBy.serviceAccount.id string

Пример event.payload:

{  "repository": {    "id": "repo_01k2ja2000e0080000000000q4",    "name": "rocket",    "owner": {      "slug": "acme",      "id": "ns_01k2ja2000e0080000000000p3",      "type": "team"    }  },  "checkSuite": {    "id": "crg_01k2ja2000e0080000000000h8",    "repository": {      "id": "repo_01k2ja2000e0080000000000q4",      "name": "rocket",      "owner": {        "slug": "acme",        "id": "ns_01k2ja2000e0080000000000p3",        "type": "team"      }    },    "sha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4",    "key": "ci-8842",    "name": "CI",    "detailsUrl": "https://ci.acme.dev/runs/8842",    "createdAt": "2026-08-01T09:30:00Z",    "updatedAt": "2026-08-02T15:10:00Z",    "externalId": "build-8842",    "actor": {      "user": {        "id": "user_01k2ja2000e0080000000000c3",        "email": "[email protected]"      }    }  },  "checkRun": {    "id": "cr_01k2ja2000e0080000000000g7",    "repository": {      "id": "repo_01k2ja2000e0080000000000q4",      "name": "rocket",      "owner": {        "slug": "acme",        "id": "ns_01k2ja2000e0080000000000p3",        "type": "team"      }    },    "checkSuite": {      "id": "crg_01k2ja2000e0080000000000h8"    },    "sha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4",    "key": "ci-8842-unit-tests",    "name": "unit-tests",    "status": "rerequested",    "conclusion": "failure",    "detailsUrl": "https://ci.acme.dev/runs/8842",    "externalUpdatedAt": "2026-08-02T14:44:30Z",    "startedAt": "2026-08-02T14:40:00Z",    "completedAt": "2026-08-02T14:44:30Z",    "createdAt": "2026-08-01T09:30:00Z",    "updatedAt": "2026-08-02T15:10:00Z",    "externalId": "run-8842",    "actor": {      "user": {        "id": "user_01k2ja2000e0080000000000c3",        "email": "[email protected]"      }    },    "output": {      "title": "Unit tests",      "summary": "1 of 129 tests failed.",      "text": "FAIL telemetry.spec.ts > flushes queued events on shutdown"    },    "isRerequestable": true,    "rerequestedAt": "2026-08-02T15:10:00Z",    "rerequestedBy": {      "user": {        "id": "user_01k2ja2000e0080000000000c3",        "email": "[email protected]"      }    }  }}

Установка создана

СОБЫТИЕinstallation.created

Поля payload

installation object

Снимок установки на момент события.

installation.id string

installation.appId string

Идентификатор установленного приложения; то же значение, что и app.id в payload.

installation.target object

Владелец репозитория.

installation.target.slug string

Уникальное имя владельца, пригодное для использования в URL.

installation.target.id string

Уникальный идентификатор пространства имён владельца.

installation.target.type string

team или user. Доступно только для вывода; не задано, если значение неизвестно. Одно из: team, user.

installation.repoSelectionMode string

Одно из значений: all, selected.

installation.repositories array

Пусто, если repository_selection имеет значение "all". Ограничено 5000 элементами; фактическое общее количество см. в repositories_count.

installation.repositories[].id string

installation.repositories[].name string

installation.repositories[].owner object

Владелец репозитория.

installation.repositories[].owner.slug string

Уникальное имя владельца, пригодное для использования в URL.

installation.repositories[].owner.id string

Уникальный идентификатор пространства имён владельца.

installation.repositories[].owner.type строка

team или user. Доступно только для вывода; не задано, если значение неизвестно. Одно из: team, user.

installation.scopes array

installation.repositoriesCount integer

Фактическое общее количество; 0, если repository_selection имеет значение "all".

installation.createdAt string

Временная метка в формате RFC 3339.

installation.updatedAt string

Временная метка в формате RFC 3339.

installation.deletedAt string

Временная метка в формате RFC 3339.

installation.suspendedAt string

Задаётся, пока установка приостановлена; сбрасывается, когда она активна. Метка времени в формате RFC 3339.

installation.installedBy object

Пользователь, изначально установивший приложение.

installation.installedBy.id string

installation.installedBy.email string Обязательное

installation.installedBy.displayName string

Понятное человеку отображаемое имя: имя и фамилия аккаунта, каждое без лишних пробелов, соединённые пробелом — ровно то имя, которое показывает интерфейс продукта. Опускается, если у аккаунта нет имени; никогда не формируется из email, идентификатора или любого другого поля. Также может отсутствовать в payload вебхука, если актора не удалось определить.

installation.installedBy.handle string

Занятый пользователем handle профиля (идентификатор за cursor.com /@handle), без префикса @. Присутствует, только пока профиль пользователя публично виден; не передаётся для пользователей без занятого handle и для непубличных профилей.

app object

Приложение, к которому относится установка.

app.id string

app.displayName string

Зарегистрированное отображаемое имя приложения; если поле присутствует, оно никогда не бывает пустым. Опускается, если при постановке в очередь не удалось разрешить приложение.

Пример event.payload:

{  "installation": {    "id": "inst_01k2ja2000e0080000000000b2",    "appId": "app_01k2ja2000e0080000000000a1",    "target": {      "slug": "acme",      "id": "ns_01k2ja2000e0080000000000p3",      "type": "team"    },    "repoSelectionMode": "selected",    "repositories": [      {        "id": "repo_01k2ja2000e0080000000000q4",        "name": "rocket",        "owner": {          "slug": "acme",          "id": "ns_01k2ja2000e0080000000000p3",          "type": "team"        }      }    ],    "scopes": [      "repository:contents:read",      "repository:pull_requests:read"    ],    "repositoriesCount": 1,    "createdAt": "2026-08-01T09:30:00Z",    "updatedAt": "2026-08-01T09:30:00Z",    "installedBy": {      "id": "user_01k2ja2000e0080000000000c3",      "email": "[email protected]"    }  },  "app": {    "id": "app_01k2ja2000e0080000000000a1",    "displayName": "CI Status Bot"  }}

Установка обновлена

СОБЫТИЕinstallation.updated

Поля payload

installation object

Снимок установки на момент события.

installation.id string

installation.appId string

Идентификатор установленного приложения; то же значение, что и app.id в payload.

installation.target object

Владелец репозитория.

installation.target.slug string

Уникальное имя владельца, пригодное для использования в URL.

installation.target.id string

Уникальный идентификатор пространства имён владельца.

installation.target.type string

team или user. Доступно только для вывода; не задано, если значение неизвестно. Одно из: team, user.

installation.repoSelectionMode string

Одно из значений: all, selected.

installation.repositories array

Пусто, если repository_selection имеет значение "all". Ограничено 5000 элементами; фактическое общее количество см. в repositories_count.

installation.repositories[].id string

installation.repositories[].name string

installation.repositories[].owner object

Владелец репозитория.

installation.repositories[].owner.slug string

Уникальное имя владельца, пригодное для использования в URL.

installation.repositories[].owner.id string

Уникальный идентификатор пространства имён владельца.

installation.repositories[].owner.type строка

team или user. Доступно только для вывода; не задано, если значение неизвестно. Одно из: team, user.

installation.scopes массив

installation.repositoriesCount integer

Фактическое общее количество; 0, если repository_selection имеет значение "all".

installation.createdAt string

Временная метка в формате RFC 3339.

installation.updatedAt string

Временная метка в формате RFC 3339.

installation.deletedAt string

Временная метка в формате RFC 3339.

installation.suspendedAt string

Задаётся, пока установка приостановлена; сбрасывается, когда она активна. Метка времени в формате RFC 3339.

installation.installedBy object

Пользователь, изначально установивший приложение.

installation.installedBy.id string

installation.installedBy.email string Обязательное

installation.installedBy.displayName string

Понятное человеку отображаемое имя: имя и фамилия аккаунта, каждое без лишних пробелов, соединённые пробелом — ровно то имя, которое показывает интерфейс продукта. Опускается, если у аккаунта нет имени; никогда не формируется из email, идентификатора или любого другого поля. Также может отсутствовать в payload вебхука, если актора не удалось определить.

installation.installedBy.handle string

Занятый пользователем handle профиля (идентификатор за cursor.com /@handle), без префикса @. Присутствует, только пока профиль пользователя публично виден; не передаётся для пользователей без занятого handle и для непубличных профилей.

app object

Приложение, к которому относится установка.

app.id string

app.displayName string

Зарегистрированное отображаемое имя приложения; если поле присутствует, оно никогда не бывает пустым. Опускается, если при постановке в очередь не удалось разрешить приложение.

Пример event.payload:

{  "installation": {    "id": "inst_01k2ja2000e0080000000000b2",    "appId": "app_01k2ja2000e0080000000000a1",    "target": {      "slug": "acme",      "id": "ns_01k2ja2000e0080000000000p3",      "type": "team"    },    "repoSelectionMode": "selected",    "repositories": [      {        "id": "repo_01k2ja2000e0080000000000q4",        "name": "rocket",        "owner": {          "slug": "acme",          "id": "ns_01k2ja2000e0080000000000p3",          "type": "team"        }      }    ],    "scopes": [      "repository:contents:read",      "repository:pull_requests:read"    ],    "repositoriesCount": 1,    "createdAt": "2026-08-01T09:30:00Z",    "updatedAt": "2026-08-02T14:45:00Z",    "installedBy": {      "id": "user_01k2ja2000e0080000000000c3",      "email": "[email protected]"    }  },  "app": {    "id": "app_01k2ja2000e0080000000000a1",    "displayName": "CI Status Bot"  }}

Установка приостановлена

СОБЫТИЕinstallation.suspended

Поля payload

installation object

Снимок установки на момент события.

installation.id string

installation.appId string

Идентификатор установленного приложения; то же значение, что и app.id в payload.

installation.target object

Владелец репозитория.

installation.target.slug string

Уникальное имя владельца, пригодное для использования в URL.

installation.target.id string

Уникальный идентификатор пространства имён владельца.

installation.target.type string

team или user. Доступно только для вывода; не задано, если значение неизвестно. Одно из: team, user.

installation.repoSelectionMode string

Одно из значений: all, selected.

installation.repositories array

Пусто, если repository_selection имеет значение "all". Ограничено 5000 элементами; фактическое общее количество см. в repositories_count.

installation.repositories[].id string

installation.repositories[].name string

installation.repositories[].owner object

Владелец репозитория.

installation.repositories[].owner.slug string

Уникальное имя владельца, пригодное для использования в URL.

installation.repositories[].owner.id string

Уникальный идентификатор пространства имён владельца.

installation.repositories[].owner.type строка

team или user. Доступно только для вывода; не задано, если значение неизвестно. Одно из: team, user.

installation.scopes массив

installation.repositoriesCount integer

Фактическое общее количество; 0, если repository_selection имеет значение "all".

installation.createdAt string

Временная метка в формате RFC 3339.

installation.updatedAt string

Временная метка в формате RFC 3339.

installation.deletedAt string

Временная метка в формате RFC 3339.

installation.suspendedAt string

Задаётся, пока установка приостановлена; сбрасывается, когда она активна. Метка времени в формате RFC 3339.

installation.installedBy object

Пользователь, который изначально установил приложение.

installation.installedBy.id string

installation.installedBy.email string Обязательное

installation.installedBy.displayName string

Понятное человеку отображаемое имя: имя и фамилия аккаунта, каждое без лишних пробелов, соединённые пробелом — ровно то имя, которое показывает интерфейс продукта. Опускается, если у аккаунта нет имени; никогда не формируется из email, идентификатора или любого другого поля. Также может отсутствовать в payload вебхука, если актора не удалось определить.

installation.installedBy.handle string

Занятый пользователем handle профиля (идентификатор за cursor.com /@handle), без префикса @. Присутствует, только пока профиль пользователя публично виден; не передаётся для пользователей без занятого handle и для непубличных профилей.

app object

Приложение, к которому относится установка.

app.id string

app.displayName string

Зарегистрированное отображаемое имя приложения; если поле присутствует, оно никогда не бывает пустым. Опускается, если при постановке в очередь не удалось разрешить приложение.

Пример event.payload:

{  "installation": {    "id": "inst_01k2ja2000e0080000000000b2",    "appId": "app_01k2ja2000e0080000000000a1",    "target": {      "slug": "acme",      "id": "ns_01k2ja2000e0080000000000p3",      "type": "team"    },    "repoSelectionMode": "selected",    "repositories": [      {        "id": "repo_01k2ja2000e0080000000000q4",        "name": "rocket",        "owner": {          "slug": "acme",          "id": "ns_01k2ja2000e0080000000000p3",          "type": "team"        }      }    ],    "scopes": [      "repository:contents:read",      "repository:pull_requests:read"    ],    "repositoriesCount": 1,    "createdAt": "2026-08-01T09:30:00Z",    "installedBy": {      "id": "user_01k2ja2000e0080000000000c3",      "email": "[email protected]"    },    "suspendedAt": "2026-08-03T08:15:00Z"  },  "app": {    "id": "app_01k2ja2000e0080000000000a1",    "displayName": "CI Status Bot"  }}

Установка возобновлена

СОБЫТИЕinstallation.unsuspended

Поля payload

installation object

Снимок установки на момент события.

installation.id string

installation.appId string

Идентификатор установленного приложения; то же значение, что и app.id в payload.

installation.target object

Владелец репозитория.

installation.target.slug string

Уникальное имя владельца, пригодное для использования в URL.

installation.target.id string

Уникальный идентификатор пространства имён владельца.

installation.target.type string

team или user. Доступно только для вывода; не задано, если значение неизвестно. Одно из: team, user.

installation.repoSelectionMode string

Одно из значений: all, selected.

installation.repositories array

Пусто, если repository_selection имеет значение "all". Ограничено 5000 элементами; фактическое общее количество см. в repositories_count.

installation.repositories[].id string

installation.repositories[].name string

installation.repositories[].owner object

Владелец репозитория.

installation.repositories[].owner.slug string

Уникальное имя владельца, пригодное для использования в URL.

installation.repositories[].owner.id string

Уникальный идентификатор пространства имён владельца.

installation.repositories[].owner.type строка

team или user. Доступно только для вывода; не задано, если значение неизвестно. Одно из: team, user.

installation.scopes массив

installation.repositoriesCount integer

Фактическое общее количество; 0, если repository_selection имеет значение "all".

installation.createdAt string

Временная метка в формате RFC 3339.

installation.updatedAt string

Временная метка в формате RFC 3339.

installation.deletedAt string

Временная метка в формате RFC 3339.

installation.suspendedAt string

Задаётся, пока установка приостановлена; сбрасывается, когда она активна. Метка времени в формате RFC 3339.

installation.installedBy object

Пользователь, который изначально установил приложение.

installation.installedBy.id string

installation.installedBy.email string Обязательное

installation.installedBy.displayName string

Понятное человеку отображаемое имя: имя и фамилия аккаунта, каждое без лишних пробелов, соединённые пробелом — ровно то имя, которое показывает интерфейс продукта. Опускается, если у аккаунта нет имени; никогда не формируется из email, идентификатора или любого другого поля. Также может отсутствовать в payload вебхука, если актора не удалось определить.

installation.installedBy.handle string

Занятый пользователем handle профиля (идентификатор за cursor.com /@handle), без префикса @. Присутствует, только пока профиль пользователя публично виден; не передаётся для пользователей без занятого handle и для непубличных профилей.

app object

Приложение, к которому относится установка.

app.id string

app.displayName string

Зарегистрированное отображаемое имя приложения; если поле присутствует, оно никогда не бывает пустым. Опускается, если при постановке в очередь не удалось разрешить приложение.

Пример event.payload:

{  "installation": {    "id": "inst_01k2ja2000e0080000000000b2",    "appId": "app_01k2ja2000e0080000000000a1",    "target": {      "slug": "acme",      "id": "ns_01k2ja2000e0080000000000p3",      "type": "team"    },    "repoSelectionMode": "selected",    "repositories": [      {        "id": "repo_01k2ja2000e0080000000000q4",        "name": "rocket",        "owner": {          "slug": "acme",          "id": "ns_01k2ja2000e0080000000000p3",          "type": "team"        }      }    ],    "scopes": [      "repository:contents:read",      "repository:pull_requests:read"    ],    "repositoriesCount": 1,    "createdAt": "2026-08-01T09:30:00Z",    "installedBy": {      "id": "user_01k2ja2000e0080000000000c3",      "email": "[email protected]"    }  },  "app": {    "id": "app_01k2ja2000e0080000000000a1",    "displayName": "CI Status Bot"  }}

Установка удалена

СОБЫТИЕinstallation.deleted

Поля payload

installation object

Снимок установки на момент события.

installation.id string

installation.appId string

Идентификатор установленного приложения; то же значение, что и app.id в payload.

installation.target object

Владелец репозитория.

installation.target.slug string

Уникальное имя владельца, пригодное для использования в URL.

installation.target.id string

Уникальный идентификатор пространства имён владельца.

installation.target.type string

team или user. Доступно только для вывода; не задано, если значение неизвестно. Одно из: team, user.

installation.repoSelectionMode string

Одно из значений: all, selected.

installation.repositories array

Пусто, если repository_selection равно "all". Ограничено 5000 элементами; фактическое общее количество см. в repositories_count.

installation.repositories[].id string

installation.repositories[].name string

installation.repositories[].owner object

Владелец репозитория.

installation.repositories[].owner.slug string

Уникальное имя владельца, пригодное для использования в URL.

installation.repositories[].owner.id string

Уникальный идентификатор пространства имён владельца.

installation.repositories[].owner.type строка

team или user. Доступно только для вывода; не задано, если значение неизвестно. Одно из: team, user.

installation.scopes array

installation.repositoriesCount integer

Фактическое общее количество; 0, если repository_selection имеет значение "all".

installation.createdAt string

Временная метка в формате RFC 3339.

installation.updatedAt string

Временная метка в формате RFC 3339.

installation.deletedAt string

Временная метка в формате RFC 3339.

installation.suspendedAt string

Задаётся, пока установка приостановлена; сбрасывается, когда она активна. Метка времени в формате RFC 3339.

installation.installedBy object

Пользователь, который изначально установил приложение.

installation.installedBy.id string

installation.installedBy.email string Обязательное

installation.installedBy.displayName string

Понятное человеку отображаемое имя: имя и фамилия аккаунта, каждое без лишних пробелов, соединённые пробелом — ровно то имя, которое показывает интерфейс продукта. Опускается, если у аккаунта нет имени; никогда не формируется из email, идентификатора или любого другого поля. Также может отсутствовать в payload вебхука, если актора не удалось определить.

installation.installedBy.handle string

Занятый пользователем handle профиля (идентификатор за cursor.com /@handle), без префикса @. Присутствует, только пока профиль пользователя публично виден; не передаётся для пользователей без занятого handle и для непубличных профилей.

app object

Приложение, к которому относится установка.

app.id string

app.displayName string

Зарегистрированное отображаемое имя приложения; если поле присутствует, оно никогда не бывает пустым. Опускается, если при постановке в очередь не удалось разрешить приложение.

Пример event.payload:

{  "installation": {    "id": "inst_01k2ja2000e0080000000000b2",    "appId": "app_01k2ja2000e0080000000000a1",    "target": {      "slug": "acme",      "id": "ns_01k2ja2000e0080000000000p3",      "type": "team"    },    "repoSelectionMode": "selected",    "repositories": [      {        "id": "repo_01k2ja2000e0080000000000q4",        "name": "rocket",        "owner": {          "slug": "acme",          "id": "ns_01k2ja2000e0080000000000p3",          "type": "team"        }      }    ],    "scopes": [      "repository:contents:read",      "repository:pull_requests:read"    ],    "repositoriesCount": 1,    "createdAt": "2026-08-01T09:30:00Z",    "installedBy": {      "id": "user_01k2ja2000e0080000000000c3",      "email": "[email protected]"    },    "deletedAt": "2026-08-03T08:15:00Z"  },  "app": {    "id": "app_01k2ja2000e0080000000000a1",    "displayName": "CI Status Bot"  }}