Sitelet https://cursor.com/ru/docs/api/origin#create-label
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, пустая строка и пустой массив присутствуют в теле. Считывайте само значение, а не трактуйте отсутствующий ключ как значение по умолчанию. Поля, описанные в документации как отсутствующие или опускаемые, являются необязательными в контракте и не включаются в тело, если не заданы.

Предварительная версия

Часть API публикуется в предварительной версии. Она описана в этом справочнике и в спецификации, но её структура может измениться до общего релиза. В спецификации OpenAPI такие элементы помечены как x-cursor-visibility: PREVIEW. Эта пометка может стоять на операции, параметре, схеме или отдельном поле, поэтому даже стабильная операция может возвращать поле из предварительной версии. Конечные точки в предварительной версии отмечены в этом справочнике значком Preview. Считайте такие поля необязательными и не закладывайте жёсткую зависимость от их структуры.

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

Доступ к 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 с токеном установки, чтобы узнать, какие репозитории доступны для этой установки. Конечные точки 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": "installer@example.com",    "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 с JWT приложения. Токены установки начинаются с oit_.

Authorization: Bearer oit_...

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

Срок действия токена истекает не позже чем через 15 минут после создания и никогда не позже, чем у JWT приложения, по которому он был запрошен, поэтому рекомендованный выше пятиминутный JWT даёт токен не более чем на пять минут. Считывайте expiresAt и выпускайте новый токен по его истечении, а не полагайтесь на фиксированную длительность: токены Origin живут меньше, чем токены установки GitHub App, и интеграция, повторно использующая токен по расписанию GitHub, перестанет работать после истечения срока действия токена. Подписывайте JWT с более поздним exp, если задаче нужны все 15 минут, — как это сделано в рецепте CloneKit для CI.

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

Токен установки не может предоставлять больше прав, чем одобренные для установки область доступа или доступ к репозиториям. Токен можно ограничить меньшим набором scopes или 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.

Для Git по HTTPS действует собственный лимит, отдельный от лимита REST, описанного в разделе Ограничения частоты запросов. Учитываемый ответ Git содержит те же заголовки X-RateLimit-Limit, X-RateLimit-Remaining и X-RateLimit-Used, но в X-RateLimit-Resource указано git, а не core. Запросы Git сверх лимита возвращают 429 с Retry-After и X-RateLimit-Reset. Регулируйте темп задачи по заголовкам, а не по предполагаемому числу; неучитываемые запросы заголовков ограничения частоты запросов не содержат.

В зеркальном репозитории токен установки позволяет клонировать, выполнять 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Читать разрешения, выданные непосредственно на владельца. Читать список центров сертификации SSH, которым доверяет владелец, и то, требует ли он сертификаты. Читать allowlist входящих IP-адресов пространства имён и его записи.
namespace:settings:writeВыполнять upsert и удаление разрешений на владельца. Добавлять и удалять центры сертификации SSH и задавать, требует ли владелец сертификаты. Добавлять, обновлять, удалять и заменять записи allowlist входящих IP-адресов и задавать, применяет ли пространство имён свой allowlist. Операции записи для центров сертификации и allowlist выполняются с учётными данными пользователя Cursor.
namespace:user_tokens:writeВыпускать пользовательские токены установки, действующие от имени участника пространства имён установки. Токен не может содержать эту область доступа. См. Действия от имени пользователей.

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

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

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

Управление установками тоже не входит в неё. Добавить репозитории установки приложения использует namespace:installations:write, которую приложение не может запросить при установке: ею обладает администратор пространства имён в учётных данных пользователя Cursor, и расширить установку могут учётные данные того же типа, что дали согласие на установку.

Управление приложениями не входит в неё по той же причине. создать приложение использует namespace:apps:create, List Namespace Apps и Get App — namespace:apps: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 повторно запускает синхронизацию зеркала, если первоначальная синхронизация завершилась ошибкой, а Detach Repo Mirror окончательно отключает зеркало, превращая его в нативный репозиторий.

Считайте 403 источником истины, а не определяйте по mirror.status, разрешена ли запись.

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

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

ПринципалЛимит по умолчанию
Токен доступа установки3 000 баллов в минуту
JWT приложения6 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.

Передавайте одинаковый pageSize во всех запросах последовательности, включая запросы продолжения. Большинство конечных точек списков применяют pageSize, переданный вместе с токеном страницы, к этой странице, а если параметр не указан, сохраняют предыдущий размер страницы; это отмечено в описании их параметра pageToken. Остальные по-разному обрабатывают то, что запоминает токен страницы, поэтому, если pageSize не меняется, размер страницы будет одинаковым для всех конечных точек.

Ошибки

Для ошибок используется тело в стиле 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 и запросы, использующие неверный метод для известного пути, возвращают это же тело вместо общей ошибки маршрутизатора. Сообщение указывает метод и путь и никогда не возвращает строку запроса.

Идентификаторы

Идентификаторы ресурсов — это непрозрачные строки с префиксом типа, например app_… для приложения и i_… для установки. Храните и сравнивайте их как цельные строки. Не разбирайте их, не пытайтесь извлечь смысл из составляющих их символов и не полагайтесь на порядок их сортировки.

Идентификатор не меняется на протяжении всего существования ресурса, тогда как имена и слаги могут меняться. При переименовании репозиторий сохраняет свой идентификатор, поэтому используйте в качестве ключа для кэшированных данных идентификатор, а не {ownerSlug}/{repoName}, и обращайтесь к репозиторию по идентификатору, как описано в разделе Пути репозитория.

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

В путях, ограниченных репозиторием, слаг владельца и имя репозитория указываются в формате {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 из этого варианта.

Запуски проверок

Apps сообщают результаты CI в виде наборов проверок и запусков проверки, привязанных к commit, через Post запуск проверки и Batch Upsert запусков проверки, а получают их обратно через конечные точки Checks. В этом разделе описаны общие для этих конечных точек понятия: какая попытка считается текущей, как Origin упорядочивает операции записи и сообщает о них, а также как ведут себя метка времени и сроки выполнения.

Попытки и текущая попытка

Каждая комбинация (actor, key, externalId, baseSha), сообщённая для коммита, — это одна попытка набора проверок, а каждая комбинация (suite, key, externalId) внутри неё — одна попытка запуска. Публикация без baseSha обращается к попытке, не привязанной к base-ветке, поэтому публикация того же externalId для другой base-ветки либо с указанием base-ветки и без него создаёт отдельные попытки. Повторное использование externalId с той же base-веткой обновляет эту попытку на месте; новый externalId начинает новую попытку, а предыдущая сохраняется в истории. Вытесненные попытки остаются доступны для чтения по id через Получить набор проверок и Получить запуск проверки.

Там, где API показывает текущие проверки коммита — в Списке наборов проверок для коммита, Списке запусков проверок для коммита, а также в состоянии CI pull request и обязательных проверках, — Origin сводит попытки в два шага:

  1. Текущей попыткой набора проверок для пары (actor, key) считается та, чьи текущие запуски, выбранные на втором шаге, имеют самое свежее значение externalUpdatedAt; набор без запусков ранжируется по своему createdAt. При равенстве сравнивается createdAt набора, затем его id, от новых к старым.
  2. Внутри этой попытки набора текущим запуском для key считается тот, у которого самое свежее externalUpdatedAt. При равенстве сравнивается createdAt, затем id, от новых к старым.

В списках для коммита попытки, сообщённые для разных значений baseSha, участвуют в общем отборе текущей попытки для своей пары (actor, key).

Список запусков проверок для набора применяет второй шаг к указанному вами набору. Запуск является текущим для своего коммита только тогда, когда его набор — текущая попытка набора проверок для этого коммита. Поскольку на первом шаге ранжируются целые попытки наборов, запуск, опубликованный в рамках вытесненной попытки набора, не попадает в проверки коммита, пока у другой попытки более свежее externalUpdatedAt; как только его метка времени становится самой свежей, его попытка набора становится текущей, и скрываются уже запуски другой попытки.

Отменённая попытка не вытесняет успешную. На каждом из двух шагов отменённая попытка ранжируется ниже других попыток с тем же key, если самая новая неотменённая попытка с этим key прошла успешно. Запуск считается успешным, если он имеет статус completed и результат success, neutral или skipped. Попытка набора проверок считается успешной, если все её текущие запуски прошли успешно, и отменённой, если все её текущие запуски имеют статус completed, хотя бы один из них — результат cancelled, а остальные прошли успешно. Когда запрашивается повторный прогон успешной попытки, отменённые попытки, у которых externalUpdatedAt не раньше времени запроса, снова ранжируются по своим меткам времени. Более новая отменённая попытка набора проверок всё же вытесняет более старую, если та не прошла полностью успешно.

Запуск, для которого запрошен повторный прогон, сохраняет своё место в качестве текущей попытки для своего key и отображается как ожидающий, пока не ответит владеющее им приложение: см. Rerequest Check Run.

Порядок записей

Origin упорядочивает публикации в один запуск — с одинаковыми externalId и key в наборе проверок — по checkRun.externalUpdatedAt с точностью до миллисекунды. Публикация применяется, только если её значение равно сохранённому у запуска externalUpdatedAt или больше него; пока есть незавершённый повторный запрос, порог поднимается до rerequestedAt. Равные значения применяются, поэтому побеждает более поздняя публикация — за двумя исключениями, которые тоже считаются устаревшими: публикация со статусом queued, in_progress или failing не может вновь открыть completed-запуск с той же меткой времени, а публикация с меткой времени, в точности равной сохранённой, игнорируется, пока задано rerequestedAt. Более новое значение применяется, в том числе повторно открывая completed-запуск, — за одним исключением, которое считается устаревшим независимо от метки времени: публикация completed с результатом cancelled не может заменить completed-запуск с результатом success, neutral или skipped.

Устаревшая публикация всё равно выполняется успешно. В ответ приходит HTTP 200 с сохранённым набором проверок и запуском, а не с опубликованными значениями, и updatedAt запуска не меняется. Каждый опубликованный запуск возвращается парой: checkRun — сохранённый запуск после вызова, и outcome — что запись с ним сделала. Post запуск проверки возвращает эту пару на верхнем уровне ответа, рядом с checkSuite. Batch Upsert запуск проверки возвращает по одной паре на каждый опубликованный запуск в results[], в порядке запроса, так что элемент batch несёт тот же результат по запуску, который одиночный вызов размещает inline. Читайте outcome или каждый results[].outcome, чтобы узнать, что сделала запись:

outcomeЗначение
createdДля (externalId, key) в наборе проверок не было запуска; он был создан.
updatedСуществующий запуск заменён опубликованными значениями.
unchangedОпубликованные значения, включая externalUpdatedAt, совпадают с сохранённым запуском; ничего не записано.
ignored_staleПубликация проигнорирована как устаревшая; checkRun содержит сохранённый запуск, а не опубликованные значения.

updatedAt не сдвигается при публикации unchanged или ignored_stale, поэтому по нему нельзя отличить одно от другого; это может только outcome. Нераспознанное значение трактуйте как «сохранённый запуск есть в ответе; была ли выполнена запись — неизвестно». В batch Origin применяет это правило к каждому запуску отдельно: устаревший запуск не приводит к сбою всего batch, а results[] содержит сохранённый запуск в соответствующей позиции с outcome ignored_stale.

В Batch Upsert запуск проверки поле верхнего уровня checkRuns[] устарело в пользу results[]. Оно по-прежнему заполняется теми же сохранёнными запусками в том же порядке, но не содержит outcome; используйте results[]. Это касается только batch: в Post запуск проверки полями верхнего уровня для чтения являются checkRun и outcome.

Метки времени и дедлайны

Публикация, у которой externalUpdatedAt, startedAt или completedAt опережает текущее время более чем на 60 секунд, возвращает InvalidArgument (HTTP 400). completedAt не должен предшествовать startedAt, если оба указаны в одной публикации. deadlineAt не должен опережать текущее время более чем на 24 часа.

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

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

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

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

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

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

Полные схемы компонентов доступны в спецификации OpenAPI. В документе в качестве сервера указан https://api.cursor.com, определена схема безопасности HTTP Bearer bearerAuth, а для каждой операции перечислены коды ответов, которые она может вернуть, а также пример запроса и ответа. Кроме того, каждая операция содержит расширение x-origin-scopes: в scopes указана область доступа, необходимая для операции, а в tokenTypes — типы учётных данных, которые она принимает. Каждая схема полезной нагрузки вебхука содержит расширение x-origin-webhook-events со списком событий, при которых она доставляется, а элементы в статусе предварительной версии помечены x-cursor-visibility: PREVIEW. Параметры пути имеют те же имена, что используются в 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 массив

Подписки приложения на события вебхуков. События installation.* доставляются всегда и в этом списке не указываются.

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

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

POST/v1/origin/app/installations/{installationId}/user_access_tokens
Installation scopenamespace:user_tokens:writeAuthApp JWT

Создаёт пользовательский токен установки, который действует от имени одного участника пространства имён установки.

Установка должна принадлежать аутентифицированному приложению и иметь принятую область доступа namespace:user_tokens:write. Укажите пользователя ровно одним из параметров: userId или userEmail. Для неизвестного, неоднозначного или неразрешённого пользователя возвращается PermissionDenied (HTTP 403) без указания, какое именно условие не выполнено.

Доступ токена ограничен правами доступа, которые есть одновременно у установки и у пользователя. Если заданы и scopes, и repositoryIds, каждая область доступа должна быть разрешена для обоих субъектов в каждом указанном репозитории, иначе запрос завершится ошибкой PermissionDenied (HTTP 403). Полное описание процесса см. в разделе Действия от имени пользователей.

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

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

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

Тело запроса

userId строка

Идентификатор пользователя вида user_… в том виде, в каком он возвращается в полезной нагрузке actor. Задайте ровно один из параметров: userId или userEmail.

userEmail строка

Email аккаунта пользователя. Должен соответствовать ровно одному разрешённому участнику пространства имён.

scopes массив

Строки областей доступа, ограничивающие токен. Значения должны быть уникальными и входить в принятые области доступа установки. Запрос namespace:user_tokens:write возвращает InvalidArgument (HTTP 400): эта область разрешает выпуск токенов и не может быть делегирована токену. Если значение пустое или не указано, ограничения по областям доступа не применяются.

repositoryIds массив

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

Поля ответа

token строка

Краткосрочный пользовательский токен установки. Храните его как секрет и не записывайте в логи.

expiresAt строка

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

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

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

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

GET/v1/origin/installation/repos
AuthInstallation token

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

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

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

Результаты включают зеркалированные репозитории, которые доступны установке приложения только для чтения: см. Зеркалированные репозитории.

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

pageSize integer

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

pageToken строка

Непрозрачный курсор из поля next_page_token предыдущего ответа. Пустой для первой страницы. При запросе последующих страниц необходимо использовать тот же фильтр. Параметр pageSize в последующем запросе применяется к этой странице; не указывайте его, чтобы сохранить прежний размер страницы.

filter строка

Необязательный фильтр по подстроке без учёта регистра, применяемый к именам репозиториев и пространствам имён владельцев. Значение вида owner/repo с одним слешем сопоставляет каждую половину с соответствующим полем. Пробелы в начале и конце игнорируются; пустое значение не применяет фильтр.

Поля ответа

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.

repositories[].visibility строка

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

repositories[].allowMergeCommit boolean

Можно ли вливать пул-реквесты коммитами слияния.

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-type — ping, а полезная нагрузка содержит имя приложения. 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}
Scopenamespace:apps: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-события, настроенные для приложения. События installation.* доставляются всегда и здесь не отображаются.

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 путём передачи пустой строки отключает отправку исходящих веб-хуков и отменяет ожидающие отправки приложения; повторная установка URL не возобновляет отменённые отправки.

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

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

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

Тело запроса

displayName строка

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

webhookUrl строка

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

events object

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

events.events array

Полный новый набор подписок приложения на события webhook. Пустой список сбрасывает подписки на репозитории; события installation.* доставляются всегда, и указывать их здесь нельзя.

description строка

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

websiteUrl строка

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

installationRedirectUris object

Полная замена списка разрешённых callback-адресов установки OAuth. Не указывайте, чтобы оставить его без изменений.

installationRedirectUris.installationRedirectUris массив

Полный новый список разрешённых элементов. Пустой список очищает его.

defaultScopes object

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

defaultScopes.scopes массив

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

Поля ответа

id строка

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

displayName строка

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

webhookUrl строка

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

events array

Подписки на события вебхуков, настроенные для приложения. События installation.* доставляются всегда и здесь не отображаются.

createdAt строка

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

updatedAt строка

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

installationRedirectUris массив

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

namespaceSlug строка

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

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).

На момент выполнения запроса владелец пространства имён должен иметь право записи в Origin — такое же требование предъявляется в методе Create Repo. Владелец-пользователь должен быть подписан на тариф Pro, Pro Student, Pro+, Ultra или Start. У владельца-команды должен быть активный платный командный тариф; он не должен использовать режим Privacy Mode (Legacy), а администратор команды не должен отключать Origin. Если владелец не соответствует требованиям, возвращается ошибка FailedPrecondition (HTTP 400). Origin проверяет, соответствует ли требованиям владелец пространства имён, а не вызывающий пользователь.

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

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

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

Тело запроса

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

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

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

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

webhookUrl строка

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

events array

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

description строка

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

websiteUrl строка

Сайт издателя, абсолютный URL-адрес HTTPS.

installationRedirectUris массив

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

defaultScopes массив

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

Поля ответа

id строка

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

displayName строка

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

webhookUrl строка

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

events array

Подписки на события вебхуков, настроенные для приложения. События installation.* доставляются всегда и здесь не отображаются.

createdAt строка

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

updatedAt строка

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

installationRedirectUris массив

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

namespaceSlug строка

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

description string

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

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

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

POST/v1/origin/namespaces/{namespaceSlug}/installations/{installationId}/repos
Scopenamespace:installations:writeAuthUser access token

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

Каждый указанный репозиторий должен принадлежать целевому пространству имён, иначе запрос возвращает FailedPrecondition (HTTP 400) и ничего не предоставляется. Та же ошибка возвращается для установки, которая уже охватывает все репозитории пространства имён (repoSelectionMode равен all), для приостановленной установки и для установки, созданной до внедрения областей доступа для отдельных установок. Установка, которая не существует или принадлежит другому пространству имён, возвращает 404; в сообщении указывается страница согласия, которую нужно открыть, если приложение никогда не устанавливалось в этом пространстве имён, поскольку эта конечная точка не может выполнить первую установку.

Вызывающая сторона должна использовать учётные данные пользователя Cursor с правами управления установкой в этом пространстве имён. Токены приложения, токены установки и сервисные аккаунты не позволяют изменять репозитории установки.

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

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

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

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

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

Тело запроса

repoIds массив Обязательный

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

Поля ответа

id строка

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

appId строка

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

цель object

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

target.slug строка

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

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 строка

Timestamp удаления установки в формате RFC 3339. Передаётся только в snapshot вебхука installation.deleted; удалённая установка больше не разрешается через API, поэтому эта конечная точка никогда его не возвращает.
curl --request POST \  --url 'https://api.cursor.com/v1/origin/namespaces/NAMESPACE_SLUG/installations/INSTALLATION_ID/repos' \  --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN' \  --header 'Content-Type: application/json' \  --data '{  "repoIds": [    "repo_01k2ja2000e0080000000000q4",    "repo_01k2ja2000e0080000000000q5"  ]}'

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

{  "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",    "repository:metadata:read"  ]}

Репозитории

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

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

Список пространств имён

GET/v1/origin/namespaces
AuthUser access token

Возвращает отсортированный по слагу список пространств имён, в которых вы можете просматривать список репозиториев.

Кандидаты — пространства имён ваших команд, ваше личное пространство имён и пространства имён с репозиториями, к которым вам предоставлен доступ. Возвращаются только те, в которых у вас есть право namespace:repositories:read, поэтому любой результат можно использовать как ownerSlug в List Repos.

Вызов должен выполняться с учётными данными пользователя Cursor; отдельная область доступа для него не требуется. Для токенов приложений, токенов установки и сервисных аккаунтов возвращается PermissionDenied (HTTP 403).

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

pageSize integer

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

pageToken string

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

Поля ответа

namespaces array

Отсортированные по слагу пространства имён, в которых вы можете просматривать список репозиториев.

namespaces[].namespace object

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

namespaces[].namespace.slug string

Слаг владельца для URL. Используйте его как ownerSlug в List Repos.

namespaces[].namespace.id string

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

namespaces[].namespace.type string

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

namespaces[].viewerCanCreateRepositories boolean

Пройдёт ли ваш вызов Create Repo в этом пространстве имён авторизацию, а также проверки тарифа и настроек владельца.

nextPageToken string

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

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

{  "namespaces": [    {      "namespace": {        "slug": "acme",        "id": "ns_01k2ja2000e0080000000000p3",        "type": "team"      },      "viewerCanCreateRepositories": true    },    {      "namespace": {        "slug": "jane",        "id": "ns_01k2ja2000e0080000000000p4",        "type": "user"      },      "viewerCanCreateRepositories": false    }  ]}

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

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

Перечисляет репозитории, принадлежащие сущности-владельцу.

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

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

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

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

pageSize integer

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

pageToken строка

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

filter строка

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

Поля ответа

repositories массив

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

repositories[].id строка

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

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 последней отправки, указанная в полном ответе репозитория.

repositories[].cloneUrl строка

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

repositories[].mirror object

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

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

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

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

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

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

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

repositories[].visibility строка

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

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

Можно ли вливать запросы на слияние в виде коммитов слияния.

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 строка

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

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.

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 вместе с идентификатором владельца для определения владельца репозитория.

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.source строка

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

mirror.sourceId string

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

mirror.status строка

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

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.

visibility строка

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

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

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

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

Можно ли сливать pull request методом squash.

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 integer

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

pageToken строка

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

Поля ответа

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

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

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

Возвращает право доступа пользователя к репозиторию с учётом его прямых и унаследованных грантов. Результат определяется грантами пользователя и не зависит от учётных данных, с которыми выполняется запрос. Поддерживаются только репозитории, для которых источником истины является Origin. Во всех следующих случаях возвращается одна и та же ошибка 404: гранты пользователя не дают доступа, ID не соответствует активному аккаунту, репозиторий является зеркальным, репозиторий не существует или недоступен вам.

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

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

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

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

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

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

Публичный ID пользователя (user_…). При некорректном ID возвращается InvalidArgument (HTTP 400).

Поля ответа

user object

Участник. Возвращается всегда.

user.id string

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

user.email string

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

user.displayName string

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

user.handle string

Закреплённый за пользователем handle профиля без префикса @. Возвращается, только пока профиль общедоступен.

permission string

Право доступа пользователя к репозиторию с учётом всех применимых к нему грантов: грантов на репозиторий и на его владельца, полученных напрямую, через группу или через встроенные группы команды-владельца. Гранты PERMISSION_READ, PERMISSION_CONTRIBUTOR и PERMISSION_WRITE на уровне владельца учитываются только для внутренних репозиториев, причём PERMISSION_CONTRIBUTOR приравнивается к read. Выбирается наивысший уровень, поэтому значение может отличаться от permission любого отдельного гранта, который возвращает List Repository Grants. Значение custom возвращается, если пользовательская политика даёт доступ к репозиторию, которого не дают предустановленные гранты пользователя. Допустимые значения: read, write, admin, custom.
curl --request GET \  --url 'https://api.cursor.com/v1/origin/repos/OWNER_SLUG/REPO_NAME/collaborators/USER_ID/permission' \  --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN'

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

{  "user": {    "id": "user_01k2ja2000e0080000000000c3",    "email": "jane@acme.dev",    "displayName": "Jane Doe"  },  "permission": "write"}

Получить 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 минут; перейдите по перенаправлению, чтобы получить данные. Архив содержит один каталог верхнего уровня с именем {ownerSlug}-{repoName}-{shortSha}/, где shortSha — первые 7 символов разрешённого коммита в шестнадцатеричном формате; это соответствует структуре, которую использует конечная точка tar-архива в GitHub. Пустой репозиторий возвращает 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. Синхронизация зеркала остаётся на этой странице.

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

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

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

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

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

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

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 для ссылки на внешнюю страницу результатов поставщика.

Раздел Запуски проверок определяет, какая попытка считается текущей, как externalUpdatedAt упорядочивает записи и о чём сообщает outcome, а также правила меток времени и сроков, общие для этих конечных точек.

Запуск последующей проверки

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

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

Эта конечная точка атомарно находит попытку для набора тестов или создает ее, а также создает или обновляет одну попытку запуска. externalUpdatedAt определяет порядок обновлений для одной и той же идентичности запуска; устаревшие повторы запросов не могут перезаписать более новое состояние, а завершение со статусом cancelled не может заменить сохраненный успешный результат; см. Порядок операций записи. И запрос, проигнорированный как устаревший, и запрос с теми же значениями, что уже сохранены, в обоих случаях возвращают 200 с сохраненными набором тестов и запуском, поэтому проверяйте outcome, чтобы отличить ignored_stale и unchanged от created и updated. В обоих случаях updatedAt не меняется, поэтому по нему нельзя их различить.

Внутри набора текущей попыткой для запуска с ключом key считается запуск с самым новым значением externalUpdatedAt; при равенстве учитываются более новые значения createdAt, а затем id (от новых к старым). Каждая комбинация (actor, key, externalId), зарегистрированная для коммита, представляет одну попытку набора, а текущей попыткой для (actor, key) считается та, запуски которой имеют самое новое значение externalUpdatedAt; набор без запусков ранжируется по собственному значению createdAt. Запуск считается текущим для своего коммита, только пока его набор является текущей попыткой коммита, поэтому запуск, опубликованный в наборе с более старым externalId, остаётся скрытым в списках коммита, пока другая попытка этого набора демонстрирует более новую активность. На обоих уровнях отменённая попытка не вытесняет успешно проходящую; это правило описано в разделе Попытки и текущая попытка. Вытесненные попытки по-прежнему доступны для чтения по id.

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

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

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

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

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

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

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

Тело запроса

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

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

baseSha строка

