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 Cursor. 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.
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:
https://cursor.com/codebase/apps/install ?client_id=APP_ID &scope=SPACE_SEPARATED_SCOPES &redirect_uri=REGISTERED_CALLBACK &state=RANDOM_ANTI_FORGERY_VALUE &summary=SHORT_REASON_FOR_ACCESS &include_granted_scopes=true| 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. Cursor 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": "installer@example.com", "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 Cursor 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 Cursor 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. Cursor 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 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.
Eliminar la instalación o eliminar la aplicación invalida sus tokens 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 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 la concesión completa de la instalación.
Usa tokens de instalación para operaciones con ámbito de repositorio, incluidos los pull requests, las escrituras de comprobaciones de ejecución y Git por HTTPS.
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.
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 Cursor 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. |
namespace:settings:write | Crear o actualizar y eliminar grants sobre un propietario. |
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 permisos. 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 Replicación, Force Repo Replicación Cutover y Detach Repo Replicación 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 Cursor, y quien realiza la llamada también debe administrar el repositorio en la fuente ascendente de la replicación.
La gestión de aplicaciones queda fuera por la misma razón. Crear aplicación requiere namespace:apps:create, List Namespace Apps requiere namespace:apps:read, Get App requiere app:settings: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 Cursor 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 |
Cursor puede aumentar los presupuestos por minuto de cada aplicación para los partners de diseño. Contacta con Cursor 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.
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 Cursor 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.
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.
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 aplicación.
- 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. - 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. 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
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"}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 espejados. Un espejo (mirror) es de solo lectura hasta que se convierte en un mirror saliente estable: consulta Repositorios espejados.
Parámetros de consulta
pageSize entero
pageToken string
next_page_token de una respuesta anterior. Vacío para la primera página.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
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
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
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).
Parámetros de ruta
namespaceSlug cadena Obligatorio
Cuerpo de la solicitud
displayName cadena Obligatorio
publicKey cadena Obligatorio
webhookUrl cadena
events array
description cadena
websiteUrl cadena
installationRedirectUris array
defaultScopes array
repository:contents:read. Las instalaciones siguen aceptando scopes de forma explícita.Campos de respuesta
id cadena
app_.displayName cadena
webhookUrl cadena
events array
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 requests.", "websiteUrl": "https://ci.acme.dev", "defaultScopes": [ "repository:contents:read", "repository:pull_requests: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 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.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 el desplazamiento de página, por lo que se ignora page_size en una solicitud posterior cuando se proporciona un token.Campos de respuesta
branches array
branches[].name cadena
branches[].commit object
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. Las entradas del archivo se encuentran en la raíz del tar, sin un directorio contenedor. 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.
Publicar ejecución de verificación
/v1/origin/repos/{ownerSlug}/{repoName}/check-runsCrea o actualiza ("upsert") 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 que posee 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 realiza un 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.
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 y entrega repository.check_run.completed. La expiración se ejecuta como una limpieza periódica en lugar de un temporizador por ejecución, por lo que una ejecución puede permanecer brevemente pasada su fecha límite antes de que Origin la cierre. 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 borra. Origin deja intacto el externalUpdatedAt de la ejecución cuando agota el 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 string 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
checkRun.completedAt string
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 obliga a tu aplicación a suscribirse a repository.check_run.rerequested y a responder a cada entrega publicando una nueva ejecución para la misma SHA del head y key: bien una nueva ejecución con un nuevo externalId, que conserva el intento anterior como historial, bien una actualización de la ejecución re-solicitada con el mismo externalId, que la refresca en el mismo lugar. Hasta que llegue esa nueva publicación, la ejecución re-solicitada 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 pull request muestra la ejecución a la espera de su re-ejecución; declarar que puede re-solicitarse sin responder deja la comprobación en suspenso. 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 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 string
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 string
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 string
checkRun.startedAt string
checkRun.completedAt cadena
checkRun.createdAt string
checkRun.updatedAt string
checkRun.externalId string
checkRun.actor objeto
checkRun.actor.user objeto
checkRun.actor.user.id string
checkRun.actor.user.email string
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 figura como pendiente, con conclusion y los tiempos aún mostrando el resultado sustituido, por lo que una comprobación obligatoria bloquea la fusión hasta que la aplicación responda.checkRun.rerequestedBy objeto
actor. Está presente siempre que se establezca rerequestedAt y se borra junto con él.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": "jane@acme.dev" } } }, "checkRun": { "id": "cr_01k2ja2000e0080000000000g7", "repository": { "id": "repo_01k2ja2000e0080000000000q4", "name": "rocket", "owner": { "slug": "acme", "id": "ns_01k2ja2000e0080000000000p3", "type": "team" } }, "checkSuite": { "id": "crg_01k2ja2000e0080000000000h8" }, "sha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4", "key": "ci-8842-unit-tests", "name": "unit-tests", "status": "completed", "conclusion": "success", "detailsUrl": "https://ci.acme.dev/runs/8842", "externalUpdatedAt": "2026-08-02T14:44:30Z", "startedAt": "2026-08-02T14:40:00Z", "completedAt": "2026-08-02T14:44:30Z", "createdAt": "2026-08-01T09:30:00Z", "updatedAt": "2026-08-02T14:45:00Z", "externalId": "run-8842", "actor": { "user": { "id": "user_01k2ja2000e0080000000000c3", "email": "jane@acme.dev" } }, "output": { "title": "Unit tests", "summary": "128 tests passed.", "text": "All suites green." } }}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.
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 string
checkRuns[0].completedAt cadena
checkRuns[0].detailsUrl string
checkRuns[0].externalId string Obligatorio
checkRuns[0].output object
checkRuns[0].output.title string
checkRuns[0].output.summary string
checkRuns[0].output.text string
checkRuns[0].deadlineAt string
InvalidArgument (HTTP 400) 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 compromete a tu app a suscribirse a repository.check_run.rerequested y a responder a cada entrega publicando una ejecución nueva para el mismo SHA de cabecera 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 refresca en su lugar. Hasta que llegue esa nueva publicación, la ejecución re-solicitada aparece como pendiente en el estado de comprobación más reciente del commit, por lo que una comprobación obligatoria bloquea la fusión y la pull request muestra la ejecución como en espera de su reejecución; declarar que puede re-solicitarse sin responder deja la comprobación varada. Origin no verifica la suscripción cuando la 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 object
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 string
checkSuite.name string
checkSuite.detailsUrl string
checkSuite.createdAt string
checkSuite.updatedAt string
checkSuite.externalId string
checkSuite.actor object
checkSuite.actor.user objeto
checkSuite.actor.user.id string
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
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 string
checkRuns[].key cadena
checkRuns[].name string
checkRuns[].status string
checkRuns[].conclusion string
status es completed.checkRuns[].detailsUrl string
checkRuns[].externalUpdatedAt string
checkRuns[].startedAt string
checkRuns[].completedAt string
checkRuns[].createdAt string
checkRuns[].updatedAt string
checkRuns[].externalId cadena
checkRuns[].actor object
checkRuns[].actor.user object
checkRuns[].actor.user.id string
checkRuns[].actor.user.email string
checkRuns[].actor.user.displayName string
checkRuns[].actor.user.handle 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 object
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 verificación más reciente del commit y aparece como pendiente, mientras que conclusion y las marcas de tiempo siguen conteniendo el resultado reemplazado, 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 se establece rerequestedAt y se borra junto con él.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": "jane@acme.dev" } } }, "checkRuns": [ { "id": "cr_01k2ja2000e0080000000000g7", "repository": { "id": "repo_01k2ja2000e0080000000000q4", "name": "rocket", "owner": { "slug": "acme", "id": "ns_01k2ja2000e0080000000000p3", "type": "team" } }, "checkSuite": { "id": "crg_01k2ja2000e0080000000000h8" }, "sha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4", "key": "ci-8842-unit-tests", "name": "unit-tests", "status": "completed", "conclusion": "success", "detailsUrl": "https://ci.acme.dev/runs/8842", "externalUpdatedAt": "2026-08-02T14:44:30Z", "startedAt": "2026-08-02T14:40:00Z", "completedAt": "2026-08-02T14:44:30Z", "createdAt": "2026-08-01T09:30:00Z", "updatedAt": "2026-08-02T14:45:00Z", "externalId": "run-8842", "actor": { "user": { "id": "user_01k2ja2000e0080000000000c3", "email": "jane@acme.dev" } }, "output": { "title": "Unit tests", "summary": "128 tests passed.", "text": "All suites green." } } ]}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.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, mientras que conclusion y las marcas de tiempo aún contienen el resultado reemplazado; por ello, 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": "jane@acme.dev" } }, "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 tamaño de página y el alcance para el resto de la secuencia, por lo que pageSize se ignora una vez que se envía uno.
Parámetros de ruta
ownerSlug string Obligatorio
repoName string Obligatorio
checkRunId string Obligatorio
Parámetros de consulta
pageSize entero
pageToken string
nextPageToken de una respuesta anterior. Omítelo en la primera página.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 objeto
annotations[].location.columns.startColumn entero
annotations[].location.columns.endColumn entero
nextPageToken string
curl --request GET \ --url 'https://api.cursor.com/v1/origin/repos/OWNER_SLUG/REPO_NAME/check-runs/CHECK_RUN_ID/annotations' \ --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN'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 integer Obligatorio
annotations[].location.endLine integer 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 app 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 app propietaria con repository.check_run.rerequested. La app responde publicando una ejecución nueva 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 reemplazado. La llamada devuelve la ejecución con rerequestedAt establecido y status rerequested.
La ejecución debe estar completed, debe contener isRerequestable, debe ser el intento actual de su key y debe situarse en el head actual de una pull request abierta. Cualquier otra situación devuelve FailedPrecondition (HTTP 400).
Puede haber una nueva 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, sin importar qué aplicación la haya informado. 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 string
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.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 las marcas de tiempo 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 borra junto con él.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": "jane@acme.dev" } }}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": "jane@acme.dev" } }}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 obsoletos se omiten. 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. Lee un intento obsoleto 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 string
next_page_token de una respuesta anterior. Vacío para la primera página. Codifica el id del último check-run visto, limitado al ámbito de esta suite, por lo que page_size se ignora en una solicitud posterior cuando se proporciona un token.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 object
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
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 elimina 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": "jane@acme.dev" } }, "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 supersedidos se omiten. Una ejecución que ha sido vuelva a solicitar permanece en la lista y aparece como pendiente, con status en rerequested y rerequestedAt establecido, y su conclusion y sus tiempos sin cambios, hasta que responda la aplicación propietaria. Lea un intento supersedido 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 string
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, por lo que page_size en una solicitud de seguimiento se ignora cuando se proporciona un token, y reutilizar un token con filtros distintos devuelve InvalidArgument (HTTP 400).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 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 string
checkRuns[].updatedAt string
checkRuns[].externalId string
checkRuns[].actor objeto
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 string
checkRuns[].output.summary string
checkRuns[].output.text string
checkRuns[].deadlineAt string
checkRuns[].isRerequestable booleano
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 las marcas de tiempo mostrando aún el resultado sustituido, por lo que una verificación obligatoria bloquea la fusión hasta que la aplicación responda.checkRuns[].rerequestedBy objeto
actor. Presente siempre que rerequestedAt esté establecido y se borra 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": "jane@acme.dev" } }, "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-suitesLista las suites de comprobación reportadas frente a un commit. Devuelve solo el último intento de cada suite, por actor informante y clave de suite; se omiten los intentos sustituidos. Consulta un intento sustituido por su propio id con Obtener suite de comprobación. Devuelve solo los metadatos de la suite (sin ejecuciones incrustadas). Paginado.
Parámetros de ruta
ownerSlug string Obligatorio
repoName string Obligatorio
sha string Obligatorio
Parámetros de consulta
pageSize entero
pageToken string
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, por lo que page_size en una solicitud de seguimiento se ignora cuando se proporciona un token.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": "jane@acme.dev" } } } ]}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
next_page_token de una respuesta anterior. Vacío para la primera página. Codifica la referencia y la página de inicio, por lo que sha/page_size en una solicitud posterior se ignoran cuando se proporciona un token.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": "jane@acme.dev", "date": "2026-08-01T09:30:00Z" }, "committer": { "name": "Jane Doe", "email": "jane@acme.dev", "date": "2026-08-01T09:30:00Z" }, "message": "Add launch telemetry", "tree": { "sha": "a7b6c5d4e3f2a1b0c9d8e7f6a5b4c3d2e1f0a9b8" } }, "parents": [ { "sha": "3b1f9c2d8a7e6f5049c8b7a6d5e4f3a2b1c0d9e8" } ], "stats": { "additions": 128, "deletions": 46, "total": 174 } } ]}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.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": "jane@acme.dev", "date": "2026-08-01T09:30:00Z" }, "committer": { "name": "Jane Doe", "email": "jane@acme.dev", "date": "2026-08-01T09:30:00Z" }, "message": "Add launch telemetry", "tree": { "sha": "a7b6c5d4e3f2a1b0c9d8e7f6a5b4c3d2e1f0a9b8" } }, "parents": [ { "sha": "3b1f9c2d8a7e6f5049c8b7a6d5e4f3a2b1c0d9e8" } ], "stats": { "additions": 128, "deletions": 46, "total": 174 }}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. Los resultados predeterminados son 30 archivos y están limitados a 100. Un token de página fija el commit resuelto, el tamaño de página y el cursor de archivos; en solicitudes posteriores, sha y pageSize deben 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 archivos binarios.
Parámetros de ruta
ownerSlug string Obligatorio
repoName string Obligatorio
sha string Obligatorio
HEAD) del commit cuyos archivos se quieren listar.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, el tamaño de página y el cursor de archivo, por lo que sha y page_size en una solicitud posterior deben coincidir con el token.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": "jane@acme.dev", "date": "2026-08-01T09:30:00Z" }, "committer": { "name": "Jane Doe", "email": "jane@acme.dev", "date": "2026-08-01T09:30:00Z" }, "message": "Add launch telemetry", "tree": { "sha": "a7b6c5d4e3f2a1b0c9d8e7f6a5b4c3d2e1f0a9b8" } }, "parents": [ { "sha": "3b1f9c2d8a7e6f5049c8b7a6d5e4f3a2b1c0d9e8" } ], "stats": { "additions": 128, "deletions": 46, "total": 174 } }, "headCommit": { "sha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4", "commit": { "author": { "name": "Jane Doe", "email": "jane@acme.dev", "date": "2026-08-01T09:30:00Z" }, "committer": { "name": "Jane Doe", "email": "jane@acme.dev", "date": "2026-08-01T09:30:00Z" }, "message": "Add launch telemetry", "tree": { "sha": "a7b6c5d4e3f2a1b0c9d8e7f6a5b4c3d2e1f0a9b8" } }, "parents": [ { "sha": "3b1f9c2d8a7e6f5049c8b7a6d5e4f3a2b1c0d9e8" } ], "stats": { "additions": 128, "deletions": 46, "total": 174 } }, "mergeBaseCommit": { "sha": "3b1f9c2d8a7e6f5049c8b7a6d5e4f3a2b1c0d9e8", "commit": { "author": { "name": "Jane Doe", "email": "jane@acme.dev", "date": "2026-08-01T09:30:00Z" }, "committer": { "name": "Jane Doe", "email": "jane@acme.dev", "date": "2026-08-01T09:30:00Z" }, "message": "Add launch telemetry", "tree": { "sha": "a7b6c5d4e3f2a1b0c9d8e7f6a5b4c3d2e1f0a9b8" } }, "parents": [ { "sha": "3b1f9c2d8a7e6f5049c8b7a6d5e4f3a2b1c0d9e8" } ], "stats": { "additions": 128, "deletions": 46, "total": 174 } }}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, el tamaño de página y el cursor de archivos, por lo que basehead y page_size en una solicitud de seguimiento deben 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.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 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. 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
wholeWord boolean
contextBefore entero
contextAfter entero
filterPath cadena
includes array
/ coincide a cualquier depth, * coincide dentro de un único segmento del path y ** coincide a través de varios segmentos. Si hay algún include, no se busca en los paths que no coincidan con ninguno de ellos. Máximo 20 entries. Tamaño UTF-8 máximo por patrón: 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. Acota query, filterPath o las listas de glob para buscar en un conjunto menor 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.
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.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": "jane@acme.dev", "date": "2026-08-01T09:30:00Z" }, "committer": { "name": "Jane Doe", "email": "jane@acme.dev", "date": "2026-08-01T09:30:00Z" }, "message": "Add launch telemetry", "tree": { "sha": "a7b6c5d4e3f2a1b0c9d8e7f6a5b4c3d2e1f0a9b8" }, "parents": [ { "sha": "3b1f9c2d8a7e6f5049c8b7a6d5e4f3a2b1c0d9e8" } ]}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": "jane@acme.dev" }, "files": [ { "path": "src/login/telemetry.ts", "content": "export const LOGIN_EVENT = 1;" }, { "path": "assets/login.png", "content": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNkYPhfDwAChwGA60e6kgAAAABJRU5ErkJggg==", "encoding": "base64" }, { "path": "src/login/legacy.ts", "delete": true } ]}'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.
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). 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" }}Listar referencias de Git que coinciden
/v1/origin/repos/{ownerSlug}/{repoName}/git/matching-refsEnumera 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 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' \ --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": "jane@acme.dev", "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.pageToken cadena
next_page_token de una respuesta anterior. Vacío para la primera página.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": "jane@acme.dev" }, "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 la permission que un user, un group o el group del equipo propietario tiene directamente sobre un repositorio y reemplaza cualquier permission otorgada antes de forma directa a ese principal. Repetir un grant que el principal ya tiene se completa correctamente y no produce ningún cambio. El user debe ser un miembro active del equipo u organization del owner del repositorio, y el group debe ser un group active de esa organization; 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": "jane@acme.dev" }, "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 a quiénes se les ha concedido 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 sobre todos los repositorios del propietario. Las concesiones otorgadas sobre repositorios individuales no se incluyen; consúltalas con List Repository Grants.
Parámetros de ruta
ownerSlug cadena Obligatorio
Parámetros de consulta
pageSize entero
pageToken.pageToken cadena
next_page_token de una respuesta anterior. Vacío para la primera página.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": "jane@acme.dev" }, "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 es un group active de esa 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.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": "jane@acme.dev" }, "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 Required
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.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.
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 pull requests
/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 abarca todas las pull requests 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.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 apps y las cuentas de servicio no tienen identidad de correo electrónico, por lo que solo se pueden seleccionar autores usuarios de esa manera. Un autor sin pull requests devuelve una lista vacía, al igual que un correo electrónico que no se resuelve en 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 creados más recientemente y con sortBy=updated los actualizados más recientemente. "asc" invierte cada caso. 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 malformada 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).Campos de respuesta
pullRequests array
pullRequests[].id cadena
pullRequests[].number string
pullRequests[].state string
pullRequests[].draft boolean
pullRequests[].merged booleano
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
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[].version objeto
pullRequests[].version.number string
pullRequests[].version.headSha string
pullRequests[].version.baseSha string
pullRequests[].version.createdAt string
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": "main", "sha": "3b1f9c2d8a7e6f5049c8b7a6d5e4f3a2b1c0d9e8" }, "author": { "user": { "id": "user_01k2ja2000e0080000000000c3", "email": "jane@acme.dev" } }, "createdAt": "2026-08-01T09:30:00Z", "updatedAt": "2026-08-02T14:45:00Z", "additions": 128, "deletions": 46, "changedFiles": 5, "labels": [ { "id": "lbl_01k2ja2000e0080000000000m1", "name": "bug", "color": "d73a4a", "description": "Something isn't working" } ], "version": { "number": "3", "headSha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4", "baseSha": "3b1f9c2d8a7e6f5049c8b7a6d5e4f3a2b1c0d9e8", "createdAt": "2026-08-01T09:30:00Z" } } ]}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 Origin; pueden ser nombres de rama cortos o valores totalmente calificados refs/heads/….
Parámetros de ruta
ownerSlug string Obligatorio
repoName string Obligatorio
pullNumber string Obligatorio
Campos de respuesta
id string
número 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
additions integer
deletions entero
changedFiles entero
labels array
labels[].id string
labels[].name string
labels[].color string
#.labels[].description string
version objeto
version.number string
version.headSha cadena
version.baseSha cadena
version.createdAt string
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": "main", "sha": "3b1f9c2d8a7e6f5049c8b7a6d5e4f3a2b1c0d9e8" }, "author": { "user": { "id": "user_01k2ja2000e0080000000000c3", "email": "jane@acme.dev" } }, "createdAt": "2026-08-01T09:30:00Z", "updatedAt": "2026-08-02T14:45:00Z", "additions": 128, "deletions": 46, "changedFiles": 5, "labels": [ { "id": "lbl_01k2ja2000e0080000000000m1", "name": "bug", "color": "d73a4a", "description": "Something isn't working" } ], "version": { "number": "3", "headSha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4", "baseSha": "3b1f9c2d8a7e6f5049c8b7a6d5e4f3a2b1c0d9e8", "createdAt": "2026-08-01T09:30:00Z" }}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 rama head de un pull request abierto desvinculada de 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
parentPullNumber string
Campos de la respuesta
id string
number string
state string
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
additions entero
deletions entero
changedFiles entero
labels arreglo
labels[].id string
labels[].name string
labels[].color string
# inicial.labels[].description cadena
version objeto
version.number string
version.headSha cadena
version.baseSha string
version.createdAt string
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": "jane@acme.dev" } }, "createdAt": "2026-08-01T09:30:00Z", "updatedAt": "2026-08-02T14:45:00Z", "additions": 128, "deletions": 46, "changedFiles": 5, "labels": [ { "id": "lbl_01k2ja2000e0080000000000m1", "name": "bug", "color": "d73a4a", "description": "Something isn't working" } ], "version": { "number": "3", "headSha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4", "baseSha": "3b1f9c2d8a7e6f5049c8b7a6d5e4f3a2b1c0d9e8", "createdAt": "2026-08-01T09:30:00Z" }}Actualizar solicitud de extracción
/v1/origin/repos/{ownerSlug}/{repoName}/pulls/{pullNumber}Actualiza el título, el cuerpo, la rama base 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 base y, por último, cerrar. Cerrar se ejecuta al final para que un reenfoque en la misma solicitud aún pueda ver un cambio abierto; reabrir se ejecuta antes de base para que se pueda cambiar el destino de una pull request cerrada. Si un paso posterior falla, los pasos anteriores pueden ya haberse aplicado.
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 string
state string
"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. Merged no es editable. 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). Se ignora cuando state es "closed".base string
InvalidArgument (HTTP 400).Campos de respuesta
id string
number string
state string
draft boolean
merged booleano
title string
body string
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
additions entero
deletions entero
changedFiles entero
labels arreglo
labels[].id string
labels[].name string
labels[].color string
# al inicio.labels[].description string
version objeto
version.number cadena
version.headSha cadena
version.baseSha string
version.createdAt string
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": "jane@acme.dev" } }, "createdAt": "2026-08-01T09:30:00Z", "updatedAt": "2026-08-02T14:45:00Z", "additions": 128, "deletions": 46, "changedFiles": 5, "labels": [ { "id": "lbl_01k2ja2000e0080000000000m1", "name": "bug", "color": "d73a4a", "description": "Something isn't working" } ], "version": { "number": "3", "headSha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4", "baseSha": "3b1f9c2d8a7e6f5049c8b7a6d5e4f3a2b1c0d9e8", "createdAt": "2026-08-01T09:30:00Z" }}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.since string
2026-08-01T00:00:00Z. Devuelve únicamente los comentarios creados en ese instante o después. Una marca de tiempo malformada devuelve InvalidArgument (HTTP 400).until string
since. Devuelve solo los comentarios creados en ese instante o antes. Una marca de tiempo malformada 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.version.createdAt string
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", "createdAt": "2026-08-01T09:30:00Z" }, "path": "src/telemetry/retry.ts", "side": "right", "startLine": 42, "endLine": 45, "createdAt": "2026-08-01T09:30:00Z", "updatedAt": "2026-08-02T14:45:00Z" }, "body": "Should the retry budget be configurable?", "author": { "user": { "id": "user_01k2ja2000e0080000000000c3", "email": "jane@acme.dev" } }, "createdAt": "2026-08-01T09:30:00Z", "updatedAt": "2026-08-02T14:45:00Z" } ], "pullRequest": { "id": "pr_01k2ja2000e0080000000000d4", "number": "17", "repository": { "id": "repo_01k2ja2000e0080000000000q4", "name": "rocket", "owner": { "slug": "acme", "id": "ns_01k2ja2000e0080000000000p3", "type": "team" } } }}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.version.createdAt 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", "createdAt": "2026-08-01T09:30:00Z" }, "path": "src/telemetry/retry.ts", "side": "right", "startLine": 42, "endLine": 45, "createdAt": "2026-08-01T09:30:00Z", "updatedAt": "2026-08-02T14:45:00Z" }, "body": "Should the retry budget be configurable?", "author": { "user": { "id": "user_01k2ja2000e0080000000000c3", "email": "jane@acme.dev" } }, "createdAt": "2026-08-01T09:30:00Z", "updatedAt": "2026-08-02T14:45:00Z"}Crear 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 incluye la ruta. Origin determina el lado según el tipo de cambio del archivo: la versión base para un archivo eliminado y la versión head en los demás casos, y lo devuelve en thread.side. Envíe la ruta eliminada para una eliminación y la ruta head para cualquier otro cambio. Una ruta que esté fuera del diff se rechaza con InvalidArgument (HTTP 400), al igual que 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 head.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.version.createdAt 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", "createdAt": "2026-08-01T09:30:00Z" }, "path": "src/telemetry/retry.ts", "side": "right", "startLine": 42, "endLine": 45, "createdAt": "2026-08-01T09:30:00Z", "updatedAt": "2026-08-02T14:45:00Z" }, "body": "Should the retry budget be configurable?", "author": { "user": { "id": "user_01k2ja2000e0080000000000c3", "email": "jane@acme.dev" } }, "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.version.createdAt 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", "createdAt": "2026-08-01T09:30:00Z" }, "path": "src/telemetry/retry.ts", "side": "right", "startLine": 42, "endLine": 45, "createdAt": "2026-08-01T09:30:00Z", "updatedAt": "2026-08-02T14:45:00Z" }, "body": "Should the retry budget be configurable?", "author": { "user": { "id": "user_01k2ja2000e0080000000000c3", "email": "jane@acme.dev" } }, "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 pull request 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
version.createdAt 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 cuando el ancla es una sola línea o no tiene rango de líneas.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", "createdAt": "2026-08-01T09:30:00Z" }, "path": "src/telemetry/retry.ts", "side": "right", "startLine": 42, "endLine": 45, "resolvedAt": "2026-08-03T10:00:00Z", "createdAt": "2026-08-01T09:30:00Z", "updatedAt": "2026-08-03T10:00:00Z"}Listar los commits de un pull request
/v1/origin/repos/{ownerSlug}/{repoName}/pulls/{pullNumber}/commitsEnumera los commits de un pull request.
Devuelve los commits del pull request como objetos Commit escasos (sin stats). Los resultados por defecto son 30 y están limitados a 100, con como máximo 250 commits visibles en total. Un token de página fija la versión del pull request, el tamaño de página y el cursor de commits; pageSize debe coincidir con el token en solicitudes posteriores, y un token que ya no coincida con la cabeza (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 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, el tamaño de página y el desplazamiento del commit.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": "jane@acme.dev", "date": "2026-08-01T09:30:00Z" }, "committer": { "name": "Jane Doe", "email": "jane@acme.dev", "date": "2026-08-01T09:30:00Z" }, "message": "Add launch telemetry", "tree": { "sha": "a7b6c5d4e3f2a1b0c9d8e7f6a5b4c3d2e1f0a9b8" } }, "parents": [ { "sha": "3b1f9c2d8a7e6f5049c8b7a6d5e4f3a2b1c0d9e8" } ], "stats": { "additions": 128, "deletions": 46, "total": 174 } } ]}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 anterior del archivo. De forma predeterminada, los resultados incluyen 30 archivos, con un máximo de 100. Un token de página fija la versión del pull request, el tamaño de página y el cursor de archivos; pageSize debe coincidir con el token en solicitudes posteriores, y un token que ya no coincida con la cabecera 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, al tamaño de página y al cursor de archivos modificados.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 un pull request en su base.
En el caso de un pull request apilado, fusiona todo el prefijo desde la raíz hasta el objetivo que termina en este número de pull, no solo este pull. Solo se admite en repositorios Origin nativos; los repositorios replicados se rechazan.
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 la respuesta
mergeCommitSha string
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 object
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
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.version object
pullRequest.version.number string
pullRequest.version.headSha string
pullRequest.version.baseSha string
pullRequest.version.createdAt string
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": "jane@acme.dev" } }, "createdAt": "2026-08-01T09:30:00Z", "updatedAt": "2026-08-02T14:45:00Z", "closedAt": "2026-08-03T10:15:00Z", "mergedAt": "2026-08-03T10:15:00Z", "mergeCommitSha": "5c4d3e2f1a0b9c8d7e6f5a4b3c2d1e0f9a8b7c6d", "additions": 128, "deletions": 46, "changedFiles": 5, "labels": [ { "id": "lbl_01k2ja2000e0080000000000m1", "name": "bug", "color": "d73a4a", "description": "Something isn't working" } ], "version": { "number": "3", "headSha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4", "baseSha": "3b1f9c2d8a7e6f5049c8b7a6d5e4f3a2b1c0d9e8", "createdAt": "2026-08-01T09:30:00Z" } }}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": "jane@acme.dev" } ], "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": "jane@acme.dev" } ], "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.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[].pullRequestVersion.createdAt 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
@. Solo está presente 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": "jane@acme.dev" } }, "verdict": "approve", "body": "Approving. The telemetry schema matches the spec.", "submittedAt": "2026-08-02T15:00:00Z", "pullRequestVersion": { "number": "3", "headSha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4", "baseSha": "3b1f9c2d8a7e6f5049c8b7a6d5e4f3a2b1c0d9e8", "createdAt": "2026-08-01T09:30:00Z" } } ], "pullRequest": { "id": "pr_01k2ja2000e0080000000000d4", "number": "17", "repository": { "id": "repo_01k2ja2000e0080000000000q4", "name": "rocket", "owner": { "slug": "acme", "id": "ns_01k2ja2000e0080000000000p3", "type": "team" } } }}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 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 approve 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 frente al diff de la versión revisada antes de que se escriba nada, usando la misma comprobación in-diff que Create Pull Request Comment. Si un comentario falla, toda la solicitud falla con InvalidArgument (HTTP 400) y no se publica nada. Los comentarios se vuelven visibles de forma atómica con la revisión: ningún comentario ni evento es observable hasta que la revisión se envía, y 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
pullRequestVersion.createdAt 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": "jane@acme.dev" } }, "verdict": "approve", "body": "Approving. The telemetry schema matches the spec.", "submittedAt": "2026-08-02T15:00:00Z", "pullRequestVersion": { "number": "3", "headSha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4", "baseSha": "3b1f9c2d8a7e6f5049c8b7a6d5e4f3a2b1c0d9e8", "createdAt": "2026-08-01T09:30:00Z" }}Actualizar revisión de pull request
/v1/origin/repos/{ownerSlug}/{repoName}/pulls/{pullNumber}/reviews/{reviewId}Actualiza el cuerpo de una revisión. Solo su autor 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
pullRequestVersion.createdAt 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; en caso 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": "jane@acme.dev" } }, "verdict": "approve", "body": "Approving. The telemetry schema matches the spec.", "submittedAt": "2026-08-02T15:00:00Z", "pullRequestVersion": { "number": "3", "headSha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4", "baseSha": "3b1f9c2d8a7e6f5049c8b7a6d5e4f3a2b1c0d9e8", "createdAt": "2026-08-01T09:30:00Z" }}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
pullRequestVersion.createdAt 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": "jane@acme.dev" } }, "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", "createdAt": "2026-08-01T09:30:00Z" }, "dismissal": { "dismissedBy": { "user": { "id": "user_01k2ja2000e0080000000000c3", "email": "jane@acme.dev" } }, "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 la 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 string Obligatorio
repoName string Obligatorio
rulesetId 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/rulesets/RULESET_ID' \ --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN'Respuesta:
204 No ContentWebhooks
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 reintenta los errores de transporte y las respuestas 429 y 5xx hasta un máximo de siete intentos. Los intervalos entre reintentos son de 5 segundos, 30 segundos, 1 minuto, 2 minutos, 4 minutos y 8 minutos. Las demás respuestas 4xx son definitivas.
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 | Cursor-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.
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.
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.
El propietario puede pausar la entrega de webhooks de una aplicación desde los ajustes de la aplicación, y Origin también puede pausarla por su cuenta: una aplicación cuyo receptor falle al menos 20 rondas de entrega en un plazo de 72 horas, sin ninguna entrega exitosa en ese plazo y con fallos que alcancen más de un espacio de nombres de instalador, se desactiva automáticamente. En cualquier caso, la entrega se detiene hasta que un propietario la reanude, las solicitudes de reentrega devuelven FailedPrecondition (HTTP 400) y no se pone nada en cola; además, la API no expone ningún campo para el estado en pausa, así que toma un FailedPrecondition de reentrega como señal. Borrar el webhookUrl de la aplicación mediante Update App tiene un efecto más drástico: cancela directamente las entregas pendientes, y volver a establecer una URL no las recupera.
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 y los reintentos, 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.comment.created | Se crea un comentario visible en una pull request. |
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 forma 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.
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 un envío 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 Cursor, 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.
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"}Push al repositorio
repository.pushedUn push atómico, que puede actualizar varias refs. No existe un array commits; cada actualización de ref solo incluye metadata de la punta en modo best-effort.
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. Todo ceros (0000000000000000000000000000000000000000) cuando la referencia se ha eliminado.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.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": "jane@acme.dev", "date": "2026-08-01T09:30:00Z" }, "committer": { "name": "Jane Doe", "email": "jane@acme.dev", "date": "2026-08-01T09:30:00Z" }, "message": "Add launch telemetry" } } ], "pushedAt": "2026-08-02T14:45:00Z", "pusher": { "user": { "id": "user_01k2ja2000e0080000000000c3", "email": "jane@acme.dev" } }, "refUpdatesCount": 1}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.updatedUn cambio en el ciclo de vida de un pull request. La acción del ciclo de vida es el event.type del envelope; no hay un campo de acción aparte.
Campos del payload
pullRequest object
GetPullRequest.pullRequest.id string
pullRequest.number string
pullRequest.state string
pullRequest.draft boolean
pullRequest.merged booleano
pullRequest.title string
pullRequest.body string
pullRequest.head objeto
pullRequest.head.ref string
pullRequest.head.sha cadena
pullRequest.base object
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 Obligatorio
pullRequest.author.user.displayName string
pullRequest.author.user.handle string
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
pullRequest.additions entero
pullRequest.deletions entero
pullRequest.changedFiles entero
pullRequest.version object
pullRequest.version.number string
pullRequest.version.headSha string
pullRequest.version.baseSha string
pullRequest.version.createdAt string
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 definir 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": "main", "sha": "3b1f9c2d8a7e6f5049c8b7a6d5e4f3a2b1c0d9e8" }, "author": { "user": { "id": "user_01k2ja2000e0080000000000c3", "email": "jane@acme.dev" } }, "createdAt": "2026-08-01T09:30:00Z", "updatedAt": "2026-08-02T14:45:00Z", "additions": 128, "deletions": 46, "changedFiles": 5, "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" } }}Comentario en una solicitud de extracción
pull_request.comment.createdUn comentario creado en un pull request. Los comentarios incluidos en un review se entregan al enviarse el review, con un evento por cada comentario.
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. Disponible solo en la salida; sin establecer cuando se desconoce. Uno de: team, user.comment object
comment.thread.id. El estado de resolution del thread no forma parte del event; puedes leerlo con GetPullRequestComment.comment.id string
comment.thread object
comment.thread.id string
comment.thread.version object
PullRequestReview.pull_request_version).comment.thread.version.number string
comment.thread.version.headSha string
comment.thread.version.baseSha string
comment.thread.version.createdAt string
comment.thread.path string
comment.thread.side string
left, right.comment.thread.startLine entero
side del archivo. 0 para los threads 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.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 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", "version": { "number": "3", "headSha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4", "baseSha": "3b1f9c2d8a7e6f5049c8b7a6d5e4f3a2b1c0d9e8", "createdAt": "2026-08-01T09:30:00Z" }, "path": "src/telemetry/retry.ts", "side": "right", "startLine": 42, "endLine": 45, "createdAt": "2026-08-01T09:30:00Z", "updatedAt": "2026-08-02T14:45:00Z" }, "body": "Should the retry budget be configurable?", "author": { "user": { "id": "user_01k2ja2000e0080000000000c3", "email": "jane@acme.dev" } }, "createdAt": "2026-08-01T09:30:00Z", "updatedAt": "2026-08-02T14:45:00Z" }}Eventos de revisión de pull requests
pull_request.review.submittedpull_request.review.dismissedCampos del payload
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.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.pullRequestVersion.createdAt 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.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": "jane@acme.dev" } }, "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", "createdAt": "2026-08-01T09:30:00Z" } }}Eventos del revisor de pull requests
pull_request.reviewer.addedpull_request.reviewer.removedpull_request.reviewer.rerequestedUn cambio en los requested reviewers del pull request. Consulta el conjunto pendiente actual con ListPullRequestRequestedReviewers.
Campos del payload
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.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.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": "jane@acme.dev" } }, "createdVia": "codeowners", "createdAt": "2026-08-02T14:45:00Z"}Eventos de ejecución de comprobación
repository.check_run.createdrepository.check_run.completedInstantánea confirmada de un evento de ciclo de vida de check-run de Origin.
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. 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.app objeto
checkSuite.actor.app.id string
checkSuite.actor.app.displayName string
checkSuite.actor.serviceAccount objeto
checkSuite.actor.serviceAccount.id string
checkRun object
checkRun.id string
checkRun.repository object
checkRun.repository.id string
checkRun.repository.name string
checkRun.repository.owner object
checkRun.repository.owner.slug 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 string
checkRun.status string
rerequested es una ejecución completada cuya reejecución se ha solicitado y a la que la app propietaria aún no ha respondido: pendiente para los lectores (se renderiza como queued), con conclusion y las marcas de tiempo todavía describiendo el intento reemplazado. Solo lo establece Origin al volver a solicitarla (RerequestCheckRun); las aplicaciones no pueden publicarlo. Uno de queued, in_progress, completed, rerequested.checkRun.conclusion string
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
checkRun.externalId string
CheckRunInput.external_id: se recomienda una por ejecución).checkRun.actor object
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.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
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 podrá volver a solicitarse. Marca de tiempo RFC 3339.checkRun.rerequestedBy object
rerequested_at está establecido; se borra junto con él cuando la app propietaria responde.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.app objeto
checkRun.rerequestedBy.app.id string
checkRun.rerequestedBy.app.displayName string
checkRun.rerequestedBy.serviceAccount objeto
checkRun.rerequestedBy.serviceAccount.id string
actor object
actor.user object
actor.user.id string
actor.user.email string Obligatorio
actor.user.displayName string
actor.user.handle string
actor.app object
actor.app.id string
actor.app.displayName string
actor.serviceAccount object
actor.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": "jane@acme.dev" } } }, "checkRun": { "id": "cr_01k2ja2000e0080000000000g7", "repository": { "id": "repo_01k2ja2000e0080000000000q4", "name": "rocket", "owner": { "slug": "acme", "id": "ns_01k2ja2000e0080000000000p3", "type": "team" } }, "checkSuite": { "id": "crg_01k2ja2000e0080000000000h8" }, "sha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4", "key": "ci-8842-unit-tests", "name": "unit-tests", "status": "completed", "conclusion": "success", "detailsUrl": "https://ci.acme.dev/runs/8842", "externalUpdatedAt": "2026-08-02T14:44:30Z", "startedAt": "2026-08-02T14:40:00Z", "completedAt": "2026-08-02T14:44:30Z", "createdAt": "2026-08-01T09:30:00Z", "updatedAt": "2026-08-02T14:45:00Z", "externalId": "run-8842", "actor": { "user": { "id": "user_01k2ja2000e0080000000000c3", "email": "jane@acme.dev" } }, "output": { "title": "Unit tests", "summary": "128 tests passed.", "text": "All suites green." } }, "actor": { "user": { "id": "user_01k2ja2000e0080000000000c3", "email": "jane@acme.dev" } }}Solicitud de ejecución de comprobación reprogramada
repository.check_run.rerequestedCarga útil (payload) del webhook repository.check_run.rerequested, entregada solo a la app que posee el check run. Responde publicando una ejecución nueva para la misma SHA de la cabeza y clave —una nueva ejecución (nuevo external_id) o una actualización de la ejecución vuelta a solicitar—. La ejecución marcada muestra status: rerequested (su conclusión y tiempos son el resultado sustituido) hasta que la publicación de respuesta limpia rerequested_at. Cada re-solicitud aceptada emite un evento, y una ejecución puede volver a solicitarse una vez respondida, así que desduplica las reentregas únicamente por el id del evento; check_run.rerequested_at lleva la marca pendiente. La carga útil no incluye contexto de pull request (los check runs se adjuntan a (repository, sha)): un consumidor que necesite el pull request lo resuelve a partir de check_run.sha mediante su propio mapeo de heads, o con ListPullRequests filtrado por la rama head que construyó.
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. 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.app objeto
checkSuite.actor.app.id string
checkSuite.actor.app.displayName string
checkSuite.actor.serviceAccount objeto
checkSuite.actor.serviceAccount.id string
checkRun object
status: rerequested); check_run.rerequested_at registra la marca temporal y check_run.rerequested_by el principal que la solicitó.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 string
checkRun.key string
checkRun.name cadena
checkRun.status string
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.checkRun.conclusion string
status es completed o rerequested. Para una ejecución rerequested es el veredicto del intento sustituido: 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
checkRun.externalId string
CheckRunInput.external_id: se recomienda una por ejecución).checkRun.actor object
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.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
checkRun.isRerequestable boolean
CheckRunInput.is_rerequestable).checkRun.rerequestedAt string
status es rerequested y el run permanece en el estado de CI del commit como pendiente (conclusion y los tiempos son el resultado sustituido); la aplicación propietaria responde publicando el run al que se comprometió declarando is_rerequestable: una nueva ejecución para la misma key, o una actualización de este run (que borra este campo), tras lo cual el run puede volver a solicitarse. Marca de tiempo RFC 3339.checkRun.rerequestedBy object
rerequested_at está establecido; se borra junto con él cuando responde la aplicación propietaria.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.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": "jane@acme.dev" } } }, "checkRun": { "id": "cr_01k2ja2000e0080000000000g7", "repository": { "id": "repo_01k2ja2000e0080000000000q4", "name": "rocket", "owner": { "slug": "acme", "id": "ns_01k2ja2000e0080000000000p3", "type": "team" } }, "checkSuite": { "id": "crg_01k2ja2000e0080000000000h8" }, "sha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4", "key": "ci-8842-unit-tests", "name": "unit-tests", "status": "rerequested", "conclusion": "failure", "detailsUrl": "https://ci.acme.dev/runs/8842", "externalUpdatedAt": "2026-08-02T14:44:30Z", "startedAt": "2026-08-02T14:40:00Z", "completedAt": "2026-08-02T14:44:30Z", "createdAt": "2026-08-01T09:30:00Z", "updatedAt": "2026-08-02T15:10:00Z", "externalId": "run-8842", "actor": { "user": { "id": "user_01k2ja2000e0080000000000c3", "email": "jane@acme.dev" } }, "output": { "title": "Unit tests", "summary": "1 of 129 tests failed.", "text": "FAIL telemetry.spec.ts > flushes queued events on shutdown" }, "isRerequestable": true, "rerequestedAt": "2026-08-02T15:10:00Z", "rerequestedBy": { "user": { "id": "user_01k2ja2000e0080000000000c3", "email": "jane@acme.dev" } } }}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
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": "jane@acme.dev" } }, "app": { "id": "app_01k2ja2000e0080000000000a1", "displayName": "CI Status Bot" }}Instalación actualizada
installation.updatedCampos 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
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": "jane@acme.dev" } }, "app": { "id": "app_01k2ja2000e0080000000000a1", "displayName": "CI Status Bot" }}Instalación suspendida
installation.suspendedCampos 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
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": "jane@acme.dev" }, "suspendedAt": "2026-08-03T08:15:00Z" }, "app": { "id": "app_01k2ja2000e0080000000000a1", "displayName": "CI Status Bot" }}Instalación reactivada
installation.unsuspendedCampos 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
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": "jane@acme.dev" } }, "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
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": "jane@acme.dev" }, "deletedAt": "2026-08-03T08:15:00Z" }, "app": { "id": "app_01k2ja2000e0080000000000a1", "displayName": "CI Status Bot" }}