Origin API
Origin находится на раннем этапе бета-тестирования и может измениться. При обновлении интеграции сверяйтесь со спецификацией OpenAPI.
Origin — платформа Cursor для разработки кода. Её публичный REST API позволяет приложениям и инструментам работать с репозиториями Origin, коммитами, проверками, pull request и установками приложений.
- Origin Apps проходят аутентификацию с помощью JWT приложений и токенов доступа установки. См. раздел Аутентификация.
- Полную спецификацию OpenAPI с подробными схемами и примерами можно посмотреть здесь.
- Агенты могут загрузить индекс llms.txt или полную справочную документацию в формате Markdown по адресу llms-full.txt.
Обзор
Приложения Origin используют модель согласия на установку в стиле OAuth и модель аутентификации в стиле GitHub App:
- Приложение подписывает краткосрочный EdDSA JWT своим приватным ключом Ed25519.
- Приложение обменивает этот JWT и идентификатор установки на краткосрочный токен доступа установки (
oit_…). - Токен установки обращается к API репозиториев и аутентифицирует Git по HTTPS в пределах одобренных для установки репозиториев и областей доступа.
- 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 на cursor.com/codebase.
- Управляйте настройками приложений на cursor.com/codebase/settings/apps.
- Создайте ключ подписи приложения и зарегистрируйте только открытый ключ.
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"API-ключи Cursor — это не Bearer-токены Origin. Для запросов с аутентификацией пользователя используйте Origin CLI: он обменивает личный пользовательский API-ключ на краткосрочный токен доступа, который принимает Origin. Не указывайте API-ключ Cursor напрямую в заголовке Authorization.
Создание ключа подписи приложения
Origin Apps используют для аутентификации пару ключей Ed25519. Создайте пару локально, затем зарегистрируйте только открытый ключ на cursor.com/codebase/settings/apps. Приложение может иметь до 10 активных ключей подписи.
Приватный ключ должен оставаться секретным. Не загружайте его, не вставляйте в настройки приложения, не коммитьте в репозиторий и не передавайте другим. Храните его в менеджере секретов. Cursor хранит только открытый ключ.
Создайте приватный ключ 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/pullsCLI обменивает личный пользовательский 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:readrepository: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 баллов в минуту |
Перед запуском обработчика каждая конечная точка списывает из этого лимита фиксированное количество баллов. Ошибки аутентификации и авторизации не расходуют баллы.
| Стоимость | Операции |
|---|---|
| 0 | Получить сведения об ограничении частоты запросов. Только статус; баллы не расходуются. |
| 1 | Большинство конечных точек чтения, а также Создать токен доступа установки |
| 5 | Обычные операции записи, а также следующие более ресурсоёмкие операции чтения: Получить коммит, Получить список файлов коммита, Получить список файлов сравнения, Получить список файлов pull request, Получить tarball репозитория и Поиск по содержимому |
| 10 | Создать приложение, Create Repo, Создать коммит из файлов, Объединить pull request, Проверить возможность объединения pull request, Заменить записи allowlist входящих IP-адресов и Transition Repo Mirror |
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 сводит попытки в два шага:
- Текущей попыткой набора проверок для пары
(actor, key)считается та, чьи текущие запуски, выбранные на втором шаге, имеют самое свежее значениеexternalUpdatedAt; набор без запусков ранжируется по своемуcreatedAt. При равенстве сравниваетсяcreatedAtнабора, затем егоid, от новых к старым. - Внутри этой попытки набора текущим запуском для
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 для прямой совместимости.
- Учитывайте заголовки
Retry-AfterиX-RateLimit-*. Используйте Получить сведения об ограничении частоты запросов, чтобы отслеживать оставшиеся баллы, не расходуя их.
Справочник конечных точек
Полные схемы компонентов доступны в спецификации 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 и текущий контракт платформы.
Приложения и установки
Получить лимит запросов
/v1/origin/rate_limitВозвращает текущую информацию о лимите запросов к публичному API для аутентифицированного принципала.
Запрос к этой конечной точке не расходует баллы лимита запросов. Ответ содержит общий поминутный лимит баллов, используемый другими конечными точками публичного API для этого принципала. См. ограничение частоты запросов.
Поля ответа
resources object
resources.core object
resources.core.limit integer
resources.core.remaining integer
resources.core.reset integer
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 }}Получить данные аутентифицированного приложения
/v1/origin/appВозвращает метаданные аутентифицированного приложения.
Поля ответа
id строка
displayName строка
webhookUrl строка
events массив
installation.* доставляются всегда и в этом списке не указываются.createdAt строка
updatedAt строка
installationRedirectUris массив
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" ]}Список установок приложения
/v1/origin/app/installationsВозвращает список установок аутентифицированного приложения.
Параметры запроса
pageSize целое число
pageToken строка
next_page_token предыдущего ответа. Пуст для первой страницы.Поля ответа
installations массив
installations[].id строка
installations[].appId строка
installations[].target object
installations[].target.slug строка
installations[].target.id строка
installations[].target.type строка
team, user. Пропускается, если неизвестно.installations[].createdAt строка
installations[].updatedAt строка
installations[].repoSelectionMode строка
installations[].scopes массив
installations[].installedBy object
installations[].installedBy.id строка
user_.installations[].installedBy.email строка
installations[].installedBy.displayName строка
installations[].installedBy.handle строка
@. Присутствует только пока этот профиль общедоступен; в противном случае отсутствует.installations[].suspendedAt строка
installations[].deletedAt строка
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" ] } ]}Получить установку приложения
/v1/origin/app/installations/{installationId}Возвращает сведения об одной установке для аутентифицированного приложения.
repoSelectionMode имеет значение all или selected.
Параметры пути
installationId строка Обязательно
Поля ответа
id строка
appId строка
target object
target.slug строка
target.id строка
target.type строка
team, user. Пропускается, если неизвестно.createdAt строка
updatedAt строка
repoSelectionMode строка
scopes массив
installedBy object
installedBy.id строка
user_.installedBy.email строка
installedBy.displayName строка
installedBy.handle строка
@. Указан только пока этот профиль общедоступен; в противном случае отсутствует.suspendedAt строка
deletedAt строка
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" ]}Удалить установку приложения
/v1/origin/app/installations/{installationId}Удаляет установку, принадлежащую аутентифицированному приложению, и предотвращает выпуск новых токенов установки. Уже выпущенные краткоживущие токены могут оставаться действительными до истечения срока действия (не более 15 минут). Тело ответа пустое.
Параметры пути
installationId строка Обязательно
Поля ответа
Успешные запросы не возвращают тело ответа.
curl --request DELETE \ --url 'https://api.cursor.com/v1/origin/app/installations/INSTALLATION_ID' \ --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN'Ответ:
204 No ContentСоздать токен доступа установки
/v1/origin/app/installations/{installationId}/access_tokensСоздаёт токен доступа установки для аутентифицированного приложения.
Требуется аутентификация с помощью JWT, подписанного приложением, как в GetAuthenticatedApp. Токен ограничен указанной установкой, которая должна принадлежать аутентифицированному приложению. Вызывающая сторона может ограничить токен подмножеством разрешённых областей доступа установки и доступных репозиториев.
В repositoryIds можно указать зеркальный репозиторий. Полученный токен содержит области доступа установки, а Origin по-прежнему применяет ограничение зеркала к каждому запросу: см. Зеркальные репозитории.
Параметры пути
installationId строка Обязательно
Тело запроса
scopes массив
repositoryIds массив
Поля ответа
token строка
expiresAt строка
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"}Создать пользовательский токен установки
/v1/origin/app/installations/{installationId}/user_access_tokensСоздаёт пользовательский токен установки, который действует от имени одного участника пространства имён установки.
Установка должна принадлежать аутентифицированному приложению и иметь принятую область доступа namespace:user_tokens:write. Укажите пользователя ровно одним из параметров: userId или userEmail. Для неизвестного, неоднозначного или неразрешённого пользователя возвращается PermissionDenied (HTTP 403) без указания, какое именно условие не выполнено.
Доступ токена ограничен правами доступа, которые есть одновременно у установки и у пользователя. Если заданы и scopes, и repositoryIds, каждая область доступа должна быть разрешена для обоих субъектов в каждом указанном репозитории, иначе запрос завершится ошибкой PermissionDenied (HTTP 403). Полное описание процесса см. в разделе Действия от имени пользователей.
Параметры пути
installationId строка Обязательный
Тело запроса
userId строка
user_… в том виде, в каком он возвращается в полезной нагрузке actor. Задайте ровно один из параметров: userId или userEmail.userEmail строка
scopes массив
namespace:user_tokens:write возвращает InvalidArgument (HTTP 400): эта область разрешает выпуск токенов и не может быть делегирована токену. Если значение пустое или не указано, ограничения по областям доступа не применяются.repositoryIds массив
Поля ответа
token строка
expiresAt строка
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"}Список репозиториев установки приложения
/v1/origin/installation/reposВозвращает список репозиториев, доступных аутентифицированной установке приложения.
Требуется токен доступа установки (oit_), выпущенный методом CreateInstallationAccessToken.
Партнёры находят свои репозитории через эту конечную точку. Элементы списка содержат краткие сведения о репозиториях; используйте Get Repo, чтобы получить полные временные метки. Get Repo включает поле cloneUrl, доступное только для чтения.
Результаты включают зеркалированные репозитории, которые доступны установке приложения только для чтения: см. Зеркалированные репозитории.
Параметры запроса
pageSize integer
pageToken строка
next_page_token предыдущего ответа. Пустой для первой страницы. При запросе последующих страниц необходимо использовать тот же фильтр. Параметр pageSize в последующем запросе применяется к этой странице; не указывайте его, чтобы сохранить прежний размер страницы.filter строка
owner/repo с одним слешем сопоставляет каждую половину с соответствующим полем. Пробелы в начале и конце игнорируются; пустое значение не применяет фильтр.Поля ответа
repositories массив
repositories[].id строка
repositories[].name строка
repositories[].fullName строка
repositories[].owner object
repositories[].owner.slug строка
repositories[].owner.id строка
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
repositories[].deleteBranchOnMerge boolean
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"}Список доставок вебхуков
/v1/origin/app/webhook/deliveriesПеречисляет доставки вебхуков для аутентифицированного приложения, от новых к старым.
Доставка — это одно событие, предназначенное для одного приложения; её идентификатор — значение заголовка webhook-id, которое видит получатель. delivered=false — предикат восстановления: он выбирает все доставки, которые ни разу не получили ответ 2xx, включая доставки, у которых во время сбоя закончились попытки повторной отправки.
Доставки можно перечислять в течение семи дней после их создания и только пока у вашего приложения есть активная установка в пространстве имён доставки. События жизненного цикла, ориентированные на приложение, такие как installation.deleted, остаются видимыми после удаления установки, которое они описывают.
Параметры запроса
delivered логический
delivered_at. delivered=false — предикат восстановления: он вычисляется на стороне сервера, поэтому не может пропустить доставку, у которой во время сбоя исчерпалась лестница повторных попыток, как это может произойти с заданным вызывающей стороной временным окном.eventType строка
pull_request.created.installationId строка
WebhookDelivery.installation.id).createdAfter строка
createdBefore строка
pageSize целое число
pageToken строка
next_page_token предыдущего ответа. Пуст для первой страницы.Поля ответа
deliveries массив
deliveries[].id строка
webhook-id, которое видит получатель; используйте его как ключ идемпотентности.deliveries[].event object
deliveries[].event.id строка
deliveries[].event.type строка
deliveries[].installation object
id — текущая активная установка для целевого владельца; не задано, если такой нет (возможно только для событий жизненного цикла, ориентированных на приложение, после деинсталляции).deliveries[].installation.id строка
deliveries[].installation.target object
deliveries[].installation.target.slug строка
deliveries[].installation.target.id строка
deliveries[].installation.target.type строка
team, user. Пропускается, если неизвестно.deliveries[].createdAt строка
deliveries[].deliveredAt строка
deliveries[].lastAttempt object
deliveries[].lastAttempt.id строка
deliveries[].lastAttempt.deliveryId строка
deliveries[].lastAttempt.trigger строка
automatic, manual.deliveries[].lastAttempt.responseStatusCode целое число
deliveries[].lastAttempt.latencyMs целое число
deliveries[].lastAttempt.errorMessage строка
deliveries[].lastAttempt.attemptedAt строка
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" } } ]}Пакетная повторная доставка вебхука
/v1/origin/app/webhook/deliveries:batchRedeliverЗапрашивает у Origin повторную отправку доставок.
Запрос означает «обеспечить отправку каждой из них», а не «добавить ещё одну отправку». Он возвращает по одному результату для каждого уникального входного значения, а не завершает весь пакет ошибкой из-за некорректной записи, поэтому один просроченный ID не может заблокировать остальную страницу восстановления. 202 означает, что отправки поставлены в очередь; сама доставка выполняется асинхронно, поэтому отслеживайте результаты через Список доставок вебхука.
Тело запроса
deliveryIds массив Обязательно
pageSize в Список доставок вебхука. Дубликаты удаляются с сохранением порядка первого появления. Пустой список или более 100 уникальных записей возвращает InvalidArgument (HTTP 400).Поля ответа
results массив
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 вебхук
/v1/origin/app/webhook/pingsОтправляет тестовую доставку на 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
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}Получить приложение
/v1/origin/apps/{appId}Возвращает одно приложение по его идентификатору. Это операция чтения для управления, предназначенная для издателей приложения; Получить данные аутентифицированного приложения — аналогичная операция чтения собственных данных по JWT-credential самого приложения.
Path Parameters
appId string обязательный
app_.Response Fields
id string
app_.displayName string
webhookUrl string
events array
installation.* доставляются всегда и здесь не отображаются.createdAt string
updatedAt string
installationRedirectUris array
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" ]}Обновление приложения
/v1/origin/apps/{appId}Обновляет настройки приложения. Пропущенные поля остаются без изменений; необходимо указать хотя бы одно поле, значение которого можно задать. Очистка webhookUrl путём передачи пустой строки отключает отправку исходящих веб-хуков и отменяет ожидающие отправки приложения; повторная установка URL не возобновляет отменённые отправки.
Параметры пути
appId строка Обязательное
app_.Тело запроса
displayName строка
webhookUrl строка
events object
events.events array
installation.* доставляются всегда, и указывать их здесь нельзя.description строка
websiteUrl строка
installationRedirectUris object
installationRedirectUris.installationRedirectUris массив
defaultScopes object
defaultScopes.scopes массив
Поля ответа
id строка
app_.displayName строка
webhookUrl строка
events array
installation.* доставляются всегда и здесь не отображаются.createdAt строка
updatedAt строка
installationRedirectUris массив
namespaceSlug строка
description строка
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" ]}Добавление ключа подписи приложения
/v1/origin/apps/{appId}/signing_keysДобавляет ключ подписи в приложение. У приложения может быть лишь ограниченное количество активных ключей подписи; при попытке добавить ключ сверх лимита возвращается FailedPrecondition (HTTP 400) — до тех пор, пока не будет отозван другой ключ. Для уже зарегистрированного ключа возвращается AlreadyExists (HTTP 409 Conflict).
параметры пути
appId строка обязательный
app_.тело запроса
publicKey строка обязательный
поля ответа
kid строка
kid и для отзыва ключа.createdAt строка
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"}Отзыв ключа подписи приложения
/v1/origin/apps/{appId}/signing_keys/{kid}Отзывает ключ подписи приложения по его key ID. App JWT, подписанные отозванным ключом, перестают проходить аутентификацию. Последний активный ключ подписи отозвать нельзя — такой запрос возвращает FailedPrecondition (HTTP 400). Тело ответа пустое.
параметры пути
appId строка обязательный
app_.kid строка обязательный
поля ответа
При успешном запросе тело ответа отсутствует.
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Список приложений пространства имён
/v1/origin/namespaces/{namespaceSlug}/appsВозвращает список приложений, принадлежащих пространству имён, начиная с самых новых. В ответах передаются только метаданные для отображения; чтобы получить конфигурацию вебхука конкретного приложения, используйте Get App.
параметры пути
namespaceSlug строка обязательный
Query Parameters
pageSize integer
pageToken строка
next_page_token предыдущего ответа. Для первой страницы — пустая строка.поля ответа
apps массив
apps[].id строка
app_.apps[].displayName строка
apps[].description строка
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": ""}Создать приложение
/v1/origin/namespaces/{namespaceSlug}/appsСоздаёт приложение, принадлежащее пространству имён. Приложения создаются приватными. Сгенерируйте пару ключей 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 строка Обязательный
Тело запроса
displayName string Обязательно
publicKey строка Обязательный
webhookUrl строка
events array
installation.*, которые доставляются всегда и которые нельзя перечислить здесь.description строка
websiteUrl строка
installationRedirectUris массив
defaultScopes массив
repository:contents:read. При установке области доступа по-прежнему можно указать явно.Поля ответа
id строка
app_.displayName строка
webhookUrl строка
events array
installation.* доставляются всегда и здесь не отображаются.createdAt строка
updatedAt строка
installationRedirectUris массив
namespaceSlug строка
description string
websiteUrl строка
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" ]}Добавление репозиториев для установки приложения
/v1/origin/namespaces/{namespaceSlug}/installations/{installationId}/reposДобавляет репозитории в список репозиториев установки и возвращает обновлённую установку. Запись добавочная: перечисленные репозитории объединяются с текущим выбором, запрос, все репозитории которого уже предоставлены, успешно выполняется без изменений, а области доступа установки никогда не меняются.
Каждый указанный репозиторий должен принадлежать целевому пространству имён, иначе запрос возвращает FailedPrecondition (HTTP 400) и ничего не предоставляется. Та же ошибка возвращается для установки, которая уже охватывает все репозитории пространства имён (repoSelectionMode равен all), для приостановленной установки и для установки, созданной до внедрения областей доступа для отдельных установок. Установка, которая не существует или принадлежит другому пространству имён, возвращает 404; в сообщении указывается страница согласия, которую нужно открыть, если приложение никогда не устанавливалось в этом пространстве имён, поскольку эта конечная точка не может выполнить первую установку.
Вызывающая сторона должна использовать учётные данные пользователя Cursor с правами управления установкой в этом пространстве имён. Токены приложения, токены установки и сервисные аккаунты не позволяют изменять репозитории установки.
Параметры пути
namespaceSlug string Обязательный
installationId string Обязательное
Тело запроса
repoIds массив Обязательный
Поля ответа
id строка
appId строка
цель object
target.slug строка
target.id строка
target.type строка
team, user. Не указывается, если неизвестен.createdAt строка
updatedAt строка
repoSelectionMode строка
scopes массив
installedBy object
installedBy.id строка
user_.installedBy.email строка
installedBy.displayName строка
installedBy.handle строка
@. Указывается только пока этот профиль общедоступен; в противном случае опускается.suspendedAt строка
deletedAt строка
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.
Список пространств имён
/v1/origin/namespacesВозвращает отсортированный по слагу список пространств имён, в которых вы можете просматривать список репозиториев.
Кандидаты — пространства имён ваших команд, ваше личное пространство имён и пространства имён с репозиториями, к которым вам предоставлен доступ. Возвращаются только те, в которых у вас есть право namespace:repositories:read, поэтому любой результат можно использовать как ownerSlug в List Repos.
Вызов должен выполняться с учётными данными пользователя Cursor; отдельная область доступа для него не требуется. Для токенов приложений, токенов установки и сервисных аккаунтов возвращается PermissionDenied (HTTP 403).
Параметры запроса
pageSize integer
pageToken string
next_page_token предыдущего ответа. Для первой страницы оставьте пустым. pageSize в последующем запросе применяется к этой странице; не указывайте его, чтобы сохранить прежний размер страницы.Поля ответа
namespaces array
namespaces[].namespace object
namespaces[].namespace.slug string
ownerSlug в List Repos.namespaces[].namespace.id string
namespaces[].namespace.type string
team, user. Не возвращается, если тип неизвестен.namespaces[].viewerCanCreateRepositories boolean
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 } ]}Список репозиториев
/v1/origin/repos/{ownerSlug}Перечисляет репозитории, принадлежащие сущности-владельцу.
Параметры пути
ownerSlug строка Обязательно
Параметры запроса
pageSize integer
pageToken строка
next_page_token предыдущего ответа. Пустой для первой страницы. pageSize в последующем запросе применяется к этой странице; не указывайте его, чтобы сохранить прежний размер страницы.filter строка
Поля ответа
repositories массив
repositories[].id строка
repositories[].name строка
repositories[].fullName строка
repositories[].owner object
repositories[].owner.slug строка
repositories[].owner.id строка
repositories[].owner.type строка
team, user. Пропускается, если неизвестно.repositories[].defaultBranch строка
repositories[].createdAt строка
repositories[].updatedAt строка
repositories[].pushedAt строка
repositories[].cloneUrl строка
repositories[].mirror object
repositories[].mirror.source строка
github.repositories[].mirror.sourceId строка
repositories[].mirror.status строка
inbound.repositories[].visibility строка
internal, private.repositories[].allowMergeCommit логическое значение
repositories[].allowSquashMerge boolean
repositories[].deleteBranchOnMerge логическое значение
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" } ]}Получить репозиторий
/v1/origin/repos/{ownerSlug}/{repoName}Возвращает один репозиторий по его идентификатору (owner_id, name).
cloneUrl — это URL для клонирования по HTTPS, доступный только для вывода. Операция «Получить репозиторий» включает cloneUrl.
Параметры пути
ownerSlug строка Обязательно
repoName строка Обязательно
Поля ответа
id строка
name строка
fullName строка
owner object
owner.slug строка
owner.id строка
owner.type строка
team, user. Пропускается, если неизвестно.defaultBranch строка
createdAt строка
updatedAt строка
pushedAt строка
cloneUrl строка
mirror object
mirror.source строка
github.mirror.sourceId строка
mirror.status строка
inbound.visibility строка
internal, private.allowMergeCommit boolean
allowSquashMerge boolean
deleteBranchOnMerge логическое значение
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
/v1/origin/repos/{ownerSlug}/{repoName}Обновляет настройки репозитория. Неуказанные поля остаются без изменений; необходимо указать хотя бы одно поле, доступное для задания.
Настройки применяются независимыми группами в фиксированном порядке: ветка по умолчанию, автоматическое удаление head-ветки, видимость, затем методы слияния. Обновление неатомарно для разных групп. Если группа отклонена, все предшествующие ей группы уже применены и остаются применёнными. Исправьте отклонённую группу и повторите попытку, чтобы получить запрошенное состояние. Ответ содержит репозиторий в состоянии после применения последней группы.
Запрос, в котором не задано ни одного поля, возвращает InvalidArgument (HTTP 400). Параллельное изменение ветки по умолчанию возвращает 409 Conflict.
Параметры пути
ownerSlug string Обязательный
repoName string Обязательный
Тело запроса
defaultBranch string
FailedPrecondition (HTTP 400).allowMergeCommit boolean
allowSquashMerge, при этом хотя бы одно из двух значений должно быть true. Если передать одно без другого, вернётся InvalidArgument (HTTP 400).allowSquashMerge boolean
allowMergeCommit, и по крайней мере один из этих двух должен быть true. Отправка одного без другого возвращает InvalidArgument (HTTP 400).deleteBranchOnMerge boolean
FailedPrecondition (HTTP 400).visibility string
internal, private. Не указывайте его, чтобы оставить видимость без изменений.Поля ответа
id строка
name строка
fullName строка
owner object
owner.slug string
owner.id string
owner.type string
team, user. Опускается, если тип неизвестен.defaultBranch string
createdAt string
updatedAt string
pushedAt string
cloneUrl string
mirror object
mirror.source строка
github.mirror.sourceId string
mirror.status строка
inbound.visibility string
internal, private.allowMergeCommit boolean
allowSquashMerge boolean
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}Создать репозиторий
/v1/origin/repos/{ownerSlug}Создаёт репозиторий, принадлежащий владельцу.
На момент запроса владелец должен иметь право записывать в 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 строка
Поля ответа
id строка
name строка
fullName строка
owner object
owner.slug строка
owner.id строка
owner.type строка
team, user. Пропускается, если неизвестно.defaultBranch строка
createdAt строка
updatedAt строка
pushedAt строка
cloneUrl строка
mirror object
mirror.source строка
github.mirror.sourceId строка
mirror.status строка
inbound.visibility строка
internal, private.allowMergeCommit логическое значение
allowSquashMerge логическое значение
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"}Список веток
/v1/origin/repos/{ownerSlug}/{repoName}/branchesВозвращает ветки репозитория и их последние коммиты в порядке возрастания имён с пагинацией по page_size и page_token.
Параметры пути
ownerSlug строка Обязательный
repoName строка Обязательный
Параметры запроса
pageSize integer
pageToken строка
next_page_token предыдущего ответа. Для первой страницы оставьте пустым. Кодирует позицию, с которой продолжается выдача. Значение pageSize в последующем запросе применяется к этой странице; не указывайте его, чтобы сохранить прежний размер страницы.Поля ответа
branches массив
branches[].name строка
branches[].commit object
branches[].commit.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" } } ]}Получить право доступа участника к репозиторию
/v1/origin/repos/{ownerSlug}/{repoName}/collaborators/{userId}/permissionВозвращает право доступа пользователя к репозиторию с учётом его прямых и унаследованных грантов. Результат определяется грантами пользователя и не зависит от учётных данных, с которыми выполняется запрос. Поддерживаются только репозитории, для которых источником истины является Origin. Во всех следующих случаях возвращается одна и та же ошибка 404: гранты пользователя не дают доступа, ID не соответствует активному аккаунту, репозиторий является зеркальным, репозиторий не существует или недоступен вам.
Параметры пути
ownerSlug string Обязательный
repoName string Обязательный
userId string Обязательный
user_…). При некорректном ID возвращается InvalidArgument (HTTP 400).Поля ответа
user object
user.id string
user.email string
user.displayName string
user.handle string
@. Возвращается, только пока профиль общедоступен.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-архив репозитория
/v1/origin/repos/{ownerSlug}/{repoName}/tarball/{ref}Скачивает сжатый 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 строка обязательно
refs/heads/... или refs/tags/... либо символьная ссылка HEAD. Не является glob-шаблоном или revspec, поэтому <rev>~3 отклоняется. Пустое значение использует ветку репозитория по умолчанию.Поля ответа
sha строка
downloadUrl строка
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"}Синхронизация зеркала
/v1/origin/repos/{ownerSlug}/{repoName}:syncMirrorСинхронизирует одну Git-ссылку зеркального репозитория с вышестоящим источником. Возвращает HTTP 200, когда цель синхронизации достигнута, или HTTP 202, если синхронизация ещё ожидается. wait=false (по умолчанию) запускает синхронизацию и обычно возвращает 202; 200 возвращается сразу, если sha уже доступен из ref. wait=true блокирует выполнение, пока цель не будет достигнута или не истечёт лимит ожидания (~2 минуты); в этом случае также возвращается 202, а синхронизация продолжается в фоновом режиме. Репозитории, не синхронизируемые с вышестоящим источником, отклоняются.
Параметры пути
ownerSlug строка Обязательный
repoName строка Обязательный
Тело запроса
ref строка Обязательный
refs/ и содержать имя ссылки после этого префикса, например refs/heads/main или refs/tags/v1. Короткие имена, такие как main, отклоняются с INVALID_ARGUMENT.wait boolean
sha строка
ref. Если значение задано и доступно из ref, вызов завершается раньше, не дожидаясь завершения других операций с зеркалом. Другие значения отклоняются с INVALID_ARGUMENT.Поля ответа
synced boolean
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
Проверки
- При первом вызове 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, а также правила меток времени и сроков, общие для этих конечных точек.
Запуск последующей проверки
/v1/origin/repos/{ownerSlug}/{repoName}/check-runsСоздаёт или обновляет набор проверок и запуск проверки с помощью токена доступа установки с правом 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 строка Обязательно
baseSha строка
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
InvalidArgument (HTTP 400).checkRun.completedAt string
InvalidArgument (HTTP 400). То же происходит, если значение предшествует startedAt, когда оба значения отправляются вместе.checkRun.detailsUrl строка
checkRun.externalId string Обязательно
checkRun.output object
checkRun.output.title string
checkRun.output.summary string
checkRun.output.text string
checkRun.deadlineAt string
InvalidArgument (HTTP 400), а не ограничиваются допустимым значением. Не указывайте его при создании, чтобы не задавать крайний срок; не указывайте его при обновлении, чтобы оставить сохранённый крайний срок без изменений.checkRun.isRerequestable логическое значение
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 строка
checkSuite.repository.owner.id string
checkSuite.repository.owner.type строка
team, user. Пропускается, если неизвестно.checkSuite.sha string
checkSuite.baseSha строка
baseSha версии pull request. Входит в идентичность попытки, поэтому приложение может зарегистрировать по одной попытке на каждую пару head-ветки и base-ветки. Отсутствует для попытки, не привязанной к base-ветке: такая попытка относится ко всем pull request на sha.checkSuite.key string
checkSuite.name string
checkSuite.detailsUrl string
checkSuite.createdAt строка
checkSuite.updatedAt строка
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 строка
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 строка
checkRun.repository.owner.id string
checkRun.repository.owner.type строка
team, user. Пропускается, если неизвестно.checkRun.checkSuite object
checkRun.checkSuite.id строка
checkRun.sha string
checkRun.baseSha строка
baseSha набора, которому принадлежит запуск. Отсутствует, если запуск не зависит от базы.checkRun.key string
checkRun.name строка
checkRun.status string
checkRun.conclusion строка
status равен completed.checkRun.detailsUrl строка
checkRun.externalUpdatedAt строка
checkRun.startedAt string
checkRun.completedAt string
checkRun.createdAt string
checkRun.updatedAt строка
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 строка
checkRun.actor.serviceAccount object
checkRun.actor.serviceAccount.id string
checkRun.output object
checkRun.output.title string
checkRun.output.summary string
checkRun.output.text string
checkRun.deadlineAt string
checkRun.isRerequestable логическое значение
checkRun.rerequestedAt string
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"}Пакетное добавление/обновление запусков проверок
/v1/origin/repos/{ownerSlug}/{repoName}/check-runs:batchUpsertАтомарно добавляет или обновляет несколько запусков проверок, принадлежащих одному набору. Запрос принимает не более 10 запусков и отклоняет записи с повторяющимися идентификаторами (external_id, key). Либо фиксируются все запуски, либо весь запрос откатывается.
Каждый запуск принимает тот же необязательный параметр deadlineAt, что и Post Check Run.
Origin применяет правило упорядочивания по externalUpdatedAt к каждому запуску отдельно. Запуск, проигнорированный как устаревший, не приводит к сбою всего пакета: в ответе на его месте возвращается сохранённый запуск, а results[].outcome сообщает вердикт по каждому запуску в порядке их следования в запросе.
Параметры пути
ownerSlug строка Обязательно
repoName строка Обязательно
Тело запроса
headSha строка Обязательно
baseSha строка
baseSha в Post Check Run. Не указывайте это поле для запусков, не зависящих от базовой ветви. Пустая строка приводит к ошибке InvalidArgument (HTTP 400).checkSuite object Обязательное
checkSuite.key строка Обязательно
checkSuite.name string Обязательно
checkSuite.detailsUrl string
checkSuite.externalId строка Обязательно
checkRuns массив Обязательно
(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
InvalidArgument (HTTP 400).checkRuns[0].completedAt строка
InvalidArgument (HTTP 400), как и значение, предшествующее startedAt, если оба значения переданы вместе.checkRuns[0].detailsUrl string
checkRuns[0].externalId string Обязательно
checkRuns[0].output object
checkRuns[0].output.title string
checkRuns[0].output.summary string
checkRuns[0].output.text string
checkRuns[0].deadlineAt string
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 строка
checkSuite.repository.owner.id string
checkSuite.repository.owner.type string
team, user. Пропускается, если неизвестно.checkSuite.sha строка
checkSuite.baseSha строка
baseSha версии pull request. Она входит в идентификатор попытки, поэтому приложение может сообщать по одной попытке на каждую пару head-ветки и base-ветки. Отсутствует для попытки, не привязанной к base-ветке: такая попытка применяется ко всем pull request для sha.checkSuite.key строка
checkSuite.name строка
checkSuite.detailsUrl string
checkSuite.createdAt string
checkSuite.updatedAt строка
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
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
checkRuns[].repository.owner.id string
checkRuns[].repository.owner.type строка
team, user. Пропускается, если неизвестно.checkRuns[].checkSuite object
checkRuns[].checkSuite.id строка
checkRuns[].sha строка
checkRuns[].baseSha строка
baseSha набора проверок, которому принадлежит запуск. Отсутствует, если запуск не привязан к базе сравнения.checkRuns[].key строка
checkRuns[].name string
checkRuns[].status string
checkRuns[].conclusion string
status имеет значение completed.checkRuns[].detailsUrl string
checkRuns[].externalUpdatedAt string
checkRuns[].startedAt string
checkRuns[].completedAt строка
checkRuns[].createdAt string
checkRuns[].updatedAt string
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 строка
checkRuns[].actor.serviceAccount object
checkRuns[].actor.serviceAccount.id string
checkRuns[].output object
checkRuns[].output.title string
checkRuns[].output.summary string
checkRuns[].output.text строка
checkRuns[].deadlineAt строка
checkRuns[].isRerequestable boolean
checkRuns[].rerequestedAt строка
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" } ]}Получить запуск проверки
/v1/origin/repos/{ownerSlug}/{repoName}/check-runs/{checkRunId}Возвращает один запуск проверки по присвоенному сервером идентификатору (cr_...).
Параметры пути
ownerSlug string Обязательно
repoName строка Обязательно
checkRunId string Обязательно
cr_...).Поля ответа
id string
repository object
repository.id строка
repository.name строка
repository.owner object
repository.owner.slug string
repository.owner.id строка
repository.owner.type строка
team, user. Пропускается, если неизвестно.checkSuite object
checkSuite.id string
sha string
baseSha строка
baseSha родительского набора проверок. Отсутствует для запуска, не зависящего от базы.key строка
name string
status string
conclusion string
status имеет значение completed.detailsUrl string
externalUpdatedAt string
startedAt строка
completedAt string
createdAt string
updatedAt string
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 строка
actor.serviceAccount object
actor.serviceAccount.id строка
output object
output.title string
output.summary string
output.text string
deadlineAt строка
isRerequestable boolean
rerequestedAt строка
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." }}Список аннотаций запуска проверки
/v1/origin/repos/{ownerSlug}/{repoName}/check-runs/{checkRunId}/annotationsПеречисляет аннотации запуска проверки в порядке возрастания идентификатора.
Идентификаторы аннотаций можно сортировать по времени, поэтому порядок идентификаторов по возрастанию соответствует порядку создания. Токен страницы фиксирует область действия для оставшейся последовательности.
Параметры пути
ownerSlug string Обязательное
repoName string Обязательное
checkRunId string Обязательно
Параметры запроса
pageSize integer
pageToken string
nextPageToken предыдущего ответа. Для первой страницы опустите. Параметр pageSize в последующем запросе применяется к запрашиваемой странице; опустите его, чтобы сохранить предыдущий размер страницы.Поля ответа
annotations массив
annotations[].id string
annotations[].checkRunId string
annotations[].annotationLevel string
notice, warning, failure.annotations[].message string
annotations[].title string
annotations[].rawDetails string
annotations[].createdAt string
annotations[].updatedAt string
annotations[].location object
annotations[].location.path string
annotations[].location.startLine integer
annotations[].location.endLine integer
annotations[].location.columns object
annotations[].location.columns.startColumn integer
annotations[].location.columns.endColumn integer
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 } } ]}Создать аннотации для проверки выполнения
/v1/origin/repos/{ownerSlug}/{repoName}/check-runs/{checkRunId}/annotationsДобавляет от 1 до 25 аннотаций к запуску проверки одной атомарной пакетной операцией.
Один check run содержит не более 100 аннотаций. Пакет, из‑за которого этот лимит будет превышен, отклоняется с ошибкой ResourceExhausted (HTTP 429), и ничего не записывается; пакет вне диапазона от 1 до 25 отклоняется с ошибкой InvalidArgument (HTTP 400). Операция только добавляет данные и не является идемпотентной, поэтому повторная попытка после неясного сбоя транспорта может привести к добавлению дубликатов и расходованию квоты. Одинаковое содержимое допускается.
Параметры пути
ownerSlug string Обязательное
repoName строка Обязательное
checkRunId string Обязательный
Тело запроса
annotations массив Обязательно
annotations[].annotationLevel string Обязательное
notice, warning, failure.annotations[].message string Обязательное
annotations[].title string
annotations[].rawDetails string
annotations[].location object
annotations[].location.path string Обязательное
annotations[].location.startLine integer Обязательно
annotations[].location.endLine integer Обязательно
startLine.annotations[].location.columns object
startLine и endLine находятся в одной и той же строке, и оба столбца должны быть переданы вместе.annotations[].location.columns.startColumn целое число
annotations[].location.columns.endColumn целое число
startColumn.Поля ответа
annotations array
annotations[].id string
annotations[].checkRunId string
annotations[].annotationLevel string
notice, warning, failure.annotations[].message string
annotations[].title string
annotations[].rawDetails string
annotations[].createdAt string
annotations[].updatedAt string
annotations[].location object
annotations[].location.path string
annotations[].location.startLine integer
annotations[].location.endLine целое число
annotations[].location.columns object
annotations[].location.columns.startColumn целое число
annotations[].location.columns.endColumn целое число
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 } } ]}Повторный запрос запуска проверки
/v1/origin/repos/{ownerSlug}/{repoName}/check-runs/{checkRunId}/rerequestЗапрашивает у приложения, создавшего запуск проверки, повторно выполнить проверку. 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
repository.owner.id string
repository.owner.type строка
team, user. Пропускается, если неизвестно.checkSuite object
checkSuite.id string
sha string
baseSha строка
baseSha набора проверок, которому принадлежит запуск. Отсутствует для запуска, не зависящего от базы.key строка
name string
status string
conclusion string
status имеет значение completed.detailsUrl строка
externalUpdatedAt string
startedAt строка
completedAt строка
createdAt string
updatedAt строка
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 строка
actor.serviceAccount object
actor.serviceAccount.id строка
output object
output.title string
output.summary string
output.text string
deadlineAt строка
isRerequestable boolean
rerequestedAt строка
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" } }}Получить набор проверок
/v1/origin/repos/{ownerSlug}/{repoName}/check-suites/{checkSuiteId}Возвращает метаданные набора проверок по идентификатору, назначенному сервером (crg_...). Не включает запуски проверок; для получения запусков этого набора используйте ListCheckRunsForSuite.
Параметры пути
ownerSlug string Обязательное
repoName string Обязательно
checkSuiteId строка Обязательно
crg_...).Поля ответа
id string
repository object
repository.id строка
repository.name string
repository.owner object
repository.owner.slug string
repository.owner.id string
repository.owner.type string
team, user. Не указывается, если неизвестно.sha строка
baseSha строка
baseSha версии pull request. Он входит в идентификатор попытки, поэтому приложение может отправить отчёт об одной попытке для каждой пары head и base. Поле отсутствует для попытки, не зависящей от базового коммита: такая попытка применима ко всем pull request с sha.key string
name строка
detailsUrl string
createdAt string
updatedAt string
externalId string
actor object
actor.user object
actor.user.id string
actor.user.email string
actor.user.displayName string
actor.user.handle string
@. Присутствует только пока профиль виден публично; в противном случае отсутствует.actor.app object
actor.app.id строка
actor.app.displayName string
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" } }}Список запусков проверок для набора
/v1/origin/repos/{ownerSlug}/{repoName}/check-suites/{checkSuiteId}/check-runsПеречисляет текущие запуски проверок набора. Если ключ запуска был указан в наборе более одного раза, возвращается только последняя попытка для этого ключа; вытесненные попытки не включаются. Post Check Run определяет, какая попытка считается последней. Повторно запрошенный запуск остаётся в списке и отображается как ожидающий: поле status имеет значение rerequested, поле rerequestedAt заполнено, а его вытесненное значение conclusion и временные отметки остаются без изменений, пока приложение, которому принадлежит запуск, не ответит. Просмотреть вытесненную попытку по её идентификатору можно с помощью Get Check Run. Результаты разбиты на страницы.
Параметры пути
ownerSlug строка Обязательно
repoName string Обязательно
checkSuiteId string Обязательно
crg_...).Параметры запроса
pageSize integer
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 строка
checkRuns[].repository.owner.id string
checkRuns[].repository.owner.type string
team, user. Не указывается, если неизвестен.checkRuns[].checkSuite object
checkRuns[].checkSuite.id строка
checkRuns[].sha строка
checkRuns[].baseSha строка
baseSha набора проверок-владельца. Отсутствует для запуска, не привязанного к базе.checkRuns[].key string
checkRuns[].name строка
checkRuns[].status строка
checkRuns[].conclusion string
completed у status.checkRuns[].detailsUrl строка
checkRuns[].externalUpdatedAt строка
checkRuns[].startedAt строка
checkRuns[].completedAt строка
checkRuns[].createdAt string
checkRuns[].updatedAt строка
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 строка
checkRuns[].actor.serviceAccount object
checkRuns[].actor.serviceAccount.id string
checkRuns[].output object
checkRuns[].output.title строка
checkRuns[].output.summary string
checkRuns[].output.text string
checkRuns[].deadlineAt строка
checkRuns[].isRerequestable логическое
checkRuns[].rerequestedAt строка
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." } } ]}Список запусков проверок для коммита
/v1/origin/repos/{ownerSlug}/{repoName}/commits/{sha}/check-runsПеречисляет текущие запуски проверок коммита во всех наборах: только запуски, принадлежащие последней попытке каждого набора, и в каждом наборе — только последнюю попытку для каждого ключа запуска. Устаревшие попытки не включаются; Post Check Run определяет, какая попытка является последней. Повторно запрошенный запуск остаётся в списке и отображается как ожидающий: для него установлены status со значением rerequested и rerequestedAt, а его устаревшие conclusion и временные показатели остаются без изменений, пока приложение, которому принадлежит этот запуск, не ответит. Получить сведения об устаревшей попытке по её собственному идентификатору можно с помощью Get Check Run. Список можно дополнительно отфильтровать по имени проверки и статусу. Результаты разбиты на страницы.
Фильтры применяются к свернутому набору, поэтому запуск фильтруется по статусу последней попытки, а фильтр не может снова показать уже замененную попытку. Токены страниц содержат фильтры, для которых они были созданы, поэтому повторное использование токена с другими фильтрами отклоняется. При изменении фильтра начните пагинацию заново.
Параметры пути
ownerSlug строка Обязательно
repoName string Обязательно
sha строка Обязательно
Параметры запроса
pageSize integer
pageToken строка
next_page_token предыдущего ответа. Для первой страницы — пустой. Содержит идентификатор последнего просмотренного запуска проверки, относящийся к этому коммиту и указанным ниже фильтрам; повторное использование токена с другими фильтрами возвращает ошибку InvalidArgument (HTTP 400). Параметр pageSize в последующем запросе применяется к этой странице; не указывайте его, чтобы сохранить прежний размер страницы.checkName string
checkRuns[].name. Не указывайте его, чтобы перечислить запуски с любым именем.status string
queued, in_progress, failing, completed, rerequested. Любое другое значение приводит к ошибке InvalidArgument (HTTP 400). Не указывайте этот параметр, чтобы получить список запусков с любым статусом.Поля ответа
checkRuns массив
checkRuns[].id string
checkRuns[].repository object
checkRuns[].repository.id string
checkRuns[].repository.name string
checkRuns[].repository.owner object
checkRuns[].repository.owner.slug строка
checkRuns[].repository.owner.id string
checkRuns[].repository.owner.type строка
team, user. Пропускается, если неизвестно.checkRuns[].checkSuite object
checkRuns[].checkSuite.id string
checkRuns[].sha string
checkRuns[].baseSha строка
baseSha набора проверок, которому принадлежит запуск. Отсутствует для запуска, не зависящего от базовой ветки.checkRuns[].key string
checkRuns[].name string
checkRuns[].status string
checkRuns[].conclusion string
completed у status.checkRuns[].detailsUrl string
checkRuns[].externalUpdatedAt string
checkRuns[].startedAt string
checkRuns[].completedAt string
checkRuns[].createdAt string
checkRuns[].updatedAt string
checkRuns[].externalId string
checkRuns[].actor object
actor набора проверок-владельца.checkRuns[].actor.user object
checkRuns[].actor.user.id string
checkRuns[].actor.user.email строка
checkRuns[].actor.user.displayName string
checkRuns[].actor.user.handle string
@. Отображается, только пока профиль общедоступен; в противном случае не отображается.checkRuns[].actor.app object
checkRuns[].actor.app.id строка
checkRuns[].actor.app.displayName string
checkRuns[].actor.serviceAccount object
checkRuns[].actor.serviceAccount.id строка
checkRuns[].output object
checkRuns[].output.title строка
checkRuns[].output.summary строка
checkRuns[].output.text строка
checkRuns[].deadlineAt string
checkRuns[].isRerequestable boolean
checkRuns[].rerequestedAt string
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." } } ]}Список наборов проверок для коммита
/v1/origin/repos/{ownerSlug}/{repoName}/commits/{sha}/check-suitesВозвращает список наборов проверок для коммита. Возвращается только последняя попытка каждого набора — по каждому отчитывающемуся субъекту и ключу набора; замещённые попытки не включаются, а Post Check Run определяет, какая попытка является последней. Замещённую попытку можно прочитать по её собственному идентификатору через Get Check Suite. Возвращает только метаданные набора (без вложенных запусков). Поддерживает пагинацию.
Параметры пути
ownerSlug string Обязательное
repoName строка Обязательно
sha string Обязательно
Параметры запроса
pageSize integer
pageToken строка
next_page_token предыдущего ответа. Пустой для первой страницы. Кодирует идентификатор набора проверок, последним обнаруженного в рамках этого коммита. Параметр pageSize в последующем запросе применяется к этой странице; не указывайте его, чтобы сохранить прежний размер страницы.Поля ответа
checkSuites массив
checkSuites[].id string
checkSuites[].repository object
checkSuites[].repository.id string
checkSuites[].repository.name string
checkSuites[].repository.owner object
checkSuites[].repository.owner.slug строка
checkSuites[].repository.owner.id string
checkSuites[].repository.owner.type string
team, user. Не указывается, если неизвестно.checkSuites[].sha строка
checkSuites[].baseSha строка
baseSha версии pull request. Она является частью идентификатора запуска, поэтому приложение может отправить отдельный запуск для каждой пары head и base. Отсутствует у запуска, не зависящего от базы и применимого ко всем pull request с sha.checkSuites[].key string
checkSuites[].name строка
checkSuites[].detailsUrl string
checkSuites[].createdAt string
checkSuites[].updatedAt string
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
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 и файлов).
Список коммитов
/v1/origin/repos/{ownerSlug}/{repoName}/commitsПеречисляет коммиты в ветке или начиная с указанной ссылки.
В результатах списка отсутствует stats. Используйте Get Commit для получения сводной статистики и List Commit Files для постраничного получения диффа файлов.
Параметры пути
ownerSlug строка Обязательно
repoName строка Обязательно
Параметры запроса
sha строка
HEAD), с которой начинать перечисление. Пустое значение означает ветку репозитория по умолчанию.pageSize integer
pageToken строка
nextPageToken предыдущего ответа. Для первой страницы он пуст. Кодирует начальный ref, позицию обхода и фильтры по электронной почте и времени; если указан токен, параметры sha, pageSize, authorEmails, committerEmails, since и until игнорируются. Отфильтрованная страница может содержать меньше коммитов, чем указано в pageSize, или не содержать их вовсе, даже если задан nextPageToken. Продолжайте запрашивать страницы, пока nextPageToken не станет пустым.authorEmails массив
committerEmails массив
authorEmails; пустое значение означает отсутствие фильтра. Если заданы оба фильтра, коммит должен соответствовать обоим спискам. На каждой странице для поиска совпадений проверяется не более 1 000 коммитов.since строка
2026-08-01T00:00:00Z): в список попадают только коммиты, созданные в это время или позже. Git записывает время коммитера с точностью до целых секунд, поэтому доли секунды игнорируются; при rebase или cherry-pick время коммитера меняется, а время автора — нет. Как и git log --since, перечисление прекращается после чтения 100 коммитов подряд, созданных раньше since. Фильтры по времени используют общий с фильтрами по электронной почте лимит сканирования — 1 000 коммитов на страницу. Некорректная метка времени приводит к ошибке InvalidArgument (HTTP 400).until строка
since, более позднее, чем until, приводит к ошибке InvalidArgument (HTTP 400).Поля ответа
commits массив
commits[].sha строка
commits[].commit object
commits[].commit.author object
commits[].commit.author.name строка
commits[].commit.author.email строка
commits[].commit.author.date строка
commits[].commit.committer object
commits[].commit.committer.name строка
commits[].commit.committer.email строка
commits[].commit.committer.date строка
commits[].commit.message строка
commits[].commit.tree object
commits[].commit.tree.sha строка
commits[].parents массив
commits[].parents[].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 } } ]}Получить коммит
/v1/origin/repos/{ownerSlug}/{repoName}/commits/{sha}Возвращает один коммит по SHA или ссылке (ref) с агрегированной статистикой всего коммита stats. Изменённые файлы не включены; используйте Список файлов коммита.
author и committer — это идентичности Git, записанные в коммите, а не объекты пользователей Origin.
Параметры пути
ownerSlug строка Обязательно
repoName строка Обязательно
sha строка Обязательно
HEAD) коммита для получения. Сокращённый SHA обрабатывается так же, как в разделе Получить Git-коммит.Поля ответа
sha строка
commit object
commit.author object
commit.author.name строка
commit.author.email строка
commit.author.date строка
commit.committer object
commit.committer.name строка
commit.committer.email строка
commit.committer.date строка
commit.message строка
commit.tree object
commit.tree.sha строка
parents массив
parents[].sha строка
stats object
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 }}Список файлов коммита
/v1/origin/repos/{ownerSlug}/{repoName}/commits/{sha}/filesВозвращает список файлов, изменённых коммитом.
sha может быть SHA коммита, веткой, тегом или символической ссылкой, например HEAD. По умолчанию возвращаются 30 файлов, максимум — 100. Токен страницы фиксирует разрешённый коммит и курсор по файлам; в последующих запросах sha должен совпадать с токеном. Для каждого файла указываются filename, status, additions, deletions, changes, patch и previousFilename, если файл был переименован или скопирован. Для бинарных файлов patch пуст.
Параметры пути
ownerSlug строка Обязательно
repoName строка Обязательно
sha строка Обязательно
HEAD) коммита, файлы которого нужно перечислить. Сокращённый SHA разрешается так же, как и в Get Git Commit.Параметры запроса
pageSize integer
pageToken строка
next_page_token предыдущего ответа. Пуст для первой страницы. Токен фиксирует выбранный коммит и позицию курсора файла, поэтому параметр sha в последующем запросе должен соответствовать токену. Параметр pageSize в последующем запросе применяется к этой странице; не указывайте его, чтобы сохранить предыдущий размер страницы.Поля ответа
files массив
files[].filename строка
files[].status строка
files[].additions integer
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/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" } ]}Сравнение коммитов
/v1/origin/repos/{ownerSlug}/{repoName}/compare/{basehead}Сравнивает коммиты, 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 целое число
behindBy целое число
baseCommit object
baseCommit.sha строка
baseCommit.commit object
baseCommit.commit.author object
baseCommit.commit.author.name строка
baseCommit.commit.author.email строка
baseCommit.commit.author.date строка
baseCommit.commit.committer object
baseCommit.commit.committer.name строка
baseCommit.commit.committer.email строка
baseCommit.commit.committer.date строка
baseCommit.commit.message строка
baseCommit.commit.tree object
baseCommit.commit.tree.sha строка
baseCommit.parents массив
baseCommit.parents[].sha строка
headCommit object
headCommit.sha строка
headCommit.commit object
headCommit.commit.author object
headCommit.commit.author.name строка
headCommit.commit.author.email строка
headCommit.commit.author.date строка
headCommit.commit.committer object
headCommit.commit.committer.name строка
headCommit.commit.committer.email строка
headCommit.commit.committer.date строка
headCommit.commit.message строка
headCommit.commit.tree объект
headCommit.commit.tree.sha строка
headCommit.parents массив
headCommit.parents[].sha строка
mergeBaseCommit object
mergeBaseCommit.sha строка
mergeBaseCommit.commit object
mergeBaseCommit.commit.author object
mergeBaseCommit.commit.author.name строка
mergeBaseCommit.commit.author.email строка
mergeBaseCommit.commit.author.date строка
mergeBaseCommit.commit.committer object
mergeBaseCommit.commit.committer.name строка
mergeBaseCommit.commit.committer.email строка
mergeBaseCommit.commit.committer.date строка
mergeBaseCommit.commit.message строка
mergeBaseCommit.commit.tree object
mergeBaseCommit.commit.tree.sha строка
mergeBaseCommit.parents массив
mergeBaseCommit.parents[].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 } }}Список файлов для сравнения
/v1/origin/repos/{ownerSlug}/{repoName}/compare/{basehead}/filesВозвращает список файлов, изменённых при сравнении: дифф 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
pageToken строка
next_page_token предыдущего ответа. Пуст для первой страницы. Токен привязан к разрешённому сравнению и положению курсора файла, поэтому параметр basehead в последующем запросе должен совпадать с токеном. Origin повторно разрешает сравнение на каждой странице; если его коммиты с момента выдачи токена переместились, запрос возвращает InvalidArgument (HTTP 400), и перечисление необходимо начать заново с первой страницы. Параметр pageSize в последующем запросе применяется к этой странице; не указывайте его, чтобы сохранить прежний размер страницы.Поля ответа
files массив
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" } ]}Получить содержимое
/v1/origin/repos/{ownerSlug}/{repoName}/contentsВозвращает содержимое файла или каталога для указанной Git-ссылки. Путь к файлу передаётся в параметре запроса path (поддерживаются вложенные пути); не указывайте его или оставьте пустым, чтобы получить содержимое корневого каталога репозитория. Файлы размером более 1 МиБ (после декодирования) отклоняются с ошибкой FailedPrecondition (HTTP 400).
Файлы содержат данные в кодировке base64. Каталоги содержат непосредственные дочерние элементы в entries. Записи каталога — это сокращённые дочерние элементы, содержащие type, name, path, sha и size; чтобы прочитать содержимое дочернего элемента, получите его по пути.
Параметры пути
ownerSlug строка Обязательный
repoName строка Обязательный
Параметры запроса
path строка
ref строка
HEAD), содержимое которых нужно прочитать. При пустом значении используется ветка репозитория по умолчанию.Поля ответа
type строка
encoding строка
size строка
name строка
path строка
sha строка
content строка
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="}Пакетное получение содержимого
/v1/origin/repos/{ownerSlug}/{repoName}/contents:batchGetВозвращает содержимое нескольких явно указанных путей в заданном ref одним запросом. Для каждого запрошенного пути возвращается результат с указанием, найден ли он; найденный путь имеет ту же структуру Content, что и в GetContents (файлы — в base64, каталоги — с непосредственными entries, символические ссылки — как файлы). Пути сопоставляются точно, без glob-выражений или шаблонов; можно запросить не более 20 путей, дубликаты удаляются. Результаты ответа сохраняют порядок первого появления в запросе. Один файл, превышающий ограничение в 1 МиБ, установленное для Get Contents, приводит к ошибке всего пакета FailedPrecondition (HTTP 400). Используется POST, поскольку список путей передаётся в теле запроса.
Параметры пути
ownerSlug строка Обязательно
repoName строка Обязательно
Тело запроса
paths массив Обязательно
ref строка
HEAD), из которых читать. Пустое значение означает ветку по умолчанию репозитория.Поля ответа
results массив
results[].path строка
results[].found логическое значение
results[].content object
results[].content.type строка
results[].content.encoding строка
results[].content.size строка
results[].content.name строка
results[].content.path строка
results[].content.sha строка
results[].content.content строка
results[].content.entries массив
resolvedCommitSha строка
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"}Поиск по содержимому
/v1/origin/repos/{ownerSlug}/{repoName}:grepВыполняет поиск по тексту файлов репозитория на указанной 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
contextAfter integer
filterPath строка
includes массив
/, соответствует на любой глубине, * соответствует внутри одного сегмента пути, а ** — через несколько сегментов. Если указано хотя бы одно включение, путь, не соответствующий ни одному из них, не ищется. Не более 20 записей. Максимальный размер шаблона в UTF-8: 4096 байт.excludes массив
includes. Исключение имеет приоритет над включением, и исключение каталога исключает всё, что находится внутри него. Не более 20 записей. Максимальный размер шаблона в UTF-8: 4096 байт.maxResults integer
Поля ответа
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
/v1/origin/repos/{ownerSlug}/{repoName}/git/blobs/{sha}Возвращает 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 строка
size целое число
encoding строка
content строка
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-коммит
/v1/origin/repos/{ownerSlug}/{repoName}/git/commits/{sha}Возвращает объект коммита Git по SHA (или разрешимой ревизии). Это низкоуровневое представление коммита в Git Database (плоская структура author/message/tree), а не ресурс более высокого уровня GetCommit по пути /commits/{sha}. В sha можно передать SHA коммита, ветку, тег или символическую ссылку, например HEAD. Для пустых репозиториев возвращается ошибка 409 Conflict.
Параметры пути
ownerSlug строка Обязательно
repoName строка Обязательно
sha строка Обязательно
HEAD. Сокращение должно содержать не менее 5 шестнадцатеричных символов и ищется только среди объектов коммитов; если ему не соответствует ни один коммит или соответствует несколько, запрос завершается ошибкой.Поля ответа
sha строка
author object
author.name строка
author.email строка
author.date строка
committer object
committer.name строка
committer.email строка
committer.date строка
message строка
tree object
tree.sha строка
parents массив
parents[].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" } ]}Создать коммит из файлов
/v1/origin/repos/{ownerSlug}/{repoName}/git/commits:createFromFilesСоздаёт коммит в ветке на основе 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 Обязательный
<branch>, heads/<branch> или refs/heads/<branch>. Ветка должна уже существовать. HEAD отклоняется в любом написании.expectedHeadSha string Обязательный
message string Обязательно
author object Обязательный
<, > и перевода строки из name и email, как и git commit; если после этого значение становится пустым, возвращается InvalidArgument (HTTP 400).author.name string Обязательное
author.email string Обязательное
committer object
author. Его name и email очищаются так же, как у author.committer.name string
committer.committer.email string
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
treeSha string
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-ссылку
/v1/origin/repos/{ownerSlug}/{repoName}/git/ref/{ref}Возвращает одну 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 строка Обязательный
heads/<branch> или tags/<tag>; префикс refs/ принимается и нормализуется. Также принимается символьная ссылка HEAD (возвращается как ref: "HEAD" с последним коммитом), а также pull/<number>/merge для предварительного слияния pull request. Выполняется точное сопоставление по полному имени Git-ссылки.Поля ответа
ref строка
object object
object.type имеет значение "tag", а object.sha — SHA объекта тега.object.sha строка
object.type строка
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-ссылки
/v1/origin/repos/{ownerSlug}/{repoName}/git/refsСоздаёт ссылку на ветку, указывающую на существующий коммит.
Создавать можно только ссылки на ветки. Тег, любое другое пространство имён ссылок, а также 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 Обязательный
Response Fields
ref string
object object
object.type равен "commit".object.sha string
object.type string
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-ссылку
/v1/origin/repos/{ownerSlug}/{repoName}/git/refs/{ref}Удаляет ссылку на ветку. Тело ответа пустое.
Удалять можно только ссылки на ветки. Для несуществующей ветки возвращается 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-ссылок по префиксу
/v1/origin/repos/{ownerSlug}/{repoName}/git/matching-refsВозвращает список Git-ссылок, имена которых начинаются с указанного префикса. REST-ответы разворачиваются в JSON-массив (через response_body). Завершающий слеш в ref сохраняется (heads/ → refs/heads/). Символьная ссылка HEAD сопоставляется точно (она не входит в refs/). Для пустых репозиториев возвращается ошибка 409 Conflict.
Параметры пути
ownerSlug строка Обязательный
repoName строка Обязательный
Параметры запроса
ref строка
heads/<prefix> или tags/<prefix>; префикс refs/ принимается и нормализуется. Если значение пустое, выводятся все Git-ссылки (REST-привязка без завершающего сегмента пути).Поля ответа
Ответ представляет собой массив. Каждый элемент содержит:
ref строка
object object
object.type имеет значение "tag", а object.sha — SHA объекта тега.object.sha строка
object.type строка
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-ссылок, соответствующих пути
/v1/origin/repos/{ownerSlug}/{repoName}/git/matching-refs/{ref}Возвращает Git-ссылки, имена которых начинаются с указанного префикса. REST-ответы разворачиваются в JSON-массив (через response_body). Завершающий слеш в ref сохраняется (heads/ → refs/heads/). Символьная ссылка HEAD сопоставляется строго (она не находится в refs/). Для пустых репозиториев возвращается ошибка 409 Conflict.
Параметры пути
ownerSlug строка Обязательный
repoName строка Обязательный
ref строка Обязательный
heads/<prefix> или tags/<prefix>; префикс refs/ принимается и нормализуется. Пустое значение возвращает все Git-ссылки (REST-привязка без завершающего сегмента пути).Поля ответа
Ответ представляет собой массив. Каждый элемент содержит:
ref строка
object object
object.type имеет значение "tag", а object.sha — SHA объекта тега.object.sha строка
object.type строка
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" } } ]}Получить тег
/v1/origin/repos/{ownerSlug}/{repoName}/git/tags/{sha}Возвращает объект аннотированного Git-тега по SHA. Облегчённые теги не являются объектами тегов и возвращают NotFound. Для пустых репозиториев возвращается 409 Conflict.
Параметры пути
ownerSlug string Обязательный
repoName string Обязательный
sha string Обязательный
Поля ответа
sha string
tag string
message string
tagger object
tagger.name string
tagger.email string
tagger.date string
object object
object.sha string
object.type string
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" }}Получить дерево
/v1/origin/repos/{ownerSlug}/{repoName}/git/trees/{sha}Возвращает объект дерева Git по SHA или разрешимой ревизии. sha принимает SHA дерева, SHA коммита, ветку, тег или символическую ссылку, такую как HEAD. Установите recursive=true (или 1), чтобы обойти всё дерево; если не указывать этот параметр или передать любое другое значение, будут перечислены только непосредственные элементы. Рекурсивные списки усекаются после 100 000 записей или 7 МиБ и устанавливают truncated=true. Пустые репозитории возвращают 409 Conflict.
Параметры пути
ownerSlug string Обязательный
repoName string Обязательно
sha string Обязательный
HEAD.Параметры запроса
recursive boolean
true, возвращается полный рекурсивный обход дерева. Значения параметра запроса true и 1 включают рекурсию; если не указывать параметр или передать любое другое значение (включая false и 0), будут перечислены только непосредственные потомки.Поля ответа
sha string
tree array
tree[].path string
tree[].mode string
tree[].type string
tree[].sha string
tree[].size integer
int32 гарантирует, что REST JSON возвращает число; отдельные blob размером более 2 ГиБ не представимы.truncated boolean
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.
Список разрешений репозитория
/v1/origin/repos/{ownerSlug}/{repoName}/grantsПеречисляет пользователей, группы и группы команды-владельца, которым непосредственно предоставлено разрешение на репозиторий. Разрешения, унаследованные от владельца репозитория, не включаются.
Параметры пути
ownerSlug строка Обязательное
repoName строка Обязательно
Параметры запроса
pageSize integer
pageToken строка
next_page_token предыдущего ответа. Для первой страницы оставьте поле пустым. Параметр pageSize в последующем запросе применяется к этой странице; не указывайте его, чтобы сохранить размер предыдущей страницы.Поля ответа
grants массив
pageSize прав доступа.grants[].user object
user, group или teamGroup.grants[].user.id строка
user_.grants[].user.email строка
grants[].user.displayName строка
grants[].user.handle строка
@. Передаётся только в том случае, если профиль общедоступен; в остальных случаях отсутствует.grants[].group object
grants[].group.id строка
grp_.grants[].teamGroup object
grants[].teamGroup.kind строка
members, admins.grants[].permission строка
read, write, admin, custom. Значение custom указывает на пользовательскую политику, которую Upsert Repository Grant не принимает.repository object
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
/v1/origin/repos/{ownerSlug}/{repoName}/grantsЗадаёт право доступа, которым пользователь, группа или группа владеющей команды обладает непосредственно в репозитории, заменяя любое право доступа, ранее выданное этому субъекту напрямую. Повторная выдача права доступа, которое у субъекта уже есть, завершается успешно и ничего не меняет. Пользователь должен быть активным участником команды или организации владельца репозитория. Группа должна принадлежать команде владельца либо быть активной группой в организации этой команды; иначе запрос возвращает FailedPrecondition (HTTP 400).
Параметры пути
ownerSlug строка Обязательно
repoName строка Обязательно
Тело запроса
user object
user, group или teamGroup.user.id строка
user_.user.email строка
user.displayName строка
user.handle строка
@. Присутствует, только пока профиль общедоступен; в остальных случаях опускается.group object
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
group.id строка
grp_.teamGroup object
teamGroup.kind строка
members, admins.permission строка
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"}Удаление права доступа к репозиторию
/v1/origin/repos/{ownerSlug}/{repoName}/grantsУдаляет право доступа, выданное пользователю, группе или группе команды-владельца непосредственно на репозиторий. Права, унаследованные от владельца репозитория, не затрагиваются, поэтому для группы команды-владельца применяется значение по умолчанию с уровня владельца. Попытка удалить право доступа, которым principal не обладает напрямую, завершается успешно и ничего не меняет. Тело ответа пустое.
Path Parameters
ownerSlug строка обязательный
repoName строка обязательный
Request Body
user object
user, group или teamGroup.user.id строка
user_.user.email строка
user.displayName строка
user.handle строка
@. Присутствует, только пока этот профиль виден публично; в остальных случаях опускается.group object
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Список разрешений пространства имён
/v1/origin/namespaces/{namespaceSlug}/grantsВозвращает список тех, кому предоставлен доступ к владельцу: пользователей, группы, а также встроенные группы admin и member команды-владельца. Каждый грант определяет разрешение, которое он предоставляет для каждого репозитория этого владельца. Гранты, выданные для отдельных репозиториев, не включены в список; их можно получить с помощью метода List Repository Grants.
Параметры пути
namespaceSlug строка Обязательное
Параметры запроса
pageSize integer
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
grants[].group.id строка
grp_.grants[].teamGroup object
grants[].teamGroup.kind строка
members, admins.grants[].permission строка
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-обновление гранта пространства имён
/v1/origin/namespaces/{namespaceSlug}/grantsЗадаёт право доступа, которым пользователь, группа или группа владеющей команды напрямую обладает на owner, заменяя право доступа, ранее выданное этому principal напрямую. Повторная выдача права доступа, которое principal уже имеет, завершается успешно и ничего не меняет. Запрос возвращает FailedPrecondition (HTTP 400), если пользователь не является активным участником владеющей команды или её организации, если группа не принадлежит этой команде и не является активной группой в её организации либо если запись оставит owner без администратора.
Параметры пути
namespaceSlug строка Обязательно
Тело запроса
user object
user, group или teamGroup.user.id строка
user_.user.email строка
user.displayName строка
user.handle строка
@. Присутствует, только пока профиль общедоступен; в остальных случаях не возвращается.group object
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
group.id строка
grp_.teamGroup object
teamGroup.kind строка
members, admins.permission строка
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"}Удаление гранта пространства имён
/v1/origin/namespaces/{namespaceSlug}/grantsУдаляет право доступа, которым пользователь, группа или группа владеющей команды обладает непосредственно на уровне owner. Гранты для репозитория не затрагиваются. Удаление права доступа, которым principal не обладает напрямую, завершается успешно и ничего не меняет, а удаление, после которого у owner не останется ни одного администратора, возвращает FailedPrecondition (HTTP 400). Тело ответа пустое.
Параметры пути
namespaceSlug строка обязательный
Тело запроса
user object
user, group или teamGroup.user.id строка
user_.user.email строка
user.displayName строка
user.handle строка
@. Присутствует, только пока профиль виден публично; в остальных случаях отсутствует.group object
group.id строка
grp_.teamGroup object
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 ContentAllowlist входящих 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-адресов
/v1/origin/namespaces/{namespaceSlug}/inbound-ip-allowlistВозвращает allowlist входящих IP-адресов пространства имён: применяется ли он, а также все записи, начиная с самой старой. Ответ не поддерживает пагинацию: в пространстве имён может быть не более 1000 записей. Allowlist доступен только для командных пространств имён; для остальных пространств имён возвращается FailedPrecondition (HTTP 400).
Параметры пути
namespaceSlug строка Обязательный
Поля ответа
enabled boolean
true и включена хотя бы одна запись; см. Обновление allowlist входящих IP-адресов.entries массив
entries[].id строка
entryId. Он не меняется при изменении CIDR записи.entries[].cidr строка
entries[].description строка
entries[].enabled boolean
entries[].createdAt строка
etag строка
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-адресов
/v1/origin/namespaces/{namespaceSlug}/inbound-ip-allowlistВключает или отключает ограничение доступа по 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 строка
entries[].description строка
entries[].enabled логическое значение
entries[].createdAt строка
etag строка
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-адресов
/v1/origin/namespaces/{namespaceSlug}/inbound-ip-allowlist/entriesДобавляет запись в allowlist входящих IP-адресов пространства имён и возвращает её.
CIDR сохраняется в том написании, в каком передан (после удаления пробелов по краям). Если в пространстве имён уже есть CIDR с таким же написанием, возвращается AlreadyExists (HTTP 409 Conflict). Если CIDR не удаётся разобрать, диапазон охватывает всё адресное пространство (/0) или в списке уже 1000 записей, возвращается InvalidArgument (HTTP 400). Пока список действует, вызывающая сторона, чей собственный адрес в него не входит, получает PermissionDenied (HTTP 403).
Вызывающая сторона должна использовать учётные данные пользователя Cursor с namespace:settings:write. Токены приложений и установок не принимаются.
Параметры пути
namespaceSlug строка Обязательный
Тело запроса
cidr строка Обязательный
203.0.113.0/24, 203.0.113.7 или 2001:db8::/32. Сохраняется в исходном написании после удаления пробелов по краям. Диапазон, охватывающий всё адресное пространство (/0), отклоняется.description строка
enabled boolean
true.Поля ответа
id строка
entryId. Не меняется при изменении CIDR записи.cidr строка
description строка
enabled boolean
createdAt строка
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-адресов
/v1/origin/namespaces/{namespaceSlug}/inbound-ip-allowlist/entries/{entryId}Возвращает одну запись allowlist входящих IP-адресов по её ID. Если ID нет в списке пространства имён, возвращается 404.
Параметры пути
namespaceSlug строка Обязательный
entryId строка Обязательный
id записи.Поля ответа
id строка
entryId. Он не меняется при изменении CIDR записи.cidr строка
description строка
enabled boolean
createdAt строка
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-адресов
/v1/origin/namespaces/{namespaceSlug}/inbound-ip-allowlist/entries/{entryId}Удаляет запись из 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-адресов
/v1/origin/namespaces/{namespaceSlug}/inbound-ip-allowlist/entries/{entryId}Обновляет запись 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 в разделе Добавление записи allowlist входящих IP-адресов. Если не указано, значение не меняется.description строка
enabled boolean
Поля ответа
id строка
entryId. Не меняется при изменении CIDR записи.cidr строка
description строка
enabled boolean
createdAt строка
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-адресов
/v1/origin/namespaces/{namespaceSlug}/inbound-ip-allowlist/entries:replaceЗаменяет записи 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 массив
entries[].cidr строка Обязательный
cidr в разделе Добавление записи в allowlist входящих IP-адресов. Хранится в том виде, в котором введено, — без нормализации, только с удалением начальных и конечных пробелов. Каждый вариант написания можно указать только один раз.entries[].description строка
entries[].enabled логическое значение
true.etag строка
etag, полученный при предыдущем чтении allowlist. Если параметр задан, а записи с тех пор изменились, вызов возвращает Aborted (HTTP 409 Conflict) и ничего не меняет. Не указывайте его, чтобы полностью заменить текущее содержимое.allowEmpty логическое значение
true, чтобы отправить пустой entries и удалить все записи. Без этого параметра запрос с пустым entries возвращает InvalidArgument (HTTP 400).Поля ответа
allowlist object
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.
Список меток
/v1/origin/repos/{ownerSlug}/{repoName}/labelsВозвращает список меток, определённых в репозитории, отсортированный по имени.
Токены страниц привязаны к репозиторию, для которого они были выпущены. Повторное использование токена для другого репозитория, как и любой другой некорректный токен, приводит к ошибке InvalidArgument (HTTP 400).
Параметры пути
ownerSlug строка Обязательный
repoName строка Обязательный
Параметры запроса
pageSize целое число
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" } ]}Создать метку
/v1/origin/repos/{ownerSlug}/{repoName}/labelsСоздаёт метку в репозитории.
Если это имя уже используется другой меткой в репозитории, возвращается AlreadyExists (HTTP 409 Conflict). Если color содержит не шесть шестнадцатеричных символов, name длиннее 50 символов или description длиннее 255 символов, возвращается InvalidArgument (HTTP 400).
Параметры пути
ownerSlug строка Обязательный
repoName строка Обязательный
Тело запроса
name строка Обязательный
color строка Обязательный
#. Заглавные буквы во входных данных сохраняются в нижнем регистре.description строка
Поля ответа
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"}Получить метку
/v1/origin/repos/{ownerSlug}/{repoName}/labels/{labelName}Возвращает метку репозитория по имени.
Если имя неизвестно, возвращается 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"}Удаление метки
/v1/origin/repos/{ownerSlug}/{repoName}/labels/{labelName}Удаляет метку репозитория по имени. Тело ответа пустое.
При удалении метка также удаляется из всех 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Обновить метку
/v1/origin/repos/{ownerSlug}/{repoName}/labels/{labelName}Обновляет метку репозитория, указанную по её текущему имени.
Пропущенные поля остаются без изменений. Если не указано ни одно из трёх полей, запрос возвращает метку в текущем состоянии. Попытка переименовать метку в имя, уже используемое другой меткой, возвращает AlreadyExists (HTTP 409 Conflict). Если labelName неизвестен, возвращается 404.
Параметры пути
ownerSlug строка Обязательный
repoName строка Обязательный
labelName строка Обязательный
Тело запроса
name строка
color строка
#. Не указывайте, чтобы не изменять.description строка
Поля ответа
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.
Список пул-реквестов
/v1/origin/repos/{ownerSlug}/{repoName}/pullsВозвращает список pull request в репозитории с возможностью фильтрации по исходной ветке (head), целевой ветке (base), автору, диапазону времени создания и состоянию. Для каждого pull request указаны назначенные метки.
Результаты сортируются по порядку создания или по времени последнего обновления (выбирается с помощью sortBy), сначала самые новые. Установите direction=asc для обратного порядка. Токены страниц содержат информацию о сортировке и фильтрах, при которых они были созданы, поэтому токен, повторно использованный с другой сортировкой или набором фильтров, отклоняется; при изменении любого из них начните пагинацию заново.
Параметры пути
ownerSlug string Обязательно
repoName string Обязательно
Параметры запроса
head string
state string
open (по умолчанию), closed, merged, all. closed охватывает все пул-реквесты, которые больше не открыты, включая влитые; merged ограничивает выборку влитыми пул-реквестами. При любом другом значении возвращается InvalidArgument (HTTP 400).pageSize integer
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
2026-08-01T00:00:00Z. Возвращаются только запросы на включение, созданные в указанное время или позже. Некорректная метка времени приводит к ошибке InvalidArgument (HTTP 400).until string
since. Возвращаются только пул-реквесты, созданные в этот момент или ранее. Некорректная метка времени возвращает InvalidArgument (HTTP 400).sortBy строка
created (порядок создания, значение по умолчанию) или updated (время последнего обновления). При любом другом значении возвращается InvalidArgument (HTTP 400).headSha строка
head.sha в каждом результате. Остальные фильтры по-прежнему применяются, а state по умолчанию равен open, поэтому укажите state=all, чтобы получить объединённые и закрытые pull request. Некорректные, сокращённые и неизвестные SHA не дают совпадений.stackId строка
pullRequests[].stack.id. Возвращаются только участники этого стека в запрошенном порядке сортировки, а не в порядке стека, поэтому восстанавливайте стек по stack.parentPullRequest каждого участника. По умолчанию state по-прежнему равен open, что исключает влитых участников; передайте state=all, чтобы получить весь стек. Корректно сформированный идентификатор, не соответствующий ни одному стеку в этом репозитории, возвращает пустой список, а любое другое значение возвращает InvalidArgument (HTTP 400).Поля ответа
pullRequests массив
pullRequests[].id string
pullRequests[].number строка
pullRequests[].state string
pullRequests[].draft логическое значение
pullRequests[].merged boolean
pullRequests[].title string
pullRequests[].body string
pullRequests[].head object
pullRequests[].head.ref строка
pullRequests[].head.sha строка
pullRequests[].base object
pullRequests[].base.ref строка
pullRequests[].base.sha string
pullRequests[].author object
pullRequests[].author.user object
pullRequests[].author.user.id string
pullRequests[].author.user.email string
pullRequests[].author.user.displayName string
pullRequests[].author.user.handle string
@. Указывается только пока профиль общедоступен; в противном случае отсутствует.pullRequests[].author.app object
pullRequests[].author.app.id string
pullRequests[].author.app.displayName string
pullRequests[].author.serviceAccount object
pullRequests[].author.serviceAccount.id string
pullRequests[].createdAt string
pullRequests[].updatedAt string
pullRequests[].closedAt string
pullRequests[].mergedAt string
pullRequests[].mergeCommitSha string
pull/<number>/merge с помощью Получить ссылку Git.pullRequests[].additions integer
pullRequests[].deletions integer
pullRequests[].changedFiles integer
pullRequests[].labels массив
pullRequests[].labels[].id string
pullRequests[].labels[].name строка
pullRequests[].labels[].color string
#.pullRequests[].labels[].description string
pullRequests[].stack object
pullRequests[].stack.id строка
stackId в Список пул-реквестов, чтобы получить данные об остальных участниках.pullRequests[].stack.parentPullRequest object
pullRequests[].stack.parentPullRequest.id строка
pullRequests[].stack.parentPullRequest.number строка
pullRequests[].stack.parentPullRequest.repository object
id, name и owner, что и repository у запуска проверки. Стеки никогда не пересекают границы репозиториев, поэтому это всегда репозиторий самого pull request'а.pullRequests[].version object
pullRequests[].version.number строка
pullRequests[].version.headSha строка
pullRequests[].version.baseSha string
pullRequests[].version.createdAt string
pullRequests[].version.potentialMergeCommit object
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 строка
baseSha этого объекта, второй — headSha версии. Присутствует, только если state равен prepared. Пока эта версия остаётся последней, на него указывает ссылка pull/{pullNumber}/merge. После этого его по-прежнему можно прочитать по SHA через Получить коммит, но получить его по SHA через Git нельзя.pullRequests[].version.potentialMergeCommit.baseSha строка
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" } } ]}Получить запрос на слияние
/v1/origin/repos/{ownerSlug}/{repoName}/pulls/{pullNumber}Возвращает один pull request вместе с назначенными ему метками.
Закрытые или объединённые запросы на слияние могут также содержать closedAt, mergedAt и mergeCommitSha. Считайте head.ref и base.ref непрозрачными строками ссылок Origin: они могут быть короткими именами веток или полностью квалифицированными значениями refs/heads/….
Параметры пути
ownerSlug string Обязательно
repoName string Обязательно
pullNumber string Обязательно
Поля ответа
id строка
number string
state string
draft boolean
merged boolean
title string
body string
head object
head.ref string
head.sha string
base object
base.ref string
base.sha string
author object
author.user object
author.user.id строка
author.user.email строка
author.user.displayName строка
author.user.handle строка
@. Присутствует только пока профиль общедоступен; в противном случае отсутствует.author.app object
author.app.id строка
author.app.displayName строка
author.serviceAccount object
author.serviceAccount.id string
createdAt string
updatedAt строка
closedAt строка
mergedAt string
mergeCommitSha string
pull/<number>/merge с помощью Получить ссылку Git.additions integer
deletions integer
changedFiles целое число
labels массив
labels[].id строка
labels[].name строка
labels[].color строка
#.labels[].description строка
stack object
stack.id строка
stackId в Список запросов на слияние, чтобы получить данные других участников.stack.parentPullRequest object
stack.parentPullRequest.id строка
stack.parentPullRequest.number строка
stack.parentPullRequest.repository object
id, name и owner, что и у repository запуска проверки. Стеки никогда не пересекают границы репозиториев, поэтому это всегда репозиторий самого pull request.version object
version.number string
version.headSha строка
version.baseSha строка
version.createdAt string
version.potentialMergeCommit object
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 строка
baseSha этого объекта, а второй — headSha версии. Присутствует только, если state имеет значение prepared. Пока эта версия является последней, ссылка pull/{pullNumber}/merge указывает на этот коммит. После этого его по-прежнему можно прочитать по SHA через Получить коммит, но нельзя получить по SHA через Git.version.potentialMergeCommit.baseSha строка
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" } }}Создать запрос на слияние
/v1/origin/repos/{ownerSlug}/{repoName}/pullsСоздаёт запрос на слияние из 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 Обязательно
body строка
head string Обязательно
base string Обязательно
InvalidArgument (HTTP 400).draft boolean
parentPullRequest object
clear возвращают InvalidArgument (HTTP 400).parentPullRequest.number string
parentPullRequest.id строка
id.Поля ответа
id строка
number string
state строка
draft boolean
merged boolean
title строка
body строка
head object
head.ref строка
head.sha string
base object
base.ref строка
base.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
author.serviceAccount object
author.serviceAccount.id строка
createdAt string
updatedAt строка
closedAt строка
mergedAt строка
mergeCommitSha string
pull/<number>/merge с помощью Get Git Ref.additions integer
deletions integer
changedFiles integer
labels массив
labels[].id строка
labels[].name string
labels[].color string
#.labels[].description строка
stack object
stack.id строка
stackId в Список запросов на слияние, чтобы получить остальные элементы.stack.parentPullRequest object
stack.parentPullRequest.id строка
stack.parentPullRequest.number строка
stack.parentPullRequest.repository object
id, name и owner, что и repository в запуске проверки. Стеки никогда не пересекают репозитории, поэтому это всегда собственный репозиторий pull request.version object
version.number строка
version.headSha строка
version.baseSha string
version.createdAt строка
version.potentialMergeCommit object
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 строка
baseSha этого объекта, а второй — headSha этой версии. Присутствует только при значении prepared поля state. Ссылка pull/{pullNumber}/merge указывает на этот коммит, пока эта версия является последней. После этого коммит по-прежнему доступен по SHA через Get Commit, но его нельзя получить по SHA через Git.version.potentialMergeCommit.baseSha строка
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" }}Обновить запрос на слияние
/v1/origin/repos/{ownerSlug}/{repoName}/pulls/{pullNumber}Обновляет заголовок, текст, базовую ветку, родительскую ветку стека и/или состояние жизненного цикла запроса на слияние.
Отсутствующие поля не изменяются. Переданные поля применяются в следующем порядке: метаданные, затем 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
body string
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 строка
InvalidArgument (HTTP 400).parentPullRequest object
number или id добавляет этот pull request в стек поверх указанного родителя, заменяя текущего родителя, а clear удаляет родителя. Не указывайте это поле, чтобы оставить стек без изменений. Пустой селектор, clear: false или несколько полей приводят к ошибке InvalidArgument (HTTP 400). Это лишь связь: ветки не переписываются, а base меняется только в том случае, если вы укажете и его. Origin применяет это изменение после base, поэтому явно указанный родитель имеет приоритет над родителем, определяемым при смене base.parentPullRequest.number строка
parentPullRequest.id строка
id.parentPullRequest.clear boolean
true.Поля ответа
id string
number строка
state строка
draft boolean
merged boolean
title string
body string
head object
head.ref строка
head.sha string
base object
base.ref строка
base.sha string
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
author.serviceAccount object
author.serviceAccount.id строка
createdAt string
updatedAt string
closedAt строка
mergedAt string
mergeCommitSha string
pull/<number>/merge с помощью Получить ссылку Git.additions integer
deletions integer
changedFiles integer
labels массив
labels[].id string
labels[].name string
labels[].color string
#.labels[].description строка
stack object
stack.id строка
stackId в List Pull Requests, чтобы получить остальные элементы стека.stack.parentPullRequest object
stack.parentPullRequest.id string
stack.parentPullRequest.number строка
stack.parentPullRequest.repository object
id, name и owner, что и repository у запуска проверки. Стеки никогда не пересекают границы репозиториев, поэтому это всегда собственный репозиторий пул-реквеста.version object
version.number строка
version.headSha строка
version.baseSha string
version.createdAt string
version.potentialMergeCommit object
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 строка
baseSha этого объекта, второй — headSha версии. Присутствует, только когда state равно prepared. Пока эта версия остаётся последней, на этот коммит указывает Git-ссылка pull/{pullNumber}/merge. После этого его по-прежнему можно прочитать по SHA через Получить коммит, но получить его по SHA через Git уже нельзя.version.potentialMergeCommit.baseSha строка
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" }}Список комментариев к пул-реквесту
/v1/origin/repos/{ownerSlug}/{repoName}/pulls/{pullNumber}/commentsПеречисляет все комментарии к pull request в хронологическом порядке, при необходимости ограничивая выборку окном по времени создания. Каждый комментарий содержит полный тред: идентификатор, привязку к диффу и статус разрешения. Группируйте плоский ответ по thread.id без дополнительного запроса.
Токены страниц содержат фильтры, с которыми они были выпущены, поэтому токен, повторно использованный с другими фильтрами, будет отклонён; при изменении фильтра начните пагинацию заново.
Параметры пути
ownerSlug string Обязательно
repoName string Обязательно
pullNumber string Обязательно
Параметры запроса
pageSize integer
pageToken строка
nextPageToken предыдущего ответа. Для первой страницы не указывайте. pageSize в follow-up-запросе задаёт размер этой страницы; не указывайте его, чтобы сохранить прежний размер страницы.since string
2026-08-01T00:00:00Z. Возвращаются только комментарии, созданные в этот момент или позже. При некорректной метке времени возвращается InvalidArgument (HTTP 400).until string
since. Возвращаются только комментарии, созданные в этот момент или ранее. При неверном формате метки времени возвращается ошибка InvalidArgument (HTTP 400).threadIds массив
InvalidArgument (HTTP 400).Поля ответа
comments массив
comments[].id string
comments[].thread object
comments[].thread.id string
comments[].thread.version object
comments[].thread.version.number строка
comments[].thread.version.headSha строка
comments[].thread.version.baseSha строка
comments[].thread.path строка
comments[].thread.side строка
left, right. Не задано для веток общего обсуждения.comments[].thread.startLine integer
side. 0 — для веток уровня файла и общих обсуждений.comments[].thread.endLine integer
0, если якорь состоит из одной строки или не имеет диапазона строк.comments[].thread.resolvedAt string
comments[].thread.createdAt string
comments[].thread.updatedAt строка
comments[].body string
comments[].author object
comments[].author.user object
comments[].author.user.id строка
comments[].author.user.email string
comments[].author.user.displayName строка
comments[].author.user.handle string
@. Присутствует только пока профиль общедоступен; в противном случае отсутствует.comments[].author.app object
comments[].author.app.id строка
comments[].author.app.displayName строка
comments[].author.serviceAccount object
comments[].author.serviceAccount.id строка
comments[].createdAt string
comments[].updatedAt строка
pullRequest object
pullRequest.id строка
pullRequest.number строка
pullRequest.repository object
pullRequest.repository.id string
pullRequest.repository.name string
pullRequest.repository.owner object
pullRequest.repository.owner.slug строка
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/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
/v1/origin/repos/{ownerSlug}/{repoName}/pulls/comments/{commentId}Возвращает один комментарий к pull request по его стабильному идентификатору Origin. Комментарий за пределами авторизованного репозитория или комментарий из ожидающего рассмотрения ревью, недоступный вызывающей стороне, возвращает 404.
Параметры пути
ownerSlug string Обязательный
repoName string Обязательно
commentId string Обязательно
Поля ответа
id string
thread object
thread.id string
thread.version object
thread.version.number string
thread.version.headSha string
thread.version.baseSha string
thread.path string
thread.side string
left, right. Не задано для тредов общего обсуждения.thread.startLine integer
side. 0 — для тредов на уровне файла и общего обсуждения.thread.endLine integer
0, если якорь — одна строка или не имеет диапазона строк.thread.resolvedAt string
thread.createdAt string
thread.updatedAt string
body string
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
author.serviceAccount object
author.serviceAccount.id string
createdAt string
updatedAt string
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
/v1/origin/repos/{ownerSlug}/{repoName}/pulls/comments/{commentId}Удаляет комментарий к 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Создать комментарий к запросу на слияние
/v1/origin/repos/{ownerSlug}/{repoName}/pulls/{pullNumber}/commentsСоздаёт комментарий к запросу на слияние 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 Обязательно
threadId string
versionNumber.inline object
threadId.inline.path строка Обязательно
inline.side string Обязательно
left — базовая версия файла, right — актуальная версия файла.inline.startLine целое число Обязательно
inline.endLine целое число
startLine. Не указывайте для однострочного якоря.file object
threadId или inline.file.path string Обязательно
versionNumber string
0 или отсутствие значения означает последнюю версию на момент вызова. Имеет значение только для новых тредов.Поля ответа
id string
thread object
thread.id string
thread.version object
thread.version.number строка
thread.version.headSha string
thread.version.baseSha строка
thread.path строка
thread.side string
left, right. Не задано для веток общего обсуждения.thread.startLine integer
side. 0 — для тредов на уровне файла и общего обсуждения.thread.endLine целое число
0, если якорь находится в одной строке или не имеет диапазона строк.thread.resolvedAt строка
thread.createdAt string
thread.updatedAt строка
body string
author object
author.user object
author.user.id string
author.user.email string
author.user.displayName string
author.user.handle строка
@. Указывается только когда профиль общедоступен; в противном случае опускается.author.app object
author.app.id string
author.app.displayName string
author.serviceAccount object
author.serviceAccount.id string
createdAt string
updatedAt string
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
/v1/origin/repos/{ownerSlug}/{repoName}/pulls/comments/{commentId}Обновляет комментарий к pull request по его стабильному идентификатору Origin.
Заменяет текст комментария. Комментарий должен принадлежать репозиторию, указанному в пути, быть видимым для вызывающего и быть создан этим же вызывающим. Комментарии из другого репозитория и скрытые комментарии в статусе ожидания ревью возвращают 404; видимый комментарий, принадлежащий другому участнику, возвращает 403. Тела длиной более 65 536 символов отклоняются с ошибкой InvalidArgument (HTTP 400).
Параметры пути
ownerSlug строка Обязательно
repoName string Обязательно
commentId string Обязательно
Тело запроса
body string Обязательно
Поля ответа
id string
thread object
thread.id string
thread.version object
thread.version.number string
thread.version.headSha строка
thread.version.baseSha string
thread.path строка
thread.side строка
left, right. Не задано для тредов общего обсуждения.thread.startLine integer
side. 0 — для тредов на уровне файла и общих обсуждений.thread.endLine integer
0, если привязка состоит из одной строки или не имеет диапазона строк.thread.resolvedAt строка
thread.createdAt string
thread.updatedAt string
body string
author object
author.user object
author.user.id string
author.user.email string
author.user.displayName string
author.user.handle строка
@. Указывается только пока профиль общедоступен; в противном случае отсутствует.author.app object
author.app.id string
author.app.displayName string
author.serviceAccount object
author.serviceAccount.id string
createdAt string
updatedAt string
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"}Обновление обсуждения запроса на слияние
/v1/origin/repos/{ownerSlug}/{repoName}/pulls/threads/{threadId}Разрешает или повторно открывает поток комментариев запроса на вытягивание и возвращает его обновлённое состояние. Попытка разрешить уже разрешённый поток или повторно открыть уже открытый не выполняет никаких действий.
Тред должен принадлежать репозиторию, указанному в пути; для треда, хранящегося в другом репозитории, возвращается 404. Отвечать в треде, отмеченном как решённый, с помощью Create Pull Request Comment разрешено — это не открывает его повторно.
Параметры пути
ownerSlug string Обязательное
repoName string Обязательное
threadId string Обязательный
Тело запроса
resolved boolean Обязательное
true закрывает тред; false снова открывает его.Поля ответа
id string
version object
version.number string
version.headSha строка
version.baseSha string
path string
side string
left, right. Не задаётся для тредов общего обсуждения.startLine integer
side. 0 — для тредов уровня файла и общих обсуждений.endLine integer
0, если якорь указывает на одну строку или не задаёт диапазон строк.resolvedAt string
createdAt string
updatedAt string
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
/v1/origin/repos/{ownerSlug}/{repoName}/pulls/{pullNumber}/commitsВозвращает список коммитов в pull request.
Возвращает коммиты pull request в виде упрощённых объектов Commit (без stats). По умолчанию возвращается 30 результатов, максимум — 100, при этом всего доступно не более 250 коммитов. Токен страницы фиксирует версию pull request и курсор коммитов; токен, который больше не соответствует текущим head или base, возвращает 400.
Параметры пути
ownerSlug string Обязательно
repoName string Обязательно
pullNumber string Обязательно
Параметры запроса
pageSize целое число
pageToken string
next_page_token предыдущего ответа. Пустой для первой страницы. Токен привязан к репозиторию, версии pull request и смещению коммита. pageSize в последующем запросе применяется к этой странице; не указывайте его, чтобы сохранить прежний размер страницы.Поля ответа
commits массив
commits[].sha string
commits[].commit object
commits[].commit.author object
commits[].commit.author.name string
commits[].commit.author.email string
commits[].commit.author.date string
commits[].commit.committer object
commits[].commit.committer.name string
commits[].commit.committer.email string
commits[].commit.committer.date string
commits[].commit.message string
commits[].commit.tree object
commits[].commit.tree.sha string
commits[].parents массив
commits[].parents[].sha string
nextPageToken string
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
/v1/origin/repos/{ownerSlug}/{repoName}/pulls/{pullNumber}/filesВозвращает список файлов, изменённых в pull request.
Возвращает имя файла, статус, количество строк, патч и необязательное предыдущее имя файла. По умолчанию возвращается 30 файлов, максимум — 100. Токен страницы фиксирует версию pull request и курсор файла; токен, который больше не соответствует текущей head-ветке или base-ветке, возвращает 400.
Параметры пути
ownerSlug string Обязательное
repoName string Обязательно
pullNumber string Обязательное
Параметры запроса
pageSize integer
pageToken string
next_page_token предыдущего ответа. Для первой страницы он пуст. Токен привязан к репозиторию, версии pull request и курсору изменённых файлов. pageSize в последующем запросе задаёт размер этой страницы; не указывайте его, чтобы сохранить прежний размер страницы.Поля ответа
files массив
files[].filename string
files[].status string
files[].additions integer
files[].deletions integer
files[].changes integer
files[].patch string
files[].previousFilename string
nextPageToken string
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
/v1/origin/repos/{ownerSlug}/{repoName}/pulls/{pullNumber}/labelsВозвращает все метки, назначенные pull request, отсортированные по имени.
Ответ содержит полный список назначенных меток, а не его страницу, поэтому эта конечная точка не принимает параметры пагинации. Pull request может иметь не более 100 меток. Если pull request не найден, возвращается 404.
Параметры пути
ownerSlug string Обязательный
repoName string Обязательный
pullNumber string Обязательный
Поля ответа
labels array
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
/v1/origin/repos/{ownerSlug}/{repoName}/pulls/{pullNumber}/labelsЗаменяет все метки pull request указанными метками.
Пустой список удаляет все назначенные метки. Метки должны уже существовать в репозитории; неизвестное имя метки или неизвестный pull request возвращает 404. К pull request можно назначить не более 100 меток, поэтому при указании более 100 возвращается FailedPrecondition (HTTP 400). В ответе возвращается список меток, назначенных после замены, отсортированный по имени.
Параметры пути
ownerSlug string Обязательный
repoName string Обязательный
pullNumber string Обязательный
Тело запроса
labels array
Поля ответа
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
/v1/origin/repos/{ownerSlug}/{repoName}/pulls/{pullNumber}/labelsДобавляет к 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 Обязательный
Поля ответа
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
/v1/origin/repos/{ownerSlug}/{repoName}/pulls/{pullNumber}/labelsУдаляет все метки у 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
/v1/origin/repos/{ownerSlug}/{repoName}/pulls/{pullNumber}/labels/{labelName}Удаляет метку из pull request.
Если метка не назначена pull request, как и если pull request не существует, возвращается 404. В ответе перечислены оставшиеся метки pull request, отсортированные по имени.
Параметры пути
ownerSlug string Обязательный
repoName string Обязательный
pullNumber string Обязательный
labelName string Обязательный
Поля ответа
labels array
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" } ]}Слияние запроса на включение изменений
/v1/origin/repos/{ownerSlug}/{repoName}/pulls/{pullNumber}/mergeВыполняет слияние 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 строка Обязательно
Тело запроса
expectedHeadSha строка
ABORTED (HTTP 409 Conflict), и слияние не выполняется. Значения, не являющиеся полным SHA коммита, отклоняются с ошибкой InvalidArgument (HTTP 400). Не указывайте это значение, чтобы выполнить слияние с текущей версией head. Проверка не выполняется, если запрос на слияние уже слит; в этом случае возвращается успешный идемпотентный ответ.mergeMethod строка
merge, который создаёт merge-коммит, и squash, который создаёт один squash-коммит. Если репозиторий не разрешает выбранный способ, запрос отклоняется с ошибкой FailedPrecondition (HTTP 400), а любое другое значение — с ошибкой InvalidArgument (HTTP 400). Не указывайте этот параметр, чтобы использовать значение по умолчанию для репозитория: merge-коммит, если репозиторий разрешает слияние таким способом, иначе squash-коммит; если базовая ветка требует линейной истории, используется squash-коммит.Поля ответа
mergeCommitSha string
pull/<number>/merge с помощью Get Git Ref.mergedPullNumbers массив
pullRequest object
pullRequest.id строка
pullRequest.number строка
pullRequest.state строка
pullRequest.draft boolean
pullRequest.merged boolean
pullRequest.title string
pullRequest.body string
pullRequest.head object
pullRequest.head.ref string
pullRequest.head.sha строка
pullRequest.base object
pullRequest.base.ref строка
pullRequest.base.sha строка
pullRequest.author object
pullRequest.author.user object
pullRequest.author.user.id строка
pullRequest.author.user.email string
pullRequest.author.user.displayName строка
pullRequest.author.user.handle строка
@. Присутствует только тогда, когда профиль общедоступен; в противном случае отсутствует.pullRequest.author.app object
pullRequest.author.app.id строка
pullRequest.author.app.displayName строка
pullRequest.author.serviceAccount object
pullRequest.author.serviceAccount.id string
pullRequest.createdAt string
pullRequest.updatedAt string
pullRequest.closedAt строка
pullRequest.mergedAt string
pullRequest.mergeCommitSha string
pull/<number>/merge с помощью Получить ссылку Git.pullRequest.additions integer
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
pullRequest.stack.id строка
stackId в Список запросов на слияние, чтобы получить сведения об остальных участниках.pullRequest.stack.parentPullRequest object
pullRequest.stack.parentPullRequest.id строка
pullRequest.stack.parentPullRequest.number строка
pullRequest.stack.parentPullRequest.repository object
id, name и owner, что и repository запуска проверки. Стеки никогда не пересекают границы репозиториев, поэтому это всегда репозиторий самого запроса на слияние.pullRequest.version object
pullRequest.version.number string
pullRequest.version.headSha string
pullRequest.version.baseSha строка
pullRequest.version.createdAt строка
pullRequest.version.potentialMergeCommit object
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 строка
baseSha этого объекта, а второй — headSha версии. Присутствует только, когда state равен prepared. Ссылка pull/{pullNumber}/merge указывает на него, пока эта версия является последней. После этого коммит по-прежнему можно прочитать по SHA с помощью Get Commit, но получить его по SHA через Git нельзя.pullRequest.version.potentialMergeCommit.baseSha строка
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
/v1/origin/repos/{ownerSlug}/{repoName}/pulls/{pullNumber}/mergeabilityВозвращает, можно ли объединить 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 строка Обязательный
Параметры запроса
expectedHeadSha строка
Aborted (HTTP 409 Conflict) вместо результата. Значение, которое не является полным SHA коммита, возвращает InvalidArgument (HTTP 400).Поля ответа
pullRequest object
pullRequest.id строка
pullRequest.number строка
pullRequest.repository object
pullRequest.repository.id строка
pullRequest.repository.name строка
pullRequest.repository.owner object
pullRequest.repository.owner.slug строка
pullRequest.repository.owner.id строка
pullRequest.repository.owner.type строка
team, user. Пропускается, если неизвестно.verdict строка
evaluatedPullRequests. Допустимые значения: mergeable — слияние pullRequest приводит к слиянию всех pull request — и blocked. Нераспознанное значение считайте blocked.blockers массив
verdict равен mergeable. Не более одного blocker на pull request для каждого вида, кроме required_checks — по одному на каждый state, а также rule_failure и ruleset_error — по одному на каждое отдельное message.blockers[].pullRequest object
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 массив
blockers[].mergeConflict.truncated логическое значение
blockers[].mergeConflict.inheritedFromDownstack boolean
blockers[].stackShape object
invalid_stack.blockers[].stackShape.reason строка
partially_merged, cycle, missing_parent, cross_repository_parent, base_branch_missing.blockers[].stackShape.relatedPullRequests массив
pullRequest.evaluatedPullRequests массив
pullRequest: сначала root стека, последним — сам pullRequest. Предшествующие изменения, уже прошедшие merge, относятся к history и не перечисляются. Для pull request'а вне стека — ровно один element. Каждый содержит те же fields, что и pullRequest.headSha строка
pullRequest, прошедший оценку.baseRef строка
baseSha строка
baseRef на момент evaluatedAt. Последующий пуш в baseRef может изменить вердикт. Пусто, если базовую ветку не удалось определить, например при некорректном стеке.evaluatedAt строка
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
/v1/origin/repos/{ownerSlug}/{repoName}/pulls/{pullNumber}/requested_reviewersВозвращает пользователей и группы, у которых сейчас запрошено ревью pull request.
Прямой запрос снимается, когда этот пользователь отправляет ревью, а запрос к группе — когда ревью отправляет любой текущий участник группы. Неотправленные черновики ревью оставляют запрос в ожидании, а повторный запрос ревью после отправки возвращает ревьюера в этот список. Группы без читаемого публичного идентификатора не включаются.
Параметры пути
ownerSlug string Обязательный
repoName string Обязательный
pullNumber string Обязательный
Поля ответа
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
/v1/origin/repos/{ownerSlug}/{repoName}/pulls/{pullNumber}/requested_reviewersЗапрашивает ревью у указанных пользователей и групп по pull request и возвращает ревьюеров, запрошенных этим вызовом.
Идентификаторы сопоставляются с кандидатами в ревьюеры репозитория по публичному идентификатору, электронной почте пользователя или слагу группы. Отображаемые имена не сопоставляются. Неизвестный или неоднозначный идентификатор возвращает ошибку InvalidArgument (HTTP 400) с указанием этого идентификатора, и требуется как минимум одна непустая запись в полях users или groups.
Повторный запрос уже запрошенного ревьюера обновляет отметку времени запроса, поэтому ревьюер, уже отправивший ревью, снова становится ожидающим. Если ревьюер не является кандидатом для репозитория, возвращается PermissionDenied (HTTP 403).
Параметры пути
ownerSlug string Обязательное
repoName string Обязательное
pullNumber string Обязательное
Тело запроса
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
/v1/origin/repos/{ownerSlug}/{repoName}/pulls/{pullNumber}/requested_reviewersОтменяет запросы на ревью для указанных пользователей и групп в pull request. Тело ответа пустое.
Идентификаторы сопоставляются с кандидатами в ревьюеры репозитория по публичному идентификатору, email пользователя или слагу группы. Отображаемые имена не сопоставляются. Неизвестный или неоднозначный идентификатор приводит к ошибке InvalidArgument (HTTP 400) с указанием этого идентификатора; в полях users и groups должна быть хотя бы одна непустая запись.
Удаление пользователя или группы, у которых ревью не запрошено, ничего не меняет. Идентификатор, который больше не является кандидатом в ревьюеры, всё равно принимается, если это стабильный публичный идентификатор (user_… или grp_…), поэтому ревьюера, покинувшего репозиторий, можно удалить.
Параметры пути
ownerSlug string Обязательный
repoName string Обязательный
pullNumber string Обязательный
Тело запроса
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
/v1/origin/repos/{ownerSlug}/{repoName}/pulls/{pullNumber}/reviewsВыводит список отправленных отзывов к pull request, отсортированных по submitted_at в порядке возрастания. Незавершённые отзывы не включаются.
Параметры пути
ownerSlug string Обязательно
repoName string Обязательно
pullNumber string Обязательное
Параметры запроса
pageSize integer
pageToken строка
nextPageToken предыдущего ответа. Не указывайте его для первой страницы. pageSize в follow-up-запросе задаёт размер этой страницы; не указывайте его, чтобы сохранить прежний размер страницы.Поля ответа
reviews массив
reviews[].id string
reviews[].author object
reviews[].author.user object
reviews[].author.user.id string
reviews[].author.user.email string
reviews[].author.user.displayName string
reviews[].author.user.handle string
@. Отображается только пока профиль общедоступен; в противном случае не указывается.reviews[].author.app object
reviews[].author.app.id строка
reviews[].author.app.displayName string
reviews[].author.serviceAccount object
reviews[].author.serviceAccount.id string
reviews[].verdict string
reviews[].body string
reviews[].submittedAt string
reviews[].pullRequestVersion object
reviews[].pullRequestVersion.number строка
reviews[].pullRequestVersion.headSha строка
reviews[].pullRequestVersion.baseSha string
reviews[].dismissal object
reviews[].dismissal.dismissedBy object
reviews[].dismissal.dismissedBy.user object
reviews[].dismissal.dismissedBy.user.id строка
reviews[].dismissal.dismissedBy.user.email string
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
reviews[].dismissal.dismissedBy.serviceAccount object
reviews[].dismissal.dismissedBy.serviceAccount.id string
reviews[].dismissal.dismissedAt string
reviews[].dismissal.message string
pullRequest object
pullRequest.id строка
pullRequest.number строка
pullRequest.repository object
pullRequest.repository.id string
pullRequest.repository.name строка
pullRequest.repository.owner object
pullRequest.repository.owner.slug string
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" } } }}Создать обзор запроса на слияние
/v1/origin/repos/{ownerSlug}/{repoName}/pulls/{pullNumber}/reviewsСоздаёт и отправляет ревью 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 строка
PullRequestVersion.number). Оставьте пустым, чтобы просмотреть последнюю версию на момент вызова. Комментарии привязаны к той же версии.comments массив
comments[].body строка Обязательно
comments[].inline object
inline в Создать комментарий к Pull Request. Нельзя сочетать с comments[].threadId.comments[].inline.path строка Обязательно
comments[].inline.side string Обязательно
left для базовой версии файла, right для версии head.comments[].inline.startLine целое число Обязательно
side. Диапазон не должен выходить за пределы этого файла.comments[].inline.endLine целое число
startLine. Не указывайте для якоря, занимающего одну строку.comments[].threadId строка
comments[].inline, comments[].file и это поле, чтобы открыть новый общий тред обсуждения.comments[].file object
file в Создать комментарий к Pull Request. Нельзя сочетать с comments[].inline или comments[].threadId.comments[].file.path строка Обязательно
Поля ответа
id string
author object
author.user object
author.user.id строка
author.user.email string
author.user.displayName строка
author.user.handle строка
@. Присутствует только пока этот профиль общедоступен; в противном случае не отображается.author.app object
author.app.id строка
author.app.displayName string
author.serviceAccount object
author.serviceAccount.id строка
verdict string
body строка
submittedAt строка
pullRequestVersion object
pullRequestVersion.number строка
pullRequestVersion.headSha string
pullRequestVersion.baseSha string
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 строка
dismissal.dismissedBy.serviceAccount object
dismissal.dismissedBy.serviceAccount.id строка
dismissal.dismissedAt строка
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
/v1/origin/repos/{ownerSlug}/{repoName}/pulls/{pullNumber}/reviews/{reviewId}Обновляет текст ревью. Обновить его может только автор ревью; остальные вызывающие стороны получают PERMISSION_DENIED. Если ревью не относится к указанному pull request, возвращается NOT_FOUND.
Неотправленные черновые обзоры также можно обновлять; у ответа черновика нет submitted_at.
Параметры пути
ownerSlug string Обязательно
repoName string Обязательно
pullNumber строка Обязательно
reviewId string Обязательное
Тело запроса
body string Обязательно
Поля ответа
id строка
author object
author.user object
author.user.id string
author.user.email string
author.user.displayName строка
author.user.handle string
@. Присутствует только пока профиль общедоступен; в противном случае отсутствует.author.app object
author.app.id string
author.app.displayName строка
author.serviceAccount object
author.serviceAccount.id строка
verdict строка
body string
submittedAt строка
pullRequestVersion object
pullRequestVersion.number строка
pullRequestVersion.headSha string
pullRequestVersion.baseSha строка
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 string
@. Присутствует только пока профиль общедоступен; в противном случае отсутствует.dismissal.dismissedBy.app object
dismissal.dismissedBy.app.id строка
dismissal.dismissedBy.app.displayName string
dismissal.dismissedBy.serviceAccount object
dismissal.dismissedBy.serviceAccount.id string
dismissal.dismissedAt строка
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" }}Отклонить обзор запроса на внесение изменений
/v1/origin/repos/{ownerSlug}/{repoName}/pulls/{pullNumber}/reviews/{reviewId}/dismissalsОтменяет отправленное ревью, чтобы его вердикт больше не учитывался при определении состояния ревью pull request'а. Само ревью сохраняется и продолжает отображаться в ListPullRequestReviews с установленным полем dismissal.
Чтобы отклонить ревью, необязательно быть его автором; достаточно права доступа на запись в ревью pull request репозитория.
Отменить можно только ревью типов approve и request_changes, и только один раз: ревью типа comment, неотправленное черновое ревью или уже отменённое ревью возвращает FAILED_PRECONDITION, а повторный вызов оставляет первую отмену в силе. Ревью, которое не принадлежит указанному pull request, возвращает NOT_FOUND.
Параметры пути
ownerSlug string Обязательно
repoName string Обязательно
pullNumber string Обязательно
reviewId string Обязательное
Тело запроса
message string Обязательно
Поля ответа
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
author.serviceAccount object
author.serviceAccount.id string
verdict строка
body string
submittedAt строка
pullRequestVersion object
pullRequestVersion.number строка
pullRequestVersion.headSha string
pullRequestVersion.baseSha string
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 строка
dismissal.dismissedBy.serviceAccount object
dismissal.dismissedBy.serviceAccount.id строка
dismissal.dismissedAt строка
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." }}Наборы правил
Список наборов правил
/v1/origin/repos/{ownerSlug}/{repoName}/rulesetsВозвращает список всех наборов правил, настроенных для репозитория.
Наборы правил для каждого репозитория ограничены по объёму конфигурации, поэтому полный список возвращается в одном ответе, а эта конечная точка не поддерживает постраничную выдачу. repository выносится на верхний уровень один раз и описывает репозиторий, общий для всех наборов правил в ответе.
Параметры пути
ownerSlug string Обязательное поле
repoName string Обязательное
Поля ответа
rulesets массив
rulesets[].id string
rulesets[].name string
rulesets[].description строка
rulesets[].enforcement string
active, evaluate, disabled.rulesets[].kind строка
merge_branch, push_branch, push_tag, push_repository.rulesets[].includedRefNames массив
~ALL и ~DEFAULT_BRANCH.rulesets[].excludedRefNames массив
rulesets[].includedRefNames.rulesets[].rules массив
rulesets[].rules[].id string
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
rulesets[].rules[].ruleType; параметры каждого типа правила перечислены в разделе Создать набор правил.rulesets[].bypassActors массив
rulesets[].bypassActors[].id string
rulesets[].bypassActors[].bypassMode string
always, pull_request_only.rulesets[].bypassActors[].user object
user, team, app или originRole.rulesets[].bypassActors[].user.id string
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
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 строка
repository.owner.id string
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" } }}Создать набор правил
/v1/origin/repos/{ownerSlug}/{repoName}/rulesetsСоздаёт набор правил для репозитория.
Ответ содержит сохранённый набор правил, включая идентификаторы, которые Origin присваивает каждому правилу и субъекту обхода. Пустое поле name отклоняется с ошибкой InvalidArgument (HTTP 400).
Параметры пути
ownerSlug string Обязательное
repoName string Обязательно
Тело запроса
name string Обязательно
description строка
enforcement string Обязательно
active, evaluate, disabled.kind string Обязательный
merge_branch, push_branch, push_tag, push_repository.includedRefNames массив
~ALL и ~DEFAULT_BRANCH. Значения с количеством записей более 64 отклоняются с ошибкой InvalidArgument (HTTP 400).excludedRefNames массив
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
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 строка
name строка
description строка
enforcement строка
active, evaluate, disabled.kind строка
merge_branch, push_branch, push_tag, push_repository.includedRefNames массив
~ALL и ~DEFAULT_BRANCH.excludedRefNames массив
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
rules[].ruleType; в разделе Создать набор правил перечислены параметры каждого типа правил.bypassActors массив
bypassActors[].id string
bypassActors[].bypassMode string
always, pull_request_only.bypassActors[].user object
user, team, app или originRole.bypassActors[].user.id string
bypassActors[].team object
bypassActors[].team.organizationPublicId string
bypassActors[].team.groupPublicId string
bypassActors[].app object
bypassActors[].app.id string
app_.bypassActors[].originRole object
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" } } ]}Получить набор правил
/v1/origin/repos/{ownerSlug}/{repoName}/rulesets/{rulesetId}Возвращает набор правил репозитория по его постоянному идентификатору Origin.
И неизвестный репозиторий, и неизвестный набор правил возвращают 404; сообщение позволяет их различить.
Параметры пути
ownerSlug string Обязательное поле
repoName string Обязательный
rulesetId string Обязательно
Поля ответа
id строка
name string
description строка
enforcement строка
active, evaluate, disabled.kind string
merge_branch, push_branch, push_tag, push_repository.includedRefNames массив
~ALL и ~DEFAULT_BRANCH.excludedRefNames массив
includedRefNames.rules массив
rules[].id string
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
rules[].ruleType; параметры каждого типа правила перечислены в разделе Создать набор правил.bypassActors массив
bypassActors[].id строка
bypassActors[].bypassMode string
always, pull_request_only.bypassActors[].user object
user, team, app или originRole.bypassActors[].user.id string
bypassActors[].team object
bypassActors[].team.organizationPublicId строка
bypassActors[].team.groupPublicId string
bypassActors[].app object
bypassActors[].app.id string
app_.bypassActors[].originRole object
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" } } ]}Обновить набор правил
/v1/origin/repos/{ownerSlug}/{repoName}/rulesets/{rulesetId}Обновляет существующий набор правил репозитория.
Запрос заменяет всю конфигурацию набора правил. rules и bypassActors заменяются целиком, а не объединяются, и Origin присваивает сохранённым записям новые идентификаторы, поэтому отправьте все правила и субъекты обхода, которые вы хотите сохранить.
Параметры пути
ownerSlug строка Обязательное поле
repoName строка Обязательно
rulesetId string Обязательно
Тело запроса
name string Обязательное
description строка
enforcement string Обязательно
active, evaluate, disabled.kind string Обязательное
merge_branch, push_branch, push_tag, push_repository.includedRefNames массив
~ALL и ~DEFAULT_BRANCH. Значения, содержащие более 64 записей, отклоняются с ошибкой InvalidArgument (HTTP 400).excludedRefNames массив
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
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 строка
name строка
description строка
enforcement строка
active, evaluate, disabled.kind строка
merge_branch, push_branch, push_tag, push_repository.includedRefNames массив
~ALL и ~DEFAULT_BRANCH.excludedRefNames массив
includedRefNames.rules массив
rules[].id string
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
rules[].ruleType; параметры для каждого типа правила перечислены в разделе Создать набор правил.bypassActors массив
bypassActors[].id string
bypassActors[].bypassMode string
always, pull_request_only.bypassActors[].user object
user, team, app или originRole.bypassActors[].user.id string
bypassActors[].team object
bypassActors[].team.organizationPublicId строка
bypassActors[].team.groupPublicId string
bypassActors[].app object
bypassActors[].app.id string
app_.bypassActors[].originRole object
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" } } ]}Удалить набор правил
/v1/origin/repos/{ownerSlug}/{repoName}/rulesets/{rulesetId}Удаляет набор правил репозитория по его стабильному идентификатору Origin. Тело ответа пустое.
И неизвестный репозиторий, и неизвестный набор правил возвращают 404; различить их позволяет сообщение. Набор правил из другого репозитория считается неизвестным. Пустой rulesetId возвращает InvalidArgument (HTTP 400).
Параметры пути
ownerSlug string обязательный
repoName string обязательный
rulesetId string обязательный
Поля ответа
При успешном запросе тело ответа отсутствует.
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
/v1/origin/namespaces/{namespaceSlug}/ssh-certificate-authoritiesВозвращает список центров сертификации SSH, которым владелец доверяет при работе с git по SSH (сначала самые новые), а также сведения о том, требует ли владелец сертификаты. Ответ не поддерживает пагинацию: возвращаются все центры сертификации.
Параметры пути
namespaceSlug string Обязательный
Поля ответа
certificateAuthorities array
certificateAuthorities[].id string
certificateAuthorityId.certificateAuthorities[].name string
certificateAuthorities[].keyType string
ssh-ed25519.certificateAuthorities[].fingerprint string
SHA256:<base64> — в том виде, в каком его выводит ssh-keygen -l.certificateAuthorities[].publicKey string
<key_type> <base64>, без комментария.certificateAuthorities[].createdAt string
requireCertificates boolean
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
/v1/origin/namespaces/{namespaceSlug}/ssh-certificate-authoritiesДобавляет центр сертификации 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 Обязательный
authorized_keys (<key_type> <base64> [comment]). Допустимые типы ключей: ssh-ed25519, ecdsa-sha2-nistp256, ecdsa-sha2-nistp384, ecdsa-sha2-nistp521 и ssh-rsa с модулем не менее 2048 бит. Сертификаты не принимаются.name string Обязательный
Поля ответа
id string
certificateAuthorityId в Удаление центра сертификации SSH.name string
keyType string
ssh-ed25519.fingerprint string
SHA256:<base64> — в том виде, в каком его выводит ssh-keygen -l.publicKey string
<key_type> <base64>, без комментария.createdAt string
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
/v1/origin/namespaces/{namespaceSlug}/ssh-certificate-authorities/{certificateAuthorityId}Удаляет центр сертификации 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-сертификатов
/v1/origin/namespaces/{namespaceSlug}/ssh-certificate-authorities:setRequirementОпределяет, требует ли владелец SSH-сертификаты, и возвращает соответствующий параметр владельца. Пока требование действует, git по SSH в репозиториях владельца принимает только сертификаты, выданные центрами сертификации владельца: SSH-ключи, зарегистрированные пользователями, отклоняются, как и пользовательские API-ключи по HTTPS. Чтобы включить требование, в списке должен быть хотя бы один центр сертификации; в противном случае запрос возвращает FailedPrecondition (HTTP 400). Если передать текущее значение, запрос завершится успешно без изменений.
Вызывающая сторона должна использовать учётные данные пользователя Cursor с областью доступа namespace:settings:write. Токены приложений и токены установки не принимаются.
Параметры пути
namespaceSlug string Обязательный
Тело запроса
requireCertificates boolean Обязательный
true — требовать SSH-сертификаты в репозиториях владельца, false — отменить требование.Поля ответа
requireCertificates boolean
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-type | application/json |
user-agent | Cursor-Origin-Webhook/1.0 |
webhook-id | Стабильный идентификатор доставки и ключ идемпотентности. |
webhook-timestamp | Метка времени Unix, включённая в подпись. |
webhook-signature | v1ed,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.closed | Pull request закрывается без слияния, в том числе когда Origin закрывает его, поскольку после push его head-ветка не имеет общей истории с base-веткой. |
pull_request.merged | Pull 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, в котором перечислены доставляющие её события.
Репозиторий создан
repository.createdПоля полезной нагрузки
repository object
repository.id string
repository.name string Обязательное
repository.fullName string
repository.owner object
repository.owner.slug string
repository.owner.id string
repository.owner.type string
team или user. Доступно только для вывода; не задано, если значение неизвестно. Одно из: team, user.repository.defaultBranch string
repository.createdAt string
repository.updatedAt string
repository.pushedAt string
repository.cloneUrl string
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
repository.allowSquashMerge boolean
repository.deleteBranchOnMerge boolean
Пример 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" }}Репозиторий удалён
repository.deletedПоля полезной нагрузки
repository object
repository.id string
repository.name string
repository.owner object
repository.owner.slug string
repository.owner.id string
repository.owner.type string
team или user. Доступно только для вывода; не задано, если неизвестно. Одно из значений: team, user.deletedAt string
Пример event.payload:
{ "repository": { "id": "repo_01k2ja2000e0080000000000q4", "name": "rocket", "owner": { "slug": "acme", "id": "ns_01k2ja2000e0080000000000p3", "type": "team" } }, "deletedAt": "2026-08-03T08:15:00Z"}Отправка в репозиторий
repository.pushedОдин атомарный push, который может обновить несколько ссылок. Массив commits отсутствует; каждое обновление ссылки содержит только метаданные вершины, предоставляемые по мере возможности.
Поля payload
repository object
repository.id string
repository.name string
repository.owner object
repository.owner.slug string
repository.owner.id string
repository.owner.type string
team или user. Только для вывода; не задано, если неизвестно. Одно из значений: team, user.refUpdates массив
refUpdates[].ref string
refs/heads/main или refs/tags/v3.14.1.refUpdates[].before string
ref до отправки изменений. Состоит из одних нулей (0000000000000000000000000000000000000000), если ссылка была только что создана.refUpdates[].after string
ref после отправки изменений. Содержит только нули (0000000000000000000000000000000000000000), если ссылка была удалена.refUpdates[].created boolean
refUpdates[].deleted boolean
refUpdates[].forced логическое значение
refUpdates[].headCommit object
refUpdates[].headCommit.sha string
refUpdates[].headCommit.author object
refUpdates[].headCommit.author.name string
refUpdates[].headCommit.author.email string
refUpdates[].headCommit.author.date string
refUpdates[].headCommit.committer object
refUpdates[].headCommit.committer.name string
refUpdates[].headCommit.committer.email string
refUpdates[].headCommit.committer.date string
refUpdates[].headCommit.message string
pushedAt string
pusher object
pusher.user object
pusher.user.id string
pusher.user.email string Обязательно
pusher.user.displayName string
pusher.user.handle string
pusher.user.performedVia object
pusher.user.performedVia.app object
pusher.user.performedVia.app.id string
pusher.user.performedVia.app.displayName string
pusher.app object
pusher.app.id string
pusher.app.displayName string
pusher.serviceAccount object
pusher.serviceAccount.id string
refUpdatesCount integer
Пример 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}Метаданные репозитория обновлены
repository.metadata.updatedСодержит полный снимок репозитория без delta и без актора, выполнившего обновление. Чтобы узнать, что изменилось, сравните последовательные снимки или повторно запросите репозиторий.
Поля полезной нагрузки
repository object
repository.id string
repository.name string Обязательное
repository.fullName string
repository.owner object
repository.owner.slug string
repository.owner.id string
repository.owner.type string
team или user. Только для вывода; не задано, если значение неизвестно. Одно из: team, user.repository.defaultBranch string
repository.createdAt string
repository.updatedAt string
repository.pushedAt string
repository.cloneUrl string
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
repository.allowSquashMerge boolean
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
pullRequest.number string
pullRequest.state string
pullRequest.draft boolean
pullRequest.merged boolean
pullRequest.title string
pullRequest.body string
pullRequest.head object
pullRequest.head.ref string
pullRequest.head.sha string
base это base_sha версии, который может отставать от текущей вершины ветки (см. PullRequestVersion).pullRequest.base object
pullRequest.base.ref строка
pullRequest.base.sha string
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
pullRequest.author.user.performedVia object
pullRequest.author.user.performedVia.app object
pullRequest.author.user.performedVia.app.id строка
pullRequest.author.user.performedVia.app.displayName string
pullRequest.author.app object
pullRequest.author.app.id string
pullRequest.author.app.displayName string
pullRequest.author.serviceAccount object
pullRequest.author.serviceAccount.id string
pullRequest.createdAt string
pullRequest.updatedAt string
pullRequest.closedAt string
pullRequest.mergedAt строка
pullRequest.mergeCommitSha string
pull/\<number>/merge (см. GetGitRef), указывающий на другой коммит.pullRequest.additions integer
pullRequest.deletions integer
pullRequest.changedFiles integer
pullRequest.stack object
pullRequest.stack.id string
stack_id в ListPullRequests, чтобы получить список участников стека.pullRequest.stack.parentPullRequest object
pullRequest.stack.parentPullRequest.id string
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
pullRequest.stack.parentPullRequest.repository.owner.id строка
pullRequest.stack.parentPullRequest.repository.owner.type строка
team или user. Доступно только для вывода; не задано, если неизвестно. Одно из значений: team, user.pullRequest.version object
pullRequest.version.number string
pullRequest.version.headSha string
pullRequest.version.baseSha string
pullRequest.version.createdAt string
pullRequest.version.potentialMergeCommit object
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
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
pull_request.label.addedpull_request.label.removedИзменение меток, назначенных пул-реквесту. Текущий набор можно получить с помощью ListPullRequestLabels.
Поля полезной нагрузки
pullRequest object
pullRequest.id строка
pullRequest.number строка
pullRequest.repository object
pullRequest.repository.id строка
pullRequest.repository.name строка
pullRequest.repository.owner object
pullRequest.repository.owner.slug строка
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 строка
actor.user.performedVia object
actor.user.performedVia.app object
actor.user.performedVia.app.id строка
actor.user.performedVia.app.displayName строка
actor.app object
actor.app.id строка
actor.app.displayName строка
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
pullRequest.id string
pullRequest.number строка
pullRequest.repository object
pullRequest.repository.id string
pullRequest.repository.name string
pullRequest.repository.owner object
pullRequest.repository.owner.slug string
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
PullRequestReview.pull_request_version).comment.thread.version.number string
comment.thread.version.headSha string
comment.thread.version.baseSha строка
comment.thread.path string
comment.thread.side string
left, right.comment.thread.startLine integer
side. 0 для тредов уровня файла и тредов общего обсуждения.comment.thread.endLine integer
comment.thread.resolvedAt string
comment.thread.createdAt string
comment.thread.updatedAt string
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
comment.author.user.performedVia object
comment.author.user.performedVia.app object
comment.author.user.performedVia.app.id строка
comment.author.user.performedVia.app.displayName строка
comment.author.app object
comment.author.app.id строка
comment.author.app.displayName строка
comment.author.serviceAccount object
comment.author.serviceAccount.id string
comment.createdAt string
comment.updatedAt string
Пример 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
pullRequest.id string
pullRequest.number строка
pullRequest.repository object
pullRequest.repository.id string
pullRequest.repository.name string
pullRequest.repository.owner object
pullRequest.repository.owner.slug string
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 строка
reaction.reactor.user.performedVia object
reaction.reactor.user.performedVia.app object
reaction.reactor.user.performedVia.app.id строка
reaction.reactor.user.performedVia.app.displayName строка
reaction.reactor.app object
reaction.reactor.app.id строка
reaction.reactor.app.displayName строка
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
pull_request.review.submittedpull_request.review.dismissedПоля полезной нагрузки
pullRequest object
pullRequest.id string
pullRequest.number строка
pullRequest.repository object
pullRequest.repository.id string
pullRequest.repository.name string
pullRequest.repository.owner object
pullRequest.repository.owner.slug string
pullRequest.repository.owner.id string
pullRequest.repository.owner.type string
team или user. Только для вывода; не задано, если значение неизвестно. Одно из значений: team, user.review object
review.dismissal.review.id string
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
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
review.author.app object
review.author.app.id string
review.author.app.displayName string
review.author.serviceAccount object
review.author.serviceAccount.id string
review.verdict string
approve, request_changes, comment.review.body string
review.submittedAt string
review.pullRequestVersion object
review.pullRequestVersion.number string
review.pullRequestVersion.headSha string
review.pullRequestVersion.baseSha string
review.dismissal object
review.dismissal.dismissedBy object
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
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 строка
review.dismissal.dismissedBy.app object
review.dismissal.dismissedBy.app.id string
review.dismissal.dismissedBy.app.displayName string
review.dismissal.dismissedBy.serviceAccount object
review.dismissal.dismissedBy.serviceAccount.id string
review.dismissal.dismissedAt string
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" } }}События ревьюера пул-реквеста
pull_request.reviewer.addedpull_request.reviewer.removedpull_request.reviewer.rerequestedИзменение списка запрошенных ревьюеров pull request. Текущий набор ожидающих ревьюеров можно получить через ListPullRequestRequestedReviewers.
Поля payload
pullRequest object
pullRequest.id string
pullRequest.number строка
pullRequest.repository object
pullRequest.repository.id string
pullRequest.repository.name string
pullRequest.repository.owner object
pullRequest.repository.owner.slug string
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
reviewer.user.handle string
reviewer.user.performedVia object
reviewer.user.performedVia.app object
reviewer.user.performedVia.app.id строка
reviewer.user.performedVia.app.displayName string
reviewer.group object
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
createdBy.user.handle string
createdBy.user.performedVia object
createdBy.user.performedVia.app object
createdBy.user.performedVia.app.id строка
createdBy.user.performedVia.app.displayName string
createdBy.app object
createdBy.app.id string
createdBy.app.displayName string
createdBy.serviceAccount object
createdBy.serviceAccount.id string
createdAt string
Пример 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"}События запуска проверки
repository.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
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
checkSuite.repository.owner.id string
checkSuite.repository.owner.type string
team или user. Только для вывода; не задаётся, если неизвестно. Одно из: team, user.checkSuite.sha string
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 строка
checkSuite.updatedAt string
checkSuite.externalId строка
checkSuite.actor object
checkSuite.actor.user object
checkSuite.actor.user.id string
checkSuite.actor.user.email string Обязательно
checkSuite.actor.user.displayName string
checkSuite.actor.user.handle string
checkSuite.actor.user.performedVia object
checkSuite.actor.user.performedVia.app object
checkSuite.actor.user.performedVia.app.id string
checkSuite.actor.user.performedVia.app.displayName строка
checkSuite.actor.app object
checkSuite.actor.app.id string
checkSuite.actor.app.displayName string
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 строка
checkRun.repository.owner.id string
checkRun.repository.owner.type string
team или user. Только для вывода; не задаётся, если неизвестно. Одно из: team, user.checkRun.checkSuite object
checkRun.checkSuite.id string
checkRun.sha string
checkRun.baseSha строка
base_sha родительского набора проверок. Если значение отсутствует, запуск не зависит от базовой ревизии (см. CheckSuite.base_sha).checkRun.key string
checkRun.name string
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
checkRun.startedAt string
checkRun.completedAt string
checkRun.createdAt string
checkRun.updatedAt string
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
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
checkRun.actor.app object
checkRun.actor.app.id string
checkRun.actor.app.displayName string
checkRun.actor.serviceAccount object
checkRun.actor.serviceAccount.id string
checkRun.output object
checkRun.output.title string
checkRun.output.summary string
checkRun.output.text string
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 строка
checkRun.rerequestedBy.user.performedVia object
checkRun.rerequestedBy.user.performedVia.app object
checkRun.rerequestedBy.user.performedVia.app.id string
checkRun.rerequestedBy.user.performedVia.app.displayName строка
checkRun.rerequestedBy.app object
checkRun.rerequestedBy.app.id string
checkRun.rerequestedBy.app.displayName string
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." } }}Повторно запрошен запуск проверки
repository.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
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
checkSuite.repository.owner.id string
checkSuite.repository.owner.type string
team или user. Только для вывода; не задано, если неизвестно. Одно из значений: team, user.checkSuite.sha string
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
checkSuite.updatedAt string
checkSuite.externalId строка
checkSuite.actor object
checkSuite.actor.user object
checkSuite.actor.user.id string
checkSuite.actor.user.email string Обязательно
checkSuite.actor.user.displayName string
checkSuite.actor.user.handle string
checkSuite.actor.user.performedVia object
checkSuite.actor.user.performedVia.app object
checkSuite.actor.user.performedVia.app.id string
checkSuite.actor.user.performedVia.app.displayName строка
checkSuite.actor.app object
checkSuite.actor.app.id string
checkSuite.actor.app.displayName string
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 строка
checkRun.repository.owner.id string
checkRun.repository.owner.type string
team или user. Только для вывода; не задано, если неизвестно. Одно из значений: team, user.checkRun.checkSuite object
checkRun.checkSuite.id string
checkRun.sha string
checkRun.baseSha строка
base_sha набора проверок-владельца. Отсутствие значения означает, что запуск не зависит от базы (см. CheckSuite.base_sha).checkRun.key строка
checkRun.name string
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
checkRun.startedAt string
checkRun.completedAt строка
checkRun.createdAt string
checkRun.updatedAt string
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 строка
checkRun.actor.user.performedVia object
checkRun.actor.user.performedVia.app object
checkRun.actor.user.performedVia.app.id строка
checkRun.actor.user.performedVia.app.displayName строка
checkRun.actor.app object
checkRun.actor.app.id string
checkRun.actor.app.displayName string
checkRun.actor.serviceAccount object
checkRun.actor.serviceAccount.id string
checkRun.output object
checkRun.output.title string
checkRun.output.summary string
checkRun.output.text string
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
checkRun.rerequestedBy.user.performedVia object
checkRun.rerequestedBy.user.performedVia.app object
checkRun.rerequestedBy.user.performedVia.app.id string
checkRun.rerequestedBy.user.performedVia.app.displayName строка
checkRun.rerequestedBy.app object
checkRun.rerequestedBy.app.id string
checkRun.rerequestedBy.app.displayName string
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" } } }}Аннотации запуска проверки
repository.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
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 строка
baseSha строка
CheckRun.base_sha).annotations массив
annotations[].id строка
annotations[].checkRunId string
annotations[].annotationLevel строка
notice, warning или failure.annotations[].message строка
annotations[].title string
annotations[].rawDetails строка
annotations[].createdAt строка
annotations[].updatedAt string
annotations[].location object
path, start_line и end_line обязательны, если содержащая их аннотация задаёт это сообщение. path — канонический путь относительно корня репозитория; номера строк и столбцов — положительные координаты с нумерацией от 1 и включёнными границами. Поле columns поддерживается только для диапазона в пределах одной строки.annotations[].location.path строка Обязательно
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 строка
Пример 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
installation.target.id string
installation.target.type string
team или user. Доступно только для вывода; не задано, если значение неизвестно. Одно из: team, user.installation.repoSelectionMode string
all, selected.installation.repositories array
installation.repositories[].id string
installation.repositories[].name string
installation.repositories[].owner object
installation.repositories[].owner.slug string
installation.repositories[].owner.id string
installation.repositories[].owner.type строка
team или user. Только для вывода; не задано, если значение неизвестно. Одно из: team, user.installation.scopes array
installation.repositoriesCount integer
installation.createdAt string
installation.updatedAt string
installation.deletedAt string
installation.suspendedAt string
installation.installedBy object
installation.installedBy.id string
installation.installedBy.email string Обязательное
installation.installedBy.displayName string
installation.installedBy.handle string
installation.installedBy.performedVia object
installation.installedBy.performedVia.app object
installation.installedBy.performedVia.app.id строка
installation.installedBy.performedVia.app.displayName строка
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
installation.target.id string
installation.target.type string
team или user. Доступно только для вывода; не задано, если значение неизвестно. Одно из: team, user.installation.repoSelectionMode string
all, selected.installation.repositories array
installation.repositories[].id string
installation.repositories[].name string
installation.repositories[].owner object
installation.repositories[].owner.slug string
installation.repositories[].owner.id string
installation.repositories[].owner.type строка
team или user. Только для вывода; не задано, если значение неизвестно. Одно из: team, user.installation.scopes массив
installation.repositoriesCount integer
installation.createdAt string
installation.updatedAt string
installation.deletedAt string
installation.suspendedAt string
installation.installedBy object
installation.installedBy.id string
installation.installedBy.email string Обязательно
installation.installedBy.displayName string
installation.installedBy.handle string
installation.installedBy.performedVia object
installation.installedBy.performedVia.app object
installation.installedBy.performedVia.app.id строка
installation.installedBy.performedVia.app.displayName string
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
installation.target.id string
installation.target.type string
team или user. Доступно только для вывода; не задано, если значение неизвестно. Одно из: team, user.installation.repoSelectionMode string
all, selected.installation.repositories array
installation.repositories[].id string
installation.repositories[].name string
installation.repositories[].owner object
installation.repositories[].owner.slug string
installation.repositories[].owner.id string
installation.repositories[].owner.type строка
team или user. Только для вывода; не задано, если значение неизвестно. Одно из: team, user.installation.scopes массив
installation.repositoriesCount integer
installation.createdAt string
installation.updatedAt string
installation.deletedAt string
installation.suspendedAt string
installation.installedBy object
installation.installedBy.id string
installation.installedBy.email string Обязательное
installation.installedBy.displayName string
installation.installedBy.handle string
installation.installedBy.performedVia object
installation.installedBy.performedVia.app object
installation.installedBy.performedVia.app.id строка
installation.installedBy.performedVia.app.displayName string
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
installation.target.id string
installation.target.type string
team или user. Только для вывода; не задано, если значение неизвестно. Одно из: team, user.installation.repoSelectionMode string
all, selected.installation.repositories array
installation.repositories[].id string
installation.repositories[].name string
installation.repositories[].owner object
installation.repositories[].owner.slug string
installation.repositories[].owner.id string
installation.repositories[].owner.type строка
team или user. Доступно только для вывода; не задано, если значение неизвестно. Одно из: team, user.installation.scopes массив
installation.repositoriesCount integer
installation.createdAt string
installation.updatedAt string
installation.deletedAt string
installation.suspendedAt string
installation.installedBy object
installation.installedBy.id string
installation.installedBy.email string Обязательное
installation.installedBy.displayName string
installation.installedBy.handle string
installation.installedBy.performedVia object
installation.installedBy.performedVia.app object
installation.installedBy.performedVia.app.id строка
installation.installedBy.performedVia.app.displayName строка
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
installation.target.id string
installation.target.type string
team или user. Только для вывода; не задано, если неизвестно. Одно из: team, user.installation.repoSelectionMode string
all, selected.installation.repositories array
installation.repositories[].id string
installation.repositories[].name string
installation.repositories[].owner object
installation.repositories[].owner.slug string
installation.repositories[].owner.id string
installation.repositories[].owner.type строка
team или user. Доступно только для вывода; не задано, если значение неизвестно. Одно из: team, user.installation.scopes array
installation.repositoriesCount integer
installation.createdAt string
installation.updatedAt string
installation.deletedAt string
installation.suspendedAt string
installation.installedBy object
installation.installedBy.id string
installation.installedBy.email string Обязательное
installation.installedBy.displayName string
installation.installedBy.handle string
installation.installedBy.performedVia object
installation.installedBy.performedVia.app object
installation.installedBy.performedVia.app.id string
installation.installedBy.performedVia.app.displayName string
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" }}