База сравнения, относительно которой оценивался запуск проверки (40- или 64-символьная шестнадцатеричная строка): baseSha версии pull request. Она входит в идентификатор набора проверок и запуска проверки, поэтому публикация с теми же externalId и key для другой базы создаёт отдельную попытку, а не перезаписывает первую. Не указывайте её для запуска, не привязанного к базе; чтобы обратиться к той же попытке, при последующей публикации нужно указать то же значение. Пустая строка возвращает InvalidArgument (HTTP 400).

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

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

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, failing, completed. failing обозначает запуск, который продолжается после сбоя одного из шагов: отправьте его без conclusion, а по завершении запуска отправьте completed с вердиктом. В схеме также указано значение rerequested, которое устанавливает только Origin при повторном запросе; запрос с этим значением возвращает InvalidArgument (HTTP 400).

checkRun.conclusion строка

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

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

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

checkRun.startedAt string

Когда начался запуск проверки. Значение, которое находится более чем на 60 секунд в будущем, возвращает InvalidArgument (HTTP 400).

checkRun.completedAt string

Когда завершился запуск проверки. Значение, которое более чем на 60 секунд опережает текущее время, приводит к ошибке InvalidArgument (HTTP 400). То же происходит, если значение предшествует startedAt, когда оба значения отправляются вместе.

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.baseSha строка

База сравнения, относительно которой зарегистрирована эта попытка (шестнадцатеричный формат в нижнем регистре), если приложение, отправившее отчёт, её указало: baseSha версии pull request. Входит в идентичность попытки, поэтому приложение может зарегистрировать по одной попытке на каждую пару head-ветки и base-ветки. Отсутствует для попытки, не привязанной к base-ветке: такая попытка относится ко всем pull request на sha.

checkSuite.key string

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

checkSuite.name string

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

checkSuite.detailsUrl string

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

checkSuite.createdAt строка

Временная метка создания набора в формате 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

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

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, используемый вместе с идентификатором владельца для идентификации владельца репозитория.

checkRun.repository.owner.id string

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

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

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

checkRun.checkSuite object

Ссылка на набор проверок, в который он входит.

checkRun.checkSuite.id строка

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

checkRun.sha string

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

checkRun.baseSha строка

База сравнения, относительно которой был указан этот запуск (шестнадцатеричный формат в нижнем регистре), если приложение, отправившее отчёт, её указало; всегда совпадает с baseSha набора, которому принадлежит запуск. Отсутствует, если запуск не зависит от базы.

checkRun.key string

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

checkRun.name строка

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

checkRun.status string

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

checkRun.conclusion строка

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

checkRun.detailsUrl строка

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

checkRun.externalUpdatedAt строка

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

checkRun.startedAt string

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

checkRun.completedAt string

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

checkRun.createdAt string

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

checkRun.updatedAt строка

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

checkRun.externalId строка

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

checkRun.actor object

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

checkRun.actor.user object

Пользовательский вариант актора. Устанавливается, когда действие выполняет пользователь.

checkRun.actor.user.id string

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

checkRun.actor.user.email string

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

checkRun.actor.user.displayName string

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

checkRun.actor.user.handle string

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

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, и очищается вместе с ним.

outcome строка

Что этот вызов сделал с checkRun. Допустимые значения: created, updated, unchanged, ignored_stale. Публикация, проигнорированная как устаревшая, и публикация, повторяющая сохранённые значения, обе возвращают сохранённый запуск, поэтому отличить их можно только по этому полю.
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": "jane@acme.dev"      }    }  },  "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": "jane@acme.dev"      }    },    "output": {      "title": "Unit tests",      "summary": "128 tests passed.",      "text": "All suites green."    }  },  "outcome": "created"}

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

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

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

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

Origin применяет правило упорядочивания по externalUpdatedAt к каждому запуску отдельно. Запуск, проигнорированный как устаревший, не приводит к сбою всего пакета: в ответе на его месте возвращается сохранённый запуск, а results[].outcome сообщает вердикт по каждому запуску в порядке их следования в запросе.

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

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

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

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

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

Тело запроса

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

SHA коммита HEAD, для которого отображаются результаты проверок (40- или 64-значное шестнадцатеричное число).

baseSha строка

База сравнения, относительно которой оценивался каждый запуск проверки в этом запросе (40- или 64-значное шестнадцатеричное значение); см. baseSha в Post Check Run. Не указывайте это поле для запусков, не зависящих от базовой ветви. Пустая строка приводит к ошибке InvalidArgument (HTTP 400).

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

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

checkSuite.key строка Обязательно

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

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

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

checkSuite.detailsUrl string

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

checkSuite.externalId строка Обязательно

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

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

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

checkRuns[0].key строка Обязательно

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

checkRuns[0].name строка Обязательно

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

checkRuns[0].status string Обязательно

Задаваемые значения: CHECK_RUN_LIFECYCLE_STATUS_UNSPECIFIED, queued, in_progress, failing, completed. failing обозначает запуск, который продолжается после сбоя на одном из шагов: отправьте это значение без conclusion, а по завершении запуска отправьте 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

Когда начался запуск проверки. Значение, опережающее текущее время более чем на 60 секунд, приводит к ошибке InvalidArgument (HTTP 400).

checkRuns[0].completedAt строка

После завершения запуска проверки. Значение, которое более чем на 60 секунд превышает текущее время, приводит к ошибке InvalidArgument (HTTP 400), как и значение, предшествующее startedAt, если оба значения переданы вместе.

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.baseSha строка

База сравнения, для которой сообщены результаты этой попытки (в шестнадцатеричном формате в нижнем регистре), если приложение, отправившее отчёт, её указало: baseSha версии pull request. Она входит в идентификатор попытки, поэтому приложение может сообщать по одной попытке на каждую пару head-ветки и base-ветки. Отсутствует для попытки, не привязанной к base-ветке: такая попытка применяется ко всем pull request для sha.

checkSuite.key строка

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

checkSuite.name строка

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

checkSuite.detailsUrl string

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

checkSuite.createdAt string

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

checkSuite.updatedAt строка

Отметка времени в формате 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 строка

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

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 массив

Устарело: используйте вместо этого results[].checkRun. По-прежнему заполняется в порядке запроса.

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[].baseSha строка

База сравнения, относительно которой был отправлен результат этого запуска (шестнадцатеричный формат в нижнем регистре), если приложение, отправившее результат, её указало; всегда совпадает с baseSha набора проверок, которому принадлежит запуск. Отсутствует, если запуск не привязан к базе сравнения.

checkRuns[].key строка

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

checkRuns[].name string

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

checkRuns[].status string

Статус жизненного цикла: queued, in_progress, failing, completed или rerequested. Запуск со статусом failing ещё выполняется, но приложение уже знает, что он не пройдёт проверку: окончательного результата пока нет, поэтому при обязательных проверках он считается ожидающим. Запуск со статусом 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 строка

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

checkRuns[].createdAt string

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

checkRuns[].updatedAt string

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

checkRuns[].externalId string

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

checkRuns[].actor object

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

checkRuns[].actor.user object

Пользовательский вариант актора. Устанавливается, когда пользователь выполнил действие.

checkRuns[].actor.user.id строка

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

checkRuns[].actor.user.email строка

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

checkRuns[].actor.user.displayName строка

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

checkRuns[].actor.user.handle строка

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

checkRuns[].actor.app object

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

checkRuns[].actor.app.id string

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

checkRuns[].actor.app.displayName строка

Зарегистрированное отображаемое имя приложения. Не указывается, если приложение не удаётся определить, а также для управляемого субъекта, предоставляемого самой 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 строка

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

checkRuns[].deadlineAt строка

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

checkRuns[].isRerequestable boolean

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

checkRuns[].rerequestedAt строка

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

checkRuns[].rerequestedBy object

Субъект, запросивший повторный запуск, с теми же вариантами актёра, что и actor. Присутствует, когда задано rerequestedAt, и сбрасывается вместе с ним.

results массив

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

results[].checkRun object

Сохранённый запуск проверки после этого вызова: опубликованные значения, если outcome равен created или updated, и запуск в том виде, в каком он уже был, в остальных случаях. Содержит те же поля, что и checkRuns[].

results[].outcome строка

Что этот вызов сделал с results[].checkRun. Допустимые значения: created, updated, unchanged, ignored_stale. И запуск, проигнорированный как устаревший, и запуск, повторивший сохранённые значения, возвращают сохранённый запуск, поэтому это поле — единственный способ их различить.
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": "jane@acme.dev"      }    }  },  "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": "jane@acme.dev"        }      },      "output": {        "title": "Unit tests",        "summary": "128 tests passed.",        "text": "All suites green."      }    }  ],  "results": [    {      "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": "jane@acme.dev"          }        },        "output": {          "title": "Unit tests",          "summary": "128 tests passed.",          "text": "All suites green."        }      },      "outcome": "created"    }  ]}

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

GET/v1/origin/repos/{ownerSlug}/{repoName}/check-runs/{checkRunId}
Scoperepository:checks:readAuthInstallation tokenUser access token

Возвращает один запуск проверки по присвоенному сервером идентификатору (cr_...).

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

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

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

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

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

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

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

Поля ответа

id string

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

repository object

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

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 коммита, к которому прикреплён запуск.

baseSha строка

База сравнения, относительно которой переданы результаты этого запуска (в шестнадцатеричном формате, в нижнем регистре), если приложение указало её; всегда соответствует baseSha родительского набора проверок. Отсутствует для запуска, не зависящего от базы.

key строка

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

name string

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

status string

Статус жизненного цикла: queued, in_progress, failing, completed или rerequested. Запуск со статусом failing всё ещё выполняется, но приложение уже знает, что он не пройдёт: у него ещё нет итогового результата, и для обязательных проверок он считается ожидающим. Запуск со статусом 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 набора проверок, которому принадлежит запуск.

actor.user object

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

actor.user.id строка

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

actor.user.email строка

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

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": "jane@acme.dev"    }  },  "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

Перечисляет аннотации запуска проверки в порядке возрастания идентификатора.

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

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

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

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

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

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

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

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

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

pageSize integer

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

pageToken string

Непрозрачный курсор из поля nextPageToken предыдущего ответа. Для первой страницы опустите. Параметр pageSize в последующем запросе применяется к запрашиваемой странице; опустите его, чтобы сохранить предыдущий размер страницы.

Поля ответа

annotations массив

Страница аннотаций в порядке возрастания ID.

annotations[].id string

Стабильный идентификатор аннотации Origin. Идентификаторы можно сортировать по времени.

annotations[].checkRunId string

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

annotations[].annotationLevel string

Уровень серьёзности аннотации. Допустимые значения: notice, warning, failure.

annotations[].message string

Текст аннотации. Может содержать Markdown.

annotations[].title string

Заголовок аннотации. Отсутствует, если у аннотации его нет.

annotations[].rawDetails string

Исходный текст описания. Отсутствует, если у аннотации его нет.

annotations[].createdAt string

Время создания аннотации (RFC 3339).

annotations[].updatedAt string

Время последнего обновления аннотации (RFC 3339).

annotations[].location object

Расположение источника. Отсутствует для аннотации уровня запуска.

annotations[].location.path string

Канонический путь к файлу относительно репозитория.

annotations[].location.startLine integer

Первая строка диапазона. Нумерация с 1; включительно.

annotations[].location.endLine integer

Последняя строка диапазона. Нумерация с 1, включительно.

annotations[].location.columns object

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

annotations[].location.columns.startColumn integer

Первый столбец диапазона. Нумерация начинается с 1, границы включены.

annotations[].location.columns.endColumn integer

Последний столбец диапазона. Нумерация с 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 строка Обязательное

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

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

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

Тело запроса

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

Пакет для добавления. Должен содержать от 1 до 25 записей.

annotations[].annotationLevel string Обязательное

Уровень важности аннотации. Допустимые значения: notice, warning, failure.

annotations[].message string Обязательное

Текст аннотации. Может содержать Markdown. Не должен быть пустым. Максимум 65 535 байт в UTF-8.

annotations[].title string

Название аннотации. Максимальная длина: 255 символов Unicode.

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

Текст аннотации. Может содержать Markdown.

annotations[].title string

Заголовок аннотации. Отсутствует, если у аннотации его нет.

annotations[].rawDetails string

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

annotations[].createdAt string

Время создания аннотации (RFC 3339).

annotations[].updatedAt string

Время последнего обновления аннотации (RFC 3339).

annotations[].location object

Расположение источника. Отсутствует для аннотации уровня запуска.

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 и соответствовать текущему состоянию открытого pull request. В противном случае возвращается FailedPrecondition (HTTP 400).

Для каждого запуска может быть активен только один повторный запрос. Повторный запрос при установленном rerequestedAt возвращает AlreadyExists (HTTP 409 Conflict), а после ответа приложения-владельца запуск снова становится доступен для повторного запроса. Любой субъект с правом repository:contents:write может повторно запросить любой запуск, доступный для повторного запроса, независимо от того, какое приложение о нём сообщило. Если checkRunId неизвестен или принадлежит другому репозиторию, возвращается 404.

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

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

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

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

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

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

Идентификатор выполнения проверки, назначаемый сервером (cr_...).

Тело запроса

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

Поля ответа

id строка

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

repository объект

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

repository.id строка

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

repository.name строка

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

repository.owner object

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

repository.owner.slug string

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

repository.owner.id string

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

repository.owner.type строка

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

checkSuite object

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

checkSuite.id string

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

sha string

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

baseSha строка

База сравнения, относительно которой были представлены результаты этого запуска (в шестнадцатеричном формате со строчными буквами), если приложение, передающее результаты, указало её; всегда совпадает с baseSha набора проверок, которому принадлежит запуск. Отсутствует для запуска, не зависящего от базы.

key строка

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

name string

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

status string

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

conclusion string

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

detailsUrl строка

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

externalUpdatedAt string

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

startedAt строка

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

completedAt строка

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

createdAt string

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

updatedAt строка

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

externalId строка

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

actor object

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

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 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": "jane@acme.dev"    }  }}

Получить набор проверок

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 коммита, к которому прикреплён набор проверок.

baseSha строка

Базовый коммит, относительно которого отправлен отчёт об этой попытке (в шестнадцатеричном формате, строчными буквами), если приложение указало его: baseSha версии pull request. Он входит в идентификатор попытки, поэтому приложение может отправить отчёт об одной попытке для каждой пары head и base. Поле отсутствует для попытки, не зависящей от базового коммита: такая попытка применима ко всем pull request с 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": "jane@acme.dev"    }  }}

Список запусков проверок для набора

GET/v1/origin/repos/{ownerSlug}/{repoName}/check-suites/{checkSuiteId}/check-runs
Scoperepository:checks:readAuthInstallation tokenUser access token

Перечисляет текущие запуски проверок набора. Если ключ запуска был указан в наборе более одного раза, возвращается только последняя попытка для этого ключа; вытесненные попытки не включаются. Post Check Run определяет, какая попытка считается последней. Повторно запрошенный запуск остаётся в списке и отображается как ожидающий: поле status имеет значение rerequested, поле rerequestedAt заполнено, а его вытесненное значение conclusion и временные отметки остаются без изменений, пока приложение, которому принадлежит запуск, не ответит. Просмотреть вытесненную попытку по её идентификатору можно с помощью Get Check Run. Результаты разбиты на страницы.

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

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

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

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

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

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

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

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

pageSize integer

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

pageToken строка

Непрозрачный курсор из поля next_page_token предыдущего ответа. Для первой страницы — пустой. Кодирует идентификатор последнего просмотренного check-run в рамках этого набора тестов. Параметр pageSize в последующем запросе применяется к этой странице; не указывайте его, чтобы сохранить предыдущий размер страницы.

Поля ответа

checkRuns массив

Постраничные запуски проверок, относящиеся к указанному набору тестов.

checkRuns[].id string

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

checkRuns[].repository object

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

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[].baseSha строка

База сравнения, относительно которой был передан результат этого запуска (шестнадцатеричное значение в нижнем регистре), если передавшее его приложение указало её; всегда baseSha набора проверок-владельца. Отсутствует для запуска, не привязанного к базе.

checkRuns[].key string

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

checkRuns[].name строка

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

checkRuns[].status строка

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

checkRuns[].conclusion string

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

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

Публичный субъект, который инициировал запуск. Всегда соответствует полю actor набора проверок-владельца.

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.

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 строка

Метка времени 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": "jane@acme.dev"        }      },      "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

Перечисляет текущие запуски проверок коммита во всех наборах: только запуски, принадлежащие последней попытке каждого набора, и в каждом наборе — только последнюю попытку для каждого ключа запуска. Устаревшие попытки не включаются; Post Check Run определяет, какая попытка является последней. Повторно запрошенный запуск остаётся в списке и отображается как ожидающий: для него установлены status со значением rerequested и rerequestedAt, а его устаревшие conclusion и временные показатели остаются без изменений, пока приложение, которому принадлежит этот запуск, не ответит. Получить сведения об устаревшей попытке по её собственному идентификатору можно с помощью Get Check Run. Список можно дополнительно отфильтровать по имени проверки и статусу. Результаты разбиты на страницы.

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

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

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

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

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

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

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

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

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

pageSize integer

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

pageToken строка

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

checkName string

Необязательный фильтр по точному имени запуска проверки, сопоставляемый с checkRuns[].name. Не указывайте его, чтобы перечислить запуски с любым именем.

status string

Необязательный фильтр статуса. Допустимые значения: queued, in_progress, failing, 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 строка

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

checkRuns[].repository.owner.id string

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

checkRuns[].repository.owner.type строка

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

checkRuns[].checkSuite object

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

checkRuns[].checkSuite.id string

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

checkRuns[].sha string

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

checkRuns[].baseSha строка

База сравнения, относительно которой были представлены результаты этого запуска (шестнадцатеричное число в нижнем регистре), если приложение, передавшее результаты, указало её; всегда baseSha набора проверок, которому принадлежит запуск. Отсутствует для запуска, не зависящего от базовой ветки.

checkRuns[].key string

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

checkRuns[].name string

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

checkRuns[].status string

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

checkRuns[].conclusion string

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

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

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

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

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

checkRuns[].actor.serviceAccount object

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

checkRuns[].actor.serviceAccount.id строка

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

checkRuns[].output object

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

checkRuns[].output.title строка

Краткий заголовок для вывода. Максимальная длина: 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": "jane@acme.dev"        }      },      "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

Возвращает список наборов проверок для коммита. Возвращается только последняя попытка каждого набора — по каждому отчитывающемуся субъекту и ключу набора; замещённые попытки не включаются, а Post Check Run определяет, какая попытка является последней. Замещённую попытку можно прочитать по её собственному идентификатору через Get Check Suite. Возвращает только метаданные набора (без вложенных запусков). Поддерживает пагинацию.

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

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

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

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

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

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

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

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

pageSize integer

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

pageToken строка

Непрозрачный курсор из поля next_page_token предыдущего ответа. Пустой для первой страницы. Кодирует идентификатор набора проверок, последним обнаруженного в рамках этого коммита. Параметр pageSize в последующем запросе применяется к этой странице; не указывайте его, чтобы сохранить прежний размер страницы.

Поля ответа

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[].baseSha строка

База сравнения, относительно которой был зарегистрирован этот запуск (строчные шестнадцатеричные цифры), если приложение, отправляющее отчет, указало её: baseSha версии pull request. Она является частью идентификатора запуска, поэтому приложение может отправить отдельный запуск для каждой пары head и base. Отсутствует у запуска, не зависящего от базы и применимого ко всем pull request с 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": "jane@acme.dev"        }      }    }  ]}

Коммиты и содержимое

Коммит отделяет метаданные 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 integer

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

pageToken строка

Непрозрачный курсор из nextPageToken предыдущего ответа. Для первой страницы он пуст. Кодирует начальный ref, позицию обхода и фильтры по электронной почте и времени; если указан токен, параметры sha, pageSize, authorEmails, committerEmails, since и until игнорируются. Отфильтрованная страница может содержать меньше коммитов, чем указано в pageSize, или не содержать их вовсе, даже если задан nextPageToken. Продолжайте запрашивать страницы, пока nextPageToken не станет пустым.

authorEmails массив

Необязательный фильтр по адресам электронной почты авторов Git. Подходит любой из указанных адресов: пробелы по краям удаляются, регистр не учитывается. Пустые и повторяющиеся записи игнорируются. Можно указать не более 100 различных адресов; пустое значение означает отсутствие фильтра. Это адреса электронной почты авторов Git, а не идентификаторы инициаторов действий в Origin. На каждой странице для поиска совпадений проверяется не более 1 000 коммитов.

committerEmails массив

Необязательный фильтр по адресам электронной почты коммитеров Git. Использует те же правила нормализации и ограничение в 100 адресов, что и authorEmails; пустое значение означает отсутствие фильтра. Если заданы оба фильтра, коммит должен соответствовать обоим спискам. На каждой странице для поиска совпадений проверяется не более 1 000 коммитов.

since строка

Необязательная включительная нижняя граница времени коммитера в виде метки времени RFC 3339 (например, 2026-08-01T00:00:00Z): в список попадают только коммиты, созданные в это время или позже. Git записывает время коммитера с точностью до целых секунд, поэтому доли секунды игнорируются; при rebase или cherry-pick время коммитера меняется, а время автора — нет. Как и git log --since, перечисление прекращается после чтения 100 коммитов подряд, созданных раньше since. Фильтры по времени используют общий с фильтрами по электронной почте лимит сканирования — 1 000 коммитов на страницу. Некорректная метка времени приводит к ошибке InvalidArgument (HTTP 400).

until строка

Необязательная включительная верхняя граница времени коммита в формате временной метки RFC 3339: в список попадают только коммиты, созданные не позднее указанного времени. Некорректная временная метка или значение since, более позднее, чем until, приводит к ошибке InvalidArgument (HTTP 400).

Поля ответа

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": "jane@acme.dev",          "date": "2026-08-01T09:30:00Z"        },        "committer": {          "name": "Jane Doe",          "email": "jane@acme.dev",          "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 обрабатывается так же, как в разделе Получить Git-коммит.

Поля ответа

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 integer

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

stats.total integer

Суммарное количество добавлений и удалений в коммите.
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": "jane@acme.dev",      "date": "2026-08-01T09:30:00Z"    },    "committer": {      "name": "Jane Doe",      "email": "jane@acme.dev",      "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 должен совпадать с токеном. Для каждого файла указываются filename, status, additions, deletions, changes, patch и previousFilename, если файл был переименован или скопирован. Для бинарных файлов patch пуст.

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

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

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

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

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

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

SHA, ветка, тег или символьная ссылка (например, HEAD) коммита, файлы которого нужно перечислить. Сокращённый SHA разрешается так же, как и в Get Git Commit.

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

pageSize integer

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

pageToken строка

Непрозрачный курсор из поля next_page_token предыдущего ответа. Пуст для первой страницы. Токен фиксирует выбранный коммит и позицию курсора файла, поэтому параметр sha в последующем запросе должен соответствовать токену. Параметр pageSize в последующем запросе применяется к этой странице; не указывайте его, чтобы сохранить предыдущий размер страницы.

Поля ответа

files массив

Изменённые файлы с постраничной навигацией: имя файла, статус, количество строк, патч и previousFilename для переименованных или скопированных файлов. Для бинарных файлов патч пустой.

files[].filename строка

Путь к изменённому файлу.

files[].status строка

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

files[].additions integer

Добавлено количество строк в файле.

files[].deletions integer

Количество удалённых строк в файле.

files[].changes integer

Общее количество изменённых строк в файле.

files[].patch строка

Унифицированный патч; для бинарных файлов пусто.

files[].previousFilename строка

Предыдущий путь при переименовании или копировании файла.

nextPageToken строка

Токен фиксирует выбранный коммит и курсор файла; последующие значения sha должны соответствовать ему.
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": "jane@acme.dev",        "date": "2026-08-01T09:30:00Z"      },      "committer": {        "name": "Jane Doe",        "email": "jane@acme.dev",        "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": "jane@acme.dev",        "date": "2026-08-01T09:30:00Z"      },      "committer": {        "name": "Jane Doe",        "email": "jane@acme.dev",        "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": "jane@acme.dev",        "date": "2026-08-01T09:30:00Z"      },      "committer": {        "name": "Jane Doe",        "email": "jane@acme.dev",        "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 в последующем запросе должен совпадать с токеном. Origin повторно разрешает сравнение на каждой странице; если его коммиты с момента выдачи токена переместились, запрос возвращает InvalidArgument (HTTP 400), и перечисление необходимо начать заново с первой страницы. Параметр pageSize в последующем запросе применяется к этой странице; не указывайте его, чтобы сохранить прежний размер страницы.

Поля ответа

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, чтобы искать текст точно. Пробелы значимы и учитываются при поиске. Когда literal равно false, регистронезависимое сопоставление указывается префиксом (?i) в шаблоне (например, (?i)launch), а сопоставление целых слов — с помощью \b вокруг него (например, \blaunch\b). Пустой шаблон возвращает InvalidArgument (HTTP 400). Максимальный размер в UTF-8: 4096 байт.

literal boolean

Ищите query как точный текст, а не как регулярное выражение.

caseInsensitive boolean

Считать символы верхнего и нижнего регистра эквивалентными. Применяется только когда literal равно true. При поиске по регулярному выражению игнорируется — вместо этого добавьте ведущий (?i) в query.

wholeWord boolean

Искать только целые слова. Применяется только когда literal равно true. Игнорируется при поиске с регулярным выражением; вместо этого обведите шаблон \b.

contextBefore integer

Сколько строк непосредственно перед каждой совпавшей строкой возвращать в качестве контекста. Значения больше 10 приводятся к 10.

contextAfter integer

Сколько строк сразу после каждой совпавшей строки возвращать в качестве контекста. Значения больше 10 приводятся к 10.

filterPath строка

Ограничьте область поиска этим файлом или каталогом относительно корня репозитория. При пустом значении выполняется поиск по всему репозиторию. Максимальный размер в UTF-8: 4096 байт.

includes массив

Глобальные шаблоны, задающие пути для поиска. Сопоставление регистронезависимое; шаблон, не содержащий /, соответствует на любой глубине, * соответствует внутри одного сегмента пути, а ** — через несколько сегментов. Если указано хотя бы одно включение, путь, не соответствующий ни одному из них, не ищется. Не более 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-ссылка записывают Git-object и требуют repository:contents:write.

