Origin API Changelog
La API de Origin está en beta inicial y puede cambiar. Consulta la especificación de OpenAPI al actualizar una integración.
Cambios en la API pública de Origin, incluidos los endpoints, los schema de solicitud y response, los scope y los webhooks, agrupados por día con los más recientes primero. Cada cambio incluye una etiqueta: Incompatible, En desuso, Añadido, Modificado o Eliminado. Los cambios incompatibles y en desuso incluyen instrucciones de migración en línea. La referencia de la API de Origin siempre refleja el último estado sincronizado.
- Cambiado. En Listar repositorios de la instalación de la aplicación, List Branches, List Check Run Annotations, List Check Runs For Commit, List Check Runs For Suite, List Check Suites For Commit, List Commit Files, List Comparison Files, List Namespace Grants, List Namespaces, List Pull Request Files, List Pull Requests, List Repos y List Repository Grants, un
pageSizeenviado junto con unpageTokense aplica a esa página, y una solicitud posterior que omitepageSizeconserva el tamaño de página anterior. List Commit Files y List Comparison Files ya no rechazan conInvalidArgument(HTTP 400) unpageSizeposterior distinto del de la primera solicitud, y los demás endpoints ya no lo ignoran. Todo lo demás a lo que está vinculado un token de página, como el repositorio, los filtros y la versión de la pull request, debe seguir coincidiendo.
- Cambiado. Merge Pull Request devuelve
Aborted(HTTP 409 Conflict) en lugar deInvalidArgument(HTTP 400) cuando la rama de cabecera de la pull request ha avanzado más allá de la cabecera de suversionmás reciente; por ejemplo, porque se integró un push que Origin aún no había registrado como nueva versión. Es la misma respuesta que se obtiene con unexpectedHeadShaobsoleto. En ninguno de los dos casos se fusiona nada; vuelve a intentarlo cuando Get Pull Request indique la nueva cabecera enversion.headSha.
- Cambio incompatible. Las referencias de versión de hilos de comentarios y de revisiones ya no incluyen
createdAt; solo contienennumber,headShaybaseShade la versión. Esto afecta athread.versionen List Pull Request Comments, Get Pull Request Comment, Create Pull Request Comment y Update Pull Request Comment; aversionen Update Pull Request Thread; apullRequestVersionen List Pull Request Reviews, Create Pull Request Review, Update Pull Request Review y Dismiss Pull Request Review; y a los mismos campos en los payloadspull_request.comment.createdypull_request.review.*. Migración: allí donde tu integración leíacreatedAtde la versión de un hilo o de una revisión, léelo ahora deversionen Get Pull Request o en el payload de ciclo de vidapull_request.*que registró esa versión, emparejando pornumber. - Añadido. Las versiones de pull request incluyen
potentialMergeCommit, la fusión de prueba que Origin realiza de esa versión:stateesprepared,merge_conflictounknown, y una fusiónpreparedañade elshadel commit de fusión ybaseSha, la punta de la rama base sobre la que se generó. Se devuelve enversionen List Pull Requests, Get Pull Request, Create Pull Request, Update Pull Request y Merge Pull Request, y se incluye en los payloads de ciclo de vidapull_request.*, de modo que un receptor de webhooks conoce la vista previa de la fusión sin necesidad de llamar a Get Git Ref. Cada evento incluye el valor vigente en el momento de su emisión, así que interpretaunknowncomo un valor aún desconocido y vuelve a consultar la pull request. - Añadido. Create Installation User Token emite un token de usuario de la instalación que actúa en nombre de un miembro habilitado del espacio de nombres:
POST /v1/origin/app/installations/{installationId}/user_access_tokens. Requiere un JWT de aplicación y una instalación a la que se haya concedidonamespace:user_tokens:write. Indica el usuario conuserIdouserEmail; los campos opcionalesscopesyrepositoryIdsrestringen el acceso. El token caduca como máximo a los 15 minutos y nunca después que el JWT de aplicación. - Añadido. Los actores de usuario pueden incluir
performedVia.appcon elidde la aplicación y undisplayNameopcional cuando una aplicación ha actuado en nombre del usuario. El campo no aparece en las acciones directas del usuario y puede faltar cuando no hay datos de delegación disponibles. Consulta Actuar en nombre de usuarios. - Añadido. List Commits acepta los filtros
authorEmailsycommitterEmails, con hasta 100 correos electrónicos distintos cada uno. La coincidencia no distingue entre mayúsculas y minúsculas e ignora los espacios iniciales y finales; si se establecen ambas listas, un commit debe coincidir con las dos. Una página filtrada puede estar vacía y aun así incluir unnextPageToken, así que sigue paginando hasta que el token esté vacío. - Cambiado. Una ejecución de comprobación cancelada ya no sustituye a un resultado satisfactorio. Una publicación
completedcon la conclusióncancelledsobre una ejecución que estácompletedconsuccess,neutraloskippedse ignora por obsoleta, sea cual sea suexternalUpdatedAt, por lo que Post Check Run y Batch Upsert Check Runs responden200con la ejecución almacenada y eloutcomeignored_stale. Si la cancelación se publica como un nuevo intento de ejecución o de suite, queda clasificada por debajo del intento satisfactorio, por lo que List Check Runs For Commit, List Check Suites For Commit, List Check Runs For Suite y Get Pull Request Mergeability siguen informando del resultado satisfactorio. Un fallo más reciente sigue reemplazando a un resultado satisfactorio, y una cancelación sigue prevaleciendo sobre una ejecución fallida o pendiente; consulta la regla completa en Attempts and the current attempt.
- Añadido. List Namespaces lista los espacios de nombres en los que puedes listar repositorios, ordenados por slug:
GET /v1/origin/namespaces. Los candidatos son los espacios de nombres de tus equipos, tu espacio de nombres personal y los espacios de nombres que contienen repositorios a los que se te ha concedido acceso. Solo se devuelven aquellos en los que tienesnamespace:repositories:read, de modo que cadanamespace.sluges unownerSlugválido para List Repos. El campoviewerCanCreateRepositoriesde cada entrada indica si una llamada a Crear repositorio en ese espacio de nombres superaría, en tu caso, la autorización y las comprobaciones del plan y los ajustes del propietario. Las páginas contienen 30 espacios de nombres de forma predeterminada y 100 como máximo. Requiere una credencial de usuario de Cherri Code, no necesita ningún scope y cuesta 1 punto; los tokens de aplicación, los tokens de acceso de instalación y las cuentas de servicio recibenPermissionDenied(HTTP 403).
- Cambiado. Al reabrir una pull request mediante Update Pull Request, se registra una nueva
versionsi la cabecera se movió mientras la pull request estaba cerrada, y se envíapull_request.head_ref.pushed. Antes, la pull request conservaba la cabecera que tenía al cerrarse hasta que se volvía a hacer push a la rama. La versión registrada incluye sus propiosheadSha,baseShay estadísticas del diff, con la misma estructura que registra un push. Las pull requests fusionadas no se ven afectadas. - Cambiado. Un SHA de commit abreviado enviado a Get Commit o List Commit Files se resuelve igual que en Get Git Commit: solo entre objetos commit, de modo que un prefijo que identifica un único commit se resuelve aunque lo comparta un blob o un tree del repositorio. La entrada del 22 de septiembre solo mencionaba Get Git Commit. Get Blob y Get Tag no cambian.
Aplicaciones e instalaciones
- Cambio. Crear token de acceso de instalación indica que un token caduca como máximo a los 15 minutos y nunca después que el JWT de aplicación que lo solicitó. Lee
expiresAten la respuesta y emite un token nuevo cuando venza, en lugar de dar por hecha una duración.
Pull requests
- Cambio incompatible. Create Pull Request ya no acepta
parentPullNumber. Una solicitud que lo incluya devuelveInvalidArgument(HTTP 400) indicandoparent_pull_numberen lugar de crear la pull request, de modo que un cliente de red que siga enviándolo falla de forma explícita en vez de perder sin aviso el padre de la pila. Migración: envíaparentPullRequestcon un miembronumberen todos los lugares donde tu integración enviabaparentPullNumber. - Añadido. Delete Pull Request Comment elimina un comentario de pull request a partir de su id de Origin:
DELETE /v1/origin/repos/{ownerSlug}/{repoName}/pulls/comments/{commentId}. El autor del comentario siempre puede eliminarlo; cualquier otro llamador debe tener acceso de escritura al repositorio medianterepository:contents:writeo recibiráPermissionDenied(HTTP 403). Al eliminar el último comentario de un hilo, se elimina también el hilo; al eliminar cualquier otro comentario, el hilo se conserva. En ambos casos, las reacciones y el historial de ediciones del comentario se eliminan con él. Un id desconocido o ya eliminado devuelve404. Requiererepository:pull_requests:reviews:writey cuesta 5 puntos. - Añadido. Las respuestas de pull request incluyen un objeto
stackcon elidde la pila y laparentPullRequestsobre la que está apilada esta pull request. El objeto se omite cuando la pull request no forma parte de una pila, y en la raíz no incluyeparentPullRequest. Lo devuelven List Pull Requests, Get Pull Request, Create Pull Request, Update Pull Request y Merge Pull Request, y se incluye en todos los payloadspull_request.*. Unstackentregado refleja la topología en el momento del evento que lo incluía. - Añadido. Create Pull Request y Update Pull Request aceptan
parentPullRequest, un selector que indica el padre de la pila pornumberoid, o que lo elimina conclearal actualizar. Debe establecerse exactamente un miembro; un selector vacío,clear: false, más de un miembro oclearal crear devuelvenInvalidArgument(HTTP 400). La edición es solo una asociación: no se reescribe ninguna rama ybasesolo se redirige si también se envía. Update la aplica después debase, por lo que un padre explícito prevalece sobre el que se derive de un cambio de base. - Añadido. List Pull Requests acepta
stackId, un id de pila tal como se devuelve enstack.id. Devuelve los miembros de esa pila en el orden de clasificación solicitado, no en el orden de la pila, así que reconstruye la pila a partir delstack.parentPullRequestde cada miembro.statesigue teniendoopencomo valor predeterminado, así que pasastate=allpara obtener la pila completa. Un id bien formado que no corresponda a ninguna pila del repositorio devuelve una lista vacía; cualquier otro valor devuelveInvalidArgument(HTTP 400). - Añadido. List Pull Requests acepta
headSha, el SHA hexadecimal completo de 40 o 64 caracteres de la cabecera de una pull request. Selecciona una pull request si alguna de sus versiones registradas tiene ese commit de cabecera, ya sea actual o reemplazada, así que comparahead.shaen cada resultado para distinguir ambos casos. Los SHA mal formados, abreviados o desconocidos no devuelven ninguna coincidencia.
Ejecuciones de comprobación
- En desuso.
checkRunsen la respuesta de Batch Upsert Check Runs queda en desuso en favor deresults[].checkRuny se eliminará en una versión futura. Sigue incluyendo las mismas ejecuciones en el mismo orden. Migración: leeresults[].checkRun, que asocia cada ejecución almacenada con eloutcomede su escritura. - Añadido. Post Check Run devuelve
outcomey Batch Upsert Check Runs devuelveresults[], con un elemento por cada ejecución publicada en el orden de la solicitud, y cada uno asociacheckRuncon su propiooutcome. El valor escreated,updated,unchangedoignored_stale. Una publicación cuyoexternalUpdatedAtsea anterior a la marca de tiempo almacenada se ignora, y una publicación que repite los valores almacenados no cambia nada; en ambos casos se responde200con la ejecución almacenada yupdatedAtno se modifica, por lo queoutcomees la única forma de distinguirlas. - Cambiado. El
messagede una anotación de ejecución de comprobación puede contener Markdown, que Origin renderiza en la página del pull request, tanto en la pestaña Checks como en la tarjeta inline de Changes. Se acepta en Post Check Run y Batch Upsert Check Runs, y Get Check Run lo devuelve.rawDetailssigue siendo texto sin formato.
Datos de Git
- Cambio. Get Git Commit resuelve un
shaabreviado solo si tiene al menos 5 caracteres hexadecimales, y solo entre objetos commit; la solicitud falla si ningún commit o más de un commit coincide con la abreviatura. Los SHA completos, las ramas, los tags yHEADse resuelven igual que antes.
Autoridades de certificación SSH
- Añadido. List SSH Certificate Authorities enumera las autoridades de certificación SSH en las que confía un propietario para git sobre SSH, de la más reciente a la más antigua, junto con
requireCertificates, que indica si el propietario exige certificados:GET /v1/origin/owners/{ownerSlug}/ssh-certificate-authorities. La respuesta no está paginada y cada entrada decertificateAuthorities[]incluyeid,name,keyType,fingerprint,publicKeyycreatedAt. Requierenamespace:settings:read. - Añadido. Add SSH Certificate Authority añade una autoridad en la que confía el propietario y la devuelve:
POST /v1/origin/owners/{ownerSlug}/ssh-certificate-authorities. El cuerpo acepta unpublicKeyobligatorio, que debe ser una línea deauthorized_keysde OpenSSH cuyo tipo de clave seassh-ed25519,ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521ossh-rsacon un módulo de al menos 2048 bits, y unnameobligatorio de 255 caracteres como máximo. Un certificado, un tipo de clave no compatible o una clave RSA más corta devuelveInvalidArgument(HTTP 400); una clave que el propietario ya tiene registrada devuelveAlreadyExists(HTTP 409 Conflict), ya que la comprobación se limita al propietario y no abarca todo Origin; y un propietario que no sea propiedad de un equipo devuelveFailedPrecondition(HTTP 400). Requiere una credencial de usuario de Cherri Code connamespace:settings:write. - Añadido. Delete SSH Certificate Authority elimina una autoridad del propietario y responde con
204 No Content:DELETE /v1/origin/owners/{ownerSlug}/ssh-certificate-authorities/{certificateAuthorityId}. Todos los certificados firmados por la autoridad dejan de funcionar y, mientras el propietario exija certificados, no se puede eliminar su última autoridad; si se intenta, se devuelveFailedPrecondition(HTTP 400). Requiere una credencial de usuario de Cherri Code connamespace:settings:write. - Añadido. Set SSH Certificate Requirement establece si el propietario exige certificados SSH:
POST /v1/origin/owners/{ownerSlug}/ssh-certificate-authorities:setRequirement. El cuerpo acepta un booleanorequireCertificatesobligatorio y la respuesta incluye el ajusterequireCertificatesdel propietario. Mientras esté activado, git sobre SSH en los repositorios del propietario solo acepta certificados de sus autoridades, por lo que se rechazan las claves SSH registradas por los usuarios y las claves de API de usuario a través de HTTPS. Exigir certificados sin ninguna autoridad registrada devuelveFailedPrecondition(HTTP 400), y establecer el valor actual se completa correctamente sin aplicar ningún cambio. Requiere una credencial de usuario de Cherri Code connamespace:settings:write.
Webhooks
- Añadido.
pull_request.comment.reaction.addedypull_request.comment.reaction.removedson eventos de webhook a los que puedes suscribirte y se entregan cuando se añade o se elimina una reacción en un comentario de pull request. Su payload compartido incluye la referenciapullRequest, una referenciacommentcon suthready lareactioncon sucontenty sureactor. Un evento de adición se entrega al menos una vez: si elreactorvuelve a añadir una reacción que ya tiene, el evento se entrega de nuevo para el mismo comentario,reactory contenido, así que deduplica según esa terna. Si elreactorelimina una reacción que no tiene, no se entrega nada. - Cambiado. El payload de
pull_request.label.removedincluyeactor, el principal que eliminó la etiqueta, cuando se conoce. La entrada del 19 de septiembre indicaba queactorsolo se establecía enpull_request.label.added, pero se establece en ambos eventos cuando se conoce el principal.
- Añadido. Delete Git Ref elimina una referencia de rama:
DELETE /v1/origin/repos/{ownerSlug}/{repoName}/git/refs/{ref}. La ruta indica la rama comorefs/heads/<branch>oheads/<branch>, y solo se pueden eliminar referencias de rama. Si la rama no existe, devuelve404. La rama predeterminada del repositorio, una rama protegida por una regla de eliminación y un repositorio cuyo contenido se replica desde otro host devuelvenFailedPrecondition(HTTP 400). Si la punta de la rama se mueve mientras la eliminación está en curso, devuelveFailedPrecondition(HTTP 400) oAborted(HTTP 409 Conflict); en ese caso, vuelve a intentar eliminar la nueva punta. Los pull requests cuya cabecera es la rama eliminada se cierran, igual que cuando se elimina la rama mediante push. Requiererepository:contents:writey tiene un coste de 5 puntos. - Añadido.
pull_request.label.addedypull_request.label.removedson eventos de webhook a los que puedes suscribirte. Se envían cuando se asigna una etiqueta a un pull request o se retira de él. Su payload compartido incluye la referenciapullRequesty la instantánealabel. Solo enpull_request.label.addedincluye además unactorque identifica al principal que asignó la etiqueta. Al eliminar la definición de una etiqueta, se envía unpull_request.label.removedpor cada pull request que tenía esa etiqueta.
- Cambio incompatible. Crear aplicación exige que el propietario del espacio de nombres cumpla los requisitos para escribir en Origin, la misma condición previa que Crear repositorio siempre ha exigido. Una solicitud sobre un espacio de nombres cuyo propietario sea un usuario sin un plan Pro, Pro Student, Pro+, Ultra o Start, o un equipo sin un plan de equipo de pago activo, con modo de privacidad (heredado) o con Origin desactivado por un administrador de equipo, ahora devuelve
FailedPrecondition(HTTP 400) en lugar de crear la aplicación. La comprobación evalúa los requisitos del propietario del espacio de nombres, no los del usuario que realiza la llamada. Migración: crea aplicaciones solo en espacios de nombres cuyo propietario pueda escribir en Origin y gestionaFailedPreconditionen cualquier punto donde tu integración daba por hecho que la aplicación se había creado. - Cambiado. Origin concede a un receptor de webhooks 10 segundos para responder a una entrega, en lugar de los cinco segundos anteriores. El plazo abarca la resolución DNS, la conexión, el protocolo de enlace TLS y el tiempo hasta la respuesta, y se aplica a cada intento. Si un intento lo supera, se considera un error de transporte y se reintenta según la programación descrita en Reintentos.
- Cambio incompatible. Los archivos de Get Repo Tarball envuelven el árbol del repositorio en un único directorio de nivel superior llamado
{ownerSlug}-{repoName}-{shortSha}/, dondeshortShason los primeros 7 caracteres hexadecimales del commit resuelto, igual que en la estructura del endpoint de tarball de GitHub. Antes, las entradas del archivo estaban en la raíz del tar, sin directorio envolvente. Migración: elimina un componente inicial de la ruta al extraer (por ejemplo, contar --strip-components=1) allí donde tu integración leyera entradas desde la raíz del tar. - Cambio incompatible. Get App requiere
namespace:apps:readen el espacio de nombres propietario de la aplicación en lugar deapp:settings:read, el scope anunciado junto con el endpoint en la entrada del 12 de septiembre.app:settings:readya no autoriza nada y se ha eliminado del catálogo de scopes;app:settings:writeno cambia y sigue cubriendo Update App, Add App Signing Key y Revoke App Signing Key. Migración: usanamespace:apps:readen el espacio de nombres propietario de la aplicación allí donde tu integración usaraapp:settings:read. - Añadido. Listar repositorios de la instalación de la aplicación acepta
filter, una búsqueda de subcadena que no distingue entre mayúsculas y minúsculas y se aplica a los nombres de repositorio y a los espacios de nombres del propietario. Un valorowner/repocon una sola barra compara cada mitad con su campo correspondiente, se ignoran los espacios en blanco iniciales y finales, y un valor vacío no aplica ningún filtro. Cada token de página conserva el filtro con el que se generó, así que envía el mismo filtro al solicitar las páginas siguientes. - Modificado. La especificación de OpenAPI ya no añade
format: enuma los esquemas de enumeración de tipo cadena. Esa clave no es un formato registrado de OpenAPI ni de JSON Schema, duplicaba la listaenumque la acompaña y los generadores que la asignaban a un tipo con nombre producían código que no compila. Los nombres de los esquemas, los valores de enumeración y el JSON transmitido no cambian; vuelve a generar cualquier cliente de red creado a partir de la especificación para obtener los tipos corregidos.
- Cambio incompatible. Los payloads de
repository.check_run.createdyrepository.check_run.completedya no incluyen unactoren el nivel del payload. Este campo repetía el principal de la suite de comprobaciones propietaria, que el mismo payload ya entrega comocheckSuite.actorycheckRun.actor. Migración: leecheckRun.actor, que siempre coincide con elactorde la suite propietaria, en todos los lugares donde tu integración leía elactorde nivel superior del payload. - Cambio incompatible.
caseInsensitiveywholeWorden Grep Contents solo se aplican cuandoliterales true. Una búsqueda con expresión regular ahora ignora ambos booleanos, que antes respetaba, y unqueryque solo contiene(?i)devuelveInvalidArgument(HTTP 400). Migración: estableceliteralpara seguir usando los booleanos o, en una búsqueda con expresión regular, escribe en su lugar un(?i)inicial y límites de palabra\benquery. - Cambio incompatible. La especificación de OpenAPI cambia el nombre del esquema de componente
ThreadaCommentThread. Es el esquema de respuesta de Update Pull Request Thread y el tipo del objetothreaden un comentario de pull request. Los nombres de campos, las rutas, los IDs de operación y el JSON transmitido no cambian, así que una integración que lee las respuestas directamente no necesita ningún cambio. Migración: vuelve a generar cualquier cliente creado a partir de la especificación y cambia el nombre del tipo allí donde el código generado usabaThread. - Añadido. Add App Installation Repositories añade repositorios a la selección de una instalación existente y devuelve la instalación actualizada:
POST /v1/origin/namespaces/{namespaceSlug}/installations/{installationId}/repos. El cuerpo acepta un array obligatoriorepoIds, que se une a la selección actual; la escritura nunca modifica los scopes de la instalación, y una solicitud cuyos repositorios ya tienen grant se completa correctamente sin cambiar nada. Un repositorio fuera del espacio de nombres, una instalación que ya cubre todos los repositorios del espacio de nombres, una instalación suspendida y una anterior a los scopes por instalación devuelvenFailedPrecondition(HTTP 400) y no conceden nada. Requiere una credencial de usuario de Cherri Code connamespace:installations:writey cuesta 5 puntos. La primera instalación sigue requiriendo el consentimiento de un administrador del espacio de nombres en el navegador. - Añadido. Las respuestas con cargo de Git sobre HTTPS incluyen
X-RateLimit-Limit,X-RateLimit-RemainingyX-RateLimit-Used, conX-RateLimit-Resourceestablecido engit. Git contabiliza un presupuesto propio, independiente del presupuesto REST que Límites de tasa documenta comocore. Una solicitud de Git que supera el presupuesto devuelve429conRetry-AfteryX-RateLimit-Reset, y una solicitud no contabilizada no incluye encabezados de límite de tasa. - Modificado. Upsert Repository Grant y Upsert Namespace Grant aceptan un principal
groupque pertenezca al propio equipo del propietario del recurso, además de los grupos de la organización que ya aceptaban. Los grupos propios de un equipo pueden recibir grants aunque ese equipo no esté vinculado a una organización, mientras que un grupo que pertenece a otro equipo sigue devolviendoFailedPrecondition(HTTP 400). La página Grants describe los tipos de principal.
- Cambio incompatible. Create Repo requiere
namespace:repositories:createen lugar denamespace:new_repository:write, que ya no autoriza nada y se ha eliminado del catálogo de scopes. Migración: solicitanamespace:repositories:createen la credencial de usuario de Cherri Code allí donde tu integración solicitabanamespace:new_repository:write. - Añadido. Get Pull Request Mergeability indica si un pull request se puede fusionar y, si no es posible, devuelve las condiciones tipadas que lo bloquean:
GET /v1/origin/repos/{ownerSlug}/{repoName}/pulls/{pullNumber}/mergeability.verdictesmergeableoblocked, y cada entrada deblockersincluye unkind, unmessagelegible y el pull request deevaluatedPullRequestsal que pertenece, de modo que el veredicto de un pull request apilado abarca todos los pull requests desde la raíz de la pila hasta él. La protección opcionalexpectedHeadShadevuelveAborted(HTTP 409 Conflict) si la cabecera ha cambiado, y un repositorio espejo o una pila de más de 200 pull requests devuelveFailedPrecondition(HTTP 400). La operación se publica en vista previa, marcada comox-cursor-visibility: PREVIEWen la especificación de OpenAPI, así que decodifica sus respuestas tolerando campos y valores de enumeración desconocidos, y trata cualquierverdictno reconocido comoblocked. Requiererepository:pull_requests:ready cuesta 10 puntos. - Añadido. Grep Contents busca en el texto de los archivos de un repositorio en una referencia determinada y devuelve las líneas coincidentes:
POST /v1/origin/repos/{ownerSlug}/{repoName}:grep. El cuerpo acepta unqueryobligatorio, que se interpreta como expresión regular salvo que se establezcaliteral, además deref,caseInsensitive,wholeWord,contextBeforeycontextAfter(los valores superiores a 10 se reducen a 10),filterPath, las listas de patrones globincludesyexcludes(20 entradas como máximo cada una) ymaxResults(valor predeterminado y máximo: 1000). Cada entrada devuelta corresponde a una línea, y la respuesta solo está completa cuandolimitHites false; no hay paginación. Requiererepository:contents:ready cuesta 5 puntos. - Añadido. El
statusde las ejecuciones de comprobación tiene un cuarto valor,rerequested, y List Check Runs For Commit lo acepta como filtro destatus. Indica una ejecución completada cuya reejecución se ha solicitado y a la que la aplicación propietaria aún no ha respondido, así que trátala como pendiente y muéstrala igual quequeued. Aparece en Get Check Run, List Check Runs For Suite, List Check Runs For Commit y Rerequest Check Run. Solo Origin puede establecerlo: una solicitud de Post Check Run o Batch Upsert Check Runs que lo incluya devuelveInvalidArgument(HTTP 400). - Añadido. List Pull Requests acepta
sortBy, con los valorescreated(orden de creación, el predeterminado) oupdated(fecha de la última actualización).directionordena segúnsortByy sigue teniendodesccomo valor predeterminado. Además, cada token de página conserva la ordenación con la que se generó, por lo que se rechaza cualquier token reutilizado con la otra ordenación. - Añadido. List Pull Requests acepta
state=merged, que muestra solo los pull requests fusionados.closedsigue abarcando todos los pull requests que ya no están abiertos, incluidos los fusionados, por lo que los clientes existentes siguen obteniendo los mismos resultados. - Cambiado. Rerequest Check Run establece el
statusde la ejecución enrerequested, lo que sustituye a la nota del 11 de septiembre que indicaba que la llamada nunca cambia elstatusni laconclusionde la propia ejecución. Laconclusiony los tiempos de la ejecución siguen describiendo el intento sustituido, así que leeconclusionsolo cuandostatusseacompleted. La ejecución sigue apareciendo como pendiente en List Check Runs For Suite y List Check Runs For Commit hasta que responda la aplicación propietaria, lo que además borrarerequestedAty guarda el estado publicado. - Cambiado. El payload de
repository.check_run.rerequestedincluyecheckRun.statuscomorerequesteden lugar decompleted, mientras quecheckRun.conclusiony los tiempos siguen describiendo el intento sustituido. La migración es la misma que para el endpoint: ramifica la lógica segúncheckRun.statusy leecheckRun.conclusionsolo cuando seacompleted.
Pull requests
- Cambio incompatible. Create Pull Request y Update Pull Request rechazan un
baseque no corresponda a una rama existente. Si se indica un SHA de commit, un nombre de tag o una rama inexistente, se devuelveInvalidArgument(HTTP 400) junto con la referencia completa que Origin buscó; antes, la misma solicitud creaba el pull request o cambiaba su rama de destino. En un pull request así nunca se podía preparar la referencia de fusión, por lo que CI nunca la recibía y el pull request no se podía fusionar. Migración: pasa un nombre de rama, en forma corta (main) o completa (refs/heads/main), y cambia la rama de destino de cualquier pull request existente cuya base sea un SHA de commit o un tag.
Aplicaciones
- Añadido. Crear aplicación registra una aplicación propiedad de un espacio de nombres:
POST /v1/origin/namespaces/{namespaceSlug}/apps. El cuerpo acepta los campos obligatoriosdisplayNameypublicKey(la clave pública Ed25519 en formato PEM SPKI con la que la aplicación firma sus JWT), además de los opcionaleswebhookUrl,events,description,websiteUrl,installationRedirectUrisydefaultScopes. Las aplicaciones se crean como privadas, y una URL de webhook, un tipo de evento, un URI de redirección o un scope no válidos devuelvenInvalidArgument(HTTP 400). Requierenamespace:apps:createen una credencial de usuario de Cherri Code y cuesta 10 puntos. - Añadido. List Namespace Apps enumera las aplicaciones de un espacio de nombres, de la más reciente a la más antigua:
GET /v1/origin/namespaces/{namespaceSlug}/apps. Las entradas solo incluyen metadatos de visualización (id,displayNameydescription); para consultar la configuración de webhook de una aplicación, usa Get App. Requierenamespace:apps:ready cuesta 1 punto. - Añadido. Get App devuelve la configuración completa de una aplicación a partir de su id:
GET /v1/origin/apps/{appId}. Es la operación de lectura que usa el publicador para gestionar la aplicación; Get Authenticated App sigue siendo la operación con la que una aplicación consulta sus propios datos mediante su JWT. Requiereapp:settings:ready cuesta 1 punto. - Añadido. Update App modifica los ajustes de una aplicación:
PATCH /v1/origin/apps/{appId}.displayName,webhookUrl,descriptionywebsiteUrlson campos simples, mientras queevents,installationRedirectUrisydefaultScopesson contenedores que reemplazan la lista completa. Los campos omitidos no se modifican, una solicitud que no establece ningún valor devuelveInvalidArgument(HTTP 400), y enviarwebhookUrlcomo cadena vacía desactiva la entrega y cancela definitivamente las entregas pendientes de la aplicación. Requiereapp:settings:writey cuesta 5 puntos. - Añadido. Add App Signing Key registra una clave pública Ed25519 adicional para una aplicación:
POST /v1/origin/apps/{appId}/signing_keys. La respuesta incluye elkidque debe usarse como ID de clave del JWT, es decir, el resumen SHA-256 codificado en base64url de la codificación SPKI DER de la clave. Registrar una clave ya existente devuelveAlreadyExists(HTTP 409 Conflict), y superar el límite de claves activas de la aplicación devuelveFailedPrecondition(HTTP 400). Requiereapp:settings:writey cuesta 5 puntos. - Añadido. Revoke App Signing Key retira una clave de firma de la app y responde con
204 No Content:DELETE /v1/origin/apps/{appId}/signing_keys/{kid}. Los JWT de aplicación firmados con la clave revocada dejan de autenticarse, y revocar la última clave activa devuelveFailedPrecondition(HTTP 400). Requiereapp:settings:writey cuesta 5 puntos. - Añadido. Las respuestas de aplicación incluyen
namespaceSlug, el slug del espacio de nombres propietario de la aplicación, además dedescription,websiteUrlydefaultScopes. Estos campos los devuelven Get Authenticated App, Get App, Crear aplicación y Update App.
Grants
- Añadido. List Repository Grants enumera los usuarios, grupos y grupos del equipo propietario que tienen un permiso concedido directamente sobre un repositorio:
GET /v1/origin/repos/{ownerSlug}/{repoName}/grants. No se incluyen los permisos heredados del propietario del repositorio, y se omite cualquier principal que ya no se pueda resolver, por lo que una página puede contener menos grants quepageSize. Requiererepository:settings:ready cuesta 1 punto. - Añadido. Upsert Repository Grant establece el permiso que un principal tiene directamente sobre un repositorio:
POST /v1/origin/repos/{ownerSlug}/{repoName}/grants. El cuerpo indica exactamente uno deuser,groupoteamGroup, y unpermissioncon valorread,writeoadmin;customdevuelveInvalidArgument(HTTP 400), y un principal ajeno al equipo u organización del propietario devuelveFailedPrecondition(HTTP 400). Repetir un grant que el principal ya tiene se completa correctamente sin cambios. Requiererepository:settings:writey cuesta 5 puntos. - Añadido. Delete Repository Grant elimina el permiso que un principal tiene directamente sobre un repositorio y responde
204 No Content:DELETE /v1/origin/repos/{ownerSlug}/{repoName}/grants. Los permisos heredados del propietario no se ven afectados, por lo que un grupo del equipo propietario vuelve a su valor predeterminado a nivel de propietario, y eliminar un permiso que el principal no tiene directamente se completa correctamente sin cambios. Requiererepository:settings:writey cuesta 5 puntos. - Añadido. List Namespace Grants enumera a quién se le ha concedido acceso a un propietario:
GET /v1/origin/owners/{ownerSlug}/grants. Cada grant incluye el permiso que otorga sobre todos los repositorios del propietario; los grants de admin aparecen primero y se excluyen los concedidos sobre repositorios individuales. Requierenamespace:settings:ready cuesta 1 punto. - Añadido. Upsert Namespace Grant establece el permiso que un principal tiene directamente sobre un propietario:
POST /v1/origin/owners/{ownerSlug}/grants.permissionadmitePERMISSION_READ,PERMISSION_CONTRIBUTOR,PERMISSION_WRITEoPERMISSION_ADMIN, yPERMISSION_CUSTOMdevuelveInvalidArgument(HTTP 400). Un principal ajeno al equipo propietario o a su organización, o una escritura que dejaría al propietario sin admin, devuelveFailedPrecondition(HTTP 400). Requierenamespace:settings:writey cuesta 5 puntos. - Añadido. Delete Namespace Grant elimina el permiso que un principal tiene directamente sobre un propietario y responde
204 No Content:DELETE /v1/origin/owners/{ownerSlug}/grants. Los grants por repositorio no se ven afectados, y una eliminación que dejaría al propietario sin admin devuelveFailedPrecondition(HTTP 400). Requierenamespace:settings:writey cuesta 5 puntos.
Instalaciones
- Añadido. Las instalaciones incluyen
suspendedAt, que se establece mientras la instalación está suspendida y se omite mientras está activa, ydeletedAt, que solo aparece en la instantánea del webhookinstallation.deleted. Ambos campos los devuelven Get App Installation y List App Installations. - Añadido. Los cinco payloads
installation.*incluyeninstallation.appId, con el mismo valor que elapp.iddel propio payload, einstallation.updatedAteninstallation.createdeinstallation.updated. Todos los campos de una instalación que devuelve Get App Installation están presentes en la instantánea con el mismo nombre y tipo, por lo que un mismo decodificador sirve para leer ambos.
Ejecuciones de comprobación
- Cambio incompatible. El payload de
repository.check_run.rerequestedya no incluye un camporerequestedByde nivel superior. El principal que solicitó la nueva ejecución figura ahora en la ejecución de comprobación incrustada comocheckRun.rerequestedBy, lo que sustituye la nota del 10 de septiembre según la cual el payload incluía al solicitante junto al repositorio, la suite y la ejecución. Migración: leecheckRun.rerequestedByallí donde tu receptor leía el camporerequestedBypropio del payload. - Añadido. Rerequest Check Run pide a la aplicación que informó de una ejecución de comprobación que la vuelva a ejecutar:
POST /v1/origin/repos/{ownerSlug}/{repoName}/check-runs/{checkRunId}/rerequestcon un cuerpo vacío. La ejecución debe estar en estadocompleted, debe incluirisRerequestable, debe ser el intento actual para sukeyy debe estar en la cabecera actual de una pull request abierta; en cualquier otro caso se devuelveFailedPrecondition(HTTP 400), y una segunda solicitud mientras haya otra pendiente devuelveAlreadyExists(HTTP 409 Conflict). La llamada nunca modifica elstatusni laconclusionde la propia ejecución. Cualquier principal conrepository:contents:writepuede volver a solicitar cualquier ejecución que lo admita, sea cual sea la aplicación que la haya informado, y la llamada tiene un coste de 5 puntos. - Añadido. Las ejecuciones de comprobación incluyen
rerequestedBy, el principal que solicitó la nueva ejecución, presente siempre quererequestedAtesté establecido y que se borra junto con él. Lo devuelven Get Check Run, List Check Runs For Suite, List Check Runs For Commit, Post Check Run, Batch Upsert Check Runs y Rerequest Check Run. - Modificado.
rerequestedAtindica una nueva solicitud pendiente, no una marca de tiempo única. Origin lo borra cuando la aplicación propietaria responde publicando una ejecución nueva para el mismo head SHA ykey, ya sea una nueva ejecución con un nuevoexternalIdo una actualización de la ejecución solicitada con el mismo, tras lo cual la ejecución puede volver a solicitarse. Esto sustituye la nota del 10 de septiembre según la cual una ejecución de comprobación se vuelve a solicitar como máximo una vez, por lo que un receptor puede recibir más de un eventorepository.check_run.rerequestedpara la misma ejecución; sigue deduplicando los reenvíos por el id del evento. - Modificado. Una ejecución de comprobación solicitada de nuevo permanece en List Check Runs For Suite y List Check Runs For Commit y aparece como pendiente, con
rerequestedAtestablecido y sin cambios en sustatusyconclusionya obsoletos, en lugar de desaparecer de ambos listados hasta que la aplicación responda. Una comprobación obligatoria bloquea la fusión como comprobación pendiente, no como comprobación ausente. Esto sustituye la nota del 10 de septiembre según la cual la ejecución desaparece hasta que llega un nuevo intento.
Repositorios
- Añadido. Update Repo modifica los ajustes del repositorio:
PATCH /v1/origin/repos/{ownerSlug}/{repoName}. El cuerpo admite los campos opcionalesdefaultBranch,allowMergeCommit,allowSquashMerge,deleteBranchOnMergeyvisibility, y los campos omitidos no se modifican.allowMergeCommityallowSquashMergedeben enviarse juntos y al menos uno de ellos debe sertrue;defaultBranchydeleteBranchOnMergedevuelvenFailedPrecondition(HTTP 400) en un repositorio que se sincroniza desde un origen; y una solicitud que no establece nada devuelveInvalidArgument(HTTP 400). Los grupos se aplican en un orden fijo y no de forma atómica, por lo que, si se rechaza un grupo, los anteriores quedan aplicados. Requiererepository:settings:writey cuesta 5 puntos. - Añadido. Transition Repo Mirror inicia un cambio de dirección de la réplica y devuelve el job que lo supervisa:
POST /v1/origin/repos/{ownerSlug}/{repoName}/mirror:transition. El cuerpo requiere untransitioncon el valorinitial_to_inbound,inbound_to_outboundooutbound_to_inbound, y el repositorio mantiene un estado de réplica en transición mientras se ejecuta el job. Si el repositorio no se encuentra en el estado inicial que espera la transición, o ya tiene un job activo, se devuelveFailedPrecondition(HTTP 400). Requiererepository:mirror:writeen una credencial de usuario de Cherri Code que también administre el repositorio en el origen de la réplica, y cuesta 10 puntos. - Añadido. Force Repo Mirror Cutover migra un repositorio a su origen sin enviarle de vuelta el estado divergente:
POST /v1/origin/repos/{ownerSlug}/{repoName}/mirror:forceCutovercon un cuerpo vacío. El origen se adopta tal cual como fuente de verdad, y las refs que solo existen en Origin se guardan en una instantánea y se descartan. Solo se acepta para un repositorio con estadooutbound, o uno bloqueado en una transición de outbound a inbound cuyo job activo indiquerequires_attention, en cuyo caso la migración forzada lo sustituye. Requiererepository:mirror:writey cuesta 10 puntos. - Añadido. Detach Repo Mirror desvincula permanentemente un repositorio replicado de su origen y responde
204 No Content:DELETE /v1/origin/repos/{ownerSlug}/{repoName}/mirror. El repositorio conserva su contenido y pasa a ser un repositorio nativo, la sincronización se detiene en ambas direcciones y se elimina la credencial de despliegue de la réplica. Desvincular un repositorio ya desvinculado se completa correctamente sin ningún efecto, mientras que un repositorio que nunca tuvo réplica devuelveFailedPrecondition(HTTP 400). Requiererepository:mirror:deletey cuesta 5 puntos. - Añadido. Get Mirror Transition Job devuelve un job de transición por id:
GET /v1/origin/repos/{ownerSlug}/{repoName}/mirror/transition-jobs/{jobId}. Un job indica sutransition, unstatuscon valorqueued,running,succeeded,failed_rolled_back,requires_attentionosuperseded, unattemptCounty, si ha fallado,lastErrorCodeylastErrorMessage. Su cadenaphasees un detalle meramente informativo que irá incorporando nuevos valores a medida que evolucione el proceso de transición, así que consulta periódicamentestatuspara detectar la finalización en lugar de compararphase. Requiererepository:metadata:ready cuesta 1 punto. - Añadido. Get Active Mirror Transition Job devuelve el job de transición en curso del repositorio y el último finalizado:
GET /v1/origin/repos/{ownerSlug}/{repoName}/mirror/transition-jobs:active. TantoactiveJobcomolastJobson opcionales, por lo que un repositorio que nunca ha realizado una transición devuelve un objeto vacío; para distinguir una transición que terminó de una que nunca se ejecutó, consulta periódicamente hasta queactiveJobdesaparezca y luego leelastJob. Requiererepository:metadata:ready cuesta 1 punto. - Cambiado. Las referencias de los endpoints de estado de réplica se han trasladado a la API de migración de Origin. Sus contratos HTTP no han cambiado, y los anclajes anteriores de la API de Origin enlazan a la nueva referencia.
- Añadido. Merge Pull Request acepta un
mergeMethodopcional con valormergeosquash, que determina si la pull request se integra como un commit de fusión o como un único commit combinado (squash). Un método que el repositorio no permite se rechaza conFailedPrecondition(HTTP 400), y cualquier otro valor, incluidorebase, conInvalidArgument(HTTP 400). Omítelo para mantener el comportamiento anterior: un commit de fusión si el repositorio lo permite; si no, un squash, y siempre un squash cuando la rama base requiere un historial lineal. - Añadido. Los payloads de repositorio incluyen
visibility, cuyo valor esinternaloprivate, junto con los booleanosallowMergeCommit,allowSquashMergeydeleteBranchOnMerge. Los cuatro son de solo lectura y los devuelven Get Repo, Crear repositorio, List Repos y Listar repositorios de la instalación de la aplicación. - Añadido. Las ejecuciones de comprobación incluyen
isRerequestable, con el que la aplicación que las informa declara que la ejecución puede repetirse, yrerequestedAt, la marca de tiempo de la nueva solicitud. EnvíaisRerequestableen Post Check Run y Batch Upsert Check Runs; ambos campos se devuelven ahí y en Obtener ejecución de comprobación, List Check Runs For Suite y List Check Runs For Commit. Si declaras que una ejecución puede volver a solicitarse, tu aplicación se compromete a responder a cada nueva solicitud publicando una nueva ejecución para el mismo SHA de head y la mismakey. - Añadido.
repository.check_run.rerequestedse entrega cuando se vuelve a solicitar una ejecución de comprobación completada, y solo llega a la aplicación propietaria de la ejecución, no a todos los suscriptores del repositorio. Su payload incluye el repositorio, la suite de comprobación, la ejecución de comprobación marcada yrerequestedBy, pero no incluye contexto de pull request, así que obtén la pull request a partir decheckRun.sha. La suscripción requiererepository:checks:read. Una ejecución de comprobación solo puede volver a solicitarse una vez, así que descarta las entregas duplicadas usando el id del evento. - Añadido. Cada esquema de payload de webhook de la especificación de OpenAPI incluye una extensión
x-origin-webhook-eventsque indica los eventos con los que se entrega, además de un payload de ejemplo seleccionado comoexampledel esquema. La nueva referencia de Payloads de eventos documenta los campos y el payload de ejemplo de cada payload, generados a partir de esos esquemas con la misma estructura que la referencia de endpoints. - Cambiado. Una ejecución de comprobación que se vuelve a solicitar deja de aparecer en List Check Runs For Suite y List Check Runs For Commit hasta que la aplicación propietaria publique un nuevo intento o actualice el existente con un
externalUpdatedAtmás reciente. Por tanto, una comprobación obligatoria figura como ausente y bloquea la fusión mientras la nueva solicitud esté pendiente. Consulta la ejecución excluida por su propio id con Obtener ejecución de comprobación.
- Cambio incompatible. Un anclaje
inlinecuyo rango de líneas sobrepasa el final del archivo se rechaza conInvalidArgument(HTTP 400) en Create Pull Request Comment y Create Pull Request Review. El rango sigue sin limitarse a los fragmentos (hunks) del diff y se valida con el archivo tal como existe en el lado anclado:leftlo lee en el commit base yright, en la cabecera. El error indica el número de líneas del archivo. En una revisión, basta un anclaje fuera de rango para que falle toda la solicitud y no se publique nada. Migración: antes de escribir, limitainline.startLineeinline.endLineal número de líneas del lado anclado. Si el anclaje queda fuera de los fragmentos del diff, obtén ese valor con Get Contents.
- Añadido. Create Git Ref crea una rama en un commit existente:
POST /v1/origin/repos/{ownerSlug}/{repoName}/git/refs. Reciberefcomorefs/heads/<branch>oheads/<branch>yshacomo el SHA hexadecimal completo de un commit del repositorio; los tags y otros espacios de nombres de referencias devuelvenInvalidArgument(HTTP 400). Si se crea una rama que ya apunta asha, se devuelve la referencia existente, y si la rama ya existe en otro commit, se devuelveAlreadyExists(HTTP 409 Conflict). Requiererepository:contents:writey cuesta 5 puntos. - Añadido. Create Commit From Files hace commit de cambios de archivos inline en una rama y la hace avanzar:
POST /v1/origin/repos/{ownerSlug}/{repoName}/git/commits:createFromFiles. Cada entrada defiles[]establece exactamente uno de estos campos:content(conencodingutf-8obase64ymodefile,executableosymlink) odelete. Además,expectedHeadShadebe coincidir con la punta de la rama, que pasa a ser el padre del nuevo commit. La respuesta devuelvesha,treeShaypreviousHeadSha. Cada solicitud admite como máximo 1000 cambios de archivos, 8 MiB por archivo y 32 MiB de contenido en total. Requiererepository:contents:writey cuesta 10 puntos. - Cambiado. La entrega de webhooks reintenta un envío fallido siete veces en lugar de seis, y el primer reintento se produce 5 segundos después del fallo en lugar de 30. La secuencia completa es de 5 segundos, 30 segundos, 1 minuto, 2 minutos, 4 minutos y 8 minutos, por lo que un receptor que esté caído todo el tiempo recibirá un
POSTmás en aproximadamente la misma ventana de 16 minutos. Deduplica el intento adicional porwebhook-id, igual que haces con el resto.
- Cambio incompatible. Los metadatos de la aplicación ya no incluyen
slug. Se ha eliminado de la respuesta de Get Authenticated App, de todos los actores de aplicación que devuelven las operaciones de checks, pull requests, revisiones y comentarios (actor.app,author.appydismissal.dismissedBy.app), del objetoappde los cinco payloads de webhookinstallation.*y del payload de Ping Webhook. Esto sustituye a la nota del 2 de septiembre, según la cual los actores de aplicación incluíandisplayNamejunto conidyslug. Antes se garantizaba que un actor de aplicación incluyeraslug; ahora incluyeidy el campo opcionaldisplayName. Migración: identifica las aplicaciones poridy etiquétalas condisplayNameen todos los puntos donde tu integración leíaslug. - Añadido. List Pull Request Comments acepta un parámetro de consulta opcional
threadIdsque limita el listado a los comentarios de esos hilos. Así puedes leer un solo hilo sin paginar todo el historial de comentarios de un pull request. Los duplicados se ignoran, por lo que el límite de 20 se aplica a IDs distintos; una lista más larga o un ID vacío devuelveInvalidArgument(HTTP 400). Los tokens de página incluyen el conjunto con el que se generaron, así que reinicia la paginación cuando cambie el filtro. - Modificado. El filtro
authorde List Pull Requests ahora también acepta la dirección de correo electrónico exacta de un usuario, sin distinguir mayúsculas de minúsculas, además de los IDs de actoruser_…,app_…ysa_…que ya admitía. Un correo electrónico que no corresponda a un único usuario devuelve una lista vacía en lugar de un error; antes, cualquier correo electrónico devolvíaInvalidArgument(HTTP 400). Las aplicaciones y las cuentas de servicio no tienen una identidad de correo electrónico, así que de este modo solo se pueden seleccionar autores que sean usuarios. Los IDs de actor siguen siendo la identidad que devuelven estas respuestas.
- Añadido. List Check Runs For Commit acepta los parámetros de consulta opcionales
checkNameystatus.checkNamecoincide exactamente con elnamede una ejecución de comprobación, ystatusadmitequeued,in_progressocompleted; cualquier otro valor devuelveInvalidArgument(HTTP 400). Ambos filtros se aplican después de consolidar los intentos en el más reciente, por lo que una ejecución coincide según el estado de su último intento y un filtro nunca vuelve a mostrar un intento reemplazado. Los tokens de página incluyen los filtros con los que se emitieron, así que reinicia la paginación cuando cambie un filtro. - Añadido. List Pull Request Comments acepta los parámetros de consulta opcionales
sinceyuntil: límites inclusivos de la fecha de creación de los comentarios, expresados como marcas de tiempo RFC 3339, por ejemplo2026-08-01T00:00:00Z. Una marca de tiempo mal formada devuelveInvalidArgument(HTTP 400). Los tokens de página incluyen los límites con los que se emitieron, así que reinicia la paginación cuando cambie un límite. Usasincepara seguir los comentarios nuevos en lugar de volver a paginar todo el historial de comentarios de un pull request. - Cambiado. Las operaciones cuyos alcances requeridos provienen de la credencial y no de una concesión de instalación marcan su extensión
x-origin-scopesconambient: trueen la especificación de OpenAPI publicada. Nueve operaciones incluyen este flag, entre ellas Get Authenticated App, Crear token de acceso de instalación y Listar repositorios de la instalación de la aplicación. Las cadenas de scope se mantienen en la extensión para que las respuestas403sigan indicándolas, y el procesamiento de las solicitudes no cambia; consulta el flag para distinguir las operaciones para las que solo necesitas autenticarte de las que requieren un scope aprobado durante la instalación.
- Cambio incompatible. List Check Suites For Commit, List Check Runs For Commit y List Check Runs For Suite devuelven solo el intento más reciente de cada comprobación y omiten los intentos reemplazados, en consonancia con lo que ya mostraban el control de fusión y las vistas de CI del producto. Una suite de comprobación se reduce a su intento más reciente por actor que informa y clave de suite, y una ejecución, a su intento más reciente por clave de ejecución dentro de una suite, de modo que una ejecución fallida y su reintento correcto ya no aparecen a la vez.
totalSizey los tokens de página cuentan el conjunto reducido. Migración: consulta un intento reemplazado por su propio id mediante Obtener ejecución de comprobación o Get Check Suite, que siguen dando acceso a todos los intentos almacenados. - Añadido. Create Pull Request Comment acepta un anclaje
fileque abre un hilo de comentarios sobre un archivo completo en el diff de la versión del pull request. Solo incluyefile.path: Origin deduce el lado a partir del tipo de cambio del archivo (la versión base para un archivo eliminado y la versión de cabecera en los demás casos) y lo devuelve enthread.side. Envía la ruta eliminada si se trata de una eliminación y la ruta de cabecera para cualquier otro cambio; una ruta fuera del diff o la ruta original de un archivo renombrado devuelveInvalidArgument(HTTP 400).file,inlineythreadIdson mutuamente excluyentes. Create Pull Request Review admite el mismo anclaje comocomments[].file. - Añadido. Los actores de usuario públicos incluyen
displayNameyhandlejunto conidyemail.displayNamees el nombre y el apellido de la cuenta separados por un espacio, el mismo nombre que muestra el producto, y se omite cuando la cuenta no tiene nombre.handlees el identificador de perfil reclamado sin el prefijo@, y solo está presente mientras ese perfil sea visible públicamente. Ambos aparecen en todos los lugares donde aparece un actor de usuario, incluidos los autores de pull requests y comentarios, los actores de ejecuciones y suites de comprobación, los descartes de revisiones, los revisores solicitados, elinstalledByde una instalación y los payloads de webhook correspondientes. El recibo de instalación incluyedisplayName, pero nuncahandle. - Añadido. Los actores de aplicación públicos incluyen el
displayNameregistrado de la aplicación junto conidyslug, y el objetoappde los cinco payloads de webhookinstallation.*también lo incluye. Se omite cuando no se puede resolver la aplicación y en el actor gestionado propio de Cherri Code. - Modificado. Solicitar un scope
:writetambién concede el scope:readcorrespondiente, de modo que a una instalación que solicitarepository:labels:writese le concede tambiénrepository:labels:read. Esto se aplica al instalar una aplicación, al previsualizar una instalación y cuando un token de acceso de instalación restringe sus scopes; además, una credencial existente de solo escritura ahora permite la lectura correspondiente. Los scopes de lectura siguen sin conceder permisos de escritura.
- Añadido.
repository.deletedse envía cuando se elimina un repositorio, ya sea al eliminar desde el producto un repositorio nativo o saliente, o al detener la sincronización de una réplica entrante. El payload incluye una referenciarepositoryydeletedAten lugar de una instantánea, porque un repositorio eliminado ya no se puede resolver a través de la API. Para suscribirse se requiererepository:metadata:read. A diferencia derepository.pushed, este evento sí se envía para repositorios replicados desde GitHub, ya que detener la sincronización solo elimina el repositorio del lado de Cherri Code y GitHub no envía nada al respecto. Volver a eliminar un repositorio ya eliminado no emite ningún evento. - Añadido.
repository.metadata.updatedse envía cuando cambia la rama predeterminada de un repositorio, ya sea por escrituras desde la configuración o la API, por una réplica entrante que sigue un cambio de nombre en el repositorio de origen o por la reconciliación de la rama principal en el primer push. El payload incluye la instantánea completa derepositoryposterior a la escritura, sin delta ni actor que realizó la actualización, así que compara instantáneas sucesivas o vuelve a obtener el repositorio para ver qué ha cambiado. Para suscribirse se requiererepository:metadata:read. - Añadido. Los usuarios revisores solicitados incluyen un
emailjunto aid. Aparece en List Pull Request Requested Reviewers y Request Pull Request Reviewers, y en la entradareviewer.userde los webhookspull_request.reviewer.added,pull_request.reviewer.removedypull_request.reviewer.rerequested. El valor es la dirección de correo electrónico de la cuenta y está vacío si la cuenta no tiene ninguna. Hasta ahora, estos puntos identificaban a un usuario únicamente por su id. - Cambiado. Las respuestas REST incluyen los campos que tienen su valor predeterminado en lugar de omitirlos, de modo que un booleano
false, un número0, una cadena vacía y un array vacío aparecen en todos los cuerpos de respuesta. Una pull request que no es borrador obtenida con Get Pull Request devuelvedraftcomofalseen lugar de omitirlo, y una lista vacía devuelve[]en lugar de nada. Los campos que el contrato marca como opcionales, comosubmitted_atydismissal, siguen sin aparecer cuando no están establecidos. Si tu integración trataba una clave ausente como el valor predeterminado, lee directamente el valor. Así se alinea con la forma en que siempre se han serializado los payloads de webhooks. - Cambiado. Cada operación de la especificación de OpenAPI publicada tiene un
operationIdúnico. Cuando una operación responde a dos estructuras de URL, la segunda recibe el sufijo_2:OriginService_GetRepoTarball_2paraGET …/tarball/{ref}yOriginService_ListMatchingGitRefs_2paraGET …/git/matching-refs. Ambas estructuras de URL y la forma de gestionar sus solicitudes no cambian, así que regenera cualquier cliente creado a partir de la especificación para incorporar los métodos renombrados. - Cambiado.
installation.updatedtambién se envía cuando se renombra el espacio de nombres del propietario, una vez por cada instalación que siga perteneciendo a ese espacio de nombres. El evento incluye el nuevo slug del espacio de nombres junto con los scopes actuales y la selección de repositorios de esa instalación.
- Cambiado. Cada operación de la especificación de OpenAPI publicada incluye una extensión
x-origin-scopesque indica el scope que requiere la operación y las credenciales que acepta.scopescontiene el alcance requerido ytokenTypes, los tipos de credenciales aceptados:apppara un JWT de aplicación,installationpara un token de acceso de instalación yuserpara una credencial de usuario. Si la operación rechaza un tipo de credencial, este no aparece entokenTypes. Obtener límite de uso es la única operación que no requiere ningún scope. La extensión también sustituye las frases sobre scopes que Create Label, Update Label y Delete Label incluían en sus descripciones. La autorización no cambia: la extensión solo publica los scopes que Origin ya aplicaba.
- Añadido. List Pull Request Requested Reviewers devuelve los usuarios y grupos cuya revisión sigue pendiente en un pull request:
GET /v1/origin/repos/{ownerSlug}/{repoName}/pulls/{pullNumber}/requested_reviewers. Una solicitud directa se elimina cuando ese usuario envía una revisión, y una solicitud de grupo se elimina cuando cualquier miembro actual del grupo envía la suya; en cambio, una revisión en borrador sin enviar mantiene la solicitud pendiente. Los revisores se devuelven como ids, y leerlos requiererepository:pull_requests:reviews:read. - Añadido. Request Pull Request Reviewers solicita revisiones a usuarios y grupos y devuelve los revisores solicitados:
POST /v1/origin/repos/{ownerSlug}/{repoName}/pulls/{pullNumber}/requested_reviewers. Identifica a cada revisor por su public iduser_…, correo electrónico, idgrp_…o slug de grupo; los nombres para mostrar no se resuelven, un identificador desconocido o ambiguo devuelveInvalidArgument(HTTP 400) y un revisor que no es candidato para el repositorio devuelvePermissionDenied(HTTP 403). Volver a solicitar a un revisor ya solicitado reactiva la solicitud, de modo que un revisor que ya había enviado una revisión vuelve a aparecer como pendiente. Requiererepository:pull_requests:reviews:write. - Añadido. Remove Pull Request Requested Reviewers elimina las solicitudes de revisión pendientes y devuelve
204con el cuerpo vacío:DELETE /v1/origin/repos/{ownerSlug}/{repoName}/pulls/{pullNumber}/requested_reviewers. Eliminar a un revisor que no tiene una solicitud activa no tiene ningún efecto, y un public id estable se sigue resolviendo aunque ese revisor ya no figure en la lista de candidatos del repositorio, por lo que es posible eliminar una solicitud obsoleta. Requiererepository:pull_requests:reviews:write. - Añadido. Update Pull Request Thread resuelve o reabre un hilo de comentarios de un pull request y devuelve su estado actualizado:
PATCH /v1/origin/repos/{ownerSlug}/{repoName}/pulls/threads/{threadId}. Envíaresolvedcomotruepara resolverlo o comofalsepara reabrirlo. Ambas operaciones son idempotentes, responder a un hilo resuelto no lo reabre y un hilo almacenado en otro repositorio devuelve404. Requiererepository:pull_requests:reviews:write. - Añadido. Los comentarios de pull request incluyen su hilo completo en lugar de solo el id del hilo.
threadahora incluye laversiona la que se asocia, con sus SHA de head y base; los campospath,side,startLineyendLinedel anclaje del hilo en el diff;resolvedAt, y los propioscreatedAtyupdatedAtdel hilo. Lo devuelven List Pull Request Comments, Get Pull Request Comment y Update Pull Request Comment.thread.idno cambia, así que agrupar comentarios por este campo sigue funcionando. - Añadido. Create Pull Request Comment acepta un anclaje
inline, formado porpath,side,startLiney unendLineopcional, que abre un hilo anclado a una línea en el diff de una versión del pull request, además de unversionNumberque indica la versión a la que se asocia y que, de forma predeterminada, es la más reciente en el momento de la llamada. Elpathdebe formar parte del diff de esa versión en un lado donde el archivo tenga contenido; se puede anclar cualquier línea de un archivo modificado, no solo las que están dentro de un fragmento del diff, y un anclaje no válido devuelveInvalidArgument(HTTP 400) en lugar de convertirse en un comentario de discusión general.inlineythreadIdson mutuamente excluyentes, al igual quethreadIdyversionNumber. - Añadido. Create Pull Request Review acepta un array
comments, con un máximo de 50 por solicitud, que publica una revisión junto con sus comentarios en una única llamada atómica. Cada entrada incluye unbodyy los mismos destinos que Create Pull Request Comment: un anclajeinlineen el diff de la versión revisada, una respuesta conthreadIdo ninguno de los dos para crear un nuevo hilo de discusión general. Todos los anclajes se validan antes de escribir nada, por lo que un solo anclaje no válido hace que falle toda la solicitud conInvalidArgument(HTTP 400) y no se publica nada. La operación no admite clave de idempotencia, así que consulta List Pull Request Reviews antes de reintentar tras un fallo ambiguo. Las solicitudes sincommentsse comportan igual que antes. - Añadido.
pull_request.comment.createdincluye el anclaje en el diff del hilo en el comentario que lo abrió, para que un receptor pueda materializar el hilo sin tener que hacer una lectura adicional.comment.threadcontiene los valoresversion,path,side,startLineyendLinesobre los que se registró el comentario; una respuesta incluye solocomment.thread.id, y el estado de resolución no forma parte del evento. Los comentarios registrados junto con una revisión mediante Create Pull Request Review no emiten nada hasta que se envía la revisión; en ese momento, cada uno emite su propio evento.
- Añadido. Get Repo Tarball descarga un tar comprimido con gzip del árbol de un repositorio:
GET /v1/origin/repos/{ownerSlug}/{repoName}/tarball/{ref}. La primera solicitud para un commit resuelto transmiteapplication/gzipcomo cuerpo de la respuesta; las solicitudes posteriores para el mismo commit devuelven302con una URL de descarga firmada enLocation, válida durante 15 minutos. Las entradas del archivo se sitúan en la raíz del tar, sin un directorio contenedor; un repositorio vacío devuelveABORTED(HTTP 409 Conflict), y para descargar un archivo se necesitarepository:contents:read. - Añadido. List Comparison Files enumera los archivos modificados en una comparación, es decir, el diff de
headfrente a la base de fusión debaseyhead:GET /v1/origin/repos/{ownerSlug}/{repoName}/compare/{basehead}/files. Los resultados se paginan, con 30 archivos por página de forma predeterminada y 100 como máximo, y cada archivo tiene la misma estructura que devuelve List Commit Files. Una comparaciónidenticalobehinddevuelve una lista vacía, los historiales sin relación devuelven404, y una comparación cuyos commits cambian durante la paginación rechaza el token de página conInvalidArgument(HTTP 400), por lo que el listado vuelve a empezar desde la primera página. Para leer los archivos de una comparación se necesitarepository:contents:read. - Añadido. El endpoint de claves de firma envía
Cache-Control: public, max-age=600, stale-if-error=600. Reutiliza un JWKS en caché durante 10 minutos y luego actualízalo; si una actualización falla, conserva las últimas claves válidas durante 10 minutos más como máximo antes de dar por fallida la verificación. Actualiza también cuando ninguna clave activa pueda verificar una firma, para que se descarten los ID de clave retirados. - Cambiado. Un check run que siga en
in_progresscuando venza sudeadlineAtse completa con la conclusióntimed_outy envíarepository.check_run.completed. Esto sustituye a la nota del 27 de agosto, que indicaba que una fecha límite no cambia el estado de un run. La expiración se ejecuta mediante un barrido periódico y no con un temporizador por run, por lo que un run puede superar brevemente su fecha límite. Un runqueuednunca expira, como tampoco un run sindeadlineAt, y Origin conserva elexternalUpdatedAtdel run para que una finalización posterior de tu proveedor pueda sobrescribir la conclusióntimed_out. - Cambiado.
repository.pushedya no se envía para los repositorios que Origin replica desde GitHub. GitHub gestiona esos pushes y envía sus propios webhooks de push, por lo que el envío de Origin los duplicaba. Los pushes a repositorios nativos de Origin y a réplicas salientes se siguen enviando igual, y el estado de la réplica no afecta a ningún otro evento. - Cambiado. Create Pull Request rechaza con
InvalidArgument(HTTP 400) unheadque no tenga historial en común conbase, sin crear nada, en lugar de devolver el404que generaba la comparación subyacente. - Cambiado. Un push que deje la cabecera de una pull request abierta sin historial en común con su base cierra la pull request y envía
pull_request.closed. Un push relacionado posterior no la vuelve a abrir. - Cambiado. Cada operación de la especificación de OpenAPI documenta los códigos de respuesta que puede devolver, en lugar de mostrar los mismos
400,401,403y429en todas las operaciones:404en cada ruta con parámetros,409donde un handler notifique un conflicto,202en Batch Redeliver Webhook Deliveries y Sync Mirror, y conjuntos más reducidos en Get Rate Limit y Get Authenticated App. El esquemaStatusdescribe el envoltorio de error que devuelve Origin, e indica que un404nunca distingue entre un recurso inexistente y uno inaccesible; además, cada operación incluye un ejemplo de solicitud y de respuesta. El procesamiento de solicitudes no cambia; vuelve a generar cualquier cliente creado a partir de la especificación para obtener los nuevos modelos de respuesta.
- Añadido. Las ejecuciones de comprobación aceptan y devuelven una marca de tiempo
deadlineAtopcional. Envíala en el cuerpo de la ejecución en Post Check Run o Batch Upsert Check Runs, y consúltala en Obtener ejecución de comprobación, List Check Runs For Suite y List Check Runs For Commit. Origin borra la fecha límite cuando la ejecución llega acompleted, conserva el valor almacenado si una actualización omite el campo y rechaza conInvalidArgument(HTTP 400) cualquier fecha límite situada a más de 24 horas en el futuro, en lugar de ajustarla. Que venza una fecha límite no cambia el estado de la ejecución. - Cambiado. La especificación de OpenAPI publicada declara
https://api.cursor.comcomo servidor y un esquema de seguridad HTTP bearerbearerAuth, de modo que un cliente de red generado a partir del documento incorpora la URL base y el requisitoAuthorization: Bearer. - Cambiado. Los parámetros de ruta de OpenAPI usan los mismos nombres que ya emplean las URL. Las vinculaciones generadas
identifier.ownerSlugeidentifier.namepasan a serownerSlugyrepoNameen las 55 operaciones con ámbito de repositorio, lo que permite que los generadores estándar de OpenAPI procesen el documento. Las URL de las solicitudes y su comportamiento no cambian; vuelve a generar cualquier cliente de red creado a partir de la especificación para incorporar los nuevos nombres de parámetros. - Cambiado. Los enums publicados ya no incluyen sus entradas de valor cero
*_UNSPECIFIED, comoRULESET_ENFORCEMENT_UNSPECIFIEDen Create Ruleset yPULL_REQUEST_REVIEW_VERDICT_UNSPECIFIEDen Create Pull Request Review. Origin nunca aceptó ni devolvió esos valores, por lo que las solicitudes y respuestas no cambian. - Cambiado. Todas las operaciones de la especificación documentan respuestas
400,401,403y429con el cuerpogoogle.rpc.Status, en lugar de solo la respuesta genéricadefault. Consulta Errores para ver el cuerpo y la lista completa de estados.
- Cambio incompatible. Los payloads de webhook de revisores para
pull_request.reviewer.added,pull_request.reviewer.removedypull_request.reviewer.rerequestedsustituyen el parreviewer.kindyreviewer.idpor un revisor tipado, en el que está presente exactamente uno dereviewer.useroreviewer.group. Migración: leereviewer.user.iddonde antes leíasreviewer.idcon unreviewer.kinddeuser, yreviewer.group.iddondereviewer.kinderagroup. - Añadido. List Labels devuelve las definiciones de etiquetas de un repositorio, ordenadas por nombre:
GET /v1/origin/repos/{ownerSlug}/{repoName}/labels. Para leer etiquetas se necesita el nuevo scoperepository:labels:read. Los resultados están paginados, con 30 etiquetas por página de forma predeterminada y un máximo de 100. - Añadido. Create Label define una etiqueta en un repositorio y la devuelve:
POST /v1/origin/repos/{ownerSlug}/{repoName}/labels. Toda escritura de etiquetas requiere el nuevo scoperepository:labels:write.nameadmite un máximo de 50 caracteres ydescriptionde 255;colordebe tener seis caracteres hexadecimales sin#inicial, y si el nombre ya lo usa otra etiqueta del repositorio, la solicitud se rechaza conAlreadyExists(HTTP 409 Conflict). - Añadido. Get Label devuelve una etiqueta del repositorio por su nombre:
GET /v1/origin/repos/{ownerSlug}/{repoName}/labels/{labelName}. Si el nombre no existe, devuelve404. - Añadido. Delete Label elimina una etiqueta del repositorio por su nombre y devuelve
204:DELETE /v1/origin/repos/{ownerSlug}/{repoName}/labels/{labelName}. Al eliminar una etiqueta, también se quita de todos los pull requests a los que estaba asignada. - Añadido. Update Label cambia el nombre, el color o la descripción de una etiqueta, identificándola por su nombre actual:
PATCH /v1/origin/repos/{ownerSlug}/{repoName}/labels/{labelName}. Los campos omitidos no se modifican, y si se intenta cambiar el nombre a uno que ya usa otra etiqueta, la solicitud se rechaza conAlreadyExists(HTTP 409 Conflict). - Añadido. List Check Run Annotations devuelve las anotaciones de una ejecución de comprobación en orden ascendente de ID, que coincide con el orden de creación:
GET /v1/origin/repos/{ownerSlug}/{repoName}/check-runs/{checkRunId}/annotations. Para leerlas se necesitarepository:checks:read. Los resultados están paginados, con 30 anotaciones por página de forma predeterminada y un máximo de 100. - Añadido. Create Check Run Annotations añade entre 1 y 25 anotaciones a una ejecución de comprobación en un único lote atómico y las devuelve:
POST /v1/origin/repos/{ownerSlug}/{repoName}/check-runs/{checkRunId}/annotations. Para añadirlas se necesitarepository:checks:write. Una ejecución de comprobación admite como máximo 100 anotaciones, y un lote que supere ese límite se rechaza conResourceExhausted(HTTP 429) sin escribir nada. La operación es de solo anexado y no es idempotente, por lo que un reintento tras un fallo ambiguo puede generar duplicados. - Añadido. List Pull Requests admite cinco parámetros de consulta nuevos:
author, un ID público de actor tal como lo devuelve la respuesta enpullRequests[].author.user.id,pullRequests[].author.app.idopullRequests[].author.serviceAccount.id;base, un filtro exacto de rama base que acepta un nombre corto o una ref completa;direction,descpara mostrar primero los más recientes (valor predeterminado) oascpara mostrar primero los más antiguos; ysinceyuntil, límites inclusivos en formato RFC 3339 sobre la fecha de creación. Un autor sin pull requests devuelve una lista vacía, y cualquier otro valor no válido devuelveInvalidArgument(HTTP 400). - Añadido.
pull_request.review.dismissedse entrega cuando se descarta una revisión enviada, ya sea de forma explícita o porque una decisión más reciente la reemplaza. Tiene la misma estructura de payload quepull_request.review.submitted, conreview.dismissalcompletado, y para suscribirse a él se necesitarepository:pull_requests:reviews:read. - Añadido. Las instalaciones indican qué usuario instaló la aplicación.
installedBy, que contiene el ID públicouser_…y el correo electrónico de ese usuario, se devuelve en Get App Installation y List App Installations, y se incluye en cada instantánea de webhookinstallation.*. Allí identifica a quien realizó la instalación original y se omite cuando ya no es posible leer el registro de ese usuario. El recibo de instalación incorpora una afirmacióninstalledByque indica qué usuario realizó esa instalación o nuevo consentimiento, por lo que, tras un nuevo consentimiento, ambos valores pueden ser distintos.
- Añadido. Ping Webhook envía una entrega de prueba a la URL de webhook configurada de tu aplicación e informa de lo que respondió el receptor:
POST /v1/origin/app/webhook/pings. La entrega se firma igual que una de producción, llevawebhook-event-typecon el valorpingy no pertenece a ninguna instalación. Origin la envía una sola vez, sin reintentos, y nunca aparece en List Webhook Deliveries. Si la aplicación no tiene configurada una URL de webhook, la solicitud se rechaza conFailedPrecondition(HTTP 400). - Añadido. Las respuestas de error incluyen el ID de solicitud dos veces: en el encabezado de respuesta
X-Request-IDy en una entradagoogle.rpc.RequestInfodentro dedetails. Origin devuelve elx-request-idque enviaste o genera uno si no envías ninguno, e incluye la entrada incluso cuando el mensaje es un error interno opaco. Consulta Errores. - Cambiado. Create Pull Request y Update Pull Request rechazan un
titlede más de 256 caracteres o unbodyde más de 65.536 caracteres conInvalidArgument(HTTP 400). Antes, los valores que superaban esas longitudes fallaban con un error interno. Ambos límites cuentan puntos de código Unicode, por lo que un carácter astral, como un emoji, cuenta como uno solo. - Cambiado. Las respuestas de Sync Mirror siempre incluyen
synced, con valortrueofalse, en correspondencia con el estado HTTP:200cuando es true y202cuando es false. Antes, el campo se omitía cuando era false, por lo que el llamador tenía que interpretar su ausencia comofalse. - Cambiado. Las rutas sin coincidencia bajo
/v1/originy las solicitudes que usan un método incorrecto en una ruta conocida devuelven el envoltorio de error documentado en lugar de un cuerpo genérico del enrutador. El mensaje indica el método y la ruta, y nunca incluye la cadena de consulta. - Cambiado. Al fusionar un pull request se entrega un webhook
repository.pushedpara la referencia base que avanza con la fusión. Como es Origin quien hace ese push, el evento no indica ningún autor del push. Antes, las actualizaciones de la referencia base producidas por una fusión no se entregaban.
- Cambio. Create Pull Request Comment y Update Pull Request Comment rechazan un
bodyde más de 65.536 caracteres conInvalidArgument(HTTP 400). Antes, un cuerpo que superaba esa longitud fallaba con un error interno. El límite cuenta puntos de código Unicode, por lo que un carácter astral, como un emoji, cuenta como uno solo.
- Añadido. Delete Ruleset elimina un ruleset de un repositorio mediante su ID estable de Origin y devuelve
204:DELETE /v1/origin/repos/{ownerSlug}/{repoName}/rulesets/{rulesetId}. Requiererepository:rulesets:write. Un ruleset almacenado en otro repositorio se trata como desconocido, y unrulesetIdvacío se rechaza conInvalidArgument(HTTP 400). - Añadido. Todos los endpoints con scope de repositorio permiten identificar un repositorio por su ID estable, además de por propietario y nombre: envía
_como slug del propietario y el ID como nombre del repositorio, por ejemploGET /v1/origin/repos/_/REPO_ID. Obtén el ID del campoidde Get Repo. El ID se conserva aunque se cambie el nombre, pero no otorga ningún permiso por sí solo: tu aplicación necesita el mismo scope en el repositorio resuelto, y un ID al que no puede acceder devuelve el mismo404que un ID inexistente. Crear repositorio solo acepta un slug de propietario y rechaza_. - Cambiado. Las aplicaciones ahora pueden acceder a repositorios replicados. Una réplica puede seleccionarse en una instalación, aparece en Listar repositorios de la instalación de la aplicación y en los arrays de repositorios del payload del webhook de la instalación, puede indicarse en
repositoryIdsen Crear token de acceso de instalación y recibe entregas de webhooks. Mientras una réplica no se convierta en una réplica saliente estable, será de solo lectura: solo se aplicanrepository:metadata:readyrepository:contents:read, y cualquier otro scope devuelve403en ese repositorio, incluidogit push. Consulta Repositorios replicados.
- Cambio incompatible. El parámetro de consulta
recursiveen Get Tree es un booleano en lugar de una cadena, por lo que solotruey1recorren el árbol completo; cualquier otro valor, incluidosfalse,0y un?recursivesin valor, lista únicamente los hijos inmediatos. Migración: envíarecursive=trueen todos los casos en los que tu integración dependiera de que cualquier valor no vacío derecursiveactivara la recursión. - Cambio incompatible. Los payloads de webhook del ciclo de vida de los pull requests omiten las
labelsasignadas al pull request, lo que sustituye al campo anunciado el 20 de agosto de 2026. Las respuestas REST lo siguen incluyendo. Migración: lee las etiquetas desde Get Pull Request o List Pull Requests en lugar de la instantánea del webhook. - Añadido. List Rulesets devuelve todos los rulesets configurados en un repositorio junto con una única referencia
repositorycompartida:GET /v1/origin/repos/{ownerSlug}/{repoName}/rulesets. Los rulesets son una configuración acotada, por lo que la respuesta no está paginada. Para leer rulesets se requiererepository:rulesets:read. - Añadido. Create Ruleset guarda un nuevo ruleset y lo devuelve con los ID que Origin asigna a cada regla y actor de omisión:
POST /v1/origin/repos/{ownerSlug}/{repoName}/rulesets. Ambos endpoints de escritura de rulesets requierenrepository:rulesets:write. - Añadido. Get Ruleset devuelve un único ruleset a partir de su ID estable de Origin:
GET /v1/origin/repos/{ownerSlug}/{repoName}/rulesets/{rulesetId}. - Añadido. Update Ruleset reemplaza por completo la configuración de un ruleset, incluidos sus
rulesybypassActors:PUT /v1/origin/repos/{ownerSlug}/{repoName}/rulesets/{rulesetId}. Envía todas las reglas y actores de omisión que quieras conservar, ya que las entradas almacenadas se reemplazan en lugar de fusionarse. - Añadido. Los rulesets incluyen
id,name,description,enforcement(active,evaluateodisabled),kind(merge_branch,push_branch,push_tagopush_repository), los patronesincludedRefNamesyexcludedRefNames(que admiten globs y los tokens~ALLy~DEFAULT_BRANCH),rulesybypassActors. Create Ruleset y Update Ruleset devuelvenInvalidArgument(HTTP 400) si se superan los 64 patrones por lista, las 20 reglas o los 15 actores de omisión. - Añadido. Merge Pull Request acepta un campo de solicitud opcional
expectedHeadSha: el SHA completo del commit con el que debe coincidir la cabecera del pull request. Si la cabecera ha cambiado, la fusión se rechaza conABORTED(HTTP 409 Conflict) y no se fusiona nada; un valor que no sea un SHA de commit completo se rechaza conInvalidArgument(HTTP 400). Omítelo para fusionar independientemente de cuál sea la cabecera actual. - Añadido. Las referencias de propietario incluyen una cadena
type(teamouser), que se omite cuando Origin no puede resolverla. Se devuelve siempre que aparece unownero untargetde instalación, por ejemplo en Get Repo, List Repos, List App Installations y en la referencia de repositorio de las respuestas de checks y pull requests.
- Cambio incompatible. Listar etiquetas de pull requests devuelve todas las etiquetas asignadas en una sola respuesta y ya no usa paginación: se eliminaron los parámetros de consulta
pageSizeypageTokeny el campo de respuestanextPageToken. Migración: quitapageSizeypageTokende la solicitud y lee el conjunto completo enlabels. - Cambio incompatible. Un pull request admite como máximo 100 etiquetas, y Añadir etiquetas de pull requests y Establecer etiquetas de pull requests rechazan con
FailedPrecondition(HTTP 400) cualquier escritura que supere ese límite. Migración: mantén cada pull request en 100 etiquetas o menos y elimina etiquetas antes de añadir otras nuevas. - Añadido. Los pull requests incluyen un array
labelscon las etiquetas que tienen asignadas, ordenadas por nombre; si no hay ninguna asignada, el array está vacío. Lo devuelven Listar pull requests, Obtener pull request, Crear pull request, Actualizar pull request y Fusionar pull request, y también se incluye en los payloads de webhook del ciclo de vida de los pull requests.
- Añadido. Listar etiquetas de pull requests devuelve las etiquetas asignadas a una pull request, ordenadas por nombre:
GET /v1/origin/repos/{ownerSlug}/{repoName}/pulls/{pullNumber}/labels. Requiererepository:pull_requests:read. Los resultados están paginados, con 30 etiquetas por página de forma predeterminada y un máximo de 100 por página. - Añadido. Añadir etiquetas a pull requests asigna etiquetas existentes del repositorio a una pull request sin quitar las que ya tiene:
POST /v1/origin/repos/{ownerSlug}/{repoName}/pulls/{pullNumber}/labels. Todos los endpoints de escritura de etiquetas requierenrepository:pull_requests:write. - Añadido. Establecer etiquetas de pull requests reemplaza todas las etiquetas de una pull request por los nombres que envíes; si envías una lista vacía, se eliminan todas:
PUT /v1/origin/repos/{ownerSlug}/{repoName}/pulls/{pullNumber}/labels. - Añadido. Eliminar etiqueta de pull request elimina una etiqueta por su nombre y devuelve las etiquetas que quedan en la pull request:
DELETE /v1/origin/repos/{ownerSlug}/{repoName}/pulls/{pullNumber}/labels/{labelName}. - Añadido. Eliminar todas las etiquetas de pull request quita todas las etiquetas de una pull request y devuelve
204:DELETE /v1/origin/repos/{ownerSlug}/{repoName}/pulls/{pullNumber}/labels. - Añadido. Las entradas de etiqueta incluyen
id,name,color(un valor hexadecimal de seis caracteres sin#inicial) y unadescriptionopcional. Todos los endpoints de etiquetas de pull requests las devuelven. - Cambiado. El presupuesto del límite de uso del JWT de aplicación pasa de 600 a 6000 puntos por minuto, y Crear token de acceso de instalación cuesta 1 punto en lugar de 5, por lo que una aplicación puede emitir unos 100 tokens de acceso de instalación por segundo.
- Cambiado. Los requisitos de propietario para Crear repositorio y para hacer push mediante Git por HTTPS ahora admiten los planes Pro Student y Start, además de Pro, Pro+ y Ultra. Los requisitos para equipos propietarios no cambian.
- Cambiado. Los slugs de propietario y los nombres de repositorio en las rutas de repositorio se resuelven sin distinguir entre mayúsculas y minúsculas, y las respuestas devuelven las mayúsculas y minúsculas almacenadas en lugar de las que enviaste. Crear repositorio rechaza cualquier nombre que solo se diferencie en mayúsculas o minúsculas de otro que ya tenga el propietario, así que compara los nombres de repositorio sin distinguir entre mayúsculas y minúsculas.
- Cambio incompatible. Git por HTTPS rechaza un push con
403cuando el propietario del repositorio no está habilitado para escribir en Origin. Si el propietario es un usuario, debe tener un plan Pro, Pro+ o Ultra; si es un equipo, debe tener un plan de equipo de pago activo, no debe usar el modo de privacidad (heredado) y un administrador de equipo no debe haber desactivado Origin. Las operaciones clone, fetch y pull no se ven afectadas. Migración: trata el403en un push como un error de habilitación del propietario que no se soluciona con un reintento, y confirma el plan del propietario antes de hacer push en su nombre. - Modificado. El primer push a un repositorio creado con Crear repositorio reasigna
defaultBranchcuando ese push solo crea ramas y ninguna de ellas es la predeterminada almacenada: Origin elige la rama creada o, si el push crea varias y una de ellas se llamamainomaster, elige esa. Consulta el valor actual en Get Repo.
- Cambio incompatible. Crear repositorio rechaza las solicitudes cuyo propietario no cumple los requisitos para escribir en Origin y devuelve
FailedPrecondition(HTTP 400). Si el propietario es un usuario, debe tener un plan Pro, Pro+ o Ultra; si es un equipo, debe tener un plan de equipo de pago activo, no debe usar el modo de privacidad (heredado) y un administrador de equipo no debe haber desactivado Origin. Migración: trata el error400de Crear repositorio como un fallo de requisitos del propietario que no se resuelve con un reintento, y confirma el plan del propietario antes de crear repositorios en su nombre.
- Cambio incompatible. Las aplicaciones perdieron el acceso a los repositorios que Origin replica desde GitHub. Esos repositorios ya no aparecen en Listar repositorios de la instalación de la aplicación, Crear token de acceso de instalación los rechaza en
repositoryIdsy cualquier solicitud que haga referencia a uno de ellos devuelve403, tanto en la API REST como en Git por HTTPS. Migración: obtén los repositorios desde Listar repositorios de la instalación de la aplicación en lugar de usar una lista de repositorios almacenada, y lee los repositorios procedentes de GitHub directamente desde GitHub, no desde la API de Origin. - Cambio incompatible. Origin dejó de enviar webhooks para los repositorios que replica desde GitHub, y los payloads de eventos de instalación ya no incluyen esos repositorios en sus arrays de repositorios seleccionados ni en
repositoriesCount. Migración: obtén los eventos de los repositorios procedentes de GitHub directamente desde GitHub y considera el array de repositorios del payload de instalación como el conjunto de repositorios a los que tu aplicación puede acceder.
- Cambio. Los parámetros de revisión aceptan la referencia simbólica
HEAD, además de un SHA, una rama o una etiqueta:shaen List Commits, Get Commit, List Commit Files, Get Git Commit y Get Tree;refen Get Contents y Batch Get Contents; y cualquiera de los dos lados debaseheaden Compare Commits. - Cambio. Get Git Ref resuelve la referencia simbólica
HEADy la devuelve comoref: "HEAD"junto con el commit de la punta. List Matching Git Refs y List Matching Git Refs by Path solo coinciden conHEADde forma exacta, ya que no se encuentra bajorefs/. - Cambio. Al quitar una instalación o eliminar la aplicación, los tokens de acceso de esa instalación se invalidan antes de
expiresAt. La API REST y Git por HTTPS rechazan los tokens revocados con401, por lo que es necesario volver a instalar la aplicación para que pueda emitir uno válido. Consulta Token de acceso de instalación.
- Cambio incompatible. Get Contents rechaza los archivos de más de 1 MiB (decodificados) con
FailedPrecondition(HTTP 400), y basta un solo archivo que supere ese tamaño para que falle toda la solicitud de Batch Get Contents. - Añadido. Los tokens de acceso de instalación permiten autenticarse en Git por HTTPS. Usa el token como contraseña de HTTP Basic con el nombre de usuario
x-access-tokenen elcloneUrldel repositorio. Clonar, hacer fetch y hacer pull requierenrepository:contents:read; hacer push requiererepository:contents:write. Consulta Autenticación de Git por HTTPS. - Modificado.
cloneUrlusa ahora la ruta raíz con estructura de GitHub (https://origin.cursor.com/OWNER_SLUG/REPO_NAME.git) en lugar de la ruta heredada/git/en List Repos, Get Repo, Crear repositorio, Listar repositorios de la instalación de la aplicación y el payload del webhookrepository.created. Ambas formas permiten clonar ycloneUrlno garantiza ninguna estructura de ruta concreta, así que los valores almacenados siguen funcionando. - Modificado.
sizeen las respuestas de Get Contents y Batch Get Contents indica el tamaño del contenido decodificado en bytes, no la longitud de la cadenacontenten base64.
- Cambio incompatible. Los payloads de webhook de revisores incluyen un ID externo estable en
reviewer.id: el ID de usuario codificado (user_…, el mismo formato que en la API de organización) cuandokindesuser, en lugar del ID de autenticación con scope del proveedor; los revisores de grupo conservan el public id del grupo (grp_…). Afecta apull_request.reviewer.added,pull_request.reviewer.removedypull_request.reviewer.rerequested. Migración: identifica a los revisores de tipo usuario por el ID codificadouser_…en todos los puntos en los que tu integración comparabareviewer.idcon los ID de autenticación almacenados. - Añadido. Las aplicaciones pueden tener hasta 10 claves de firma Ed25519 activas, y la verificación del JWT de aplicación acepta tokens firmados con cualquiera de ellas.
- Añadido. Sincronizar réplica sincroniza una ref de un repositorio replicado desde su origen:
POST /v1/origin/repos/{ownerSlug}/{repoName}:syncMirror. Requiererepository:contents:ready devuelve200cuando se alcanza el objetivo de sincronización o202mientras la sincronización está pendiente. - Añadido. Las redirecciones posteriores a la instalación incluyen un parámetro de consulta
installation_receipt: un JWT firmado por Origin, válido durante cinco minutos, que identifica la instalación en su afirmaciónsuby devuelve elstatedel editor como afirmación. Verifícalo con el JWKS publicado antes de confiar en el callback. Consulta Recibo de instalación. - Eliminado. Los objetos de actor de Origin ya no incluyen los campos de nivel superior
kindeid, con lo que se completa la retirada anunciada el 5 de agosto de 2026. Afecta a todos los camposactor,authorydismissedByde las respuestas de checks, commits y pull requests. Migración: lee la varianteuser,apposerviceAccountdefinida en el actor.
- Añadido. Obtener límite de uso devuelve el presupuesto compartido de puntos por minuto del principal autenticado sin consumir puntos:
GET /v1/origin/rate_limit. Consulta Límites de uso.
- En desuso.
OriginActor.kindyOriginActor.id. La identidad del actor es una unión discriminada de las variantesuser,appyserviceAccount. Migración: lee los campos de la variante seleccionada en lugar de los camposkindeidde nivel superior.