API de Origin
Origin está en beta inicial y puede cambiar. Revise la especificación de OpenAPI al actualizar una integración.
Origin es la plataforma de forja de código de Cherri Code. Su API REST pública permite que las aplicaciones y herramientas interactúen con los repositorios, commits, comprobaciones, pull requests e instalaciones de aplicaciones de Origin.
- Las aplicaciones de Origin se autentican con JWT de aplicación y tokens de acceso de instalación. Consulte Autenticación.
- Consulte la especificación de OpenAPI completa para ver esquemas y ejemplos detallados.
- Los agentes de programación pueden cargar el índice llms.txt o la referencia completa en Markdown en llms-full.txt.
Descripción general
Las aplicaciones de Origin implementan un consentimiento de instalación al estilo de OAuth y un modelo de autenticación al estilo de las aplicaciones de GitHub:
- La aplicación firma un JWT de EdDSA de corta duración con su clave privada Ed25519.
- La aplicación intercambia ese JWT y un ID de instalación por un token de acceso de instalación de corta duración (
oit_…). - El token de instalación llama a las API de repositorios y autentica Git a través de HTTPS dentro de los repositorios y ámbitos aprobados de la instalación.
- Origin envía entregas de webhooks firmadas a la URL de webhook registrada de la aplicación.
URL base
https://api.cursor.com/v1/originLas rutas de los endpoints de la referencia incluyen el prefijo /v1/origin completo.
Convenciones del protocolo
Las solicitudes y las respuestas usan application/json. Los nombres de los campos JSON usan camelCase. Las marcas de tiempo son cadenas con formato RFC 3339. Los enteros Protobuf de 64 bits, incluidos los números de pull request y de versión, se codifican como cadenas JSON.
Las respuestas incluyen los campos que tienen su valor predeterminado en lugar de descartarlos, por lo que un booleano false, un número 0, una cadena vacía y un array vacío aparecen todos en el cuerpo. Lee el valor en sí en lugar de interpretar una clave ausente como el valor predeterminado. Los campos documentados como ausentes u omitidos son opcionales en el contrato y quedan fuera del cuerpo cuando no se establecen.
Vista previa
Parte de la superficie de la API se publica en vista previa. Aparece en esta referencia y en la especificación, pero su estructura puede cambiar antes de su disponibilidad general. La especificación de OpenAPI la marca con x-cursor-visibility: PREVIEW. El marcador puede aplicarse a una operación, un parámetro, un esquema o un solo campo, por lo que una operación estable puede devolver igualmente un campo en vista previa. Los endpoints en vista previa muestran la insignia Preview en esta referencia. Trata los campos en vista previa como opcionales y no crees una dependencia estricta de su estructura.
Primeros pasos
Acceso a Origin
- Explora Origin en cursor.com/codebase.
- Gestiona los ajustes de la aplicación en cursor.com/codebase/settings/apps.
- Genera una clave de firma para la aplicación y registra solo la clave pública.
CLI de Origin
Instala la CLI de Origin e inicia sesión:
curl -fsSL https://downloads.cursor.com/origin/install.sh | shorigin auth loginClona un repositorio existente:
origin repo clone '{ownerSlug}/{repoName}'# o usa git directamentegit clone 'https://origin.cursor.com/{ownerSlug}/{repoName}.git'Las aplicaciones clonan mediante la autenticación de Git por HTTPS con un token de acceso de instalación, no con el inicio de sesión de un usuario.
Instalación
Indica al administrador del espacio de trabajo del cliente que vaya a:
/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| Parámetro | Obligatorio | Descripción |
|---|---|---|
client_id | Sí | ID de la aplicación de Origin. |
scope | Sí | Ámbitos separados por espacios. repository:metadata:read se añade automáticamente. |
redirect_uri | Sí para instalaciones iniciadas por partners | URI de callback registrado exacto. |
state | Muy recomendado | Valor aleatorio antifalsificación que se incluye como la afirmación state del recibo de instalación. Genérelo antes de redirigir y verifique la afirmación en el callback. |
summary | No | Breve explicación que se muestra durante el consentimiento. |
include_granted_scopes | No | Cuando es true, conserva las autorizaciones existentes y solicita solo las adicionales. |
El administrador del espacio de trabajo elige el propietario de destino, los ámbitos aprobados y todos los repositorios o solo los repositorios seleccionados. El cliente, no la aplicación, controla el acceso al repositorio.
Tras la aprobación, Origin redirige al callback registrado:
https://ci.example.com/origin/callback?installation_receipt=RECEIPT_JWTVerifica el recibo de instalación y luego guarda el ID de instalación de la afirmación sub del recibo. Lo necesitarás siempre que emitas un token de acceso de instalación.
Las instalaciones usan uno de estos dos modos de selección de repositorios:
all: la instalación puede acceder a todos los repositorios propiedad del destino seleccionado.selected: la instalación solo puede acceder a los repositorios seleccionados por el administrador del espacio de trabajo.
Ambos modos incluyen repositorios replicados y repositorios nativos de Origin, por lo que una réplica aparece en GET /installation/repos y puede seleccionarse. Una réplica es de solo lectura hasta que se convierte en una réplica saliente estable: consulta Repositorios replicados.
Usa GET /installation/repos con un token de instalación para consultar los repositorios disponibles para esa instalación. Los endpoints JWT de aplicación permiten listar, inspeccionar y eliminar las instalaciones de la app. Eliminar una instalación impide emitir nuevos tokens.
Recibo de instalación
installation_receipt es un JWT compacto de corta duración firmado por Origin. Demuestra que la aprobación de la instalación provino de Origin y no de una redirección falsificada, e incluye todo lo que necesita el callback. Cherri Code no redirige sin él, por lo que los callbacks externos siempre lo incluyen.
Encabezado JOSE:
{ "alg": "EdDSA", "kid": "origin-key-id", "typ": "origin-installation-receipt+jwt"}Afirmaciones:
{ "iss": "https://api.cursor.com/v1/origin", "aud": "app_01...", "sub": "i_01...", "namespace_id": "ns_01...", "iat": 1786465200, "exp": 1786465500, "jti": "RECEIPT_UUID", "installedBy": { "id": "user_01...", "email": "[email protected]", "displayName": "Jane Doe" }, "state": "ORIGINAL_VALUE"}audes el ID de tu app ysubes el ID de la instalación que debes usar al emitir tokens de acceso de instalación.namespace_ides el ID estable del espacio de nombres en el que se instaló la app.installedByidentifica al usuario que realizó esta instalación o volvió a dar su consentimiento. Describe la acción actual, por lo que, al volver a dar su consentimiento, puede diferir delinstalledByduradero de Obtener instalación de app. IncluyedisplayNamecuando la cuenta tiene un nombre y nunca incluyehandle; lee el handle de una respuesta REST o de un payload de webhook.- Los recibos caducan cinco minutos después de su emisión.
jties único para cada recibo. statesolo está presente cuando la URL de instalación incluía unstateno vacío y reproduce ese valor. Compáralo con el valor antifalsificación que generaste antes de redirigir.
Verifica el recibo antes de confiar en el callback: obtén la clave de firma del JWKS mediante el encabezado kid, exige alg EdDSA y typ origin-installation-receipt+jwt, y valida la firma, iss, aud y exp. Rechaza el callback si falla la verificación.
El recibo no es un token de acceso de instalación. No lo envíes nunca como credencial Bearer; en su lugar, emite tokens de instalación mediante Crear token de acceso de instalación.
Autenticación
Envía las credenciales REST con el esquema Bearer. Los badges de Auth de cada endpoint indican los tipos de credenciales que acepta:
curl --request GET \ --url https://api.cursor.com/v1/origin/repos/OWNER_SLUG/REPO_NAME \ --header "Authorization: Bearer $ORIGIN_BEARER_TOKEN"Las claves de API de Cherri Code no son tokens Bearer de Origin. Para las solicitudes autenticadas por usuario, usa la CLI de Origin, que intercambia una clave de API de usuario personal por el token de acceso de corta duración que Origin acepta. No coloques una clave de API de Cherri Code directamente en el header Authorization.
Generar una clave de firma para una aplicación
Las aplicaciones de Origin se autentican con un par de claves Ed25519. Genere el par localmente y registre solo la clave pública en cursor.com/codebase/settings/apps. Una aplicación puede tener hasta 10 claves de firma activas.
La clave privada debe mantenerse secreta. No la cargue, la pegue en la configuración de la aplicación, la incluya en un commit de un repositorio ni la comparta. Guárdela en un gestor de secretos. Cherri Code almacena solo la clave pública.
Cree una clave privada PKCS#8 y una clave pública PEM SPKI con OpenSSL:
openssl genpkey -algorithm ED25519 -out origin-app-private.pemopenssl pkey -in origin-app-private.pem -pubout -out origin-app-public.pemEl archivo de clave pública comienza con -----BEGIN PUBLIC KEY-----. Pegue ese PEM al añadir una clave de firma. Use la clave privada correspondiente únicamente para firmar JWT de aplicación.
JWT de aplicación
Firma un JWT de corta duración con la clave privada Ed25519 asociada a una de las claves de firma activas de la aplicación. Genera ese par como se describe en Generar una clave de firma de aplicación.
Encabezado JOSE:
{ "alg": "EdDSA", "kid": "app_01...", "typ": "JWT"}Afirmaciones:
{ "iss": "app_01...", "aud": "origin-apps", "iat": 1782928800, "exp": 1782929100}Establece iss y kid con el ID de la aplicación. Usa una validez de aproximadamente cinco minutos.
Authorization: Bearer APP_JWTUsa un JWT de aplicación para realizar operaciones a nivel de aplicación, como leer los metadatos de la aplicación, gestionar instalaciones, emitir tokens de instalación y recuperar entregas de webhooks.
Token de acceso de instalación
Realiza una solicitud a POST /app/installations/{installationId}/access_tokens con un JWT de aplicación. Los tokens de acceso de instalación comienzan con oit_.
Authorization: Bearer oit_...La respuesta incluye expiresAt. Emite tokens justo a tiempo, renuévalos antes de que caduquen, trátalos como contraseñas y nunca los registres.
Un token caduca como máximo 15 minutos después de su creación, y nunca más tarde que el JWT de aplicación que lo solicitó, por lo que el JWT de cinco minutos recomendado arriba produce un token de cinco minutos como máximo. Lee expiresAt y emite un nuevo token cuando se supere, en lugar de dar por supuesta una duración: los tokens de Origin tienen una vida más corta que los tokens de acceso de instalación de las GitHub Apps, y una integración que reutilice un token siguiendo la planificación de GitHub fallará en cuanto el token caduque. Firma el JWT con un exp posterior cuando un job necesite los 15 minutos completos, tal como hace la receta de CI de CloneKit.
Eliminar la instalación o eliminar la aplicación invalida sus tokens de acceso de instalación antes de expiresAt. La API REST y Git por HTTPS rechazan entonces el token con 401. No lo reintentes con el mismo token; la aplicación debe reinstalarse antes de poder emitir uno funcional.
Un token de acceso de instalación no puede exceder los ámbitos aprobados ni el acceso a repositorios de la instalación. Puedes restringir un token a menos scopes o repositoryIds. Los arrays vacíos u omitidos heredan el grant completo de la instalación.
Usa tokens de acceso de instalación para operaciones con ámbito de repositorio, incluidos los pull requests, las escrituras de comprobaciones de ejecución y Git por HTTPS.
Para actuar como miembro del espacio de nombres de la instalación en lugar de hacerlo como la aplicación, emite un token de usuario de instalación. Consulta Actuar en nombre de usuarios.
Autenticación de Git por HTTPS
Los tokens de acceso de instalación autentican Git por HTTPS. El endpoint de Git usa autenticación HTTP Basic: la contraseña es el token de instalación y el nombre de usuario es x-access-token. Las credenciales Bearer se usan con la API REST; Git por HTTPS las rechaza.
Emita un token desde Crear token de acceso de instalación inmediatamente antes de la operación de Git. Los tokens caducan en un máximo de 15 minutos.
Clone, fetch y pull requieren repository:contents:read. Hacer push requiere repository:contents:write. El token debe incluir el repositorio de destino en su concesión.
Hacer push también requiere que el propietario del repositorio pueda escribir en Origin, el mismo requisito que exige Crear repositorio. Si el propietario es un usuario, debe tener un plan Pro, Pro Student, Pro+, Ultra o Start. Si el propietario es un equipo, debe tener un plan de equipo de pago activo, no debe estar en modo de privacidad (heredado) y Origin no debe estar desactivado por un administrador de equipo. Hacer push a un repositorio cuyo propietario no cumple los requisitos devuelve 403. Clone, fetch y pull no tienen este requisito.
Obtenga cloneUrl desde Get Repo o Listar repositorios de la instalación de la aplicación. Tanto la ruta con formato de GitHub (https://origin.cursor.com/OWNER_SLUG/REPO_NAME.git) como la ruta heredada /git/ permiten clonar.
git clone "https://x-access-token:${INSTALLATION_TOKEN}@origin.cursor.com/OWNER_SLUG/REPO_NAME.git"Incluir el token en la URL lo guarda en .git/config. Después de clonar correctamente, actualiza el remoto para que los comandos posteriores no reutilicen un secreto vencido:
git remote set-url origin "https://origin.cursor.com/OWNER_SLUG/REPO_NAME.git"Para evitar incluir el token en la URL remota, proporciónalo mediante el asistente de credenciales de 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"El asistente de credenciales de CLI de Origin es para el inicio de sesión de usuarios. Las integraciones de aplicaciones envían el token de instalación, como se muestra aquí. Trata el token como una contraseña: nunca lo registres y emite uno nuevo antes de expiresAt si un trabajo aún necesita acceso a Git.
Git por HTTPS mide su propio presupuesto, separado del presupuesto de REST en Límites de uso. Una respuesta de Git con cargo incluye los mismos encabezados X-RateLimit-Limit, X-RateLimit-Remaining y X-RateLimit-Used, con X-RateLimit-Resource establecido en git en lugar de core. Las solicitudes de Git que exceden el presupuesto devuelven 429 con Retry-After y X-RateLimit-Reset. Consulta los encabezados para ajustar el ritmo de un trabajo en lugar de suponer un número; las solicitudes sin medición no incluyen encabezados de límite de uso.
En un repositorio replicado, un token de instalación permite clonar, hacer fetch y pull, y Origin rechaza git push con 403 hasta que la réplica se convierta en una réplica saliente estable. Consulta Repositorios replicados.
Solicitudes de CLI autenticadas por usuario
Usa origin api para las solicitudes autenticadas por usuario. Para una sesión interactiva, inicia sesión desde tu navegador:
origin auth loginorigin api /repos/OWNER_SLUG/REPO_NAME/pullsPara una sesión no interactiva, proporciona una clave de API de usuario personal desde Cherri Code Dashboard → API Keys:
export CURSOR_API_KEY="YOUR_PERSONAL_USER_API_KEY"origin api /repos/OWNER_SLUG/REPO_NAME/pullsLa CLI intercambia la clave de API personal por un token de acceso de usuario de corta duración y luego envía ese token en el header Authorization. No envíes la clave de API directamente a un endpoint de Origin. Las integraciones de aplicación deben usar JWT de aplicación y tokens de acceso de instalación.
Descubrimiento y claves de firma
Origin publica metadatos de descubrimiento sin autenticación y sus claves de firma activas. Las mismas claves firman las entregas de webhooks y los recibos de instalación.
Los metadatos de descubrimiento identifican al emisor y 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 devuelve JWK de Ed25519 activos:
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" } ]}Guarda el JWKS en caché. /keys envía Cache-Control: public, max-age=600, stale-if-error=600, así que reutiliza una respuesta en caché durante 10 minutos y luego actualízala; si la actualización falla, conserva las últimas claves válidas durante un máximo de otros 10 minutos antes de que falle la verificación. Actualiza también si una firma no se puede verificar con ninguna clave, lo que elimina un ID de clave retirado. Las claves se rotan semanalmente.
Las firmas de webhook no incluyen un ID de clave, por lo que la verificación debe probar cada clave Ed25519 activa. Los recibos de instalación incluyen el kid de la clave de firma en su cabecera JOSE, por lo que la verificación de recibos puede resolver la clave directamente.
Ámbitos
Solicita únicamente los ámbitos mínimos que necesite tu aplicación. repository:metadata:read y el acceso a los metadatos de la aplicación o de la instalación se conceden automáticamente y no deben añadirse por separado a las URL de instalación.
| Ámbito | Permite |
|---|---|
repository:metadata:read | Leer metadatos del repositorio. Se añade automáticamente. |
repository:contents:read | Leer commits, ramas, contenido, archivos de comparación y objetos Git de bajo nivel. Buscar texto en archivos. Descargar un archivo del repositorio. Clonar, hacer fetch y hacer pull mediante Git por HTTPS. Sincronizar un repositorio replicado desde su fuente ascendente. |
repository:contents:write | Hacer push mediante Git por HTTPS. Fusionar pull requests. Crear ramas y hacer commit de cambios en archivos a través de los endpoints de datos de Git. Volver a solicitar una ejecución de comprobación. |
repository:pull_requests:read | Leer pull requests, archivos modificados, commits de pull requests, etiquetas asignadas y elegibilidad de fusión. |
repository:pull_requests:write | Crear y actualizar pull requests. Asignar y eliminar etiquetas de pull requests. |
repository:pull_requests:reviews:read | Leer comentarios de pull requests, hilos de comentarios, revisiones enviadas y revisores solicitados. |
repository:pull_requests:reviews:write | Crear y actualizar comentarios; resolver y reabrir hilos de comentarios; crear, actualizar y descartar revisiones; solicitar y eliminar revisores. |
repository:checks:read | Leer suites de comprobación, ejecuciones y anotaciones de ejecuciones de comprobación. |
repository:checks:write | Crear y actualizar suites de comprobación y ejecuciones. Añadir anotaciones de ejecuciones de comprobación. |
repository:labels:read | Leer las definiciones de etiquetas que posee un repositorio. |
repository:labels:write | Crear, actualizar y eliminar definiciones de etiquetas del repositorio. |
repository:rulesets:read | Leer conjuntos de reglas del repositorio. |
repository:rulesets:write | Crear, actualizar y eliminar conjuntos de reglas del repositorio. |
repository:settings:read | Leer los grants mantenidos directamente sobre un repositorio. |
repository:settings:write | Actualizar los ajustes del repositorio: la rama predeterminada, la visibilidad, los métodos de fusión y la eliminación automática de la rama principal. Crear o actualizar y eliminar grants sobre un repositorio. |
namespace:settings:read | Leer los grants mantenidos directamente sobre un propietario. Leer las autoridades de certificación SSH en las que confía un propietario y si este exige certificados. |
namespace:settings:write | Crear o actualizar y eliminar grants sobre un propietario. Añadir y eliminar autoridades de certificación SSH y establecer si el propietario exige certificados; estas escrituras las proporciona una credencial de usuario de Cherri Code. |
namespace:user_tokens:write | Emitir tokens de usuario de instalación que actúan como miembro del espacio de nombres de la instalación. Un token no puede incluir este ámbito. Consulta Actuar en nombre de usuarios. |
Solicitar un ámbito :write también concede el ámbito :read correspondiente, por lo que repository:labels:write abarca repository:labels:read y no es necesario enumerar ambos. Lo contrario no se cumple: un ámbito de lectura nunca concede permisos de escritura.
El token de instalación solo puede restringir estos grants. No puede añadir un ámbito ni un repositorio que el administrador del espacio de trabajo no haya aprobado.
Los cambios de estado de la replicación quedan fuera de esta tabla. Transition Repo Mirror, Force Repo Mirror Cutover y Desvincular réplica de repositorio requieren repository:mirror:write o repository:mirror:delete, que una aplicación no puede solicitar durante la instalación: los proporciona una credencial de usuario de Cherri Code, y quien realiza la llamada también debe administrar el repositorio en la fuente ascendente de la replicación.
La gestión de instalaciones también queda fuera. Add App Installation Repositories requiere namespace:installations:write, que una aplicación no puede solicitar durante la instalación: lo mantiene un administrador del espacio de nombres en una credencial de usuario de Cherri Code, y el mismo tipo de credencial que consintió la instalación es el que puede ampliarla.
La gestión de aplicaciones queda fuera por la misma razón. Crear aplicación requiere namespace:apps:create, List Namespace Apps y Get App requieren namespace:apps:read, y Update App, Add App Signing Key y Revoke App Signing Key requieren app:settings:write. Un publicador mantiene estos ámbitos en una credencial de usuario de Cursor; una aplicación no puede solicitarlos para sí misma.
La tabla abarca los ámbitos que solicita una aplicación durante la instalación. Para consultar el ámbito que requiere una operación concreta, lee su extensión x-origin-scopes en la especificación de OpenAPI. Esa extensión abarca todas las operaciones, incluidos los ámbitos app, installation y namespace que vienen con la propia credencial en lugar de con un grant de instalación. Una operación cuyos ámbitos vienen todos con la credencial marca su extensión como ambient: true: no hay nada que solicitar para ella y basta con presentar la credencial correcta.
Repositorios replicados
Una instalación usa todos los ámbitos que tiene en un repositorio nativo de Origin y en una réplica saliente estable. En un repositorio con cualquier otro estado de réplica, solo se aplican dos ámbitos:
repository:metadata:readrepository:contents:read
Todos los demás ámbitos devuelven 403 en ese repositorio, independientemente de lo que haya aprobado el administrador del espacio de trabajo. A través de la API REST, siguen funcionando las lecturas del repositorio y del contenido, la comparación de commits y Sync Mirror; Origin rechaza los pull requests, las revisiones, los comentarios, las comprobaciones, los conjuntos de reglas y cualquier operación de escritura. A través de Git por HTTPS, siguen funcionando clone, fetch, pull y la descarga de LFS; Origin rechaza push y la carga de LFS.
Sacar un repositorio de ese estado es una operación que requiere credenciales de usuario, no algo que pueda hacer una instalación: Transition Repo Mirror hace avanzar la dirección de la réplica, Force Repo Mirror Cutover cambia a la fuente ascendente sin enviar de vuelta las refs divergentes y Detach Repo Mirror desconecta definitivamente la réplica.
El objeto mirror de un repositorio no indica si se permiten operaciones de escritura. Una réplica en plena transición puede informar de que mirror.status es outbound y seguir siendo de solo lectura, así que considera el 403 como la fuente de autoridad en lugar de basarte en mirror.status.
Límites de uso
La API de Origin utiliza un presupuesto compartido de puntos por entidad principal que se restablece en una ventana móvil de un minuto. Cada tipo de entidad principal autenticada tiene su propio presupuesto:
| Entidad principal | Presupuesto predeterminado |
|---|---|
| Token de acceso de instalación | 3.000 puntos/minuto |
| JWT de aplicación | 6.000 puntos/minuto |
| Usuario de Cherri Code o cuenta de servicio | 600 puntos/minuto |
Cada endpoint aplica un coste fijo a ese presupuesto antes de ejecutar el controlador. Los errores de autenticación y autorización no consumen puntos.
| Coste | Operaciones |
|---|---|
| 0 | Obtener límite de uso. Solo consulta el estado; no consume puntos. |
| 1 | La mayoría de los endpoints de lectura, además de Crear token de acceso de instalación |
| 5 | Operaciones de escritura habituales, además de estas operaciones de lectura más costosas: Obtener commit, Listar archivos de commit, Listar archivos de comparación, Listar archivos de pull request, Obtener archivo tar del repositorio y Grep Contents |
| 10 | Crear aplicación, Crear repositorio, Crear commit a partir de archivos, Fusionar pull request, Obtener capacidad de fusión de pull request, Transition Repo Mirror y Force Repo Mirror Cutover |
Cherri Code puede aumentar los presupuestos por minuto de cada aplicación para los partners de diseño. Contacta con Cherri Code si tu integración necesita un límite mayor.
Encabezados de respuesta
Las respuestas facturadas y Obtener límite de uso incluyen:
| Encabezado | Descripción |
|---|---|
X-RateLimit-Limit | Puntos disponibles en la ventana actual para esta entidad principal |
X-RateLimit-Remaining | Puntos restantes en la ventana actual |
X-RateLimit-Used | Puntos consumidos en la ventana actual |
X-RateLimit-Reset | Marca de tiempo Unix (segundos UTC) en la que se restablece la ventana |
X-RateLimit-Resource | Siempre core para el presupuesto compartido de la API pública |
X-RateLimit-Reset indica una ventana completa de 60 segundos desde el momento de la respuesta. La ventana del contador comienza con la primera solicitud facturada de una ráfaga, no en el límite de un minuto natural.
Superar el límite
Cuando una solicitud supera el presupuesto, la API devuelve HTTP 429 con:
Retry-After: segundos de espera antes de reintentar (60)- Los mismos encabezados
X-RateLimit-*, conX-RateLimit-Remainingestablecido en0
{ "code": 8, "message": "Rate limit exceeded: 3000 points per minute for this installation. Retry after 60s.", "details": []}Espera Retry-After o hasta X-RateLimit-Reset antes de reintentar. Usa una espera progresiva con fluctuación cuando varios clientes simultáneos compartan un mismo token de instalación.
Consultar la cuota restante
Llame a Obtener límite de uso para consultar el presupuesto actual sin consumir puntos. El cuerpo de la respuesta refleja los encabezados X-RateLimit-* del recurso compartido core.
Convenciones comunes
Paginación
Los endpoints paginados aceptan:
pageSize: el valor predeterminado es 30 y el máximo es 100.pageToken: token opaco devuelto por la página anterior. No lo inspecciones ni lo construyas.
Las respuestas usan un campo de colección específico del recurso y nextPageToken. Este está vacío cuando no hay una página siguiente. Las respuestas de listas públicas no incluyen recuentos totales. Los tokens de página están vinculados al recurso y los filtros de los que proceden. Reinicia la paginación cuando cambien los filtros. Los tokens no vacíos no válidos o que no coincidan devuelven 400.
Envía el mismo pageSize en cada solicitud de una secuencia, incluidas las continuaciones. La mayoría de los endpoints de listado usan el pageSize enviado junto con un token de página para determinar el tamaño de esa página y mantienen el tamaño de la página anterior si se omite; así lo indican sus entradas de pageToken. Los demás difieren en lo que recuerda un token de página, por lo que, si usas un pageSize constante, obtendrás el mismo tamaño de página en todos los endpoints.
Errores
Los errores usan un cuerpo con el estilo de Google RPC:
{ "code": 5, "message": "resource not found", "details": []}Los estados HTTP habituales son 400, 401, 403, 404, 429, 500 y 503. Algunas operaciones de la base de datos de Git también devuelven 409 por conflictos en el estado del repositorio. Consulta Límites de uso para ver los encabezados de 429 y el comportamiento de reintento.
Usa el estado HTTP y code para distinguir entre errores. Considera message como texto para desarrolladores.
Un 404 nunca distingue entre un recurso que no existe y uno al que tu aplicación no puede acceder. Interprétalo como "no disponible para esta instalación" en lugar de como prueba de que el recurso no existe.
details contiene entradas tipadas: violaciones de campo de google.rpc.BadRequest cuando un argumento no es válido y una entrada google.rpc.RequestInfo en cada error. Origin puede añadir tipos de detalles en cualquier momento, así que ignora las entradas que tu integración no reconozca.
Cada respuesta de error incluye el ID de solicitud dos veces: en un encabezado de respuesta X-Request-ID y como una entrada google.rpc.RequestInfo en details. Origin devuelve el x-request-id que enviaste o genera uno si no envías ninguno. La entrada RequestInfo está presente incluso cuando message es un error interno opaco, así que incluye el ID de solicitud cuando te pongas en contacto con Cherri Code por una llamada fallida.
Las rutas sin coincidencia bajo /v1/origin y las solicitudes que usan el método incorrecto en una ruta conocida devuelven este mismo cuerpo en lugar de un error genérico del enrutador. El mensaje indica el método y la ruta, y nunca devuelve la cadena de consulta.
IDs
Los ID de recurso son cadenas opacas con un prefijo de tipo, como app_… para una aplicación e i_… para una instalación. Almacénalos y compáralos como cadenas completas. No los analices, no intentes deducir significado a partir de sus caracteres ni dependas de su orden.
Un ID no cambia durante toda la vida de su recurso, mientras que los nombres y los slugs sí pueden cambiar. Un repositorio conserva su ID aunque se le cambie el nombre, así que usa el ID como clave para los datos en caché en lugar de {ownerSlug}/{repoName}, y haz referencia al repositorio por su ID como se describe en Rutas de repositorio.
Rutas de repositorio
Las rutas con ámbito de repositorio usan el slug del propietario y el nombre del repositorio en el formato {ownerSlug}/{repoName}. Ambos segmentos se resuelven sin distinguir entre mayúsculas y minúsculas, por lo que cualquier combinación de estas identifica el repositorio. Las respuestas devuelven el nombre y el slug almacenados, no la combinación de mayúsculas y minúsculas que envió, y las URL de Git por HTTPS se resuelven de la misma forma. Compare los nombres de repositorio sin distinguir entre mayúsculas y minúsculas y consulte las mayúsculas y minúsculas canónicas en Obtener repositorio.
Todas las rutas con ámbito de repositorio también aceptan el ID estable del repositorio en lugar del par: envíe _ como slug del propietario y el ID como nombre del repositorio, como en GET /v1/origin/repos/_/REPO_ID. Consulte el ID en el campo id de Obtener repositorio. El valor especial _ no puede reclamarse como slug del propietario, por lo que las dos formas nunca entran en conflicto. En una solicitud de Connect o JSON, establezca ownerSlug en _ y name en el ID.
La forma con ID permanece tras un cambio de nombre, lo que la convierte en la forma estable de identificar un repositorio. No otorga nada por sí sola: después de que Origin resuelva el ID a un repositorio, su aplicación sigue necesitando el mismo ámbito en ese repositorio. Un ID al que su aplicación no puede acceder devuelve el mismo cuerpo 404 que un ID que no existe, por lo que una respuesta nunca confirma que un repositorio existe. Un ID malformado devuelve 400. Crear repositorio acepta solo un slug del propietario y rechaza _.
Referencias de recursos
Las instantáneas de recursos contienen los campos actuales del recurso. El contexto del contenedor utiliza referencias compactas en lugar de duplicar recursos completos:
RepositoryReferenceidentifica un repositorio.PullRequestReferenceidentifica una pull request e incluye anidada la referencia a su repositorio.ThreadReferenceidentifica el hilo que contiene un comentario de pull request.OriginActoridentifica un actor público como una de las variantesuser,apposerviceAccount. Hay exactamente una variante presente; lea la identidad de esa variante.
Ejecuciones de comprobación
Las aplicaciones informan los resultados de CI como suites de comprobación y ejecuciones de comprobación asociadas a un commit mediante Post Check Run y Batch Upsert Check Runs, y los consultan a través de los endpoints de Checks. Esta sección define los términos que comparten esos endpoints: qué intento es el actual, cómo Origin ordena e informa las escrituras, y cómo se comportan los timestamps y los plazos.
Intentos y el intento actual
Cada (actor, key, externalId) reportado sobre un commit es un intento de suite, y cada (suite, key, externalId) dentro de él es un intento de ejecución. Reutilizar un externalId actualiza ese intento en el mismo lugar; un externalId nuevo inicia un intento nuevo y conserva el anterior como historial. Los intentos sustituidos siguen siendo consultables por id mediante Get Check Suite y Obtener ejecución de comprobación.
Allí donde la API muestra las comprobaciones actuales de un commit —en List Check Suites For Commit, List Check Runs For Commit y en el estado de CI y las comprobaciones obligatorias del pull request—, Origin colapsa los intentos en dos pasos:
- El intento de suite actual por
(actor, key)es aquel cuyas ejecuciones actuales, tal como las selecciona el segundo paso, tienen elexternalUpdatedAtmás reciente; una suite sin ejecuciones se ordena por sucreatedAt. Los empates se resuelven por elcreatedAtde la suite y luego por suid, de más reciente a más antiguo. - Dentro de ese intento de suite, la ejecución actual para una
keyes la que tiene elexternalUpdatedAtmás reciente. Los empates se resuelven porcreatedAty luego porid, de más reciente a más antiguo.
List Check Runs For Suite aplica el segundo paso a la suite que indiques. Una ejecución es la actual para su commit solo cuando su suite es el intento de suite actual del commit. Como el primer paso ordena intentos de suite completos, una ejecución publicada bajo un intento de suite sustituido queda fuera de las comprobaciones del commit mientras otro intento tenga un externalUpdatedAt más reciente; en cuanto su marca de tiempo sea la más reciente, su intento de suite pasa a ser el actual y se ocultan entonces las ejecuciones del otro intento.
Un intento cancelado no desplaza a uno superado. En cualquiera de los dos pasos, un intento cancelado queda por debajo de los demás intentos de su key si el intento no cancelado más reciente de esa key se superó. Una ejecución se considera superada cuando está completed con la conclusión success, neutral o skipped. Un intento de suite se considera superado cuando todas sus ejecuciones actuales se superaron, y cuenta como cancelado cuando todas sus ejecuciones actuales están completed, al menos una con la conclusión cancelled y el resto superadas. Cuando se solicita repetir el intento superado, los intentos cancelados cuyo externalUpdatedAt sea igual o posterior a la solicitud vuelven a ordenarse por sus marcas de tiempo. Un intento de suite cancelado más reciente sigue desplazando a uno más antiguo que no se superó por completo.
Una ejecución cuya repetición se ha solicitado mantiene su lugar como intento actual para su key y figura como pendiente hasta que la aplicación propietaria responda: consulta Rerequest Check Run.
Ordenar las escrituras
Origin ordena las publicaciones dirigidas a una misma ejecución, es decir, el mismo externalId y key dentro de la suite, según checkRun.externalUpdatedAt con precisión de milisegundos. Una publicación se aplica solo cuando su valor es igual o posterior al externalUpdatedAt almacenado de la ejecución, elevado a rerequestedAt mientras haya una nueva solicitud pendiente. Los valores iguales sí se aplican, por lo que gana la publicación más reciente, con dos excepciones que también se consideran obsoletas: una publicación queued o in_progress no puede reabrir una ejecución completed con la misma marca de tiempo, y una publicación con exactamente la marca de tiempo almacenada se ignora mientras rerequestedAt esté establecido. Un valor más reciente se aplica, incluso si reabre una ejecución completed, con una excepción que se considera obsoleta independientemente de su marca de tiempo: una publicación completed con la conclusión cancelled no puede reemplazar una ejecución completed cuya conclusión sea success, neutral o skipped.
Una publicación obsoleta igualmente se considera correcta. La respuesta es HTTP 200 con la suite y la ejecución almacenadas, no con los valores publicados, y el updatedAt de la ejecución no cambia. Cada ejecución publicada se devuelve como un par: checkRun, la ejecución almacenada después de la llamada, y outcome, lo que la escritura hizo con ella. Post Check Run devuelve el par en el nivel superior de su respuesta, junto a checkSuite. Batch Upsert Check Runs devuelve un par por cada ejecución publicada en results[], en el orden de la solicitud, de modo que un elemento del lote lleva el mismo resultado por ejecución que la llamada individual incluye directamente. Lee outcome, o cada results[].outcome, para saber qué hizo la escritura:
outcome | Significado |
|---|---|
created | No existía ninguna ejecución para (externalId, key) en la suite; se creó una. |
updated | Una ejecución existente se reemplazó con los valores publicados. |
unchanged | Los valores publicados, incluido externalUpdatedAt, coinciden con la ejecución almacenada; no se escribió nada. |
ignored_stale | La publicación se ignoró por obsoleta; checkRun lleva la ejecución almacenada, no los valores publicados. |
updatedAt no avanza en una publicación unchanged ni ignored_stale, por lo que no permite distinguirlas; solo outcome puede hacerlo. Interpreta un valor no reconocido como «la ejecución almacenada está en la respuesta; se desconoce si se escribió». En un lote, Origin aplica la regla a cada ejecución por separado: una ejecución obsoleta no hace fallar el lote, y results[] lleva la ejecución almacenada en la posición correspondiente con outcome ignored_stale.
En Batch Upsert Check Runs, el checkRuns[] de nivel superior está en desuso en favor de results[]. Se sigue rellenando con las mismas ejecuciones almacenadas y en el mismo orden, pero no incluye resultados; lee results[] en su lugar. Esto se aplica solo al lote: en Post Check Run, checkRun y outcome son los campos de nivel superior que debes leer.
Marcas de tiempo y plazos
Una publicación cuyo externalUpdatedAt, startedAt o completedAt se sitúe más de 60 segundos en el futuro devuelve InvalidArgument (HTTP 400). completedAt no puede ser anterior a startedAt cuando ambos aparecen en la misma publicación. deadlineAt no puede situarse más de 24 horas en el futuro.
Solo expira una ejecución in_progress. Una vez vencido su deadlineAt, un barrido periódico la completa con la conclusión timed_out, establece completedAt si la ejecución no lo tenía, borra deadlineAt y entrega repository.check_run.completed. La expiración se produce unos minutos después del plazo, no exactamente en él: el barrido se ejecuta aproximadamente cada 30 minutos de forma predeterminada, una configuración operativa que puede cambiar, así que no dependas de ese intervalo. Una ejecución queued nunca expira, ni tampoco una ejecución sin deadlineAt. Una publicación completed borra el plazo. Origin deja externalUpdatedAt intacto cuando agota el tiempo de una ejecución, por lo que una publicación posterior con un externalUpdatedAt más reciente sigue aplicándose a una ejecución expirada.
Limitaciones actuales
- El listado y la creación de repositorios en todo el espacio de nombres no forman parte de la API para partners. Descubre los repositorios mediante la instalación.
- La comparación de commits devuelve datos resumidos, en lugar de una lista de commits integrada. Los archivos modificados tienen su propio endpoint paginado, Listar archivos de comparación.
- Los hilos solo se pueden abordar para su resolución. No hay ningún endpoint que liste los hilos directamente; léelos en los comentarios que contienen.
- Los webhooks de push no incluyen una lista completa de commits.
- La fusión de pull requests es compatible con repositorios nativos de Origin. Los repositorios replicados se rechazan.
- Un repositorio replicado es de solo lectura para una instalación hasta que se convierta en una réplica saliente estable. Consulta Repositorios replicados.
Lista de verificación de implementación
- Almacena la clave privada de Ed25519 en un gestor de secretos y rota las claves de forma planificada. Consulta Generar una clave de firma de la app.
- Verifica el recibo de instalación en los callbacks de instalación y lee el ID de instalación y
statede sus afirmaciones. - Usa JWT de aplicación de corta duración y emite tokens de acceso de instalación justo a tiempo.
- Usa tokens de acceso de instalación, no JWT de aplicación, para las API con ámbito de repositorio, la escritura de comprobaciones y Git HTTPS.
- Solicita los ámbitos mínimos y el acceso al repositorio.
- Trata los tokens de página como opacos y reinicia la paginación cuando cambien los filtros.
- Mantén estables y legibles los valores de
keyde las comprobaciones. Usa un nuevoexternalIdinmutable para cada reintento y valores deexternalUpdatedAtcada vez mayores para las actualizaciones. - Lee
outcomeen cada respuesta de Post Check Run y cadaresults[].outcomeen cada respuesta de Batch Upsert Check Runs; una publicación obsoleta devuelve200con la ejecución almacenada. Consulta Ejecuciones de comprobación. - Verifica las firmas de los webhooks con el cuerpo sin procesar de la solicitud antes de analizarlo.
- Elimina las entregas duplicadas con
webhook-idy procésalas de forma asíncrona después de devolver2xx. - Ignora los campos JSON desconocidos para garantizar la compatibilidad futura.
- Respeta los encabezados
Retry-AfteryX-RateLimit-*. Usa Obtener límite de uso para supervisar los puntos restantes sin consumirlos.
Referencia de endpoints
Descarga la especificación de OpenAPI para consultar los esquemas completos de los componentes. El documento declara https://api.cursor.com como su servidor y un esquema de seguridad HTTP bearer bearerAuth, y cada operación incluye los códigos de respuesta que esa operación puede devolver, además de un ejemplo de solicitud y de respuesta. Cada operación también incluye una extensión x-origin-scopes: scopes contiene el ámbito que requiere la operación y tokenTypes contiene los tipos de credencial que acepta. Cada esquema de payload de webhook incluye una extensión x-origin-webhook-events que enumera los eventos que lo envían, y la superficie en versión preliminar incluye x-cursor-visibility: PREVIEW. Los parámetros de ruta tienen los mismos nombres que usan las URL: ownerSlug y repoName. Cada operación tiene un operationId único; cuando una misma operación responde a dos formas de URL, el id de la segunda forma lleva el sufijo _2, como en OriginService_GetRepoTarball_2.
Los fragmentos de JSON muestran valores de marcador de posición con la estructura del esquema. Las descripciones de los campos de respuesta reflejan el esquema de OpenAPI y el contrato actual de la plataforma.
Aplicaciones e instalaciones
Obtener límite de uso
/v1/origin/rate_limitDevuelve el estado actual del límite de uso de la API pública del principal autenticado.
El acceso a este endpoint no consume puntos del límite de uso. La respuesta muestra el presupuesto compartido de puntos por minuto que usan otros endpoints de la API pública para este principal. Consulta Límites de uso.
Campos de respuesta
resources objeto
resources.core objeto
resources.core.limit entero
resources.core.remaining entero
resources.core.reset entero
resources.core.used entero
rate objeto
resources.core. Usa resources.core en clientes nuevos.curl --request GET \ --url 'https://api.cursor.com/v1/origin/rate_limit' \ --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN'Estructura de la respuesta:
{ "resources": { "core": { "limit": 6000, "remaining": 5994, "reset": 1785682800, "used": 6 } }, "rate": { "limit": 6000, "remaining": 5994, "reset": 1785682800, "used": 6 }}Obtener la aplicación autenticada
/v1/origin/appDevuelve los metadatos de la aplicación autenticada.
Campos de respuesta
id cadena
displayName cadena
webhookUrl cadena
events array
installation.* siempre se entregan y nunca aparecen aquí.createdAt cadena
updatedAt cadena
installationRedirectUris array
namespaceSlug cadena
description cadena
websiteUrl cadena
defaultScopes array
curl --request GET \ --url 'https://api.cursor.com/v1/origin/app' \ --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN'Estructura de la respuesta:
{ "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" ]}Listar las instalaciones de la aplicación
/v1/origin/app/installationsEnumera las instalaciones de la aplicación autenticada.
Parámetros de consulta
pageSize entero
pageToken cadena
next_page_token de una respuesta anterior. Vacío para la primera página.Campos de respuesta
installations array
installations[].id cadena
installations[].appId cadena
installations[].target objeto
installations[].target.slug cadena
installations[].target.id cadena
installations[].target.type cadena
team, user. Se omite cuando se desconoce.installations[].createdAt cadena
installations[].updatedAt cadena
installations[].repoSelectionMode cadena
installations[].scopes array
installations[].installedBy objeto
installations[].installedBy.id cadena
user_.installations[].installedBy.email cadena
installations[].installedBy.displayName cadena
installations[].installedBy.handle cadena
@. Presente solo mientras ese perfil sea visible públicamente; omitido en caso contrario.installations[].suspendedAt cadena
installations[].deletedAt cadena
installation.deleted; una instalación eliminada ya no se resuelve a través de la API, por lo que este endpoint nunca la devuelve.nextPageToken cadena
curl --request GET \ --url 'https://api.cursor.com/v1/origin/app/installations' \ --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN'Estructura de la respuesta:
{ "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" ] } ]}Obtener la instalación de la aplicación
/v1/origin/app/installations/{installationId}Devuelve una instalación de la app autenticada.
repoSelectionMode es all o selected.
Parámetros de ruta
installationId cadena Obligatorio
Campos de respuesta
id cadena
appId cadena
target object
target.slug cadena
target.id cadena
target.type cadena
team, user. Se omite cuando se desconoce.createdAt cadena
updatedAt cadena
repoSelectionMode cadena
scopes array
installedBy object
installedBy.id cadena
user_.installedBy.email cadena
installedBy.displayName cadena
installedBy.handle cadena
@. Solo está presente mientras ese perfil sea visible públicamente; en caso contrario, se omite.suspendedAt cadena
deletedAt cadena
installation.deleted; una instalación eliminada ya no se resuelve a través de la API, por lo que este endpoint nunca la devuelve.curl --request GET \ --url 'https://api.cursor.com/v1/origin/app/installations/INSTALLATION_ID' \ --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN'Estructura de la respuesta:
{ "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" ]}Eliminar instalación de la app
/v1/origin/app/installations/{installationId}Elimina una instalación que pertenece a la app autenticada e impide que se emitan nuevos tokens de acceso de instalación. Los tokens de corta duración ya emitidos pueden seguir siendo válidos hasta que caduquen (como máximo 15 minutos). El cuerpo de la respuesta está vacío.
Parámetros de ruta
installationId cadena Obligatorio
Campos de respuesta
Las solicitudes correctas no devuelven cuerpo de respuesta.
curl --request DELETE \ --url 'https://api.cursor.com/v1/origin/app/installations/INSTALLATION_ID' \ --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN'Respuesta:
204 No ContentCrear token de acceso de instalación
/v1/origin/app/installations/{installationId}/access_tokensCrea un token de acceso de instalación para la app autenticada.
Requiere autenticación con un JWT de firma de la app, como GetAuthenticatedApp. El token queda limitado a la instalación indicada, que debe pertenecer a la app autenticada. Quienes realizan la llamada pueden restringir el token a un subconjunto de los ámbitos aceptados y los repositorios accesibles de la instalación.
repositoryIds puede indicar un repositorio replicado. El token resultante conserva los ámbitos de la instalación y Origin sigue aplicando el límite de replicación en cada solicitud: consulta Repositorios replicados.
Parámetros de ruta
installationId cadena Obligatorio
Cuerpo de la solicitud
scopes array
repositoryIds array
Campos de respuesta
token cadena
expiresAt cadena
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" ]}'Estructura de la respuesta:
{ "token": "oit_2v8xkq4m1c7p9t3w5y0z6r4b", "expiresAt": "2026-08-01T10:30:00Z"}Crear token de usuario de instalación
/v1/origin/app/installations/{installationId}/user_access_tokensCrea un token de usuario de instalación que actúa en nombre de un miembro del espacio de nombres de la instalación.
La instalación debe pertenecer a la aplicación autenticada y haber aceptado namespace:user_tokens:write. Identifica al usuario mediante uno solo de estos campos: userId o userEmail. Si el usuario no existe, la identificación es ambigua o el usuario no cumple los requisitos, se devuelve PermissionDenied (HTTP 403) sin revelar cuál fue el motivo.
El acceso del token se limita a los permisos que comparten la instalación y el usuario. Si se especifican tanto scopes como repositoryIds, cada scope debe estar permitido para la instalación y el usuario en todos los repositorios enumerados; de lo contrario, se devuelve PermissionDenied (HTTP 403). Consulta Actuar en nombre de usuarios para conocer el flujo completo.
Parámetros de ruta
installationId cadena Obligatorio
Cuerpo de solicitud
userId cadena
user_… del usuario, tal como aparece en los payloads de actor. Especifica uno solo de estos campos: userId o userEmail.userEmail cadena
scopes array
namespace:user_tokens:write devuelve InvalidArgument (HTTP 400); este scope autoriza la emisión de tokens y no puede delegarse al token. Si el campo está vacío o se omite, no se aplica ningún límite de scope.repositoryIds array
Campos de respuesta
token cadena
expiresAt cadena
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" ]}'Estructura de la respuesta:
{ "token": "YOUR_INSTALLATION_USER_TOKEN", "expiresAt": "2026-08-01T10:30:00Z"}Listar repositorios de la instalación de la aplicación
/v1/origin/installation/reposEnumera los repositorios a los que puede acceder la instalación autenticada de la aplicación.
Requiere un token de acceso de instalación (oit_) emitido por CreateInstallationAccessToken.
Los partners descubren sus repositorios mediante este endpoint. Las entradas de la lista son resúmenes básicos de repositorios; usa Obtener repositorio para ver las marcas de tiempo completas. Obtener repositorio incluye el campo cloneUrl, disponible solo en la salida.
Los resultados incluyen repositorios espejo. Una réplica es de solo lectura hasta que se convierte en una réplica saliente estable: consulta Repositorios espejo.
Parámetros de consulta
pageSize entero
pageToken string
next_page_token de una respuesta anterior. Vacío para la primera página. Debe usarse el mismo filtro al solicitar las páginas siguientes. El pageSize de una solicitud posterior se aplica a esa página; omítelo para conservar el tamaño de página anterior.filter string
owner/repo con una sola barra compara cada mitad con su campo correspondiente. Los espacios en blanco al inicio y al final se ignoran; un valor vacío no aplica ningún filtro.Campos de respuesta
repositories array
repositories[].id string
repositories[].name string
repositories[].fullName string
repositories[].owner object
repositories[].owner.slug string
repositories[].owner.id string
repositories[].owner.type string
team, user. Se omite cuando se desconoce.repositories[].defaultBranch string
repositories[].mirror object
repositories[].mirror.source string
github.repositories[].mirror.sourceId string
repositories[].mirror.status cadena
inbound, outbound.repositories[].visibility string
internal, private.repositories[].allowMergeCommit boolean
repositories[].allowSquashMerge boolean
repositories[].deleteBranchOnMerge boolean
nextPageToken string
repoSelectionMode string
curl --request GET \ --url 'https://api.cursor.com/v1/origin/installation/repos' \ --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN'Estructura de la respuesta:
{ "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"}Listar entregas de webhooks
/v1/origin/app/webhook/deliveriesLista las entregas de webhook de la aplicación autenticada, de la más reciente a la más antigua.
Una entrega es un evento adeudado a una aplicación; su id es el valor del encabezado webhook-id que ve el receptor. delivered=false es el predicado de recuperación: selecciona todas las entregas que nunca recibieron un 2xx, incluidas las cuyo escalonado de reintentos se agotó durante una interrupción.
Las entregas se pueden listar durante siete días desde su creación, y solo mientras tu app tenga una instalación activa en el espacio de nombres de la entrega. Los eventos del ciclo de vida dirigidos a la app, como installation.deleted, siguen siendo visibles después de la desinstalación que describen.
Parámetros de consulta
delivered boolean
delivered_at. delivered=false es el predicado de recuperación: se evalúa del lado del servidor, por lo que no puede pasar por alto una entrega cuya escalera de reintentos se agotó durante una interrupción, como puede ocurrir silenciosamente con una ventana de tiempo proporcionada por el llamador.eventType string
pull_request.created.installationId string
WebhookDelivery.installation.id).createdAfter string
createdBefore string
pageSize entero
pageToken string
next_page_token de una respuesta anterior. Vacío para la primera página.Campos de respuesta
deliveries array
deliveries[].id string
webhook-id que ve el receptor; úsalo como clave de idempotencia.deliveries[].event object
deliveries[].event.id string
deliveries[].event.type string
deliveries[].installation object
id es la instalación activa actual del propietario objetivo; no establecida cuando no existe ninguna (posible solo para eventos del ciclo de vida dirigidos a la aplicación después de una desinstalación).deliveries[].installation.id string
deliveries[].installation.target object
deliveries[].installation.target.slug string
deliveries[].installation.target.id string
deliveries[].installation.target.type string
team, user. Se omite cuando se desconoce.deliveries[].createdAt string
deliveries[].deliveredAt string
deliveries[].lastAttempt object
deliveries[].lastAttempt.id string
deliveries[].lastAttempt.deliveryId string
deliveries[].lastAttempt.trigger string
automatic, manual.deliveries[].lastAttempt.responseStatusCode entero
deliveries[].lastAttempt.latencyMs entero
deliveries[].lastAttempt.errorMessage string
deliveries[].lastAttempt.attemptedAt string
nextPageToken string
curl --request GET \ --url 'https://api.cursor.com/v1/origin/app/webhook/deliveries' \ --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN'Estructura de la respuesta:
{ "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" } } ]}Reenviar en lote entregas de webhooks
/v1/origin/app/webhook/deliveries:batchRedeliverSolicita a Origin que vuelva a enviar las entregas.
La solicitud significa «garantizar que haya un envío en curso para cada una de estas», no «añadir otro envío». Devuelve un resultado por cada entrada única en lugar de hacer que el lote falle por una entrada no válida, de modo que un único ID vencido no pueda bloquear el resto de una página de recuperación. Un 202 significa que los envíos están en cola; la entrega en sí es asíncrona, por lo que consulta List Webhook Deliveries para conocer los resultados.
Cuerpo de la solicitud
deliveryIds array Obligatorio
pageSize de List Webhook Deliveries. Se eliminan los duplicados y se conserva el orden de la primera aparición. Una lista vacía o más de 100 entradas únicas devuelve InvalidArgument (HTTP 400).Campos de respuesta
results array
queued, already_in_flight o not_found.results[].deliveryId cadena
results[].outcome cadena
queued cuando se creó un envío, already_in_flight cuando ya había un envío en curso y not_found en los demás casos. already_in_flight es un éxito, no un error. not_found abarca los ID desconocidos, los ID anteriores al período de retención de siete días y los espacios de nombres donde tu app ya no está instalada.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" ]}'Estructura de la respuesta:
{ "results": [ { "deliveryId": "whd_01k2ja2000e0080000000000j9", "outcome": "queued" } ]}Ping del webhook
/v1/origin/app/webhook/pingsEnvía una entrega de prueba a la URL del webhook de la app autenticada e informa de la respuesta del receptor.
Úsalo para verificar un receptor mientras configuras una app, en lugar de esperar a un evento real. Requiere autenticación mediante JWT de firma de la app, como Obtener la aplicación autenticada.
El receptor recibe la estructura de producción: los mismos encabezado y la firma v1ed, que puede verificarse con las claves de firma, con webhook-event-type establecido en ping y un payload que identifica la app. Un ping no pertenece a ninguna instalación, por lo que no se incluyen ni el encabezado webhook-installation-id ni el installationId del sobre.
Origin envía el ping una sola vez, de forma síncrona, e informa del resultado en la respuesta. No hay reintentos y un ping no es un evento de dominio: nunca aparece en List Webhook Deliveries y no se puede reenviar. Si un receptor falla, se informa en la respuesta en lugar de devolver un error. Una app sin una URL de webhook configurada devuelve FailedPrecondition (HTTP 400).
Cuerpo de la solicitud
La solicitud no acepta campos. Envía un objeto JSON vacío.
Campos de respuesta
deliveryId cadena
webhook-id de la entrega de prueba, que coincide con el encabezado que recibió el receptor.eventId cadena
event.id.delivered boolean
true si el receptor respondió con un estado 2xx antes de que venciera el tiempo de espera de entrega. Siempre está presente.responseStatusCode entero
0 si no se recibió ninguna respuesta porque falló la conexión o se agotó el tiempo de espera. Siempre está presente.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 '{}'Estructura de la respuesta:
{ "deliveryId": "whd_01k2ja2000e0080000000000j9", "eventId": "evt_01k2ja2000e0080000000000r5", "delivered": true, "responseStatusCode": 200}Get App
/v1/origin/apps/{appId}Devuelve una sola app a partir de su identifier. Esta es la lectura de gestión para los publishers de apps; Get Authenticated App es el equivalent de autolectura para la credential JWT propia de la app.
Path Parameters
appId string Required
app_.Campos de respuesta
id string
app_.displayName string
webhookUrl string
events array
installation.* se entregan siempre y nunca aparecen aquí.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'Estructura de la respuesta:
{ "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" ]}Actualizar app
/v1/origin/apps/{appId}Actualiza los ajustes de una app. Los campos omitidos no se modifican y se debe proporcionar al menos un campo configurable. Borrar webhookUrl enviando una cadena vacía desactiva la entrega de webhooks salientes y cancela las entregas pendientes de la app; volver a establecer una URL no restaura las entregas canceladas.
Parámetros de ruta
appId cadena Obligatorio
app_.Cuerpo de la solicitud
displayName cadena
webhookUrl cadena
events objeto
events.events array
installation.* siempre se entregan y no se pueden enumerar aquí.description cadena
websiteUrl cadena
installationRedirectUris objeto
installationRedirectUris.installationRedirectUris array
defaultScopes objeto
defaultScopes.scopes array
Campos de respuesta
id cadena
app_.displayName cadena
webhookUrl cadena
events array
installation.* siempre se entregan y nunca aparecen aquí.createdAt cadena
updatedAt cadena
installationRedirectUris array
namespaceSlug cadena
description cadena
websiteUrl cadena
defaultScopes array
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" ] }}'Estructura de la respuesta:
{ "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" ]}Añadir clave de firma a una aplicación
/v1/origin/apps/{appId}/signing_keysAñade una clave de firma a una aplicación. Las aplicaciones admiten un número limitado de claves de firma activas; si añades una clave por encima del límite, se devuelve FailedPrecondition (HTTP 400) hasta que se revoque otra clave. Si la clave ya está registrada, se devuelve AlreadyExists (HTTP 409 Conflict).
Parámetros de ruta
appId cadena Obligatorio
app_.Cuerpo de la solicitud
publicKey cadena Obligatorio
Campos de respuesta
kid cadena
kid del JWT y para revocar la clave.createdAt cadena
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-----"}'Estructura de la respuesta:
{ "kid": "3q2xW9dK5fJm8vB1nY6cT0aZrQpLh4eGkVsN7uMxOdI", "createdAt": "2026-08-02T14:45:00Z"}Revocar la clave de firma de una aplicación
/v1/origin/apps/{appId}/signing_keys/{kid}Revoca una clave de firma de una aplicación a partir de su key ID. Los JWT de aplicación firmados con una clave revocada dejan de autenticar. La última clave de firma activa no se puede revocar; esa solicitud devuelve FailedPrecondition (HTTP 400). El response body queda vacío.
Parámetros de ruta
appId cadena Obligatorio
app_.kid cadena Obligatorio
Campos de respuesta
Las solicitudes correctas no devuelven ningún response body.
curl --request DELETE \ --url 'https://api.cursor.com/v1/origin/apps/{appId}/signing_keys/{kid}' \ --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN'Respuesta:
204 No ContentListar aplicaciones del espacio de nombres
/v1/origin/namespaces/{namespaceSlug}/appsLista las aplicaciones que pertenecen a un espacio de nombres, de la más reciente a la más antigua. Las respuestas solo incluyen metadata de visualización; para consultar la configuración de webhook de una aplicación, usa Get App.
Parámetros de ruta
namespaceSlug cadena Required
Parámetros de consulta
pageSize integer
pageToken cadena
next_page_token de una respuesta anterior. Vacío para la primera página.Campos de respuesta
apps array
apps[].id cadena
app_.apps[].displayName cadena
apps[].description cadena
nextPageToken cadena
curl --request GET \ --url 'https://api.cursor.com/v1/origin/namespaces/{namespaceSlug}/apps' \ --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN'Estructura de la respuesta:
{ "apps": [ { "id": "app_01k2ja2000e0080000000000a1", "displayName": "CI Status Bot", "description": "Posts CI status on pull requests." }, { "id": "app_01k2ja2000e0080000000000a2", "displayName": "Deploy Bot", "description": "" } ], "nextPageToken": ""}Crear app
/v1/origin/namespaces/{namespaceSlug}/appsCrea una aplicación que pertenece a un espacio de nombres. Las aplicaciones se crean como privadas. Genera el par de claves Ed25519 de forma local y envía únicamente la clave pública; Origin la almacena para verificar los JWT de la aplicación. Si las URL de webhook, los tipos de evento, los URI de redirección o los scopes no son válidos, se devuelve InvalidArgument (HTTP 400).
El propietario del espacio de nombres debe cumplir los requisitos para escribir en Origin en el momento de realizar la solicitud, el mismo requisito que exige Crear repositorio. Un propietario que sea usuario debe tener un plan Pro, Pro Student, Pro+, Ultra o Start. Un propietario que sea equipo debe tener un plan de equipo de pago activo, no estar en modo de privacidad (heredado) y no tener Origin desactivado por un administrador de equipo. Si el propietario no cumple los requisitos, se devuelve FailedPrecondition (HTTP 400). Origin comprueba los requisitos del propietario del espacio de nombres, no los del usuario que realiza la llamada.
Parámetros de ruta
namespaceSlug cadena Obligatorio
Cuerpo de la solicitud
displayName cadena Obligatorio
publicKey cadena Obligatorio
webhookUrl cadena
events array
installation.*, que siempre se entregan y no pueden incluirse en esta lista.description cadena
websiteUrl cadena
installationRedirectUris array
defaultScopes array
repository:contents:read. Las instalaciones siguen aceptando scopes de forma explícita.Campos de respuesta
id string
app_.displayName cadena
webhookUrl cadena
events array
installation.* se entregan siempre y nunca aparecen aquí.createdAt cadena
updatedAt cadena
installationRedirectUris array
namespaceSlug cadena
description cadena
websiteUrl cadena
defaultScopes array
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" ]}'Estructura de la respuesta:
{ "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": "Publica el estado de CI en los pull request.", "websiteUrl": "https://ci.acme.dev", "defaultScopes": [ "repository:contents:read", "repository:pull_requests:read" ]}Añadir repositorios de instalación de la aplicación
/v1/origin/namespaces/{namespaceSlug}/installations/{installationId}/reposAñade repositorios a la selección de repositorios de una instalación y devuelve la instalación actualizada. La escritura es acumulativa: los repositorios listados se unen a la selección actual, una solicitud cuyos repositorios ya tienen acceso concedido se completa sin cambiar nada y los ámbitos de la instalación nunca cambian.
Todos los repositorios listados deben pertenecer al espacio de nombres de destino; de lo contrario, la solicitud devuelve FailedPrecondition (HTTP 400) y no concede nada. El mismo error se aplica a una instalación que ya incluye todos los repositorios del espacio de nombres (repoSelectionMode es all), a una que está suspendida y a una anterior a los ámbitos por instalación. Una instalación que no existe, o que pertenece a otro espacio de nombres, devuelve 404; el mensaje indica la página de consentimiento que hay que abrir cuando la app nunca se ha instalado en el espacio de nombres, ya que este endpoint no puede realizar una primera instalación.
El llamador debe ser una credencial de usuario de Cherri Code con acceso de gestión de instalaciones al espacio de nombres. Los tokens de app, los tokens de acceso de instalación y las cuentas de servicio no pueden cambiar los repositorios de una instalación.
Parámetros de ruta
namespaceSlug string Obligatorio
installationId cadena Obligatorio
Cuerpo de la solicitud
repoIds array Obligatorio
Campos de respuesta
id cadena
appId cadena
target objeto
target.slug cadena
target.id cadena
target.type cadena
team, user. Se omite si se desconoce.createdAt cadena
updatedAt cadena
repoSelectionMode cadena
scopes array
installedBy objeto
installedBy.id cadena
user_.installedBy.email cadena
installedBy.displayName cadena
installedBy.handle cadena
@. Solo aparece mientras ese perfil sea visible públicamente; en caso contrario, se omite.suspendedAt cadena
deletedAt cadena
installation.deleted; una instalación eliminada ya no se resuelve a través de la API, por lo que este endpoint nunca la devuelve.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" ]}'Estructura de la respuesta:
{ "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" ]}Repositorios
cloneUrl es una URL HTTPS de clonación disponible solo en la salida. Obtener repositorio incluye cloneUrl.
Los partners descubren sus repositorios mediante Listar repositorios de la instalación de la aplicación. El listado de repositorios y su creación en todo el espacio de nombres no forman parte de la API para partners.
Listar espacios de nombres
/v1/origin/namespacesLista los espacios de nombres en los que puedes listar repositorios, ordenados por slug.
Los candidatos son los espacios de nombres de tus equipos, tu espacio de nombres personal y los espacios de nombres que contienen repositorios a los que se te ha concedido acceso. Solo se devuelven aquellos en los que tienes namespace:repositories:read, por lo que cada resultado es un ownerSlug válido para List Repos.
El llamador debe usar una credencial de usuario de Cursor; la llamada no requiere ningún scope propio. Los tokens de app, los tokens de acceso de instalación y las cuentas de servicio reciben PermissionDenied (HTTP 403).
Parámetros de consulta
pageSize entero
pageToken cadena
next_page_token de una respuesta anterior. Vacío para la primera página. En una solicitud posterior, pageSize se aplica a esa página; omítelo para conservar el tamaño de página anterior.Campos de respuesta
namespaces array
namespaces[].namespace objeto
namespaces[].namespace.slug cadena
ownerSlug con List Repos.namespaces[].namespace.id cadena
namespaces[].namespace.type cadena
team, user. Se omite si se desconoce.namespaces[].viewerCanCreateRepositories booleano
nextPageToken cadena
curl --request GET \ --url 'https://api.cursor.com/v1/origin/namespaces' \ --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN'Estructura de la respuesta:
{ "namespaces": [ { "namespace": { "slug": "acme", "id": "ns_01k2ja2000e0080000000000p3", "type": "team" }, "viewerCanCreateRepositories": true }, { "namespace": { "slug": "jane", "id": "ns_01k2ja2000e0080000000000p4", "type": "user" }, "viewerCanCreateRepositories": false } ]}Listar repositorios
/v1/origin/repos/{ownerSlug}Enumera los repositorios de una entidad propietaria.
Parámetros de ruta
ownerSlug string Obligatorio
Parámetros de consulta
pageSize entero
pageToken string
next_page_token de una respuesta anterior. Vacío para la primera página. El pageSize de una solicitud posterior se aplica a esa página; omítalo para mantener el tamaño de página anterior.filter string
Campos de respuesta
repositories arreglo
repositories[].id string
repositories[].name string
repositories[].fullName string
repositories[].owner objeto
repositories[].owner.slug string
repositories[].owner.id string
repositories[].owner.type string
team, user. Se omite si se desconoce.repositories[].defaultBranch string
repositories[].createdAt string
repositories[].updatedAt string
repositories[].pushedAt string
repositories[].cloneUrl string
repositories[].mirror objeto
repositories[].mirror.source string
github.repositories[].mirror.sourceId string
repositories[].mirror.status string
inbound, outbound.repositories[].visibility string
internal, private.repositories[].allowMergeCommit boolean
repositories[].allowSquashMerge boolean
repositories[].deleteBranchOnMerge booleano
nextPageToken string
curl --request GET \ --url 'https://api.cursor.com/v1/origin/repos/OWNER_SLUG' \ --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN'Estructura de la respuesta:
{ "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" } ]}Obtener repositorio
/v1/origin/repos/{ownerSlug}/{repoName}Devuelve un repositorio por su identificador (owner_id, name).
cloneUrl es una URL HTTPS de clonación solo de salida. La operación Get repository incluye cloneUrl.
Parámetros de ruta
ownerSlug string Obligatorio
repoName string Obligatorio
Campos de respuesta
id string
name string
fullName string
owner object
owner.slug string
owner.id string
owner.type string
team, user. Se omite si se desconoce.defaultBranch string
createdAt string
updatedAt string
pushedAt string
cloneUrl string
mirror object
mirror.source string
github.mirror.sourceId string
mirror.status string
inbound, outbound.visibility string
internal, private.allowMergeCommit boolean
allowSquashMerge boolean
deleteBranchOnMerge boolean
curl --request GET \ --url 'https://api.cursor.com/v1/origin/repos/OWNER_SLUG/REPO_NAME' \ --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN'Estructura de la respuesta:
{ "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"}Actualizar repositorio
/v1/origin/repos/{ownerSlug}/{repoName}Actualiza la configuración del repositorio. Los campos omitidos no se modifican y se debe proporcionar al menos un campo que se pueda configurar.
Los ajustes se aplican como grupos independientes en un orden fijo: rama por defecto, eliminación automática de la rama cabecera, visibilidad y, por último, métodos de fusión. La actualización no es atómica entre grupos. Cuando se rechaza un grupo, los grupos anteriores en ese orden ya se han aplicado y siguen aplicados, así que vuelve a intentarlo con el grupo rechazado corregido para converger en el estado que solicitaste. La respuesta devuelve el repositorio tal como quedó tras el último grupo aplicado.
Una solicitud que no establece ningún campo devuelve InvalidArgument (HTTP 400). Un cambio concurrente en la rama predeterminada devuelve 409 Conflict.
Parámetros de ruta
ownerSlug cadena Obligatorio
repoName string Obligatorio
Cuerpo de la solicitud
defaultBranch string
FailedPrecondition (HTTP 400).allowMergeCommit boolean
allowSquashMerge, y al menos uno de los dos debe ser true. Enviar uno sin el otro devuelve InvalidArgument (HTTP 400).allowSquashMerge boolean
allowMergeCommit, y al menos uno de los dos debe ser true. Enviar uno sin el otro devuelve InvalidArgument (HTTP 400).deleteBranchOnMerge boolean
FailedPrecondition (HTTP 400).visibility string
internal, private. Omítelo para mantener la visibilidad sin cambios.Campos de la respuesta
id string
name string
fullName cadena
owner objeto
owner.slug string
owner.id string
owner.type string
team, user. Se omite si se desconoce.defaultBranch string
createdAt string
updatedAt string
pushedAt string
cloneUrl string
mirror objeto
mirror.source string
github.mirror.sourceId string
mirror.status cadena
inbound, outbound.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"}'Estructura de la respuesta:
{ "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}Crear repositorio
/v1/origin/repos/{ownerSlug}Crea un repo perteneciente a un owner.
El propietario debe poder escribir en Origin cuando se realice la solicitud. Un propietario usuario debe tener un plan Pro, Pro Student, Pro+, Ultra o Start. Un propietario de equipo debe tener un plan de equipo de pago activo, no debe estar en Modo de privacidad (heredado) y no debe tener Origin desactivado por un administrador del equipo. Un propietario no elegible devuelve FailedPrecondition (HTTP 400). La lectura de repositorios existentes no tiene este requisito.
Los nombres de repositorio se reservan sin distinguir entre mayúsculas y minúsculas. Se rechaza cualquier nombre que solo difiera en el uso de mayúsculas y minúsculas de otro repositorio que ya pertenezca al propietario, por lo que widgets y Widgets no pueden coexistir en un mismo espacio de nombres. El nombre enviado se almacena tal como se envía.
El primer push a un repositorio nuevo puede cambiar su rama predeterminada. Cuando ese push solo crea ramas y ninguna de ellas es la rama predeterminada almacenada del repositorio, Origin establece como rama predeterminada la rama creada, o main o master si el push crea varias y uno de esos nombres está entre ellas. En cualquier otro caso, la rama predeterminada no cambia. Consulta el valor actual en Get Repo.
Parámetros de ruta
ownerSlug string Obligatorio
Cuerpo de la solicitud
name string Obligatorio
defaultBranch string
Campos de respuesta
id string
name string
fullName string
owner object
owner.slug string
owner.id string
owner.type cadena
team, user. Se omite si se desconoce.defaultBranch string
createdAt string
updatedAt string
pushedAt string
cloneUrl string
mirror object
mirror.source string
github.mirror.sourceId string
mirror.status string
inbound, outbound.visibility string
internal, private.allowMergeCommit boolean
allowSquashMerge boolean
deleteBranchOnMerge boolean
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"}'Estructura de la respuesta:
{ "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"}Listar ramas
/v1/origin/repos/{ownerSlug}/{repoName}/branchesLista las ramas del repositorio y sus commits de punta en orden alfabético ascendente, paginadas mediante page_size y page_token.
Parámetros de ruta
ownerSlug cadena Obligatorio
repoName cadena Obligatorio
Parámetros de consulta
pageSize entero
pageToken cadena
next_page_token de una respuesta anterior. Déjelo vacío para la primera página. Codifica la posición desde la que se reanuda la paginación. El valor de pageSize en una solicitud posterior se aplica a esa página; omítalo para mantener el tamaño de página anterior.Campos de respuesta
branches array
branches[].name cadena
branches[].commit objeto
branches[].commit.sha cadena
nextPageToken cadena
curl --request GET \ --url 'https://api.cursor.com/v1/origin/repos/OWNER_SLUG/REPO_NAME/branches' \ --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN'Estructura de la respuesta:
{ "branches": [ { "name": "main", "commit": { "sha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4" } } ]}Obtener el tarball del repositorio
/v1/origin/repos/{ownerSlug}/{repoName}/tarball/{ref}Descarga un archivo tar comprimido con gzip del árbol del repositorio en ref.
Origin indexa el archivo según el repositorio y el commit al que se resuelve ref. La primera solicitud para un commit determinado responde con 200 y Content-Type: application/gzip, y transmite el archivo como cuerpo de la respuesta. Las solicitudes posteriores para el mismo commit responden con 302, un cuerpo vacío y una URL de descarga firmada en Location, válida durante 15 minutos; sigue la redirección para descargar los bytes. El archivo contiene un único directorio de nivel superior llamado {ownerSlug}-{repoName}-{shortSha}/, donde shortSha corresponde a los primeros 7 caracteres hexadecimales del commit resuelto, lo que coincide con la estructura del endpoint de tarball de GitHub. Un repositorio vacío devuelve ABORTED (HTTP 409 Conflict) y una referencia que no se resuelve devuelve 404.
Envía la referencia como parámetro de consulta en lugar de como segmento de ruta para indicar una referencia que contiene "/": GET /v1/origin/repos/{ownerSlug}/{repoName}/tarball?ref=refs/heads/main. Omítela para archivar la rama predeterminada del repositorio.
Parámetros de ruta
ownerSlug cadena Obligatorio
repoName cadena Obligatorio
ref cadena Obligatorio
refs/heads/... o refs/tags/... con nombre completo, o HEAD simbólico. No es un glob ni una revspec, por lo que se rechaza <rev>~3. Si está vacío, se usa la rama predeterminada del repositorio.Campos de respuesta
sha cadena
downloadUrl cadena
Location en la respuesta 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'Estructura de la respuesta:
{ "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"}Sincronizar réplica
/v1/origin/repos/{ownerSlug}/{repoName}:syncMirrorSincroniza una referencia de un repositorio replicado desde su origen. Devuelve HTTP 200 cuando se alcanza el objetivo de sincronización o HTTP 202 cuando la sincronización sigue pendiente. wait=false (el valor predeterminado) programa la sincronización y normalmente devuelve 202; devuelve 200 de inmediato cuando ya se puede acceder a sha desde ref. wait=true bloquea hasta que se alcance el objetivo o venza el tiempo máximo de espera (~2 minutos); al vencer, sigue devolviendo 202 y la sincronización continúa en segundo plano. Se rechazan los repositorios que no obtienen cambios de un origen.
Parámetros de ruta
ownerSlug cadena Obligatorio
repoName cadena Obligatorio
Cuerpo de la solicitud
ref cadena Obligatorio
refs/ e indicar una referencia después de ese prefijo; por ejemplo, refs/heads/main o refs/tags/v1. Los nombres cortos, como main, se rechazan con INVALID_ARGUMENT.wait boolean
sha cadena
ref. Si se especifica y se puede acceder a él desde ref, la llamada devuelve antes sin esperar a que finalice otro trabajo de replicación. Otros valores se rechazan con INVALID_ARGUMENT.Campos de respuesta
synced boolean
200 cuando es true, 202 cuando es 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}'Estructura de la respuesta:
{ "synced": true}Los endpoints de transición de réplicas están documentados en la Origin Migration API. Sincronizar réplica permanece en esta página.
Desvincular la réplica del repositorio
Consulta Desvincular la réplica del repositorio.
Obtener trabajo de transición de réplica
Consulta Obtener trabajo de transición de réplica.
Obtener trabajo activo de transición de réplica
Consulta Obtener trabajo activo de transición de réplica.
Forzar el cambio de la réplica del repositorio
Consulta Forzar el cambio de la réplica del repositorio.
Transición de la réplica del repositorio
Consulta Transición de la réplica del repositorio.
Comprobaciones
- La primera operación de crear o actualizar una ejecución crea automáticamente su suite.
- Las comprobaciones obligatorias se corresponden con la app que realiza la instalación, la
keyde la suite y, opcionalmente, lakeyde una ejecución.namesolo se muestra y no se usa para establecer la correspondencia. - Mantén los valores de
keyestables entre intentos y legibles para los usuarios, ya que la configuración de comprobaciones obligatorias se basa en ellos. - Reutiliza
externalIdpara actualizar un intento, lo que descarta el resultado anterior de ese intento; usa unexternalIdnuevo para reintentar, de modo que el intento anterior se conserve como historial. - Usa
checkRun.outputpara mostrar resultados legibles:title: título breve del resultado, de hasta 255 caracteres.summary: resumen principal en Markdown, de hasta 65 535 bytes UTF-8.text: detalles ampliados en Markdown, de hasta 65 535 bytes UTF-8.
- Usa
detailsUrlpara enlazar a la página de resultados externa del proveedor.
Ejecuciones de comprobación define qué intento es el actual, cómo externalUpdatedAt ordena las escrituras y qué informa outcome, además de las reglas de marcas de tiempo y plazos que comparten estos endpoints.
Publicar ejecución de verificación
/v1/origin/repos/{ownerSlug}/{repoName}/check-runsCrea o actualiza una suite de comprobaciones y una ejecución de comprobación usando un token de acceso de instalación con repository:checks:write. La escritura se atribuye a la aplicación propietaria de la instalación autenticada. Una llamada repetida con los mismos (repo, head_sha, suite.key, check.key) actualiza la ejecución de comprobación existente en lugar de crear un duplicado.
El endpoint resuelve o crea de forma atómica el intento de suite y hace upsert de un intento de ejecución. externalUpdatedAt ordena las actualizaciones para la misma identidad de ejecución; los reintentos obsoletos no pueden sobrescribir un estado más reciente, y una finalización cancelled no puede reemplazar un resultado satisfactorio almacenado; consulta Orden de las escrituras. Tanto una publicación que se ignora por obsoleta como una publicación que repite los valores almacenados devuelven igualmente 200 con la suite y la ejecución almacenadas, así que consulta outcome para distinguir ignored_stale y unchanged de created y updated. updatedAt no cambia en ninguno de los dos casos, por lo que no sirve para diferenciarlos.
Dentro de una suite, el intento actual para una key de ejecución es la ejecución con el externalUpdatedAt más reciente; los empates se resuelven por createdAt y después por id, de más reciente a más antiguo. Cada (actor, key, externalId) informado para un commit constituye un intento de suite, y el intento actual para cada (actor, key) es aquel cuyas ejecuciones tienen el externalUpdatedAt más reciente; una suite sin ejecuciones se ordena según su propio createdAt. Una ejecución es la actual para su commit solo mientras su suite sea el intento actual del commit, por lo que una ejecución publicada bajo un externalId de suite más antiguo permanece oculta en los listados del commit mientras otro intento de esa suite tenga actividad más reciente. En ambos niveles, un intento cancelado no desplaza a uno aprobado; Intentos y el intento actual explica la regla. Los intentos reemplazados siguen siendo consultables por id.
deadlineAt registra una fecha límite opcional en la ejecución. Origin la almacena, la devuelve en las lecturas y la borra una vez que la ejecución alcanza completed. Una fecha límite a más de 24 horas en el futuro se rechaza con InvalidArgument (HTTP 400) en lugar de ajustarse.
Cuando vence el plazo de una ejecución que aún está in_progress, Origin completa la ejecución por sí mismo con la conclusión timed_out, estableciendo completedAt si la ejecución no lo tenía, y emite repository.check_run.completed. La expiración se realiza como una limpieza periódica en lugar de mediante un temporizador por ejecución, por lo que se produce algunos minutos después de la fecha límite y no justo en ella. La limpieza se ejecuta aproximadamente cada 30 minutos de forma predeterminada, un ajuste operativo que puede cambiar. Una ejecución queued nunca expira, ni tampoco una ejecución que no tenga deadlineAt. Completar la ejecución usted mismo antes de la fecha límite la anula. Origin deja intacto el externalUpdatedAt de la ejecución cuando la agota por tiempo, por lo que una finalización posterior de su proveedor aún puede sobrescribir la conclusión timed_out.
Parámetros de ruta
ownerSlug string Obligatorio
repoName string Obligatorio
Cuerpo de la solicitud
headSha string Obligatorio
checkSuite objeto Obligatorio
checkSuite.key string Obligatorio
checkSuite.name string Obligatorio
checkSuite.detailsUrl cadena
checkSuite.externalId string Obligatorio
checkRun objeto Obligatorio
checkRun.key string Obligatorio
checkRun.name cadena Obligatorio
checkRun.status string Obligatorio
CHECK_RUN_LIFECYCLE_STATUS_UNSPECIFIED, queued, in_progress, completed. El esquema también incluye rerequested, que solo Origin establece al volver a solicitarse; una solicitud que lo incluya devuelve InvalidArgument (HTTP 400).checkRun.conclusion string
status == completed. Valores permitidos: CHECK_RUN_CONCLUSION_UNSPECIFIED, success, failure, neutral, cancelled, skipped, timed_out, action_required, stale.checkRun.externalUpdatedAt string Obligatorio
checkRun.startedAt string
InvalidArgument (HTTP 400).checkRun.completedAt cadena
InvalidArgument (HTTP 400), al igual que un valor anterior a startedAt cuando ambos se publican juntos.checkRun.detailsUrl string
checkRun.externalId string Obligatorio
checkRun.output objeto
checkRun.output.title string
checkRun.output.summary string
checkRun.output.text string
checkRun.deadlineAt cadena
InvalidArgument (HTTP 400) en lugar de ajustarse. Omítala al crear para no registrar ninguna fecha límite; omítala al actualizar para dejar la fecha límite almacenada sin cambios.checkRun.isRerequestable boolean
true, tu aplicación se compromete a suscribirse a repository.check_run.rerequested y a responder a cada notificación publicando una nueva ejecución para el mismo SHA de head y key: ya sea una nueva ejecución con un externalId nuevo, que conserva el intento anterior como historial, o una actualización de la ejecución solicitada de nuevo con el mismo externalId, que la actualiza en el mismo lugar. Hasta que se publique esa nueva ejecución, la ejecución solicitada de nuevo aparece como pendiente en el último estado de comprobación del commit, por lo que una comprobación obligatoria bloquea la fusión y la solicitud de incorporación de cambios muestra la ejecución a la espera de volver a ejecutarse; declarar que se puede volver a solicitar la ejecución sin responder deja la comprobación pendiente. Origin no verifica que exista la suscripción al publicar. Omite este valor para conservar el valor almacenado, que es false en una ejecución nueva; envía false para retirar la declaración.Campos de respuesta
checkSuite objeto
checkSuite.id string
checkSuite.repository objeto
checkSuite.repository.id string
checkSuite.repository.name string
checkSuite.repository.owner objeto
checkSuite.repository.owner.slug string
checkSuite.repository.owner.id string
checkSuite.repository.owner.type cadena
team, user. Se omite si se desconoce.checkSuite.sha cadena
checkSuite.key string
checkSuite.name string
checkSuite.detailsUrl cadena
checkSuite.createdAt string
checkSuite.updatedAt string
checkSuite.externalId string
checkSuite.actor objeto
checkSuite.actor.user objeto
checkSuite.actor.user.id string
checkSuite.actor.user.email cadena
checkSuite.actor.user.displayName string
checkSuite.actor.user.handle string
@. Presente solo mientras ese perfil sea visible públicamente; en caso contrario, se omite.checkSuite.actor.app objeto
checkSuite.actor.app.id cadena
checkSuite.actor.app.displayName string
checkSuite.actor.serviceAccount objeto
checkSuite.actor.serviceAccount.id string
checkRun objeto
checkRun.id cadena
checkRun.repository objeto
checkRun.repository.id string
checkRun.repository.name string
checkRun.repository.owner objeto
checkRun.repository.owner.slug string
checkRun.repository.owner.id string
checkRun.repository.owner.type string
team, user. Se omite si se desconoce.checkRun.checkSuite objeto
checkRun.checkSuite.id string
checkRun.sha cadena
checkRun.key string
checkRun.name cadena
checkRun.status string
checkRun.conclusion string
status sea completed.checkRun.detailsUrl string
checkRun.externalUpdatedAt cadena
checkRun.startedAt string
checkRun.completedAt cadena
checkRun.createdAt string
checkRun.updatedAt string
checkRun.externalId cadena
checkRun.actor objeto
actor de la suite de comprobación propietaria.checkRun.actor.user objeto
checkRun.actor.user.id string
checkRun.actor.user.email cadena
checkRun.actor.user.displayName string
checkRun.actor.user.handle string
@. Presente solo mientras ese perfil sea visible públicamente; en caso contrario, se omite.checkRun.actor.app objeto
checkRun.actor.app.id cadena
checkRun.actor.app.displayName string
checkRun.actor.serviceAccount objeto
checkRun.actor.serviceAccount.id string
checkRun.output objeto
checkRun.output.title string
checkRun.output.summary string
checkRun.output.text string
checkRun.deadlineAt cadena
checkRun.isRerequestable boolean
checkRun.rerequestedAt string
status es rerequested y la ejecución permanece en el estado de comprobación más reciente del commit y aparece como pendiente, con conclusion y los tiempos aún conservando el resultado sustituido, por lo que una comprobación obligatoria bloquea la fusión hasta que la aplicación responda.checkRun.rerequestedBy objeto
actor. Presente siempre que rerequestedAt esté establecido y se borra junto con él.outcome cadena
checkRun. Valores permitidos: created, updated, unchanged, ignored_stale. Una ejecución que fue ignorada por estar obsoleta y una ejecución que repitió los valores almacenados devuelven la ejecución guardada, por lo que este campo es la única forma de distinguirlas.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." } }}'Estructura de la respuesta:
{ "checkSuite": { "id": "crg_01k2ja2000e0080000000000h8", "repository": { "id": "repo_01k2ja2000e0080000000000q4", "name": "rocket", "owner": { "slug": "acme", "id": "ns_01k2ja2000e0080000000000p3", "type": "team" } }, "sha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4", "key": "ci-8842", "name": "CI", "detailsUrl": "https://ci.acme.dev/runs/8842", "createdAt": "2026-08-01T09:30:00Z", "updatedAt": "2026-08-02T14:45:00Z", "externalId": "build-8842", "actor": { "user": { "id": "user_01k2ja2000e0080000000000c3", "email": "[email protected]" } } }, "checkRun": { "id": "cr_01k2ja2000e0080000000000g7", "repository": { "id": "repo_01k2ja2000e0080000000000q4", "name": "rocket", "owner": { "slug": "acme", "id": "ns_01k2ja2000e0080000000000p3", "type": "team" } }, "checkSuite": { "id": "crg_01k2ja2000e0080000000000h8" }, "sha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4", "key": "ci-8842-unit-tests", "name": "unit-tests", "status": "completed", "conclusion": "success", "detailsUrl": "https://ci.acme.dev/runs/8842", "externalUpdatedAt": "2026-08-02T14:44:30Z", "startedAt": "2026-08-02T14:40:00Z", "completedAt": "2026-08-02T14:44:30Z", "createdAt": "2026-08-01T09:30:00Z", "updatedAt": "2026-08-02T14:45:00Z", "externalId": "run-8842", "actor": { "user": { "id": "user_01k2ja2000e0080000000000c3", "email": "[email protected]" } }, "output": { "title": "Unit tests", "summary": "128 tests passed.", "text": "All suites green." } }, "outcome": "created"}Crear o actualizar lotes de ejecuciones de verificación
/v1/origin/repos/{ownerSlug}/{repoName}/check-runs:batchUpsertRealiza upserts atómicos de varias ejecuciones de comprobación (check runs) que pertenecen a una misma suite. La solicitud acepta como máximo 10 ejecuciones y rechaza identidades duplicadas (external_id, key). Todas las ejecuciones se confirman o se revierte toda la solicitud.
Cada ejecución acepta el mismo deadlineAt opcional que Post Check Run.
Origin aplica la regla de ordenación de externalUpdatedAt a cada ejecución por separado. Una ejecución ignorada por obsoleta no hace fallar el lote: la respuesta incluye en su lugar la ejecución almacenada, y results[].outcome informa del veredicto de cada ejecución en el orden de la solicitud.
Parámetros de ruta
ownerSlug string Obligatorio
repoName string Obligatorio
Cuerpo de la solicitud
headSha string Obligatorio
checkSuite objeto Obligatorio
checkSuite.key string Obligatorio
checkSuite.name string Obligatorio
checkSuite.detailsUrl string
checkSuite.externalId string Obligatorio
checkRuns array Obligatorio
(external_id, key) únicas.checkRuns[0].key string Obligatorio
checkRuns[0].name string Obligatorio
checkRuns[0].status string Obligatorio
CHECK_RUN_LIFECYCLE_STATUS_UNSPECIFIED, queued, in_progress, completed. El esquema también enumera rerequested, que solo Origin establece al volver a solicitar; una solicitud que lo incluya devuelve InvalidArgument (HTTP 400).checkRuns[0].conclusion string
status == completed. Valores permitidos: CHECK_RUN_CONCLUSION_UNSPECIFIED, success, failure, neutral, cancelled, skipped, timed_out, action_required, stale.checkRuns[0].externalUpdatedAt string Obligatorio
checkRuns[0].startedAt cadena
InvalidArgument (HTTP 400).checkRuns[0].completedAt cadena
InvalidArgument (HTTP 400), al igual que un valor que precede a startedAt cuando ambos se publican juntos.checkRuns[0].detailsUrl string
checkRuns[0].externalId string Obligatorio
checkRuns[0].output objeto
checkRuns[0].output.title string
checkRuns[0].output.summary string
checkRuns[0].output.text string
checkRuns[0].deadlineAt string
InvalidArgument (HTTP 400) en lugar de ajustarse. Omítalo al crear para no registrar ninguna fecha límite; omítalo al actualizar para dejar la fecha límite almacenada sin cambios.checkRuns[0].isRerequestable boolean
true obliga a tu aplicación a suscribirse a repository.check_run.rerequested y a responder a cada entrega publicando una ejecución nueva para el mismo SHA de la rama y key: bien una nueva ejecución con un externalId distinto, que conserva el intento anterior como historial, o una actualización de la ejecución re-solicitada con el mismo externalId, que la actualiza en su lugar. Hasta que llegue esa nueva publicación, la ejecución re-solicitada aparece como pendiente en el estado de verificación más reciente del commit, por lo que una verificación obligatoria bloquea la fusión y la pull request muestra la ejecución como en espera de su re-ejecución; declarar que puede re-solicitarse sin responder deja la verificación varada. Origin no verifica la suscripción cuando publicas. Omítelo para mantener el valor almacenado, que es false en una ejecución nueva; envía false para retirar la declaración.Campos de respuesta
checkSuite objeto
checkSuite.id string
checkSuite.repository objeto
checkSuite.repository.id string
checkSuite.repository.name string
checkSuite.repository.owner objeto
checkSuite.repository.owner.slug cadena
checkSuite.repository.owner.id string
checkSuite.repository.owner.type string
team, user. Se omite cuando se desconoce.checkSuite.sha string
checkSuite.key cadena
checkSuite.name string
checkSuite.detailsUrl string
checkSuite.createdAt string
checkSuite.updatedAt string
checkSuite.externalId cadena
checkSuite.actor objeto
checkSuite.actor.user objeto
checkSuite.actor.user.id cadena
checkSuite.actor.user.email string
checkSuite.actor.user.displayName string
checkSuite.actor.user.handle string
@. Está presente solo mientras ese perfil sea visible públicamente; se omite en caso contrario.checkSuite.actor.app objeto
checkSuite.actor.app.id string
checkSuite.actor.app.displayName string
checkSuite.actor.serviceAccount objeto
checkSuite.actor.serviceAccount.id string
checkRuns array
results[].checkRun en su lugar. Aún se completa, en el orden de la solicitud.checkRuns[].id string
checkRuns[].repository object
checkRuns[].repository.id string
checkRuns[].repository.name string
checkRuns[].repository.owner objeto
checkRuns[].repository.owner.slug string
checkRuns[].repository.owner.id string
checkRuns[].repository.owner.type string
team, user. Se omite cuando se desconoce.checkRuns[].checkSuite objeto
checkRuns[].checkSuite.id string
checkRuns[].sha cadena
checkRuns[].key cadena
checkRuns[].name cadena
checkRuns[].status string
checkRuns[].conclusion string
status sea completed.checkRuns[].detailsUrl string
checkRuns[].externalUpdatedAt string
checkRuns[].startedAt cadena
checkRuns[].completedAt cadena
checkRuns[].createdAt string
checkRuns[].updatedAt string
checkRuns[].externalId cadena
checkRuns[].actor object
actor de la suite de comprobación propietaria.checkRuns[].actor.user objeto
checkRuns[].actor.user.id cadena
checkRuns[].actor.user.email string
checkRuns[].actor.user.displayName string
checkRuns[].actor.user.handle string
@. Está presente solo mientras ese perfil sea visible públicamente; se omite en caso contrario.checkRuns[].actor.app objeto
checkRuns[].actor.app.id string
checkRuns[].actor.app.displayName string
checkRuns[].actor.serviceAccount objeto
checkRuns[].actor.serviceAccount.id string
checkRuns[].output objeto
checkRuns[].output.title string
checkRuns[].output.summary string
checkRuns[].output.text string
checkRuns[].deadlineAt cadena
checkRuns[].isRerequestable boolean
checkRuns[].rerequestedAt string
status es rerequested y la ejecución permanece en el estado de comprobación más reciente del commit y aparece como pendiente, con conclusion y los tiempos aún manteniendo el resultado reemplazado, por lo que una comprobación requerida bloquea la fusión hasta que la aplicación responda.checkRuns[].rerequestedBy objeto
actor. Presente siempre que se establezca rerequestedAt y eliminado junto con él.results array
results[].checkRun objeto
outcome es created o updated, y la ejecución tal como estaba en caso contrario. Contiene los mismos campos que checkRuns[].results[].outcome cadena
results[].checkRun. Valores permitidos: created, updated, unchanged, ignored_stale. Una ejecución ignorada por estar obsoleta y una ejecución que repitió los valores almacenados devuelven la ejecución almacenada, por lo que este campo es la única forma de distinguirlas.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." } } ]}'Estructura de la respuesta:
{ "checkSuite": { "id": "crg_01k2ja2000e0080000000000h8", "repository": { "id": "repo_01k2ja2000e0080000000000q4", "name": "rocket", "owner": { "slug": "acme", "id": "ns_01k2ja2000e0080000000000p3", "type": "team" } }, "sha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4", "key": "ci-8842", "name": "CI", "detailsUrl": "https://ci.acme.dev/runs/8842", "createdAt": "2026-08-01T09:30:00Z", "updatedAt": "2026-08-02T14:45:00Z", "externalId": "build-8842", "actor": { "user": { "id": "user_01k2ja2000e0080000000000c3", "email": "[email protected]" } } }, "checkRuns": [ { "id": "cr_01k2ja2000e0080000000000g7", "repository": { "id": "repo_01k2ja2000e0080000000000q4", "name": "rocket", "owner": { "slug": "acme", "id": "ns_01k2ja2000e0080000000000p3", "type": "team" } }, "checkSuite": { "id": "crg_01k2ja2000e0080000000000h8" }, "sha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4", "key": "ci-8842-unit-tests", "name": "unit-tests", "status": "completed", "conclusion": "success", "detailsUrl": "https://ci.acme.dev/runs/8842", "externalUpdatedAt": "2026-08-02T14:44:30Z", "startedAt": "2026-08-02T14:40:00Z", "completedAt": "2026-08-02T14:44:30Z", "createdAt": "2026-08-01T09:30:00Z", "updatedAt": "2026-08-02T14:45:00Z", "externalId": "run-8842", "actor": { "user": { "id": "user_01k2ja2000e0080000000000c3", "email": "[email protected]" } }, "output": { "title": "Unit tests", "summary": "128 tests passed.", "text": "All suites green." } } ], "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": "[email protected]" } }, "output": { "title": "Unit tests", "summary": "128 tests passed.", "text": "All suites green." } }, "outcome": "created" } ]}Obtener ejecución de comprobación
/v1/origin/repos/{ownerSlug}/{repoName}/check-runs/{checkRunId}Devuelve una única ejecución de comprobación por ID asignado por el servidor (cr_...).
Parámetros de ruta
ownerSlug string Obligatorio
repoName string Obligatorio
checkRunId string Obligatorio
cr_...).Campos de respuesta
id string
repository objeto
repository.id string
repository.name string
repository.owner object
repository.owner.slug string
repository.owner.id string
repository.owner.type string
team, user. Se omite cuando se desconoce.checkSuite objeto
checkSuite.id string
sha cadena
key string
name string
status string
conclusion string
status sea completed.detailsUrl string
externalUpdatedAt string
startedAt string
completedAt cadena
createdAt string
updatedAt string
externalId string
actor objeto
actor de la suite de comprobación propietaria.actor.user object
actor.user.id string
actor.user.email string
actor.user.displayName string
actor.user.handle string
@. Solo está presente mientras ese perfil sea visible públicamente; se omite en caso contrario.actor.app objeto
actor.app.id string
actor.app.displayName string
actor.serviceAccount object
actor.serviceAccount.id string
output objeto
output.title string
output.summary string
output.text string
deadlineAt string
isRerequestable boolean
rerequestedAt string
status es rerequested y la ejecución permanece en el último estado de verificación del commit y aparece como pendiente, con conclusion y los tiempos todavía reflejando el resultado sustituido, por lo que una verificación obligatoria bloquea la fusión hasta que la aplicación responda.rerequestedBy objeto
actor. Está presente siempre que se establezca rerequestedAt y se borra junto con él.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'Estructura de la respuesta:
{ "id": "cr_01k2ja2000e0080000000000g7", "repository": { "id": "repo_01k2ja2000e0080000000000q4", "name": "rocket", "owner": { "slug": "acme", "id": "ns_01k2ja2000e0080000000000p3", "type": "team" } }, "checkSuite": { "id": "crg_01k2ja2000e0080000000000h8" }, "sha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4", "key": "ci-8842-unit-tests", "name": "unit-tests", "status": "completed", "conclusion": "success", "detailsUrl": "https://ci.acme.dev/runs/8842", "externalUpdatedAt": "2026-08-02T14:44:30Z", "startedAt": "2026-08-02T14:40:00Z", "completedAt": "2026-08-02T14:44:30Z", "createdAt": "2026-08-01T09:30:00Z", "updatedAt": "2026-08-02T14:45:00Z", "externalId": "run-8842", "actor": { "user": { "id": "user_01k2ja2000e0080000000000c3", "email": "[email protected]" } }, "output": { "title": "Unit tests", "summary": "128 tests passed.", "text": "All suites green." }}Listar anotaciones de una check run
/v1/origin/repos/{ownerSlug}/{repoName}/check-runs/{checkRunId}/annotationsLista las anotaciones de un check run en orden ascendente de ID.
Los ID de anotación se pueden ordenar por tiempo, por lo que el orden ascendente de ID también corresponde al orden de creación. Un token de página fija el alcance para el resto de la secuencia.
Parámetros de ruta
ownerSlug string Obligatorio
repoName string Obligatorio
checkRunId string Obligatorio
Parámetros de consulta
pageSize entero
pageToken cadena
nextPageToken de una respuesta anterior. Omítelo en la primera página. Si indicas pageSize en una solicitud de seguimiento, se aplica a esa página; omítelo para mantener el tamaño de página anterior.Campos de la respuesta
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 objeto
annotations[].location.path string
annotations[].location.startLine entero
annotations[].location.endLine entero
annotations[].location.columns objeto
annotations[].location.columns.startColumn entero
annotations[].location.columns.endColumn entero
nextPageToken cadena
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'Estructura de la respuesta:
{ "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 } } ]}Crear anotaciones de ejecución de comprobación
/v1/origin/repos/{ownerSlug}/{repoName}/check-runs/{checkRunId}/annotationsAñade entre 1 y 25 anotaciones a una ejecución de comprobación en un único lote atómico.
Un check run admite un máximo de 100 anotaciones. Todo lote que supere ese límite se rechaza con ResourceExhausted (HTTP 429) y no se escribe nada; un lote fuera del rango de 1 a 25 se rechaza con InvalidArgument (HTTP 400). La operación es append-only y no es idempotente, por lo que reintentarla tras un fallo de transporte ambiguo puede añadir duplicados y consumir capacidad. Se permite contenido idéntico.
Parámetros de ruta
ownerSlug string Obligatorio
repoName string Obligatorio
checkRunId string Obligatorio
Cuerpo de la solicitud
annotations array Obligatorio
annotations[].annotationLevel string Obligatorio
notice, warning, failure.annotations[].message string Obligatorio
annotations[].title string
annotations[].rawDetails string
annotations[].location object
annotations[].location.path string Obligatorio
annotations[].location.startLine entero Obligatorio
annotations[].location.endLine entero Obligatorio
startLine.annotations[].location.columns object
startLine y endLine son la misma línea, y ambas columnas deben enviarse juntas.annotations[].location.columns.startColumn entero
annotations[].location.columns.endColumn entero
startColumn.Campos de la respuesta
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 entero
annotations[].location.endLine entero
annotations[].location.columns object
annotations[].location.columns.startColumn entero
annotations[].location.columns.endColumn entero
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 } } ]}'Estructura de la respuesta:
{ "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 } } ]}Volver a solicitar la ejecución de comprobación
/v1/origin/repos/{ownerSlug}/{repoName}/check-runs/{checkRunId}/rerequestSolicita a la aplicación que informó una ejecución de comprobación que la ejecute de nuevo. Origin registra la solicitud en la ejecución como rerequestedAt y notifica a la aplicación propietaria con repository.check_run.rerequested. La aplicación responde publicando una nueva ejecución para el mismo head SHA y key, ya sea una ejecución nueva o una actualización de esta, lo que borra rerequestedAt y almacena el estado publicado. Mientras la solicitud está pendiente, el status de la ejecución es rerequested; su conclusion y sus tiempos siguen describiendo el intento suprimido. La llamada devuelve la ejecución con rerequestedAt establecido y status rerequested.
La ejecución debe estar completed, debe llevar isRerequestable, debe ser el intento actual de su key y debe situarse en la rama principal (head) de una solicitud de extracción abierta. Cualquier otra situación devuelve FailedPrecondition (HTTP 400).
Puede haber una re-solicitud pendiente por ejecución. Si se repite la solicitud mientras rerequestedAt está establecido, se devuelve AlreadyExists (HTTP 409 Conflict), y la ejecución puede volver a solicitarse una vez que la aplicación propietaria haya respondido. Cualquier entidad que tenga repository:contents:write puede volver a solicitar cualquier ejecución re-solicitable, sea cual sea la aplicación que la informó. Un checkRunId desconocido, o que pertenezca a otro repositorio, devuelve 404.
Parámetros de ruta
ownerSlug string Obligatorio
repoName string Obligatorio
checkRunId string Obligatorio
cr_...).Cuerpo de la solicitud
La solicitud no admite campos. Envía un objeto JSON vacío.
Campos de respuesta
id string
repository objeto
repository.id string
repository.name string
repository.owner object
repository.owner.slug string
repository.owner.id string
repository.owner.type string
team, user. Se omite cuando se desconoce.checkSuite objeto
checkSuite.id string
sha cadena
key cadena
name string
status string
conclusion string
status es completed.detailsUrl string
externalUpdatedAt string
startedAt string
completedAt cadena
createdAt string
updatedAt string
externalId string
actor objeto
actor de la suite de comprobación propietaria.actor.user objeto
actor.user.id string
actor.user.email string
actor.user.displayName string
actor.user.handle string
@. Solo está presente mientras ese perfil sea visible públicamente; se omite en caso contrario.actor.app objeto
actor.app.id string
actor.app.displayName string
actor.serviceAccount object
actor.serviceAccount.id string
output objeto
output.title string
output.summary string
output.text cadena
deadlineAt string
isRerequestable boolean
rerequestedAt string
status es rerequested y la ejecución permanece en el último estado de verificación del commit y aparece como pendiente, mientras que conclusion y los tiempos siguen mostrando el resultado reemplazado, por lo que una verificación obligatoria bloquea la fusión hasta que la aplicación responda.rerequestedBy objeto
actor. Está presente siempre que se establece rerequestedAt y se elimina junto con este.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 '{}'Estructura de la respuesta:
{ "id": "cr_01k2ja2000e0080000000000g7", "repository": { "id": "repo_01k2ja2000e0080000000000q4", "name": "rocket", "owner": { "slug": "acme", "id": "ns_01k2ja2000e0080000000000p3", "type": "team" } }, "checkSuite": { "id": "crg_01k2ja2000e0080000000000h8" }, "sha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4", "key": "ci-8842-unit-tests", "name": "unit-tests", "status": "rerequested", "conclusion": "failure", "detailsUrl": "https://ci.acme.dev/runs/8842", "externalUpdatedAt": "2026-08-02T14:44:30Z", "startedAt": "2026-08-02T14:40:00Z", "completedAt": "2026-08-02T14:44:30Z", "createdAt": "2026-08-01T09:30:00Z", "updatedAt": "2026-08-02T15:02:10Z", "externalId": "run-8842", "actor": { "app": { "id": "app_01k2ja2000e0080000000000a1", "displayName": "Acme CI" } }, "output": { "title": "Unit tests", "summary": "3 of 128 tests failed." }, "isRerequestable": true, "rerequestedAt": "2026-08-02T15:02:10Z", "rerequestedBy": { "user": { "id": "user_01k2ja2000e0080000000000c3", "email": "[email protected]" } }}Obtener suite de comprobación
/v1/origin/repos/{ownerSlug}/{repoName}/check-suites/{checkSuiteId}Devuelve los metadatos de la suite de comprobaciones por el id asignado por el servidor (crg_...). No incluye los check runs; usa ListCheckRunsForSuite para obtener los runs de la suite.
Parámetros de ruta
ownerSlug string Obligatorio
repoName string Obligatorio
checkSuiteId string Obligatorio
crg_...).Campos de la respuesta
id string
repository object
repository.id string
repository.name string
repository.owner objeto
repository.owner.slug string
repository.owner.id string
repository.owner.type string
team, user. Se omite si se desconoce.sha string
key string
name cadena
detailsUrl string
createdAt string
updatedAt string
externalId string
actor object
actor.user objeto
actor.user.id string
actor.user.email string
actor.user.displayName string
actor.user.handle string
@. Presente solo mientras ese perfil sea visible públicamente; se omite en caso contrario.actor.app objeto
actor.app.id string
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'Estructura de la respuesta:
{ "id": "crg_01k2ja2000e0080000000000h8", "repository": { "id": "repo_01k2ja2000e0080000000000q4", "name": "rocket", "owner": { "slug": "acme", "id": "ns_01k2ja2000e0080000000000p3", "type": "team" } }, "sha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4", "key": "ci-8842", "name": "CI", "detailsUrl": "https://ci.acme.dev/runs/8842", "createdAt": "2026-08-01T09:30:00Z", "updatedAt": "2026-08-02T14:45:00Z", "externalId": "build-8842", "actor": { "user": { "id": "user_01k2ja2000e0080000000000c3", "email": "[email protected]" } }}Listar los check runs de una suite
/v1/origin/repos/{ownerSlug}/{repoName}/check-suites/{checkSuiteId}/check-runsLista las ejecuciones de comprobación actuales de una suite. Cuando una clave de ejecución se informó más de una vez en la suite, solo se devuelve el intento más reciente para esa clave; los intentos sustituidos se omiten. Publicar ejecución de comprobación define qué intento es el más reciente. Una ejecución que haya sido solicitada de nuevo permanece en la lista y aparece como pendiente, con status rerequested y rerequestedAt establecidos, y su conclusion y sus tiempos de la versión anterior sin cambios, hasta que la aplicación que la posee responda. Obtén un intento sustituido por su propio id con Obtener ejecución de comprobación. Paginado.
Parámetros de ruta
ownerSlug string Obligatorio
repoName string Obligatorio
checkSuiteId string Obligatorio
crg_...).Parámetros de consulta
pageSize entero
pageToken cadena
next_page_token de una respuesta anterior. Vacío para la primera página. Codifica el ID de la última ejecución de verificación vista, dentro del ámbito de esta suite. pageSize en una solicitud posterior se aplica a esa página; omítelo para conservar el tamaño de página anterior.Campos de respuesta
checkRuns array
checkRuns[].id string
checkRuns[].repository objeto
checkRuns[].repository.id string
checkRuns[].repository.name string
checkRuns[].repository.owner objeto
checkRuns[].repository.owner.slug string
checkRuns[].repository.owner.id string
checkRuns[].repository.owner.type string
team, user. Se omite cuando se desconoce.checkRuns[].checkSuite objeto
checkRuns[].checkSuite.id string
checkRuns[].sha string
checkRuns[].key string
checkRuns[].name string
checkRuns[].status string
checkRuns[].conclusion string
status sea completed.checkRuns[].detailsUrl string
checkRuns[].externalUpdatedAt string
checkRuns[].startedAt string
checkRuns[].completedAt string
checkRuns[].createdAt cadena
checkRuns[].updatedAt string
checkRuns[].externalId string
checkRuns[].actor objeto
actor de la suite de comprobaciones propietaria.checkRuns[].actor.user objeto
checkRuns[].actor.user.id string
checkRuns[].actor.user.email string
checkRuns[].actor.user.displayName string
checkRuns[].actor.user.handle string
@. Solo está presente mientras ese perfil sea visible públicamente; en caso contrario, se omite.checkRuns[].actor.app object
checkRuns[].actor.app.id string
checkRuns[].actor.app.displayName string
checkRuns[].actor.serviceAccount objeto
checkRuns[].actor.serviceAccount.id string
checkRuns[].output objeto
checkRuns[].output.title string
checkRuns[].output.summary string
checkRuns[].output.text string
checkRuns[].deadlineAt string
checkRuns[].isRerequestable boolean
checkRuns[].rerequestedAt string
status es rerequested y la ejecución permanece en el estado de comprobación más reciente del commit y aparece como pendiente, con conclusion y los tiempos que aún conservan el resultado reemplazado, por lo que una comprobación obligatoria bloquea la fusión hasta que la aplicación responda.checkRuns[].rerequestedBy objeto
actor. Está presente siempre que se establezca rerequestedAt y se borra junto con este.nextPageToken cadena
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'Estructura de la respuesta:
{ "checkRuns": [ { "id": "cr_01k2ja2000e0080000000000g7", "repository": { "id": "repo_01k2ja2000e0080000000000q4", "name": "rocket", "owner": { "slug": "acme", "id": "ns_01k2ja2000e0080000000000p3", "type": "team" } }, "checkSuite": { "id": "crg_01k2ja2000e0080000000000h8" }, "sha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4", "key": "ci-8842-unit-tests", "name": "unit-tests", "status": "completed", "conclusion": "success", "detailsUrl": "https://ci.acme.dev/runs/8842", "externalUpdatedAt": "2026-08-02T14:44:30Z", "startedAt": "2026-08-02T14:40:00Z", "completedAt": "2026-08-02T14:44:30Z", "createdAt": "2026-08-01T09:30:00Z", "updatedAt": "2026-08-02T14:45:00Z", "externalId": "run-8842", "actor": { "user": { "id": "user_01k2ja2000e0080000000000c3", "email": "[email protected]" } }, "output": { "title": "Unit tests", "summary": "128 tests passed.", "text": "All suites green." } } ]}Listar ejecuciones de comprobación para un commit
/v1/origin/repos/{ownerSlug}/{repoName}/commits/{sha}/check-runsLista las ejecuciones de comprobación actuales de un commit en todas las suites: solo las ejecuciones que pertenecen al último intento de cada suite y, dentro de cada suite, solo el último intento por clave de ejecución. Los intentos reemplazados se omiten; Publicar ejecución de comprobación define cuál intento es el más reciente. Una ejecución que ha sido solicitada de nuevo permanece en la lista y aparece como pendiente, con status en rerequested y rerequestedAt establecido, y su conclusion y sus tiempos de la versión reemplazada sin cambios, hasta que la aplicación propietaria responda. Lea un intento reemplazado por su propio id con Obtener ejecución de comprobación. Opcionalmente filtrado por nombre y estado de la comprobación. Paginado.
Los filtros se aplican al conjunto colapsado, por lo que una ejecución coincide con el estado de su último intento y un filtro nunca vuelve a mostrar un intento sustituido. Los tokens de página incorporan los filtros con los que se emitieron, por lo que se rechaza un token reproducido con filtros distintos; reinicie la paginación cuando cambie un filtro.
Parámetros de ruta
ownerSlug string Obligatorio
repoName string Obligatorio
sha string Obligatorio
Parámetros de consulta
pageSize entero
pageToken cadena
next_page_token de una respuesta anterior. Vacío para la primera página. Codifica el id del último check-run visto con alcance en este commit y en los filtros que aparecen más abajo; reutilizar un token con filtros distintos devuelve InvalidArgument (HTTP 400). pageSize en una solicitud de seguimiento se aplica a esa página; omítalo para mantener el tamaño de página anterior.checkName string
checkRuns[].name. Omítalo para listar las ejecuciones con cualquier nombre.status string
queued, in_progress, completed, rerequested. Cualquier otro valor devuelve InvalidArgument (HTTP 400). Omitir para listar ejecuciones en cualquier estado.Campos de la respuesta
checkRuns matriz
checkRuns[].id string
checkRuns[].repository object
checkRuns[].repository.id string
checkRuns[].repository.name string
checkRuns[].repository.owner object
checkRuns[].repository.owner.slug string
checkRuns[].repository.owner.id cadena
checkRuns[].repository.owner.type string
team, user. Se omite cuando se desconoce.checkRuns[].checkSuite objeto
checkRuns[].checkSuite.id string
checkRuns[].sha string
checkRuns[].key string
checkRuns[].name string
checkRuns[].status string
checkRuns[].conclusion string
status sea completed.checkRuns[].detailsUrl string
checkRuns[].externalUpdatedAt string
checkRuns[].startedAt string
checkRuns[].completedAt string
checkRuns[].createdAt string
checkRuns[].updatedAt string
checkRuns[].externalId string
checkRuns[].actor objeto
actor de la suite de comprobación propietaria.checkRuns[].actor.user objeto
checkRuns[].actor.user.id string
checkRuns[].actor.user.email string
checkRuns[].actor.user.displayName string
checkRuns[].actor.user.handle string
@. Solo está presente mientras ese perfil sea visible públicamente; en caso contrario, se omite.checkRuns[].actor.app objeto
checkRuns[].actor.app.id string
checkRuns[].actor.app.displayName string
checkRuns[].actor.serviceAccount objeto
checkRuns[].actor.serviceAccount.id string
checkRuns[].output object
checkRuns[].output.title cadena
checkRuns[].output.summary string
checkRuns[].output.text string
checkRuns[].deadlineAt string
checkRuns[].isRerequestable boolean
checkRuns[].rerequestedAt string
status es rerequested y la ejecución permanece en el estado de verificación más reciente del commit y figura como pendiente, con conclusion y los tiempos aún mostrando el resultado sustituido, por lo que una verificación obligatoria bloquea la fusión hasta que la aplicación responda.checkRuns[].rerequestedBy objeto
actor. Está presente siempre que rerequestedAt esté establecido y se elimina junto con él.nextPageToken string
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'Estructura de la respuesta:
{ "checkRuns": [ { "id": "cr_01k2ja2000e0080000000000g7", "repository": { "id": "repo_01k2ja2000e0080000000000q4", "name": "rocket", "owner": { "slug": "acme", "id": "ns_01k2ja2000e0080000000000p3", "type": "team" } }, "checkSuite": { "id": "crg_01k2ja2000e0080000000000h8" }, "sha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4", "key": "ci-8842-unit-tests", "name": "unit-tests", "status": "completed", "conclusion": "success", "detailsUrl": "https://ci.acme.dev/runs/8842", "externalUpdatedAt": "2026-08-02T14:44:30Z", "startedAt": "2026-08-02T14:40:00Z", "completedAt": "2026-08-02T14:44:30Z", "createdAt": "2026-08-01T09:30:00Z", "updatedAt": "2026-08-02T14:45:00Z", "externalId": "run-8842", "actor": { "user": { "id": "user_01k2ja2000e0080000000000c3", "email": "[email protected]" } }, "output": { "title": "Unit tests", "summary": "128 tests passed.", "text": "All suites green." } } ]}Listar suites de comprobación para el commit
/v1/origin/repos/{ownerSlug}/{repoName}/commits/{sha}/check-suitesEnumera las suites de comprobación asociadas a un commit. Devuelve solo el intento más reciente de cada suite, según el actor que la reporta y la clave de la suite; se omiten los intentos reemplazados, y Publicar ejecución de comprobación define cuál es el intento más reciente. Consulta un intento reemplazado mediante su propio identificador con Obtener suite de comprobación. Devuelve solo los metadatos de la suite (sin ejecuciones incluidas). Paginado.
Parámetros de ruta
ownerSlug string Obligatorio
repoName string Obligatorio
sha string Obligatorio
Parámetros de consulta
pageSize entero
pageToken cadena
next_page_token de una respuesta anterior. Vacío para la primera página. Codifica el id de la última check-suite vista en el ámbito de este commit. pageSize en una solicitud de seguimiento se aplica a esa página; omítelo para conservar el tamaño de página anterior.Campos de la respuesta
checkSuites array
checkSuites[].id string
checkSuites[].repository object
checkSuites[].repository.id string
checkSuites[].repository.name string
checkSuites[].repository.owner objeto
checkSuites[].repository.owner.slug string
checkSuites[].repository.owner.id string
checkSuites[].repository.owner.type string
team, user. Se omite cuando se desconoce.checkSuites[].sha string
checkSuites[].key string
checkSuites[].name string
checkSuites[].detailsUrl string
checkSuites[].createdAt string
checkSuites[].updatedAt string
checkSuites[].externalId string
checkSuites[].actor objeto
checkSuites[].actor.user objeto
checkSuites[].actor.user.id string
checkSuites[].actor.user.email string
checkSuites[].actor.user.displayName string
checkSuites[].actor.user.handle string
@. Presente solo mientras ese perfil sea visible públicamente; en caso contrario, se omite.checkSuites[].actor.app objeto
checkSuites[].actor.app.id string
checkSuites[].actor.app.displayName string
checkSuites[].actor.serviceAccount objeto
checkSuites[].actor.serviceAccount.id string
nextPageToken string
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'Estructura de la respuesta:
{ "checkSuites": [ { "id": "crg_01k2ja2000e0080000000000h8", "repository": { "id": "repo_01k2ja2000e0080000000000q4", "name": "rocket", "owner": { "slug": "acme", "id": "ns_01k2ja2000e0080000000000p3", "type": "team" } }, "sha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4", "key": "ci-8842", "name": "CI", "detailsUrl": "https://ci.acme.dev/runs/8842", "createdAt": "2026-08-01T09:30:00Z", "updatedAt": "2026-08-02T14:45:00Z", "externalId": "build-8842", "actor": { "user": { "id": "user_01k2ja2000e0080000000000c3", "email": "[email protected]" } } } ]}Commits y contenido
Un commit separa los metadatos de los objetos Git en commit de las relaciones de nivel superior del repositorio. Las respuestas de lista omiten stats; Obtener commit incluye las stats agregadas de todo el commit. Los archivos modificados solo se devuelven mediante la colección paginada Listar archivos de commit. author y committer son identidades de Git registradas en el commit, no objetos de usuario de Origin.
Una comparación es solo un resumen: nunca incluye listas de commits ni diffs de archivos. status es exactamente identical, ahead, behind o diverged; aheadBy y behindBy son recuentos de commits. baseCommit, headCommit y mergeBaseCommit usan la proyección reducida del commit (sin stats ni archivos).
Listar commits
/v1/origin/repos/{ownerSlug}/{repoName}/commitsLista los commits de una rama o a partir de una referencia inicial.
Los resultados de la lista omiten stats. Usa Obtener commit para las estadísticas agregadas y Listar archivos del commit para la diferencia de archivos paginada.
Parámetros de ruta
ownerSlug string Obligatorio
repoName string Obligatorio
Parámetros de consulta
sha string
HEAD) desde la que comenzar a listar. Si está vacío, se usa la rama predeterminada del repositorio.pageSize entero
pageToken string
nextPageToken de una respuesta anterior. Vacío para la primera página. Codifica la referencia inicial, la posición en el recorrido y los filtros de correo electrónico; sha, pageSize, authorEmails y committerEmails se ignoran cuando se proporciona un token. Una página filtrada puede contener menos confirmaciones que pageSize, o ninguna, aunque nextPageToken tenga un valor. Sigue solicitando páginas hasta que esté vacío.authorEmails array
committerEmails array
authorEmails; si está vacío, no se aplica ningún filtro. Cuando se establecen ambos filtros, un commit debe coincidir con ambas listas. Cada página examina como máximo 1000 commits en busca de coincidencias.Campos de la respuesta
commits matriz
commits[].sha string
commits[].commit objeto
commits[].commit.author objeto
commits[].commit.author.name string
commits[].commit.author.email string
commits[].commit.author.date string
commits[].commit.committer objeto
commits[].commit.committer.name string
commits[].commit.committer.email string
commits[].commit.committer.date string
commits[].commit.message string
commits[].commit.tree objeto
commits[].commit.tree.sha string
commits[].parents array
commits[].parents[].sha string
nextPageToken string
curl --request GET \ --url 'https://api.cursor.com/v1/origin/repos/OWNER_SLUG/REPO_NAME/commits' \ --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN'Estructura de la respuesta:
{ "commits": [ { "sha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4", "commit": { "author": { "name": "Jane Doe", "email": "[email protected]", "date": "2026-08-01T09:30:00Z" }, "committer": { "name": "Jane Doe", "email": "[email protected]", "date": "2026-08-01T09:30:00Z" }, "message": "Add launch telemetry", "tree": { "sha": "a7b6c5d4e3f2a1b0c9d8e7f6a5b4c3d2e1f0a9b8" } }, "parents": [ { "sha": "3b1f9c2d8a7e6f5049c8b7a6d5e4f3a2b1c0d9e8" } ], "stats": { "additions": 128, "deletions": 46, "total": 174 } } ]}Obtener un commit
/v1/origin/repos/{ownerSlug}/{repoName}/commits/{sha}Devuelve un commit por SHA o referencia con las estadísticas agregadas de todo el commit. No incluye los archivos modificados; usa Listar archivos del commit.
author y committer son identidades de Git registradas en el commit, no objetos de usuario de Origin.
Parámetros de ruta
ownerSlug string Obligatorio
repoName string Obligatorio
sha string Obligatorio
HEAD) del commit que se va a obtener. Un SHA abreviado se resuelve igual que en Obtener un commit de Git.Campos de respuesta
sha string
commit objeto
commit.author objeto
commit.author.name string
commit.author.email string
commit.author.date string
commit.committer objeto
commit.committer.name string
commit.committer.email string
commit.committer.date string
commit.message string
commit.tree objeto
commit.tree.sha string
parents array
parents[].sha string
stats objeto
stats.additions entero
stats.deletions entero
stats.total entero
curl --request GET \ --url 'https://api.cursor.com/v1/origin/repos/OWNER_SLUG/REPO_NAME/commits/SHA' \ --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN'Estructura de la respuesta:
{ "sha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4", "commit": { "author": { "name": "Jane Doe", "email": "[email protected]", "date": "2026-08-01T09:30:00Z" }, "committer": { "name": "Jane Doe", "email": "[email protected]", "date": "2026-08-01T09:30:00Z" }, "message": "Add launch telemetry", "tree": { "sha": "a7b6c5d4e3f2a1b0c9d8e7f6a5b4c3d2e1f0a9b8" } }, "parents": [ { "sha": "3b1f9c2d8a7e6f5049c8b7a6d5e4f3a2b1c0d9e8" } ], "stats": { "additions": 128, "deletions": 46, "total": 174 }}List Commit Files
/v1/origin/repos/{ownerSlug}/{repoName}/commits/{sha}/filesEnumera los archivos modificados por un commit.
sha puede ser el SHA de un commit, una rama, una etiqueta o una referencia simbólica como HEAD. De forma predeterminada, se devuelven 30 archivos, con un máximo de 100. Un token de página fija el commit resuelto y el cursor de archivos; en solicitudes posteriores, sha debe coincidir con el token. Cada archivo incluye filename, status, additions, deletions, changes, patch y previousFilename cuando se ha renombrado o copiado. patch está vacío para los archivos binarios.
Parámetros de ruta
ownerSlug string Obligatorio
repoName string Obligatorio
sha string Obligatorio
HEAD) del commit cuyos archivos se quieren listar. Un SHA abreviado se resuelve igual que en Get Git Commit.Parámetros de consulta
pageSize entero
pageToken string
next_page_token de una respuesta anterior. Vacío para la primera página. El token fija el commit resuelto y el cursor del archivo, por lo que sha en una solicitud posterior debe coincidir con el token. pageSize en una solicitud posterior se aplica a esa página; omítelo para mantener el tamaño de página anterior.Campos de respuesta
files array
files[].filename string
files[].status string
files[].additions entero
files[].deletions entero
files[].changes entero
files[].patch string
files[].previousFilename string
nextPageToken string
curl --request GET \ --url 'https://api.cursor.com/v1/origin/repos/OWNER_SLUG/REPO_NAME/commits/SHA/files' \ --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN'Estructura de la respuesta:
{ "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" } ]}Comparar commits
/v1/origin/repos/{ownerSlug}/{repoName}/compare/{basehead}Compara commits, referencias o etiquetas con respecto a su base de fusión. basehead es "{base}...{head}"; las referencias que contienen "/" deben usar su SHA.
Tanto base como head pueden ser un SHA, una rama, un tag o una referencia simbólica como HEAD. La respuesta es un resumen sin paginación: status puede ser identical, ahead, behind o diverged; los tres objetos de commit son escuetos y omiten stats y los archivos. No se devuelven los campos totalCommits, commits incrustados ni files. Los historiales no relacionados devuelven 404.
Parámetros de ruta
ownerSlug string Obligatorio
repoName string Obligatorio
basehead string Obligatorio
"{base}...{head}", donde cualquiera de las dos revisiones puede ser un SHA, una rama, una etiqueta o una referencia simbólica como HEAD.Campos de la respuesta
status string
aheadBy entero
behindBy entero
baseCommit object
baseCommit.sha string
baseCommit.commit object
baseCommit.commit.author objeto
baseCommit.commit.author.name string
baseCommit.commit.author.email string
baseCommit.commit.author.date string
baseCommit.commit.committer object
baseCommit.commit.committer.name string
baseCommit.commit.committer.email string
baseCommit.commit.committer.date string
baseCommit.commit.message string
baseCommit.commit.tree object
baseCommit.commit.tree.sha string
baseCommit.parents array
baseCommit.parents[].sha string
headCommit object
headCommit.sha string
headCommit.commit object
headCommit.commit.author object
headCommit.commit.author.name string
headCommit.commit.author.email string
headCommit.commit.author.date string
headCommit.commit.committer object
headCommit.commit.committer.name string
headCommit.commit.committer.email string
headCommit.commit.committer.date string
headCommit.commit.message string
headCommit.commit.tree object
headCommit.commit.tree.sha string
headCommit.parents array
headCommit.parents[].sha string
mergeBaseCommit object
mergeBaseCommit.sha string
mergeBaseCommit.commit object
mergeBaseCommit.commit.author object
mergeBaseCommit.commit.author.name string
mergeBaseCommit.commit.author.email string
mergeBaseCommit.commit.author.date string
mergeBaseCommit.commit.committer object
mergeBaseCommit.commit.committer.name string
mergeBaseCommit.commit.committer.email string
mergeBaseCommit.commit.committer.date string
mergeBaseCommit.commit.message string
mergeBaseCommit.commit.tree object
mergeBaseCommit.commit.tree.sha string
mergeBaseCommit.parents array
mergeBaseCommit.parents[].sha string
curl --request GET \ --url 'https://api.cursor.com/v1/origin/repos/OWNER_SLUG/REPO_NAME/compare/BASE...HEAD' \ --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN'Estructura de la respuesta:
{ "status": "ahead", "aheadBy": 2, "behindBy": 0, "baseCommit": { "sha": "3b1f9c2d8a7e6f5049c8b7a6d5e4f3a2b1c0d9e8", "commit": { "author": { "name": "Jane Doe", "email": "[email protected]", "date": "2026-08-01T09:30:00Z" }, "committer": { "name": "Jane Doe", "email": "[email protected]", "date": "2026-08-01T09:30:00Z" }, "message": "Add launch telemetry", "tree": { "sha": "a7b6c5d4e3f2a1b0c9d8e7f6a5b4c3d2e1f0a9b8" } }, "parents": [ { "sha": "3b1f9c2d8a7e6f5049c8b7a6d5e4f3a2b1c0d9e8" } ], "stats": { "additions": 128, "deletions": 46, "total": 174 } }, "headCommit": { "sha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4", "commit": { "author": { "name": "Jane Doe", "email": "[email protected]", "date": "2026-08-01T09:30:00Z" }, "committer": { "name": "Jane Doe", "email": "[email protected]", "date": "2026-08-01T09:30:00Z" }, "message": "Add launch telemetry", "tree": { "sha": "a7b6c5d4e3f2a1b0c9d8e7f6a5b4c3d2e1f0a9b8" } }, "parents": [ { "sha": "3b1f9c2d8a7e6f5049c8b7a6d5e4f3a2b1c0d9e8" } ], "stats": { "additions": 128, "deletions": 46, "total": 174 } }, "mergeBaseCommit": { "sha": "3b1f9c2d8a7e6f5049c8b7a6d5e4f3a2b1c0d9e8", "commit": { "author": { "name": "Jane Doe", "email": "[email protected]", "date": "2026-08-01T09:30:00Z" }, "committer": { "name": "Jane Doe", "email": "[email protected]", "date": "2026-08-01T09:30:00Z" }, "message": "Add launch telemetry", "tree": { "sha": "a7b6c5d4e3f2a1b0c9d8e7f6a5b4c3d2e1f0a9b8" } }, "parents": [ { "sha": "3b1f9c2d8a7e6f5049c8b7a6d5e4f3a2b1c0d9e8" } ], "stats": { "additions": 128, "deletions": 46, "total": 174 } }}Listar archivos de comparación
/v1/origin/repos/{ownerSlug}/{repoName}/compare/{basehead}/filesEnumera los archivos modificados por una comparación: el diff de head con respecto a la base de fusión de base y head.
basehead es "{base}...{head}"; las referencias que contienen "/" deben usar su SHA. La lista de archivos siempre coincide con el resumen de Comparar commits, por lo que una comparación identical o behind devuelve una lista vacía, y los historiales no relacionados devuelven 404. Los resultados por defecto son 30 archivos y están limitados a 100. Cada archivo incluye los mismos campos que Listar archivos de un commit.
Parámetros de ruta
ownerSlug string Obligatorio
repoName string Obligatorio
basehead string Obligatorio
"{base}...{head}", donde cualquiera de las revisiones puede ser un SHA, una rama, una etiqueta o una referencia simbólica como HEAD.Parámetros de consulta
pageSize entero
pageToken string
next_page_token de una respuesta anterior. Vacío para la primera página. El token está vinculado a la comparación resuelta y el cursor de archivos, por lo que basehead en una solicitud de seguimiento debe coincidir con el token. Origin vuelve a resolver la comparación en cada página; cuando sus commits se han movido desde que se emitió el token, la solicitud devuelve InvalidArgument (HTTP 400) y el listado debe reiniciarse desde la primera página. pageSize en una solicitud de seguimiento se aplica a esa página; omítelo para conservar el tamaño de página anterior.Campos de respuesta
files arreglo
files[].filename string
files[].status string
files[].additions entero
files[].deletions entero
files[].changes entero
files[].patch string
files[].previousFilename string
nextPageToken string
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'Estructura de la respuesta:
{ "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" } ]}Obtener contenido
/v1/origin/repos/{ownerSlug}/{repoName}/contentsDevuelve el contenido de un archivo o directorio en una referencia. La ruta del archivo se proporciona mediante el parámetro de consulta path (admite rutas anidadas); omítalo o déjelo vacío para usar el directorio raíz del repositorio. Los archivos de más de 1 MiB (decodificados) se rechazan con FailedPrecondition (HTTP 400).
Los archivos contienen contenido en base64. Los directorios contienen elementos secundarios inmediatos en entries. Las entradas de directorio son elementos secundarios parciales que contienen type, name, path, sha y size; obtenga la ruta de un elemento secundario para leer su contenido.
Parámetros de ruta
ownerSlug string Obligatorio
repoName string Obligatorio
Parámetros de consulta
path string
ref string
HEAD) desde la que leer. Si se deja vacío, se usa la rama predeterminada del repositorio.Campos de respuesta
type string
encoding string
size string
name string
path string
sha string
content string
entries array
curl --request GET \ --url 'https://api.cursor.com/v1/origin/repos/OWNER_SLUG/REPO_NAME/contents' \ --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN'Estructura de la respuesta:
{ "type": "file", "encoding": "base64", "size": "312", "name": "telemetry.ts", "path": "src/telemetry.ts", "sha": "c9d8e7f6a5b4c3d2e1f0a9b8c7d6e5f4a3b2c1d0", "content": "Y29uc29sZS5sb2coImxhdW5jaCIpOwo="}Obtener contenidos en lote
/v1/origin/repos/{ownerSlug}/{repoName}/contents:batchGetDevuelve el contenido de varias rutas explícitas en una referencia en una sola solicitud. Cada ruta solicitada produce un resultado que indica si se encontró; una ruta encontrada tiene la misma estructura Content que GetContents (archivos en base64, directorios como entries inmediatas, enlaces simbólicos como archivos). Las rutas se comparan exactamente, sin globs ni patrones, y se pueden solicitar como máximo 20; los duplicados se eliminan. Los resultados de la respuesta conservan el orden en que las solicitudes fueron vistas por primera vez. Un único archivo que supere el límite de 1 MiB de Get Contents hace que falle todo el lote con FailedPrecondition (HTTP 400). Usa POST porque la lista de rutas va en el cuerpo de la solicitud.
Parámetros de ruta
ownerSlug string Obligatorio
repoName string Obligatorio
Cuerpo de la solicitud
paths array Obligatorio
ref string
HEAD) desde la que leer. Si se deja vacío, se usa la rama predeterminada del repositorio.Campos de respuesta
results array
results[].path string
results[].found boolean
results[].content object
results[].content.type string
results[].content.encoding string
results[].content.size string
results[].content.name string
results[].content.path string
results[].content.sha string
results[].content.content string
results[].content.entries array
resolvedCommitSha string
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"}'Estructura de la respuesta:
{ "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"}Grep Contents
/v1/origin/repos/{ownerSlug}/{repoName}:grepBusca en el texto de los archivos del repositorio en una referencia y devuelve las líneas que coinciden, además de las líneas de contexto circundantes solicitadas. La búsqueda está orientada por líneas: un patrón nunca coincide a través de un salto de línea, y cada entrada devuelta es una sola línea. El repositorio se examina en cada solicitud, por lo que no hay paginación ni cursor; la respuesta está completa solo cuando limitHit es false. Un repositorio vacío sin referencias no devuelve coincidencias y limitHit es false. Usa POST porque los parámetros de búsqueda viajan en el cuerpo de la solicitud.
Parámetros de ruta
ownerSlug cadena Obligatorio
repoName cadena Obligatorio
Cuerpo de solicitud
ref cadena
HEAD) donde buscar. Si se deja vacío, se usa la rama predeterminada del repositorio.query cadena Obligatorio
literal para buscar el texto de forma exacta. Los espacios en blanco son significativos y se buscan tal cual. Cuando literal es false, la coincidencia sin distinguir mayúsculas de minúsculas se indica con (?i) al inicio del patrón (por ejemplo, (?i)launch) y la coincidencia de palabra completa con \b a su alrededor (por ejemplo, \blaunch\b). Un patrón vacío devuelve InvalidArgument (HTTP 400). Tamaño máximo en UTF-8: 4096 bytes.literal boolean
query como texto exacto en lugar de como una expresión regular.caseInsensitive boolean
literal es true. Se ignora en las búsquedas con expresiones regulares; en su lugar, escribe (?i) al principio de query.wholeWord boolean
literal es true. Se ignora en las búsquedas con expresiones regulares; en su lugar, escribe \b alrededor del patrón.contextBefore entero
contextAfter entero
filterPath cadena
includes array
/ coincide a cualquier profundidad, * coincide dentro de un único segmento de ruta y ** coincide a través de varios segmentos. Cuando hay alguna inclusión, no se busca una ruta que no coincida con ninguna de ellas. Como máximo 20 entradas. Tamaño máximo por patrón en UTF-8: 4096 bytes.excludes array
includes. Una exclusión prevalece sobre una inclusión, y excluir un directorio excluye todo lo que hay dentro de él. Máximo 20 entradas. Tamaño máximo UTF-8 por patrón: 4096 bytes.maxResults entero
Campos de respuesta
matches array
matches[].path cadena
matches[].lineNumber entero
matches[].line cadena
matches[].kind cadena
match, context.matches[].submatches array
line. Siempre está vacío en una línea de contexto. Cuando limitHit es true, la última línea con coincidencias puede contener solo algunas de ellas. Los rangos que quedan completamente después de line se omiten, y los que se extenderían más allá de line se reducen a los bytes que quedan.matches[].submatches[].start entero
matches[].submatches[].end entero
limitHit boolean
maxResults. Reduce query, filterPath o las listas de globs para buscar en un conjunto más pequeño de archivos.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}Datos de Git
Objetos Git de bajo nivel. Las lecturas requieren repository:contents:read, y un repositorio vacío devuelve 409. Create Commit From Files y Create Git Ref escriben objetos Git y requieren repository:contents:write.
Además de ramas y etiquetas, Obtener una referencia de Git lee la vista previa de fusión de una pull request en pull/{pullNumber}/merge (normalizada a refs/pull/{pullNumber}/merge): un commit que fusiona la cabecera actual de la pull request con la punta de su rama base en el momento de la última actualización. Origin la actualiza cuando se crea la pull request, cuando se hace push de su cabecera, cuando se cambia su destino y cuando se reabre, antes de que se publiquen los eventos de webhook pull_request.* correspondientes y dentro de un límite de tiempo acotado; si una actualización no termina a tiempo, se mantiene la referencia anterior y los eventos se publican igualmente. Origin no la actualiza por el hecho de que la rama base avance por su cuenta, y elimina la referencia cuando la fusión presenta conflictos, de modo que un 404 en una pull request abierta significa que hay conflictos o que la vista previa aún no se ha preparado. Cada versión de la pull request también indica su propia fusión de prueba en version.potentialMergeCommit, cuyo state permite distinguir entre esos dos casos; consulta Pull requests. El mergeCommitSha de la pull request es un commit distinto, que solo se establece una vez fusionada.
Obtener blob
/v1/origin/repos/{ownerSlug}/{repoName}/git/blobs/{sha}Devuelve un objeto blob de Git mediante su SHA. La respuesta predeterminada es JSON con content codificado en base64 y encapsulado en MIME. En la API REST, envíe Accept: application/vnd.origin.raw+json (o application/vnd.origin.raw) para recibir los bytes sin procesar del blob. Se rechazan los blobs de más de 4 MiB (decodificados); obtenga archivos más grandes clonando el repositorio mediante Git por HTTPS. Los repositorios vacíos devuelven 409 Conflict.
Parámetros de ruta
ownerSlug cadena Obligatorio
repoName cadena Obligatorio
sha cadena Obligatorio
Campos de respuesta
sha cadena
size entero
encoding cadena
content cadena
curl --request GET \ --url 'https://api.cursor.com/v1/origin/repos/OWNER_SLUG/REPO_NAME/git/blobs/SHA' \ --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN'Estructura de la respuesta:
{ "sha": "c9d8e7f6a5b4c3d2e1f0a9b8c7d6e5f4a3b2c1d0", "size": 312, "encoding": "base64", "content": "Y29uc29sZS5sb2coImxhdW5jaCIpOwo="}Obtener un commit de Git
/v1/origin/repos/{ownerSlug}/{repoName}/git/commits/{sha}Devuelve un objeto de commit de Git por SHA (o revisión resoluble). Esta es la forma de commit de bajo nivel de la base de datos de Git (autor/mensaje/árbol en plano), no el recurso de mayor nivel GetCommit en /commits/{sha}. sha acepta un SHA de commit, una rama, una etiqueta o una referencia simbólica como HEAD. Los repositorios vacíos devuelven 409 Conflict.
Parámetros de ruta
ownerSlug string Obligatorio
repoName string Obligatorio
sha string Obligatorio
HEAD. Una abreviatura debe tener al menos 5 caracteres hexadecimales y solo se resuelve entre objetos commit; falla si no coincide con ningún commit o si coincide con más de uno.Campos de respuesta
sha string
author objeto
author.name string
author.email string
author.date string
committer objeto
committer.name string
committer.email string
committer.date string
message string
tree objeto
tree.sha string
parents array
parents[].sha string
curl --request GET \ --url 'https://api.cursor.com/v1/origin/repos/OWNER_SLUG/REPO_NAME/git/commits/SHA' \ --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN'Estructura de la respuesta:
{ "sha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4", "author": { "name": "Jane Doe", "email": "[email protected]", "date": "2026-08-01T09:30:00Z" }, "committer": { "name": "Jane Doe", "email": "[email protected]", "date": "2026-08-01T09:30:00Z" }, "message": "Add launch telemetry", "tree": { "sha": "a7b6c5d4e3f2a1b0c9d8e7f6a5b4c3d2e1f0a9b8" }, "parents": [ { "sha": "3b1f9c2d8a7e6f5049c8b7a6d5e4f3a2b1c0d9e8" } ]}Crear commit a partir de archivos
/v1/origin/repos/{ownerSlug}/{repoName}/git/commits:createFromFilesCrea un commit en una branch a partir de cambios de archivos inline y hace avanzar la branch hasta él.
Los cambios se aplican al tree en expectedHeadSha, que pasa a ser el parent del nuevo commit. Devuelven FailedPrecondition (HTTP 400) los siguientes casos: una branch que se ha movido o no existe, un conjunto de cambios que deja el tree sin modificar, un delete de un path que el tree no contiene, un write bloqueado por un ruleset de push y un repository cuyos contents se replican desde otro host.
Una solicitud admite como máximo 1000 cambios de archivo, 8 MiB por archivo y 32 MiB de contenido en total. Superar un límite, repetir una ruta o enviar un campo con formato incorrecto devuelve InvalidArgument (HTTP 400), con infracciones de campo de google.rpc.BadRequest que identifican la entrada files[i] conflictiva.
La branch ya debe existir. Créala primero con Create Git Ref y luego haz commit sobre ella.
Parámetros de ruta
ownerSlug string Obligatorio
repoName string Obligatorio
Cuerpo de la solicitud
targetBranch string Obligatorio
<branch>, heads/<branch> o refs/heads/<branch>. La branch debe existir previamente. HEAD se rechaza en cualquier variante de escritura.expectedHeadSha string Obligatorio
message string Obligatorio
author object Obligatorio
author.name string Obligatorio
author.email string Obligatorio
committer object
author.committer.name string
committer.committer.email string
committer está presente.files array Obligatorio
files[].path string Obligatorio
/, por ejemplo docs/changelog.md.files[].content string
files[].encoding. Crea el archivo o reemplaza su contenido. Establece exactamente uno de files[].content o files[].delete.files[].delete booleano
true cuando se establece. Establece exactamente uno de estos dos: files[].content o files[].delete.files[].encoding string
files[].content. Valores permitidos: utf-8 (predeterminado), base64. Se ignora en las eliminaciones.files[].mode string
files[].content. Valores permitidos: file (predeterminado), executable, symlink, donde el contenido es el destino del enlace. Se ignora en las eliminaciones.Campos de respuesta
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": "[email protected]" }, "files": [ { "path": "src/login/telemetry.ts", "content": "export const LOGIN_EVENT = 1;" }, { "path": "assets/login.png", "content": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNkYPhfDwAChwGA60e6kgAAAABJRU5ErkJggg==", "encoding": "base64" }, { "path": "src/login/legacy.ts", "delete": true } ]}'Estructura de la respuesta:
{ "sha": "5c4d3e2f1a0b9c8d7e6f5a4b3c2d1e0f9a8b7c6d", "treeSha": "a7b6c5d4e3f2a1b0c9d8e7f6a5b4c3d2e1f0a9b8", "previousHeadSha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4"}Obtener una referencia de Git
/v1/origin/repos/{ownerSlug}/{repoName}/git/ref/{ref}Devuelve una referencia de Git por su nombre. ref suele ser heads/<branch> o tags/<tag> (con o sin el prefijo refs/), o el HEAD simbólico. Solo admite coincidencias exactas; usa ListMatchingGitRefs para prefijos. Los repositorios vacíos devuelven 409 Conflict.
pull/<number>/merge es la vista previa de fusión de un pull request: un commit que fusiona su cabecera actual en la punta de su base branch en el momento de la última actualización. Es un commit distinto del mergeCommitSha del pull request, que solo se establece una vez que el pull request se ha fusionado. El campo version.potentialMergeCommit del pull request indica la fusión de prueba de cada versión: mientras una versión sea la más reciente y su state sea prepared, su sha es el commit al que apunta esta referencia.
Origin actualiza la vista previa cuando se crea un pull request, cuando se hace push a su cabecera, cuando se cambia su destino y cuando se reabre, antes de que se publiquen los eventos de webhook pull_request.* correspondientes y dentro de un margen de tiempo limitado. Si una actualización no termina a tiempo, se mantiene la referencia anterior y los eventos se publican igualmente. Origin no la actualiza por el simple hecho de que la base branch avance, y elimina la referencia cuando la fusión tiene conflictos, por lo que un 404 en un pull request abierto significa que la fusión tiene conflictos o que la vista previa aún no está preparada.
Parámetros de ruta
ownerSlug cadena obligatorio
repoName cadena obligatorio
ref cadena obligatorio
heads/<branch> o tags/<tag>; se acepta y normaliza el prefijo refs/. También se acepta el HEAD simbólico (se devuelve como ref: "HEAD" con el commit de punta), así como pull/<number>/merge para la vista previa de fusión de un pull request. Debe coincidir exactamente con el nombre completo de la referencia.Campos de respuesta
ref cadena
object object
object.type es "tag" y object.sha es el SHA del objeto de etiqueta.object.sha cadena
object.type cadena
curl --request GET \ --url 'https://api.cursor.com/v1/origin/repos/OWNER_SLUG/REPO_NAME/git/ref/REF' \ --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN'Estructura de la respuesta:
{ "ref": "refs/heads/main", "object": { "sha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4", "type": "commit" }}Crear referencia de Git
/v1/origin/repos/{ownerSlug}/{repoName}/git/refsCrea una referencia de rama que apunta a un commit existente.
Solo se pueden crear referencias de rama. Un tag o cualquier otro espacio de nombres de referencia, así como un sha que no sea el SHA hexadecimal completo de un commit del repositorio, devuelven InvalidArgument (HTTP 400). Crear una rama que ya apunta a sha se realiza correctamente y devuelve la referencia existente; si la rama existe en otro commit, se devuelve AlreadyExists (HTTP 409 Conflict). Una creación bloqueada por un ruleset de push, o realizada en un repositorio cuyo contenido se replica desde otro host, devuelve FailedPrecondition (HTTP 400).
Parámetros de ruta
ownerSlug string Obligatorio
repoName string Obligatorio
Cuerpo de la solicitud
ref string Obligatorio
refs/heads/<branch> o heads/<branch>.sha string Obligatorio
Campos de la respuesta
ref string
object object
object.type es «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"}'Estructura de la respuesta:
{ "ref": "refs/heads/feature/login", "object": { "sha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4", "type": "commit" }}Eliminar referencia de Git
/v1/origin/repos/{ownerSlug}/{repoName}/git/refs/{ref}Elimina una referencia de rama. El cuerpo de respuesta está vacío.
Solo se pueden eliminar referencias de rama. Una rama que no existe devuelve 404. La rama predeterminada del repositorio, una rama protegida por una regla de eliminación y un repositorio cuyo contenido se replica desde otro host devuelven FailedPrecondition (HTTP 400). Los pull request cuya cabecera es la rama eliminada se cierran, igual que tras una eliminación enviada por push. Una rama cuya punta cambia mientras la eliminación está en curso falla con FailedPrecondition (HTTP 400) o Aborted (HTTP 409 Conflict); reintente para eliminar la nueva punta.
Parámetros de ruta
ownerSlug cadena Obligatorio
repoName cadena Obligatorio
ref cadena Obligatorio
refs/heads/<branch> o heads/<branch>.Campos de respuesta
Las solicitudes exitosas no devuelven cuerpo de respuesta.
curl --request DELETE \ --url 'https://api.cursor.com/v1/origin/repos/OWNER_SLUG/REPO_NAME/git/refs/REF' \ --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN'Respuesta:
204 No ContentListar las referencias de Git cuyos nombres comienzan con el prefijo indicado
/v1/origin/repos/{ownerSlug}/{repoName}/git/matching-refsLista las referencias de Git cuyos nombres comienzan con el prefijo indicado. Las respuestas REST devuelven directamente un array JSON (mediante response_body). Se conserva la barra diagonal final de ref (heads/ → refs/heads/). El HEAD simbólico coincide exactamente (no está bajo refs/). Los repositorios vacíos devuelven 409 Conflict.
Parámetros de ruta
ownerSlug cadena obligatorio
repoName cadena obligatorio
Parámetros de consulta
ref cadena
heads/<prefix> o tags/<prefix>; se acepta y normaliza el prefijo refs/. Si está vacío, enumera todas las referencias (vinculación REST sin un segmento de ruta final).Campos de respuesta
La respuesta es un array. Cada elemento contiene:
ref cadena
object objeto
object.type es "tag" y object.sha es el SHA del objeto de etiqueta.object.sha cadena
object.type cadena
curl --request GET \ --url 'https://api.cursor.com/v1/origin/repos/OWNER_SLUG/REPO_NAME/git/matching-refs' \ --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN'Estructura de la respuesta:
{ "refs": [ { "ref": "refs/heads/main", "object": { "sha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4", "type": "commit" } } ]}Listar referencias de Git que coinciden por ruta
/v1/origin/repos/{ownerSlug}/{repoName}/git/matching-refs/{ref}Lista las referencias de Git cuyos nombres comienzan con el prefijo indicado. Las respuestas REST se devuelven directamente como un array JSON (mediante response_body). Se conserva una barra diagonal final en ref (heads/ → refs/heads/). El HEAD simbólico coincide exactamente (no está bajo refs/). Los repositorios vacíos devuelven 409 Conflict.
Parámetros de ruta
ownerSlug cadena Obligatorio
repoName cadena Obligatorio
ref cadena Obligatorio
heads/<prefix> o tags/<prefix>; se acepta y normaliza el prefijo refs/. Si está vacío, se listan todas las referencias (vinculación REST sin un segmento de ruta final).Campos de respuesta
La respuesta es un array. Cada elemento contiene:
ref cadena
object object
object.type es "tag" y object.sha es el SHA del objeto de etiqueta.object.sha cadena
object.type cadena
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'Estructura de la respuesta:
{ "refs": [ { "ref": "refs/heads/main", "object": { "sha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4", "type": "commit" } } ]}Obtener tag
/v1/origin/repos/{ownerSlug}/{repoName}/git/tags/{sha}Devuelve un objeto de tag de Git anotado mediante SHA. Los tags ligeros no son objetos de tag y devuelven NotFound. Los repositorios vacíos devuelven 409 Conflict.
Parámetros de ruta
ownerSlug string Obligatorio
repoName string Obligatorio
sha string Obligatorio
Campos de la respuesta
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'Estructura de la respuesta:
{ "sha": "e1f0a9b8c7d6e5f4a3b2c1d0e9f8a7b6c5d4e3f2", "tag": "v1.2.0", "message": "Release v1.2.0", "tagger": { "name": "Jane Doe", "email": "[email protected]", "date": "2026-08-01T09:30:00Z" }, "object": { "sha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4", "type": "commit" }}Obtener árbol
/v1/origin/repos/{ownerSlug}/{repoName}/git/trees/{sha}Devuelve un objeto de árbol de Git por SHA o por una revisión resolvible. sha acepta un SHA de árbol, un SHA de commit, una rama, una etiqueta o una referencia simbólica como HEAD. Establece recursive=true (o 1) para recorrer todo el árbol; omitir el parámetro o pasar cualquier otro valor lista solo los hijos inmediatos. Los listados recursivos se truncan a 100.000 entradas o 7 MiB y establecen truncated=true. Los repositorios vacíos devuelven 409 Conflict.
Parámetros de ruta
ownerSlug cadena Obligatorio
repoName string Obligatorio
sha string Obligatorio
HEAD.Parámetros de consulta
recursive boolean
true y 1 habilitan la recursión; si se omite el parámetro o se pasa cualquier otro valor (incluidos false y 0), solo se listan los hijos inmediatos.Campos de respuesta
sha string
tree array
tree[].path string
tree[].mode string
tree[].type string
tree[].sha string
tree[].size integer
int32 garantiza que REST JSON emita un número; los blobs individuales de más de 2 GiB no son representables.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'Estructura de la respuesta:
{ "sha": "a7b6c5d4e3f2a1b0c9d8e7f6a5b4c3d2e1f0a9b8", "tree": [ { "path": "src/telemetry.ts", "mode": "100644", "type": "blob", "sha": "c9d8e7f6a5b4c3d2e1f0a9b8c7d6e5f4a3b2c1d0", "size": 312 } ], "truncated": false}Grants
Un grant vincula un principal con un repositorio o un owner mediante un permiso. Estos endpoints permiten leer, establecer y eliminar los grants asignados directamente a un resource, de modo que los cambios de acceso se pueden automatizar con scripts y revisar como si fueran código. Las operaciones de escritura reutilizan las comprobaciones que respaldan la Codebase permissions UI y registran los mismos audit events repository.access_changed y namespace.access_changed. Para conocer los tipos de principal, los dos niveles de permisos y cómo interactúan los grants a nivel de owner con los de repositorio, consulta la API de grants de Origin.
Listar los grants del repositorio
/v1/origin/repos/{ownerSlug}/{repoName}/grantsEnumera los usuarios, grupos y grupos del equipo propietario que tienen un permiso concedido directamente sobre un repositorio. No se incluyen los permisos heredados del propietario del repositorio.
Parámetros de ruta
ownerSlug cadena Obligatorio
repoName cadena Obligatorio
Parámetros de consulta
pageSize entero
pageToken cadena
next_page_token de una respuesta anterior. Vacío para la primera página. El pageSize de una solicitud posterior se aplica a esa página; omítelo para conservar el tamaño de página anterior.Campos de respuesta
grants array
pageSize permisos.grants[].user objeto
user, group o teamGroup está presente.grants[].user.id cadena
user_.grants[].user.email cadena
grants[].user.displayName cadena
grants[].user.handle cadena
@. Solo está presente mientras ese perfil sea visible públicamente; en caso contrario, se omite.grants[].group objeto
grants[].group.id cadena
grp_.grants[].teamGroup objeto
grants[].teamGroup.kind cadena
members, admins.grants[].permission cadena
read, write, admin, custom. custom indica una política personalizada, que Crear o actualizar permiso de repositorio no acepta.repository objeto
nextPageToken cadena
curl --request GET \ --url 'https://api.cursor.com/v1/origin/repos/{ownerSlug}/{repoName}/grants' \ --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN'Estructura de la respuesta:
{ "grants": [ { "group": { "id": "grp_01k2ja2000e0080000000000n2" }, "permission": "admin" }, { "teamGroup": { "kind": "admins" }, "permission": "admin" }, { "teamGroup": { "kind": "members" }, "permission": "write" }, { "user": { "id": "user_01k2ja2000e0080000000000c3", "email": "[email protected]" }, "permission": "read" } ], "repository": { "id": "repo_01k2ja2000e0080000000000q4", "name": "rocket", "owner": { "slug": "acme", "id": "ns_01k2ja2000e0080000000000p3", "type": "team" } }, "nextPageToken": ""}Crear o actualizar grant de repositorio
/v1/origin/repos/{ownerSlug}/{repoName}/grantsEstablece el permiso que un usuario, un grupo o el grupo del equipo propietario tiene directamente sobre un repositorio y reemplaza cualquier permiso otorgado antes de forma directa a ese principal. Repetir una concesión que el principal ya tiene se completa correctamente y no produce ningún cambio. El usuario debe ser un miembro activo del equipo u organización del propietario del repositorio. El grupo debe ser uno que pertenezca al equipo del propietario, o un grupo activo en la organización de ese equipo; de lo contrario, la solicitud devuelve FailedPrecondition (HTTP 400).
Parámetros de ruta
ownerSlug cadena Obligatorio
repoName cadena Obligatorio
Cuerpo de la solicitud
user objeto
user, group o teamGroup está presente.user.id cadena
user_.user.email cadena
user.displayName cadena
user.handle cadena
@. Solo está presente mientras ese perfil sea visible públicamente; en caso contrario, se omite.group objeto
group.id cadena
grp_.teamGroup objeto
teamGroup.kind cadena
members, admins.permission cadena Obligatorio
read, write, admin. custom devuelve InvalidArgument (HTTP 400); las políticas personalizadas quedan fuera de esta API.Campos de respuesta
user objeto
user, group o teamGroup está presente.user.id cadena
user_.user.email cadena
user.displayName cadena
user.handle cadena
@. Solo está presente mientras ese perfil sea visible públicamente; en caso contrario, se omite.group objeto
group.id cadena
grp_.teamGroup objeto
teamGroup.kind cadena
members, admins.permission cadena
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"}'Estructura de la respuesta:
{ "user": { "id": "user_01k2ja2000e0080000000000c3", "email": "[email protected]" }, "permission": "write"}Eliminar permiso de repositorio
/v1/origin/repos/{ownerSlug}/{repoName}/grantsElimina el permiso que un usuario, un grupo o un grupo del equipo propietario tiene directamente sobre un repositorio. Los permisos heredados del owner del repositorio no se ven afectados, por lo que un grupo del equipo propietario vuelve a su default a nivel de owner. Eliminar un permiso que el principal no tiene directamente se completa correctamente y sin cambios. El response body queda vacío.
Path Parameters
ownerSlug string Required
repoName string Required
Request Body
user object
user, group o teamGroup.user.id string
user_.user.email string
user.displayName string
user.handle string
@. Presente solo mientras ese perfil sea públicamente visible; en caso contrario, se omite.group object
group.id string
grp_.teamGroup object
teamGroup.kind string
members, admins.Campos de respuesta
Successful requests return no response body.
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" }}'Respuesta:
204 No ContentListar concesiones del espacio de nombres
/v1/origin/owners/{ownerSlug}/grantsEnumera quiénes han recibido acceso a un propietario: usuarios, grupos y los grupos integrados de administradores y miembros del equipo propietario. Cada concesión indica el permiso que otorga en todos los repositorios del propietario. No se incluyen las concesiones hechas en repositorios individuales; consúltalas en Lista de concesiones de repositorio.
Parámetros de ruta
ownerSlug cadena Obligatorio
Parámetros de consulta
pageSize entero
pageToken cadena
next_page_token de una respuesta anterior. Vacío para la primera página. Si se indica pageSize en una solicitud posterior, se aplica a esa página; omítelo para mantener el tamaño de página anterior.Campos de respuesta
grants array
pageSize permisos.grants[].user objeto
user, group o teamGroup está presente.grants[].user.id cadena
user_.grants[].user.email cadena
grants[].user.displayName cadena
grants[].user.handle cadena
@. Solo aparece mientras ese perfil sea visible públicamente; en caso contrario, se omite.grants[].group objeto
grants[].group.id cadena
grp_.grants[].teamGroup objeto
grants[].teamGroup.kind cadena
members, admins.grants[].permission cadena
PERMISSION_READ, PERMISSION_CONTRIBUTOR, PERMISSION_WRITE, PERMISSION_ADMIN, PERMISSION_CUSTOM. PERMISSION_CUSTOM indica una política personalizada, que Crear o actualizar grant de espacio de nombres no acepta.nextPageToken cadena
curl --request GET \ --url 'https://api.cursor.com/v1/origin/owners/{ownerSlug}/grants' \ --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN'Estructura de la respuesta:
{ "grants": [ { "group": { "id": "grp_01k2ja2000e0080000000000n2" }, "permission": "PERMISSION_ADMIN" }, { "teamGroup": { "kind": "admins" }, "permission": "PERMISSION_ADMIN" }, { "teamGroup": { "kind": "members" }, "permission": "PERMISSION_CONTRIBUTOR" }, { "user": { "id": "user_01k2ja2000e0080000000000c3", "email": "[email protected]" }, "permission": "PERMISSION_WRITE" } ], "nextPageToken": ""}Crear o actualizar grant de espacio de nombres
/v1/origin/owners/{ownerSlug}/grantsEstablece el permiso que un user, un group o el group del owning-team tiene directamente sobre un owner, y reemplaza cualquier permiso concedido antes directamente a ese principal. Repetir un grant que el principal ya tiene se completa correctamente y sin cambios. La solicitud devuelve FailedPrecondition (HTTP 400) cuando el user no es un miembro active del owning team o de su organization, cuando el group no pertenece a ese team ni es un group active en su organization, o cuando la operación de write dejaría al owner sin ningún admin.
Parámetros de ruta
ownerSlug cadena Obligatorio
Cuerpo de la solicitud
user objeto
user, group o teamGroup está presente.user.id cadena
user_.user.email cadena
user.displayName cadena
user.handle cadena
@. Solo está presente mientras ese perfil sea visible públicamente; en caso contrario, se omite.group objeto
group.id cadena
grp_.teamGroup objeto
teamGroup.kind cadena
members, admins.permission cadena Obligatorio
PERMISSION_READ, PERMISSION_CONTRIBUTOR, PERMISSION_WRITE, PERMISSION_ADMIN. PERMISSION_READ, PERMISSION_CONTRIBUTOR y PERMISSION_WRITE otorgan ese nivel sobre los repositorios internos del propietario, y PERMISSION_ADMIN administra al propietario en sí. PERMISSION_CUSTOM devuelve InvalidArgument (HTTP 400).Campos de respuesta
user objeto
user, group o teamGroup.user.id cadena
user_.user.email cadena
user.displayName cadena
user.handle cadena
@. Solo está presente mientras ese perfil sea visible públicamente; en caso contrario, se omite.group objeto
group.id cadena
grp_.teamGroup objeto
teamGroup.kind cadena
members, admins.permission cadena
curl --request POST \ --url 'https://api.cursor.com/v1/origin/owners/OWNER_SLUG/grants' \ --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN' \ --header 'Content-Type: application/json' \ --data '{ "user": { "id": "user_01k2ja2000e0080000000000c3" }, "permission": "PERMISSION_WRITE"}'Estructura de la respuesta:
{ "user": { "id": "user_01k2ja2000e0080000000000c3", "email": "[email protected]" }, "permission": "PERMISSION_WRITE"}Eliminar grant de espacio de nombres
/v1/origin/owners/{ownerSlug}/grantsElimina el permiso que un user, un group o un grupo del equipo propietario tiene directamente sobre un owner. Los grants por repositorio no se ven afectados. Eliminar un permiso que el principal no tiene directamente se completa correctamente y sin cambios; una eliminación que dejaría al owner sin ningún admin devuelve FailedPrecondition (HTTP 400). El cuerpo de respuesta está vacío.
parámetro de ruta
ownerSlug cadena obligatorio
cuerpo de solicitud
user objeto
user, group o teamGroup está presente.user.id cadena
user_.user.email cadena
user.displayName cadena
user.handle cadena
@. Solo está presente mientras ese perfil sea visible públicamente; en caso contrario, se omite.group objeto
group.id cadena
grp_.teamGroup objeto
teamGroup.kind cadena
members, admins.Campos de respuesta
Las solicitudes correctas no devuelven cuerpo de respuesta.
curl --request DELETE \ --url 'https://api.cursor.com/v1/origin/owners/OWNER_SLUG/grants' \ --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN' \ --header 'Content-Type: application/json' \ --data '{ "group": { "id": "grp_01k2ja2000e0080000000000n2" }}'Response:
204 No ContentEtiquetas
Una definición de etiqueta pertenece a un repositorio y se identifica por su nombre. La asignación de etiquetas a un pull request se realiza en una superficie independiente; consulta Establecer etiquetas de pull request.
Listar etiquetas
/v1/origin/repos/{ownerSlug}/{repoName}/labelsLista las etiquetas definidas en un repositorio, ordenadas por nombre.
Los tokens de página están vinculados al repositorio para el que se emitieron. Si se reutiliza un token con un repositorio distinto, o si el token tiene otro tipo de formato no válido, se devuelve InvalidArgument (HTTP 400).
Parámetros de ruta
ownerSlug cadena Obligatorio
repoName cadena Obligatorio
Parámetros de consulta
pageSize entero
pageToken cadena
nextPageToken de una respuesta anterior. Omítelo para la primera página. El pageSize de una solicitud posterior se aplica a esa página; omítelo para mantener el tamaño de página anterior.Campos de respuesta
labels array
labels[].id cadena
labels[].name cadena
labels[].color cadena
# inicial.labels[].description cadena
nextPageToken cadena
curl --request GET \ --url 'https://api.cursor.com/v1/origin/repos/OWNER_SLUG/REPO_NAME/labels' \ --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN'Estructura de la respuesta:
{ "labels": [ { "id": "lbl_01k2ja2000e0080000000000m1", "name": "bug", "color": "d73a4a", "description": "Something isn't working" } ]}Crear etiqueta
/v1/origin/repos/{ownerSlug}/{repoName}/labelsCrea una etiqueta en un repositorio.
Si otra etiqueta del repositorio ya usa un nombre, se devuelve AlreadyExists (HTTP 409 Conflict). Si color no tiene seis caracteres hexadecimales, name supera los 50 caracteres o description supera los 255 caracteres, se devuelve InvalidArgument (HTTP 400).
Parámetros de ruta
ownerSlug cadena Obligatorio
repoName cadena Obligatorio
Cuerpo de la solicitud
name cadena Obligatorio
color cadena Obligatorio
# inicial. Las mayúsculas se almacenan como minúsculas.description cadena
Campos de respuesta
id cadena
name cadena
color cadena
# inicial.description cadena
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"}'Estructura de la respuesta:
{ "id": "lbl_01k2ja2000e0080000000000m1", "name": "bug", "color": "d73a4a", "description": "Something isn't working"}Obtener etiqueta
/v1/origin/repos/{ownerSlug}/{repoName}/labels/{labelName}Devuelve una etiqueta de repositorio por su nombre.
Si el nombre no existe, devuelve 404. Si labelName está vacío, devuelve InvalidArgument (HTTP 400).
Parámetros de ruta
ownerSlug cadena Obligatorio
repoName cadena Obligatorio
labelName cadena Obligatorio
Campos de respuesta
id cadena
name cadena
color cadena
# inicial.description cadena
curl --request GET \ --url 'https://api.cursor.com/v1/origin/repos/OWNER_SLUG/REPO_NAME/labels/LABEL_NAME' \ --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN'Estructura de la respuesta:
{ "id": "lbl_01k2ja2000e0080000000000m1", "name": "bug", "color": "d73a4a", "description": "Something isn't working"}Eliminar etiqueta
/v1/origin/repos/{ownerSlug}/{repoName}/labels/{labelName}Elimina una etiqueta de un repositorio por su nombre. El cuerpo de la respuesta está vacío.
Al eliminar una etiqueta, también se elimina de todos los pull requests a los que estaba asignada. Un nombre desconocido devuelve 404. Un labelName vacío devuelve InvalidArgument (HTTP 400).
Parámetros de ruta
ownerSlug cadena Obligatorio
repoName cadena Obligatorio
labelName cadena Obligatorio
Campos de respuesta
Las solicitudes correctas no devuelven cuerpo de respuesta.
curl --request DELETE \ --url 'https://api.cursor.com/v1/origin/repos/OWNER_SLUG/REPO_NAME/labels/LABEL_NAME' \ --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN'Respuesta:
204 No ContentActualizar etiqueta
/v1/origin/repos/{ownerSlug}/{repoName}/labels/{labelName}Actualiza una etiqueta de repositorio identificada por su nombre actual.
Los campos omitidos no se modifican. Si se omiten los tres, la solicitud devuelve la etiqueta tal como está. Cambiar el nombre por uno que ya usa otra etiqueta devuelve AlreadyExists (HTTP 409 Conflict). Un labelName desconocido devuelve 404.
Parámetros de ruta
ownerSlug cadena Obligatorio
repoName cadena Obligatorio
labelName cadena Obligatorio
Cuerpo de la solicitud
name cadena
color cadena
# inicial. Omítelo para no modificarlo.description cadena
Campos de respuesta
id cadena
name cadena
color cadena
# inicial.description cadena
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"}'Estructura de la respuesta:
{ "id": "lbl_01k2ja2000e0080000000000m1", "name": "bug", "color": "b60205", "description": "Something isn't working"}Pull requests
Los pull requests cerrados o fusionados también pueden incluir closedAt, mergedAt y mergeCommitSha. Trate head.ref y base.ref como cadenas opacas de referencia de Origin; pueden ser nombres de rama cortos o valores refs/heads/… completos.
version es la última revisión numerada del pull request. Origin registra una nueva versión cuando se hace push de la cabecera, cuando el pull request se reapunta a otra base y cuando un pull request se reabre después de que su cabecera se haya movido mientras estaba cerrado, cada una con sus propios headSha, baseSha y estadísticas de diff. Una reapertura que registra una versión envía pull_request.head_ref.pushed, el mismo evento que envía un push. Que la rama base avance por su cuenta no registra nada, por lo que version.baseSha (y base.sha, que lo replica) es la punta de la base tal como se resolvió cuando se registró la versión y puede quedar por detrás de la punta actual de la rama hasta que se registre la siguiente versión. Consulte la punta actual de la rama con Get Git Ref.
mergeCommitSha es el commit que la fusión escribió en la rama base: se establece una vez fusionado y no está definido antes. La vista previa anterior a la fusión es la referencia pull/{pullNumber}/merge, un commit distinto; consulte Git data.
version.potentialMergeCommit indica el resultado de la fusión de prueba de Origin para esa versión: si está prepared, si se produjo un merge_conflict o si aún está unknown. Una vez preparada, también indica el sha del commit de fusión y el baseSha sobre el que se creó. Solo describe esa versión, por lo que sigue apareciendo incluso después de fusionar el pull request. Los payloads de webhook pull_request.* incluyen su estado en el momento del evento. Un evento solo espera a que termine la preparación durante un tiempo limitado, por lo que puede indicar unknown aunque una consulta posterior a Get Pull Request indique prepared; vuelva a consultar el pull request o espere al siguiente evento.
El verdict de la revisión puede ser approve, request_changes o comment. submittedAt no está presente en una revisión en borrador sin enviar. dismissal no está presente mientras el veredicto permanezca activo. Las revisiones descartadas siguen siendo visibles en los listados de revisiones. Las revisiones sustituidas automáticamente por una decisión más reciente incluyen un mensaje generado por el servidor.
Los comentarios exponen una referencia thread para agruparlos. Las solicitudes para crear comentarios siguen aceptando el parámetro escalar de comando threadId al responder. Resuelva o reabra un hilo con Actualizar hilo de pull request.
Listar solicitudes de incorporación
/v1/origin/repos/{ownerSlug}/{repoName}/pullsEnumera las solicitudes de extracción en un repositorio, opcionalmente filtradas por rama de origen, rama base, autor, rango de fecha de creación y estado. Cada solicitud de extracción incluye sus etiquetas asignadas.
Los resultados se ordenan por fecha de creación o por la última actualización, seleccionando con sortBy, mostrando primero los más recientes. Establece direction=asc para el orden inverso. Los tokens de página incorporan el orden y los filtros con los que se crearon, por lo que se rechaza cualquier token reproducido con un conjunto diferente de orden o filtros; reinicia la paginación cuando cualquiera de ellos cambie.
Parámetros de ruta
ownerSlug string Obligatorio
repoName string Obligatorio
Parámetros de consulta
head cadena
state string
open (el predeterminado), closed, merged, all. closed cubre todas las solicitudes de extracción que ya no están abiertas, incluidas las fusionadas; merged restringe al subconjunto fusionado. Cualquier otro valor devuelve InvalidArgument (HTTP 400).pageSize entero
pageToken string
nextPageToken de una respuesta anterior. Omítelo para la primera página. El pageSize de una solicitud posterior se aplica a esa página; omítelo para conservar el tamaño de página anterior.author string
pullRequests[].author.user.id, pullRequests[].author.app.id o pullRequests[].author.serviceAccount.id (user_…, app_… o sa_…), o la dirección de correo electrónico exacta de un usuario. La coincidencia de correo electrónico no distingue entre mayúsculas y minúsculas. Las aplicaciones y las cuentas de servicio no tienen una identidad de correo electrónico, por lo que solo se pueden seleccionar de esa manera autores que sean usuarios. Un autor sin solicitudes de incorporación de cambios devuelve una lista vacía, al igual que una dirección de correo electrónico que no corresponde a un único usuario. Cualquier otro valor, incluido el ID compartido origin-cursor-managed-actor, devuelve InvalidArgument (HTTP 400).base cadena
main) o una referencia totalmente calificada (refs/heads/main). Omítalo para listar en todas las ramas base.direction string
sortBy. "desc" es el valor predeterminado: con sortBy=created devuelve primero los más recientemente creados y con sortBy=updated los más recientemente actualizados. "asc" invierte cada uno. Cualquier otro valor devuelve InvalidArgument (HTTP 400).since string
2026-08-01T00:00:00Z. Devuelve solo las solicitudes de extracción creadas en ese instante o después. Una marca de tiempo no válida devuelve InvalidArgument (HTTP 400).until string
since. Devuelve solo las pull requests creadas en ese instante o antes. Una marca de tiempo malformada devuelve InvalidArgument (HTTP 400).sortBy string
created (orden de creación, valor predeterminado) o updated (momento de la última actualización). Cualquier otro valor devuelve InvalidArgument (HTTP 400).headSha string
head.sha en cada resultado para diferenciarlas. Los demás filtros siguen aplicándose y state tiene por defecto open, así que pasa state=all para incluir pull requests fusionadas y cerradas. Los SHA malformados, abreviados o desconocidos no coinciden con nada.stackId cadena
pullRequests[].stack.id. Devuelve solo los miembros de esa pila, en el orden de clasificación solicitado en lugar del orden de la pila; por tanto, reconstruya la pila a partir de stack.parentPullRequest de cada miembro. state sigue teniendo por defecto open, lo que excluye a los miembros fusionados; pase state=all para toda la pila. Un id bien formado que no nombre ninguna pila en este repositorio devuelve una lista vacía, y cualquier otro valor devuelve InvalidArgument (HTTP 400).Campos de respuesta
pullRequests array
pullRequests[].id cadena
pullRequests[].number string
pullRequests[].state string
pullRequests[].draft boolean
pullRequests[].merged boolean
pullRequests[].title string
pullRequests[].body string
pullRequests[].head objeto
pullRequests[].head.ref string
pullRequests[].head.sha string
pullRequests[].base objeto
pullRequests[].base.ref string
pullRequests[].base.sha string
pullRequests[].author objeto
pullRequests[].author.user objeto
pullRequests[].author.user.id string
pullRequests[].author.user.email string
pullRequests[].author.user.displayName string
pullRequests[].author.user.handle cadena
@. Solo está presente mientras ese perfil sea visible públicamente; en caso contrario, se omite.pullRequests[].author.app objeto
pullRequests[].author.app.id string
pullRequests[].author.app.displayName string
pullRequests[].author.serviceAccount objeto
pullRequests[].author.serviceAccount.id string
pullRequests[].createdAt string
pullRequests[].updatedAt cadena
pullRequests[].closedAt cadena
pullRequests[].mergedAt string
pullRequests[].mergeCommitSha string
pull/<number>/merge con Obtener una referencia de Git.pullRequests[].additions entero
pullRequests[].deletions entero
pullRequests[].changedFiles entero
pullRequests[].labels array
pullRequests[].labels[].id string
pullRequests[].labels[].name string
pullRequests[].labels[].color string
# inicial.pullRequests[].labels[].description string
pullRequests[].stack objeto
pullRequests[].stack.id string
stackId a Listar pull requests para consultar los demás miembros.pullRequests[].stack.parentPullRequest objeto
pullRequests[].stack.parentPullRequest.id cadena
pullRequests[].stack.parentPullRequest.number cadena
pullRequests[].stack.parentPullRequest.repository objeto
id, name y owner que el repository de una ejecución de comprobación. Las pilas nunca abarcan varios repositorios, por lo que este siempre es el propio repositorio de la solicitud de extracción.pullRequests[].version objeto
pullRequests[].version.number string
pullRequests[].version.headSha string
pullRequests[].version.baseSha string
pullRequests[].version.createdAt string
pullRequests[].version.potentialMergeCommit objeto
headSha con la punta de la rama base, junto con el estado de preparación de esa fusión. Está presente en todas las versiones. Solo describe esta versión y puede consultarse incluso después de que se fusione la pull request; es un commit distinto de mergeCommitSha. En una pull request apilada, la rama base es la de la pull request principal, por lo que la fusión de prueba solo incluye los cambios de esta pull request sobre esa rama.pullRequests[].version.potentialMergeCommit.state cadena
unknown, prepared, merge_conflict. unknown significa que la fusión de prueba aún no está preparada: la versión está pendiente de preparación, se agotó el tiempo de espera o la preparación falló. Cada nueva versión comienza con el estado unknown, por lo que nunca conserva el commit de otra versión. prepared significa que la fusión de prueba existe y que sha y baseSha la describen. merge_conflict significa que se produjo un conflicto al fusionar headSha en la punta de la rama base, por lo que no hay fusión de prueba. Es la condición que Obtener la posibilidad de fusión de una pull request indica como impedimento merge_conflict; al reabrir la pull request, se vuelve a preparar la versión. Trata cualquier valor no reconocido como unknown.pullRequests[].version.potentialMergeCommit.sha cadena
baseSha de este objeto y su segundo padre es el headSha de la versión. Presente solo cuando state es prepared. La referencia pull/{pullNumber}/merge apunta a él mientras esta versión sea la más reciente. Después de eso, sigue siendo legible por SHA a través de Obtener commit, pero no se puede recuperar por SHA a través de Git.pullRequests[].version.potentialMergeCommit.baseSha cadena
state es prepared. Puede ser más reciente que pullRequests[].version.baseSha, y Origin no la actualiza si la rama base simplemente avanza.nextPageToken string
curl --request GET \ --url 'https://api.cursor.com/v1/origin/repos/OWNER_SLUG/REPO_NAME/pulls' \ --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN'Estructura de la respuesta:
{ "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": "[email protected]" } }, "createdAt": "2026-08-01T09:30:00Z", "updatedAt": "2026-08-02T14:45:00Z", "additions": 128, "deletions": 46, "changedFiles": 5, "labels": [ { "id": "lbl_01k2ja2000e0080000000000m1", "name": "bug", "color": "d73a4a", "description": "Something isn't working" } ], "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" } } ]}Obtener solicitud de extracción
/v1/origin/repos/{ownerSlug}/{repoName}/pulls/{pullNumber}Devuelve una única solicitud de extracción, incluidas las etiquetas asignadas.
Las solicitudes de extracción cerradas o fusionadas pueden además incluir closedAt, mergedAt y mergeCommitSha. Trate head.ref y base.ref como cadenas de referencia opacas de origen; pueden ser nombres de rama cortos o valores totalmente cualificados refs/heads/….
Parámetros de ruta
ownerSlug string Obligatorio
repoName string Obligatorio
pullNumber string Obligatorio
Campos de respuesta
id string
number cadena
state string
draft boolean
merged boolean
title cadena
body string
head objeto
head.ref string
head.sha cadena
base objeto
base.ref cadena
base.sha string
author objeto
author.user objeto
author.user.id string
author.user.email string
author.user.displayName string
author.user.handle string
@. Solo está presente mientras ese perfil sea visible públicamente; se omite en caso contrario.author.app objeto
author.app.id string
author.app.displayName string
author.serviceAccount objeto
author.serviceAccount.id cadena
createdAt string
updatedAt string
closedAt cadena
mergedAt string
mergeCommitSha string
pull/<number>/merge con Obtener una referencia de Git.additions integer
deletions entero
changedFiles entero
labels array
labels[].id string
labels[].name string
labels[].color string
#.labels[].description string
stack objeto
stack.id cadena
stackId a Listar pull requests para leer a los demás miembros.stack.parentPullRequest objeto
stack.parentPullRequest.id cadena
stack.parentPullRequest.number cadena
stack.parentPullRequest.repository objeto
id, name y owner que el repository de una ejecución de comprobación. Las pilas nunca abarcan varios repositorios, por lo que siempre es el propio repositorio de la pull request.version objeto
version.number string
version.headSha cadena
version.baseSha cadena
version.createdAt string
version.potentialMergeCommit objeto
headSha con la punta de la rama base, y hasta dónde llegó su preparación. Está presente en todas las versiones. Describe solo esta versión y sigue siendo consultable después de que se fusione la solicitud de extracción; es un commit distinto de mergeCommitSha. En una solicitud de extracción apilada, la rama base es la rama de la solicitud principal, por lo que la fusión de prueba solo abarca los cambios de esta solicitud de extracción sobre esa rama.version.potentialMergeCommit.state cadena
unknown, prepared, merge_conflict. unknown significa que la fusión de prueba no está preparada: la versión está pendiente de preparación, o la preparación superó el tiempo de espera o falló. Cada nueva versión comienza como unknown, por lo que nunca lleva el commit de otra versión. prepared significa que la fusión de prueba existe y que sha y baseSha la describen. merge_conflict significa que se produjo un conflicto al fusionar headSha con la punta de la rama base, por lo que no hay fusión de prueba; es la condición que Obtener la capacidad de fusión de la solicitud de extracción indica como impedimento merge_conflict, y al reabrir la solicitud de extracción se prepara de nuevo la versión. Trate los valores no reconocidos como unknown.version.potentialMergeCommit.sha cadena
baseSha de este objeto y su segundo padre es el headSha de la versión. Solo está presente cuando state es prepared. La referencia pull/{pullNumber}/merge apunta a él mientras esta versión sea la más reciente. Después, se puede seguir consultando mediante su SHA a través de Obtener commit, pero no se puede obtener por SHA mediante Git.version.potentialMergeCommit.baseSha cadena
state es prepared. Puede ser más reciente que version.baseSha, y Origin no la actualiza si la rama base simplemente avanza.curl --request GET \ --url 'https://api.cursor.com/v1/origin/repos/OWNER_SLUG/REPO_NAME/pulls/PULL_NUMBER' \ --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN'Estructura de la respuesta:
{ "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": "[email protected]" } }, "createdAt": "2026-08-01T09:30:00Z", "updatedAt": "2026-08-02T14:45:00Z", "additions": 128, "deletions": 46, "changedFiles": 5, "labels": [ { "id": "lbl_01k2ja2000e0080000000000m1", "name": "bug", "color": "d73a4a", "description": "Something isn't working" } ], "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" } }}Crear solicitud de extracción
/v1/origin/repos/{ownerSlug}/{repoName}/pullsCrea una solicitud de extracción de head a base.
Opcional: parent_pull_number apila este cambio sobre otra solicitud de extracción abierta o en borrador en el mismo repositorio.
Un title de más de 256 caracteres o un body de más de 65.536 caracteres devuelve InvalidArgument (HTTP 400). Ambos límites cuentan puntos de código Unicode.
Una head sin historial en común con base devuelve InvalidArgument (HTTP 400) y no crea nada. Si un push posterior deja la head de un pull request abierto sin relación con su base, Origin cierra el pull request y emite pull_request.closed; un push relacionado posterior no lo reabre.
Parámetros de ruta
ownerSlug string Obligatorio
repoName string Obligatorio
Cuerpo de la solicitud
title string Obligatorio
body string
head string Obligatorio
base string Obligatorio
InvalidArgument (HTTP 400).draft boolean
parentPullRequest objeto
clear devuelve InvalidArgument (HTTP 400).parentPullRequest.number string
parentPullRequest.id cadena
id.Campos de la respuesta
id string
number string
state cadena
draft boolean
merged boolean
title string
body string
head objeto
head.ref cadena
head.sha cadena
base objeto
base.ref string
base.sha string
author objeto
author.user objeto
author.user.id cadena
author.user.email string
author.user.displayName string
author.user.handle string
@. Solo está presente mientras ese perfil sea visible públicamente; en caso contrario, se omite.author.app objeto
author.app.id string
author.app.displayName string
author.serviceAccount objeto
author.serviceAccount.id string
createdAt cadena
updatedAt string
closedAt cadena
mergedAt cadena
mergeCommitSha string
pull/<number>/merge con Obtener una referencia de Git.additions entero
deletions entero
changedFiles entero
labels arreglo
labels[].id string
labels[].name string
labels[].color string
# inicial.labels[].description cadena
stack objeto
stack.id cadena
stackId a Enumerar solicitudes de incorporación de cambios para consultar los demás miembros.stack.parentPullRequest objeto
stack.parentPullRequest.id cadena
stack.parentPullRequest.number cadena
stack.parentPullRequest.repository objeto
id, name y owner que el repository de una ejecución de comprobación. Las pilas nunca abarcan varios repositorios, por lo que este siempre es el repositorio de la propia solicitud de extracción.version objeto
version.number string
version.headSha cadena
version.baseSha string
version.createdAt string
version.potentialMergeCommit objeto
headSha con la punta de la rama base, junto con el grado de avance de su preparación. Está presente en todas las versiones. Describe únicamente esta versión y puede consultarse incluso después de que se fusione el pull request; es un commit distinto de mergeCommitSha. En un pull request apilado, la rama base es la rama del elemento padre, por lo que la fusión de prueba solo incluye los cambios de este pull request sobre esa rama.version.potentialMergeCommit.state cadena
unknown, prepared, merge_conflict. unknown significa que la fusión de prueba no está preparada: la versión está pendiente de preparación, o la preparación superó el tiempo de espera o falló. Cada versión nueva comienza con el valor unknown, por lo que nunca contiene el commit de otra versión. prepared significa que la fusión de prueba existe y que sha y baseSha la describen. merge_conflict significa que se produjo un conflicto al fusionar headSha con la punta de la rama base, por lo que no hay fusión de prueba; esta es la condición que Obtener la capacidad de fusión de la solicitud de extracción indica como impedimento merge_conflict, y al reabrir la solicitud de extracción se vuelve a preparar la versión. Trate cualquier valor no reconocido como unknown.version.potentialMergeCommit.sha cadena
baseSha de este objeto y el segundo, el headSha de la versión. Solo está presente cuando state es prepared. La referencia pull/{pullNumber}/merge apunta a este commit mientras esta versión sea la más reciente. Después, sigue pudiéndose consultar por SHA mediante Obtener un commit, pero no se puede recuperar por SHA mediante Git.version.potentialMergeCommit.baseSha cadena
state es prepared. Puede ser más reciente que version.baseSha, y Origin no la actualiza cuando la rama base simplemente avanza.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}'Estructura de la respuesta:
{ "id": "pr_01k2ja2000e0080000000000d4", "number": "17", "state": "open", "draft": false, "merged": false, "title": "Add launch telemetry", "body": "Adds structured launch telemetry to the ignition path.", "head": { "ref": "add-telemetry", "sha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4" }, "base": { "ref": "main", "sha": "3b1f9c2d8a7e6f5049c8b7a6d5e4f3a2b1c0d9e8" }, "author": { "user": { "id": "user_01k2ja2000e0080000000000c3", "email": "[email protected]" } }, "createdAt": "2026-08-01T09:30:00Z", "updatedAt": "2026-08-02T14:45:00Z", "additions": 128, "deletions": 46, "changedFiles": 5, "labels": [ { "id": "lbl_01k2ja2000e0080000000000m1", "name": "bug", "color": "d73a4a", "description": "Something isn't working" } ], "version": { "number": "3", "headSha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4", "baseSha": "3b1f9c2d8a7e6f5049c8b7a6d5e4f3a2b1c0d9e8", "createdAt": "2026-08-01T09:30:00Z" }}Actualizar solicitud de extracción
/v1/origin/repos/{ownerSlug}/{repoName}/pulls/{pullNumber}Actualiza el título, el cuerpo, la rama base, la rama padre de la pila y/o el estado del ciclo de vida de una solicitud de extracción.
Los campos omitidos permanecen sin cambios. Los campos presentes se aplican en este orden: metadatos, luego reabrir/borrador/listo para revisión, luego la base, luego el padre de la pila y, por último, cerrar. El cierre se ejecuta al final para que un cambio de destino en la misma solicitud aún pueda ver un cambio abierto; la reapertura se ejecuta antes de cambiar la base para que se pueda cambiar el destino de una solicitud de incorporación cerrada; el padre de la pila se ejecuta después de la base para que un padre explícito prevalezca sobre el que se deriva de un cambio de base. Si falla un paso posterior, es posible que los pasos anteriores ya se hayan confirmado.
Un title de más de 256 caracteres, o un body de más de 65.536 caracteres, devuelve InvalidArgument (HTTP 400). Ambos límites cuentan puntos de código Unicode.
Parámetros de ruta
ownerSlug string Obligatorio
repoName string Obligatorio
pullNumber string Obligatorio
Cuerpo de la solicitud
title string
body cadena
state cadena
"open" o "closed". "closed" cierra la solicitud de extracción. "open" sin draft: true la marca como lista para revisión, incluida la publicación de un borrador existente. Al reabrir una solicitud de extracción cuyo head cambió mientras estaba cerrada, se registra una nueva version y se envía pull_request.head_ref.pushed. El estado fusionado no se puede modificar; usa MergePullRequest.draft boolean
true marca la solicitud de extracción como borrador; false la marca como lista para revisión (y la reabre si actualmente está cerrada, lo que puede registrar una nueva version). Se ignora cuando state es "closed".base string
InvalidArgument (HTTP 400).parentPullRequest objeto
number o id apilan esta solicitud de extracción en ese padre, reemplazando cualquier padre actual, y clear elimina el padre. Omita el campo para dejar la pila sin cambios. Un selector vacío, clear: false o más de un miembro devuelve InvalidArgument (HTTP 400). Esto es solo una asociación: no se reescribe ninguna rama y base solo se vuelve a dirigir si usted también lo envía. Origin lo aplica después de base, por lo que un padre explícito prevalece sobre el que se deriva de un cambio de base.parentPullRequest.number cadena
parentPullRequest.id string
id.parentPullRequest.clear boolean
true.Campos de respuesta
id string
number string
state cadena
draft boolean
merged booleano
title string
body cadena
head objeto
head.ref string
head.sha string
base objeto
base.ref string
base.sha string
author objeto
author.user objeto
author.user.id string
author.user.email string
author.user.displayName string
author.user.handle string
@. Solo está presente mientras ese perfil sea visible públicamente; se omite en caso contrario.author.app objeto
author.app.id string
author.app.displayName string
author.serviceAccount objeto
author.serviceAccount.id string
createdAt string
updatedAt string
closedAt cadena
mergedAt string
mergeCommitSha string
pull/<number>/merge con Obtener una referencia de Git.additions entero
deletions entero
changedFiles entero
labels arreglo
labels[].id string
labels[].name string
labels[].color string
# al inicio.labels[].description string
stack objeto
stack.id cadena
stackId a List Pull Requests para consultar a los demás miembros.stack.parentPullRequest objeto
stack.parentPullRequest.id string
stack.parentPullRequest.number string
stack.parentPullRequest.repository objeto
id, name y owner que el repository de una ejecución de comprobación. Los stacks nunca abarcan varios repositorios, por lo que este siempre es el repositorio de la propia solicitud de incorporación de cambios.version objeto
version.number cadena
version.headSha cadena
version.baseSha string
version.createdAt string
version.potentialMergeCommit objeto
headSha con la punta de la rama base, junto con el estado de su preparación. Está presente en todas las versiones. Describe solo esta versión y sigue siendo consultable después de que se fusione la solicitud de extracción; es un commit distinto de mergeCommitSha. En una solicitud de extracción apilada, la rama base es la rama del padre, por lo que la fusión de prueba solo incluye los cambios de esta solicitud de extracción sobre ella.version.potentialMergeCommit.state cadena
unknown, prepared, merge_conflict. unknown significa que la fusión de prueba no está preparada: la versión está a la espera de prepararse, o la preparación falló o agotó el tiempo de espera. Toda versión nueva comienza como unknown, por lo que nunca incluye el commit de otra versión. prepared significa que la fusión de prueba existe y que sha y baseSha la describen. merge_conflict significa que fusionar headSha sobre la punta de la rama base generó un conflicto, por lo que no hay fusión de prueba; es la condición que Get Pull Request Mergeability informa como un bloqueo merge_conflict, y al reabrir la pull request se vuelve a preparar la versión. Trata cualquier valor no reconocido como unknown.version.potentialMergeCommit.sha cadena
baseSha de este objeto y su segundo padre es el headSha de la versión. Solo está presente cuando state es prepared. La referencia pull/{pullNumber}/merge apunta a ese commit mientras esta versión sea la más reciente. Después, se puede consultar por SHA mediante Obtener commit, pero no se puede obtener por SHA a través de Git.version.potentialMergeCommit.baseSha cadena
state es prepared. Puede ser más reciente que version.baseSha, y Origin no la actualiza cuando la rama base simplemente avanza.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"}'Estructura de la respuesta:
{ "id": "pr_01k2ja2000e0080000000000d4", "number": "17", "state": "open", "draft": false, "merged": false, "title": "Add launch telemetry", "body": "Adds structured launch telemetry to the ignition path.", "head": { "ref": "add-telemetry", "sha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4" }, "base": { "ref": "main", "sha": "3b1f9c2d8a7e6f5049c8b7a6d5e4f3a2b1c0d9e8" }, "author": { "user": { "id": "user_01k2ja2000e0080000000000c3", "email": "[email protected]" } }, "createdAt": "2026-08-01T09:30:00Z", "updatedAt": "2026-08-02T14:45:00Z", "additions": 128, "deletions": 46, "changedFiles": 5, "labels": [ { "id": "lbl_01k2ja2000e0080000000000m1", "name": "bug", "color": "d73a4a", "description": "Something isn't working" } ], "version": { "number": "3", "headSha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4", "baseSha": "3b1f9c2d8a7e6f5049c8b7a6d5e4f3a2b1c0d9e8", "createdAt": "2026-08-01T09:30:00Z" }}Listar comentarios de solicitudes de extracción
/v1/origin/repos/{ownerSlug}/{repoName}/pulls/{pullNumber}/commentsEnumera todos los comentarios de una solicitud de extracción en orden cronológico, opcionalmente acotados a una ventana de tiempo de creación. Cada comentario incluye su hilo completo: id, ancla del diff y estado de resolución. Agrupa la respuesta plana por thread.id sin necesidad de una segunda solicitud.
Los tokens de página incorporan los filtros con los que se emitieron, por lo que se rechaza un token reutilizado con filtros distintos; reinicia la paginación cuando cambie un filtro.
Parámetros de ruta
ownerSlug string Obligatorio
repoName string Obligatorio
pullNumber string Obligatorio
Parámetros de consulta
pageSize entero
pageToken string
nextPageToken de una respuesta anterior. Omítalo en la primera página. El pageSize en una solicitud posterior se aplica a esa página; omítalo para conservar el tamaño de página anterior.since string
2026-08-01T00:00:00Z. Devuelve únicamente los comentarios creados en ese instante o después. Una marca de tiempo mal formada devuelve InvalidArgument (HTTP 400).until string
since. Devuelve solo los comentarios creados en ese instante o antes. Una marca de tiempo no válida devuelve InvalidArgument (HTTP 400).threadIds array
InvalidArgument (HTTP 400).Campos de respuesta
comments array
comments[].id string
comments[].thread objeto
comments[].thread.id string
comments[].thread.version objeto
comments[].thread.version.number string
comments[].thread.version.headSha cadena
comments[].thread.version.baseSha cadena
comments[].thread.path string
comments[].thread.side string
left, right. No se establece para hilos de discusión general.comments[].thread.startLine entero
side del archivo. 0 para hilos a nivel de archivo y de discusión general.comments[].thread.endLine entero
0 cuando el ancla está en una sola línea o no tiene rango de líneas.comments[].thread.resolvedAt string
comments[].thread.createdAt string
comments[].thread.updatedAt string
comments[].body string
comments[].author objeto
comments[].author.user objeto
comments[].author.user.id cadena
comments[].author.user.email string
comments[].author.user.displayName string
comments[].author.user.handle string
@. Presente solo mientras ese perfil sea visible públicamente; se omite en caso contrario.comments[].author.app objeto
comments[].author.app.id string
comments[].author.app.displayName string
comments[].author.serviceAccount objeto
comments[].author.serviceAccount.id string
comments[].createdAt cadena
comments[].updatedAt string
pullRequest objeto
pullRequest.id string
pullRequest.number cadena
pullRequest.repository objeto
pullRequest.repository.id string
pullRequest.repository.name string
pullRequest.repository.owner objeto
pullRequest.repository.owner.slug string
pullRequest.repository.owner.id string
pullRequest.repository.owner.type string
team, user. Se omite si se desconoce.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'Estructura de la respuesta:
{ "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": "[email protected]" } }, "createdAt": "2026-08-01T09:30:00Z", "updatedAt": "2026-08-02T14:45:00Z" } ], "pullRequest": { "id": "pr_01k2ja2000e0080000000000d4", "number": "17", "repository": { "id": "repo_01k2ja2000e0080000000000q4", "name": "rocket", "owner": { "slug": "acme", "id": "ns_01k2ja2000e0080000000000p3", "type": "team" } } }}Obtener comentario de pull request
/v1/origin/repos/{ownerSlug}/{repoName}/pulls/comments/{commentId}Devuelve un único comentario de pull request por su identificador estable de Origin. Un comentario que esté fuera del repositorio autorizado, o un comentario de revisión pendiente que no sea visible para quien realiza la llamada, devuelve 404.
Parámetros de ruta
ownerSlug string Obligatorio
repoName string Obligatorio
commentId string Obligatorio
Campos de respuesta
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. No establecido para los hilos de discusión general.thread.startLine entero
side del archivo. 0 para hilos a nivel de archivo y de discusión general.thread.endLine integer
0 cuando el ancla abarca una sola línea o no tiene rango de líneas.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
@. Presente solo mientras ese perfil sea visible públicamente; se omite en caso contrario.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'Estructura de la respuesta:
{ "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": "[email protected]" } }, "createdAt": "2026-08-01T09:30:00Z", "updatedAt": "2026-08-02T14:45:00Z"}Eliminar comentario de pull request
/v1/origin/repos/{ownerSlug}/{repoName}/pulls/comments/{commentId}Elimina un comentario de pull request mediante su ID estable de Origin. El cuerpo de respuesta está vacío.
El autor del comentario siempre puede eliminarlo. Cualquier otra persona que realice la llamada debe tener acceso de escritura al repositorio, que concede repository:contents:write; de lo contrario, recibe PermissionDenied (HTTP 403). Eliminar el último comentario de un hilo elimina el hilo; eliminar cualquier otro comentario, incluido el que inicia el hilo, mantiene el hilo y sus comentarios restantes. La resolución del hilo no es un requisito. Las reacciones al comentario y su historial de ediciones se eliminan junto con él.
Un ID desconocido, un comentario ya eliminado y un comentario de otro repositorio devuelven 404. Un ID con formato incorrecto devuelve InvalidArgument (HTTP 400).
Parámetros de ruta
ownerSlug cadena Obligatorio
repoName cadena Obligatorio
commentId cadena Obligatorio
Campo de respuesta
Las solicitudes correctas no devuelven cuerpo de respuesta.
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'Respuesta:
204 No ContentCrear comentario en un pull request
/v1/origin/repos/{ownerSlug}/{repoName}/pulls/{pullNumber}/commentsCrea un comentario en una solicitud de extracción (pull request) de Origin. El comentario se dirige exactamente a una de cuatro opciones: threadId responde a un hilo existente, ya sea de discusión general o en línea; inline abre un nuevo hilo anclado a un rango de líneas en el diff de la versión de la solicitud de extracción; file abre un nuevo hilo sobre un archivo completo en ese diff; no proporcionar ninguno de ellos abre un nuevo hilo de discusión general. Los cuerpos con más de 65.536 caracteres se rechazan con InvalidArgument (HTTP 400).
Un ancla inline debe hacer referencia al diff de la versión. El path debe formar parte de ese diff, y el side debe tener contenido allí, por lo que anclar left en un archivo añadido o right en un archivo eliminado se rechaza con InvalidArgument (HTTP 400). Cualquier línea de un archivo modificado sirve como ancla, y el rango no está restringido a los hunks del diff. El rango debe encajar en el archivo del lado anclado, que left lee en el commit base y right en el head: un rango que sobrepase la última línea se rechaza con InvalidArgument (HTTP 400). Origin nunca recurre a un comentario de discusión general cuando un ancla es inválido.
Un ancla file solo contiene la ruta. Origin determina el lado según el tipo de cambio del archivo: usa la versión base para los archivos eliminados y la versión head en los demás casos, y lo devuelve en thread.side. En caso de eliminación, envíe la ruta del archivo eliminado; para cualquier otro cambio, envíe la ruta head. Se rechaza una ruta que no esté incluida en el diff con InvalidArgument (HTTP 400); también se rechaza la ruta de origen de un archivo renombrado antes del cambio de nombre.
Parámetros de ruta
ownerSlug string Obligatorio
repoName string Obligatorio
pullNumber string Obligatorio
Cuerpo de la solicitud
body string Obligatorio
threadId string
versionNumber.inline object
threadId.inline.path string Obligatorio
inline.side string Obligatorio
left para la versión base del archivo, right para la versión más reciente.inline.startLine entero Obligatorio
side del archivo. El rango no debe extenderse más allá del final de ese archivo.inline.endLine integer
startLine. Omítala para un ancla de una sola línea.file object
threadId ni con inline.file.path string Obligatorio
versionNumber string
0 o sin establecer significa la versión más reciente en el momento de la llamada. Solo tiene sentido para hilos nuevos.Campos de respuesta
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. No establecido para los hilos de discusión general.thread.startLine integer
side del archivo. 0 para hilos a nivel de archivo y de discusión general.thread.endLine entero
0 cuando el ancla abarca una sola línea o no tiene rango de líneas.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
@. Presente solo mientras ese perfil sea visible públicamente; se omite en caso contrario.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?"}'Estructura de la respuesta:
{ "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": "[email protected]" } }, "createdAt": "2026-08-01T09:30:00Z", "updatedAt": "2026-08-02T14:45:00Z"}Actualizar comentario de solicitud de extracción
/v1/origin/repos/{ownerSlug}/{repoName}/pulls/comments/{commentId}Actualiza un comentario de un pull request mediante su id estable de Origin.
Reemplaza el cuerpo del comentario. El comentario debe pertenecer al repositorio indicado en la ruta, ser visible para el llamador y haber sido creado por ese mismo llamador. Los comentarios de otros repositorios y los comentarios ocultos pendientes de revisión devuelven 404; un comentario visible que pertenece a otro actor devuelve 403. Los cuerpos de más de 65.536 caracteres se rechazan con InvalidArgument (HTTP 400).
Parámetros de ruta
ownerSlug string Obligatorio
repoName string Obligatorio
commentId string Obligatorio
Cuerpo de la solicitud
body string Obligatorio
Campos de respuesta
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. No se establece para hilos de discusión general.thread.startLine entero
side del archivo. 0 para hilos a nivel de archivo y de discusión general.thread.endLine entero
0 cuando el ancla es una sola línea o no tiene rango de líneas.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
@. Está presente solo mientras ese perfil sea visible públicamente; en caso contrario, se omite.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?"}'Estructura de la respuesta:
{ "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": "[email protected]" } }, "createdAt": "2026-08-01T09:30:00Z", "updatedAt": "2026-08-02T14:45:00Z"}Actualizar el hilo del pull request
/v1/origin/repos/{ownerSlug}/{repoName}/pulls/threads/{threadId}Resuelve o reabre un hilo de comentarios de una solicitud de incorporación de cambios y devuelve el estado actualizado del hilo. Resolver un hilo ya resuelto, o reabrir uno que ya está abierto, no tiene ningún efecto.
El hilo debe pertenecer al repositorio indicado en la ruta; un hilo almacenado en otro repositorio devuelve 404. Responder a un hilo resuelto con Create Pull Request Comment está permitido y no lo reabre.
Parámetros de ruta
ownerSlug string Obligatorio
repoName string Obligatorio
threadId string Obligatorio
Cuerpo de la solicitud
resolved boolean Obligatorio
true resuelve el hilo; false lo reabre.Campos de respuesta
id string
version object
version.number string
version.headSha string
version.baseSha string
path string
side string
left, right. Sin establecer en los hilos de discusión general.startLine entero
side del archivo. 0 para threads a nivel de archivo y de discusión general.endLine entero
0 when the anchor is a single line or has no line range.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}'Estructura de la respuesta:
{ "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"}Listar los commits de un pull request
/v1/origin/repos/{ownerSlug}/{repoName}/pulls/{pullNumber}/commitsEnumera los commits de un pull request.
Devuelve los commits de la solicitud de incorporación de cambios como objetos Commit con datos limitados (sin stats). De forma predeterminada, se devuelven 30 resultados y el máximo es 100, con un máximo de 250 commits visibles en total. Un token de página fija la versión de la solicitud de incorporación de cambios y el cursor de commits; si un token ya no coincide con el head o la base actuales, se devuelve 400.
Parámetros de ruta
ownerSlug string Obligatorio
repoName string Obligatorio
pullNumber string Obligatorio
Parámetros de consulta
pageSize entero
pageToken cadena
next_page_token de una respuesta anterior. Vacío para la primera página. El token está vinculado al repositorio, la versión del pull request y el desplazamiento del commit. pageSize en una solicitud posterior se aplica a esa página; omítelo para mantener el tamaño de página anterior.Campos de respuesta
commits array
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 array
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'Estructura de la respuesta:
{ "commits": [ { "sha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4", "commit": { "author": { "name": "Jane Doe", "email": "[email protected]", "date": "2026-08-01T09:30:00Z" }, "committer": { "name": "Jane Doe", "email": "[email protected]", "date": "2026-08-01T09:30:00Z" }, "message": "Add launch telemetry", "tree": { "sha": "a7b6c5d4e3f2a1b0c9d8e7f6a5b4c3d2e1f0a9b8" } }, "parents": [ { "sha": "3b1f9c2d8a7e6f5049c8b7a6d5e4f3a2b1c0d9e8" } ], "stats": { "additions": 128, "deletions": 46, "total": 174 } } ]}Listar archivos del pull request
/v1/origin/repos/{ownerSlug}/{repoName}/pulls/{pullNumber}/filesEnumera los archivos modificados en una solicitud de extracción.
Devuelve el nombre del archivo, el estado, el recuento de líneas, el parche y, de forma opcional, el nombre del archivo anterior. De forma predeterminada, los resultados incluyen 30 archivos, con un máximo de 100. Un token de página fija la versión de la solicitud de incorporación de cambios y el cursor de archivos; un token que ya no coincide con el head o la base actuales devuelve 400.
Parámetros de ruta
ownerSlug string Obligatorio
repoName string Obligatorio
pullNumber string Obligatorio
Parámetros de consulta
pageSize entero
pageToken string
next_page_token de una respuesta anterior. Vacío en la primera página. El token está vinculado al repositorio, a la versión del pull request y al cursor de archivos modificados. El pageSize de una solicitud posterior se aplica a esa página; omítelo para conservar el tamaño de página anterior.Campos de respuesta
files array
files[].filename string
files[].status string
files[].additions entero
files[].deletions entero
files[].changes entero
files[].patch cadena
files[].previousFilename string
nextPageToken cadena
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'Estructura de la respuesta:
{ "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" } ]}Listar etiquetas de pull requests
/v1/origin/repos/{ownerSlug}/{repoName}/pulls/{pullNumber}/labelsEnumera todas las etiquetas asignadas a un pull request, ordenadas por nombre.
La respuesta incluye la lista completa de etiquetas asignadas, no una página de resultados, por lo que este endpoint no admite parámetros de paginación. Un pull request puede tener como máximo 100 etiquetas. Un pull request inexistente devuelve 404.
Parámetros de ruta
ownerSlug string Obligatorio
repoName string Obligatorio
pullNumber string Obligatorio
Campos de respuesta
labels array
labels[].id string
labels[].name string
labels[].color string
# inicial.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'Estructura de la respuesta:
{ "labels": [ { "id": "lbl_01k2ja2000e0080000000000m1", "name": "bug", "color": "d73a4a", "description": "Something isn't working" } ]}Establecer etiquetas del pull request
/v1/origin/repos/{ownerSlug}/{repoName}/pulls/{pullNumber}/labelsReemplaza todas las etiquetas asignadas al pull request por las etiquetas que especifique.
Una lista vacía elimina todas las etiquetas asignadas. Las etiquetas ya deben existir en el repositorio; un nombre desconocido o un pull request desconocido devuelve 404. Un pull request puede tener como máximo 100 etiquetas, por lo que indicar más de 100 devuelve FailedPrecondition (HTTP 400). La respuesta enumera las etiquetas asignadas después del reemplazo, ordenadas por nombre.
Parámetros de ruta
ownerSlug string Obligatorio
repoName string Obligatorio
pullNumber string Obligatorio
Cuerpo de la solicitud
labels array
Campos de respuesta
labels array
id, name, color y 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" ]}'Estructura de la respuesta:
{ "labels": [ { "id": "lbl_01k2ja2000e0080000000000m1", "name": "bug", "color": "d73a4a", "description": "Something isn't working" } ]}Añadir etiquetas a un pull request
/v1/origin/repos/{ownerSlug}/{repoName}/pulls/{pullNumber}/labelsAñade etiquetas de repositorio existentes a un pull request.
Las etiquetas ya asignadas al pull request permanecen asignadas. Las etiquetas deben existir ya en el repositorio; un nombre desconocido o un pull request desconocido devuelve 404. La solicitud debe incluir entre 1 y 100 etiquetas, y un pull request puede tener como máximo 100 etiquetas en total, por lo que una solicitud que supere ese límite devuelve FailedPrecondition (HTTP 400). La respuesta enumera las etiquetas que indicó, no el conjunto completo del pull request; lea el conjunto completo con Listar etiquetas de pull requests.
Parámetros de ruta
ownerSlug string Obligatorio
repoName string Obligatorio
pullNumber string Obligatorio
Cuerpo de la solicitud
labels array Obligatorio
Campos de respuesta
labels array
id, name, color y 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" ]}'Estructura de la respuesta:
{ "labels": [ { "id": "lbl_01k2ja2000e0080000000000m1", "name": "bug", "color": "d73a4a", "description": "Something isn't working" } ]}Eliminar todas las etiquetas de los pull requests
/v1/origin/repos/{ownerSlug}/{repoName}/pulls/{pullNumber}/labelsElimina todas las etiquetas de un pull request.
La solicitud se realiza correctamente cuando el pull request no tiene etiquetas. Un pull request desconocido devuelve 404. El cuerpo de la respuesta está vacío.
Parámetros de ruta
ownerSlug string Obligatorio
repoName string Obligatorio
pullNumber string Obligatorio
Campos de respuesta
Las solicitudes correctas no devuelven cuerpo de respuesta.
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'Respuesta:
204 No ContentEliminar etiqueta del pull request
/v1/origin/repos/{ownerSlug}/{repoName}/pulls/{pullNumber}/labels/{labelName}Elimina una etiqueta de un pull request.
Si la etiqueta no está asignada al pull request, se devuelve un 404, al igual que si el pull request es desconocido. La respuesta incluye las etiquetas restantes del pull request, ordenadas por nombre.
Parámetros de ruta
ownerSlug string Obligatorio
repoName string Obligatorio
pullNumber string Obligatorio
labelName string Obligatorio
Campos de respuesta
labels array
id, name, color y 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'Estructura de la respuesta:
{ "labels": [ { "id": "lbl_01k2ja2000e0080000000000m1", "name": "bug", "color": "d73a4a", "description": "Something isn't working" } ]}Fusionar pull request
/v1/origin/repos/{ownerSlug}/{repoName}/pulls/{pullNumber}/mergeFusiona una solicitud de incorporación de cambios en su rama base.
En el caso de un pull request apilado, fusiona todo el prefijo desde la raíz hasta el destino que termina en este número de pull, no solo este pull. Solo se admite en repositorios Origin nativos; se rechazan los repositorios replicados.
La fusión integra el commit de cabecera de la última version del pull request. Si la rama de cabecera ha avanzado más allá de ese commit, por ejemplo, porque se integraron cambios enviados mediante push que Origin aún no ha registrado como una nueva versión, la solicitud devuelve Aborted (HTTP 409 Conflict), la misma respuesta que para un expectedHeadSha obsoleto, y no se realiza ninguna fusión. Vuelve a intentarlo cuando Obtener un pull request indique la nueva cabecera en version.headSha.
Parámetros de ruta
ownerSlug string Obligatorio
repoName string Obligatorio
pullNumber string Obligatorio
Cuerpo de la solicitud
expectedHeadSha string
ABORTED (HTTP 409 Conflict) y no se realiza ninguna fusión. Los valores que no sean un SHA completo de commit se rechazan con InvalidArgument (HTTP 400). Omítelo para fusionar la referencia actual, sea la que sea. No se evalúa cuando el pull request ya está fusionado, en cuyo caso devuelve un éxito idempotente.mergeMethod string
merge, que crea un commit de fusión, y squash, que crea un único commit squash. Un método que el repositorio no permita se rechazará con FailedPrecondition (HTTP 400), y cualquier otro valor con InvalidArgument (HTTP 400). Omítelo para usar el valor predeterminado del repositorio: un commit de fusión cuando el repositorio lo permita; en caso contrario, un squash; y un squash cuando la rama base requiera un historial lineal.Campos de respuesta
mergeCommitSha string
pull/<number>/merge con Obtener referencia de Git.mergedPullNumbers array
pullRequest object
pullRequest.id string
pullRequest.number string
pullRequest.state string
pullRequest.draft booleano
pullRequest.merged boolean
pullRequest.title string
pullRequest.body string
pullRequest.head objeto
pullRequest.head.ref string
pullRequest.head.sha string
pullRequest.base objeto
pullRequest.base.ref string
pullRequest.base.sha string
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
@. Solo está presente mientras ese perfil sea visible públicamente; en caso contrario, se omite.pullRequest.author.app object
pullRequest.author.app.id string
pullRequest.author.app.displayName string
pullRequest.author.serviceAccount objeto
pullRequest.author.serviceAccount.id string
pullRequest.createdAt string
pullRequest.updatedAt string
pullRequest.closedAt string
pullRequest.mergedAt string
pullRequest.mergeCommitSha string
pull/<number>/merge con Obtener una referencia de Git.pullRequest.additions entero
pullRequest.deletions entero
pullRequest.changedFiles entero
pullRequest.labels array
pullRequest.labels[].id string
pullRequest.labels[].name string
pullRequest.labels[].color string
# inicial.pullRequest.labels[].description string
pullRequest.stack objeto
pullRequest.stack.id string
stackId a Listar solicitudes de extracción para consultar los demás miembros.pullRequest.stack.parentPullRequest object
pullRequest.stack.parentPullRequest.id string
pullRequest.stack.parentPullRequest.number cadena
pullRequest.stack.parentPullRequest.repository objeto
id, name y owner que el repository de una ejecución de comprobación. Las pilas nunca abarcan varios repositorios, por lo que este es siempre el propio repositorio de la solicitud de incorporación de cambios.pullRequest.version object
pullRequest.version.number string
pullRequest.version.headSha string
pullRequest.version.baseSha string
pullRequest.version.createdAt string
pullRequest.version.potentialMergeCommit objeto
headSha con la punta de la rama base, y el grado de avance de su preparación. Está presente en todas las versiones. Describe solo esta versión y puede seguir consultándose después de que se fusione la solicitud de extracción; es un commit distinto de mergeCommitSha. En una solicitud de extracción apilada, la rama base es la rama de la solicitud de extracción padre, por lo que la fusión de prueba solo abarca los cambios de esta solicitud de extracción sobre esa rama.pullRequest.version.potentialMergeCommit.state string
unknown, prepared, merge_conflict. unknown significa que la fusión de prueba aún no está preparada: la versión está esperando a que se prepare, o la preparación superó el tiempo de espera o falló. Cada nueva versión comienza con unknown, por lo que nunca conserva un commit de otra versión. prepared significa que la fusión de prueba existe y que sha y baseSha la describen. merge_conflict significa que se produjo un conflicto al fusionar headSha con la punta de la rama base, por lo que no hay fusión de prueba; es la condición que Obtener la posibilidad de fusionar un pull request indica como bloqueo merge_conflict, y al reabrir el pull request se prepara la versión de nuevo. Trata cualquier valor no reconocido como unknown.pullRequest.version.potentialMergeCommit.sha string
baseSha de este objeto y el segundo padre es el headSha de la versión. Solo está presente cuando state es prepared. La referencia pull/{pullNumber}/merge apunta a él mientras esta versión sea la más reciente. Después, se puede consultar por SHA mediante Obtener un commit, pero no se puede obtener por SHA a través de Git.pullRequest.version.potentialMergeCommit.baseSha string
state es prepared. Puede ser más reciente que pullRequest.version.baseSha, y Origin no lo actualiza si lo único que ocurre es que la rama base avanza.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"}'Estructura de la respuesta:
{ "mergeCommitSha": "5c4d3e2f1a0b9c8d7e6f5a4b3c2d1e0f9a8b7c6d", "mergedPullNumbers": [ "17" ], "pullRequest": { "id": "pr_01k2ja2000e0080000000000d4", "number": "17", "state": "closed", "draft": false, "merged": true, "title": "Add launch telemetry", "body": "Adds structured launch telemetry to the ignition path.", "head": { "ref": "add-telemetry", "sha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4" }, "base": { "ref": "main", "sha": "3b1f9c2d8a7e6f5049c8b7a6d5e4f3a2b1c0d9e8" }, "author": { "user": { "id": "user_01k2ja2000e0080000000000c3", "email": "[email protected]" } }, "createdAt": "2026-08-01T09:30:00Z", "updatedAt": "2026-08-02T14:45:00Z", "closedAt": "2026-08-03T10:15:00Z", "mergedAt": "2026-08-03T10:15:00Z", "mergeCommitSha": "5c4d3e2f1a0b9c8d7e6f5a4b3c2d1e0f9a8b7c6d", "additions": 128, "deletions": 46, "changedFiles": 5, "labels": [ { "id": "lbl_01k2ja2000e0080000000000m1", "name": "bug", "color": "d73a4a", "description": "Something isn't working" } ], "version": { "number": "3", "headSha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4", "baseSha": "3b1f9c2d8a7e6f5049c8b7a6d5e4f3a2b1c0d9e8", "createdAt": "2026-08-01T09:30:00Z" } }}Obtener la fusionabilidad de un pull request
/v1/origin/repos/{ownerSlug}/{repoName}/pulls/{pullNumber}/mergeabilityDevuelve si el pull request se puede fusionar y, si no es posible, las condiciones que lo bloquean. El verdict se evalúa con las mismas condiciones que aplica Merge Pull Request, por lo que un verdict mergeable significa que una fusión sobre la misma cabecera debería completarse correctamente. En un pull request apilado, el verdict abarca todos los pull requests desde la raíz de la pila hasta este, y cada blocker indica el pull request al que pertenece.
Una pila con más de 200 pull request en total, incluidos los ancestros fusionados, devuelve FailedPrecondition (HTTP 400).
Esta operación está en versión preliminar y su forma puede cambiar mientras se estabiliza el contrato. Decodifica las respuestas tolerando campos y valores de enumeración desconocidos, trata un verdict no reconocido como blocked y renderiza blockers[].message cuando no reconozcas blockers[].kind.
Parámetros de ruta
ownerSlug cadena Obligatorio
repoName cadena Obligatorio
pullNumber string Obligatorio
Parámetros de consulta
expectedHeadSha cadena
Aborted (HTTP 409 Conflict) en lugar de un resultado. Un valor que no sea un SHA completo de commit devuelve InvalidArgument (HTTP 400).Campos de respuesta
pullRequest objeto
pullRequest.id cadena
pullRequest.number cadena
pullRequest.repository objeto
pullRequest.repository.id cadena
pullRequest.repository.name cadena
pullRequest.repository.owner objeto
pullRequest.repository.owner.slug cadena
pullRequest.repository.owner.id cadena
pullRequest.repository.owner.type cadena
team, user. Se omite si se desconoce.verdict cadena
evaluatedPullRequests. Valores permitidos: mergeable, que significa que fusionar pullRequest los integra todos, y blocked. Trata cualquier valor no reconocido como blocked.blockers array
verdict es mergeable. Como máximo un bloqueador por pull request y por tipo, excepto required_checks, que incluye uno por estado, y rule_failure y ruleset_error, que incluyen uno por cada mensaje distinto.blockers[].pullRequest objeto
evaluatedPullRequests al que pertenece este blocker. Incluye los mismos campos que pullRequest.blockers[].kind cadena
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. Con el tiempo se añaden nuevos tipos; un bloqueador cuyo tipo sea posterior a la versión de tu cliente se decodifica con kind sin establecer y sigue bloqueando.blockers[].message cadena
kind.blockers[].requiredChecks objeto
required_checks.blockers[].requiredChecks.state cadena
missing, pending, failing, action_required.blockers[].requiredChecks.checks array
blockers[].requiredChecks.checks[].name cadena
blockers[].requiredChecks.checks[].owner objeto
actor de una ejecución de comprobación.blockers[].requiredChecks.checks[].checkRun objeto
headSha que cumple este requisito, por referencia. Se omite si no se ha informado ninguna, caso en el que el estado es missing. Solo incluye id, name y checkSuite.id, porque esta operación se puede leer únicamente con repository:pull_requests:read, mientras que el estado, la conclusión, la salida y la URL de detalles de una ejecución necesitan repository:checks:read; consúltelos con Get Check Run.blockers[].requiredApprovals objeto
required_approvals.blockers[].requiredApprovals.requiredCount entero
blockers[].requiredApprovals.approvedCount entero
blockers[].codeownerApproval objeto
codeowner_approval.blockers[].codeownerApproval.requirements array
blockers[].codeownerApproval.requirements[].owners array
blockers[].codeownerApproval.requirements[].paths array
blockers[].mergeConflict objeto
merge_conflict.blockers[].mergeConflict.conflictedPaths array
blockers[].mergeConflict.truncated booleano
blockers[].mergeConflict.inheritedFromDownstack booleano
blockers[].stackShape objeto
invalid_stack.blockers[].stackShape.reason cadena
partially_merged, cycle, missing_parent, cross_repository_parent, base_branch_missing.blockers[].stackShape.relatedPullRequests array
pullRequest.evaluatedPullRequests array
pullRequest, empezando por la raíz de la pila y terminando con pullRequest. Los ancestros ya fusionados forman parte del historial y no se incluyen en la lista. Exactamente un elemento si el pull request no está apilado. Cada uno incluye los mismos campos que pullRequest.headSha cadena
pullRequest que se evaluó.baseRef cadena
baseSha cadena
baseRef en evaluatedAt. Un push posterior a baseRef puede cambiar el veredicto. Vacío cuando no se pudo determinar la rama base, por ejemplo en una pila no válida.evaluatedAt cadena
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": "El número de reviews con aprobación es 0; se necesita 1. Solicita reviews y espera las aprobaciones necesarias.", "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": "Las comprobaciones de estado obligatorias están pendientes. Espera a que finalicen o soluciona las que han fallado.", "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"}Listar los revisores solicitados de un pull request
/v1/origin/repos/{ownerSlug}/{repoName}/pulls/{pullNumber}/requested_reviewersLista los usuarios y grupos a los que se les ha solicitado actualmente una revisión en un pull request.
Una solicitud directa se cancela cuando ese usuario envía una revisión, y una solicitud a un grupo se cancela cuando cualquier miembro actual del grupo la envía. Las revisiones en borrador sin enviar dejan la solicitud pendiente, y volver a solicitar una revisión después de un envío devuelve al revisor a esta lista. Los grupos sin un identificador público legible se omiten.
Parámetros de ruta
ownerSlug string Obligatorio
repoName string Obligatorio
pullNumber string Obligatorio
Campos de la respuesta
users array
users[].id string
user_…), el mismo formato que usa la API de organización.users[].email string
users[].displayName string
users[].handle string
@. Solo está presente mientras ese perfil sea visible públicamente; de lo contrario, se omite.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'Estructura de la respuesta:
{ "users": [ { "id": "user_01k2ja2000e0080000000000c3", "email": "[email protected]" } ], "groups": [ { "id": "grp_01k2ja2000e0080000000000n2" } ]}Solicitar revisores del pull request
/v1/origin/repos/{ownerSlug}/{repoName}/pulls/{pullNumber}/requested_reviewersSolicita revisiones a los usuarios y grupos indicados en un pull request y devuelve los revisores solicitados en esta llamada.
Los identificadores se resuelven respecto a los candidatos a revisor del repositorio por id público, correo electrónico del usuario o slug del grupo. Los nombres para mostrar no se resuelven. Un identificador desconocido o ambiguo devuelve InvalidArgument (HTTP 400) que nombra el identificador, y se requiere al menos una entrada no vacía en users o groups.
Volver a solicitar a un revisor ya solicitado actualiza la marca de tiempo de la solicitud, por lo que un revisor que ya había enviado una revisión vuelve a aparecer como pendiente. Un revisor que no es candidato del repositorio devuelve PermissionDenied (HTTP 403).
Parámetros de ruta
ownerSlug string Obligatorio
repoName string Obligatorio
pullNumber string Obligatorio
Cuerpo de la solicitud
users array
user_… o el correo electrónico.groups array
grp_…, el slug de grupo calificado o el slug del grupo.Campos de respuesta
users array
users[].id string
user_…), con el mismo formato que utiliza la API de la organización.users[].email string
users[].displayName string
users[].handle string
@. Solo está presente mientras ese perfil sea visible públicamente; se omite en caso contrario.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" ]}'Estructura de la respuesta:
{ "users": [ { "id": "user_01k2ja2000e0080000000000c3", "email": "[email protected]" } ], "groups": [ { "id": "grp_01k2ja2000e0080000000000n2" } ]}Eliminar revisores solicitados de un pull request
/v1/origin/repos/{ownerSlug}/{repoName}/pulls/{pullNumber}/requested_reviewersElimina las revisiones solicitadas a los usuarios y grupos indicados en un pull request. El cuerpo de la respuesta está vacío.
Los identificadores se resuelven contra los candidatos a revisor del repositorio por id público, correo electrónico del usuario o slug del grupo. Los nombres para mostrar no se resuelven. Un identificador desconocido o ambiguo devuelve InvalidArgument (HTTP 400) indicando el identificador, y se requiere al menos una entrada no vacía entre users y groups.
Eliminar a un usuario o grupo que no tiene una revisión solicitada no tiene ningún efecto. Un identificador que ya no sea candidato a revisor se sigue aceptando si es un id público estable (user_… o grp_…), de modo que se puede quitar a un revisor que haya dejado el repositorio.
Parámetros de ruta
ownerSlug string Obligatorio
repoName string Obligatorio
pullNumber string Obligatorio
Cuerpo de la solicitud
users array
user_… o por correo electrónico.groups array
grp_…, slug de grupo cualificado o slug de grupo.Campos de la respuesta
Las solicitudes correctas no devuelven cuerpo de respuesta.
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" ]}'Respuesta:
204 No ContentListar revisiones de solicitudes de extracción
/v1/origin/repos/{ownerSlug}/{repoName}/pulls/{pullNumber}/reviewsEnumera las revisiones enviadas de una solicitud de extracción, ordenadas de forma ascendente por submitted_at. Se omiten las revisiones pendientes.
Parámetros de ruta
ownerSlug string Obligatorio
repoName string Obligatorio
pullNumber string Obligatorio
Parámetros de consulta
pageSize entero
pageToken string
nextPageToken de una respuesta anterior. Omítelo en la primera página. El pageSize de una solicitud posterior se aplica a esa página; omítelo para mantener el tamaño de página anterior.Campos de respuesta
reviews matriz
reviews[].id string
reviews[].author objeto
reviews[].author.user objeto
reviews[].author.user.id string
reviews[].author.user.email string
reviews[].author.user.displayName string
reviews[].author.user.handle string
@. Presente solo mientras ese perfil sea visible públicamente; se omite en caso contrario.reviews[].author.app objeto
reviews[].author.app.id string
reviews[].author.app.displayName string
reviews[].author.serviceAccount objeto
reviews[].author.serviceAccount.id string
reviews[].verdict string
reviews[].body string
reviews[].submittedAt string
reviews[].pullRequestVersion objeto
reviews[].pullRequestVersion.number string
reviews[].pullRequestVersion.headSha string
reviews[].pullRequestVersion.baseSha string
reviews[].dismissal objeto
reviews[].dismissal.dismissedBy objeto
reviews[].dismissal.dismissedBy.user objeto
reviews[].dismissal.dismissedBy.user.id cadena
reviews[].dismissal.dismissedBy.user.email string
reviews[].dismissal.dismissedBy.user.displayName string
reviews[].dismissal.dismissedBy.user.handle string
@. Presente solo mientras ese perfil sea visible públicamente; se omite en caso contrario.reviews[].dismissal.dismissedBy.app objeto
reviews[].dismissal.dismissedBy.app.id string
reviews[].dismissal.dismissedBy.app.displayName string
reviews[].dismissal.dismissedBy.serviceAccount objeto
reviews[].dismissal.dismissedBy.serviceAccount.id string
reviews[].dismissal.dismissedAt string
reviews[].dismissal.message string
pullRequest objeto
pullRequest.id string
pullRequest.number cadena
pullRequest.repository objeto
pullRequest.repository.id string
pullRequest.repository.name string
pullRequest.repository.owner objeto
pullRequest.repository.owner.slug string
pullRequest.repository.owner.id string
pullRequest.repository.owner.type string
team, user. Se omite cuando se desconoce.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'Estructura de la respuesta:
{ "reviews": [ { "id": "rev_01k2ja2000e0080000000000f6", "author": { "user": { "id": "user_01k2ja2000e0080000000000c3", "email": "[email protected]" } }, "verdict": "approve", "body": "Approving. The telemetry schema matches the spec.", "submittedAt": "2026-08-02T15:00:00Z", "pullRequestVersion": { "number": "3", "headSha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4", "baseSha": "3b1f9c2d8a7e6f5049c8b7a6d5e4f3a2b1c0d9e8" } } ], "pullRequest": { "id": "pr_01k2ja2000e0080000000000d4", "number": "17", "repository": { "id": "repo_01k2ja2000e0080000000000q4", "name": "rocket", "owner": { "slug": "acme", "id": "ns_01k2ja2000e0080000000000p3", "type": "team" } } }}Crear una revisión de solicitud de extracción
/v1/origin/repos/{ownerSlug}/{repoName}/pulls/{pullNumber}/reviewsCrea y envía una revisión de una pull request, opcionalmente junto con sus comentarios en una única solicitud atómica. Cada comentario acepta los mismos destinos que acepta Crear comentario de pull request: comments[].inline para un rango de líneas, comments[].file para un archivo completo, comments[].threadId para una respuesta y ninguno de ellos para una discusión general.
La revisión se envía de inmediato. Una nueva revisión approve o request_changes sustituye la revisión de decisión activa previa del llamante en la misma solicitud de extracción, la cual queda descartada. Los autores de la solicitud de extracción no pueden usar approve en su propia solicitud de extracción. Falla con FAILED_PRECONDITION mientras el llamante tenga una revisión en borrador sin enviar en la solicitud de extracción.
Cuando se establece comments, cada ancla se valida con respecto al diff de la versión revisada antes de escribir nada, usando la misma comprobación de que el ancla esté dentro del diff que Create Pull Request Comment. Si falla un comentario, falla toda la solicitud con InvalidArgument (HTTP 400) y no se publica nada. Los comentarios se hacen visibles de forma atómica junto con la revisión: ningún comentario ni evento es observable hasta que se envía la revisión; entonces, cada comentario emite su propio webhook pull_request.comment.created, junto con el evento de la revisión.
La operación no incluye una clave de idempotencia, por lo que reintentar tras una falla de transporte ambigua puede crear una segunda revisión. Llame a List Pull Request Reviews antes de volver a intentarlo.
Parámetros de ruta
ownerSlug string Obligatorio
repoName string Obligatorio
pullNumber string Obligatorio
Cuerpo de la solicitud
verdict string Obligatorio
PULL_REQUEST_REVIEW_VERDICT_UNSPECIFIED, approve, request_changes, comment.body string
versionNumber cadena
PullRequestVersion.number). Omítala para revisar la versión más reciente en el momento de la llamada. Los comentarios se anclan a esta misma versión.comments arreglo
comments[].body string Obligatorio
comments[].inline objeto
inline en Crear comentario de solicitud de extracción. No se puede combinar con comments[].threadId.comments[].inline.path string Obligatorio
comments[].inline.side string Obligatorio
left para la versión base del archivo, right para la versión head.comments[].inline.startLine entero Obligatorio
side del archivo. El rango no debe sobrepasar el final de ese archivo.comments[].inline.endLine entero
startLine. Omítala para un ancla de una sola línea.comments[].threadId string
comments[].inline, comments[].file y este campo para abrir un nuevo hilo de discusión general.comments[].file objeto
file en Crear comentario de solicitud de extracción. No se puede combinar con comments[].inline ni comments[].threadId.comments[].file.path string Obligatorio
Campos de la respuesta
id string
author objeto
author.user objeto
author.user.id string
author.user.email string
author.user.displayName string
author.user.handle string
@. Solo está presente mientras ese perfil sea visible públicamente; en caso contrario, se omite.author.app objeto
author.app.id string
author.app.displayName string
author.serviceAccount objeto
author.serviceAccount.id string
verdict string
body string
submittedAt cadena
pullRequestVersion objeto
pullRequestVersion.number string
pullRequestVersion.headSha string
pullRequestVersion.baseSha string
dismissal objeto
dismissal.dismissedBy object
dismissal.dismissedBy.user objeto
dismissal.dismissedBy.user.id string
dismissal.dismissedBy.user.email string
dismissal.dismissedBy.user.displayName string
dismissal.dismissedBy.user.handle string
@. Solo está presente mientras ese perfil sea visible públicamente; en caso contrario, se omite.dismissal.dismissedBy.app objeto
dismissal.dismissedBy.app.id string
dismissal.dismissedBy.app.displayName string
dismissal.dismissedBy.serviceAccount objeto
dismissal.dismissedBy.serviceAccount.id string
dismissal.dismissedAt cadena
dismissal.message cadena
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"}'Estructura de la respuesta:
{ "id": "rev_01k2ja2000e0080000000000f6", "author": { "user": { "id": "user_01k2ja2000e0080000000000c3", "email": "[email protected]" } }, "verdict": "approve", "body": "Approving. The telemetry schema matches the spec.", "submittedAt": "2026-08-02T15:00:00Z", "pullRequestVersion": { "number": "3", "headSha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4", "baseSha": "3b1f9c2d8a7e6f5049c8b7a6d5e4f3a2b1c0d9e8" }}Actualizar revisión de solicitud de incorporación de cambios
/v1/origin/repos/{ownerSlug}/{repoName}/pulls/{pullNumber}/reviews/{reviewId}Actualiza el cuerpo de una revisión. Solo el autor de la revisión puede actualizarla; quienes realicen otras llamadas recibirán PERMISSION_DENIED. Una revisión que no pertenezca a la pull request indicada devuelve NOT_FOUND.
Las revisiones en borrador sin enviar también pueden actualizarse; la respuesta de un borrador no tiene submitted_at.
Parámetros de ruta
ownerSlug cadena Obligatorio
repoName string Obligatorio
pullNumber string Obligatorio
reviewId string Obligatorio
Cuerpo de la solicitud
body string Obligatorio
Campos de respuesta
id string
author object
author.user object
author.user.id string
author.user.email cadena
author.user.displayName cadena
author.user.handle string
@. Solo está presente mientras ese perfil sea visible públicamente; de lo contrario, se omite.author.app object
author.app.id string
author.app.displayName string
author.serviceAccount object
author.serviceAccount.id string
verdict string
body cadena
submittedAt cadena
pullRequestVersion object
pullRequestVersion.number string
pullRequestVersion.headSha string
pullRequestVersion.baseSha string
dismissal object
dismissal.dismissedBy object
dismissal.dismissedBy.user object
dismissal.dismissedBy.user.id cadena
dismissal.dismissedBy.user.email string
dismissal.dismissedBy.user.displayName cadena
dismissal.dismissedBy.user.handle string
@. Solo está presente mientras ese perfil sea visible públicamente; de lo contrario, se omite.dismissal.dismissedBy.app object
dismissal.dismissedBy.app.id string
dismissal.dismissedBy.app.displayName cadena
dismissal.dismissedBy.serviceAccount object
dismissal.dismissedBy.serviceAccount.id string
dismissal.dismissedAt cadena
dismissal.message string
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."}'Estructura de la respuesta:
{ "id": "rev_01k2ja2000e0080000000000f6", "author": { "user": { "id": "user_01k2ja2000e0080000000000c3", "email": "[email protected]" } }, "verdict": "approve", "body": "Approving. The telemetry schema matches the spec.", "submittedAt": "2026-08-02T15:00:00Z", "pullRequestVersion": { "number": "3", "headSha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4", "baseSha": "3b1f9c2d8a7e6f5049c8b7a6d5e4f3a2b1c0d9e8" }}Descartar revisión de pull request
/v1/origin/repos/{ownerSlug}/{repoName}/pulls/{pullNumber}/reviews/{reviewId}/dismissalsDescarta una revisión enviada para que su veredicto deje de contarse en el estado de revisión de la solicitud de extracción. La revisión en sí se conserva y sigue apareciendo en ListPullRequestReviews, con dismissal establecido.
Para descartar una revisión no es necesario haberla creado; basta con tener permiso de escritura en las revisiones de pull request del repositorio.
Solo se pueden descartar las revisiones approve y request_changes, y solo una vez: una revisión comment, una revisión en borrador sin enviar o una revisión ya descartada devuelve FAILED_PRECONDITION, y repetir la llamada mantiene vigente el primer descarte. Una revisión que no pertenece al pull request indicado devuelve NOT_FOUND.
Parámetros de ruta
ownerSlug string Obligatorio
repoName string Obligatorio
pullNumber string Obligatorio
reviewId string Obligatorio
Cuerpo de la solicitud
message string Obligatorio
Campos de respuesta
id string
author object
author.user object
author.user.id string
author.user.email string
author.user.displayName string
author.user.handle string
@. Solo está presente mientras ese perfil sea visible públicamente; de lo contrario, se omite.author.app object
author.app.id string
author.app.displayName string
author.serviceAccount object
author.serviceAccount.id string
verdict string
body string
submittedAt string
pullRequestVersion object
pullRequestVersion.number string
pullRequestVersion.headSha string
pullRequestVersion.baseSha string
dismissal object
dismissal.dismissedBy object
dismissal.dismissedBy.user object
dismissal.dismissedBy.user.id string
dismissal.dismissedBy.user.email string
dismissal.dismissedBy.user.displayName string
dismissal.dismissedBy.user.handle string
@. Solo está presente mientras ese perfil sea visible públicamente; de lo contrario, se omite.dismissal.dismissedBy.app object
dismissal.dismissedBy.app.id string
dismissal.dismissedBy.app.displayName string
dismissal.dismissedBy.serviceAccount object
dismissal.dismissedBy.serviceAccount.id string
dismissal.dismissedAt string
dismissal.message string
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."}'Estructura de la respuesta:
{ "id": "rev_01k2ja2000e0080000000000f6", "author": { "user": { "id": "user_01k2ja2000e0080000000000c3", "email": "[email protected]" } }, "verdict": "approve", "body": "Aprobado. El esquema de telemetría coincide con la especificación.", "submittedAt": "2026-08-02T15:00:00Z", "pullRequestVersion": { "number": "3", "headSha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4", "baseSha": "3b1f9c2d8a7e6f5049c8b7a6d5e4f3a2b1c0d9e8" }, "dismissal": { "dismissedBy": { "user": { "id": "user_01k2ja2000e0080000000000c3", "email": "[email protected]" } }, "dismissedAt": "2026-08-02T15:00:00Z", "message": "Reemplazada por una revisión más reciente." }}Conjuntos de reglas
Listar conjuntos de reglas
/v1/origin/repos/{ownerSlug}/{repoName}/rulesetsEnumera todos los conjuntos de reglas configurados en un repositorio.
Los conjuntos de reglas por repositorio constituyen una configuración acotada, por lo que el conjunto completo se devuelve en una única respuesta y este endpoint no está paginado. repository se incluye una sola vez y describe el repositorio compartido por todos los conjuntos de reglas de la respuesta.
Parámetros de ruta
ownerSlug string Obligatorio
repoName string Obligatorio
Campos de respuesta
rulesets matriz
rulesets[].id string
rulesets[].name cadena
rulesets[].description string
rulesets[].enforcement string
active, evaluate, disabled.rulesets[].kind string
merge_branch, push_branch, push_tag, push_repository.rulesets[].includedRefNames arreglo
~ALL y ~DEFAULT_BRANCH.rulesets[].excludedRefNames array
rulesets[].includedRefNames.rulesets[].rules matriz
rulesets[].rules[].id string
rulesets[].rules[].ruleType string
pull_request, require_status_checks, require_branch_up_to_date, deletion o non_fast_forward.rulesets[].rules[].parameters object
rulesets[].rules[].ruleType.rulesets[].bypassActors array
rulesets[].bypassActors[].id string
rulesets[].bypassActors[].bypassMode cadena
always, pull_request_only.rulesets[].bypassActors[].user objeto
user, team, app u originRole está presente.rulesets[].bypassActors[].user.id string
rulesets[].bypassActors[].team objeto
rulesets[].bypassActors[].team.organizationPublicId string
rulesets[].bypassActors[].team.groupPublicId string
rulesets[].bypassActors[].app objeto
rulesets[].bypassActors[].app.id string
app_.rulesets[].bypassActors[].originRole objeto
rulesets[].bypassActors[].originRole.role string
namespace_admin, repository_admin, repository_write.repository objeto
repository.id string
repository.name string
repository.owner objeto
repository.owner.slug string
repository.owner.id string
repository.owner.type string
team, user. Se omite cuando se desconoce.curl --request GET \ --url 'https://api.cursor.com/v1/origin/repos/OWNER_SLUG/REPO_NAME/rulesets' \ --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN'Estructura de la respuesta:
{ "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" } }}Crear conjunto de reglas
/v1/origin/repos/{ownerSlug}/{repoName}/rulesetsCrea un conjunto de reglas del repositorio.
La respuesta incluye el conjunto de reglas almacenado, incluidos los ID que Origin asigna a cada regla y actor de omisión. Se rechaza un name vacío con InvalidArgument (HTTP 400).
Parámetros de ruta
ownerSlug string Obligatorio
repoName string Obligatorio
Cuerpo de la solicitud
name string Obligatorio
description cadena
enforcement string Obligatorio
active, evaluate, disabled.kind string Obligatorio
merge_branch, push_branch, push_tag, push_repository.includedRefNames array
~ALL y ~DEFAULT_BRANCH. Los valores con más de 64 entradas se rechazan con InvalidArgument (HTTP 400).excludedRefNames array
includedRefNames.rules array
ruleType y parameters opcionales; Origin asigna el id de cada regla. Se rechazan los valores con más de 20 entradas con InvalidArgument (HTTP 400).bypassActors array
bypassMode y exactamente uno de user, team, app u originRole; Origin asigna el id de cada actor. Los valores con más de 15 entradas se rechazan con InvalidArgument (HTTP 400).Campos de respuesta
id string
name string
description cadena
enforcement string
active, evaluate, disabled.kind cadena
merge_branch, push_branch, push_tag, push_repository.includedRefNames array
~ALL y ~DEFAULT_BRANCH.excludedRefNames array
includedRefNames.rules array
rules[].id string
rules[].ruleType string
pull_request, require_status_checks, require_branch_up_to_date, deletion o non_fast_forward.rules[].parameters objeto
rules[].ruleType.bypassActors array
bypassActors[].id cadena
bypassActors[].bypassMode string
always, pull_request_only.bypassActors[].user objeto
user, team, app u originRole.bypassActors[].user.id string
bypassActors[].team objeto
bypassActors[].team.organizationPublicId string
bypassActors[].team.groupPublicId string
bypassActors[].app objeto
bypassActors[].app.id string
app_.bypassActors[].originRole objeto
bypassActors[].originRole.role string
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" } } ]}'Estructura de la respuesta:
{ "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" } } ]}Obtener conjunto de reglas
/v1/origin/repos/{ownerSlug}/{repoName}/rulesets/{rulesetId}Devuelve un único conjunto de reglas del repositorio a partir de su ID de Origin estable.
Tanto un repositorio como un conjunto de reglas desconocidos devuelven 404; el mensaje permite distinguirlos.
Parámetros de ruta
ownerSlug cadena Obligatorio
repoName string Obligatorio
rulesetId string Obligatorio
Campos de respuesta
id string
nombre string
descripción string
enforcement string
active, evaluate, disabled.kind string
merge_branch, push_branch, push_tag, push_repository.includedRefNames matriz
~ALL y ~DEFAULT_BRANCH.excludedRefNames matriz
includedRefNames.rules array
rules[].id string
rules[].ruleType string
pull_request, require_status_checks, require_branch_up_to_date, deletion o non_fast_forward.rules[].parameters objeto
rules[].ruleType.bypassActors array
bypassActors[].id cadena
bypassActors[].bypassMode string
always, pull_request_only.bypassActors[].user objeto
user, team, app u originRole.bypassActors[].user.id string
bypassActors[].team objeto
bypassActors[].team.organizationPublicId string
bypassActors[].team.groupPublicId string
bypassActors[].app objeto
bypassActors[].app.id string
app_.bypassActors[].originRole objeto
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'Estructura de la respuesta:
{ "id": "rs_01k2ja2000e0080000000000t7", "name": "require-review", "description": "Exige una revisión aprobatoria antes de fusionar con 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" } } ]}Actualizar el conjunto de reglas
/v1/origin/repos/{ownerSlug}/{repoName}/rulesets/{rulesetId}Actualiza un conjunto de reglas existente del repositorio.
La solicitud reemplaza toda la configuración del conjunto de reglas. rules y bypassActors se reemplazan por completo en lugar de fusionarse, y Origin asigna nuevos ID a las entradas almacenadas, así que envía todas las reglas y los actores de omisión que quieras conservar.
Parámetros de ruta
ownerSlug string Obligatorio
repoName string Obligatorio
rulesetId string Obligatorio
Cuerpo de la solicitud
name string Obligatorio
description cadena
enforcement cadena Obligatorio
active, evaluate, disabled.kind string Obligatorio
merge_branch, push_branch, push_tag, push_repository.includedRefNames array
~ALL y ~DEFAULT_BRANCH. Los valores con más de 64 entradas se rechazan con InvalidArgument (HTTP 400).excludedRefNames matriz
includedRefNames.rules array
ruleType y parameters opcionales; Origin asigna el id de cada regla. Se rechazan las solicitudes con más de 20 entradas con InvalidArgument (HTTP 400).bypassActors array
bypassMode y exactamente uno de user, team, app u originRole; Origin asigna el id de cada actor. Los valores con más de 15 entradas se rechazan con InvalidArgument (HTTP 400).Campos de respuesta
id string
name string
description cadena
enforcement string
active, evaluate, disabled.kind string
merge_branch, push_branch, push_tag, push_repository.includedRefNames array
~ALL y ~DEFAULT_BRANCH.excludedRefNames matriz
includedRefNames.rules array
rules[].id string
rules[].ruleType string
pull_request, require_status_checks, require_branch_up_to_date, deletion o non_fast_forward.rules[].parameters objeto
rules[].ruleType.bypassActors array
bypassActors[].id string
bypassActors[].bypassMode string
always, pull_request_only.bypassActors[].user objeto
user, team, app u originRole.bypassActors[].user.id cadena
bypassActors[].team objeto
bypassActors[].team.organizationPublicId string
bypassActors[].team.groupPublicId string
bypassActors[].app objeto
bypassActors[].app.id string
app_.bypassActors[].originRole objeto
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" } } ]}'Estructura de la respuesta:
{ "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" } } ]}Eliminar conjunto de reglas
/v1/origin/repos/{ownerSlug}/{repoName}/rulesets/{rulesetId}Elimina un conjunto de reglas del repositorio mediante su ID estable de Origin. El cuerpo de respuesta está vacío.
Tanto un repositorio desconocido como un conjunto de reglas desconocido devuelven 404; el mensaje los distingue. Un conjunto de reglas almacenado en otro repositorio se considera desconocido. Un rulesetId vacío devuelve InvalidArgument (HTTP 400).
Parámetros de ruta
ownerSlug cadena Obligatorio
repoName cadena Obligatorio
rulesetId cadena Obligatorio
Campos de respuesta
Las solicitudes correctas no devuelven cuerpo de respuesta.
curl --request DELETE \ --url 'https://api.cursor.com/v1/origin/repos/OWNER_SLUG/REPO_NAME/rulesets/RULESET_ID' \ --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN'Respuesta:
204 No ContentAutoridades de certificación SSH
Una autoridad de certificación SSH es una clave pública en la que confía un propietario: los certificados de usuario que firma autentican git sobre SSH en los repositorios del propietario, de modo que los miembros del equipo propietario pueden usar git sobre SSH sin registrar una clave SSH. Estos endpoints permiten enumerar las autoridades en las que confía un propietario, añadirlas y eliminarlas, así como establecer si el propietario exige certificados. Las autoridades pertenecen a propietarios que son propiedad de un equipo, y la comprobación de duplicados al añadir se limita al propietario, no a Origin en su conjunto, por lo que varios propietarios pueden confiar en la misma autoridad.
El listado acepta tokens de acceso de instalación y tokens de usuario. Para añadir y eliminar autoridades, y para establecer el requisito, se necesita una credencial de usuario de Cherri Code con namespace:settings:write; no se aceptan tokens de aplicación ni tokens de acceso de instalación.
Listar autoridades de certificación SSH
/v1/origin/owners/{ownerSlug}/ssh-certificate-authoritiesLista las autoridades de certificación SSH en las que confía un propietario para git sobre SSH, de la más reciente a la más antigua, e indica si el propietario exige certificados. La respuesta no está paginada: se devuelven todas las autoridades.
Parámetros de ruta
ownerSlug cadena Obligatorio
Campos de respuesta
certificateAuthorities array
certificateAuthorities[].id cadena
certificateAuthorityId.certificateAuthorities[].name cadena
certificateAuthorities[].keyType cadena
ssh-ed25519.certificateAuthorities[].fingerprint cadena
SHA256:<base64>, el mismo que muestra ssh-keygen -l.certificateAuthorities[].publicKey cadena
<key_type> <base64>, sin comentario.certificateAuthorities[].createdAt cadena
requireCertificates boolean
curl --request GET \ --url 'https://api.cursor.com/v1/origin/owners/OWNER_SLUG/ssh-certificate-authorities' \ --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN'Estructura de la respuesta:
{ "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}Añadir autoridad de certificación SSH
/v1/origin/owners/{ownerSlug}/ssh-certificate-authoritiesAñade una autoridad de certificación SSH de confianza para el propietario y la devuelve. A partir de ese momento, los miembros del equipo propietario pueden usar git sobre SSH en los repositorios del propietario con certificados de usuario firmados por la autoridad, sin necesidad de registrar una clave SSH.
publicKey es la clave pública de la propia autoridad, en forma de una línea de authorized_keys de OpenSSH. Si se envía un certificado, un tipo de clave no compatible o una clave RSA de menos de 2048 bits, se devuelve InvalidArgument (HTTP 400). Si el propietario ya tiene registrada la clave, se devuelve AlreadyExists (HTTP 409 Conflict); la comprobación se limita al propietario, por lo que varios propietarios pueden confiar en la misma autoridad. Solo se pueden añadir autoridades a propietarios que sean propiedad de un equipo; con cualquier otro propietario se devuelve FailedPrecondition (HTTP 400).
El llamador debe ser una credencial de usuario de Cherri Code con namespace:settings:write. No se aceptan tokens de aplicación ni tokens de acceso de instalación.
Parámetros de ruta
ownerSlug string Obligatorio
Cuerpo de solicitud
publicKey string Obligatorio
authorized_keys de OpenSSH (<key_type> <base64> [comment]). Los tipos de clave aceptados son ssh-ed25519, ecdsa-sha2-nistp256, ecdsa-sha2-nistp384, ecdsa-sha2-nistp521 y ssh-rsa con un módulo de al menos 2048 bits. No se aceptan certificados.name string Obligatorio
Campos de respuesta
id string
certificateAuthorityId.name string
keyType string
ssh-ed25519.fingerprint string
SHA256:<base64>, el mismo que muestra ssh-keygen -l.publicKey string
<key_type> <base64>, sin comentario.createdAt string
curl --request POST \ --url 'https://api.cursor.com/v1/origin/owners/OWNER_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"}'Estructura de la respuesta:
{ "id": "nsca_01k2ja2000e0080000000000s5", "name": "Acme production CA", "keyType": "ssh-ed25519", "fingerprint": "SHA256:D5vlIclvaSZlwq4gmckavfLE7n7F542Eyhk/PvXkRq0", "publicKey": "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIPwoQNzBuiWhDF4EKwRyt8h48XRY7Bc4yWbQ9s3Tnj7Q", "createdAt": "2026-08-02T14:45:00Z"}Eliminar autoridad de certificación SSH
/v1/origin/owners/{ownerSlug}/ssh-certificate-authorities/{certificateAuthorityId}Elimina una autoridad de certificación SSH del propietario. Todos los certificados firmados por esa autoridad dejan de funcionar. Si el propietario exige certificados, no se puede eliminar su última autoridad; en ese caso, la solicitud devuelve FailedPrecondition (HTTP 400). El cuerpo de respuesta está vacío.
El llamador debe ser una credencial de usuario de Cherri Code con el permiso namespace:settings:write. No se aceptan tokens de aplicación ni tokens de acceso de instalación.
Parámetros de ruta
ownerSlug cadena Obligatorio
certificateAuthorityId cadena Obligatorio
id de la autoridad que se va a eliminar.Campos de respuesta
Las solicitudes correctas no devuelven cuerpo de respuesta.
curl --request DELETE \ --url 'https://api.cursor.com/v1/origin/owners/OWNER_SLUG/ssh-certificate-authorities/CERTIFICATE_AUTHORITY_ID' \ --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN'Respuesta:
204 No ContentEstablecer el requisito de certificado SSH
/v1/origin/owners/{ownerSlug}/ssh-certificate-authorities:setRequirementEstablece si el propietario exige certificados SSH y devuelve el ajuste del propietario. Mientras el requisito esté activo, git sobre SSH en los repositorios del propietario solo acepta certificados emitidos por las autoridades del propietario: se rechazan las claves SSH registradas por los usuarios, así como las claves de API de usuario sobre HTTPS. Para exigir certificados, debe haber al menos una autoridad registrada; de lo contrario, la solicitud devuelve FailedPrecondition (HTTP 400). Si se establece el valor actual, la operación se completa correctamente sin realizar ningún cambio.
El llamador debe ser una credencial de usuario de Cherri Code con namespace:settings:write. No se aceptan tokens de aplicación ni tokens de acceso de instalación.
Parámetros de ruta
ownerSlug cadena Obligatorio
Cuerpo de solicitud
requireCertificates boolean Obligatorio
Campos de respuesta
requireCertificates boolean
curl --request POST \ --url 'https://api.cursor.com/v1/origin/owners/OWNER_SLUG/ssh-certificate-authorities:setRequirement' \ --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN' \ --header 'Content-Type: application/json' \ --data '{ "requireCertificates": true}'Estructura de la respuesta:
{ "requireCertificates": true}Webhooks
Origin envía solicitudes HTTP POST firmadas a la URL HTTPS del webhook registrada de la app con content-type: application/json.
La entrega se realiza al menos una vez. Elimina duplicados en los reintentos con webhook-id, acepta la solicitud de forma persistente, devuelve 2xx rápidamente y procesa el evento de forma asíncrona.
Origin espera 10 segundos los encabezados de respuesta del receptor. Ese plazo cubre la resolución DNS, la conexión, el protocolo de enlace TLS y el tiempo hasta la respuesta, y se aplica a cada intento. Un intento que lo supere se registra como error de transporte y se reintenta según la programación de Reintentos. Los fallos repetidos pueden desactivar la entrega automáticamente.
Para confirmar que un receptor funciona antes de que le llegue algún evento real, llama a Ping Webhook.
Origin entrega eventos para repositorios replicados, y los payloads de eventos de instalación los enumeran en los arrays de repositorios seleccionados. La entrega no amplía lo que la instalación puede invocar: consulta Repositorios replicados.
Encabezados
| Encabezado | Descripción |
|---|---|
content-type | application/json |
user-agent | Cherri Code-Origin-Webhook/1.0 |
webhook-id | ID de entrega estable y clave de idempotencia. |
webhook-timestamp | Marca de tiempo Unix incluida en la firma. |
webhook-signature | v1ed,BASE64_SIGNATURE |
webhook-event-type | Slug de evento para el enrutamiento. |
webhook-event-id | ID del evento de Origin subyacente, reflejado en el cuerpo firmado. |
webhook-app-id | ID de la app de destino. |
webhook-installation-id | ID de la instalación de destino. |
Los encabezados de enrutamiento son solo una ayuda. Tras verificar la firma, el cuerpo es la fuente de autoridad.
Verificación de firmas
Usa el cuerpo sin procesar de la solicitud antes de analizarlo. Construye:
lowercaseHex(SHA-256("<webhook-id>.<webhook-timestamp>.<raw-request-body>"))Verifica la firma Ed25519 de los bytes UTF-8 de ese resumen hexadecimal con una clave JWKS activa de Origin. Rechaza las marcas de tiempo que se desvíen más de cinco minutos de la hora actual.
Las bibliotecas de Standard Webhooks no verifican las entregas de Origin. Los encabezados usan los nombres de Standard Webhooks, pero Origin firma el resumen SHA-256 en lugar del propio contenido firmado, con una etiqueta de versión v1ed que la especificación de Standard Webhooks no define. Verifica la firma con la construcción anterior, como se muestra en el siguiente ejemplo.
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"); // En producción, guarda esta respuesta en caché. 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; } });}Envoltorio de entrega
Cada solicitud incluye el payload del evento junto con la identidad de la entrega, la aplicación y la instalación:
{ "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 es estable entre reintentos. event.id identifica el evento de dominio subyacente.
Reintentos
Origin reintenta los errores de transporte y las respuestas 429 y 5xx hasta un máximo de siete intentos. Las demás respuestas 4xx son definitivas.
El primer intento es el envío original. Los seis reintentos esperan 5 segundos, 30 segundos, 1 minuto, 2 minutos, 4 minutos y 8 minutos, en ese orden.
Un receptor que falle en todos los intentos recibirá siete POST a lo largo de unos 16 minutos. El webhook-id es el mismo en cada intento. Elimina duplicados con él.
Desactivación automática
Un propietario puede pausar la entrega de webhooks de una aplicación desde los ajustes de la aplicación. Origin también la desactiva por su cuenta cuando el receptor falla al menos 20 rondas de entrega dentro de una ventana de 72 horas, sin ninguna entrega correcta en ese periodo, y los fallos afectan a más de un espacio de nombres de instalador.
La entrega se detiene hasta que un propietario la reanude. Batch Redeliver Webhook Deliveries devuelve FailedPrecondition (HTTP 400) y no encola nada. La API no expone ningún campo para el estado pausado, así que toma ese FailedPrecondition como señal.
Borrar el webhookUrl de la aplicación mediante Update App es una acción aparte: cancela las entregas pendientes y volver a establecer una URL no las recupera.
Recuperación
Usa un JWT de aplicación para consultar GET /app/webhook/deliveries. Filtra por estado de entrega, tipo de evento, instalación, intervalo de tiempo o token de página. delivered=false devuelve todas las entregas que el receptor nunca ha confirmado con un código 2xx. Las entregas permanecen disponibles para listar durante siete días, así que recupéralas dentro de ese plazo.
Usa POST /app/webhook/deliveries:batchRedeliver para poner en cola la reentrega de hasta 100 ID de entrega. La operación elimina los ID duplicados e informa el resultado de cada entrega. Una aplicación pausada o desactivada automáticamente rechaza la llamada con FailedPrecondition (HTTP 400) y no pone nada en cola.
Referencia de webhooks
Todos los eventos que entrega Origin, con el payload de cada evento documentado campo por campo. Para conocer el funcionamiento de las suscripciones, los encabezados, la verificación de firma, el envoltorio de entrega, la programación de reintentos y la desactivación automática, consulta Webhooks.
Eventos
| Evento | Se envía cuando |
|---|---|
repository.created | Se crea un repositorio. |
repository.deleted | Se elimina un repositorio. |
repository.pushed | Una o varias referencias cambian tras un push. |
repository.metadata.updated | Cambia la rama predeterminada de un repositorio. |
pull_request.created | Se abre una pull request. |
pull_request.head_ref.pushed | La cabecera de la pull request avanza. |
pull_request.base_ref.updated | Cambia la referencia base o el commit base resuelto. |
pull_request.metadata.updated | Cambia el título o la descripción. |
pull_request.closed | Se cierra una pull request sin fusionarse, incluso cuando Origin la cierra porque un push dejó su cabecera sin historial en común con su base. |
pull_request.merged | Se fusiona una pull request. |
pull_request.reopened | Se vuelve a abrir una pull request cerrada. |
pull_request.published | Un borrador pasa a estar abierto. |
pull_request.label.added | Se asigna una etiqueta a una pull request. |
pull_request.label.removed | Se desasigna una etiqueta de una pull request, incluso cuando se elimina la definición de la etiqueta. |
pull_request.comment.created | Se crea un comentario visible en una pull request. |
pull_request.comment.reaction.added | Se añade una reacción a un comentario de una pull request. Volver a añadir una reacción que quien reacciona ya tiene envía este evento de nuevo. |
pull_request.comment.reaction.removed | Se elimina una reacción de un comentario de una pull request. Eliminar una reacción que quien reacciona no tiene no envía nada. |
pull_request.review.submitted | Se envía una revisión con cualquier veredicto. |
pull_request.review.dismissed | Se descarta una revisión enviada, explícitamente o por haber sido reemplazada. |
pull_request.reviewer.added | Se solicita un revisor. |
pull_request.reviewer.removed | Se elimina un revisor. |
pull_request.reviewer.rerequested | Se vuelve a solicitar un revisor. |
repository.check_run.created | Se crea una ejecución de comprobación. |
repository.check_run.completed | Finaliza una ejecución de comprobación. |
repository.check_run.rerequested | Se vuelve a solicitar una ejecución de comprobación finalizada. Solo se envía a la app propietaria de la ejecución. |
installation.created | Se instala la app. |
installation.updated | Cambian los ámbitos, la selección de repositorio o el slug del espacio de nombres del propietario. |
installation.suspended | Se suspende la instalación. |
installation.unsuspended | Se restablece una instalación suspendida. |
installation.deleted | Se desinstala la app. |
La estructura del payload de cada evento está documentada campo por campo en Payloads de eventos.
Los cinco eventos installation.* se envían a la propia app en lugar de a una suscripción de repositorio. Origin siempre los envía, por lo que no aparecen en la lista de eventos seleccionables de la app. Todos los demás eventos de esta tabla corresponden a suscripciones con ámbito de repositorio.
Una app nueva no está suscrita a ninguno de los eventos con ámbito de repositorio. Selecciona los que necesites en la configuración de la app o establécelos con el campo events de Create App o Update App. Origin solo envía un evento a las apps que estén suscritas a él, tengan configurada una URL de webhook y cuya instalación abarque el repositorio y disponga del ámbito que requiere el evento. Si no se cumplen estas condiciones, no hay entrega ni error: no se envía nada y no aparece nada en List Webhook Deliveries.
Origin no envía repository.pushed para un repositorio que replica desde GitHub. Esos pushes pertenecen a GitHub, que envía sus propios webhooks de push, por lo que una entrega de Origin los duplicaría. Los pushes a repositorios nativos de Origin y a réplicas salientes se envían con normalidad, y el estado de la réplica no afecta a ningún otro evento. repository.deleted sí se envía para un repositorio replicado desde GitHub: al detener la sincronización solo se elimina el repositorio del lado de Cherri Code, y GitHub no envía nada al respecto.
Payloads de eventos
El envoltorio de cada evento incluye el objeto de payload del evento en payload. Los eventos que comparten una misma estructura pertenecen a la misma familia de payloads; cada familia que se describe a continuación documenta los eventos que la entregan, sus campos y un payload de ejemplo, generados a partir de la especificación de OpenAPI. En la especificación, la extensión x-origin-webhook-events de cada esquema de payload enumera los eventos que lo entregan.
Repositorio creado
repository.createdCampos del payload
repository object
repository.id string
repository.name string Obligatorio
repository.fullName string
repository.owner object
repository.owner.slug string
repository.owner.id string
repository.owner.type string
team o user. Disponible solo en la salida; sin establecer cuando se desconoce. Uno de team, user.repository.defaultBranch string
repository.createdAt string
repository.updatedAt string
repository.pushedAt string
repository.cloneUrl string
repository.mirror objeto
repository.mirror.source string
github.repository.mirror.sourceId string
repository.mirror.status string
inbound, outbound.repository.visibility string
internal o private. Uno de estos valores: internal, private.repository.allowMergeCommit boolean
repository.allowSquashMerge boolean
repository.deleteBranchOnMerge boolean
Ejemplo de 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" }}Repositorio eliminado
repository.deletedCampos del 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 o user. Disponible solo en la salida; sin valor cuando se desconoce. Uno de team, user.deletedAt string
Ejemplo de event.payload:
{ "repository": { "id": "repo_01k2ja2000e0080000000000q4", "name": "rocket", "owner": { "slug": "acme", "id": "ns_01k2ja2000e0080000000000p3", "type": "team" } }, "deletedAt": "2026-08-03T08:15:00Z"}Envío al repositorio
repository.pushedUn envío atómico, que puede actualizar varias referencias. No hay un arreglo de commits; cada actualización de referencia solo incluye metadatos de la punta como mejor esfuerzo.
Campos del 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 o user. Disponible solo en la salida; sin establecer cuando se desconoce. Uno de: team, user.refUpdates array
refUpdates[].ref string
refs/heads/main o refs/tags/v3.14.1.refUpdates[].before string
ref antes del push. Todo ceros (0000000000000000000000000000000000000000) cuando la referencia se acaba de crear.refUpdates[].after string
ref después del push. Una cadena de ceros (0000000000000000000000000000000000000000) cuando se eliminó la referencia.refUpdates[].created boolean
refUpdates[].deleted boolean
refUpdates[].forced boolean
refUpdates[].headCommit objeto
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 objeto
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 Obligatorio
pusher.user.displayName string
pusher.user.handle string
pusher.user.performedVia objeto
pusher.user.performedVia.app objeto
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 entero
Ejemplo de event.payload:
{ "repository": { "id": "repo_01k2ja2000e0080000000000q4", "name": "rocket", "owner": { "slug": "acme", "id": "ns_01k2ja2000e0080000000000p3", "type": "team" } }, "refUpdates": [ { "ref": "refs/heads/add-telemetry", "before": "5c8d7e6f5a4b3c2d1e0f9a8b7c6d5e4f3a2b1c0d", "after": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4", "created": false, "deleted": false, "forced": false, "headCommit": { "sha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4", "author": { "name": "Jane Doe", "email": "[email protected]", "date": "2026-08-01T09:30:00Z" }, "committer": { "name": "Jane Doe", "email": "[email protected]", "date": "2026-08-01T09:30:00Z" }, "message": "Add launch telemetry" } } ], "pushedAt": "2026-08-02T14:45:00Z", "pusher": { "user": { "id": "user_01k2ja2000e0080000000000c3", "email": "[email protected]" } }, "refUpdatesCount": 1}Metadatos del repositorio actualizados
repository.metadata.updatedIncluye la instantánea completa del repositorio, sin delta ni actor que la actualice. Compara instantáneas sucesivas o vuelve a obtener el repositorio para ver qué cambió.
Campos del payload
repository object
repository.id string
repository.name string Obligatorio
repository.fullName string
repository.owner object
repository.owner.slug string
repository.owner.id string
repository.owner.type string
team o user. Disponible solo en la salida; sin establecer cuando se desconoce. Uno de 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, outbound.repository.visibility string
internal o private. Uno de estos valores: internal, private.repository.allowMergeCommit boolean
repository.allowSquashMerge boolean
repository.deleteBranchOnMerge boolean
Ejemplo de 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" }}Eventos de pull request
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.updatedUn cambio en el ciclo de vida de una solicitud de incorporación de cambios. La acción del ciclo de vida es event.type del sobre; no hay un campo de acción separado.
Campos de la carga útil
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 objeto
pullRequest.head.ref string
pullRequest.head.sha cadena
base, este es el base_sha de la versión, que puede estar por detrás de la punta actual de la rama (consulta PullRequestVersion).pullRequest.base object
pullRequest.base.ref string
pullRequest.base.sha string
base, este es el base_sha de la versión, que puede estar por detrás de la punta actual de la rama (consulta PullRequestVersion).pullRequest.author object
pullRequest.author.user object
pullRequest.author.user.id string
pullRequest.author.user.email string Obligatorio
pullRequest.author.user.displayName string
pullRequest.author.user.handle string
pullRequest.author.user.performedVia objeto
pullRequest.author.user.performedVia.app objeto
pullRequest.author.user.performedVia.app.id cadena
pullRequest.author.user.performedVia.app.displayName cadena
pullRequest.author.app objeto
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 string
pullRequest.mergeCommitSha string
pull/\<number>/merge (consulta GetGitRef), que es un commit distinto.pullRequest.additions entero
pullRequest.deletions entero
pullRequest.changedFiles entero
pullRequest.stack object
pullRequest.stack.id string
stack_id a ListPullRequests para listar los miembros de la pila.pullRequest.stack.parentPullRequest objeto
pullRequest.stack.parentPullRequest.id cadena
pullRequest.stack.parentPullRequest.number string
pullRequest.stack.parentPullRequest.repository objeto
pullRequest.stack.parentPullRequest.repository.id cadena
pullRequest.stack.parentPullRequest.repository.name string
pullRequest.stack.parentPullRequest.repository.owner objeto
pullRequest.stack.parentPullRequest.repository.owner.slug cadena
pullRequest.stack.parentPullRequest.repository.owner.id cadena
pullRequest.stack.parentPullRequest.repository.owner.type cadena
team o user. Solo de salida; no establecido cuando se desconoce. Uno de team, user.pullRequest.version object
pullRequest.version.number string
pullRequest.version.headSha string
pullRequest.version.baseSha string
pullRequest.version.createdAt string
pullRequest.version.potentialMergeCommit objeto
state). Se calcula para esta versión: el segundo padre del commit es head_sha; su primer padre es el base_sha de la fusión de prueba, es decir, la punta de la rama base al momento de la preparación, que puede ser más reciente que el base_sha de esta versión. La referencia pull/\<number>/merge solo apunta al commit de la versión más reciente; los commits anteriores siguen siendo accesibles por SHA mediante la API (GetCommit), aunque no se pueden obtener por SHA a través de git. Es distinto de PullRequest.merge_commit_sha, que solo se establece una vez que se ha fusionado. Se establece en PullRequest.version y PullRequestWebhook.version.pullRequest.version.potentialMergeCommit.state cadena
unknown hasta que se completa su propia preparación. Los valores no reconocidos deben tratarse como unknown. Uno de unknown, prepared, merge_conflict.pullRequest.version.potentialMergeCommit.sha cadena
state es prepared: el commit de fusión de prueba con dos padres, cuyo segundo padre es el head_sha de la versión y el primero, base_sha; la punta de pull/\<number>/merge mientras esta versión sea la más reciente; después se puede consultar por SHA.pullRequest.version.potentialMergeCommit.baseSha cadena
state es prepared: la punta de la rama base en el momento de la preparación; puede ser más reciente que el base_sha de la versión, no se actualiza si la rama base simplemente avanza; se vuelve a preparar al reabrirse.repository objeto
repository.id string
repository.name string
repository.owner object
repository.owner.slug string
repository.owner.id string
repository.owner.type string
team o user. Solo de salida; no establecido cuando se desconoce. Uno de team, user.Ejemplo de 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": "[email protected]" } }, "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" } }}Eventos de etiquetas de solicitudes de incorporación de cambios
pull_request.label.addedpull_request.label.removedUn cambio en las etiquetas asignadas al pull request. Consulta el conjunto actual con ListPullRequestLabels.
Campos de la carga útil
pullRequest objeto
pullRequest.id cadena
pullRequest.number cadena
pullRequest.repository objeto
pullRequest.repository.id cadena
pullRequest.repository.name cadena
pullRequest.repository.owner objeto
pullRequest.repository.owner.slug cadena
pullRequest.repository.owner.id cadena
pullRequest.repository.owner.type cadena
team o user. Disponible solo en la salida; sin establecer cuando se desconoce. Uno de team, user.label objeto
label.id cadena
label.name cadena
label.color cadena
# inicial.label.description string
actor objeto
actor.user objeto
actor.user.id cadena
actor.user.email cadena Obligatorio
actor.user.displayName cadena
actor.user.handle cadena
actor.user.performedVia objeto
actor.user.performedVia.app objeto
actor.user.performedVia.app.id cadena
actor.user.performedVia.app.displayName cadena
actor.app objeto
actor.app.id cadena
actor.app.displayName cadena
actor.serviceAccount objeto
actor.serviceAccount.id cadena
Ejemplo de 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": "[email protected]" } }}Comentario de pull request
pull_request.comment.createdUn comentario creado en una solicitud de incorporación. Los comentarios incluidos en una revisión se entregan cuando se envía la revisión, con un evento por cada comentario.
Campos de la carga útil
pullRequest objeto
pullRequest.id string
pullRequest.number string
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 o user. Solo de salida; sin establecer cuando se desconoce. Uno de team, user.comment object
comment.thread.id. El estado de resolución del hilo no forma parte del evento; consúltalo con GetPullRequestComment.comment.id string
comment.thread object
comment.thread.id cadena
comment.thread.version object
PullRequestReview.pull_request_version).comment.thread.version.number string
comment.thread.version.headSha string
comment.thread.version.baseSha string
comment.thread.path string
comment.thread.side string
left, right.comment.thread.startLine entero
side del archivo. 0 para los hilos a nivel de archivo y de discusión general.comment.thread.endLine entero
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 Obligatorio
comment.author.user.displayName string
comment.author.user.handle string
comment.author.user.performedVia objeto
comment.author.user.performedVia.app objeto
comment.author.user.performedVia.app.id cadena
comment.author.user.performedVia.app.displayName string
comment.author.app object
comment.author.app.id string
comment.author.app.displayName string
comment.author.serviceAccount objeto
comment.author.serviceAccount.id string
comment.createdAt string
comment.updatedAt cadena
Ejemplo de 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": "[email protected]" } }, "createdAt": "2026-08-01T09:30:00Z", "updatedAt": "2026-08-02T14:45:00Z" }}Eventos de reacciones a comentarios de pull request
pull_request.comment.reaction.addedpull_request.comment.reaction.removedUna reacción añadida a un comentario de pull request o eliminada de él. El event.type del sobre indica la acción. Una adición se entrega al menos una vez: añadir al comentario una reacción que el reactor ya tiene genera otro pull_request.comment.reaction.added para el mismo (comment, reactor, content); eliminar una reacción que el reactor no tiene no genera nada.
Campos del payload
pullRequest objeto
pullRequest.id string
pullRequest.number string
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 o user. Solo de salida; no establecido cuando se desconoce. Uno de: team, user.comment object
comment.id string
comment.thread objeto
comment.thread.id string
reaction objeto
reaction.content cadena
thumbs_up, thumbs_down, laugh, hooray, confused, heart, rocket, eyes.reaction.reactor object
reaction.reactor.user objeto
reaction.reactor.user.id string
reaction.reactor.user.email string Obligatorio
reaction.reactor.user.displayName string
reaction.reactor.user.handle string
reaction.reactor.user.performedVia objeto
reaction.reactor.user.performedVia.app objeto
reaction.reactor.user.performedVia.app.id cadena
reaction.reactor.user.performedVia.app.displayName string
reaction.reactor.app object
reaction.reactor.app.id string
reaction.reactor.app.displayName string
reaction.reactor.serviceAccount objeto
reaction.reactor.serviceAccount.id string
Ejemplo de 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": "[email protected]" } } }}Eventos de revisión de pull request
pull_request.review.submittedpull_request.review.dismissedCampos de carga útil
pullRequest object
pullRequest.id string
pullRequest.number string
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 o user. Disponible solo en la salida; sin establecer cuando se desconoce. Uno de 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 Obligatorio
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 objeto
review.dismissal.dismissedBy object
review.dismissal.dismissedBy.user object
review.dismissal.dismissedBy.user.id string
review.dismissal.dismissedBy.user.email string Obligatorio
review.dismissal.dismissedBy.user.displayName string
review.dismissal.dismissedBy.user.handle string
review.dismissal.dismissedBy.user.performedVia object
review.dismissal.dismissedBy.user.performedVia.app objeto
review.dismissal.dismissedBy.user.performedVia.app.id string
review.dismissal.dismissedBy.user.performedVia.app.displayName string
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
Ejemplo de event.payload:
{ "pullRequest": { "id": "pr_01k2ja2000e0080000000000d4", "number": "17", "repository": { "id": "repo_01k2ja2000e0080000000000q4", "name": "rocket", "owner": { "slug": "acme", "id": "ns_01k2ja2000e0080000000000p3", "type": "team" } } }, "review": { "id": "rev_01k2ja2000e0080000000000f6", "author": { "user": { "id": "user_01k2ja2000e0080000000000c3", "email": "[email protected]" } }, "verdict": "approve", "body": "Aprobado. El schema de telemetría coincide con la spec.", "submittedAt": "2026-08-02T15:00:00Z", "pullRequestVersion": { "number": "3", "headSha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4", "baseSha": "3b1f9c2d8a7e6f5049c8b7a6d5e4f3a2b1c0d9e8" } }}Eventos del revisor de solicitudes de incorporación de cambios
pull_request.reviewer.addedpull_request.reviewer.removedpull_request.reviewer.rerequestedUn cambio en los revisores solicitados del pull request. Consulta el conjunto pendiente actual con ListPullRequestRequestedReviewers.
Campos de la carga útil
pullRequest object
pullRequest.id string
pullRequest.number string
pullRequest.repository object
pullRequest.repository.id string
pullRequest.repository.name string
pullRequest.repository.owner objeto
pullRequest.repository.owner.slug string
pullRequest.repository.owner.id string
pullRequest.repository.owner.type string
team o user. Disponible solo en la salida; sin establecer cuando se desconoce. Uno de estos valores: team, user.reviewer object
reviewer.user objeto
reviewer.user.id string
reviewer.user.email string Obligatorio
reviewer.user.displayName string
reviewer.user.handle string
reviewer.user.performedVia objeto
reviewer.user.performedVia.app objeto
reviewer.user.performedVia.app.id string
reviewer.user.performedVia.app.displayName string
reviewer.group object
grp_…). Actualmente solo incluye el id.reviewer.group.id string
createdVia string
manual, codeowners.createdBy object
createdBy.user object
createdBy.user.id string
createdBy.user.email string Obligatorio
createdBy.user.displayName string
createdBy.user.handle string
createdBy.user.performedVia objeto
createdBy.user.performedVia.app objeto
createdBy.user.performedVia.app.id string
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
Ejemplo de event.payload:
{ "pullRequest": { "id": "pr_01k2ja2000e0080000000000d4", "number": "17", "repository": { "id": "repo_01k2ja2000e0080000000000q4", "name": "rocket", "owner": { "slug": "acme", "id": "ns_01k2ja2000e0080000000000p3", "type": "team" } } }, "reviewer": { "user": { "id": "user_01k2ja2000e0080000000000c3", "email": "[email protected]" } }, "createdVia": "codeowners", "createdAt": "2026-08-02T14:45:00Z"}Eventos de ejecución de comprobaciones
repository.check_run.createdrepository.check_run.updatedrepository.check_run.completedInstantánea confirmada de un evento del ciclo de vida de una ejecución de verificación de Origin.
Campos de carga útil
repository objeto
repository.id string
repository.name string
repository.owner object
repository.owner.slug string
repository.owner.id string
repository.owner.type string
team o user. Solo de salida; no se establece cuando se desconoce. Uno de team, user.checkSuite objeto
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 o user. Solo de salida; no establecido cuando se desconoce. Uno de team, user.checkSuite.sha string
checkSuite.key string
checkSuite.name string
checkSuite.detailsUrl string
checkSuite.createdAt string
checkSuite.updatedAt string
checkSuite.externalId string
checkSuite.actor objeto
checkSuite.actor.user objeto
checkSuite.actor.user.id string
checkSuite.actor.user.email string Obligatorio
checkSuite.actor.user.displayName string
checkSuite.actor.user.handle string
checkSuite.actor.user.performedVia objeto
checkSuite.actor.user.performedVia.app objeto
checkSuite.actor.user.performedVia.app.id string
checkSuite.actor.user.performedVia.app.displayName string
checkSuite.actor.app objeto
checkSuite.actor.app.id string
checkSuite.actor.app.displayName string
checkSuite.actor.serviceAccount objeto
checkSuite.actor.serviceAccount.id string
checkRun objeto
checkRun.id string
checkRun.repository object
checkRun.repository.id string
checkRun.repository.name string
checkRun.repository.owner object
checkRun.repository.owner.slug string
checkRun.repository.owner.id string
checkRun.repository.owner.type string
team o user. Solo de salida; no establecido cuando se desconoce. Uno de team, user.checkRun.checkSuite objeto
checkRun.checkSuite.id string
checkRun.sha cadena
checkRun.key string
checkRun.name string
checkRun.status string
failing es una ejecución que aún está en curso y cuya aplicación ya sabe que no superará la comprobación: pendiente para las barreras y las comprobaciones obligatorias, aún sin conclusion, y un aviso anticipado para quienes consultan su estado. rerequested es una ejecución completada cuya repetición se solicitó y a la que la aplicación responsable aún no ha respondido: pendiente para quienes consultan su estado (se muestra como queued), con conclusion y los tiempos que siguen describiendo el intento sustituido. Solo Origin puede establecerlo al volver a solicitarla (RerequestCheckRun); las aplicaciones no pueden publicarlo. Uno de estos valores: queued, in_progress, completed, rerequested, failing.checkRun.conclusion string
status es completed o rerequested. Para una ejecución rerequested, es el veredicto del intento sustituido: trate la ejecución como pendiente y lea conclusion solo cuando status == completed. Uno de los siguientes valores: success, failure, neutral, cancelled, skipped, timed_out, action_required, stale.checkRun.detailsUrl string
checkRun.externalUpdatedAt string
checkRun.startedAt string
checkRun.completedAt cadena
checkRun.createdAt string
checkRun.updatedAt string
PostCheckRunResponse.outcome), por lo que no puede distinguir entre ambas. Marca de tiempo RFC 3339.checkRun.externalId cadena
CheckRunInput.external_id: se recomienda una por ejecución).checkRun.actor objeto
actor de la suite propietaria.checkRun.actor.user objeto
checkRun.actor.user.id string
checkRun.actor.user.email string Obligatorio
checkRun.actor.user.displayName string
checkRun.actor.user.handle string
checkRun.actor.user.performedVia objeto
checkRun.actor.user.performedVia.app objeto
checkRun.actor.user.performedVia.app.id cadena
checkRun.actor.user.performedVia.app.displayName string
checkRun.actor.app object
checkRun.actor.app.id string
checkRun.actor.app.displayName string
checkRun.actor.serviceAccount objeto
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 (consulte CheckRunInput.deadline_at). Marca de tiempo RFC 3339.checkRun.isRerequestable boolean
CheckRunInput.is_rerequestable).checkRun.rerequestedAt string
status es rerequested y la ejecución permanece pendiente en el estado de CI del commit (conclusion y los tiempos corresponden al resultado sustituido); la aplicación propietaria responde publicando la ejecución que decidió mantener al declarar is_rerequestable: una nueva ejecución para la misma key o una actualización de esta ejecución (que borra este campo). Después, la ejecución podrá volver a solicitarse. Marca de tiempo RFC 3339.checkRun.rerequestedBy object
rerequested_at está definido; se elimina junto con este cuando responde la aplicación propietaria.checkRun.rerequestedBy.user object
checkRun.rerequestedBy.user.id string
checkRun.rerequestedBy.user.email string Obligatorio
checkRun.rerequestedBy.user.displayName string
checkRun.rerequestedBy.user.handle string
checkRun.rerequestedBy.user.performedVia objeto
checkRun.rerequestedBy.user.performedVia.app objeto
checkRun.rerequestedBy.user.performedVia.app.id string
checkRun.rerequestedBy.user.performedVia.app.displayName string
checkRun.rerequestedBy.app objeto
checkRun.rerequestedBy.app.id string
checkRun.rerequestedBy.app.displayName string
checkRun.rerequestedBy.serviceAccount objeto
checkRun.rerequestedBy.serviceAccount.id string
Ejemplo de event.payload:
{ "repository": { "id": "repo_01k2ja2000e0080000000000q4", "name": "rocket", "owner": { "slug": "acme", "id": "ns_01k2ja2000e0080000000000p3", "type": "team" } }, "checkSuite": { "id": "crg_01k2ja2000e0080000000000h8", "repository": { "id": "repo_01k2ja2000e0080000000000q4", "name": "rocket", "owner": { "slug": "acme", "id": "ns_01k2ja2000e0080000000000p3", "type": "team" } }, "sha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4", "key": "ci-8842", "name": "CI", "detailsUrl": "https://ci.acme.dev/runs/8842", "createdAt": "2026-08-01T09:30:00Z", "updatedAt": "2026-08-02T14:45:00Z", "externalId": "build-8842", "actor": { "user": { "id": "user_01k2ja2000e0080000000000c3", "email": "[email protected]" } } }, "checkRun": { "id": "cr_01k2ja2000e0080000000000g7", "repository": { "id": "repo_01k2ja2000e0080000000000q4", "name": "rocket", "owner": { "slug": "acme", "id": "ns_01k2ja2000e0080000000000p3", "type": "team" } }, "checkSuite": { "id": "crg_01k2ja2000e0080000000000h8" }, "sha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4", "key": "ci-8842-unit-tests", "name": "unit-tests", "status": "completed", "conclusion": "success", "detailsUrl": "https://ci.acme.dev/runs/8842", "externalUpdatedAt": "2026-08-02T14:44:30Z", "startedAt": "2026-08-02T14:40:00Z", "completedAt": "2026-08-02T14:44:30Z", "createdAt": "2026-08-01T09:30:00Z", "updatedAt": "2026-08-02T14:45:00Z", "externalId": "run-8842", "actor": { "user": { "id": "user_01k2ja2000e0080000000000c3", "email": "[email protected]" } }, "output": { "title": "Unit tests", "summary": "128 tests passed.", "text": "All suites green." } }}Ejecución de verificación solicitada nuevamente
repository.check_run.rerequestedCarga útil del webhook repository.check_run.rerequested, entregada solo a la aplicación propietaria de la ejecución de verificación. Responda publicando una ejecución nueva para el mismo SHA de head y la misma clave: una ejecución nueva (con un external_id nuevo) o una actualización de la ejecución cuya solicitud se volvió a realizar. La ejecución marcada muestra status: rerequested (su conclusión y sus tiempos corresponden al resultado reemplazado) hasta que la publicación de respuesta borra rerequested_at. Cada nueva solicitud aceptada emite un evento, y se puede volver a solicitar una ejecución una vez respondida; por lo tanto, deduplique las entregas repetidas usando únicamente el ID del evento. check_run.rerequested_at contiene la marca de la solicitud pendiente. La carga útil no incluye contexto de solicitud de incorporación de cambios (las ejecuciones de verificación se vinculan a (repository, sha)): un consumidor que necesite la solicitud de incorporación de cambios puede resolverla a partir de check_run.sha mediante su propio mapeo de ramas head, o mediante ListPullRequests filtrado por la rama head que compiló.
Campos de carga útil
repository objeto
repository.id string
repository.name string
repository.owner object
repository.owner.slug string
repository.owner.id string
repository.owner.type string
team o user. Solo de salida; no establecido cuando se desconoce. Uno de team, user.checkSuite objeto
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 o user. Solo de salida; no establecido cuando se desconoce. Uno de team, user.checkSuite.sha string
checkSuite.key string
checkSuite.name string
checkSuite.detailsUrl string
checkSuite.createdAt string
checkSuite.updatedAt string
checkSuite.externalId string
checkSuite.actor objeto
checkSuite.actor.user objeto
checkSuite.actor.user.id string
checkSuite.actor.user.email string Obligatorio
checkSuite.actor.user.displayName string
checkSuite.actor.user.handle string
checkSuite.actor.user.performedVia objeto
checkSuite.actor.user.performedVia.app objeto
checkSuite.actor.user.performedVia.app.id string
checkSuite.actor.user.performedVia.app.displayName string
checkSuite.actor.app objeto
checkSuite.actor.app.id string
checkSuite.actor.app.displayName string
checkSuite.actor.serviceAccount objeto
checkSuite.actor.serviceAccount.id string
checkRun objeto
status: rerequested); check_run.rerequested_at registra la marca temporal y check_run.rerequested_by registra la entidad que la solicitó.checkRun.id string
checkRun.repository object
checkRun.repository.id string
checkRun.repository.name string
checkRun.repository.owner objeto
checkRun.repository.owner.slug string
checkRun.repository.owner.id string
checkRun.repository.owner.type string
team o user. Solo de salida; no establecido cuando se desconoce. Uno de team, user.checkRun.checkSuite objeto
checkRun.checkSuite.id string
checkRun.sha string
checkRun.key string
checkRun.name cadena
checkRun.status string
failing es una ejecución todavía en curso que su aplicación ya sabe que no se superará: pendiente para los controles y las comprobaciones obligatorias, aún sin conclusion, y un aviso anticipado para los lectores. rerequested es una ejecución completada cuya re-ejecución se solicitó y que la aplicación propietaria aún no ha respondido: pendiente para los lectores (se representa como queued), con conclusion y las marcas de tiempo describiendo todavía el intento sustituido. Solo lo establece Origin al volver a solicitarla (RerequestCheckRun); las aplicaciones no pueden publicarlo. Uno de queued, in_progress, completed, rerequested, failing.checkRun.conclusion cadena
status es completed o rerequested. Para una ejecución rerequested, es el veredicto del intento reemplazado: trata la ejecución como pendiente y lee conclusion solo cuando status == completed. Uno de 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), por lo que no permite distinguir entre ambas. Marca de tiempo RFC 3339.checkRun.externalId string
CheckRunInput.external_id: se recomienda una por ejecución).checkRun.actor objeto
actor de la suite propietaria.checkRun.actor.user objeto
checkRun.actor.user.id string
checkRun.actor.user.email string Obligatorio
checkRun.actor.user.displayName string
checkRun.actor.user.handle string
checkRun.actor.user.performedVia objeto
checkRun.actor.user.performedVia.app objeto
checkRun.actor.user.performedVia.app.id cadena
checkRun.actor.user.performedVia.app.displayName string
checkRun.actor.app object
checkRun.actor.app.id string
checkRun.actor.app.displayName string
checkRun.actor.serviceAccount objeto
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 (véase CheckRunInput.deadline_at). Marca de tiempo RFC 3339.checkRun.isRerequestable boolean
CheckRunInput.is_rerequestable).checkRun.rerequestedAt string
status es rerequested y la ejecución permanece en el estado de CI del commit como pendiente (conclusion y los tiempos son el resultado reemplazado); la aplicación propietaria responde publicando la ejecución a la que se comprometió declarando is_rerequestable — una nueva ejecución para la misma key, o una actualización de esta ejecución (que borra este campo) — tras lo cual la ejecución puede volver a solicitarse. Marca de tiempo RFC 3339.checkRun.rerequestedBy object
rerequested_at está establecido; se borra junto con él cuando la aplicación propietaria responde.checkRun.rerequestedBy.user objeto
checkRun.rerequestedBy.user.id string
checkRun.rerequestedBy.user.email string Obligatorio
checkRun.rerequestedBy.user.displayName string
checkRun.rerequestedBy.user.handle string
checkRun.rerequestedBy.user.performedVia objeto
checkRun.rerequestedBy.user.performedVia.app objeto
checkRun.rerequestedBy.user.performedVia.app.id string
checkRun.rerequestedBy.user.performedVia.app.displayName string
checkRun.rerequestedBy.app object
checkRun.rerequestedBy.app.id string
checkRun.rerequestedBy.app.displayName string
checkRun.rerequestedBy.serviceAccount objeto
checkRun.rerequestedBy.serviceAccount.id string
Ejemplo de event.payload:
{ "repository": { "id": "repo_01k2ja2000e0080000000000q4", "name": "rocket", "owner": { "slug": "acme", "id": "ns_01k2ja2000e0080000000000p3", "type": "team" } }, "checkSuite": { "id": "crg_01k2ja2000e0080000000000h8", "repository": { "id": "repo_01k2ja2000e0080000000000q4", "name": "rocket", "owner": { "slug": "acme", "id": "ns_01k2ja2000e0080000000000p3", "type": "team" } }, "sha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4", "key": "ci-8842", "name": "CI", "detailsUrl": "https://ci.acme.dev/runs/8842", "createdAt": "2026-08-01T09:30:00Z", "updatedAt": "2026-08-02T15:10:00Z", "externalId": "build-8842", "actor": { "user": { "id": "user_01k2ja2000e0080000000000c3", "email": "[email protected]" } } }, "checkRun": { "id": "cr_01k2ja2000e0080000000000g7", "repository": { "id": "repo_01k2ja2000e0080000000000q4", "name": "rocket", "owner": { "slug": "acme", "id": "ns_01k2ja2000e0080000000000p3", "type": "team" } }, "checkSuite": { "id": "crg_01k2ja2000e0080000000000h8" }, "sha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4", "key": "ci-8842-unit-tests", "name": "unit-tests", "status": "rerequested", "conclusion": "failure", "detailsUrl": "https://ci.acme.dev/runs/8842", "externalUpdatedAt": "2026-08-02T14:44:30Z", "startedAt": "2026-08-02T14:40:00Z", "completedAt": "2026-08-02T14:44:30Z", "createdAt": "2026-08-01T09:30:00Z", "updatedAt": "2026-08-02T15:10:00Z", "externalId": "run-8842", "actor": { "user": { "id": "user_01k2ja2000e0080000000000c3", "email": "[email protected]" } }, "output": { "title": "Unit tests", "summary": "1 of 129 tests failed.", "text": "FAIL telemetry.spec.ts > flushes queued events on shutdown" }, "isRerequestable": true, "rerequestedAt": "2026-08-02T15:10:00Z", "rerequestedBy": { "user": { "id": "user_01k2ja2000e0080000000000c3", "email": "[email protected]" } } }}Instalación creada
installation.createdCampos del payload
installation object
installation.id string
installation.appId string
app.id en el payload.installation.target objeto
installation.target.slug string
installation.target.id string
installation.target.type string
team o user. Disponible solo en la salida; sin establecer cuando se desconoce. Uno de 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 string
team o user. Disponible solo en la salida; sin establecer cuando se desconoce. Uno de team, user.installation.scopes array
installation.repositoriesCount entero
installation.createdAt string
installation.updatedAt string
installation.deletedAt string
installation.suspendedAt string
installation.installedBy object
installation.installedBy.id string
installation.installedBy.email string Obligatorio
installation.installedBy.displayName string
installation.installedBy.handle string
installation.installedBy.performedVia objeto
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
Ejemplo de event.payload:
{ "installation": { "id": "inst_01k2ja2000e0080000000000b2", "appId": "app_01k2ja2000e0080000000000a1", "target": { "slug": "acme", "id": "ns_01k2ja2000e0080000000000p3", "type": "team" }, "repoSelectionMode": "selected", "repositories": [ { "id": "repo_01k2ja2000e0080000000000q4", "name": "rocket", "owner": { "slug": "acme", "id": "ns_01k2ja2000e0080000000000p3", "type": "team" } } ], "scopes": [ "repository:contents:read", "repository:pull_requests:read" ], "repositoriesCount": 1, "createdAt": "2026-08-01T09:30:00Z", "updatedAt": "2026-08-01T09:30:00Z", "installedBy": { "id": "user_01k2ja2000e0080000000000c3", "email": "[email protected]" } }, "app": { "id": "app_01k2ja2000e0080000000000a1", "displayName": "CI Status Bot" }}Instalación actualizada
installation.updatedCampos de la carga útil
installation object
installation.id string
installation.appId string
app.id en el payload.installation.target objeto
installation.target.slug string
installation.target.id string
installation.target.type string
team o user. Disponible solo en la salida; sin establecer cuando se desconoce. Uno de 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 string
team o user. Disponible solo en la salida; sin establecer cuando se desconoce. Uno de team, user.installation.scopes array
installation.repositoriesCount entero
installation.createdAt string
installation.updatedAt string
installation.deletedAt string
installation.suspendedAt string
installation.installedBy object
installation.installedBy.id string
installation.installedBy.email string Obligatorio
installation.installedBy.displayName string
installation.installedBy.handle string
installation.installedBy.performedVia objeto
installation.installedBy.performedVia.app objeto
installation.installedBy.performedVia.app.id string
installation.installedBy.performedVia.app.displayName string
app object
app.id string
app.displayName string
Ejemplo de event.payload:
{ "installation": { "id": "inst_01k2ja2000e0080000000000b2", "appId": "app_01k2ja2000e0080000000000a1", "target": { "slug": "acme", "id": "ns_01k2ja2000e0080000000000p3", "type": "team" }, "repoSelectionMode": "selected", "repositories": [ { "id": "repo_01k2ja2000e0080000000000q4", "name": "rocket", "owner": { "slug": "acme", "id": "ns_01k2ja2000e0080000000000p3", "type": "team" } } ], "scopes": [ "repository:contents:read", "repository:pull_requests:read" ], "repositoriesCount": 1, "createdAt": "2026-08-01T09:30:00Z", "updatedAt": "2026-08-02T14:45:00Z", "installedBy": { "id": "user_01k2ja2000e0080000000000c3", "email": "[email protected]" } }, "app": { "id": "app_01k2ja2000e0080000000000a1", "displayName": "CI Status Bot" }}Instalación suspendida
installation.suspendedCampos de la carga útil
installation object
installation.id string
installation.appId string
app.id en el payload.installation.target objeto
installation.target.slug string
installation.target.id string
installation.target.type string
team o user. Solo de salida; sin establecer cuando se desconoce. Uno de 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 string
team o user. Disponible solo en la salida; sin establecer cuando se desconoce. Uno de team, user.installation.scopes array
installation.repositoriesCount entero
installation.createdAt string
installation.updatedAt string
installation.deletedAt string
installation.suspendedAt string
installation.installedBy object
installation.installedBy.id string
installation.installedBy.email string Obligatorio
installation.installedBy.displayName string
installation.installedBy.handle string
installation.installedBy.performedVia objeto
installation.installedBy.performedVia.app objeto
installation.installedBy.performedVia.app.id string
installation.installedBy.performedVia.app.displayName string
app object
app.id string
app.displayName string
Ejemplo de event.payload:
{ "installation": { "id": "inst_01k2ja2000e0080000000000b2", "appId": "app_01k2ja2000e0080000000000a1", "target": { "slug": "acme", "id": "ns_01k2ja2000e0080000000000p3", "type": "team" }, "repoSelectionMode": "selected", "repositories": [ { "id": "repo_01k2ja2000e0080000000000q4", "name": "rocket", "owner": { "slug": "acme", "id": "ns_01k2ja2000e0080000000000p3", "type": "team" } } ], "scopes": [ "repository:contents:read", "repository:pull_requests:read" ], "repositoriesCount": 1, "createdAt": "2026-08-01T09:30:00Z", "installedBy": { "id": "user_01k2ja2000e0080000000000c3", "email": "[email protected]" }, "suspendedAt": "2026-08-03T08:15:00Z" }, "app": { "id": "app_01k2ja2000e0080000000000a1", "displayName": "CI Status Bot" }}Instalación reactivada
installation.unsuspendedCampos de carga útil
installation object
installation.id string
installation.appId string
app.id en el payload.installation.target objeto
installation.target.slug string
installation.target.id string
installation.target.type string
team o user. Disponible solo en la salida; sin establecer cuando se desconoce. Uno de 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 string
team o user. Disponible solo en la salida; sin establecer cuando se desconoce. Uno de team, user.installation.scopes array
installation.repositoriesCount entero
installation.createdAt string
installation.updatedAt string
installation.deletedAt string
installation.suspendedAt string
installation.installedBy object
installation.installedBy.id string
installation.installedBy.email string Obligatorio
installation.installedBy.displayName string
installation.installedBy.handle string
installation.installedBy.performedVia objeto
installation.installedBy.performedVia.app objeto
installation.installedBy.performedVia.app.id string
installation.installedBy.performedVia.app.displayName string
app object
app.id string
app.displayName string
Ejemplo de event.payload:
{ "installation": { "id": "inst_01k2ja2000e0080000000000b2", "appId": "app_01k2ja2000e0080000000000a1", "target": { "slug": "acme", "id": "ns_01k2ja2000e0080000000000p3", "type": "team" }, "repoSelectionMode": "selected", "repositories": [ { "id": "repo_01k2ja2000e0080000000000q4", "name": "rocket", "owner": { "slug": "acme", "id": "ns_01k2ja2000e0080000000000p3", "type": "team" } } ], "scopes": [ "repository:contents:read", "repository:pull_requests:read" ], "repositoriesCount": 1, "createdAt": "2026-08-01T09:30:00Z", "installedBy": { "id": "user_01k2ja2000e0080000000000c3", "email": "[email protected]" } }, "app": { "id": "app_01k2ja2000e0080000000000a1", "displayName": "CI Status Bot" }}Instalación eliminada
installation.deletedCampos del payload
installation object
installation.id string
installation.appId string
app.id en el payload.installation.target objeto
installation.target.slug string
installation.target.id string
installation.target.type string
team o user. Disponible solo en la salida; sin establecer cuando se desconoce. Uno de 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 string
team o user. Disponible solo en la salida; sin establecer cuando se desconoce. Uno de team, user.installation.scopes array
installation.repositoriesCount entero
installation.createdAt string
installation.updatedAt string
installation.deletedAt string
installation.suspendedAt string
installation.installedBy object
installation.installedBy.id string
installation.installedBy.email string Obligatorio
installation.installedBy.displayName string
installation.installedBy.handle string
installation.installedBy.performedVia object
installation.installedBy.performedVia.app objeto
installation.installedBy.performedVia.app.id string
installation.installedBy.performedVia.app.displayName string
app object
app.id string
app.displayName string
Ejemplo de event.payload:
{ "installation": { "id": "inst_01k2ja2000e0080000000000b2", "appId": "app_01k2ja2000e0080000000000a1", "target": { "slug": "acme", "id": "ns_01k2ja2000e0080000000000p3", "type": "team" }, "repoSelectionMode": "selected", "repositories": [ { "id": "repo_01k2ja2000e0080000000000q4", "name": "rocket", "owner": { "slug": "acme", "id": "ns_01k2ja2000e0080000000000p3", "type": "team" } } ], "scopes": [ "repository:contents:read", "repository:pull_requests:read" ], "repositoriesCount": 1, "createdAt": "2026-08-01T09:30:00Z", "installedBy": { "id": "user_01k2ja2000e0080000000000c3", "email": "[email protected]" }, "deletedAt": "2026-08-03T08:15:00Z" }, "app": { "id": "app_01k2ja2000e0080000000000a1", "displayName": "CI Status Bot" }}Anotaciones de ejecución de verificación
repository.check_run.annotations.createdUna solicitud de CreateCheckRunAnnotations añadió anotaciones a una ejecución de comprobación (repository.check_run.annotations.created). Las anotaciones solo se pueden añadir (nunca se editan ni se eliminan por separado), así que .created representa todo su ciclo de vida y cada solicitud genera un evento. check_run es una referencia, no una instantánea: consulte GetCheckRun para conocer el estado, la conclusión y la salida de la ejecución. annotations conserva el orden de la solicitud y puede incluir menos elementos que los indicados por annotations_count si Origin limitó la lista para poder entregar el cuerpo; obtenga el resto por páginas con ListCheckRunAnnotations. Como en los demás webhooks de ejecuciones de comprobación, el payload no incluye contexto de pull request: identifique el pull request a partir de sha.
Campos de carga útil
repository objeto
repository.id string
repository.name string
repository.owner object
repository.owner.slug string
repository.owner.id string
repository.owner.type string
team o user. Solo de salida; no establecido cuando se desconoce. Uno de team, user.checkRun objeto
checkRun.id string
checkRun.name cadena
checkRun.checkSuite objeto
checkRun.checkSuite.id string
sha cadena
annotations array
annotations[].id string
annotations[].checkRunId cadena
annotations[].annotationLevel cadena
notice, warning, failure.annotations[].message cadena
annotations[].title cadena
annotations[].rawDetails cadena
annotations[].createdAt cadena
annotations[].updatedAt cadena
annotations[].location objeto
path, start_line y end_line son obligatorios siempre que la anotación que los contiene incluya este mensaje. path es una ruta canónica relativa al repositorio; las líneas y columnas son coordenadas positivas e inclusivas que comienzan en 1, y columns solo se admite para un intervalo de una sola línea.annotations[].location.path cadena Obligatorio
annotations[].location.startLine entero Obligatorio
annotations[].location.endLine entero Obligatorio
annotations[].location.columns objeto
annotations[].location.columns.startColumn entero
annotations[].location.columns.endColumn entero
annotationsCount entero
createdAt string
Ejemplo de 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"}