Помимо веток и тегов, Получить Git-ссылку читает предпросмотр слияния pull request по пути pull/{pullNumber}/merge (нормализуется в refs/pull/{pullNumber}/merge): это коммит, который сливает текущую head-ветку pull request с вершиной его base-ветки на момент последнего обновления. Origin обновляет его при создании pull request, при push в его head-ветку, при смене цели и при повторном открытии — до публикации соответствующих вебхук-событий pull_request.* и в пределах ограниченного лимита времени; если обновление не успевает завершиться, прежняя Git-ссылка сохраняется, а события всё равно публикуются. Origin не обновляет её только из-за того, что base-ветка сама продвинулась вперёд, и удаляет Git-ссылку, если при слиянии возникают конфликты, поэтому 404 для открытого pull request означает конфликты или ещё не подготовленный предпросмотр. Каждая версия pull request также содержит результат собственного пробного слияния в version.potentialMergeCommit; поле state позволяет различить эти два случая. См. Pull requests. mergeCommitSha у pull request — это другой коммит, который задаётся только после выполнения слияния.

Получить 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. Сокращение должно содержать не менее 5 шестнадцатеричных символов и ищется только среди объектов коммитов; если ему не соответствует ни один коммит или соответствует несколько, запрос завершается ошибкой.

Поля ответа

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": "jane@acme.dev",    "date": "2026-08-01T09:30:00Z"  },  "committer": {    "name": "Jane Doe",    "email": "jane@acme.dev",    "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 Обязательный

Автор коммита. Временные метки проставляются сервером. Origin удаляет символы <, > и перевода строки из name и email, как и git commit; если после этого значение становится пустым, возвращается InvalidArgument (HTTP 400).

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

Name, записанный в identity Git.

author.email string Обязательное

Email, записанный в Git identity.

committer object

Коммиттер коммита. Если не указан, по умолчанию используется author. Его name и email очищаются так же, как у author.

committer.name string

Имя, записываемое в Git identity. Обязательно, если указан committer.

committer.email string

Адрес электронной почты, указанный в идентификаторе Git. Обязателен, если присутствует 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 корневого дерева нового коммита.

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": "jane@acme.dev"  },  "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.

pull/<number>/merge — предварительное слияние pull request: коммит, объединяющий его текущую head-ветку с последним коммитом его base-ветки на момент последнего обновления. Это другой коммит, не совпадающий с mergeCommitSha pull request, который устанавливается только после слияния pull request. Поле version.potentialMergeCommit pull request содержит тестовое слияние для каждой версии: пока версия является последней и её state имеет значение prepared, её sha — это коммит, на который указывает эта Git-ссылка.

Origin обновляет предварительное слияние при создании pull request, при отправке изменений в его head-ветку, при изменении его цели и при его повторном открытии — до публикации соответствующих webhook-событий pull_request.* и в пределах ограниченного времени. Если обновление не завершается вовремя, сохраняется предыдущая ссылка, а события всё равно публикуются. Origin не обновляет её, если base-ветка лишь продвинулась вперёд, и удаляет ссылку при конфликтах слияния, поэтому 404 для открытого pull request означает, что при слиянии есть конфликты или предварительное слияние ещё не подготовлено.

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

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

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

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

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

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

Имя Git-ссылки. Обычно heads/<branch> или tags/<tag>; префикс refs/ принимается и нормализуется. Также принимается символьная ссылка HEAD (возвращается как ref: "HEAD" с последним коммитом), а также pull/<number>/merge для предварительного слияния pull request. Выполняется точное сопоставление по полному имени 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-ссылку

DELETE/v1/origin/repos/{ownerSlug}/{repoName}/git/refs/{ref}
Scoperepository:contents:writeAuthInstallation tokenUser access token

Удаляет ссылку на ветку. Тело ответа пустое.

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

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

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

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

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

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

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

Ссылка на ветку для удаления в виде refs/heads/<branch> или heads/<branch>.

Поля ответа

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

curl --request DELETE \  --url 'https://api.cursor.com/v1/origin/repos/OWNER_SLUG/REPO_NAME/git/refs/REF' \  --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN'

Ответ:

204 No Content

Список 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": "jane@acme.dev",    "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 строка

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

Поля ответа

grants массив

Права доступа, выданные непосредственно на репозиторий, отсортированные по типу субъекта (группы, администраторы команды-владельца, участники команды-владельца, пользователи), а затем по id. Субъект, который больше не сопоставляется с активным пользователем, группой или командой-владельцем, пропускается, поэтому страница может содержать меньше pageSize прав доступа.

grants[].user object

Субъект пользователя. Присутствует ровно одно из полей: 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": "jane@acme.dev"      },      "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

Задаёт право доступа, которым пользователь, группа или группа владеющей команды обладает непосредственно в репозитории, заменяя любое право доступа, ранее выданное этому субъекту напрямую. Повторная выдача права доступа, которое у субъекта уже есть, завершается успешно и ничего не меняет. Пользователь должен быть активным участником команды или организации владельца репозитория. Группа должна принадлежать команде владельца либо быть активной группой в организации этой команды; иначе запрос возвращает 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": "jane@acme.dev"  },  "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/namespaces/{namespaceSlug}/grants
Scopenamespace:settings:readAuthInstallation tokenUser access token

Возвращает список тех, кому предоставлен доступ к владельцу: пользователей, группы, а также встроенные группы admin и member команды-владельца. Каждый грант определяет разрешение, которое он предоставляет для каждого репозитория этого владельца. Гранты, выданные для отдельных репозиториев, не включены в список; их можно получить с помощью метода List Repository Grants.

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

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

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

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

pageSize integer

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

pageToken строка

Непрозрачный курсор из поля next_page_token предыдущего ответа. Для первой страницы оставьте пустым. Параметр pageSize в follow-up-запросе применяется к запрашиваемой странице; чтобы сохранить прежний размер страницы, не указывайте его.

Поля ответа

grants массив

Разрешения на этой странице. Сначала идут разрешения администраторов; в каждой группе разрешения упорядочены по типу субъекта (группы, администраторы команды-владельца, участники команды-владельца, пользователи), а затем по идентификатору. Субъект, который больше не соответствует активному пользователю, группе или команде-владельцу, опускается, поэтому на странице может быть меньше разрешений, чем pageSize.

grants[].user object

Субъект пользователя. Должно присутствовать ровно одно из полей: 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/namespaces/{namespaceSlug}/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": "jane@acme.dev"      },      "permission": "PERMISSION_WRITE"    }  ],  "nextPageToken": ""}

Upsert-обновление гранта пространства имён

POST/v1/origin/namespaces/{namespaceSlug}/grants
Scopenamespace:settings:writeAuthInstallation tokenUser access token

Задаёт право доступа, которым пользователь, группа или группа владеющей команды напрямую обладает на owner, заменяя право доступа, ранее выданное этому principal напрямую. Повторная выдача права доступа, которое principal уже имеет, завершается успешно и ничего не меняет. Запрос возвращает FailedPrecondition (HTTP 400), если пользователь не является активным участником владеющей команды или её организации, если группа не принадлежит этой команде и не является активной группой в её организации либо если запись оставит owner без администратора.

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

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

Слаг пространства имён.

Тело запроса

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 строка Обязательное

Выдаваемое право доступа. Допустимые значения: PERMISSION_READ, PERMISSION_CONTRIBUTOR, PERMISSION_WRITE, PERMISSION_ADMIN. Значения PERMISSION_READ, PERMISSION_CONTRIBUTOR и PERMISSION_WRITE задают соответствующий уровень доступа к внутренним репозиториям владельца, а PERMISSION_ADMIN даёт права на администрирование самого владельца. PERMISSION_CUSTOM возвращает InvalidArgument (HTTP 400).

Поля ответа

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, принадлежащего owner.
curl --request POST \  --url 'https://api.cursor.com/v1/origin/namespaces/NAMESPACE_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": "jane@acme.dev"  },  "permission": "PERMISSION_WRITE"}

Удаление гранта пространства имён

DELETE/v1/origin/namespaces/{namespaceSlug}/grants
Scopenamespace:settings:writeAuthInstallation tokenUser access token

Удаляет право доступа, которым пользователь, группа или группа владеющей команды обладает непосредственно на уровне owner. Гранты для репозитория не затрагиваются. Удаление права доступа, которым principal не обладает напрямую, завершается успешно и ничего не меняет, а удаление, после которого у owner не останется ни одного администратора, возвращает FailedPrecondition (HTTP 400). Тело ответа пустое.

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

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

Слаг пространства имён.

Тело запроса

user object

Principal пользователя. Присутствует ровно одно из полей: user, group или teamGroup.

user.id строка

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

user.email строка

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

user.displayName строка

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

user.handle строка

Закреплённый за пользователем handle профиля без префикса @. Присутствует, только пока профиль виден публично; в остальных случаях отсутствует.

group object

Principal группы Cursor: группы, которой владеет команда owner, или группы в организации этой команды.

group.id строка

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

teamGroup object

Одна из встроенных групп владеющей команды: доступ команды к owner по умолчанию.

teamGroup.kind строка

Какая встроенная группа обладает грантом. Допустимые значения: members, admins.

Поля ответа

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

curl --request DELETE \  --url 'https://api.cursor.com/v1/origin/namespaces/NAMESPACE_SLUG/grants' \  --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN' \  --header 'Content-Type: application/json' \  --data '{  "group": {    "id": "grp_01k2ja2000e0080000000000n2"  }}'

Ответ:

204 No Content

Allowlist входящих IP-адресов

Allowlist входящих IP-адресов пространства имён содержит адреса, с которых разрешён доступ к его репозиториям. Если ограничения по списку действуют и хотя бы одна запись включена, запросы пользователя Cursor к репозиториям пространства имён через git по SSH и HTTPS и API, а также запросы на скачивание файлов принимаются только с адресов из списка. Список не ограничивает запросы, отправленные с использованием JWT приложения, токена доступа установки, пользовательского токена установки или сервисного аккаунта. Эти конечные точки позволяют просматривать список, включать и отключать ограничения, добавлять, обновлять и удалять записи, а также заменять весь набор записей. Allowlist доступен в пространствах имён команд.

Каждая запись содержит адрес IPv4 или IPv6 либо диапазон CIDR и имеет собственный непрозрачный id. Конечные точки для работы с записями используют этот идентификатор как entryId. Идентификатор не меняется, когда операция Обновить запись allowlist входящих IP-адресов изменяет значение cidr записи. В списке пространства имён может быть не более 1000 записей. Отключённая запись остаётся в списке, но не даёт доступа.

Для просмотра списка и его записей подходят токены установки и пользователя с правом доступа namespace:settings:read. Для включения и отключения ограничений, а также добавления, обновления, удаления и замены записей требуются учётные данные пользователя Cursor с правом доступа namespace:settings:write; токены приложения и установки не принимаются. Если включение ограничений, обновление или удаление записи приведёт к исключению адреса вызывающей стороны из списка разрешённых, возвращается InvalidArgument (HTTP 400). Если ограничения по списку уже действуют и адрес вызывающей стороны не входит в него, попытка изменения возвращает PermissionDenied (HTTP 403).

Получение allowlist входящих IP-адресов

GET/v1/origin/namespaces/{namespaceSlug}/inbound-ip-allowlist
Scopenamespace:settings:readAuthInstallation tokenUser access token

Возвращает allowlist входящих IP-адресов пространства имён: применяется ли он, а также все записи, начиная с самой старой. Ответ не поддерживает пагинацию: в пространстве имён может быть не более 1000 записей. Allowlist доступен только для командных пространств имён; для остальных пространств имён возвращается FailedPrecondition (HTTP 400).

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

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

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

Поля ответа

enabled boolean

Применяется ли список. Список действует, только пока это поле равно true и включена хотя бы одна запись; см. Обновление allowlist входящих IP-адресов.

entries массив

Все записи, начиная с самой старой.

entries[].id строка

ID записи, который конечные точки для работы с записями принимают как entryId. Он не меняется при изменении CIDR записи.

entries[].cidr строка

Адрес IPv4 или IPv6 либо диапазон CIDR в том виде, в котором он был отправлен.

entries[].description строка

Метка записи, не более 255 символов.

entries[].enabled boolean

Пропускает ли запись трафик со своих адресов. Отключённая запись остаётся в списке, но ничего не пропускает.

entries[].createdAt строка

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

etag строка

Отпечаток набора записей. Он меняется при каждом добавлении, обновлении или удалении записи; включение или отключение применения списка на него не влияет. Передайте его в Замена записей allowlist входящих IP-адресов, чтобы замена была отклонена, если записи изменились с момента этого чтения.
curl --request GET \  --url 'https://api.cursor.com/v1/origin/namespaces/NAMESPACE_SLUG/inbound-ip-allowlist' \  --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN'

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

{  "enabled": true,  "entries": [    {      "id": "nsip_01k2ja2000e0080000000000c4",      "cidr": "203.0.113.0/24",      "description": "Office",      "enabled": true,      "createdAt": "2026-08-02T14:45:00Z"    },    {      "id": "nsip_01k2ja2000e0080000000000c5",      "cidr": "198.51.100.7",      "description": "VPN egress",      "enabled": false,      "createdAt": "2026-08-03T09:10:00Z"    }  ]}

Обновить allowlist входящих IP-адресов

PATCH/v1/origin/namespaces/{namespaceSlug}/inbound-ip-allowlist
Scopenamespace:settings:writeAuthUser access token

Включает или отключает ограничение доступа по allowlist входящих IP-адресов пространства имён и возвращает этот список. Если ограничение включено и в списке есть хотя бы одна активная запись, запросы пользователя Cursor к репозиториям пространства имён через git по SSH и HTTPS и API, а также запросы на скачивание файлов принимаются только с адресов из списка. На JWT приложений, токены доступа установки, пользовательские токены установки и сервисные аккаунты ограничение не распространяется. Если при включении списка в нём нет адреса, с которого отправлен запрос, возвращается InvalidArgument (HTTP 400). Если действующее ограничение уже исключает этот адрес, возвращается PermissionDenied (HTTP 403). Повторное задание текущего значения выполняется без изменений.

Для вызова необходимы учётные данные пользователя Cursor с правом доступа namespace:settings:write. Токены приложений и установок не принимаются.

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

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

Слаг пространства имён.

Тело запроса

enabled логическое значение Обязательный

true — применять allowlist входящих IP-адресов пространства имён, false — прекратить его применение.

Поля ответа

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

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

entries массив

Все записи в порядке добавления.

entries[].id строка

Идентификатор записи, который конечные точки для работы с записями принимают как entryId. Он не меняется при изменении CIDR записи.

entries[].cidr строка

Адрес IPv4 или IPv6 либо диапазон CIDR в том виде, в котором он был указан при добавлении.

entries[].description строка

Метка записи длиной не более 255 символов.

entries[].enabled логическое значение

Разрешён ли доступ с адресов записи. Отключённая запись остаётся в списке, но доступ с её адресов не разрешается.

entries[].createdAt строка

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

etag строка

Отпечаток набора записей. Он меняется при каждом добавлении, обновлении или удалении записи; включение или отключение ограничения на него не влияет. Передайте его в Replace Inbound IP Allowlist Entries, чтобы замена была отклонена, если после этого чтения записи изменились.
curl --request PATCH \  --url 'https://api.cursor.com/v1/origin/namespaces/NAMESPACE_SLUG/inbound-ip-allowlist' \  --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN' \  --header 'Content-Type: application/json' \  --data '{  "enabled": true}'

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

{  "enabled": true,  "entries": [    {      "id": "nsip_01k2ja2000e0080000000000c4",      "cidr": "203.0.113.0/24",      "description": "Office",      "enabled": true,      "createdAt": "2026-08-02T14:45:00Z"    }  ]}

Добавить запись в allowlist входящих IP-адресов

POST/v1/origin/namespaces/{namespaceSlug}/inbound-ip-allowlist/entries
Scopenamespace:settings:writeAuthUser access token

Добавляет запись в allowlist входящих IP-адресов пространства имён и возвращает её.

CIDR сохраняется в том написании, в каком передан (после удаления пробелов по краям). Если в пространстве имён уже есть CIDR с таким же написанием, возвращается AlreadyExists (HTTP 409 Conflict). Если CIDR не удаётся разобрать, диапазон охватывает всё адресное пространство (/0) или в списке уже 1000 записей, возвращается InvalidArgument (HTTP 400). Пока список действует, вызывающая сторона, чей собственный адрес в него не входит, получает PermissionDenied (HTTP 403).

Вызывающая сторона должна использовать учётные данные пользователя Cursor с namespace:settings:write. Токены приложений и установок не принимаются.

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

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

Слаг пространства имён.

Тело запроса

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

Адрес IPv4 или IPv6 либо диапазон CIDR, например 203.0.113.0/24, 203.0.113.7 или 2001:db8::/32. Сохраняется в исходном написании после удаления пробелов по краям. Диапазон, охватывающий всё адресное пространство (/0), отклоняется.

description строка

Метка записи, не более 255 символов.

enabled boolean

Разрешён ли доступ с адресов этой записи. Если не указано, по умолчанию true.

Поля ответа

id строка

ID записи, который конечные точки для работы с записями принимают как entryId. Не меняется при изменении CIDR записи.

cidr строка

Адрес IPv4 или IPv6 либо диапазон CIDR в том написании, в каком он был передан.

description строка

Метка записи, не более 255 символов.

enabled boolean

Разрешён ли доступ с адресов этой записи. Отключённая запись остаётся в списке, но не разрешает доступ ни с каких адресов.

createdAt строка

Метка времени добавления записи в формате RFC 3339.
curl --request POST \  --url 'https://api.cursor.com/v1/origin/namespaces/NAMESPACE_SLUG/inbound-ip-allowlist/entries' \  --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN' \  --header 'Content-Type: application/json' \  --data '{  "cidr": "203.0.113.0/24",  "description": "Office"}'

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

{  "id": "nsip_01k2ja2000e0080000000000c4",  "cidr": "203.0.113.0/24",  "description": "Office",  "enabled": true,  "createdAt": "2026-08-02T14:45:00Z"}

Получить запись allowlist входящих IP-адресов

GET/v1/origin/namespaces/{namespaceSlug}/inbound-ip-allowlist/entries/{entryId}
Scopenamespace:settings:readAuthInstallation tokenUser access token

Возвращает одну запись allowlist входящих IP-адресов по её ID. Если ID нет в списке пространства имён, возвращается 404.

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

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

Слаг пространства имён.

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

id записи.

Поля ответа

id строка

ID записи, который конечные точки для работы с записями принимают как entryId. Он не меняется при изменении CIDR записи.

cidr строка

IPv4- или IPv6-адрес либо диапазон CIDR в том написании, в котором он был отправлен.

description строка

Метка записи, не более 255 символов.

enabled boolean

Пропускает ли запись трафик со своих адресов. Отключённая запись остаётся в списке, но ничего не пропускает.

createdAt строка

Метка времени добавления записи в формате RFC 3339.
curl --request GET \  --url 'https://api.cursor.com/v1/origin/namespaces/NAMESPACE_SLUG/inbound-ip-allowlist/entries/ENTRY_ID' \  --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN'

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

{  "id": "nsip_01k2ja2000e0080000000000c4",  "cidr": "203.0.113.0/24",  "description": "Office",  "enabled": true,  "createdAt": "2026-08-02T14:45:00Z"}

Удаление записи из allowlist входящих IP-адресов

DELETE/v1/origin/namespaces/{namespaceSlug}/inbound-ip-allowlist/entries/{entryId}
Scopenamespace:settings:writeAuthUser access token

Удаляет запись из allowlist входящих IP-адресов по её ID. Если такого ID нет в списке пространства имён, возвращается 404. Если из применяемого списка удаляется запись, разрешающая собственный адрес вызывающей стороны, возвращается InvalidArgument (HTTP 400). Если вызывающая сторона уже не входит в применяемый список, она получает PermissionDenied (HTTP 403). Тело ответа пустое.

Вызывающая сторона должна использовать учётные данные пользователя Cursor с областью доступа namespace:settings:write. Токены приложений и установок не принимаются.

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

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

Слаг пространства имён.

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

id удаляемой записи.

Поля ответа

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

curl --request DELETE \  --url 'https://api.cursor.com/v1/origin/namespaces/NAMESPACE_SLUG/inbound-ip-allowlist/entries/ENTRY_ID' \  --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN'

Ответ:

204 No Content

Обновление записи allowlist входящих IP-адресов

PATCH/v1/origin/namespaces/{namespaceSlug}/inbound-ip-allowlist/entries/{entryId}
Scopenamespace:settings:writeAuthUser access token

Обновляет запись allowlist входящих IP-адресов по её ID.

Неуказанные поля сохраняют текущие значения, а новый cidr меняет диапазон записи, сохраняя её ID. Если записи с таким ID в пространстве имён нет, возвращается 404, а если cidr уже используется другой записью — AlreadyExists (HTTP 409 Conflict). Если изменение исключит собственный адрес вызывающей стороны из применяемого списка, возвращается InvalidArgument (HTTP 400), а если применяемый список уже исключает вызывающую сторону, она получает PermissionDenied (HTTP 403).

Вызывающая сторона должна использовать учётные данные пользователя Cursor с правом namespace:settings:write. Токены приложений и установок не принимаются.

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

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

Слаг пространства имён.

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

id изменяемой записи.

Тело запроса

cidr строка

Новый CIDR для записи; действуют те же правила, что и для cidr в разделе Добавление записи allowlist входящих IP-адресов. Если не указано, значение не меняется.

description строка

Метка записи, не более 255 символов. Если не указано, значение не меняется.

enabled boolean

Разрешает ли запись доступ со своих адресов. Если не указано, значение не меняется.

Поля ответа

id строка

ID записи, который конечные точки для работы с записями принимают как entryId. Не меняется при изменении CIDR записи.

cidr строка

Адрес IPv4 или IPv6 либо диапазон CIDR в том виде, в котором он был передан.

description строка

Метка записи, не более 255 символов.

enabled boolean

Разрешает ли запись доступ со своих адресов. Отключённая запись остаётся в списке, но не разрешает доступ.

createdAt строка

Метка времени добавления записи в формате RFC 3339.
curl --request PATCH \  --url 'https://api.cursor.com/v1/origin/namespaces/NAMESPACE_SLUG/inbound-ip-allowlist/entries/ENTRY_ID' \  --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN' \  --header 'Content-Type: application/json' \  --data '{  "cidr": "203.0.113.0/25",  "description": "Office, east wing"}'

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

{  "id": "nsip_01k2ja2000e0080000000000c4",  "cidr": "203.0.113.0/25",  "description": "Office, east wing",  "enabled": true,  "createdAt": "2026-08-02T14:45:00Z"}

Замена записей в allowlist входящих IP-адресов

POST/v1/origin/namespaces/{namespaceSlug}/inbound-ip-allowlist/entries:replace
Scopenamespace:settings:writeAuthUser access token

Заменяет записи allowlist пространства имён переданным полным набором и возвращает обновлённый allowlist.

Origin сопоставляет записи по cidr строго в том виде, в каком значение передано, после удаления пробелов в начале и конце. CIDR не нормализуются, поэтому 10.0.0.1/8 и 10.0.0.0/8 — разные записи. Совпавшая запись сохраняет свои id и createdAt и получает переданные description и enabled, новый CIDR добавляется, а хранящаяся запись, которую вы не указали, удаляется. Этот вызов не меняет того, включено ли применение списка; для этого используйте Обновить allowlist входящих IP-адресов. Замена выполняется по принципу «всё или ничего». В ответе сначала идут оставшиеся записи, затем новые — в порядке запроса.

Каждый вызов стоит 10 баллов независимо от количества передаваемых записей. Чтобы управлять большим списком или синхронизировать его из Terraform, отправляйте сюда весь набор сразу, а не делайте отдельный вызов для каждой записи.

Вызывающая сторона должна использовать учётные данные пользователя Cursor с правом namespace:settings:write и правами администратора в пространстве имён. Токены приложений и установок, а также сервисные аккаунты не поддерживаются.

СтатусУсловия
InvalidArgument (HTTP 400)Значение cidr не удаётся разобрать, оно задаёт диапазон /0 или указано дважды с одинаковым написанием после удаления пробелов, description длиннее 255 символов, записей больше 1000, массив entries пуст, а allowEmpty не указан, или новый набор исключил бы ваш собственный адрес из действующего списка. Каждая ошибка возвращается как нарушение поля BadRequest с указанием индекса, например entries[3].
PermissionDenied (HTTP 403)Вызывающая сторона не является администратором пространства имён, использует сервисный аккаунт или уже исключена в соответствии с обязательным списком.
Aborted (HTTP 409 Conflict)etag не совпадает с текущими записями, или записи изменились во время замены. Повторно прочитайте allowlist и повторите попытку.
ResourceExhausted (HTTP 429)Превышено ограничение частоты запросов.

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

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

Слаг пространства имён.

Тело запроса

entries массив

Полный набор записей для списка (не более 1000).

entries[].cidr строка Обязательный

IPv4- или IPv6-адрес либо диапазон CIDR; действуют те же правила, что и для cidr в разделе Добавление записи в allowlist входящих IP-адресов. Хранится в том виде, в котором введено, — без нормализации, только с удалением начальных и конечных пробелов. Каждый вариант написания можно указать только один раз.

entries[].description строка

Метка записи, не более 255 символов.

entries[].enabled логическое значение

Пропускает ли запись трафик с указанных в ней адресов. Если не задано, по умолчанию — true.

etag строка

etag, полученный при предыдущем чтении allowlist. Если параметр задан, а записи с тех пор изменились, вызов возвращает Aborted (HTTP 409 Conflict) и ничего не меняет. Не указывайте его, чтобы полностью заменить текущее содержимое.

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

Задайте значение true, чтобы отправить пустой entries и удалить все записи. Без этого параметра запрос с пустым entries возвращает InvalidArgument (HTTP 400).

Поля ответа

allowlist object

Allowlist после замены в том же формате, что возвращает Get Inbound IP Allowlist: enabled, entries[] и новый etag.

addedCount integer

Записи добавлены.

updatedCount integer

Сохранённые записи, у которых изменилось поле description или enabled.

removedCount integer

Хранившиеся записи, удалённые, так как они отсутствовали в запросе.

unchangedCount integer

Хранящиеся записи, оставленные без изменений. Все четыре счётчика присутствуют всегда, даже если их значение равно 0.
curl --request POST \  --url 'https://api.cursor.com/v1/origin/namespaces/NAMESPACE_SLUG/inbound-ip-allowlist/entries:replace' \  --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN' \  --header 'Content-Type: application/json' \  --data '{  "entries": [    {      "cidr": "203.0.113.0/24",      "description": "Office"    },    {      "cidr": "198.51.100.7",      "description": "VPN egress",      "enabled": false    }  ],  "etag": "8d41e07c2b9f3a65d1c4e8b07a2f9c13"}'

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

{  "allowlist": {    "enabled": true,    "entries": [      {        "id": "nsip_01k2ja2000e0080000000000c4",        "cidr": "203.0.113.0/24",        "description": "Office",        "enabled": true,        "createdAt": "2026-08-02T14:45:00Z"      },      {        "id": "nsip_01k2ja2000e0080000000000c6",        "cidr": "198.51.100.7",        "description": "VPN egress",        "enabled": false,        "createdAt": "2026-08-04T11:20:00Z"      }    ],    "etag": "3f2c9a7b1e5d4c08a6b2f1e9d7c3a5b4"  },  "addedCount": 1,  "updatedCount": 0,  "removedCount": 2,  "unchangedCount": 1}

Метки

Определение метки принадлежит одному репозиторию и идентифицируется по имени. Назначение меток 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 предыдущего ответа. Для первой страницы не указывайте. pageSize в последующем запросе применяется к этой странице; если его не указать, сохранится предыдущий размер страницы.

Поля ответа

labels массив

Страница определений меток, отсортированных по имени.

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/….

version — это последняя пронумерованная ревизия pull request. Origin записывает новую версию при push в head-ветку, при переносе pull request на другую base-ветку, а также при повторном открытии pull request, если head-ветка сдвинулась, пока он был закрыт; у каждой версии есть собственные headSha, baseSha и статистика диффа. Повторное открытие, при котором записывается версия, отправляет pull_request.head_ref.pushed — то же событие, что и push. Самостоятельное продвижение base-ветки ничего не записывает, поэтому version.baseSha (и base.sha, который его отражает) — это вершина base-ветки, определённая на момент записи версии; она может отставать от текущей вершины ветки до записи следующей версии. Получить текущую вершину ветки можно через Get Git Ref.

mergeCommitSha — это коммит, который слияние записало в base-ветку: он задаётся после слияния и отсутствует до него. Предварительный просмотр до слияния — это Git-ссылка pull/{pullNumber}/merge, другой коммит; см. Git data.

version.potentialMergeCommit сообщает о пробном слиянии этой версии в Origin: подготовлено ли оно (prepared), возник ли конфликт (merge_conflict) или его статус пока неизвестен (unknown); указывает вершину base-ветки baseSha, на которой выполнялась попытка слияния, а после подготовки — sha коммита слияния. Эти данные относятся только к данной версии, поэтому они сохраняются и после слияния pull request. Полезная нагрузка вебхуков pull_request.* содержит эти данные на момент события. Ожидание подготовки при отправке события ограничено по времени, поэтому событие может содержать unknown, даже если позднее Get Pull Request возвращает prepared; повторно запросите pull request или дождитесь следующего события.

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 охватывает все пул-реквесты, которые больше не открыты, включая влитые; merged ограничивает выборку влитыми пул-реквестами. При любом другом значении возвращается InvalidArgument (HTTP 400).

pageSize integer

Максимальное количество возвращаемых результатов. По умолчанию — 30; максимум — 100.

pageToken string

Непрозрачный курсор из nextPageToken предыдущего ответа. Не указывайте его для первой страницы. pageSize в последующем запросе применяется к этой странице; если его не указывать, сохранится размер предыдущей страницы.

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) или полностью квалифицированную ссылку (refs/heads/main). Не указывайте, чтобы вывести список по всем базовым веткам.

direction string

Направление сортировки по sortBy. По умолчанию используется "desc": при sortBy=created сначала возвращаются записи, созданные последними, а при sortBy=updated — записи, обновлённые последними. "asc" меняет порядок на противоположный. При любом другом значении возвращается InvalidArgument (HTTP 400).

since string

Необязательная нижняя граница времени создания включительно, заданная в формате RFC 3339, например 2026-08-01T00:00:00Z. Возвращаются только запросы на включение, созданные в указанное время или позже. Некорректная метка времени приводит к ошибке InvalidArgument (HTTP 400).

until string

Необязательная включительная верхняя граница времени создания в том же формате RFC 3339, что и since. Возвращаются только пул-реквесты, созданные в этот момент или ранее. Некорректная метка времени возвращает InvalidArgument (HTTP 400).

sortBy строка

Ключ сортировки. Допустимые значения: created (порядок создания, значение по умолчанию) или updated (время последнего обновления). При любом другом значении возвращается InvalidArgument (HTTP 400).

headSha строка

Необязательный фильтр по коммиту head: полный 40- или 64-символьный шестнадцатеричный SHA ветки head pull request; регистр символов не учитывается. Pull request выбирается, если этот коммит head указан в любой из его сохранённых версий — текущей или заменённой. Чтобы различить их, сравните head.sha в каждом результате. Остальные фильтры по-прежнему применяются, а state по умолчанию равен open, поэтому укажите state=all, чтобы получить объединённые и закрытые pull request. Некорректные, сокращённые и неизвестные SHA не дают совпадений.

stackId строка

Необязательный фильтр стека: идентификатор стека в том виде, в каком он возвращается в pullRequests[].stack.id. Возвращаются только участники этого стека в запрошенном порядке сортировки, а не в порядке стека, поэтому восстанавливайте стек по stack.parentPullRequest каждого участника. По умолчанию state по-прежнему равен open, что исключает влитых участников; передайте state=all, чтобы получить весь стек. Корректно сформированный идентификатор, не соответствующий ни одному стеку в этом репозитории, возвращает пустой список, а любое другое значение возвращает InvalidArgument (HTTP 400).

Поля ответа

pullRequests массив

Страница снимков PullRequest; номера ответов и номера версий — JSON-строки.

pullRequests[].id string

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

pullRequests[].number строка

Номер pull request в локальном репозитории, закодированный как JSON-строка.

pullRequests[].state string

Состояние pull request: открытый или закрытый. Влитые pull request закрыты, а поле merged установлено в true.

pullRequests[].draft логическое значение

Является ли pull request черновиком.

pullRequests[].merged boolean

Был ли pull request влит.

pullRequests[].title string

Заголовок запроса на слияние.

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

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

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; может отображаться у закрытых или объединённых запросов на слияние.

pullRequests[].mergedAt string

Метка времени слияния в формате RFC 3339; может отображаться в объединённых запросах на слияние.

pullRequests[].mergeCommitSha string

SHA коммита, записанного слиянием в базовую ветку. Устанавливается после слияния pull request и отсутствует до этого. Предварительный просмотр перед слиянием — это другой коммит; его можно получить через ссылку pull/<number>/merge с помощью Получить ссылку Git.

pullRequests[].additions integer

Строки, добавленные в текущую версию pull request.

pullRequests[].deletions integer

Удалённые строки в текущей версии pull request.

pullRequests[].changedFiles integer

Количество изменённых файлов в текущей версии pull request.

pullRequests[].labels массив

Метки, назначенные этому запросу на перенос (pull request), отсортированы по имени. Пусто, если ни одна не назначена.

pullRequests[].labels[].id string

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

pullRequests[].labels[].name строка

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

pullRequests[].labels[].color string

Шестизначный шестнадцатеричный цвет без ведущего #.

pullRequests[].labels[].description string

Описание метки. Отсутствует, если у метки нет описания.

pullRequests[].stack object

Принадлежность к стеку: цепочка зависимых pull request, к которой относится этот запрос; каждый следующий запрос основан на предыдущем. Не отображается, если запрос не входит в стек.

pullRequests[].stack.id строка

Стабильный идентификатор стека, общий для всех его участников. Передайте его как stackId в Список пул-реквестов, чтобы получить данные об остальных участниках.

pullRequests[].stack.parentPullRequest object

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

pullRequests[].stack.parentPullRequest.id строка

Идентификатор Stable Origin родительского pull request.

pullRequests[].stack.parentPullRequest.number строка

Локальный в пределах репозитория номер родительского pull request, закодированный как JSON-строка.

pullRequests[].stack.parentPullRequest.repository object

Репозиторий, которому принадлежит родительский объект; содержит те же поля id, name и owner, что и repository у запуска проверки. Стеки никогда не пересекают границы репозиториев, поэтому это всегда репозиторий самого pull request'а.

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.

pullRequests[].version.potentialMergeCommit object

Тестовое слияние Origin для этой версии — коммит, который сливает её headSha с вершиной базовой ветки, — и степень готовности этого слияния. Присутствует в каждой версии. Описывает только эту версию и остаётся доступным для чтения после слияния pull request; это другой коммит, не mergeCommitSha. Для стека pull request базовой веткой служит ветка родительского pull request, поэтому тестовое слияние охватывает только изменения этого pull request поверх неё.

pullRequests[].version.potentialMergeCommit.state строка

Этап подготовки тестового слияния. Допустимые значения: unknown, prepared, merge_conflict. unknown означает, что тестовое слияние не подготовлено: версия ожидает подготовки либо подготовка завершилась по тайм-ауту или с ошибкой. Каждая новая версия получает начальное значение unknown, поэтому никогда не содержит коммит другой версии. prepared означает, что тестовое слияние существует и описывается полями sha и baseSha. merge_conflict означает, что при слиянии headSha с последним коммитом base-ветки, указанным в baseSha, возник конфликт, поэтому тестового слияния нет; именно об этом состоянии Get Pull Request Mergeability сообщает как о блокирующей проблеме merge_conflict, а при повторном открытии pull request подготовка версии запускается снова. Нераспознанное значение следует считать равным unknown.

pullRequests[].version.potentialMergeCommit.sha строка

SHA тестового коммита слияния с двумя родителями: первый родитель — baseSha этого объекта, второй — headSha версии. Присутствует, только если state равен prepared. Пока эта версия остаётся последней, на него указывает ссылка pull/{pullNumber}/merge. После этого его по-прежнему можно прочитать по SHA через Получить коммит, но получить его по SHA через Git нельзя.

pullRequests[].version.potentialMergeCommit.baseSha строка

Последний коммит базовой ветки, с которым Origin выполнил слияние headSha при подготовке этой версии: первый родитель тестового слияния, если state равен prepared, и последний коммит, с которым возник конфликт слияния, если state равен merge_conflict. Отсутствует, если state равен unknown, а также для merge_conflict, зафиксированного до того, как Origin начал возвращать это поле для конфликтов. Может быть новее, чем pullRequests[].version.baseSha; Origin не обновляет его, если базовая ветка лишь продвинулась вперёд.

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": "add-telemetry-schema",        "sha": "3b1f9c2d8a7e6f5049c8b7a6d5e4f3a2b1c0d9e8"      },      "author": {        "user": {          "id": "user_01k2ja2000e0080000000000c3",          "email": "jane@acme.dev"        }      },      "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"        }      ],      "stack": {        "id": "stk_01k2ja2000e0080000000000s1",        "parentPullRequest": {          "id": "pr_01k2ja2000e0080000000000d3",          "number": "16",          "repository": {            "id": "repo_01k2ja2000e0080000000000q4",            "name": "rocket",            "owner": {              "slug": "acme",              "id": "ns_01k2ja2000e0080000000000p3",              "type": "team"            }          }        }      },      "version": {        "number": "3",        "headSha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4",        "baseSha": "3b1f9c2d8a7e6f5049c8b7a6d5e4f3a2b1c0d9e8",        "createdAt": "2026-08-01T09:30:00Z"      }    }  ]}

Получить запрос на слияние

GET/v1/origin/repos/{ownerSlug}/{repoName}/pulls/{pullNumber}
Scoperepository:pull_requests:readAuthInstallation tokenUser access token

Возвращает один pull request вместе с назначенными ему метками.

Закрытые или объединённые запросы на слияние могут также содержать closedAt, mergedAt и mergeCommitSha. Считайте head.ref и base.ref непрозрачными строками ссылок Origin: они могут быть короткими именами веток или полностью квалифицированными значениями refs/heads/….

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

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

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

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

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

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

Поля ответа

id строка

Идентификатор pull request в Stable Origin.

number string

Номер pull request в локальном репозитории, закодированный как JSON-строка.

state string

Состояние запроса на слияние: открыт или закрыт. Слитые запросы на слияние считаются закрытыми, а для параметра merged установлено значение true.

draft boolean

Является ли запрос на вытягивание (pull request) черновиком.

merged boolean

Был ли pull request объединён.

title string

Заголовок запроса на слияние.

body string

Текст описания pull request.

head object

Исходная сторона изменения — то, что добавляется при слиянии.

head.ref string

Ссылка, на которую указывает эта сторона, в том виде, в котором её записывает 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 для последнего обновления запроса на включение изменений.

closedAt строка

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

mergedAt string

Временная метка слияния в формате RFC 3339; может отображаться в объединённых pull request.

mergeCommitSha string

SHA коммита, который слияние записало в базовую ветку. Устанавливается после слияния pull request и отсутствует до него. Предварительный просмотр до слияния — это другой коммит; его можно получить через ref pull/<number>/merge с помощью Получить ссылку Git.

additions integer

Строки, добавленные в текущей версии pull request.

deletions integer

Строки, удалённые в текущей версии pull request.

changedFiles целое число

Количество изменённых файлов в текущей версии pull request.

labels массив

Метки, назначенные этому pull request, отсортированы по имени. Пусто, если меток нет.

labels[].id строка

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

labels[].name строка

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

labels[].color строка

Шестизначный шестнадцатеричный цвет без ведущего символа #.

labels[].description строка

Описание метки. Отсутствует, если у метки нет описания.

stack object

Состав стека: цепочка зависимых запросов на включение изменений, к которой относится этот запрос; каждый следующий основан на предыдущем. Отсутствует, если запрос не входит в стек.

stack.id строка

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

stack.parentPullRequest object

Pull request, поверх которого расположен текущий. Отсутствует у корня стека. Родитель, прошедший слияние, остаётся связанным, пока для дочернего pull request не изменят цель или родителя.

stack.parentPullRequest.id строка

Идентификатор Stable Origin родительского пул-реквеста.

stack.parentPullRequest.number строка

Номер родительского pull request в локальном репозитории, закодированный как JSON-строка.

stack.parentPullRequest.repository object

Репозиторий, которому принадлежит родительский объект, с теми же полями id, name и owner, что и у repository запуска проверки. Стеки никогда не пересекают границы репозиториев, поэтому это всегда репозиторий самого pull request.

version object

Текущая пронумерованная версия pull request и SHA её head- и base-веток.

version.number string

Монотонно возрастающий номер версии pull request, закодированный в виде JSON-строки.

version.headSha строка

SHA коммита, зафиксированный этой версией запроса на включение изменений.

version.baseSha строка

SHA базовой ветки, зафиксированный этой версией pull request.

version.createdAt string

Метка времени создания этой версии pull request в формате RFC 3339.

version.potentialMergeCommit object

Тестовое слияние Origin для этой версии — коммит, в котором её headSha сливается с вершиной базовой ветки, — и состояние его подготовки. Присутствует в каждой версии. Описывает только эту версию и остаётся доступным для чтения после слияния pull request; это не тот же коммит, что mergeCommitSha. Для pull request в стеке базовой веткой служит ветка родительского pull request, поэтому тестовое слияние охватывает только изменения этого pull request поверх неё.

version.potentialMergeCommit.state строка

Состояние подготовки пробного слияния. Допустимые значения: unknown, prepared, merge_conflict. unknown означает, что пробное слияние ещё не подготовлено: версия ожидает подготовки либо подготовка завершилась по тайм-ауту или ошибкой. Каждая новая версия изначально получает значение unknown, поэтому она никогда не наследует коммит другой версии. prepared означает, что пробное слияние создано и описывается полями sha и baseSha. merge_conflict означает, что при слиянии headSha с вершиной базовой ветки, указанной в baseSha, возник конфликт, поэтому пробное слияние отсутствует. Именно это состояние Получить возможность слияния pull request сообщает как о препятствии merge_conflict; повторное открытие pull request запускает подготовку версии заново. Неизвестные значения следует трактовать как unknown.

version.potentialMergeCommit.sha строка

SHA тестового коммита слияния с двумя родительскими коммитами: первый родитель — baseSha этого объекта, а второй — headSha версии. Присутствует только, если state имеет значение prepared. Пока эта версия является последней, ссылка pull/{pullNumber}/merge указывает на этот коммит. После этого его по-прежнему можно прочитать по SHA через Получить коммит, но нельзя получить по SHA через Git.

version.potentialMergeCommit.baseSha строка

Последний коммит базовой ветки, на который Origin слил headSha при подготовке этой версии: первый родительский коммит тестового слияния, если state имеет значение prepared, и коммит, с которым конфликтовало слияние, если state имеет значение merge_conflict. Отсутствует, если state имеет значение unknown, а также при merge_conflict, зафиксированном до того, как Origin начал возвращать это поле для конфликтов. Он может быть новее version.baseSha, и Origin не обновляет его, когда базовая ветка просто продвигается.
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": "add-telemetry-schema",    "sha": "3b1f9c2d8a7e6f5049c8b7a6d5e4f3a2b1c0d9e8"  },  "author": {    "user": {      "id": "user_01k2ja2000e0080000000000c3",      "email": "jane@acme.dev"    }  },  "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"    }  ],  "stack": {    "id": "stk_01k2ja2000e0080000000000s1",    "parentPullRequest": {      "id": "pr_01k2ja2000e0080000000000d3",      "number": "16",      "repository": {        "id": "repo_01k2ja2000e0080000000000q4",        "name": "rocket",        "owner": {          "slug": "acme",          "id": "ns_01k2ja2000e0080000000000p3",          "type": "team"        }      }    }  },  "version": {    "number": "3",    "headSha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4",    "baseSha": "3b1f9c2d8a7e6f5049c8b7a6d5e4f3a2b1c0d9e8",    "createdAt": "2026-08-01T09:30:00Z",    "potentialMergeCommit": {      "state": "prepared",      "sha": "c7b6a5948372615049f8e7d6c5b4a3928170605f",      "baseSha": "5e2d1c0b9a8f7e6d5c4b3a2918070605f4e3d2c1"    }  }}

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

POST/v1/origin/repos/{ownerSlug}/{repoName}/pulls
Scoperepository:pull_requests:writeAuthInstallation tokenUser access token

Создаёт запрос на слияние из head в base.

Необязательный параметр parent_pull_number помещает это изменение поверх другого открытого или чернового запроса на слияние в том же репозитории.

Если 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 или параметр не указан, создать со статусом «открытый» (готовый к проверке).

parentPullRequest object

Необязательный родитель в стеке: другой открытый или черновой pull request в том же репозитории. Укажите ровно один элемент. Пустой селектор, более одного элемента или clear возвращают InvalidArgument (HTTP 400).

parentPullRequest.number string

Номер родительского pull request в репозитории.

parentPullRequest.id строка

ID родительского pull request, возвращённый в id.

Поля ответа

id строка

Идентификатор pull request для Stable Origin.

number string

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

state строка

Состояние pull request: открытый или закрытый. Объединённые pull request закрыты, при этом поле merged установлено в true.

draft boolean

Является ли pull request черновиком.

merged boolean

Был ли pull request объединён.

title строка

Заголовок pull request.

body строка

Текст описания запроса на слияние.

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 для последнего обновления запроса на включение изменений.

closedAt строка

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

mergedAt строка

Временная метка слияния в формате RFC 3339; может отображаться у объединённых запросов на слияние.

mergeCommitSha string

SHA коммита, который операция слияния записала в базовую ветку. Устанавливается после слияния pull request и отсутствует до него. Предварительная версия до слияния — это другой коммит; его можно прочитать через ref pull/<number>/merge с помощью Get Git Ref.

additions integer

Строки, добавленные в текущей версии pull request.

deletions integer

Удалённые строки в текущей версии pull request.

changedFiles integer

Количество изменённых файлов в текущей версии pull request.

labels массив

Метки, назначенные этому запросу на включение изменений, отсортированные по имени. Пусто, если метки не назначены.

labels[].id строка

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

labels[].name string

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

labels[].color string

Шестизначный шестнадцатеричный цвет без ведущего символа #.

labels[].description строка

Описание метки. Отсутствует, если у метки его нет.

stack object

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

stack.id строка

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

stack.parentPullRequest object

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

stack.parentPullRequest.id строка

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

stack.parentPullRequest.number строка

Номер родительского pull request в локальном репозитории, закодированный как JSON-строка.

stack.parentPullRequest.repository object

Репозиторий, которому принадлежит родитель; содержит те же поля id, name и owner, что и repository в запуске проверки. Стеки никогда не пересекают репозитории, поэтому это всегда собственный репозиторий pull request.

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 создания этой версии пул-реквеста.

version.potentialMergeCommit object

Тестовое слияние Origin для этой версии — коммит, который объединяет её headSha с вершиной базовой ветки, а также сведения о ходе его подготовки. Присутствует в каждой версии. Относится только к этой версии и остаётся доступным после слияния pull request; это отдельный коммит, отличный от mergeCommitSha. Для pull request в стеке базовой служит ветка родительского pull request, поэтому тестовое слияние охватывает только изменения этого pull request поверх неё.

version.potentialMergeCommit.state строка

Текущий статус подготовки пробного слияния. Допустимые значения: unknown, prepared, merge_conflict. unknown означает, что пробное слияние ещё не подготовлено: версия ожидает его подготовки либо подготовка завершилась по тайм-ауту или с ошибкой. Каждая новая версия изначально имеет значение unknown, поэтому она не наследует коммит другой версии. prepared означает, что пробное слияние создано и описывается полями sha и baseSha. merge_conflict означает, что при слиянии headSha с вершиной базовой ветки, указанной в baseSha, возник конфликт, поэтому пробного слияния нет; Получение информации о возможности слияния запроса на вытягивание сообщает об этом как о блокирующем условии merge_conflict, а повторное открытие запроса на вытягивание запускает подготовку версии заново. Неизвестное значение следует трактовать как unknown.

version.potentialMergeCommit.sha строка

SHA тестового коммита слияния с двумя родителями: его первый родитель — baseSha этого объекта, а второй — headSha этой версии. Присутствует только при значении prepared поля state. Ссылка pull/{pullNumber}/merge указывает на этот коммит, пока эта версия является последней. После этого коммит по-прежнему доступен по SHA через Get Commit, но его нельзя получить по SHA через Git.

version.potentialMergeCommit.baseSha строка

Последний коммит базовой ветки, с которым Origin сливал headSha при подготовке этой версии: первый родитель тестового слияния, если state имеет значение prepared, или коммит, при слиянии с которым возник конфликт, если state имеет значение merge_conflict. Отсутствует, если state имеет значение unknown, а также для merge_conflict, зафиксированного до того, как Origin начал возвращать это поле для конфликтов. Он может быть новее version.baseSha, и Origin не обновляет его, если базовая ветка просто продвигается вперёд.
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": "jane@acme.dev"    }  },  "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"  }}

Обновить запрос на слияние

PATCH/v1/origin/repos/{ownerSlug}/{repoName}/pulls/{pullNumber}
Scoperepository:pull_requests:writeAuthInstallation tokenUser access token

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

Отсутствующие поля не изменяются. Переданные поля применяются в следующем порядке: метаданные, затем reopen/draft/ready-for-review, затем базовая ветка, затем родительская ветка стека и, наконец, close. Операция close выполняется последней, поэтому при смене целевой ветки в том же запросе изменение всё ещё считается открытым; reopen выполняется до смены базовой ветки, поэтому закрытый pull request можно перенаправить; родительская ветка стека задаётся после базовой, поэтому явно указанный родитель имеет приоритет над родителем, который определяется при смене базовой ветки. Если последующий шаг завершится ошибкой, предыдущие шаги уже могут быть зафиксированы.

Если title длиннее 256 символов или body длиннее 65 536 символов, возвращается InvalidArgument (HTTP 400). Оба ограничения учитывают кодовые точки Unicode.

Чтобы повторно открыть закрытый pull request, установив для state значение "open" или для draft значение false, его исходная ветка должна существовать. Если ветка удалена, запрос возвращает FailedPrecondition (HTTP 400), а pull request остаётся закрытым. Снова отправьте ветку в удалённый репозиторий, затем повторно откройте pull request.

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

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

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

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

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

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

Тело запроса

title string

Новое название. Пропущенные поля остаются без изменений. Максимальная длина: 256 символов.

body string

Новое содержимое / описание. Пустая строка очищает содержимое. Максимальная длина: 65 536 символов.

state строка

"open" или "closed". "closed" закрывает запрос на включение изменений. "open" без draft: true переводит его в состояние готовности к ревью, включая публикацию существующего черновика. Если head запроса на включение изменений изменился, пока он был закрыт, при повторном открытии записывается новая version и отправляется событие pull_request.head_ref.pushed. Состояние Merged нельзя изменить; используйте MergePullRequest.

draft boolean

true помечает pull request как черновик; false — как готовый к проверке (и повторно открывает его, если он закрыт; при этом может быть записана новая version). Игнорируется, когда state равно "closed".

base строка

Новая базовая ветка. Меняет целевую ветку pull request и может обновить связи родительских элементов в стеке, если новая базовая ветка — это ветка head другого изменения (или ветка по умолчанию). Необходимо указать ветку, существующую в репозитории на момент вызова; SHA коммита, имя тега или несуществующая ветка приводят к ошибке InvalidArgument (HTTP 400).

parentPullRequest object

Изменение родителя в стеке. Укажите ровно одно поле: number или id добавляет этот pull request в стек поверх указанного родителя, заменяя текущего родителя, а clear удаляет родителя. Не указывайте это поле, чтобы оставить стек без изменений. Пустой селектор, clear: false или несколько полей приводят к ошибке InvalidArgument (HTTP 400). Это лишь связь: ветки не переписываются, а base меняется только в том случае, если вы укажете и его. Origin применяет это изменение после base, поэтому явно указанный родитель имеет приоритет над родителем, определяемым при смене base.

parentPullRequest.number строка

Номер родительского pull request в репозитории.

parentPullRequest.id строка

ID родительского pull request, возвращаемый в поле id.

parentPullRequest.clear boolean

Удаляет родительский элемент текущего стека. Допускается только значение true.

Поля ответа

id string

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

number строка

Номер пулл-реквеста в пределах репозитория, закодированный как JSON-строка.

state строка

Состояние запроса на слияние: открытый или закрытый. Объединённые запросы на слияние закрыты, а параметр merged установлен в true.

draft boolean

Является ли pull request черновиком.

merged boolean

Объединён ли pull request.

title string

Заголовок pull request.

body string

Тело описания pull request.

head object

Исходная сторона изменения — то, что объединяется.

head.ref строка

Git‑ссылка, на которую указывает эта сторона, согласно записям Origin.

head.sha string

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

base object

Целевая сторона изменения — то, во что оно сливается.

base.ref строка

Ссылка, на которую указывает эта сторона, согласно данным Origin.

base.sha string

SHA коммита на вершине этой стороны в последней версии изменения.

author object

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

author.user object

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

author.user.id string

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

author.user.email string

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

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 string

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

closedAt строка

Временная метка закрытия в формате RFC 3339; может присутствовать у закрытых или объединённых pull request'ов.

mergedAt string

Временная метка слияния в формате RFC 3339; может появляться в объединённых pull request.

mergeCommitSha string

SHA коммита, который слияние записало в базовую ветку. Устанавливается после слияния запроса на слияние и отсутствует до этого. Предварительный просмотр перед слиянием — это другой коммит; его можно получить через ссылку pull/<number>/merge с помощью Получить ссылку Git.

additions integer

Строки, добавленные в текущей версии pull request.

deletions integer

Удалённые строки в текущей версии pull request.

changedFiles integer

Количество изменённых файлов в текущей версии pull request.

labels массив

Метки, назначенные этому запросу на слияние, отсортированные по имени. Пусто, если метки не назначены.

labels[].id string

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

labels[].name string

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

labels[].color string

Шестизначный шестнадцатеричный цвет без ведущего символа #.

labels[].description строка

Описание метки. Отсутствует, если у метки нет описания.

stack object

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

stack.id строка

Стабильный идентификатор стека, общий для всех участников стека. Передайте его как stackId в List Pull Requests, чтобы получить остальные элементы стека.

stack.parentPullRequest object

Pull request, на котором основан этот. У корневого pull request в стеке отсутствует. Ссылка на объединённый родительский pull request сохраняется, пока для дочернего не будет изменена целевая ветка или он не будет переназначен другому родителю.

stack.parentPullRequest.id string

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

stack.parentPullRequest.number строка

Номер родительского pull request в пределах репозитория, закодированный как JSON-строка.

stack.parentPullRequest.repository object

Репозиторий, которому принадлежит родительский объект; содержит те же поля id, name и owner, что и repository у запуска проверки. Стеки никогда не пересекают границы репозиториев, поэтому это всегда собственный репозиторий пул-реквеста.

version object

Текущая пронумерованная версия pull request и SHA его head- и base-веток.

version.number строка

Монотонно возрастающий номер версии pull request, закодированный как строка JSON.

version.headSha строка

SHA коммита, зафиксированный этой версией pull request.

version.baseSha string

Базовый SHA, зафиксированный этой версией pull request.

version.createdAt string

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

version.potentialMergeCommit object

Тестовое слияние этой версии в Origin — коммит, который вливает её headSha в последний коммит base-ветки, — и то, насколько продвинулась его подготовка. Присутствует в каждой версии. Относится только к этой версии и остаётся доступным для чтения после слияния pull request; это другой коммит, не mergeCommitSha. Для pull request в стеке base-веткой служит ветка родителя, поэтому тестовое слияние охватывает только изменения этого pull request поверх неё.

version.potentialMergeCommit.state строка

Насколько продвинулась подготовка тестового слияния. Допустимые значения: unknown, prepared, merge_conflict. unknown означает, что тестовое слияние не подготовлено: версия ожидает подготовки либо подготовка прервана по тайм-ауту или завершилась с ошибкой. Каждая новая версия изначально имеет значение unknown, поэтому никогда не содержит коммит другой версии. prepared означает, что тестовое слияние существует и его описывают sha и baseSha. merge_conflict означает, что при слиянии headSha с вершиной базовой ветки, указанной в baseSha, возник конфликт, поэтому тестового слияния нет; именно это состояние Get Pull Request Mergeability сообщает как блокирующую проблему merge_conflict, а при повторном открытии pull request версия подготавливается заново. Нераспознанное значение следует считать unknown.

version.potentialMergeCommit.sha строка

SHA тестового коммита слияния с двумя родителями: первый родитель — baseSha этого объекта, второй — headSha версии. Присутствует, только когда state равно prepared. Пока эта версия остаётся последней, на этот коммит указывает Git-ссылка pull/{pullNumber}/merge. После этого его по-прежнему можно прочитать по SHA через Получить коммит, но получить его по SHA через Git уже нельзя.

version.potentialMergeCommit.baseSha строка

Последний коммит базовой ветки, на который Origin сливал headSha при подготовке этой версии: первый родитель тестового коммита слияния, если state равно prepared, и коммит на вершине ветки, с которым возник конфликт при слиянии, если state равно merge_conflict. Отсутствует, если state равно unknown, а также для конфликтов merge_conflict, зарегистрированных до того, как Origin начал сообщать это поле для конфликтов. Может быть новее, чем version.baseSha; если базовая ветка просто продвинулась вперёд, Origin не обновляет это значение.
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": "jane@acme.dev"    }  },  "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"  }}

Список комментариев к пул-реквесту

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 integer

Максимальное количество возвращаемых комментариев. По умолчанию 30; максимум 100.

pageToken строка

Непрозрачный курсор из nextPageToken предыдущего ответа. Для первой страницы не указывайте. pageSize в follow-up-запросе задаёт размер этой страницы; не указывайте его, чтобы сохранить прежний размер страницы.

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.path строка

Путь к файлу, к которому привязан якорь diff треда. Пусто для тредов общего обсуждения.

comments[].thread.side строка

Сторона отличий (diff), к которой привязан якорь. Допустимые значения: left, right. Не задано для веток общего обсуждения.

comments[].thread.startLine integer

Первая строка закреплённого диапазона в версии файла side. 0 — для веток уровня файла и общих обсуждений.

comments[].thread.endLine integer

Последняя строка якорного диапазона (включительно). 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 object

Ссылка на контейнер репозитория для 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"        },        "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": "jane@acme.dev"        }      },      "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

Версия запроса на слияние, к которой относится обсуждение, включая SHA-коды ветвей head и base. Якорь привязан к этой версии и не перемещается при появлении новых версий запроса на слияние.

thread.version.number string

Монотонно возрастающий номер версии pull request, закодированный в виде JSON-строки.

thread.version.headSha string

SHA коммита head-ветки, зафиксированный в этой версии pull request.

thread.version.baseSha string

Базовый SHA, зафиксированный этой версией 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"    },    "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": "jane@acme.dev"    }  },  "createdAt": "2026-08-01T09:30:00Z",  "updatedAt": "2026-08-02T14:45:00Z"}

Удалить комментарий к pull request

DELETE/v1/origin/repos/{ownerSlug}/{repoName}/pulls/comments/{commentId}
Scoperepository:pull_requests:reviews:writeAuthInstallation tokenUser access token

Удаляет комментарий к pull request по его стабильному идентификатору Origin. Тело ответа пустое.

Автор комментария всегда может удалить его. Любой другой вызывающий должен иметь право на запись в репозиторий, которое предоставляет repository:contents:write; в противном случае возвращается PermissionDenied (HTTP 403). При удалении последнего комментария в треде удаляется и тред; при удалении любого другого комментария, включая начальный, тред и оставшиеся комментарии сохраняются. Разрешён ли тред, значения не имеет. Реакции на комментарий и история его изменений удаляются вместе с ним.

Неизвестный идентификатор, уже удалённый комментарий и комментарий из другого репозитория возвращают 404. Некорректный идентификатор возвращает InvalidArgument (HTTP 400).

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

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

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

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

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

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

Поля ответа

Тело ответа пустое.

curl --request DELETE \  --url 'https://api.cursor.com/v1/origin/repos/OWNER_SLUG/REPO_NAME/pulls/comments/COMMENT_ID' \  --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN'

Ответ:

204 No Content

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

POST/v1/origin/repos/{ownerSlug}/{repoName}/pulls/{pullNumber}/comments
Scoperepository:pull_requests:reviews:writeAuthInstallation tokenUser access token

Создаёт комментарий к запросу на слияние Origin. Комментарий относится ровно к одному из четырёх вариантов: threadId отвечает в существующей ветке обсуждения — как общего, так и встроенного в код; inline создаёт новую ветку обсуждения, привязанную к диапазону строк в диффе версии запроса на слияние; file создаёт новую ветку обсуждения для всего файла в этом диффе; если не указано ни одно из этих значений, создаётся новая ветка общего обсуждения. Тела комментариев длиной более 65 536 символов отклоняются с ошибкой InvalidArgument (HTTP 400).

Якорь inline должен ссылаться на дифф версии. path должен входить в этот дифф, а на указанной стороне (side) должно быть содержимое, поэтому попытка привязать left к добавленному файлу или right к удалённому файлу приводит к ошибке InvalidArgument (HTTP 400). Якорем может быть любая строка изменённого файла, а диапазон не ограничен фрагментами диффа. Диапазон должен укладываться в файл на привязанной стороне: left считывает содержимое базового коммита, а right — головного коммита. Если диапазон выходит за последнюю строку, возвращается ошибка 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 — актуальная версия файла.

inline.startLine целое число Обязательно

Первая (считая с 1) строка привязанного диапазона в версии файла «side». Диапазон не должен выходить за конец этого файла.

inline.endLine целое число

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

file object

Якорь для новой ветки обсуждения на уровне файла, относящейся ко всему файлу в diff версии pull request. Нельзя использовать вместе с threadId или inline.

file.path string Обязательно

Путь к файлу в diff-версии pull request: для удаления — удалённый путь, в других случаях — путь в head-версии.

versionNumber string

Номер версии pull request, к которой привязать новый тред. 0 или отсутствие значения означает последнюю версию на момент вызова. Имеет значение только для новых тредов.

Поля ответа

id string

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

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.path строка

Путь к файлу, к которому привязан diff-якорь треда. Пусто для тредов общего обсуждения.

thread.side string

Сторона якоря для diff. Допустимые значения: left, right. Не задано для веток общего обсуждения.

thread.startLine integer

Первая строка привязанного диапазона в версии файла 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"    },    "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": "jane@acme.dev"    }  },  "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

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

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.path строка

Путь к файлу якоря diff треда. Пуст для тредов общего обсуждения.

thread.side строка

Сторона привязки для диффа. Допустимые значения: left, right. Не задано для тредов общего обсуждения.

thread.startLine integer

Первая строка закреплённого диапазона в версии файла side. 0 — для тредов на уровне файла и общих обсуждений.

thread.endLine integer

Включаемая последняя строка привязанного диапазона. 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"    },    "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": "jane@acme.dev"    }  },  "createdAt": "2026-08-01T09:30:00Z",  "updatedAt": "2026-08-02T14:45:00Z"}

Обновление обсуждения запроса на слияние

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.

path string

Путь к файлу, к которому привязан дифф треда. Пусто для тредов общего обсуждения.

side string

Сторона диффа, к которой привязан якорь. Допустимые значения: left, right. Не задаётся для тредов общего обсуждения.

startLine integer

Первая строка закреплённого диапазона в версии файла side. 0 — для тредов уровня файла и общих обсуждений.

endLine integer

Последняя строка закреплённого диапазона (включительно). 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"  },  "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 и курсор коммитов; токен, который больше не соответствует текущим head или base, возвращает 400.

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

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

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

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

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

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

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

pageSize целое число

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

pageToken string

Непрозрачный курсор из next_page_token предыдущего ответа. Пустой для первой страницы. Токен привязан к репозиторию, версии pull request и смещению коммита. pageSize в последующем запросе применяется к этой странице; не указывайте его, чтобы сохранить прежний размер страницы.

Поля ответа

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": "jane@acme.dev",          "date": "2026-08-01T09:30:00Z"        },        "committer": {          "name": "Jane Doe",          "email": "jane@acme.dev",          "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 и курсор файла; токен, который больше не соответствует текущей head-ветке или base-ветке, возвращает 400.

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

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

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

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

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

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

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

pageSize integer

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

pageToken string

Непрозрачный курсор из поля next_page_token предыдущего ответа. Для первой страницы он пуст. Токен привязан к репозиторию, версии pull request и курсору изменённых файлов. pageSize в последующем запросе задаёт размер этой страницы; не указывайте его, чтобы сохранить прежний размер страницы.

Поля ответа

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

Слияние запроса на включение изменений

POST/v1/origin/repos/{ownerSlug}/{repoName}/pulls/{pullNumber}/merge
Scoperepository:contents:writeAuthInstallation tokenUser access token

Выполняет слияние pull request с его базовой веткой.

Для pull request в стеке сливает весь префикс от корневого до целевого, заканчивающийся этим номером pull request, а не только этот pull request. Поддерживается только в нативных репозиториях Origin; зеркальные репозитории не поддерживаются.

При слиянии в базовую ветку попадает head-коммит последней version pull request. Если head-ветка продвинулась дальше этого коммита, например из-за отправки изменений, которую Origin ещё не зарегистрировал как новую версию, запрос возвращает Aborted (HTTP 409 Conflict) — тот же ответ, что и при устаревшем expectedHeadSha; слияние не выполняется. Повторите попытку после того, как Get Pull Request сообщит о новом head в version.headSha.

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

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

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

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

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

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

Номер pull request для слияния. Если этот pull request находится в стеке, при слиянии будут влиты все pull request от корня стека до этого номера.

Тело запроса

expectedHeadSha строка

Не допускайте слияния версии head, которую ваше приложение ещё не видело: укажите полный SHA коммита (40 или 64 шестнадцатеричных символа), соответствующий текущей версии head запроса на слияние. Если версия head изменилась, слияние отклоняется с ошибкой ABORTED (HTTP 409 Conflict), и слияние не выполняется. Значения, не являющиеся полным SHA коммита, отклоняются с ошибкой InvalidArgument (HTTP 400). Не указывайте это значение, чтобы выполнить слияние с текущей версией head. Проверка не выполняется, если запрос на слияние уже слит; в этом случае возвращается успешный идемпотентный ответ.

mergeMethod строка

Способ слияния pull request. Допустимые значения: merge, который создаёт merge-коммит, и squash, который создаёт один squash-коммит. Если репозиторий не разрешает выбранный способ, запрос отклоняется с ошибкой FailedPrecondition (HTTP 400), а любое другое значение — с ошибкой InvalidArgument (HTTP 400). Не указывайте этот параметр, чтобы использовать значение по умолчанию для репозитория: merge-коммит, если репозиторий разрешает слияние таким способом, иначе squash-коммит; если базовая ветка требует линейной истории, используется squash-коммит.

Поля ответа

mergeCommitSha string

SHA коммита, который слияние записало в базовую ветку. Предварительный просмотр до слияния — это другой коммит; его можно получить через ссылку pull/<number>/merge с помощью Get Git Ref.

mergedPullNumbers массив

Номера pull request в формате JSON, объединённые от корня стека до целевого элемента.

pullRequest object

Целевой PullRequest после слияния; объявленный тип ответа — полный ресурс, хотя пример приведён в сокращённом виде.

pullRequest.id строка

Идентификатор пул-реквеста Stable Origin.

pullRequest.number строка

Номер pull request в репозитории, закодированный в виде JSON-строки.

pullRequest.state строка

Состояние pull request: открыт или закрыт. Смерженные pull request закрыты, при этом для merged установлено значение true.

pullRequest.draft boolean

Является ли pull request черновиком.

pullRequest.merged boolean

Был ли запрос на слияние объединён.

pullRequest.title string

Заголовок запроса на слияние.

pullRequest.body string

Основной текст описания пул-реквеста.

pullRequest.head object

Исходная сторона изменения — то, что в него сливается.

pullRequest.head.ref string

Ссылка, на которую указывает эта сторона, в том виде, в котором её фиксирует Origin.

pullRequest.head.sha строка

SHA последнего коммита этой стороны в последней версии изменения.

pullRequest.base object

Целевая сторона изменения — то, с чем оно объединяется.

pullRequest.base.ref строка

Ссылка, на которую указывает эта сторона, в том виде, в котором её фиксирует Origin.

pullRequest.base.sha строка

SHA последнего коммита этой стороны в последней версии изменения.

pullRequest.author object

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

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 для последнего обновления запроса на включение изменений.

pullRequest.closedAt строка

Временная отметка закрытия в формате RFC 3339; может встречаться в закрытых или объединённых пул-реквестах.

pullRequest.mergedAt string

Временная метка слияния в формате RFC 3339; может отображаться в объединённых pull request.

pullRequest.mergeCommitSha string

SHA коммита, записанного слиянием в базовую ветку. Задаётся после слияния pull request и до этого отсутствует. Предварительный просмотр перед слиянием — это другой коммит, доступный через ссылку pull/<number>/merge с помощью Получить ссылку Git.

pullRequest.additions integer

Добавленные строки в текущей версии pull request.

pullRequest.deletions integer

Удалённые строки в текущей версии запроса на слияние.

pullRequest.changedFiles integer

Количество изменённых файлов в текущей версии пул-реквеста.

pullRequest.labels массив

Метки, назначенные этому пул-реквесту, отсортированы по имени. Пусто, если метки не назначены.

pullRequest.labels[].id string

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

pullRequest.labels[].name строка

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

pullRequest.labels[].color string

Шестизначный шестнадцатеричный цвет без ведущего #.

pullRequest.labels[].description string

Описание метки. Отсутствует, если у метки нет описания.

pullRequest.stack object

Участие в стеке: цепочка зависимых pull request'ов, к которой принадлежит этот pull request — каждый из них основан на предыдущем. Отсутствует, если pull request не является частью стека.

pullRequest.stack.id строка

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

pullRequest.stack.parentPullRequest object

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

pullRequest.stack.parentPullRequest.id строка

Идентификатор Stable Origin родительского запроса на слияние.

pullRequest.stack.parentPullRequest.number строка

Номер родительского pull request в репозитории, закодированный как JSON-строка.

pullRequest.stack.parentPullRequest.repository object

Репозиторий, которому принадлежит родительский объект. Он содержит те же поля id, name и owner, что и repository запуска проверки. Стеки никогда не пересекают границы репозиториев, поэтому это всегда репозиторий самого запроса на слияние.

pullRequest.version object

Текущая версия pull request с номером и SHA его head/base.

pullRequest.version.number string

Монотонно возрастающий номер версии pull request, закодированный в виде JSON-строки.

pullRequest.version.headSha string

Хеш HEAD-коммита, зафиксированный в этой версии pull request.

pullRequest.version.baseSha строка

SHA базовой версии, зафиксированный этим pull request.

pullRequest.version.createdAt строка

Метка времени RFC 3339 для создания этой версии pull request.

pullRequest.version.potentialMergeCommit object

Тестовое слияние Origin для этой версии — коммит, который объединяет её headSha с вершиной базовой ветки, — и информация о ходе его подготовки. Присутствует в каждой версии. Описывает только эту версию и остаётся доступным для чтения после слияния pull request; это другой коммит, не mergeCommitSha. Для составного pull request базовой веткой служит ветка родительского pull request, поэтому тестовое слияние охватывает только изменения этого pull request поверх неё.

pullRequest.version.potentialMergeCommit.state строка

Степень готовности пробного слияния. Допустимые значения: unknown, prepared, merge_conflict. unknown означает, что пробное слияние не подготовлено: версия ожидает подготовки либо подготовка завершилась по тайм-ауту или ошибкой. Каждая новая версия изначально получает значение unknown, поэтому она никогда не наследует коммит другой версии. prepared означает, что пробное слияние создано и описывается полями sha и baseSha. merge_conflict означает, что при слиянии headSha с вершиной базовой ветки, указанной в baseSha, возник конфликт, поэтому пробного слияния нет; именно такое состояние Проверка возможности слияния pull request сообщает как блокирующее условие merge_conflict, а повторное открытие pull request запускает подготовку версии заново. Неизвестное значение следует считать значением unknown.

pullRequest.version.potentialMergeCommit.sha строка

SHA тестового коммита слияния с двумя родителями: его первый родитель — baseSha этого объекта, а второй — headSha версии. Присутствует только, когда state равен prepared. Ссылка pull/{pullNumber}/merge указывает на него, пока эта версия является последней. После этого коммит по-прежнему можно прочитать по SHA с помощью Get Commit, но получить его по SHA через Git нельзя.

pullRequest.version.potentialMergeCommit.baseSha строка

Последний коммит базовой ветки, на который Origin слил headSha при подготовке этой версии: первый родитель тестового слияния, если state имеет значение prepared, и последний коммит, с которым возник конфликт при слиянии, если state имеет значение merge_conflict. Отсутствует, если state имеет значение unknown, а также для конфликтов merge_conflict, зафиксированных до того, как Origin начал сообщать это поле для конфликтов. Он может быть новее pullRequest.version.baseSha; Origin не обновляет его, когда базовая ветка просто продвигается.
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": "jane@acme.dev"      }    },    "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": "jane@acme.dev"    }  ],  "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": "jane@acme.dev"    }  ],  "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 integer

Максимальное количество возвращаемых отзывов. По умолчанию — 30; максимум — 100.

pageToken строка

Непрозрачный курсор из nextPageToken предыдущего ответа. Не указывайте его для первой страницы. pageSize в follow-up-запросе задаёт размер этой страницы; не указывайте его, чтобы сохранить прежний размер страницы.

Поля ответа

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[].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 object

Ссылка на контейнер репозитория для 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": "jane@acme.dev"        }      },      "verdict": "approve",      "body": "Approving. The telemetry schema matches the spec.",      "submittedAt": "2026-08-02T15:00:00Z",      "pullRequestVersion": {        "number": "3",        "headSha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4",        "baseSha": "3b1f9c2d8a7e6f5049c8b7a6d5e4f3a2b1c0d9e8"      }    }  ],  "pullRequest": {    "id": "pr_01k2ja2000e0080000000000d4",    "number": "17",    "repository": {      "id": "repo_01k2ja2000e0080000000000q4",      "name": "rocket",      "owner": {        "slug": "acme",        "id": "ns_01k2ja2000e0080000000000p3",        "type": "team"      }    }  }}

Создать обзор запроса на слияние

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), и ничего не публикуется. Комментарии становятся видимыми одновременно с ревью: до его отправки ни комментарии, ни события не видны. После отправки каждый комментарий порождает отдельный вебхук 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

Якорь diff для нового inline-треда в diff проверяемой версии. Та же структура и правила валидации, что и у 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.

dismissal object

Появляется после отклонения отзыва; отклонённые отзывы остаются видимыми в списках.

dismissal.dismissedBy object

Публичный субъект, отклонивший ревью, если он раскрывается.

dismissal.dismissedBy.user object

Пользовательский вариант исполнителя. Устанавливается, если действие выполнил пользователь.

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": "jane@acme.dev"    }  },  "verdict": "approve",  "body": "Approving. The telemetry schema matches the spec.",  "submittedAt": "2026-08-02T15:00:00Z",  "pullRequestVersion": {    "number": "3",    "headSha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4",    "baseSha": "3b1f9c2d8a7e6f5049c8b7a6d5e4f3a2b1c0d9e8"  }}

Обновление проверки 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.

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": "jane@acme.dev"    }  },  "verdict": "approve",  "body": "Одобрено. Схема телеметрии соответствует спецификации.",  "submittedAt": "2026-08-02T15:00:00Z",  "pullRequestVersion": {    "number": "3",    "headSha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4",    "baseSha": "3b1f9c2d8a7e6f5049c8b7a6d5e4f3a2b1c0d9e8"  }}

Отклонить обзор запроса на внесение изменений

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.

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": "jane@acme.dev"    }  },  "verdict": "approve",  "body": "Approving. The telemetry schema matches the spec.",  "submittedAt": "2026-08-02T15:00:00Z",  "pullRequestVersion": {    "number": "3",    "headSha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4",    "baseSha": "3b1f9c2d8a7e6f5049c8b7a6d5e4f3a2b1c0d9e8"  },  "dismissal": {    "dismissedBy": {      "user": {        "id": "user_01k2ja2000e0080000000000c3",        "email": "jane@acme.dev"      }    },    "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

Возвращает список всех наборов правил, настроенных для репозитория.

Наборы правил для каждого репозитория ограничены по объёму конфигурации, поэтому полный список возвращается в одном ответе, а эта конечная точка не поддерживает постраничную выдачу. 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

Тип правила. Набор правил merge_branch поддерживает pull_request, require_status_checks и require_branch_up_to_date. Набор правил push_branch, push_tag или push_repository поддерживает deletion, non_fast_forward, block_direct_updates, block_merges, ref_name_pattern и required_linear_history.

rulesets[].rules[].parameters object

Параметры для конкретного типа в виде объекта JSON. Структура зависит от 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). Каждый тип правила выполняется только в одном типе набора правил: набор правил merge_branch принимает только типы правил слияния pull_request, require_status_checks и require_branch_up_to_date, а набор правил push_branch, push_tag или push_repository принимает только типы правил, применяемые при отправке изменений: deletion, non_fast_forward, block_direct_updates, block_merges, ref_name_pattern и required_linear_history. Если тип правила не поддерживается в наборе правил с kind, указанным для него, возвращается ошибка InvalidArgument (HTTP 400).

rules[].ruleType string Обязательно

Тип правила. Набор правил merge_branch принимает pull_request, require_status_checks и require_branch_up_to_date. Набор правил push_branch, push_tag или push_repository принимает deletion, non_fast_forward, block_direct_updates, block_merges, ref_name_pattern и required_linear_history. Любое другое значение, а также тип, недопустимый для значения kind набора правил, отклоняется с ошибкой InvalidArgument (HTTP 400).

rules[].parameters object

Параметры, специфичные для типа, в виде JSON-объекта. Структура зависит от rules[].ruleType, неизвестные ключи отклоняются. require_branch_up_to_date, deletion, non_fast_forward, block_merges и required_linear_history не принимают параметров: передайте {} или опустите parameters. Параметры pull_request также принимаются в формате snake_case, например required_approving_review_count; если переданы оба варианта, приоритет имеет ключ в camelCase.

rules[].parameters.requiredApprovingReviewCount integer

Для правил pull_request: число одобряющих ревью, необходимых для pull request, — от 0 до 50. По умолчанию — 1.

rules[].parameters.requireCodeOwnerReview логическое значение

Для правил pull_request: если true, каждый изменённый путь, у которого есть владельцы кода, должен быть дополнительно одобрен одним из своих владельцев. По умолчанию — false.

rules[].parameters.dismissStaleReviewsOnPush логическое значение

Для правил pull_request: пока не поддерживается. При значении true проверка правила завершается неудачей для каждого pull request, к которому оно применяется. По умолчанию — false.

rules[].parameters.requireLastPushApproval логическое значение

Для правил pull_request: пока не поддерживается. При значении true правило не проходит ни для одного pull request, к которому оно применяется. По умолчанию — false.

rules[].parameters.requiredReviewThreadResolution boolean

Для правил pull_request пока не поддерживается. При значении true правило не проходит для всех pull request, к которым оно применяется. По умолчанию — false.

rules[].parameters.requiredChecks массив

Для правил require_status_checks (где поле обязательно): проверки, которые должны успешно пройти на head-коммите pull request до его слияния. Пустой список означает отсутствие требований. Записи с повторяющимся сочетанием actorKind, actorId, groupKey и runKey отклоняются. Проверка определяется инициатором действия, который сообщает её результат, и ключами, под которыми он это делает, а не отображаемым именем или строкой контекста; каждое значение должно быть непустой строкой.

rules[].parameters.requiredChecks[].actorKind строка

Тип инициатора действия (actor) набора проверок: app, service_account или user. Обязательно в каждой записи.

rules[].parameters.requiredChecks[].actorId строка

Идентификатор инициатора действия точно в том виде, в каком его возвращает поле actor набора проверок, например app_…, sa_… или user_…. Голый UUID или идентификатор, содержащий |, отклоняется. Идентификатор, не соответствующий ни одному инициатору действия, принимается, но ни с чем не совпадает, поэтому проверка считается отсутствующей. Обязателен в каждой записи.

rules[].parameters.requiredChecks[].groupKey строка

Значение key набора проверок, которое передаёт инициатор действия. Обязательно в каждой записи.

rules[].parameters.requiredChecks[].runKey строка

Ключ (key) запуска проверки в этом наборе проверок. Если ключ задан, успешно должен пройти только последний запуск с этим ключом; если не указан — все запуски в наборе. Запуск считается успешным, если он завершается со статусом success, neutral или skipped.

rules[].parameters.requiredChecks[].name строка

Метка, которая отображается в блокировщиках слияния для этой проверки вместо actorKind/actorId/groupKey[/runKey]. При сопоставлении не учитывается.

rules[].parameters.blockDirectUpdates логическое значение

Для правил block_direct_updates: при значении true целевую Git-ссылку можно создать или обновить только через слияние pull request. При значении false правило не действует. По умолчанию — true.

rules[].parameters.pattern строка

Для правил ref_name_pattern, где это поле обязательно: регулярное выражение RE2 длиной от 1 до 1024 символов. Имя создаваемой или обновляемой ветки или тега (без refs/heads/ или refs/tags/) должно соответствовать этому выражению. Учитывается совпадение в любой части имени; чтобы шаблон проверялся по всему имени, добавьте якоря ^ и $.

rules[].parameters.negate логическое значение

Для правил ref_name_pattern: при значении true имя не должно соответствовать pattern. По умолчанию — false.

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 строка

Стабильный идентификатор происхождения для этого правила.

rules[].ruleType string

Тип правила. Набор правил merge_branch принимает pull_request, require_status_checks и require_branch_up_to_date. Набор правил push_branch, push_tag или push_repository принимает deletion, non_fast_forward, block_direct_updates, block_merges, ref_name_pattern и required_linear_history.

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

Тип правила. Набор правил merge_branch поддерживает pull_request, require_status_checks и require_branch_up_to_date. Набор правил push_branch, push_tag или push_repository поддерживает deletion, non_fast_forward, block_direct_updates, block_merges, ref_name_pattern и required_linear_history.

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). Каждый тип правила применяется только в одном виде набора правил: набор merge_branch допускает только типы правил слияния pull_request, require_status_checks и require_branch_up_to_date, а набор push_branch, push_tag или push_repository — только типы правил отправки изменений deletion, non_fast_forward, block_direct_updates, block_merges, ref_name_pattern и required_linear_history. Если тип правила не поддерживается для kind набора правил, возвращается ошибка InvalidArgument (HTTP 400).

rules[].ruleType строка Обязательно

Тип правила. Набор правил merge_branch допускает pull_request, require_status_checks и require_branch_up_to_date. Набор правил push_branch, push_tag или push_repository допускает deletion, non_fast_forward, block_direct_updates, block_merges, ref_name_pattern и required_linear_history. Любое другое значение, а также тип, недопустимый для kind набора правил, отклоняется с ошибкой InvalidArgument (HTTP 400).

rules[].parameters object

Параметры для конкретного типа в виде JSON-объекта. Структура зависит от rules[].ruleType, а неизвестные ключи отклоняются. require_branch_up_to_date, deletion, non_fast_forward, block_merges и required_linear_history не принимают параметров: отправьте {} или не указывайте parameters. Параметры pull_request также принимаются в формате snake_case, например required_approving_review_count; если переданы оба варианта, приоритет имеет ключ в формате camelCase.

rules[].parameters.requiredApprovingReviewCount integer

Для правил pull_request: сколько одобряющих ревью нужно для pull request, от 0 до 50. По умолчанию — 1.

rules[].parameters.requireCodeOwnerReview логическое значение

Для правил pull_request: если true, каждый изменённый путь, у которого есть владельцы кода, должен дополнительно получить одобрение одного из своих владельцев. Значение по умолчанию — false.

rules[].parameters.dismissStaleReviewsOnPush логическое значение

Для правил pull_request: пока не поддерживается. При значении true правило не проходит ни для одного pull request, к которому применяется. По умолчанию — false.

rules[].parameters.requireLastPushApproval логическое значение

Для правил pull_request: пока не поддерживается. При значении true правило не проходит для каждого pull request, к которому оно применяется. По умолчанию — false.

rules[].parameters.requiredReviewThreadResolution логическое значение

Для правил pull_request пока не поддерживается. Значение true приводит к сбою правила для каждого pull request, к которому оно применяется. По умолчанию — false.

rules[].parameters.requiredChecks массив

Для правил require_status_checks, если они обязательны: проверки, которые должны успешно пройти все до слияния pull request, на его head-коммите. Пустой список не предъявляет никаких требований. Записи с одинаковой комбинацией actorKind, actorId, groupKey и runKey отклоняются. Проверка определяется субъектом, который сообщает о ней, и ключами, под которыми он её сообщает, а не отображаемым именем или строкой контекста. Каждое значение должно быть непустой строкой.

rules[].parameters.requiredChecks[].actorKind строка

Тип инициатора действия (actor) набора проверок: app, service_account или user. Обязателен в каждой записи.

rules[].parameters.requiredChecks[].actorId строка

Идентификатор инициатора действия точно в том виде, в каком его указывает поле actor набора проверок, например app_…, sa_… или user_…. Голый UUID (без префикса) или идентификатор, содержащий |, отклоняется. Идентификатор, не указывающий ни на одного инициатора действия, принимается, но ни с чем не совпадает, поэтому проверка считается отсутствующей. Обязательное поле в каждой записи.

rules[].parameters.requiredChecks[].groupKey строка

Значение key набора проверок, которое передаёт инициатор действия. Обязательно в каждой записи.

rules[].parameters.requiredChecks[].runKey строка

key запуска проверки в этом наборе проверок. Если ключ задан, успешно должен пройти только последний запуск с этим ключом; если не указан — все запуски в наборе проверок. Запуск считается успешным, если завершается со статусом success, neutral или skipped.

rules[].parameters.requiredChecks[].name строка

Метка, которая отображается в блокерах слияния для этой проверки вместо actorKind/actorId/groupKey[/runKey]. При сопоставлении не учитывается.

rules[].parameters.blockDirectUpdates логическое значение

Для правил block_direct_updates: при значении true целевую Git-ссылку можно создать или обновить только через слияние pull request. При значении false правило не действует. Значение по умолчанию — true.

rules[].parameters.pattern строка

Для правил ref_name_pattern, где это поле обязательно: регулярное выражение RE2 длиной от 1 до 1024 символов. Ему должно соответствовать имя создаваемой или обновляемой ветки или тега без префикса refs/heads/ или refs/tags/. Засчитывается совпадение в любой части имени; чтобы проверять имя целиком, добавьте в шаблон якоря ^ и $.

rules[].parameters.negate логическое значение

Для правил ref_name_pattern: если true, имя не должно соответствовать pattern. По умолчанию — false.

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 массив

Шаблоны имён ссылок, включённые в этот набор правил. Поддерживаются glob-шаблоны и токены ~ALL и ~DEFAULT_BRANCH.

excludedRefNames массив

Шаблоны имён ссылок (ref), которые исключает этот набор правил. Тот же язык шаблонов, что и в includedRefNames.

rules массив

Правила защиты в этом наборе правил.

rules[].id string

Стабильный идентификатор Origin для этого правила.

rules[].ruleType строка

Тип правила. Набор правил merge_branch допускает pull_request, require_status_checks и require_branch_up_to_date. Набор правил push_branch, push_tag или push_repository допускает deletion, non_fast_forward, block_direct_updates, block_merges, ref_name_pattern и required_linear_history.

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

Удалить набор правил

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

Центры сертификации SSH

Центр сертификации SSH — это открытый ключ, которому доверяет владелец: подписанные им пользовательские сертификаты служат для аутентификации git по SSH в репозиториях владельца, поэтому участники команды-владельца могут работать с git по SSH, не регистрируя SSH-ключ. Эти конечные точки позволяют получить список центров сертификации, которым доверяет владелец, добавлять и удалять их, а также задавать, требует ли владелец сертификаты. Центры сертификации принадлежат владельцам-командам, а проверка на дубликаты при добавлении выполняется в рамках владельца, а не всего Origin, поэтому один и тот же центр сертификации может быть доверенным для нескольких владельцев.

Для получения списка подходят токены установки и пользовательские токены. Для добавления и удаления центров сертификации, а также для настройки требования нужны учётные данные пользователя Cursor с разрешением namespace:settings:write; токены приложений и токены установки не принимаются.

Список центров сертификации SSH

GET/v1/origin/namespaces/{namespaceSlug}/ssh-certificate-authorities
Scopenamespace:settings:readAuthInstallation tokenUser access token

Возвращает список центров сертификации SSH, которым владелец доверяет при работе с git по SSH (сначала самые новые), а также сведения о том, требует ли владелец сертификаты. Ответ не поддерживает пагинацию: возвращаются все центры сертификации.

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

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

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

Поля ответа

certificateAuthorities array

Все центры сертификации, которым доверяет владелец (сначала самые новые).

certificateAuthorities[].id string

Идентификатор центра сертификации; передаётся в Удаление центра сертификации SSH как certificateAuthorityId.

certificateAuthorities[].name string

Метка, заданная при добавлении центра сертификации.

certificateAuthorities[].keyType string

Тип ключа OpenSSH для открытого ключа центра сертификации, например ssh-ed25519.

certificateAuthorities[].fingerprint string

Отпечаток SHA-256 открытого ключа в формате SHA256:<base64> — в том виде, в каком его выводит ssh-keygen -l.

certificateAuthorities[].publicKey string

Открытый ключ центра сертификации в формате <key_type> <base64>, без комментария.

certificateAuthorities[].createdAt string

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

requireCertificates boolean

Требует ли владелец сертификаты SSH; см. Настройка требования сертификатов SSH.
curl --request GET \  --url 'https://api.cursor.com/v1/origin/namespaces/NAMESPACE_SLUG/ssh-certificate-authorities' \  --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN'

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

{  "certificateAuthorities": [    {      "id": "nsca_01k2ja2000e0080000000000s5",      "name": "Acme production CA",      "keyType": "ssh-ed25519",      "fingerprint": "SHA256:D5vlIclvaSZlwq4gmckavfLE7n7F542Eyhk/PvXkRq0",      "publicKey": "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIPwoQNzBuiWhDF4EKwRyt8h48XRY7Bc4yWbQ9s3Tnj7Q",      "createdAt": "2026-08-02T14:45:00Z"    }  ],  "requireCertificates": true}

Добавление центра сертификации SSH

POST/v1/origin/namespaces/{namespaceSlug}/ssh-certificate-authorities
Scopenamespace:settings:writeAuthUser access token

Добавляет центр сертификации SSH, которому доверяет владелец, и возвращает его. После этого участники команды-владельца могут работать с git по SSH в репозиториях владельца, используя пользовательские сертификаты, подписанные этим центром, без регистрации SSH-ключа.

publicKey — собственный открытый ключ центра сертификации в виде одной строки OpenSSH authorized_keys. Если передан сертификат, ключ неподдерживаемого типа или ключ RSA длиной менее 2048 бит, возвращается InvalidArgument (HTTP 400). Если ключ уже есть в списке владельца, возвращается AlreadyExists (HTTP 409 Conflict); проверка выполняется в пределах владельца, поэтому одному и тому же центру сертификации могут доверять несколько владельцев. Центры сертификации можно добавлять только владельцам, принадлежащим команде; для любого другого владельца возвращается FailedPrecondition (HTTP 400).

Вызывающая сторона должна использовать учётные данные пользователя Cursor с областью доступа namespace:settings:write. Токены приложений и токены установок не принимаются.

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

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

Слаг пространства имён.

Тело запроса

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

Открытый ключ центра сертификации в виде одной строки OpenSSH authorized_keys (<key_type> <base64> [comment]). Допустимые типы ключей: ssh-ed25519, ecdsa-sha2-nistp256, ecdsa-sha2-nistp384, ecdsa-sha2-nistp521 и ssh-rsa с модулем не менее 2048 бит. Сертификаты не принимаются.

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

Метка центра сертификации, не более 255 символов.

Поля ответа

id string

Идентификатор центра сертификации; передаётся как certificateAuthorityId в Удаление центра сертификации SSH.

name string

Метка, заданная при добавлении центра сертификации.

keyType string

Тип открытого ключа центра сертификации в формате OpenSSH, например ssh-ed25519.

fingerprint string

Отпечаток SHA-256 открытого ключа в формате SHA256:<base64> — в том виде, в каком его выводит ssh-keygen -l.

publicKey string

Открытый ключ центра сертификации в формате <key_type> <base64>, без комментария.

createdAt string

Метка времени добавления центра сертификации в формате RFC 3339.
curl --request POST \  --url 'https://api.cursor.com/v1/origin/namespaces/NAMESPACE_SLUG/ssh-certificate-authorities' \  --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN' \  --header 'Content-Type: application/json' \  --data '{  "publicKey": "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIPwoQNzBuiWhDF4EKwRyt8h48XRY7Bc4yWbQ9s3Tnj7Q acme-ssh-ca",  "name": "Acme production CA"}'

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

{  "id": "nsca_01k2ja2000e0080000000000s5",  "name": "Acme production CA",  "keyType": "ssh-ed25519",  "fingerprint": "SHA256:D5vlIclvaSZlwq4gmckavfLE7n7F542Eyhk/PvXkRq0",  "publicKey": "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIPwoQNzBuiWhDF4EKwRyt8h48XRY7Bc4yWbQ9s3Tnj7Q",  "createdAt": "2026-08-02T14:45:00Z"}

Удаление центра сертификации SSH

DELETE/v1/origin/namespaces/{namespaceSlug}/ssh-certificate-authorities/{certificateAuthorityId}
Scopenamespace:settings:writeAuthUser access token

Удаляет центр сертификации SSH у владельца. Все сертификаты, подписанные этим центром, перестают действовать. Пока для владельца включено обязательное использование сертификатов, его последний центр сертификации удалить нельзя: запрос вернёт FailedPrecondition (HTTP 400). Тело ответа пустое.

Вызывающая сторона должна использовать учётные данные пользователя Cursor с областью доступа namespace:settings:write. Токены приложений и установок не принимаются.

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

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

Слаг пространства имён.

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

id удаляемого центра сертификации.

Поля ответа

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

curl --request DELETE \  --url 'https://api.cursor.com/v1/origin/namespaces/NAMESPACE_SLUG/ssh-certificate-authorities/CERTIFICATE_AUTHORITY_ID' \  --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN'

Ответ:

204 No Content

Задать требование SSH-сертификатов

POST/v1/origin/namespaces/{namespaceSlug}/ssh-certificate-authorities:setRequirement
Scopenamespace:settings:writeAuthUser access token

Определяет, требует ли владелец SSH-сертификаты, и возвращает соответствующий параметр владельца. Пока требование действует, git по SSH в репозиториях владельца принимает только сертификаты, выданные центрами сертификации владельца: SSH-ключи, зарегистрированные пользователями, отклоняются, как и пользовательские API-ключи по HTTPS. Чтобы включить требование, в списке должен быть хотя бы один центр сертификации; в противном случае запрос возвращает FailedPrecondition (HTTP 400). Если передать текущее значение, запрос завершится успешно без изменений.

Вызывающая сторона должна использовать учётные данные пользователя Cursor с областью доступа namespace:settings:write. Токены приложений и токены установки не принимаются.

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

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

Слаг пространства имён.

Тело запроса

requireCertificates boolean Обязательный

true — требовать SSH-сертификаты в репозиториях владельца, false — отменить требование.

Поля ответа

requireCertificates boolean

Требует ли владелец SSH-сертификаты для git по SSH.
curl --request POST \  --url 'https://api.cursor.com/v1/origin/namespaces/NAMESPACE_SLUG/ssh-certificate-authorities:setRequirement' \  --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN' \  --header 'Content-Type: application/json' \  --data '{  "requireCertificates": true}'

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

{  "requireCertificates": true}

Вебхуки

Origin отправляет подписанные HTTP-запросы POST на зарегистрированный HTTPS URL вебхука приложения с content-type: application/json.

Доставка гарантируется как минимум один раз. Дедуплицируйте повторные попытки по webhook-id, надёжно принимайте запрос, быстро возвращайте 2xx и обрабатывайте событие асинхронно.

Origin ждёт заголовки ответа получателя 10 секунд. Этот срок включает разрешение DNS, установку соединения, TLS-рукопожатие и время до ответа и применяется к каждой попытке. Попытка, превысившая его, фиксируется как транспортная ошибка и повторяется по расписанию Повторных попыток. Повторяющиеся сбои могут автоматически отключить доставку.

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

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. Отклоняйте временные метки, отличающиеся от текущего времени более чем на пять минут.

Библиотеки Standard Webhooks не подходят для проверки доставок Origin. В заголовках используются имена из Standard Webhooks, но Origin подписывает не само содержимое, а его дайджест SHA-256, и использует тег версии v1ed, который не определён в спецификации Standard Webhooks. Выполняйте проверку с помощью описанной выше конструкции, как показано в следующем примере.

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 идентифицирует исходное событие домена.

Повторные попытки

Origin повторяет попытки при транспортных ошибках, ответах 429 и 5xx — всего до семи попыток. Другие ответы 4xx считаются окончательными.

Первая попытка — исходная отправка. Шесть повторных попыток выполняются с задержками 5 секунд, 30 секунд, 1 минута, 2 минуты, 4 минуты и 8 минут — в этом порядке.

Получатель, у которого не удалась ни одна попытка, увидит семь запросов POST в течение примерно 16 минут. webhook-id остаётся одинаковым во всех попытках. Дедуплицируйте по нему.

Автоматическое отключение

Владелец может приостановить доставку вебхуков приложения в его настройках. Origin также отключает её самостоятельно, если получатель проваливает не менее 20 циклов доставки в течение 72-часового окна, при этом за это окно нет ни одной успешной доставки, а сбои затрагивают более одного пространства имён установщика.

Доставка останавливается, пока владелец не возобновит её. Batch Redeliver Webhook Deliveries возвращает FailedPrecondition (HTTP 400) и ничего не ставит в очередь. В API нет поля для приостановленного состояния, поэтому ориентируйтесь на FailedPrecondition как на признак.

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

Восстановление

Используйте JWT приложения для запроса GET /app/webhook/deliveries. Фильтруйте по статусу доставки, типу события, установке, временному диапазону или токену страницы. delivered=false возвращает все доставки, которые получатель ещё ни разу не подтвердил ответом 2xx. Доставки остаются доступными для просмотра в течение семи дней, поэтому восстановление нужно выполнить в этот срок.

Используйте POST /app/webhook/deliveries:batchRedeliver, чтобы поставить в очередь повторную отправку до 100 идентификаторов доставок. Операция удаляет повторяющиеся идентификаторы и возвращает результат для каждой доставки. Приостановленное или автоматически отключённое приложение отклоняет вызов с FailedPrecondition (HTTP 400) и ничего не ставит в очередь.

Справочник по вебхукам

Все события, которые доставляет 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.label.addedМетка назначается pull request.
pull_request.label.removedМетка снимается с pull request, в том числе когда определение метки удаляется.
pull_request.comment.createdСоздаётся видимый комментарий к pull request.
pull_request.comment.reaction.addedК комментарию к pull request добавляется реакция. Повторное добавление реакции тем же пользователем снова доставляет это событие.
pull_request.comment.reaction.removedРеакция удаляется из комментария к 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.updatedЗапуск проверки обновляется, но не завершается: после обработки запроса Origin он остаётся в состоянии queued, in_progress или failing, в том числе если завершённый запуск открывается снова.
repository.check_run.completedЗапуск проверки завершается.
repository.check_run.rerequestedЗавершённый запуск проверки запрашивается повторно. Доставляется только приложению, которому принадлежит запуск.
repository.check_run.annotations.createdК запуску проверки добавляются аннотации с помощью Create Check Run Annotations. Для каждого запроса доставляется одно событие.
installation.createdПриложение устанавливается.
installation.updatedИзменяются области доступа, выбор репозитория или слаг пространства имён владельца.
installation.suspendedУстановка приостанавливается.
installation.unsuspendedПриостановленная установка восстанавливается.
installation.deletedПриложение удаляется.

Структура полезной нагрузки каждого события описана поле за полем в разделе Полезная нагрузка событий.

Пять событий installation.* направляются самому приложению, а не подписке репозитория. Origin всегда отправляет их, поэтому они не отображаются в списке событий, доступных для выбора в приложении. Все остальные события в этой таблице — подписки на уровне репозитория.

Новое приложение не подписано ни на одно из событий уровня репозитория. Выберите нужные в настройках приложения или задайте их в поле events при вызове Create App или Update App. Origin доставляет событие только тем приложениям, которые на него подписаны, у которых задан URL вебхука и чья установка охватывает репозиторий и имеет область доступа, необходимую для этого события. В противном случае событие не доставляется и ошибки не возникает: ничего не отправляется и ничего не появляется в Список доставок вебхука.

Origin не отправляет repository.pushed для репозитория, зеркалированного из GitHub. Эти push принадлежат GitHub, и он отправляет собственные push-вебхуки, поэтому доставка от Origin была бы дублированием. Push в нативные репозитории Origin доставляются как обычно, а состояние зеркала не влияет ни на какие другие события. repository.deleted отправляется для репозитория, зеркалированного из GitHub: остановка синхронизации удаляет только репозиторий на стороне Cursor, и GitHub ничего для него не отправляет.

Полезная нагрузка событий

Обёртка каждого события содержит его полезную нагрузку в виде object в поле payload. События с одинаковой структурой относятся к одному семейству полезной нагрузки; для каждого семейства ниже описаны доставляющие его события, его поля и пример полезной нагрузки, сгенерированный из спецификация OpenAPI. В спецификации у каждой схемы полезной нагрузки есть расширение x-origin-webhook-events, в котором перечислены доставляющие её события.

Репозиторий создан

EVENTrepository.created

Поля полезной нагрузки

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

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

repository.cloneUrl string

HTTPS URL для клонирования репозитория.

repository.mirror object

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

repository.mirror.source string

Одно из значений: github.

repository.mirror.sourceId string

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

repository.mirror.status string

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

repository.visibility string

Видимость репозитория: internal или private. Одно из значений: internal, private.

repository.allowMergeCommit boolean

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

repository.allowSquashMerge boolean

Разрешено ли объединять pull request посредством squash merge.

repository.deleteBranchOnMerge boolean

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

Пример 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, который может обновить несколько ссылок. Массив commits отсутствует; каждое обновление ссылки содержит только метаданные вершины, предоставляемые по мере возможности.

Поля 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 массив

Ссылки, включённые в этот push (не более 100).

refUpdates[].ref string

Полная Git-ссылка, которая была отправлена. Например: refs/heads/main или refs/tags/v3.14.1.

refUpdates[].before string

SHA последнего коммита в ref до отправки изменений. Состоит из одних нулей (0000000000000000000000000000000000000000), если ссылка была только что создана.

refUpdates[].after string

SHA последнего коммита в ref после отправки изменений. Содержит только нули (0000000000000000000000000000000000000000), если ссылка была удалена.

refUpdates[].created boolean

Была ли Git-ссылка создана этим push.

refUpdates[].deleted boolean

Была ли Git-ссылка удалена этим push.

refUpdates[].forced логическое значение

Переписал ли этот push историю: обновление существующей ссылки не через fast-forward (новая вершина не является потомком прежней). Значение false для создания и удаления ссылок, обновлений через fast-forward, а также для push, зафиксированных до того, как Origin начал отслеживать статус force-push.

refUpdates[].headCommit object

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

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 и временная метка автора или коммитера коммита. Это идентификатор, записанный в объекте коммита, а не связанная учетная запись пользователя.

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 зафиксировал отправку. Временная метка в формате RFC 3339.

pusher object

Субъект, выполнивший push, согласно проверке Origin. Отсутствует, если push выполнил сам Origin, например при слиянии pull request, когда merge-push продвигает базовую ссылку.

pusher.user object

pusher.user.id string

pusher.user.email string Обязательно

pusher.user.displayName string

Человекочитаемое отображаемое имя: имя и фамилия аккаунта, у каждого из которых удалены пробелы по краям, объединённые пробелом, — ровно то имя, которое отображает UI продукта. Опускается, если у аккаунта нет имени; никогда не формируется из email, id или любого другого поля. Также может отсутствовать в payload вебхуков, для которых не удалось определить actor.

pusher.user.handle string

Указанный пользователем идентификатор профиля (идентичность, связанная с cursor.com /@handle), без префикса @. Присутствует, только пока профиль пользователя общедоступен; отсутствует у пользователей, не указавших идентификатор, а также у пользователей с непубличным профилем.

pusher.user.performedVia object

Задаётся, если приложение действовало от имени этого пользователя с помощью пользовательского токена установки при выполнении действия, описанного в поле actor. Например, если речь об авторе комментария, здесь указывается приложение, создавшее комментарий, а не тот, кто впоследствии его изменил или удалил. Отсутствует, если пользователь действовал сам; также может отсутствовать, если данные о делегировании недоступны.

pusher.user.performedVia.app object

Приложение, действовавшее от имени пользователя.

pusher.user.performedVia.app.id string

pusher.user.performedVia.app.displayName string

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

pusher.app object

pusher.app.id string

pusher.app.displayName string

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

pusher.serviceAccount object

pusher.serviceAccount.id string

refUpdatesCount integer

Количество обновлений ссылок в атомарном 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": "jane@acme.dev",          "date": "2026-08-01T09:30:00Z"        },        "committer": {          "name": "Jane Doe",          "email": "jane@acme.dev",          "date": "2026-08-01T09:30:00Z"        },        "message": "Add launch telemetry"      }    }  ],  "pushedAt": "2026-08-02T14:45:00Z",  "pusher": {    "user": {      "id": "user_01k2ja2000e0080000000000c3",      "email": "jane@acme.dev"    }  },  "refUpdatesCount": 1}

Метаданные репозитория обновлены

EVENTrepository.metadata.updated

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

Поля полезной нагрузки

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

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

repository.cloneUrl string

HTTPS URL для клонирования репозитория.

repository.mirror object

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

repository.mirror.source string

Одно из значений: github.

repository.mirror.sourceId string

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

repository.mirror.status string

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

repository.visibility string

Видимость репозитория: internal или private. Одно из значений: internal, private.

repository.allowMergeCommit boolean

Могут ли pull request'ы вливаться в виде merge commit'ов.

repository.allowSquashMerge boolean

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

repository.deleteBranchOnMerge boolean

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

Пример 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.createdpull_request.publishedpull_request.reopenedpull_request.closedpull_request.mergedpull_request.metadata.updatedpull_request.head_ref.pushedpull_request.base_ref.updatedpull_request.stack_parent.updated

Изменение жизненного цикла запроса на слияние. Действие жизненного цикла — это event.type конверта; отдельного поля действия нет.

Поля полезной нагрузки

pullRequest object

Снимок пул-реквеста. Назначенные метки не включены; прочитайте их с помощью GetPullRequest.

pullRequest.id string

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

pullRequest.number string

Номер запроса на слияние в рамках репозитория.

pullRequest.state string

"открыт" или "закрыт". Черновик имеет статус "открыт"; объединённые и закрытые запросы на слияние имеют статус "закрыт".

pullRequest.draft boolean

Остаётся ли pull request черновиком.

pullRequest.merged boolean

Был ли pull request влит.

pullRequest.title string

Заголовок pull request.

pullRequest.body string

Описание пул-реквеста.

pullRequest.head object

Исходная сторона pull request — то, что вливается.

pullRequest.head.ref string

Git-ссылка, на которую указывает эта сторона, в том виде, в котором её сохраняет Origin.

pullRequest.head.sha string

SHA коммита на вершине этой стороны в последней версии изменения. Для base это base_sha версии, который может отставать от текущей вершины ветки (см. PullRequestVersion).

pullRequest.base object

Целевая сторона pull request — ветка, в которую он вливается.

pullRequest.base.ref строка

Git-ссылка, на которую указывает эта сторона, в том виде, в котором её сохраняет Origin.

pullRequest.base.sha string

SHA последнего коммита этой стороны в последней версии изменения. Для base это base_sha версии, который может отставать от текущего последнего коммита ветки (см. PullRequestVersion).

pullRequest.author object

Пользователь, открывший запрос на слияние.

pullRequest.author.user object

pullRequest.author.user.id string

pullRequest.author.user.email string Обязательное

pullRequest.author.user.displayName string

Человекочитаемое отображаемое имя: имя и фамилия аккаунта, очищенные от пробелов по краям и соединённые пробелом, — именно то имя, которое отображает интерфейс продукта. Не указывается, если у аккаунта нет имени; никогда не формируется из адреса электронной почты, идентификатора или любого другого поля. Также может отсутствовать в данных вебхука, если не удалось определить его инициатора.

pullRequest.author.user.handle string

Заявленный пользователем хэндл профиля (идентификатор, используемый в cursor.com /@handle), без префикса @. Отображается только пока профиль пользователя общедоступен; не указывается для пользователей без заявленного хэндла и для непубличных профилей.

pullRequest.author.user.performedVia object

Указывается, если приложение выполнило действие, описанное в этом поле субъекта, от имени пользователя с помощью пользовательского токена установки. Например, в поле автора комментария указывается приложение, создавшее комментарий, а не субъект, который позже его изменил или удалил. Отсутствует, если пользователь действовал напрямую; также может отсутствовать, если данные о делегировании недоступны.

pullRequest.author.user.performedVia.app object

Приложение, действовавшее от имени пользователя.

pullRequest.author.user.performedVia.app.id строка

pullRequest.author.user.performedVia.app.displayName string

Зарегистрированное отображаемое имя приложения; если оно указано, оно не бывает пустым. Отсутствует в полезных данных, если приложение не удалось определить, а также у собственного актора фасада Cursor.

pullRequest.author.app object

pullRequest.author.app.id string

pullRequest.author.app.displayName string

Зарегистрированное отображаемое имя приложения; если оно указано, оно не бывает пустым. Отсутствует в полезных данных, если приложение не удалось определить, а также у собственного актора фасада Cursor.

pullRequest.author.serviceAccount object

pullRequest.author.serviceAccount.id string

pullRequest.createdAt string

Время открытия pull request. Метка времени в формате RFC 3339.

pullRequest.updatedAt string

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

pullRequest.closedAt string

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

pullRequest.mergedAt строка

Время объединения пул-реквеста; не задано, если он не был объединён. Метка времени в формате RFC 3339.

pullRequest.mergeCommitSha string

SHA коммита, записанного слиянием в базовую ветку; после слияния значение задано, до слияния — нет. Предварительный просмотр слияния — это реф pull/\<number>/merge (см. GetGitRef), указывающий на другой коммит.

pullRequest.additions integer

Строки, добавленные в последней версии pull request'а.

pullRequest.deletions integer

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

pullRequest.changedFiles integer

Файлы, изменённые последней версией пул-реквеста.

pullRequest.stack object

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

pullRequest.stack.id string

Стабильный идентификатор стека. Передайте его как stack_id в ListPullRequests, чтобы получить список участников стека.

pullRequest.stack.parentPullRequest object

Pull request, поверх которого надстроен текущий. Не задано для корня стека. Влитый родитель остаётся указанным, пока для дочернего pull request не изменят цель или родителя.

pullRequest.stack.parentPullRequest.id string

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

pullRequest.stack.parentPullRequest.number string

pullRequest.stack.parentPullRequest.repository object

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

pullRequest.stack.parentPullRequest.repository.id строка

pullRequest.stack.parentPullRequest.repository.name строка

pullRequest.stack.parentPullRequest.repository.owner object

Владелец репозитория.

pullRequest.stack.parentPullRequest.repository.owner.slug string

Уникальное имя владельца, подходящее для использования в URL.

pullRequest.stack.parentPullRequest.repository.owner.id строка

Уникальный идентификатор пространства имён владельца.

pullRequest.stack.parentPullRequest.repository.owner.type строка

team или user. Доступно только для вывода; не задано, если неизвестно. Одно из значений: team, user.

pullRequest.version object

Последняя версия запроса на слияние.

pullRequest.version.number string

Монотонно возрастающий номер версии в рамках изменения (нумерация с 1).

pullRequest.version.headSha string

SHA головного коммита для этой версии.

pullRequest.version.baseSha string

SHA базового коммита, с которым сравнивается эта версия: вершина базовой ветки, определённая в момент записи версии. Она может отставать от текущей вершины ветки до следующего пуша в head или смены целевой ветки.

pullRequest.version.createdAt string

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

pullRequest.version.potentialMergeCommit object

Тестовое слияние этой версии в Origin и степень готовности его подготовки (state). Вычисляется для этой версии: второй родитель коммита — head_sha; его первый родитель — base_sha тестового слияния, то есть вершина базовой ветки на момент подготовки, которая может быть новее, чем base_sha этой версии. Ссылка pull/\<number>/merge указывает только на коммит последней версии; старые коммиты по-прежнему доступны для чтения по SHA через API (GetCommit), но получить их по SHA через git нельзя. Отличается от PullRequest.merge_commit_sha, который задаётся только после слияния. Устанавливается в PullRequest.version и PullRequestWebhook.version.

pullRequest.version.potentialMergeCommit.state строка

Насколько продвинулась подготовка этой версии; новая версия получает статус unknown, пока не будет завершена её подготовка. Нераспознанные значения следует считать unknown. Одно из значений: unknown, prepared, merge_conflict.

pullRequest.version.potentialMergeCommit.sha строка

Задаётся только если state имеет значение prepared: тестовый коммит слияния с двумя родителями; второй родитель — head_sha версии, первый — base_sha; вершина pull/\<number>/merge, пока эта версия является последней; впоследствии доступен для чтения по SHA.

pullRequest.version.potentialMergeCommit.baseSha строка

Задаётся всякий раз, когда вычислялось состояние (prepared или merge_conflict): вершина базовой ветки, с которой пытались выполнить слияние на момент подготовки; может быть новее, чем base_sha версии, и не обновляется, если базовая ветка просто продвигается вперёд; заново подготавливается при повторном открытии. Может отсутствовать у merge_conflict, зафиксированного до того, как это поле стало содержать такое значение.

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.

Пример 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": "add-telemetry-schema",      "sha": "3b1f9c2d8a7e6f5049c8b7a6d5e4f3a2b1c0d9e8"    },    "author": {      "user": {        "id": "user_01k2ja2000e0080000000000c3",        "email": "jane@acme.dev"      }    },    "createdAt": "2026-08-01T09:30:00Z",    "updatedAt": "2026-08-02T14:45:00Z",    "additions": 128,    "deletions": 46,    "changedFiles": 5,    "stack": {      "id": "stk_01k2ja2000e0080000000000s1",      "parentPullRequest": {        "id": "pr_01k2ja2000e0080000000000d3",        "number": "16",        "repository": {          "id": "repo_01k2ja2000e0080000000000q4",          "name": "rocket",          "owner": {            "slug": "acme",            "id": "ns_01k2ja2000e0080000000000p3",            "type": "team"          }        }      }    },    "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

EVENTpull_request.label.addedpull_request.label.removed

Изменение меток, назначенных пул-реквесту. Текущий набор можно получить с помощью ListPullRequestLabels.

Поля полезной нагрузки

pullRequest object

Pull request, у которого изменились назначенные метки.

pullRequest.id строка

Неизменяемый идентификатор изменения в Origin.

pullRequest.number строка

pullRequest.repository object

Ссылка на репозиторий для этого pull request.

pullRequest.repository.id строка

pullRequest.repository.name строка

pullRequest.repository.owner object

Владелец repo.

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

Уникальное имя владельца, пригодное для использования в URL.

pullRequest.repository.owner.id строка

Уникальный идентификатор пространства имён владельца.

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

team или user. Только для вывода; не задано, если неизвестно. Одно из: team, user.

label object

Метка, к которой относится событие.

label.id строка

label.name строка

label.color строка

Шестизначный цвет в шестнадцатеричном формате без начального #.

label.description строка

actor object

Субъект, присвоивший или удаливший метку, если он известен.

actor.user object

actor.user.id строка

actor.user.email строка Обязательный

actor.user.displayName строка

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

actor.user.handle строка

Зарезервированный пользователем handle профиля (идентификатор, стоящий за cursor.com /@handle), без префикса @. Присутствует, только пока профиль пользователя виден публично; отсутствует у пользователей без зарезервированного handle и у непубличных профилей.

actor.user.performedVia object

Задаётся, если приложение действовало от имени этого пользователя с помощью пользовательского токена установки при выполнении действия, описанного полем actor. Например, в поле автора комментария указывается приложение, создавшее комментарий, а не тот, кто позднее изменил или удалил его. Отсутствует, если пользователь действовал сам; также может отсутствовать, если данные о делегировании недоступны.

actor.user.performedVia.app object

Приложение, действовавшее от имени пользователя.

actor.user.performedVia.app.id строка

actor.user.performedVia.app.displayName строка

Зарегистрированное отображаемое имя приложения; если поле присутствует, оно никогда не бывает пустым. Отсутствует в полезных нагрузках, для которых не удалось определить приложение, а также у собственного фасадного актора Cursor.

actor.app object

actor.app.id строка

actor.app.displayName строка

Зарегистрированное отображаемое имя приложения; если поле присутствует, оно никогда не бывает пустым. Отсутствует в полезных нагрузках, для которых не удалось определить приложение, а также у собственного фасадного актора Cursor.

actor.serviceAccount object

actor.serviceAccount.id строка

Пример event.payload:

{  "pullRequest": {    "id": "pr_01k2ja2000e0080000000000d4",    "number": "17",    "repository": {      "id": "repo_01k2ja2000e0080000000000q4",      "name": "rocket",      "owner": {        "slug": "acme",        "id": "ns_01k2ja2000e0080000000000p3",        "type": "team"      }    }  },  "label": {    "id": "lbl_01k2ja2000e0080000000000m1",    "name": "bug",    "color": "d73a4a",    "description": "Something isn't working"  },  "actor": {    "user": {      "id": "user_01k2ja2000e0080000000000c3",      "email": "jane@acme.dev"    }  }}

Комментарий к запросу на слияние

СОБЫТИЕpull_request.comment.created

Комментарий, созданный в pull request. Комментарии, добавленные в рамках ревью, отправляются при отправке ревью — по одному событию на каждый комментарий.

Поля полезной нагрузки

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.

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

Монотонно возрастающий номер версии в рамках pull request (нумерация с 1).

comment.thread.version.headSha string

SHA коммита, являющегося вершиной этой версии.

comment.thread.version.baseSha строка

SHA базового коммита, с которым сравнивается эта версия.

comment.thread.path string

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

comment.thread.side string

Сторона диффа, к которой привязан якорь. Не задаётся для тредов общего обсуждения. Одно из: left, right.

comment.thread.startLine integer

Первая строка привязанного диапазона в версии файла 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 строка

Удобочитаемое отображаемое имя: имя и фамилия аккаунта, каждое без начальных и конечных пробелов, соединённые через пробел, — именно то имя, которое отображается в интерфейсе продукта. Не указывается, если у аккаунта нет имени; никогда не формируется из адреса электронной почты, идентификатора или какого-либо другого поля. Также может отсутствовать в полезной нагрузке вебхуков, для которых не удалось определить инициатора.

comment.author.user.handle string

Заявленный пользователем идентификатор профиля (личность, связанная с cursor.com /@handle), без префикса @. Отображается только пока профиль пользователя общедоступен; отсутствует у пользователей без заявленного идентификатора и в непубличных профилях.

comment.author.user.performedVia object

Указывается, если приложение действовало от имени этого пользователя с помощью пользовательского токена установки для действия, описанного в этом поле субъекта. Например, в поле автора комментария указывается приложение, создавшее комментарий, а не субъект, который позже изменил или удалил его. Отсутствует, если пользователь действовал напрямую; также может отсутствовать, если данные о делегировании недоступны.

comment.author.user.performedVia.app object

Приложение, которое выполнило действие от имени пользователя.

comment.author.user.performedVia.app.id строка

comment.author.user.performedVia.app.displayName строка

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

comment.author.app object

comment.author.app.id строка

comment.author.app.displayName строка

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

comment.author.serviceAccount object

comment.author.serviceAccount.id string

comment.createdAt string

Метка времени в формате 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"      },      "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": "jane@acme.dev"      }    },    "createdAt": "2026-08-01T09:30:00Z",    "updatedAt": "2026-08-02T14:45:00Z"  }}

События реакций на комментарии к pull request

СОБЫТИЕpull_request.comment.reaction.addedpull_request.comment.reaction.removed

Реакция, добавленная к комментарию к pull request или удалённая из него. Действие передаётся в поле event.type обёртки. Добавление доставляется как минимум один раз: если поставить реакцию, которая у автора реакции уже есть на этом комментарии, будет доставлено ещё одно событие pull_request.comment.reaction.added для той же комбинации (comment, reactor, content); удаление реакции, которой у автора реакции нет, не приводит к доставке событий.

Поля полезной нагрузки

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.id string

comment.thread object

Тред, к которому относится комментарий.

comment.thread.id string

reaction object

Добавленная или удалённая реакция.

reaction.content строка

Реакция, добавленная к комментарию. Набор значений закрытый: нераспознанное значение следует интерпретировать как реакцию, которую получатель не может отобразить. Одно из значений: thumbs_up, thumbs_down, laugh, hooray, confused, heart, rocket, eyes.

reaction.reactor object

Субъект, поставивший реакцию. Удалить её может только инициатор реакции, поэтому он является действующим субъектом как при добавлении, так и при удалении реакции.

reaction.reactor.user object

reaction.reactor.user.id строка

reaction.reactor.user.email string Обязательно

reaction.reactor.user.displayName строка

Человекочитаемое отображаемое имя: имя и фамилия аккаунта, каждая без пробелов по краям, соединённые пробелом, — ровно то имя, которое отображает интерфейс продукта. Не указывается, если у аккаунта нет имени; никогда не формируется из адреса электронной почты, идентификатора или какого-либо другого поля. Также может отсутствовать в данных вебхука, если не удалось определить его инициатора.

reaction.reactor.user.handle строка

Заявленный пользователем псевдоним профиля (идентификатор пользователя в cursor.com /@handle), без префикса @. Отображается, только пока профиль пользователя общедоступен; не отображается для пользователей без заявленного псевдонима и для непубличных профилей.

reaction.reactor.user.performedVia object

Задаётся, если приложение действовало от имени этого пользователя с помощью пользовательского токена установки для действия, описанного в этом поле actor. Например, для автора комментария здесь указывается приложение, создавшее комментарий, а не субъект, который позже изменил или удалил его. Отсутствует, если пользователь действовал сам; также может отсутствовать, если данные о делегировании недоступны.

reaction.reactor.user.performedVia.app object

Приложение, действовавшее от имени пользователя.

reaction.reactor.user.performedVia.app.id строка

reaction.reactor.user.performedVia.app.displayName строка

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

reaction.reactor.app object

reaction.reactor.app.id строка

reaction.reactor.app.displayName строка

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

reaction.reactor.serviceAccount object

reaction.reactor.serviceAccount.id строка

Пример 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"    }  },  "reaction": {    "content": "thumbs_up",    "reactor": {      "user": {        "id": "user_01k2ja2000e0080000000000c3",        "email": "jane@acme.dev"      }    }  }}

События ревью pull request

EVENTpull_request.review.submittedpull_request.review.dismissed

Поля полезной нагрузки

pullRequest object

Пул-реквест, к которому относится ревью.

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

Идентификатор ревью в Stable Origin.

review.author object

Директор, написавший отзыв.

review.author.user object

review.author.user.id string

review.author.user.email string Обязательное

review.author.user.displayName string

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

review.author.user.handle string

Заявленное пользователем имя профиля (идентификатор пользователя на cursor.com /@handle), без префикса @. Отображается, только пока профиль пользователя виден всем; не указывается для пользователей без заявленного имени профиля и для непубличных профилей.

review.author.user.performedVia object

Указывается, если приложение с помощью пользовательского токена установки выполнило от имени пользователя действие, описанное в этом поле субъекта. Например, в поле автора комментария указывается приложение, создавшее комментарий, а не субъект, который позже изменил или удалил его. Отсутствует, если пользователь действовал сам; также может отсутствовать, если данные о делегировании недоступны.

review.author.user.performedVia.app object

Приложение, которое действовало от имени пользователя.

review.author.user.performedVia.app.id string

review.author.user.performedVia.app.displayName string

Зарегистрированное отображаемое имя приложения; если оно указано, оно не бывает пустым. Отсутствует в полезных нагрузках, где не удалось определить приложение, а также у собственного фасадного актора Cursor.

review.author.app object

review.author.app.id string

review.author.app.displayName string

Зарегистрированное отображаемое имя приложения; если оно указано, оно не бывает пустым. Отсутствует в полезных нагрузках, где не удалось определить приложение, а также у собственного фасадного актора 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 коммита-источника, к которым относится вердикт.

review.pullRequestVersion.number string

Монотонно возрастающий номер версии в рамках pull request (нумерация с 1).

review.pullRequestVersion.headSha string

SHA головного коммита этой версии.

review.pullRequestVersion.baseSha string

SHA базового коммита, с которым сравнивается эта версия.

review.dismissal object

Устанавливается после снятия ревью; отсутствует, пока вердикт всё ещё учитывается при определении состояния ревью пул-реквеста.

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

Понятное человеку отображаемое имя: имя и фамилия аккаунта, каждое из которых очищено от пробелов по краям, соединённые пробелом, — в точности то имя, которое отображает интерфейс продукта. Не указывается, если у аккаунта нет имени; никогда не формируется из адреса электронной почты, идентификатора или любого другого поля. Также может отсутствовать в полезной нагрузке вебхука, если не удалось определить её инициатора.

review.dismissal.dismissedBy.user.handle string

Заявленный пользователем дескриптор профиля (идентификатор пользователя на cursor.com /@handle), без префикса @. Отображается только пока профиль пользователя открыт для всех; не указывается для пользователей без заявленного дескриптора и для непубличных профилей.

review.dismissal.dismissedBy.user.performedVia object

Задаётся для действия, описываемого этим полем инициатора, если приложение выполнило его от имени этого пользователя с помощью пользовательского токена установки. Например, для автора комментария здесь указывается приложение, создавшее комментарий, а не инициатор, который позже его отредактировал или удалил. Отсутствует, если пользователь действовал напрямую; также может отсутствовать, если данные о делегировании недоступны.

review.dismissal.dismissedBy.user.performedVia.app object

Приложение, которое действовало от имени пользователя.

review.dismissal.dismissedBy.user.performedVia.app.id string

review.dismissal.dismissedBy.user.performedVia.app.displayName строка

Зарегистрированное отображаемое имя приложения; если оно указано, оно не бывает пустым. Отсутствует в полезных нагрузках, где не удалось определить приложение, а также у собственного фасадного актора Cursor.

review.dismissal.dismissedBy.app object

review.dismissal.dismissedBy.app.id string

review.dismissal.dismissedBy.app.displayName string

Зарегистрированное отображаемое имя приложения; если оно указано, оно не бывает пустым. Отсутствует в полезных нагрузках, где не удалось определить приложение, а также у собственного фасадного актора 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": "jane@acme.dev"      }    },    "verdict": "approve",    "body": "Approving. The telemetry schema matches the spec.",    "submittedAt": "2026-08-02T15:00:00Z",    "pullRequestVersion": {      "number": "3",      "headSha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4",      "baseSha": "3b1f9c2d8a7e6f5049c8b7a6d5e4f3a2b1c0d9e8"    }  }}

События ревьюера пул-реквеста

EVENTpull_request.reviewer.addedpull_request.reviewer.removedpull_request.reviewer.rerequested

Изменение списка запрошенных ревьюеров pull request. Текущий набор ожидающих ревьюеров можно получить через ListPullRequestRequestedReviewers.

Поля payload

pullRequest object

Запрос на слияние, в котором изменился список запрошенных рецензентов.

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.

reviewer object

Запрошенный ревьюер, о котором говорится в событии.

reviewer.user object

reviewer.user.id string

reviewer.user.email string Обязательное

reviewer.user.displayName string

Человекочитаемое отображаемое имя: имя и фамилия аккаунта, каждая без лишних пробелов, соединённые пробелом, — ровно то имя, которое отображает интерфейс продукта. Не указывается, если у аккаунта нет имени; никогда не формируется из email, id или любого другого поля. Также может отсутствовать в данных вебхука, если не удалось определить его инициатора.

reviewer.user.handle string

Закреплённый за пользователем handle профиля (идентификатор, стоящий за cursor.com /@handle), без префикса @. Присутствует только пока профиль пользователя доступен публично; не возвращается для пользователей без закреплённого handle и для непубличных профилей.

reviewer.user.performedVia object

Задаётся, если приложение с помощью пользовательского токена установки выполнило от имени пользователя действие, описанное в поле actor. Например, для автора комментария указывает приложение, создавшее комментарий, а не того, кто позже изменил или удалил его. Отсутствует, если пользователь действовал самостоятельно; также может отсутствовать, если данные о делегировании недоступны.

reviewer.user.performedVia.app object

Приложение, действовавшее от имени пользователя.

reviewer.user.performedVia.app.id строка

reviewer.user.performedVia.app.displayName string

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

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 webhook, для которых не удалось определить actor.

createdBy.user.handle string

Заявленный пользователем псевдоним профиля (идентификатор, связанный с cursor.com /@handle), без префикса @. Отображается только когда профиль пользователя общедоступен; отсутствует у пользователей, не заявивших псевдоним, и в непубличных профилях.

createdBy.user.performedVia object

Указывается, если приложение выполнило действие, описанное полем actor, от имени этого пользователя с помощью пользовательского токена установки. Например, в поле автора комментария указывается приложение, создавшее комментарий, а не субъект, который позже изменил или удалил его. Отсутствует, если пользователь действовал напрямую; также может отсутствовать, если данные о делегировании недоступны.

createdBy.user.performedVia.app object

Приложение, действовавшее от имени пользователя.

createdBy.user.performedVia.app.id строка

createdBy.user.performedVia.app.displayName string

Зарегистрированное отображаемое имя приложения; если поле присутствует, оно никогда не бывает пустым. Не включается в полезные данные, для которых не удалось определить приложение, а также для собственного фасадного актора Cursor.

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": "jane@acme.dev"    }  },  "createdVia": "codeowners",  "createdAt": "2026-08-02T14:45:00Z"}

События запуска проверки

EVENTrepository.check_run.createdrepository.check_run.updatedrepository.check_run.completed

Зафиксированный снимок для события жизненного цикла запуска проверки 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

Набор тестов, к которому относится этот запуск проверок.

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.baseSha строка

Базовый коммит, относительно которого была зарегистрирована эта попытка (в шестнадцатеричном формате со строчными буквами), если приложение, отправившее сведения, указало его: base_sha версии pull request. Он является частью идентификатора попытки, поэтому одно приложение может зарегистрировать одну попытку для каждой пары (head, base). Если значение отсутствует, попытка не привязана к базовому коммиту и применяется ко всем pull request с коммитом sha. При определении состояния CI и обязательных проверок pull request учитываются только попытки, не привязанные к базовому коммиту, и попытки, зарегистрированные относительно base_sha последней версии этого pull request; списки проверок для коммита (ListCheckSuitesForCommit, ListCheckRunsForCommit) возвращают записи для всех базовых коммитов.

checkSuite.key строка

Ключ идемпотентности, выбранный приложением для набора.

checkSuite.name string

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

checkSuite.detailsUrl string

Ссылка на подробную информацию о наборе в целом, если указано.

checkSuite.createdAt строка

Временная метка в формате 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

Заявленный пользователем идентификатор профиля (идентификатор по адресу cursor.com /@handle), без префикса @. Отображается, только пока профиль пользователя открыт для публичного просмотра; отсутствует у пользователей без заявленного идентификатора и в непубличных профилях.

checkSuite.actor.user.performedVia object

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

checkSuite.actor.user.performedVia.app object

Приложение, действовавшее от имени пользователя.

checkSuite.actor.user.performedVia.app.id string

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

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

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

Снимок выполнения проверки на этом этапе жизненного цикла.

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

Набор тестов, к которому относится этот запуск проверки.

checkRun.checkSuite.id string

checkRun.sha string

SHA разрешённого коммита head, к которому привязан запуск проверки (строчные шестнадцатеричные символы).

checkRun.baseSha строка

Базовая ревизия, относительно которой был представлен отчёт об этом запуске (шестнадцатеричное число в нижнем регистре), если приложение, отправляющее отчёт, указало её; всегда совпадает с base_sha родительского набора проверок. Если значение отсутствует, запуск не зависит от базовой ревизии (см. CheckSuite.base_sha).

checkRun.key string

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

checkRun.name string

Отображаемое пользователю имя проверки (check-run).

checkRun.status string

Состояние жизненного цикла. failing — ещё выполняющийся запуск, приложение для которого уже знает, что он не завершится успешно: для блокирующих условий и обязательных проверок он остаётся ожидающим, conclusion пока отсутствует; для читателей это раннее предупреждение. rerequested — завершённый запуск, повторное выполнение которого было запрошено, но владеющее им приложение ещё не ответило: для читателей он остаётся ожидающим (отображается как queued), а conclusion и временные показатели по-прежнему описывают заменённую попытку. Устанавливается только Origin при повторном запросе (RerequestCheckRun); приложения не могут устанавливать это состояние. Одно из значений: queued, in_progress, completed, rerequested, failing.

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

Время, когда Origin в последний раз записал запуск. Не обновляется публикацией, которая была проигнорирована как устаревшая или которая повторяла сохранённые значения (см. PostCheckRunResponse.outcome), поэтому по нему невозможно различить эти два случая. Метка времени в формате RFC 3339.

checkRun.externalId string

Неизменяемый идентификатор, присвоенный поставщиком для этой попытки проверки (см. CheckRunInput.external_id: рекомендуется по одному на выполнение).

checkRun.actor object

Субъект, запустивший проверку; всегда actor набора, которому она принадлежит.

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.user.performedVia object

Задаётся, когда приложение действовало от имени этого пользователя с помощью пользовательского токена установки, выполняя действие, описываемое этим полем субъекта действия. Например, в поле автора комментария указывается приложение, создавшее комментарий, а не субъект, который позже отредактировал или удалил его. Отсутствует, если пользователь действовал напрямую; также может отсутствовать, если данные о делегировании недоступны.

checkRun.actor.user.performedVia.app object

Приложение, действовавшее от имени пользователя.

checkRun.actor.user.performedVia.app.id string

checkRun.actor.user.performedVia.app.displayName string

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

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

Необязательный крайний срок. Если параметр не указан или не задан, срок действия не истекает. Очищается после завершения запуска, в том числе если он завершается по истечении срока со статусом timed_out (см. CheckRunInput.deadline_at). Метка времени в формате 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

Понятное пользователю отображаемое имя: имя и фамилия аккаунта, очищенные от пробелов по краям и объединённые пробелом, — именно это имя отображается в интерфейсе продукта. Не указывается, если у аккаунта нет имени; никогда не формируется из адреса электронной почты, идентификатора или любого другого поля. Также может отсутствовать в данных вебхука, если не удалось определить пользователя, выполнившего действие.

checkRun.rerequestedBy.user.handle строка

Заявленный пользователем дескриптор профиля (идентификатор по адресу cursor.com /@handle), без префикса @. Отображается, только пока профиль пользователя открыт для публичного просмотра; отсутствует у пользователей без заявленного дескриптора и в непубличных профилях.

checkRun.rerequestedBy.user.performedVia object

Задаётся, если приложение с помощью пользовательского токена установки выполнило от имени этого пользователя действие, описываемое этим полем инициатора действия. Например, для автора комментария указывается приложение, создавшее комментарий, а не инициатор действия, который позже изменил или удалил его. Отсутствует, если пользователь действовал сам, и может отсутствовать, если данные о делегировании недоступны.

checkRun.rerequestedBy.user.performedVia.app object

Приложение, действовавшее от имени пользователя.

checkRun.rerequestedBy.user.performedVia.app.id string

checkRun.rerequestedBy.user.performedVia.app.displayName строка

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

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-02T14:45:00Z",    "externalId": "build-8842",    "actor": {      "user": {        "id": "user_01k2ja2000e0080000000000c3",        "email": "jane@acme.dev"      }    }  },  "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": "jane@acme.dev"      }    },    "output": {      "title": "Unit tests",      "summary": "128 tests passed.",      "text": "All suites green."    }  }}

Повторно запрошен запуск проверки

EVENTrepository.check_run.rerequested

Данные вебхука repository.check_run.rerequested отправляются только приложению, которому принадлежит запуск проверки. В ответ отправьте новый запуск для того же head SHA и key — создайте новый запуск (с новым external_id) или обновите запуск, для которого запросили повторное выполнение. Пока ответная публикация не очистит rerequested_at, у помеченного запуска будет status: rerequested (его conclusion и timings относятся к предыдущему результату, который был заменён). Каждый принятый запрос на повторное выполнение порождает одно событие. После ответа запуск можно запросить повторно, поэтому при дедупликации повторных доставок ориентируйтесь только на идентификатор события; в check_run.rerequested_at содержится отметка о невыполненном запросе. Данные вебхука не содержат контекста pull request (запуски проверок привязаны к (repository, sha)): если потребителю нужен pull request, он может определить его по check_run.sha, используя собственное сопоставление с head-ветками, либо вызвать ListPullRequests с фильтром по head-ветке, для которой выполнялась сборка.

Поля полезной нагрузки

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

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

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.baseSha строка

База сравнения, относительно которой приложение сообщило об этой попытке (шестнадцатеричное значение в нижнем регистре), если приложение её указало: base_sha версии pull request. Это часть идентификатора попытки, поэтому одно приложение может сообщить об одной попытке для каждой пары (head, base). Если значение отсутствует, попытка не привязана к базе и применяется ко всем pull request с sha. При определении состояния CI и обязательных проверок pull request учитываются только попытки, не привязанные к базе, и попытки, о которых сообщено относительно base_sha последней версии этого pull request; списки для конкретного коммита (ListCheckSuitesForCommit, ListCheckRunsForCommit) возвращают попытки для всех баз.

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

Удобочитаемое отображаемое имя: имя и фамилия аккаунта, очищенные от пробелов по краям и объединённые пробелом, — в точности то имя, которое отображается в интерфейсе продукта. Не указывается, если у аккаунта нет имени; никогда не формируется на основе адреса электронной почты, идентификатора или какого-либо другого поля. Также может отсутствовать в данных вебхука, если не удалось определить пользователя, выполнившего действие.

checkSuite.actor.user.handle string

Заявленный пользователем псевдоним профиля (идентификатор, стоящий за cursor.com /@handle), без префикса @. Присутствует, только пока профиль пользователя общедоступен; не указывается для пользователей без заявленного псевдонима и для непубличных профилей.

checkSuite.actor.user.performedVia object

Устанавливается, когда приложение действовало от имени этого пользователя с пользовательским токеном установки в рамках действия, которое описывает это поле инициатора действия. Например, для автора комментария здесь указывается приложение, создавшее комментарий, а не инициатор действия, который позже его отредактировал или удалил. Отсутствует, если пользователь действовал напрямую; также может отсутствовать, если данные о делегировании недоступны.

checkSuite.actor.user.performedVia.app object

Приложение, действовавшее от имени пользователя.

checkSuite.actor.user.performedVia.app.id string

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

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

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

Набор тестов, к которому относится этот запуск проверки.

checkRun.checkSuite.id string

checkRun.sha string

SHA разрешённого коммита head, к которому привязан запуск проверки (строчные шестнадцатеричные цифры).

checkRun.baseSha строка

База сравнения, относительно которой был представлен отчёт об этом запуске (шестнадцатеричное значение в нижнем регистре), если приложение, отправившее отчёт, указало её; всегда соответствует base_sha набора проверок-владельца. Отсутствие значения означает, что запуск не зависит от базы (см. CheckSuite.base_sha).

checkRun.key строка

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

checkRun.name string

Отображаемое пользователю название проверки (check-run).

checkRun.status string

Состояние жизненного цикла. failing — продолжающийся запуск, про который приложение уже знает, что проверка не пройдёт: для блокирующих и обязательных проверок он остаётся в ожидании, conclusion ещё нет; для читателей это раннее предупреждение. rerequested — это завершённый запуск, для которого запросили повторный запуск, но приложение-владелец ещё не ответило: для читателей он находится в ожидании (отображается как queued), а conclusion и временные показатели по-прежнему описывают заменённую попытку. Устанавливается только Origin при повторном запросе (RerequestCheckRun); приложения не могут задавать это значение. Одно из значений: queued, in_progress, completed, rerequested, failing.

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 строка

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

checkRun.createdAt string

Временная метка в формате RFC 3339.

checkRun.updatedAt string

Когда Origin в последний раз записал запуск. Это значение не обновляется, если публикация была проигнорирована как устаревшая или повторяла сохранённые значения (см. PostCheckRunResponse.outcome), поэтому по нему нельзя различить эти два случая. Метка времени в формате RFC 3339.

checkRun.externalId string

Неизменяемый идентификатор, присвоенный провайдером для этой попытки проверки (см. CheckRunInput.external_id: рекомендуется один на выполнение).

checkRun.actor object

Субъект, от имени которого был выполнен запуск проверки; всегда actor набора, которому принадлежит запуск.

checkRun.actor.user object

checkRun.actor.user.id string

checkRun.actor.user.email string Обязательно

checkRun.actor.user.displayName string

Удобочитаемое отображаемое имя: имя и фамилия аккаунта, очищенные от пробелов по краям и объединённые пробелом, — в точности то имя, которое отображается в интерфейсе продукта. Не указывается, если у аккаунта нет имени; никогда не формируется на основе адреса электронной почты, идентификатора или какого-либо другого поля. Также может отсутствовать в данных вебхука, если не удалось определить пользователя, выполнившего действие.

checkRun.actor.user.handle строка

Заявленный пользователем псевдоним профиля (идентификатор, стоящий за cursor.com /@handle), без префикса @. Присутствует, только пока профиль пользователя общедоступен; не указывается для пользователей без заявленного псевдонима и для непубличных профилей.

checkRun.actor.user.performedVia object

Указывается, когда приложение действовало от имени этого пользователя с помощью пользовательского токена установки для выполнения действия, описываемого этим полем актора. Например, в поле автора комментария оно указывает приложение, создавшее комментарий, а не актора, который позже отредактировал или удалил его. Отсутствует, если пользователь действовал напрямую; также может отсутствовать, если данные о делегировании недоступны.

checkRun.actor.user.performedVia.app object

Приложение, действовавшее от имени пользователя.

checkRun.actor.user.performedVia.app.id строка

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

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

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 строка

Необязательный крайний срок. Если он не указан или не задан, срок действия не ограничен. Очищается после завершения запуска, в том числе при истечении срока со статусом timed_out (см. CheckRunInput.deadline_at). Метка времени в формате RFC 3339.

checkRun.isRerequestable boolean

Указало ли приложение, отправляющее отчёт, что этот запуск можно запросить повторно (CheckRunInput.is_rerequestable).

checkRun.rerequestedAt string

Устанавливается, пока ожидается повторный запрос; сбрасывается, когда провайдер снова публикует данные. Если значение не задано, повторный запрос не ожидается. Пока значение задано, status равен rerequested, а run остаётся в состоянии CI коммита со статусом pending (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.user.performedVia object

Указывается, когда приложение действовало от имени этого пользователя с токеном пользователя установки для действия, описываемого этим полем исполнителя. Например, в поле автора комментария указывается приложение, создавшее комментарий, а не исполнитель, который позже отредактировал или удалил его. Отсутствует, если пользователь действовал напрямую; также может отсутствовать, если данные о делегировании недоступны.

checkRun.rerequestedBy.user.performedVia.app object

Приложение, действовавшее от имени пользователя.

checkRun.rerequestedBy.user.performedVia.app.id string

checkRun.rerequestedBy.user.performedVia.app.displayName строка

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

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": "jane@acme.dev"      }    }  },  "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": "jane@acme.dev"      }    },    "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": "jane@acme.dev"      }    }  }}

Аннотации запуска проверки

EVENTrepository.check_run.annotations.created

Один запрос CreateCheckRunAnnotations добавляет аннотации к запуску проверки (repository.check_run.annotations.created). Аннотации можно только добавлять — изменить или удалить их по отдельности нельзя. Поэтому .created охватывает весь их жизненный цикл, а один запрос соответствует одному событию. check_run — это ссылка, а не снимок: чтобы получить статус, заключение и выходные данные запуска, используйте GetCheckRun. Аннотации в annotations перечислены в порядке запроса. Их может быть меньше, чем указано в annotations_count, если Origin ограничил список, чтобы тело запроса не превышало допустимый размер; остальные аннотации получите постранично с помощью ListCheckRunAnnotations. Как и в других вебхуках запусков проверки, полезная нагрузка не содержит контекста pull request: определите pull request по sha.

Поля полезной нагрузки

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.

checkRun object

Запуск проверки, к которому добавлены аннотации, вместе с его набором проверок.

checkRun.id string

checkRun.name string

checkRun.checkSuite object

Тестовый набор, к которому относится запуск проверки.

checkRun.checkSuite.id string

sha строка

SHA определённого head-коммита, к которому прикреплён запуск проверки (строчные шестнадцатеричные символы).

baseSha строка

База сравнения, относительно которой был зарегистрирован запуск проверки (в шестнадцатеричном формате со строчными буквами), если приложение её указало; отсутствие значения означает, что запуск не привязан к базе (см. CheckRun.base_sha).

annotations массив

Добавленные аннотации в порядке, указанном в запросе. Их может быть меньше, чем значение annotations_count, если Origin ограничил список.

annotations[].id строка

annotations[].checkRunId string

annotations[].annotationLevel строка

Одно из notice, warning или failure.

annotations[].message строка

annotations[].title string

annotations[].rawDetails строка

annotations[].createdAt строка

Временная метка в формате RFC 3339.

annotations[].updatedAt string

Временная метка в формате RFC 3339.

annotations[].location object

Необязательное указание места в исходном коде для аннотации запуска проверки. Поля path, start_line и end_line обязательны, если содержащая их аннотация задаёт это сообщение. path — канонический путь относительно корня репозитория; номера строк и столбцов — положительные координаты с нумерацией от 1 и включёнными границами. Поле columns поддерживается только для диапазона в пределах одной строки.

annotations[].location.path строка Обязательно

Максимальный размер в UTF-8: 4096 байт.

annotations[].location.startLine integer Обязательно

annotations[].location.endLine integer Обязательный

annotations[].location.columns object

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

annotations[].location.columns.startColumn integer

annotations[].location.columns.endColumn integer

annotationsCount integer

Количество аннотаций, добавленных запросом.

createdAt строка

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

Пример event.payload:

{  "repository": {    "id": "repo_01k2ja2000e0080000000000q4",    "name": "rocket",    "owner": {      "slug": "acme",      "id": "ns_01k2ja2000e0080000000000p3",      "type": "team"    }  },  "checkRun": {    "id": "cr_01k2ja2000e0080000000000g7",    "name": "unit-tests",    "checkSuite": {      "id": "crg_01k2ja2000e0080000000000h8"    }  },  "sha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4",  "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,        "columns": {          "startColumn": 5,          "endColumn": 31        }      }    },    {      "id": "cra_01k2ja2000e0080000000000v2",      "checkRunId": "cr_01k2ja2000e0080000000000g7",      "annotationLevel": "failure",      "message": "Three tests failed in telemetry.test.ts.",      "title": "Test failures",      "rawDetails": "FAIL telemetry.test.ts flushes on shutdown (expected 1 call, received 0)",      "createdAt": "2026-08-02T14:45:00Z",      "updatedAt": "2026-08-02T14:45:00Z"    }  ],  "annotationsCount": 2,  "createdAt": "2026-08-02T14:45:00Z"}

Установка создана

СОБЫТИЕinstallation.created

Поля полезной нагрузки

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". Ограничено 5 000 элементами; фактическое общее количество см. в 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, идентификатора или любого другого поля. Также может отсутствовать в данных вебхука, если не удалось определить пользователя, выполнившего действие.

installation.installedBy.handle string

Занятый пользователем handle профиля (идентификатор за cursor.com /@handle), без префикса @. Присутствует, только пока профиль пользователя публично виден; не передаётся для пользователей без занятого handle и для непубличных профилей.

installation.installedBy.performedVia object

Устанавливается, когда приложение действовало от имени этого пользователя с помощью пользовательского токена установки для действия, описываемого этим полем actor. Например, в поле автора комментария указывается приложение, создавшее комментарий, а не субъект, который позже отредактировал или удалил его. Отсутствует, если пользователь действовал напрямую, и может отсутствовать, если данные о делегировании недоступны.

installation.installedBy.performedVia.app object

Приложение, действовавшее от имени пользователя.

installation.installedBy.performedVia.app.id строка

installation.installedBy.performedVia.app.displayName строка

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

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": "jane@acme.dev"    }  },  "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

Понятное человеку отображаемое имя: имя и фамилия аккаунта, очищенные от пробелов по краям и соединённые пробелом, — ровно то имя, которое отображается в интерфейсе продукта. Не указывается, если у аккаунта нет имени; никогда не формируется из адреса электронной почты, идентификатора или любого другого поля. Также может отсутствовать в данных вебхука, если не удалось определить пользователя, выполнившего действие.

installation.installedBy.handle string

Заявленный пользователем псевдоним профиля (идентификатор, соответствующий cursor.com /@handle), без префикса @. Присутствует, только пока профиль пользователя открыт для всех; отсутствует у пользователей без заявленного псевдонима и в непубличных профилях.

installation.installedBy.performedVia object

Указывается, если приложение действовало от имени этого пользователя с помощью пользовательского токена установки, выполняя действие, описанное в поле actor. Например, в поле автора комментария указывается приложение, создавшее комментарий, а не тот, кто позже изменил или удалил его. Отсутствует, если пользователь действовал напрямую; также может отсутствовать, если данные о делегировании недоступны.

installation.installedBy.performedVia.app object

Приложение, действовавшее от имени пользователя.

installation.installedBy.performedVia.app.id строка

installation.installedBy.performedVia.app.displayName string

Зарегистрированное отображаемое имя приложения; если поле присутствует, оно никогда не бывает пустым. Опускается в payload, для которых не удалось определить приложение, а также для собственного фасадного актора Cursor.

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": "jane@acme.dev"    }  },  "app": {    "id": "app_01k2ja2000e0080000000000a1",    "displayName": "CI Status Bot"  }}

Установка приостановлена

СОБЫТИЕinstallation.suspended

Поля полезной нагрузки

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

Понятное человеку отображаемое имя: имя и фамилия аккаунта, очищенные от пробелов по краям и соединённые пробелом, — именно то имя, которое отображает интерфейс продукта. Не указывается, если у аккаунта нет имени; никогда не формируется на основе адреса электронной почты, идентификатора или любого другого поля. Также может отсутствовать в данных вебхука, если не удалось определить инициатора.

installation.installedBy.handle string

Заявленный пользователем идентификатор профиля (идентификатор за cursor.com /@handle), без префикса @. Присутствует, только пока профиль пользователя общедоступен; отсутствует у пользователей без заявленного идентификатора и у пользователей с непубличными профилями.

installation.installedBy.performedVia object

Устанавливается, когда приложение действовало от имени этого пользователя с помощью пользовательского токена установки для действия, описанного в этом поле actor. Например, в поле автора комментария указывается приложение, создавшее комментарий, а не субъект, который позже изменил или удалил его. Отсутствует, если пользователь действовал самостоятельно; также может отсутствовать, если данные о делегировании недоступны.

installation.installedBy.performedVia.app object

Приложение, действовавшее от имени пользователя.

installation.installedBy.performedVia.app.id строка

installation.installedBy.performedVia.app.displayName string

Зарегистрированное отображаемое имя приложения; если поле присутствует, оно никогда не бывает пустым. Опускается в payload, для которых не удалось разрешить приложение, а также для собственного фасадного актора Cursor.

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": "jane@acme.dev"    },    "suspendedAt": "2026-08-03T08:15:00Z"  },  "app": {    "id": "app_01k2ja2000e0080000000000a1",    "displayName": "CI Status Bot"  }}

Установка возобновлена

СОБЫТИЕinstallation.unsuspended

Поля полезной нагрузки

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

Отображаемое имя в удобочитаемом виде: имя и фамилия аккаунта, каждое без лишних пробелов по краям, соединённые пробелом, — в точности то имя, которое отображается в интерфейсе продукта. Не указывается, если у аккаунта нет имени; никогда не формируется на основе адреса электронной почты, идентификатора или любого другого поля. Также может отсутствовать в данных вебхука, если не удалось определить инициатора события.

installation.installedBy.handle string

Занятый пользователем handle профиля (идентификатор за cursor.com /@handle), без префикса @. Присутствует, только пока профиль пользователя публично виден; не передаётся для пользователей без занятого handle и для непубличных профилей.

installation.installedBy.performedVia object

Указывается, если приложение выполнило действие, описанное в поле actor, от имени этого пользователя с помощью пользовательского токена установки. Например, в поле автора комментария указывается приложение, создавшее комментарий, а не субъект, который позже изменил или удалил его. Отсутствует, если пользователь действовал напрямую; также может отсутствовать, если данные о делегировании недоступны.

installation.installedBy.performedVia.app object

Приложение, действовавшее от имени пользователя.

installation.installedBy.performedVia.app.id строка

installation.installedBy.performedVia.app.displayName строка

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

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": "jane@acme.dev"    }  },  "app": {    "id": "app_01k2ja2000e0080000000000a1",    "displayName": "CI Status Bot"  }}

Установка удалена

СОБЫТИЕinstallation.deleted

Поля полезной нагрузки

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

Отображаемое имя в удобочитаемом виде: имя и фамилия аккаунта, каждое без пробелов по краям и соединённые пробелом, — именно то имя, которое отображает интерфейс продукта. Не указывается, если у аккаунта нет имени; никогда не формируется из адреса электронной почты, идентификатора или любого другого поля. Также может отсутствовать в данных вебхука, если не удалось определить действующее лицо.

installation.installedBy.handle string

Заявленный пользователем идентификатор профиля (идентификатор в cursor.com /@handle), без префикса @. Отображается, только пока профиль пользователя общедоступен; не указывается для пользователей без заявленного идентификатора и для непубличных профилей.

installation.installedBy.performedVia object

Указывается, когда приложение действовало от имени этого пользователя, используя пользовательский токен установки, для действия, описываемого полем actor. Например, для автора комментария здесь указывается приложение, создавшее комментарий, а не актор, который позже изменил или удалил его. Отсутствует, если пользователь действовал напрямую; также может отсутствовать, если данные о делегировании недоступны.

installation.installedBy.performedVia.app object

Приложение, действовавшее от имени пользователя.

installation.installedBy.performedVia.app.id string

installation.installedBy.performedVia.app.displayName string

Зарегистрированное отображаемое имя приложения; если поле присутствует, оно никогда не бывает пустым. Опускается в payload, приложение которых не удалось разрешить, а также для собственного фасадного актора Cursor.

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": "jane@acme.dev"    },    "deletedAt": "2026-08-03T08:15:00Z"  },  "app": {    "id": "app_01k2ja2000e0080000000000a1",    "displayName": "CI Status Bot"  }}