API Origin
O Origin está em Beta inicial e sujeito a alterações. Consulte a especificação OpenAPI ao atualizar uma integração.
Origin é a plataforma de desenvolvimento de código do Cherri Code. Sua API REST pública permite que apps e ferramentas trabalhem com repositórios, commits, verificações, pull requests e instalações de apps do Origin.
- Os Apps Origin são autenticados com JWTs de app e tokens de acesso da instalação. Consulte Autenticação.
- Consulte a especificação OpenAPI completa para ver schemas e exemplos detalhados.
- Agentes podem carregar o índice llms.txt ou a referência completa em Markdown em llms-full.txt.
Visão geral
Os apps do Origin usam um modelo de consentimento de instalação semelhante ao OAuth e de autenticação semelhante ao de um app do GitHub:
- O app assina um JWT EdDSA de curta duração com sua chave privada Ed25519.
- O app troca esse JWT e um ID de instalação por um token de acesso da instalação de curta duração (
oit_…). - O token de instalação chama APIs de repositório e autentica o Git via HTTPS dentro dos repositórios e escopos aprovados para a instalação.
- O Origin envia entregas de webhook assinadas para o URL de webhook registrado do app.
URL base
https://api.cursor.com/v1/originOs caminhos dos endpoints na referência incluem o prefixo completo /v1/origin.
Convenções de protocolo
Solicitações e respostas usam application/json. Os nomes dos campos JSON usam camelCase. Os registros de data e hora são strings RFC 3339. Inteiros Protobuf de 64 bits, incluindo números de pull request e de versão, são codificados como strings JSON.
As respostas incluem os campos que estão em seu valor padrão em vez de descartá-los, portanto um boolean false, um number 0, uma string vazia e uma matriz vazia aparecem todos no corpo. Leia o próprio valor em vez de tratar uma chave ausente como o padrão. Campos documentados como ausentes ou omitidos são opcionais no contrato e ficam fora do corpo quando não estão definidos.
Prévia
Parte da API é publicada em prévia. Ela aparece nesta referência e na especificação, mas sua estrutura pode mudar antes da disponibilidade geral. A especificação OpenAPI a marca com x-cursor-visibility: PREVIEW. O marcador pode estar em uma operação, um parâmetro, um schema ou um único campo, então uma operação estável pode, mesmo assim, retornar um campo em prévia. Endpoints em prévia exibem um badge Prévia nesta referência. Trate campos em prévia como opcionais e não crie uma dependência rígida da estrutura deles.
Primeiros passos
Acesso ao Origin
- Acesse o Origin em cursor.com/codebase.
- Gerencie as configurações do app em cursor.com/codebase/settings/apps.
- Gere uma chave de assinatura do app e registre apenas a chave pública.
CLI do Origin
Instale a CLI do Origin e faça login:
curl -fsSL https://downloads.cursor.com/origin/install.sh | shorigin auth loginClone um repositório existente:
origin repo clone '{ownerSlug}/{repoName}'# ou use o git diretamentegit clone 'https://origin.cursor.com/{ownerSlug}/{repoName}.git'Os apps clonam usando a autenticação do Git via HTTPS com um token de acesso de instalação, e não um login de usuário.
Instalação
Envie o administrador do espaço de trabalho do cliente para:
/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 | Obrigatório | Descrição |
|---|---|---|
client_id | Sim | ID do app Origin. |
scope | Sim | Escopos separados por espaços. repository:metadata:read é adicionado automaticamente. |
redirect_uri | Sim para instalações iniciadas pelo parceiro | URI exata de callback registrada. |
state | Altamente recomendado | Valor aleatório antifalsificação reproduzido como a declaração state do recibo de instalação. Gere-o antes de redirecionar e verifique a declaração no callback. |
summary | Não | Breve explicação exibida durante o consentimento. |
include_granted_scopes | Não | Quando true, mantém as permissões existentes e solicita apenas adições. |
O administrador do espaço de trabalho escolhe o proprietário de destino, os escopos aprovados e todos os repositórios ou apenas os selecionados. O cliente, e não o app, controla o acesso ao repositório.
Após a aprovação, o Origin redireciona para o callback registrado:
https://ci.example.com/origin/callback?installation_receipt=RECEIPT_JWTVerifique o recibo de instalação e armazene o ID da instalação presente na declaração sub. Você precisará dele sempre que emitir um token de acesso da instalação.
As instalações usam um de dois modos de seleção de repositórios:
all: a instalação pode acessar todos os repositórios pertencentes ao destino selecionado.selected: a instalação pode acessar apenas os repositórios selecionados pelo administrador do espaço de trabalho.
Ambos os modos abrangem repositórios espelhados e repositórios Origin nativos, portanto um espelho aparece em GET /installation/repos e pode ser selecionado. Um espelho é somente leitura até se tornar um espelho de saída estável: consulte Repositórios espelhados.
Use GET /installation/repos com um token de instalação para descobrir os repositórios disponíveis para ela. Os endpoints JWT do app podem listar, inspecionar e excluir as instalações do app. Excluir uma instalação impede a emissão de novos tokens.
Recibo de instalação
installation_receipt é um JWT compacto de curta duração assinado pela Origin. Ele comprova que a aprovação da instalação veio da Origin, e não de um redirecionamento forjado, e contém tudo de que o callback precisa. O Cherri Code não redireciona sem ele; portanto, callbacks externos sempre o incluem.
Cabeçalho JOSE:
{ "alg": "EdDSA", "kid": "origin-key-id", "typ": "origin-installation-receipt+jwt"}Declarações:
{ "iss": "https://api.cursor.com/v1/origin", "aud": "app_01...", "sub": "i_01...", "namespace_id": "ns_01...", "iat": 1786465200, "exp": 1786465500, "jti": "RECEIPT_UUID", "installedBy": { "id": "user_01...", "email": "[email protected]", "displayName": "Jane Doe" }, "state": "ORIGINAL_VALUE"}audé o ID do seu app, esubé o ID da instalação a ser usado ao emitir tokens de acesso da instalação.namespace_idé o ID estável do namespace no qual o app foi instalado.installedByidentifica o usuário que realizou esta instalação ou novo consentimento. Ele descreve a ação atual; portanto, em um novo consentimento, pode ser diferente doinstalledBydurável em Get App Installation. Ele incluidisplayNamequando a conta tem um nome e nunca incluihandle; em vez disso, leia o handle de uma resposta REST ou de um payload de webhook.- Os recibos expiram cinco minutos após a emissão.
jtié único para cada recibo. statesó está presente quando a URL de instalação contém umstatenão vazio e reproduz esse valor. Compare-o ao valor antifalsificação que você gerou antes de redirecionar.
Verifique o recibo antes de confiar no callback: obtenha a chave de assinatura no JWKS pelo cabeçalho kid, exija alg EdDSA e typ origin-installation-receipt+jwt e valide a assinatura, iss, aud e exp. Rejeite o callback se a verificação falhar.
O recibo não é um token de acesso da instalação. Nunca o envie como credencial Bearer; emita tokens de instalação por meio de Criar token de acesso da instalação.
Autenticação
Envie credenciais REST com o esquema Bearer. Os badges Auth de cada endpoint listam os tipos de credencial que ele aceita:
curl --request GET \ --url https://api.cursor.com/v1/origin/repos/OWNER_SLUG/REPO_NAME \ --header "Authorization: Bearer $ORIGIN_BEARER_TOKEN"As API keys do Cherri Code não são tokens Bearer do Origin. Para requests autenticadas por usuário, use a CLI do Origin, que troca uma chave de API de usuário pessoal pelo access token de curta duração que o Origin aceita. Não coloque uma API key do Cherri Code diretamente no header Authorization.
Gere uma chave de assinatura do app
Os Apps Origin se autenticam com um par de chaves Ed25519. Gere o par localmente e registre apenas a chave pública em cursor.com/codebase/settings/apps. Um app pode ter até 10 chaves de assinatura ativas.
A chave privada deve permanecer secreta. Não faça upload dela, não a cole nas configurações do app, não faça commit dela em um repositório nem a compartilhe. Armazene-a em um gerenciador de segredos. O Cherri Code armazena apenas a chave pública.
Crie uma chave privada PKCS#8 e uma chave pública PEM SPKI com o OpenSSL:
openssl genpkey -algorithm ED25519 -out origin-app-private.pemopenssl pkey -in origin-app-private.pem -pubout -out origin-app-public.pemO arquivo de chave pública começa com -----BEGIN PUBLIC KEY-----. Cole esse PEM ao adicionar uma chave de assinatura. Use a chave privada correspondente apenas para assinar JWTs de app.
JWT do app
Assine um JWT de curta duração usando a chave privada Ed25519 associada a uma das chaves de assinatura ativas do app. Gere esse par conforme descrito em Gerar uma chave de assinatura do app.
Cabeçalho JOSE:
{ "alg": "EdDSA", "kid": "app_01...", "typ": "JWT"}Declarações:
{ "iss": "app_01...", "aud": "origin-apps", "iat": 1782928800, "exp": 1782929100}Defina iss e kid como o ID do app. Use uma validade de aproximadamente cinco minutos.
Authorization: Bearer APP_JWTUse um JWT de app para operações no nível do app, como ler metadados do app, gerenciar instalações, emitir tokens de instalação e recuperar entregas de webhooks.
Token de acesso da instalação
Faça uma chamada a POST /app/installations/{installationId}/access_tokens com um JWT do app. Os tokens de acesso da instalação começam com oit_.
Authorization: Bearer oit_...A resposta inclui expiresAt. Emita tokens conforme necessário, renove-os antes da expiração, trate-os como senhas e nunca os registre em logs.
Um token expira no máximo 15 minutos após a criação, e nunca depois do JWT do app que o solicitou, então o JWT de cinco minutos recomendado acima gera um token de no máximo cinco minutos. Leia expiresAt e emita um novo token quando esse horário passar, em vez de presumir uma duração: os tokens do Origin têm vida mais curta que os tokens de acesso da instalação do GitHub App, e uma integração que reutiliza um token seguindo a periodicidade do GitHub falha assim que o token expira. Assine o JWT com um exp mais longo quando um job precisar dos 15 minutos completos, como faz a receita de CI do CloneKit.
Remover a instalação ou excluir o app invalida seus tokens de acesso da instalação antes de expiresAt. A API REST e o Git via HTTPS rejeitam o token com 401. Não tente novamente com o mesmo token; o app deve ser reinstalado antes de poder emitir um token funcional.
Um token de acesso da instalação não pode exceder os escopos aprovados nem o acesso ao repositório da instalação. Você pode restringir um token a menos scopes ou repositoryIds. Matrizes vazias ou omitidas herdam a concessão completa da instalação.
Use tokens de acesso da instalação para operações com escopo de repositório, incluindo pull requests, gravações de check runs e Git via HTTPS.
Para agir como membro do namespace da instalação em vez de como o app, emita um token de usuário da instalação. Consulte Agindo em nome de usuários.
Autenticação do Git via HTTPS
Tokens de acesso da instalação autenticam o Git via HTTPS. O endpoint do Git usa autenticação HTTP Basic: a senha é o token de instalação, e o nome de usuário é x-access-token. As credenciais Bearer devem ser usadas na API REST; o Git via HTTPS as rejeita.
Emita um token em Criar token de acesso da instalação imediatamente antes da operação do Git. Os tokens expiram em até 15 minutos.
Clone, consultar e pull exigem repository:contents:read. Push exige repository:contents:write. O token deve incluir o repositório de destino em sua concessão.
O push também exige que o proprietário do repositório tenha permissão de gravação no Origin, o mesmo requisito exigido por Criar repositório. Se o proprietário for um usuário, ele deverá estar em um plano Pro, Pro Student, Pro+, Ultra ou Start. Se o proprietário for uma equipe, ela deverá ter um plano de equipe pago ativo, não estar no Privacy Mode (Legado) e não ter o Origin desativado por um administrador da equipe. Um push para um repositório cujo proprietário não seja elegível retorna 403. Clone, consultar e pull não têm esse requisito.
Consulte cloneUrl em Obter repositório ou List App Installation Repositories. Tanto o caminho no formato do GitHub (https://origin.cursor.com/OWNER_SLUG/REPO_NAME.git) quanto o caminho legado /git/ permitem clonar.
git clone "https://x-access-token:${INSTALLATION_TOKEN}@origin.cursor.com/OWNER_SLUG/REPO_NAME.git"Incluir o token na URL faz com que ele seja armazenado em .git/config. Após clonar o repositório com sucesso, reescreva o remoto para que comandos posteriores não reutilizem um segredo expirado:
git remote set-url origin "https://origin.cursor.com/OWNER_SLUG/REPO_NAME.git"Para não incluir o token na URL remota, forneça-o pelo auxiliar de credenciais do 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"O auxiliar de credenciais da CLI do Origin é destinado ao login de usuários. As integrações de apps enviam o token de instalação, como mostrado aqui. Trate o token como uma senha, nunca o registre em logs e emita um novo antes de expiresAt se um job ainda precisar de acesso ao Git.
O Git via HTTPS tem seu próprio orçamento, separado do orçamento da REST em Limites de taxa. Uma resposta do Git cobrada inclui os mesmos cabeçalhos X-RateLimit-Limit, X-RateLimit-Remaining e X-RateLimit-Used, com X-RateLimit-Resource definido como git em vez de core. Solicitações do Git que excedem o orçamento retornam 429 com Retry-After e X-RateLimit-Reset. Leia os cabeçalhos para controlar o ritmo de um job, em vez de presumir um número; solicitações não tarifadas não incluem cabeçalhos de limite de taxa.
Em um repositório espelhado, um token de instalação permite clonar, consultar e fazer pull, e o Origin rejeita git push com 403 até que o espelho se torne um espelho de saída estável. Consulte Repositórios espelhados.
Solicitações da CLI autenticadas pelo usuário
Use origin api para solicitações autenticadas pelo usuário. Para uma sessão interativa, faça login pelo navegador:
origin auth loginorigin api /repos/OWNER_SLUG/REPO_NAME/pullsPara uma sessão não interativa, forneça uma chave de API de usuário pessoal em Cherri Code Dashboard → API Keys:
export CURSOR_API_KEY="YOUR_PERSONAL_USER_API_KEY"origin api /repos/OWNER_SLUG/REPO_NAME/pullsA CLI troca a personal API key por um user access token de curta duração e envia esse token no header Authorization. Não envie a própria API key para um endpoint do Origin. integrações de apps devem usar JWTs dos apps e tokens de acesso da instalação.
Descoberta e chaves de assinatura
O Origin disponibiliza metadados de descoberta não autenticados e suas chaves de assinatura ativas. As mesmas chaves assinam entregas de webhook e recibos de instalação.
Os metadados de descoberta identificam o emissor e o 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 retorna JWKs Ed25519 ativos:
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" } ]}Mantenha o JWKS em cache. /keys envia Cache-Control: public, max-age=600, stale-if-error=600; reutilize uma resposta em cache por 10 minutos e depois atualize-a. Se a atualização falhar, mantenha as últimas chaves válidas por no máximo mais 10 minutos antes de a verificação falhar. Atualize também quando uma assinatura não for verificada por nenhuma chave, o que remove um ID de chave desativado. As chaves são rotacionadas semanalmente.
As assinaturas de webhook não incluem um ID de chave, portanto a verificação deve tentar cada chave Ed25519 ativa. Os recibos de instalação incluem o kid da chave de assinatura no cabeçalho JOSE, portanto a verificação dos recibos pode localizar a chave diretamente.
Escopos
Solicite apenas os escopos mínimos necessários para seu app. repository:metadata:read e o acesso aos metadados do app ou da instalação são concedidos automaticamente e não devem ser adicionados separadamente às URLs de instalação.
| Escopo | Permite |
|---|---|
repository:metadata:read | Ler metadados do repositório. Adicionado automaticamente. |
repository:contents:read | Ler commits, branches, conteúdos, arquivos de comparação e objetos Git de baixo nível. Pesquisar o texto de arquivos. Baixar um arquivo compactado do repositório. Clonar, consultar e fazer pull por Git via HTTPS. Sincronizar um repositório espelhado a partir de sua fonte upstream. |
repository:contents:write | Fazer push por Git via HTTPS. Mergear pull requests. Criar branches e fazer commit de alterações em arquivos pelos endpoints de dados do Git. Solicitar novamente uma execução de verificação. |
repository:pull_requests:read | Ler pull requests, arquivos alterados, commits de pull requests, rótulos atribuídos e elegibilidade para merge. |
repository:pull_requests:write | Criar e atualizar pull requests. Atribuir e remover rótulos de pull requests. |
repository:pull_requests:reviews:read | Ler comentários de pull requests, threads de comentários, revisões enviadas e revisores solicitados. |
repository:pull_requests:reviews:write | Criar e atualizar comentários; resolver e reabrir threads de comentários; criar, atualizar e descartar revisões; solicitar e remover revisores. |
repository:checks:read | Ler suítes de verificações, execuções e anotações de execução de verificação. |
repository:checks:write | Criar e atualizar suítes de verificações e execuções. Anexar anotações de execução de verificação. |
repository:labels:read | Ler as definições de rótulos que pertencem ao repositório. |
repository:labels:write | Criar, atualizar e excluir definições de rótulos do repositório. |
repository:rulesets:read | Ler conjuntos de regras do repositório. |
repository:rulesets:write | Criar, atualizar e excluir conjuntos de regras do repositório. |
repository:settings:read | Ler as concessões mantidas diretamente em um repositório. |
repository:settings:write | Atualizar configurações do repositório: a branch padrão, a visibilidade, os métodos de merge e a exclusão automática da branch de origem. Fazer upsert e excluir concessões em um repositório. |
namespace:settings:read | Ler as concessões mantidas diretamente em um proprietário. Ler as autoridades certificadoras SSH em que um proprietário confia e se ele exige certificados. |
namespace:settings:write | Fazer upsert e excluir concessões em um proprietário. Adicionar e remover autoridades certificadoras SSH e definir se o proprietário exige certificados; essas gravações são fornecidas por uma credencial de usuário do Cherri Code. |
namespace:user_tokens:write | Emitir tokens de usuário da instalação que atuam como membro do namespace da instalação. Um token não pode incluir este escopo. Consulte Atuando em nome de usuários. |
Solicitar um escopo :write também concede o escopo :read correspondente, então repository:labels:write cobre repository:labels:read e você não precisa listar os dois. O contrário não vale: um escopo de leitura nunca concede gravação.
O token de instalação só pode restringir essas concessões. Ele não pode adicionar um escopo ou repositório que o administrador do espaço de trabalho não aprovou.
Alterações de estado do espelhamento ficam fora desta tabela. Fazer transição do espelhamento do repositório, Forçar transição do espelhamento do repositório e Desvincular espelho do repositório usam repository:mirror:write ou repository:mirror:delete, que um app não pode solicitar na instalação: eles são fornecidos por uma credencial de usuário do Cherri Code, e quem chama também deve administrar o repositório na fonte upstream do espelho.
O gerenciamento de instalações também fica fora dela. Adicionar repositórios à instalação do app usa namespace:installations:write, que um app não pode solicitar na instalação: um administrador do namespace o mantém em uma credencial de usuário do Cherri Code, e o mesmo tipo de credencial que consentiu com a instalação é o que pode estendê-la.
O gerenciamento de apps fica fora dela pelo mesmo motivo. Criar app usa namespace:apps:create, Listar apps do namespace e Obter app usam namespace:apps:read, e Atualizar app, Adicionar chave de assinatura do app e Revogar chave de assinatura do app usam app:settings:write. Um publicador mantém essas concessões em uma credencial de usuário do Cursor; um app não pode solicitá-las para si mesmo.
A tabela abrange os escopos que um app solicita na instalação. Para consultar o escopo exigido por uma única operação, leia sua extensão x-origin-scopes na especificação OpenAPI. Essa extensão abrange todas as operações, incluindo os escopos app, installation e namespace, que acompanham a própria credencial, em vez de serem concedidos por uma instalação. Uma operação cujos escopos vêm todos com a credencial marca sua extensão como ambient: true: não há nada a solicitar para ela, e basta apresentar a credencial correta.
Repositórios espelhados
Uma instalação usa todos os escopos que possui em um repositório Origin nativo e em um espelho de saída estável. Em um repositório em qualquer outro estado de espelhamento, apenas dois escopos se aplicam:
repository:metadata:readrepository:contents:read
Todos os outros escopos retornam 403 nesse repositório, independentemente do que o administrador do espaço de trabalho tenha aprovado. Pela API REST, a leitura de repositórios e conteúdos, a comparação de commits e Sincronizar espelho continuam funcionando, e o Origin rejeita pull requests, revisões, comentários, verificações, conjuntos de regras e qualquer operação de gravação. Pelo Git via HTTPS, clone, consultar, pull e download de LFS continuam funcionando, e o Origin rejeita push e upload de LFS.
Tirar um repositório desse estado é uma operação que requer credenciais de usuário, e não algo que uma instalação possa fazer: Fazer transição do espelhamento do repositório avança a direção do espelho, Forçar transição do espelhamento do repositório faz a transição para a fonte upstream sem enviar referências divergentes de volta, e Desvincular espelho do repositório desconecta o espelho definitivamente.
O objeto mirror de um repositório não informa se operações de gravação são permitidas. Um espelho em transição pode informar mirror.status como outbound e ainda ser somente leitura; portanto, considere o 403 como definitivo, em vez de tomar decisões com base em mirror.status.
Limites de taxa
A API Origin usa um orçamento de pontos compartilhado por principal, redefinido em uma janela móvel de um minuto. Cada tipo de principal autenticado tem seu próprio orçamento:
| Principal | Orçamento padrão |
|---|---|
| Token de acesso da instalação | 3.000 pontos/minuto |
| JWT do app | 6.000 pontos/minuto |
| Usuário do Cherri Code ou conta de serviço | 600 pontos/minuto |
Cada endpoint consome um custo fixo desse orçamento antes da execução do manipulador. Falhas de autenticação e autorização não consomem pontos.
| Custo | Operações |
|---|---|
| 0 | Consultar limite de taxa. Apenas status; não consome pontos. |
| 1 | A maioria dos endpoints de leitura, além de Criar token de acesso da instalação |
| 5 | Operações de gravação comuns, além destas leituras mais pesadas: Consultar commit, Listar arquivos do commit, Listar arquivos da comparação, Listar arquivos do pull request, Obter tarball do repositório e Buscar conteúdos |
| 10 | Criar app, Criar repositório, Criar commit a partir de arquivos, Mergear pull request, Consultar capacidade de merge do pull request, Fazer transição do espelhamento do repositório e Forçar transição do espelhamento do repositório |
O Cherri Code pode aumentar os orçamentos por minuto de cada app para parceiros de design. Entre em contato com o Cherri Code se sua integração precisar de um limite maior.
Cabeçalhos de resposta
As respostas cobradas e Consultar limite de taxa incluem:
| Cabeçalho | Descrição |
|---|---|
X-RateLimit-Limit | Pontos disponíveis na janela atual para esta principal |
X-RateLimit-Remaining | Pontos restantes na janela atual |
X-RateLimit-Used | Pontos consumidos na janela atual |
X-RateLimit-Reset | Timestamp Unix (segundos em UTC) em que a janela é redefinida |
X-RateLimit-Resource | Sempre core para o orçamento compartilhado da API pública |
X-RateLimit-Reset informa uma janela completa de 60 segundos a partir do momento da resposta. A janela do contador começa com a primeira solicitação cobrada em uma sequência, e não no início de um minuto do calendário.
Limite excedido
Quando uma solicitação exceder o orçamento, a API retornará HTTP 429 com:
Retry-After: número de segundos a aguardar antes de tentar novamente (60)- Os mesmos cabeçalhos
X-RateLimit-*, comX-RateLimit-Remainingdefinido como0
{ "code": 8, "message": "Rate limit exceeded: 3000 points per minute for this installation. Retry after 60s.", "details": []}Aguarde Retry-After ou até X-RateLimit-Reset antes de tentar novamente. Use backoff com jitter quando chamadores simultâneos compartilham o mesmo token de instalação.
Verificar a cota restante
Chame Consultar limite de taxa para consultar o orçamento atual sem consumir pontos. O corpo da resposta reflete os cabeçalhos X-RateLimit-* do recurso compartilhado core.
Convenções gerais
Paginação
Endpoints paginados aceitam:
pageSize: o valor padrão é 30, com limite máximo de 100.pageToken: token opaco retornado pela página anterior. Não o inspecione nem o construa.
As respostas usam um campo de coleção específico do resource e nextPageToken. Ele fica vazio quando não existe uma próxima página. As respostas públicas de lista não incluem contagens totais. Os tokens de página são vinculados ao resource de origem e aos filtros. Reinicie a paginação quando os filtros forem alterados. Tokens não vazios inválidos ou incompatíveis retornam 400.
Envie o mesmo pageSize em todas as solicitações de uma sequência, incluindo as continuações. Na maioria dos endpoints de listagem, um pageSize enviado com um token de página se aplica a essa página, e o tamanho de página anterior é mantido quando ele é omitido; as entradas de pageToken desses endpoints indicam isso. Nos demais, o que um token de página guarda varia, portanto um pageSize constante garante o mesmo tamanho de página em todos os endpoints.
Erros
Os erros usam um corpo no estilo RPC do Google:
{ "code": 5, "message": "resource not found", "details": []}Os status HTTP mais comuns são 400, 401, 403, 404, 429, 500 e 503. Algumas operações do banco de dados do Git também retornam 409 em caso de conflitos no estado do repositório. Consulte Limites de taxa para ver os cabeçalhos e o comportamento de nova tentativa de 429.
Use o status HTTP e o code para diferenciar os erros. Trate message como texto voltado para desenvolvedores.
Um 404 nunca diferencia um recurso que não existe de um ao qual seu app não consegue acessar. Interprete-o como "não disponível para esta instalação", em vez de considerá-lo uma prova de que o recurso está ausente.
details contém entradas tipadas: violações de campo google.rpc.BadRequest em caso de argumento inválido e uma entrada google.rpc.RequestInfo em todos os erros. Origin pode adicionar tipos de detalhe a qualquer momento; portanto, ignore entradas que sua integração não reconhece.
Cada resposta de erro inclui o ID da solicitação duas vezes: em um cabeçalho de resposta X-Request-ID e como uma entrada google.rpc.RequestInfo em details. Origin repete o x-request-id que você enviou ou gera um quando você não envia nenhum. A entrada RequestInfo está presente mesmo quando message é um erro interno opaco; portanto, informe o ID da solicitação ao entrar em contato com o Cherri Code sobre uma chamada com falha.
Caminhos sem correspondência em /v1/origin e solicitações que usam o método incorreto em um caminho conhecido retornam esse mesmo corpo em vez de um erro genérico do roteador. A mensagem informa o método e o caminho e nunca repete a string de consulta.
IDs
Os IDs de resource são strings opacas com um prefixo de tipo, como app_… para um app e i_… para uma instalação. Armazene e compare esses IDs como strings completas. Não faça parsing deles, não tente extrair significado dos seus caracteres nem dependa da ordem de classificação deles.
Um ID permanece o mesmo durante toda a vida útil do seu resource, enquanto nomes e slugs podem mudar. Um repositório mantém o mesmo ID mesmo quando é renomeado. Por isso, use o ID como chave dos dados em cache, em vez de {ownerSlug}/{repoName}, e referencie o repositório pelo ID, conforme descrito em Caminhos de repositório.
Caminhos de repositório
Caminhos no escopo do repositório usam o slug do proprietário e o nome do repositório no formato {ownerSlug}/{repoName}. Ambos os segmentos são resolvidos sem distinção entre maiúsculas e minúsculas, portanto qualquer combinação de maiúsculas e minúsculas acessa o repositório. As respostas retornam o nome e o slug armazenados, em vez da capitalização enviada, e as URLs Git HTTPS são resolvidas da mesma forma. Compare nomes de repositórios sem distinguir maiúsculas de minúsculas e consulte a capitalização canônica em Obter repositório.
Todo caminho no escopo do repositório também aceita o ID estável do repositório no lugar do par: envie _ como o slug do proprietário e o ID como o nome do repositório, como em GET /v1/origin/repos/_/REPO_ID. Consulte o ID no campo id em Obter repositório. O marcador _ não pode ser usado como slug de proprietário, portanto as duas formas nunca entram em conflito. Em uma solicitação Connect ou JSON, defina ownerSlug como _ e name como o ID.
A forma com ID permanece válida após uma renomeação, o que a torna uma forma estável de identificar um repositório. Ela não concede nada por si só: depois que o Origin resolve o ID para um repositório, seu app ainda precisa ter o mesmo escopo nesse repositório. Um ID ao qual seu app não consegue acessar retorna o mesmo corpo 404 de um ID inexistente, portanto uma resposta nunca confirma a existência de um repositório. Um ID malformado retorna 400. Create Repo aceita apenas um slug de proprietário e rejeita _.
Referências de recursos
Os snapshots de recursos contêm os campos atuais do recurso. O contexto do contêiner usa referências compactas em vez de duplicar recursos completos:
RepositoryReferenceidentifica um repositório.PullRequestReferenceidentifica uma pull request e inclui a referência ao repositório.ThreadReferenceidentifica a thread que contém um comentário de pull request.OriginActoridentifica um ator público comouser,appouserviceAccount. Exatamente uma variante está presente; leia a identidade dessa variante.
Execuções de verificação
Os Apps relatam resultados de CI como suítes de verificações e execuções de verificação associadas a um commit por meio de Post Check Run e Batch Upsert Check Runs, e os consultam de volta pelos endpoints de Checks. Esta seção define os termos comuns a esses endpoints: qual tentativa é a atual, como o Origin ordena e relata gravações e como se comportam timestamps e prazos.
Tentativas e a tentativa atual
Cada (actor, key, externalId) relatado em um commit é uma tentativa de suíte, e cada (suite, key, externalId) dentro dela é uma tentativa de execução. Reutilizar um externalId atualiza essa tentativa no próprio lugar; um novo externalId inicia uma nova tentativa e mantém a anterior como histórico. Tentativas substituídas continuam acessíveis para leitura por id em Obter suíte de verificações e Obter execução de verificação.
Onde a API mostra as verificações atuais de um commit — em Listar suítes de verificações de um commit, Listar execuções de verificação de um commit e no estado de CI e nas verificações obrigatórias do pull request —, o Origin consolida as tentativas em duas etapas:
- A tentativa de suíte atual por
(actor, key)é aquela cujas execuções atuais, conforme selecionadas pela segunda etapa, têm oexternalUpdatedAtmais recente; uma suíte sem execuções é classificada por seucreatedAt. Empates são resolvidos pelocreatedAtda suíte e depois por seuid, do mais recente para o mais antigo. - Dentro dessa tentativa de suíte, a execução atual de uma
keyé a que tem oexternalUpdatedAtmais recente. Empates são resolvidos porcreatedAte depois porid, do mais recente para o mais antigo.
Listar execuções de verificação de uma suíte aplica a segunda etapa à suíte que você indicar. Uma execução só é a atual do commit quando sua suíte é a tentativa de suíte atual desse commit. Como a primeira etapa classifica tentativas de suíte inteiras, uma execução publicada sob uma tentativa de suíte substituída fica fora das verificações do commit enquanto outra tentativa mantiver um externalUpdatedAt mais recente; assim que seu timestamp passar a ser o mais recente, sua tentativa de suíte se torna a atual e passam a ficar ocultas as execuções da outra tentativa.
Uma tentativa cancelada não substitui uma que passou. Em qualquer uma das etapas, uma tentativa cancelada fica abaixo das outras tentativas de sua key quando a tentativa mais recente dessa key que não foi cancelada passou. Uma execução passou quando está completed com a conclusão success, neutral ou skipped. Uma tentativa de suíte passou quando todas as suas execuções atuais passaram e é considerada cancelada quando todas as suas execuções atuais estão completed, pelo menos uma com a conclusão cancelled e as demais tendo passado. Quando a reexecução da tentativa que passou é solicitada, as tentativas canceladas cujo externalUpdatedAt é igual ou posterior à solicitação voltam a ser classificadas por seus timestamps. Uma tentativa de suíte cancelada mais recente ainda substitui uma mais antiga que não passou por completo.
Uma execução cuja reexecução foi solicitada mantém seu lugar como a tentativa atual de sua key e aparece como pendente até que o app responsável responda: veja Solicitar novamente a execução de verificação.
Ordenação de gravações
O Origin ordena os posts destinados a uma mesma execução — ou seja, o mesmo externalId e key dentro da suíte — por checkRun.externalUpdatedAt, com precisão de milissegundos. Um post só é aplicado quando seu valor é igual ou posterior ao externalUpdatedAt armazenado da execução, elevado a rerequestedAt enquanto houver uma nova solicitação pendente. Valores iguais são aplicados, então o post mais recente prevalece, com duas exceções que também são tratadas como obsoletas: um post queued ou in_progress não pode reabrir uma execução completed no mesmo timestamp, e um post exatamente no timestamp armazenado é ignorado enquanto rerequestedAt estiver definido. Um valor mais recente é aplicado, inclusive para reabrir uma execução completed, com uma exceção tratada como obsoleta independentemente do timestamp: um post completed com conclusão cancelled não pode substituir uma execução completed cuja conclusão seja success, neutral ou skipped.
Um post obsoleto ainda assim é bem-sucedido. A resposta é HTTP 200 com a suíte e a execução armazenadas, e não com os valores enviados, e o updatedAt da execução não avança. Cada execução enviada retorna como um par: checkRun, a execução armazenada após a chamada, e outcome, o que a gravação fez com ela. Post execução de verificação retorna o par no nível superior da resposta, ao lado de checkSuite. Batch Upsert execuções de verificação retorna um par por execução enviada em results[], na ordem da solicitação, de modo que um elemento do batch carrega o mesmo resultado por execução que a chamada única traz inline. Leia outcome, ou cada results[].outcome, para saber o que a gravação fez:
outcome | Significado |
|---|---|
created | Não existia execução para (externalId, key) na suíte; uma foi criada. |
updated | Uma execução existente foi substituída pelos valores enviados. |
unchanged | Os valores enviados, incluindo externalUpdatedAt, são iguais aos da execução armazenada; nada foi gravado. |
ignored_stale | O post foi ignorado por estar obsoleto; checkRun carrega a execução armazenada, não os valores enviados. |
O updatedAt não avança em um post unchanged nem em um ignored_stale, portanto não serve para distinguir um do outro; somente outcome serve. Trate um valor não reconhecido como "a execução armazenada está na resposta; não se sabe se houve gravação". Em um batch, o Origin aplica a regra a cada execução separadamente: uma execução obsoleta não faz o batch falhar, e results[] traz a execução armazenada na posição correspondente, com outcome ignored_stale.
Em Batch Upsert execuções de verificação, o checkRuns[] de nível superior está descontinuado em favor de results[]. Ele continua sendo preenchido com as mesmas execuções armazenadas, na mesma ordem, mas não carrega outcomes; leia results[] em vez dele. Isso se aplica apenas ao batch: em Post execução de verificação, checkRun e outcome são os campos de nível superior a serem lidos.
Timestamps e prazos
Um post cujo externalUpdatedAt, startedAt ou completedAt esteja mais de 60 segundos no futuro retorna InvalidArgument (HTTP 400). completedAt não pode ser anterior a startedAt quando ambos estão no mesmo post. deadlineAt não pode estar mais de 24 horas no futuro.
Somente um run in_progress expira. Depois que seu deadlineAt passa, uma varredura periódica o conclui com a conclusão timed_out, define completedAt caso o run ainda não tenha um, limpa deadlineAt e entrega repository.check_run.completed. A expiração ocorre alguns minutos depois do prazo, e não exatamente nele: por padrão, a varredura roda mais ou menos a cada 30 minutos, uma configuração operacional que pode mudar, portanto não dependa desse intervalo. Um run queued nunca expira, assim como um run sem deadlineAt. Um post completed limpa o prazo. O Origin não altera externalUpdatedAt ao expirar um run, de modo que um post posterior com um externalUpdatedAt mais recente ainda se aplica a um run expirado.
Limitações atuais
- A listagem de repositórios em todo o namespace e a criação de repositórios não fazem parte da API de parceiros. Descubra os repositórios pela instalação.
- A comparação de commits retorna dados de resumo, e não uma lista de commits incorporada. Os arquivos alterados têm seu próprio endpoint paginado, Listar arquivos de comparação.
- As threads podem ser acessadas apenas para resolução. Não há um endpoint que liste threads diretamente; leia-as nos comentários que contêm.
- Webhooks de push não incluem uma lista completa de commits.
- O merge de pull request oferece suporte a repositórios Origin nativos. Repositórios espelhados são rejeitados.
- Um repositório espelhado é somente leitura para uma instalação até se tornar um espelho de saída estável. Consulte Repositórios espelhados.
Checklist de implementação
- Armazene a chave privada Ed25519 em um gerenciador de segredos e rotacione as chaves de forma planejada. Veja Gerar uma chave de assinatura do app.
- Verifique o recibo de instalação em callbacks de instalação e leia o ID de instalação e
statenas claims dele. - Use JWTs de curta duração do app e emita tokens de instalação no momento necessário.
- Use tokens de instalação, não JWTs do app, para APIs com escopo de repositório, gravações de execuções de verificação e Git HTTPS.
- Solicite os escopos mínimos e o acesso mínimo ao repositório.
- Trate os tokens de página como opacos e reinicie a paginação quando os filtros mudarem.
- Mantenha os valores de
keyde verificações estáveis e legíveis. Use um novoexternalIdimutável para cada tentativa e valores crescentes deexternalUpdatedAtpara atualizações. - Leia
outcomeem cada resposta de Post Check Run e cadaresults[].outcomeem cada resposta de Batch Upsert Check Runs; um post obsoleto retorna200com a execução armazenada. Veja Execuções de verificação. - Verifique as assinaturas de webhook em relação ao corpo bruto da solicitação antes de analisá-lo.
- Elimine entregas duplicadas usando
webhook-ide processe-as de forma assíncrona após retornar2xx. - Ignore campos JSON desconhecidos para manter a compatibilidade futura.
- Respeite os cabeçalhos
Retry-AftereX-RateLimit-*. Use Consultar limite de taxa para monitorar os pontos restantes sem consumi-los.
Referência de endpoints
Baixe a especificação OpenAPI para consultar os schemas completos dos componentes. O documento declara https://api.cursor.com como seu servidor e um esquema de segurança HTTP bearer bearerAuth, e cada operação lista os códigos de resposta que ela pode retornar, além de um exemplo de solicitação e de resposta. Cada operação também traz uma extensão x-origin-scopes: scopes contém o escopo exigido pela operação e tokenTypes contém os tipos de credencial que ela aceita. Cada schema de payload de webhook traz uma extensão x-origin-webhook-events que lista os eventos que o entregam, e as superfícies em prévia trazem x-cursor-visibility: PREVIEW. Os parâmetros de caminho têm os mesmos nomes usados pelas URLs: ownerSlug e repoName. Cada operação traz um operationId único; quando uma mesma operação atende a dois formatos de URL, o id do segundo formato recebe o sufixo _2, como em OriginService_GetRepoTarball_2.
Os snippets JSON mostram valores de placeholder compatíveis com o schema. As descrições dos campos de resposta refletem o schema OpenAPI e o contrato atual da plataforma.
Apps e instalações
Consultar limite de taxa
/v1/origin/rate_limitRetorna o status atual do limite de taxa da API pública do principal autenticado.
O acesso a este endpoint não consome pontos do limite de taxa. A resposta abrange o orçamento compartilhado de pontos por minuto usado por outros endpoints da API pública desse principal. Consulte Limites de taxa.
Campos da resposta
resources object
resources.core object
resources.core.limit integer
resources.core.remaining integer
resources.core.reset integer
resources.core.used integer
rate object
resources.core. Prefira resources.core em novos clientes.curl --request GET \ --url 'https://api.cursor.com/v1/origin/rate_limit' \ --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN'Formato da resposta:
{ "resources": { "core": { "limit": 6000, "remaining": 5994, "reset": 1785682800, "used": 6 } }, "rate": { "limit": 6000, "remaining": 5994, "reset": 1785682800, "used": 6 }}Obter app autenticado
/v1/origin/appRetorna os metadados do app autenticado.
Campos da resposta
id string
displayName string
webhookUrl string
events matriz
installation.* são sempre entregues e nunca aparecem aqui.createdAt string
updatedAt string
installationRedirectUris matriz
namespaceSlug string
description string
websiteUrl string
defaultScopes matriz
curl --request GET \ --url 'https://api.cursor.com/v1/origin/app' \ --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN'Formato da resposta:
{ "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 instalações do app
/v1/origin/app/installationsLista as instalações do app autenticado.
Parâmetros de consulta
pageSize integer
pageToken string
next_page_token de uma resposta anterior. Vazio na primeira página.Campos da resposta
installations matriz
installations[].id string
installations[].appId string
installations[].target object
installations[].target.slug string
installations[].target.id string
installations[].target.type string
team, user. Omitido quando desconhecido.installations[].createdAt string
installations[].updatedAt string
installations[].repoSelectionMode string
installations[].scopes matriz
installations[].installedBy object
installations[].installedBy.id string
user_.installations[].installedBy.email string
installations[].installedBy.displayName string
installations[].installedBy.handle string
@. Presente apenas enquanto esse perfil estiver visível publicamente; omitido caso contrário.installations[].suspendedAt string
installations[].deletedAt string
installation.deleted; uma instalação excluída não é mais resolvida pela API, portanto este endpoint nunca a retorna.nextPageToken string
curl --request GET \ --url 'https://api.cursor.com/v1/origin/app/installations' \ --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN'Formato da resposta:
{ "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" ] } ]}Obter instalação do app
/v1/origin/app/installations/{installationId}Retorna uma instalação do app autenticado.
repoSelectionMode é all ou selected.
Parâmetros de caminho
installationId string Obrigatório
Campos da resposta
id string
appId string
target object
target.slug string
target.id string
target.type string
team, user. Omitido quando desconhecido.createdAt string
updatedAt string
repoSelectionMode string
scopes matriz
installedBy object
installedBy.id string
user_.installedBy.email string
installedBy.displayName string
installedBy.handle string
@. Presente apenas enquanto esse perfil estiver publicamente visível; caso contrário, é omitido.suspendedAt string
deletedAt string
installation.deleted; uma instalação excluída não é mais resolvida pela API, portanto este endpoint nunca a retorna.curl --request GET \ --url 'https://api.cursor.com/v1/origin/app/installations/INSTALLATION_ID' \ --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN'formato de resposta:
{ "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" ]}Excluir instalação do app
/v1/origin/app/installations/{installationId}Exclui uma instalação pertencente ao app autenticado e impede a emissão de novos tokens de instalação. Tokens de curta duração já emitidos podem permanecer válidos até expirarem (por no máximo 15 minutos). O corpo da resposta está vazio.
Parâmetros de caminho
installationId string Obrigatório
Campos da resposta
Solicitações bem-sucedidas não retornam corpo de resposta.
curl --request DELETE \ --url 'https://api.cursor.com/v1/origin/app/installations/INSTALLATION_ID' \ --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN'Resposta:
204 No ContentCriar token de acesso da instalação
/v1/origin/app/installations/{installationId}/access_tokensCria um token de acesso da instalação para o app autenticado.
Requer autenticação com JWT de assinatura de app, como em GetAuthenticatedApp. O token é limitado à instalação especificada, que deve pertencer ao app autenticado. Os chamadores podem restringir o token a um subconjunto dos escopos aceitos e dos repositórios acessíveis da instalação.
repositoryIds pode indicar um repositório espelhado. O token resultante tem os escopos da instalação, e o Origin ainda aplica o limite de espelhamento a cada solicitação: consulte Repositórios espelhados.
Parâmetros de caminho
installationId string Obrigatório
Corpo da solicitação
scopes matriz
repositoryIds matriz
Campos de resposta
token string
expiresAt string
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" ]}'Formato de resposta:
{ "token": "oit_2v8xkq4m1c7p9t3w5y0z6r4b", "expiresAt": "2026-08-01T10:30:00Z"}Criar token de usuário da instalação
/v1/origin/app/installations/{installationId}/user_access_tokensCria um token de usuário da instalação que atua em nome de um membro do namespace da instalação.
A instalação deve pertencer ao app autenticado e ter aceitado namespace:user_tokens:write. Identifique o usuário com exatamente um entre userId ou userEmail. Um usuário desconhecido, ambíguo ou não elegível recebe PermissionDenied (HTTP 403), sem que seja revelado qual condição falhou.
O acesso do token é limitado às permissões que tanto a instalação quanto o usuário possuem. Quando scopes e repositoryIds estão definidos, cada escopo deve ser permitido em todos os repositórios listados para ambos os principals; caso contrário, a solicitação recebe PermissionDenied (HTTP 403). Consulte Atuando em nome de usuários para ver o fluxo completo.
Parâmetros de caminho
installationId string Obrigatório
Corpo da solicitação
userId string
user_… do usuário, conforme retornado nos payloads de ator. Defina exatamente um entre userId ou userEmail.userEmail string
scopes matriz
namespace:user_tokens:write retorna InvalidArgument (HTTP 400); esse escopo autoriza a emissão e não pode ser delegado ao token. Se vazio ou omitido, nenhum limite de escopo é aplicado.repositoryIds matriz
Campos de resposta
token string
expiresAt string
curl --request POST \ --url 'https://api.cursor.com/v1/origin/app/installations/INSTALLATION_ID/user_access_tokens' \ --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN' \ --header 'Content-Type: application/json' \ --data '{ "userId": "user_01k2ja2000e0080000000000c3", "scopes": [ "repository:pull_requests:reviews:write" ], "repositoryIds": [ "repo_01k2ja2000e0080000000000q4" ]}'Formato de resposta:
{ "token": "YOUR_INSTALLATION_USER_TOKEN", "expiresAt": "2026-08-01T10:30:00Z"}Listar repositórios da instalação do app
/v1/origin/installation/reposLista os repositórios acessíveis à instalação do aplicativo autenticada.
Requer um token de acesso de instalação (oit_) emitido por CreateInstallationAccessToken.
Os parceiros descobrem seus repositórios por meio deste endpoint. As entradas da lista são resumos sucintos dos repositórios; use Obter repositório para ver os carimbos de data/hora completos. Obter repositório inclui o cloneUrl, somente na saída.
Os resultados incluem repositórios espelhados. Um espelho é somente leitura até se tornar um espelho outbound estável: consulte Repositórios espelhados.
Parâmetros de consulta
pageSize integer
pageToken string
next_page_token de uma resposta anterior. Vazio na primeira página. O mesmo filtro deve ser usado ao solicitar as páginas seguintes. O pageSize em uma solicitação de acompanhamento se aplica a essa página; omita-o para manter o tamanho de página anterior.filter string
owner/repo com uma única barra compara cada metade com o campo correspondente. Espaços em branco no início e no fim são ignorados; um valor vazio não aplica nenhum filtro.Campos de resposta
repositories matriz
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. Omitido quando desconhecido.repositories[].defaultBranch 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 boolean
nextPageToken string
repoSelectionMode string
curl --request GET \ --url 'https://api.cursor.com/v1/origin/installation/repos' \ --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN'Formato da resposta:
{ "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 do webhook
/v1/origin/app/webhook/deliveriesLista as entregas de webhook do aplicativo autenticado, da mais recente para a mais antiga.
Uma entrega é um único evento devido a um app; seu id é o valor do cabeçalho webhook-id que o receptor vê. delivered=false é o predicado de recuperação: seleciona toda entrega que nunca recebeu um 2xx, incluindo entregas cuja sequência de tentativas se esgotou durante uma interrupção.
As entregas podem ser listadas por sete dias após serem criadas e somente enquanto seu aplicativo tiver uma instalação ativa no namespace da entrega. Eventos de ciclo de vida direcionados ao aplicativo, como installation.deleted, permanecem visíveis após a desinstalação que descrevem.
Parâmetros de consulta
delivered boolean
delivered_at. delivered=false é o predicado de recuperação: ele é avaliado no servidor, portanto não pode deixar passar uma entrega cuja escada de tentativas se esgotou durante uma interrupção, como uma janela de tempo fornecida pelo chamador faz silenciosamente.eventType string
pull_request.created.installationId string
WebhookDelivery.installation.id).createdAfter string
createdBefore string
pageSize integer
pageToken string
next_page_token de uma resposta anterior. Vazio na primeira página.Campos da resposta
deliveries matriz
deliveries[].id string
webhook-id que o destinatário vê; use-o como chave de idempotência.deliveries[].event object
deliveries[].event.id string
deliveries[].event.type string
deliveries[].installation object
id é a instalação ativa atual do proprietário alvo; fica indefinida quando nenhuma existe (possível apenas para eventos do ciclo de vida direcionados ao app após uma desinstalação).deliveries[].installation.id string
deliveries[].installation.target objeto
deliveries[].installation.target.slug string
deliveries[].installation.target.id string
deliveries[].installation.target.type string
team, user. Omitido quando desconhecido.deliveries[].createdAt string
deliveries[].deliveredAt string
deliveries[].lastAttempt objeto
deliveries[].lastAttempt.id string
deliveries[].lastAttempt.deliveryId string
deliveries[].lastAttempt.trigger string
automatic, manual.deliveries[].lastAttempt.responseStatusCode integer
deliveries[].lastAttempt.latencyMs integer
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'Formato da resposta:
{ "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" } } ]}Reentregar entregas de webhook em lote
/v1/origin/app/webhook/deliveries:batchRedeliverSolicita ao Origin que reenvie as entregas.
A solicitação significa "garanta que haja um envio em andamento para cada uma delas", não "adicione outro envio". Retorna um resultado para cada entrada única, em vez de falhar o lote por causa de uma entrada inválida. Desse modo, um único ID expirado não bloqueia o restante de uma página de recuperação. Um 202 significa que os envios estão na fila; a entrega em si é assíncrona, portanto, consulte List Webhook Deliveries para verificar os resultados.
Corpo da solicitação
deliveryIds matriz Obrigatório
pageSize em List Webhook Deliveries. Duplicatas são removidas, mantendo a ordem da primeira ocorrência. Uma lista vazia ou mais de 100 entradas únicas retorna InvalidArgument (HTTP 400).Campos de resposta
results matriz
results[].deliveryId string
results[].outcome string
queued quando um envio foi criado, already_in_flight quando um envio já estava em andamento e not_found caso contrário. already_in_flight é um sucesso, não um erro. not_found abrange IDs desconhecidos, IDs mais antigos que a janela de retenção de sete dias e namespaces nos quais seu app não está mais instalado.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" ]}'Formato de resposta:
{ "results": [ { "deliveryId": "whd_01k2ja2000e0080000000000j9", "outcome": "queued" } ]}Ping do webhook
/v1/origin/app/webhook/pingsEnvia uma entrega de teste para o URL do webhook do app autenticado e informa a resposta do destinatário.
Use-o para verificar um destinatário enquanto configura um app, em vez de esperar por um evento real. Requer autenticação com JWT de assinatura de app, como em Obter app autenticado.
O destinatário vê a estrutura de produção: os mesmos cabeçalhos e a assinatura v1ed, que pode ser verificada com as chaves de assinatura, com webhook-event-type definido como ping e um payload que identifica o app. Um ping não pertence a nenhuma instalação; portanto, tanto o cabeçalho webhook-installation-id quanto o installationId do envelope estão ausentes.
O Origin envia o ping uma única vez, de forma síncrona, e informa o resultado na resposta. Não há novas tentativas, e um ping não é um evento de domínio: ele nunca aparece em List Webhook Deliveries e não pode ser reenviado. Uma falha do destinatário é informada na resposta, e não como um erro. Um app sem URL de webhook configurado retorna FailedPrecondition (HTTP 400).
Corpo da solicitação
A solicitação não aceita campos. Envie um objeto JSON vazio.
Campos de resposta
deliveryId string
webhook-id da entrega de teste, correspondente ao cabeçalho recebido pelo destinatário.eventId string
event.id.delivered boolean
2xx antes do tempo limite de entrega. Sempre presente.responseStatusCode integer
0 quando nenhuma resposta é recebida porque a conexão falhou ou excedeu o tempo limite. Sempre 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 '{}'formato de resposta:
{ "deliveryId": "whd_01k2ja2000e0080000000000j9", "eventId": "evt_01k2ja2000e0080000000000r5", "delivered": true, "responseStatusCode": 200}Get App
/v1/origin/apps/{appId}Retorna um único app pelo seu identificador. Esta é a leitura de gerenciamento para publishers de apps; Get Authenticated App é a autoleitura equivalente para a credencial JWT do próprio app.
Parâmetros de caminho
appId string Obrigatório
app_.Campos de resposta
id string
app_.displayName string
webhookUrl string
events array
installation.* são sempre entregues e nunca aparecem aqui.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'Formato de resposta:
{ "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" ]}Atualizar app
/v1/origin/apps/{appId}Atualiza as configurações de um app. Os campos omitidos permanecem inalterados, e é necessário informar pelo menos um campo definível. Limpar webhookUrl enviando uma string vazia desativa a entrega outbound de webhooks e cancela as entregas pendentes do app; definir uma URL novamente não recupera as entregas canceladas.
Parâmetros de caminho
appId string Obrigatório
app_.Corpo da solicitação
displayName string
webhookUrl string
events object
events.events matriz
installation.* são sempre entregues e não podem ser listados aqui.description string
websiteUrl string
installationRedirectUris object
installationRedirectUris.installationRedirectUris vetor
defaultScopes object
defaultScopes.scopes vetor
Campos de resposta
id string
app_.displayName string
webhookUrl string
events matriz
installation.* são sempre entregues e nunca aparecem aqui.createdAt string
updatedAt string
installationRedirectUris lista
namespaceSlug string
description string
websiteUrl string
defaultScopes vetor
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" ] }}'Formato de resposta:
{ "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" ]}Adicionar chave de assinatura do app
/v1/origin/apps/{appId}/signing_keysAdiciona uma chave de assinatura a um app. Cada app mantém um conjunto limitado de chaves de assinatura ativas; adicionar uma chave acima desse limite retorna FailedPrecondition (HTTP 400) até que outra chave seja revogada. Uma chave já registrada retorna AlreadyExists (HTTP 409 Conflict).
Parâmetros de caminho
appId string Obrigatório
app_.Corpo da solicitação
publicKey string Obrigatório
Campos de resposta
kid string
kid do JWT e para revogar a chave.createdAt string
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-----"}'Formato de resposta:
{ "kid": "3q2xW9dK5fJm8vB1nY6cT0aZrQpLh4eGkVsN7uMxOdI", "createdAt": "2026-08-02T14:45:00Z"}Revogar chave de assinatura do app
/v1/origin/apps/{appId}/signing_keys/{kid}Revoga uma chave de assinatura do app pelo respectivo ID de chave. JWTs do app assinados com uma chave revogada deixam de autenticar. A última chave de assinatura ativa não pode ser revogada; nesse caso, a solicitação retorna FailedPrecondition (HTTP 400). O corpo da resposta fica vazio.
Parâmetros de caminho
appId string Obrigatório
app_.kid string Obrigatório
Campos de resposta
Solicitações bem-sucedidas não retornam corpo da resposta.
curl --request DELETE \ --url 'https://api.cursor.com/v1/origin/apps/{appId}/signing_keys/{kid}' \ --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN'Resposta:
204 No ContentListar apps do namespace
/v1/origin/namespaces/{namespaceSlug}/appsLista os apps pertencentes a um namespace, do mais recente para o mais antigo. As respostas trazem apenas metadata de exibição; para ler a configuração de webhook de um app, use Get App.
Parâmetros de caminho
namespaceSlug string Obrigatório
Parâmetros de consulta
pageSize integer
pageToken string
next_page_token de uma resposta anterior. Vazio na primeira página.Campos de resposta
apps matriz
apps[].id string
app_.apps[].displayName string
apps[].description string
nextPageToken string
curl --request GET \ --url 'https://api.cursor.com/v1/origin/namespaces/{namespaceSlug}/apps' \ --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN'Formato de resposta:
{ "apps": [ { "id": "app_01k2ja2000e0080000000000a1", "displayName": "CI Status Bot", "description": "Posts CI status on pull requests." }, { "id": "app_01k2ja2000e0080000000000a2", "displayName": "Deploy Bot", "description": "" } ], "nextPageToken": ""}Criar app
/v1/origin/namespaces/{namespaceSlug}/appsCria um app pertencente a um namespace. Os apps são criados como privados. Gere o par de chaves Ed25519 localmente e envie apenas a chave pública; o Origin a armazena para verificar os JWTs do app. URLs de webhook, tipos de evento, URIs de redirecionamento ou escopos inválidos retornam InvalidArgument (HTTP 400).
O proprietário do namespace precisa estar qualificado para gravar no Origin no momento da solicitação, assim como exigido em Criar repositório. O proprietário, se for um usuário, precisa estar em um plano Pro, Pro Student, Pro+, Ultra ou Start. Se for uma equipe, o proprietário precisa ter um plano de equipe pago e ativo, não pode usar o Privacy Mode (Legacy) e não pode ter o Origin desativado por um administrador da equipe. Um proprietário que não atenda aos requisitos retorna FailedPrecondition (HTTP 400). O Origin verifica a elegibilidade do proprietário do namespace, não a do usuário que faz a chamada.
Parâmetros de caminho
namespaceSlug string Obrigatório
Corpo da solicitação
displayName string Obrigatório
publicKey string Obrigatório
webhookUrl string
events matriz
installation.*, que são sempre entregues e não podem ser listados aqui.description string
websiteUrl string
installationRedirectUris matriz
defaultScopes lista
repository:contents:read. As instalações continuam aceitando scopes explicitamente.Campos de resposta
id string
app_.displayName string
webhookUrl string
events vetor
installation.* são sempre entregues e nunca aparecem aqui.createdAt string
updatedAt string
installationRedirectUris array
namespaceSlug string
description string
websiteUrl string
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" ]}'Formato de resposta:
{ "id": "app_01k2ja2000e0080000000000a1", "displayName": "CI Status Bot", "webhookUrl": "https://ci.acme.dev/webhooks/origin", "events": [ "pull_request.created", "pull_request.merged" ], "createdAt": "2026-08-01T09:30:00Z", "updatedAt": "2026-08-01T09:30:00Z", "installationRedirectUris": [ "https://ci.acme.dev/origin/setup" ], "namespaceSlug": "acme", "description": "Posts CI status on pull requests.", "websiteUrl": "https://ci.acme.dev", "defaultScopes": [ "repository:contents:read", "repository:pull_requests:read" ]}Adicionar repositórios à instalação do app
/v1/origin/namespaces/{namespaceSlug}/installations/{installationId}/reposAdiciona repositórios à seleção de repositórios de uma instalação e retorna a instalação atualizada. A gravação é cumulativa: os repositórios listados são adicionados à seleção atual, uma solicitação cujos repositórios já têm acesso concedido é bem-sucedida sem alterar nada, e os escopos da instalação nunca mudam.
Todos os repositórios listados devem pertencer ao namespace de destino, caso contrário a solicitação retorna FailedPrecondition (HTTP 400) e não concede nada. O mesmo erro abrange uma instalação que já contém todos os repositórios do namespace (repoSelectionMode é all), uma que está suspensa e uma que é anterior aos escopos por instalação. Uma instalação que não existe ou que pertence a outro namespace retorna 404; a mensagem indica a página de consentimento a ser aberta quando o app nunca foi instalado no namespace, pois este endpoint não pode realizar a primeira instalação.
O chamador deve ser uma credencial de usuário do Cherri Code com acesso ao gerenciamento de instalações no namespace. Tokens de app, tokens de acesso da instalação e contas de serviço não podem alterar os repositórios de uma instalação.
Parâmetros de caminho
namespaceSlug string Obrigatório
installationId string Obrigatório
Corpo da solicitação
repoIds matriz Obrigatório
Campos de resposta
id string
appId string
target objeto
target.slug string
target.id string
target.type string
team, user. Omitido quando desconhecido.createdAt string
updatedAt string
repoSelectionMode string
scopes matriz
installedBy object
installedBy.id string
user_.installedBy.email string
installedBy.displayName string
installedBy.handle string
@. Presente apenas enquanto esse perfil estiver visível publicamente; omitido caso contrário.suspendedAt string
deletedAt string
installation.deleted; uma instalação excluída deixa de ser resolvida pela API, portanto este endpoint nunca a retorna.curl --request POST \ --url 'https://api.cursor.com/v1/origin/namespaces/NAMESPACE_SLUG/installations/INSTALLATION_ID/repos' \ --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN' \ --header 'Content-Type: application/json' \ --data '{ "repoIds": [ "repo_01k2ja2000e0080000000000q4", "repo_01k2ja2000e0080000000000q5" ]}'Formato de resposta:
{ "id": "inst_01k2ja2000e0080000000000b2", "appId": "app_01k2ja2000e0080000000000a1", "target": { "slug": "acme", "id": "ns_01k2ja2000e0080000000000p3", "type": "team" }, "createdAt": "2026-08-01T09:30:00Z", "updatedAt": "2026-08-02T14:45:00Z", "repoSelectionMode": "selected", "scopes": [ "repository:contents:read", "repository:pull_requests:read", "repository:metadata:read" ]}Repositórios
cloneUrl é uma URL HTTPS de clonagem disponível apenas na saída. Obter repositório inclui cloneUrl.
Os parceiros encontram seus repositórios por meio de Listar repositórios da instalação do app. A listagem e a criação de repositórios em todo o namespace não fazem parte da API de parceiros.
Listar namespaces
/v1/origin/namespacesLista os namespaces nos quais você pode listar repositórios, ordenados por slug.
Os candidatos são os namespaces das suas equipes, seu namespace pessoal e os namespaces que contêm repositórios aos quais você recebeu acesso. Somente aqueles em que você tem namespace:repositories:read são retornados; portanto, cada resultado é um ownerSlug válido para Listar repositórios.
O chamador deve ser uma credencial de usuário do Cursor; a chamada não exige nenhum escopo próprio. Tokens de app, tokens de acesso da instalação e contas de serviço recebem PermissionDenied (HTTP 403).
Parâmetros de consulta
pageSize integer
pageToken string
next_page_token de uma resposta anterior. Vazio na primeira página. Em uma solicitação de acompanhamento, o pageSize se aplica a essa página; omita-o para manter o tamanho de página anterior.Campos de resposta
namespaces array
namespaces[].namespace object
namespaces[].namespace.slug string
ownerSlug em Listar repositórios.namespaces[].namespace.id string
namespaces[].namespace.type string
team, user. Omitido quando desconhecido.namespaces[].viewerCanCreateRepositories boolean
nextPageToken string
curl --request GET \ --url 'https://api.cursor.com/v1/origin/namespaces' \ --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN'Formato de resposta:
{ "namespaces": [ { "namespace": { "slug": "acme", "id": "ns_01k2ja2000e0080000000000p3", "type": "team" }, "viewerCanCreateRepositories": true }, { "namespace": { "slug": "jane", "id": "ns_01k2ja2000e0080000000000p4", "type": "user" }, "viewerCanCreateRepositories": false } ]}Listar repositórios
/v1/origin/repos/{ownerSlug}Lista os repositórios de uma entidade proprietária.
Parâmetros de caminho
ownerSlug string Obrigatório
Parâmetros de consulta
pageSize integer
pageToken string
next_page_token de uma resposta anterior. Vazio para a primeira página. O pageSize em uma solicitação de acompanhamento se aplica a essa página; omita-o para manter o tamanho de página anterior.filter string
Campos da resposta
repositories matriz
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. Omitido quando desconhecido.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 boolean
nextPageToken string
curl --request GET \ --url 'https://api.cursor.com/v1/origin/repos/OWNER_SLUG' \ --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN'Formato da resposta:
{ "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" } ]}Obter repositório
/v1/origin/repos/{ownerSlug}/{repoName}Retorna um único repositório pelo seu identificador (owner_id, name).
cloneUrl é uma URL HTTPS de clonagem apenas de saída. O método Get repository inclui cloneUrl.
Parâmetros de caminho
ownerSlug string Obrigatório
repoName string Obrigatório
Campos da resposta
id string
name string
fullName string
owner object
owner.slug string
owner.id string
owner.type string
team, user. Omitido quando desconhecido.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'Formato da resposta:
{ "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"}Atualizar repositório
/v1/origin/repos/{ownerSlug}/{repoName}Atualiza as configurações do repositório. Os campos omitidos permanecem inalterados, e é necessário informar pelo menos um campo configurável.
As configurações são aplicadas em grupos independentes, numa ordem fixa: branch padrão, exclusão automática da branch de head, visibilidade e, por último, métodos de merge. A atualização não é atômica entre os grupos. Quando um grupo é rejeitado, os grupos anteriores a ele nessa ordem já foram aplicados e permanecem aplicados; então faça um retry com o grupo rejeitado corrigido para convergir no estado solicitado. A resposta retorna o repositório no estado do último grupo aplicado.
Uma solicitação que não define nenhum campo retorna InvalidArgument (HTTP 400). Uma alteração simultânea na branch padrão retorna 409 Conflict.
Parâmetros de caminho
ownerSlug string Obrigatório
repoName string Obrigatório
Corpo da solicitação
defaultBranch string
FailedPrecondition (HTTP 400).allowMergeCommit boolean
allowSquashMerge, e pelo menos um dos dois deve ser true. Enviar um sem o outro retorna InvalidArgument (HTTP 400).allowSquashMerge boolean
allowMergeCommit, e pelo menos um dos dois deve ser true. Enviar um sem o outro retorna InvalidArgument (HTTP 400).deleteBranchOnMerge boolean
FailedPrecondition (HTTP 400).visibility string
internal, private. Omita este campo para manter a visibilidade inalterada.Campos da resposta
id string
name string
fullName string
owner object
owner.slug string
owner.id string
owner.type string
team, user. Omitido quando desconhecido.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 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"}'Formato da resposta:
{ "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}Criar repositório
/v1/origin/repos/{ownerSlug}Cria um repositório pertencente a um proprietário.
O proprietário deve estar apto a gravar no Origin no momento da solicitação. Um proprietário usuário deve estar em um plano Pro, Pro Student, Pro+, Ultra ou Start. Um proprietário de equipe deve ter um plano de equipe pago ativo, não pode estar no Privacy Mode (Legacy) e não pode ter o Origin desativado por um administrador da equipe. Um proprietário inelegível retorna FailedPrecondition (HTTP 400). A leitura de repositórios existentes não exige esse requisito.
Os nomes de repositório são reivindicados sem diferenciar maiúsculas de minúsculas. Um nome que difira apenas no uso de maiúsculas e minúsculas de um repositório que o proprietário já possui é rejeitado, portanto widgets e Widgets não podem coexistir em um mesmo namespace. O nome que você envia é armazenado exatamente como enviado.
O primeiro push para um novo repositório pode alterar o branch padrão. Quando esse push apenas cria branches e nenhum deles é o branch padrão armazenado do repositório, o Origin define o branch criado como branch padrão ou usa main ou master quando o push cria vários branches e um desses nomes está entre eles. Fora isso, o branch padrão permanece inalterado. Consulte o valor atual em Obter repositório.
Parâmetros de caminho
ownerSlug string Obrigatório
Corpo da solicitação
name string Obrigatório
defaultBranch string
Campos de resposta
id string
name string
fullName string
owner object
owner.slug string
owner.id string
owner.type string
team, user. Omitido quando desconhecido.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"}'Formato da resposta:
{ "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 branches
/v1/origin/repos/{ownerSlug}/{repoName}/branchesLista as branches do repositório e seus commits mais recentes em ordem alfabética, com paginação por page_size e page_token.
Parâmetros de caminho
ownerSlug string Obrigatório
repoName string Obrigatório
Parâmetros de consulta
pageSize integer
pageToken string
next_page_token de uma resposta anterior. Deixe vazio para a primeira página. Codifica a posição de retomada. O pageSize em uma solicitação de acompanhamento se aplica a essa página; omita-o para manter o tamanho de página anterior.Campos de resposta
branches matriz
branches[].name string
branches[].commit object
branches[].commit.sha string
nextPageToken string
curl --request GET \ --url 'https://api.cursor.com/v1/origin/repos/OWNER_SLUG/REPO_NAME/branches' \ --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN'Formato de resposta:
{ "branches": [ { "name": "main", "commit": { "sha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4" } } ]}Obter tarball do repositório
/v1/origin/repos/{ownerSlug}/{repoName}/tarball/{ref}Baixa um tar compactado com gzip da árvore do repositório em ref.
O Origin indexa o arquivo pelo repositório e pelo commit para o qual ref é resolvida. A primeira solicitação para um determinado commit responde 200 com Content-Type: application/gzip e transmite o arquivo como corpo da resposta. Solicitações posteriores para o mesmo commit respondem 302 com corpo vazio e uma URL de download assinada em Location, válida por 15 minutos; siga o redirecionamento para baixar os bytes. O arquivo contém um único diretório de nível superior chamado {ownerSlug}-{repoName}-{shortSha}/, em que shortSha são os 7 primeiros caracteres hexadecimais do commit resolvido, correspondendo ao layout do endpoint de tarball do GitHub. Um repositório vazio retorna ABORTED (HTTP 409 Conflict), e uma referência do Git que não é resolvida retorna 404.
Envie a referência do Git como parâmetro de consulta, em vez de segmento de caminho, para especificar uma referência do Git que contenha "/": GET /v1/origin/repos/{ownerSlug}/{repoName}/tarball?ref=refs/heads/main. Omita-a para arquivar a branch padrão do repositório.
Parâmetros de caminho
ownerSlug string Obrigatório
repoName string Obrigatório
ref string Obrigatório
refs/heads/... ou refs/tags/... totalmente qualificado, ou HEAD simbólico. Não é um glob nem revspec, portanto <rev>~3 é rejeitado. Vazio usa a branch padrão do repositório.Campos de resposta
sha string
downloadUrl string
Location da resposta 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'Formato de resposta:
{ "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 espelhamento
/v1/origin/repos/{ownerSlug}/{repoName}:syncMirrorSincroniza uma referência de um repositório espelhado com sua fonte upstream. Retorna HTTP 200 quando o destino de sincronização é alcançado ou HTTP 202 quando a sincronização ainda está pendente. wait=false (o padrão) agenda a sincronização e geralmente retorna 202; retorna 200 imediatamente quando sha já pode ser alcançado a partir de ref. wait=true bloqueia até que o destino seja alcançado ou o tempo máximo de espera (~2 minutos) expire; nesse caso, ainda retorna 202, e a sincronização continua em segundo plano. Repositórios que não fazem pull de uma fonte upstream são rejeitados.
Parâmetros de caminho
ownerSlug string Obrigatório
repoName string Obrigatório
Corpo da solicitação
ref string Obrigatório
refs/ e especificar uma referência após esse prefixo, por exemplo, refs/heads/main ou refs/tags/v1. Nomes curtos, como main, são rejeitados com INVALID_ARGUMENT.wait boolean
sha string
ref. Quando definido e acessível a partir de ref, a chamada retorna antecipadamente sem aguardar a conclusão de outras tarefas de espelhamento. Outros valores são rejeitados com INVALID_ARGUMENT.campo de resposta
synced boolean
200 quando verdadeiro, 202 quando falso.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}'Formato de resposta:
{ "synced": true}Os endpoints de transição de espelhamento estão documentados na Origin Migration API. Sincronizar espelhamento permanece nesta página.
Desvincular espelho do repositório
Consulte Desvincular espelho do repositório.
Obter job de transição de espelhamento
Consulte Obter job de transição de espelhamento.
Obter job de transição de espelhamento ativo
Veja Obter job de transição de espelhamento ativo.
Forçar transição do espelhamento do repositório
Consulte Forçar transição do espelhamento do repositório.
Fazer transição do espelhamento do repositório
Consulte Fazer transição do espelhamento do repositório.
Verificações
- O primeiro upsert de execução cria automaticamente a suíte correspondente.
- As verificações obrigatórias são associadas ao app instalador, à
keyda suíte e, opcionalmente, àkeyde uma execução.nameserve apenas para exibição e não é usado na associação. - Mantenha os valores de
keyestáveis entre as tentativas e legíveis para os usuários, pois a configuração de verificações obrigatórias é baseada neles. - Reutilize
externalIdpara atualizar uma tentativa, o que descarta o resultado anterior dessa tentativa; use um novoexternalIdao tentar novamente, para que a tentativa anterior permaneça no histórico. - Use
checkRun.outputpara resultados legíveis por humanos:title: título curto do resultado, com até 255 caracteres.summary: resumo principal em Markdown, com até 65.535 bytes UTF-8.text: detalhes estendidos em Markdown, com até 65.535 bytes UTF-8.
- Use
detailsUrlpara criar um link para a página de resultados externos do provedor.
Execuções de verificação define qual tentativa é a atual, como externalUpdatedAt ordena as gravações e o que outcome relata, além das regras de timestamp e prazo compartilhadas por esses endpoints.
Publicar execução de verificação
/v1/origin/repos/{ownerSlug}/{repoName}/check-runsCria ou atualiza uma suíte de verificações + uma execução de verificação usando um token de acesso da instalação com repository:checks:write. A gravação é atribuída ao app que possui a instalação autenticada. Uma chamada repetida com os mesmos (repo, head_sha, suite.key, check.key) atualiza a execução de verificação existente, em vez de criar uma duplicata.
O endpoint resolve ou cria atomicamente a tentativa da suíte e faz upsert de uma tentativa de execução. externalUpdatedAt ordena as atualizações para a mesma identidade de execução; tentativas obsoletas não podem sobrescrever um estado mais recente, e uma conclusão cancelled não pode substituir um resultado de aprovação já armazenado; consulte Ordenação de gravações. Uma publicação ignorada por estar obsoleta e uma publicação que repete os valores armazenados ainda retornam 200 com a suíte e a execução armazenadas; portanto, leia outcome para distinguir ignored_stale e unchanged de created e updated. updatedAt não se altera em nenhum dos dois casos, portanto não pode distingui-los.
Dentro de uma suíte, a tentativa atual para uma chave de execução key é a execução com o externalUpdatedAt mais recente, desempatando por createdAt e depois por id, do mais recente para o mais antigo. Cada (actor, key, externalId) informado para um commit corresponde a uma tentativa de suíte, e a tentativa atual para cada (actor, key) é aquela cujas execuções têm o externalUpdatedAt mais recente; uma suíte sem execuções é classificada pelo seu próprio createdAt. Uma execução só é atual para o seu commit enquanto a suíte for a tentativa atual do commit; assim, uma execução publicada com um externalId de suíte mais antigo permanece oculta nas listagens com escopo no commit enquanto outra tentativa dessa suíte tiver atividade mais recente. Em ambos os níveis, uma tentativa cancelada não substitui uma aprovada; Tentativas e a tentativa atual explica a regra. Tentativas substituídas continuam acessíveis por id.
deadlineAt registra um prazo opcional para a execução. O Origin o armazena, o retorna nas leituras e o limpa quando a execução atinge completed. Um prazo com mais de 24 horas no futuro é rejeitado com InvalidArgument (HTTP 400) em vez de ser limitado.
Quando o prazo passa para uma execução ainda in_progress, o Origin conclui a execução por conta própria com a conclusão timed_out, definindo completedAt caso a execução ainda não o tenha, e envia repository.check_run.completed. A expiração ocorre como uma varredura periódica em vez de um temporizador por execução, portanto a expiração acontece alguns minutos após o prazo, e não no exato momento dele. Por padrão, a varredura é executada aproximadamente a cada 30 minutos, uma configuração operacional que pode mudar. Uma execução queued nunca expira, assim como não expira uma execução que não tenha deadlineAt. Concluir a execução você mesmo antes do prazo a limpa. O Origin deixa o externalUpdatedAt da execução inalterado quando a encerra por tempo esgotado, então uma conclusão posterior do seu provedor ainda pode sobrescrever a conclusão timed_out.
Parâmetros de caminho
ownerSlug string Obrigatório
repoName string Obrigatório
Corpo da solicitação
headSha string Obrigatório
checkSuite objeto Obrigatório
checkSuite.key string Obrigatório
checkSuite.name string Obrigatório
checkSuite.detailsUrl string
checkSuite.externalId string Obrigatório
checkRun objeto Obrigatório
checkRun.key string Obrigatório
checkRun.name string Obrigatório
checkRun.status string Obrigatório
CHECK_RUN_LIFECYCLE_STATUS_UNSPECIFIED, queued, in_progress, completed. O esquema também lista rerequested, que somente o Origin define ao solicitar novamente; uma solicitação que contenha esse valor retorna 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 Obrigatório
checkRun.startedAt string
InvalidArgument (HTTP 400).checkRun.completedAt string
InvalidArgument (HTTP 400), assim como um valor anterior a startedAt quando ambos são enviados juntos.checkRun.detailsUrl string
checkRun.externalId string Obrigatório
checkRun.output object
checkRun.output.title string
checkRun.output.summary string
checkRun.output.text string
checkRun.deadlineAt string
InvalidArgument (HTTP 400), em vez de terem seu valor limitado. Omita-o ao criar para registrar que não há prazo; omita-o ao atualizar para manter inalterado o prazo armazenado.checkRun.isRerequestable boolean
true obriga seu app a assinar repository.check_run.rerequested e a responder a cada entrega publicando uma nova execução para o mesmo head SHA e key: ou uma nova execução com um novo externalId, que mantém a tentativa anterior como histórico, ou uma atualização da execução re-solicitada com o mesmo externalId, que a atualiza no lugar. Até que essa nova publicação chegue, a execução re-solicitada aparece como pendente no estado de verificação mais recente do commit; portanto, uma verificação obrigatória bloqueia a mesclagem e o pull request mostra a execução como aguardando sua reexecução. Declarar a re-solicitabilidade sem responder deixa a verificação sem atendimento. O Origin não verifica a assinatura quando você publica. Omita-o para manter o valor armazenado, que é false em uma nova execução; envie false para retirar a declaração.Campos de resposta
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 string
team, user. Omitido quando desconhecido.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
checkSuite.actor.user.displayName string
checkSuite.actor.user.handle string
@. Presente apenas enquanto esse perfil estiver visível publicamente; omitido caso contrário.checkSuite.actor.app objeto
checkSuite.actor.app.id string
checkSuite.actor.app.displayName string
checkSuite.actor.serviceAccount objeto
checkSuite.actor.serviceAccount.id string
checkRun objeto
checkRun.id string
checkRun.repository 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. Omitido quando desconhecido.checkRun.checkSuite objeto
checkRun.checkSuite.id string
checkRun.sha string
checkRun.key string
checkRun.name string
checkRun.status string
checkRun.conclusion string
status for completed.checkRun.detailsUrl string
checkRun.externalUpdatedAt string
checkRun.startedAt string
checkRun.completedAt string
checkRun.createdAt string
checkRun.updatedAt string
checkRun.externalId string
checkRun.actor object
actor da suíte de verificações proprietária.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 apenas enquanto esse perfil estiver visível publicamente; omitido caso contrário.checkRun.actor.app objeto
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
checkRun.rerequestedAt string
status é rerequested e a execução permanece no estado de verificação mais recente do commit e aparece como pendente, com conclusion e os tempos ainda contendo o resultado substituído, portanto uma verificação obrigatória bloqueia a mesclagem até que o app responda.checkRun.rerequestedBy objeto
actor. Presente sempre que rerequestedAt estiver definido e removido juntamente com ele.outcome string
checkRun. Valores permitidos: created, updated, unchanged, ignored_stale. Uma verificação que foi ignorada por estar obsoleta e uma verificação que repetiu os valores armazenados retornam ambas a execução armazenada; portanto, este campo é a única maneira de distingui-las.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." } }}'Estrutura da resposta:
{ "checkSuite": { "id": "crg_01k2ja2000e0080000000000h8", "repository": { "id": "repo_01k2ja2000e0080000000000q4", "name": "rocket", "owner": { "slug": "acme", "id": "ns_01k2ja2000e0080000000000p3", "type": "team" } }, "sha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4", "key": "ci-8842", "name": "CI", "detailsUrl": "https://ci.acme.dev/runs/8842", "createdAt": "2026-08-01T09:30:00Z", "updatedAt": "2026-08-02T14:45:00Z", "externalId": "build-8842", "actor": { "user": { "id": "user_01k2ja2000e0080000000000c3", "email": "[email protected]" } } }, "checkRun": { "id": "cr_01k2ja2000e0080000000000g7", "repository": { "id": "repo_01k2ja2000e0080000000000q4", "name": "rocket", "owner": { "slug": "acme", "id": "ns_01k2ja2000e0080000000000p3", "type": "team" } }, "checkSuite": { "id": "crg_01k2ja2000e0080000000000h8" }, "sha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4", "key": "ci-8842-unit-tests", "name": "unit-tests", "status": "completed", "conclusion": "success", "detailsUrl": "https://ci.acme.dev/runs/8842", "externalUpdatedAt": "2026-08-02T14:44:30Z", "startedAt": "2026-08-02T14:40:00Z", "completedAt": "2026-08-02T14:44:30Z", "createdAt": "2026-08-01T09:30:00Z", "updatedAt": "2026-08-02T14:45:00Z", "externalId": "run-8842", "actor": { "user": { "id": "user_01k2ja2000e0080000000000c3", "email": "[email protected]" } }, "output": { "title": "Unit tests", "summary": "128 tests passed.", "text": "All suites green." } }, "outcome": "created"}Upsert em lote de check runs
/v1/origin/repos/{ownerSlug}/{repoName}/check-runs:batchUpsertRealiza upserts atômicos de várias check runs pertencentes a uma única suíte. A solicitação aceita no máximo 10 runs e rejeita identidades duplicadas (external_id, key). Todas as runs são confirmadas ou toda a solicitação é revertida.
Cada execução aceita o mesmo deadlineAt opcional que Post Check Run.
Origin aplica a regra de ordenação externalUpdatedAt a cada execução separadamente. Uma execução ignorada por estar obsoleta não faz o lote falhar: a resposta traz a execução armazenada em seu lugar, e results[].outcome informa o veredito de cada execução na ordem da requisição.
Parâmetros de caminho
ownerSlug string Obrigatório
repoName string Obrigatório
Corpo da solicitação
headSha string Obrigatório
checkSuite objeto Obrigatório
checkSuite.key string Obrigatório
checkSuite.name string Obrigatório
checkSuite.detailsUrl string
checkSuite.externalId string Obrigatório
checkRuns matriz Obrigatório
(external_id, key).checkRuns[0].key string Obrigatório
checkRuns[0].name string Obrigatório
checkRuns[0].status string Obrigatório
CHECK_RUN_LIFECYCLE_STATUS_UNSPECIFIED, queued, in_progress, completed. O esquema também lista rerequested, que somente a Origin define ao reencaminhar a solicitação; uma solicitação que o contenha retorna 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 Obrigatório
checkRuns[0].startedAt string
InvalidArgument (HTTP 400).checkRuns[0].completedAt string
InvalidArgument (HTTP 400), assim como um valor anterior a startedAt quando ambos são publicados juntos.checkRuns[0].detailsUrl string
checkRuns[0].externalId string Obrigatório
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) em vez de serem ajustados. Omitir ao criar para não registrar nenhum prazo; omitir ao atualizar para deixar o prazo armazenado inalterado.checkRuns[0].isRerequestable boolean
true compromete seu app a assinar repository.check_run.rerequested e a responder a cada entrega publicando uma nova execução para o mesmo head SHA e key: ou uma nova execução com um novo externalId, que mantém a tentativa anterior como histórico, ou uma atualização da execução re-solicitada com o mesmo externalId, que a atualiza no lugar. Até que essa nova publicação chegue, a execução re-solicitada aparece como pendente no estado de verificação mais recente do commit, de modo que uma verificação obrigatória bloqueia a mesclagem e o pull request mostra a execução aguardando sua reexecução; declarar re-solicitabilidade sem responder deixa a verificação sem atendimento. A Origin não verifica a inscrição quando você publica. Omita para manter o valor armazenado, que é false em uma nova execução; envie false para retirar a declaração.Campos da resposta
checkSuite objeto
checkSuite.id cadeia de caracteres
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 string
team, user. Omitido quando desconhecido.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
checkSuite.actor.user.displayName string
checkSuite.actor.user.handle string
@. Presente apenas enquanto esse perfil estiver visível publicamente; omitido caso contrário.checkSuite.actor.app objeto
checkSuite.actor.app.id string
checkSuite.actor.app.displayName string
checkSuite.actor.serviceAccount objeto
checkSuite.actor.serviceAccount.id string
checkRuns matriz
results[].checkRun em vez disso. Ainda preenchido, na ordem da solicitação.checkRuns[].id cadeia de caracteres
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. Omitido quando desconhecido.checkRuns[].checkSuite objeto
checkRuns[].checkSuite.id string
checkRuns[].sha string
checkRuns[].key string
checkRuns[].name string
checkRuns[].status string
checkRuns[].conclusion string
status for completed.checkRuns[].detailsUrl string
checkRuns[].externalUpdatedAt string
checkRuns[].startedAt string
checkRuns[].completedAt string
checkRuns[].createdAt string
checkRuns[].updatedAt string
checkRuns[].externalId string
checkRuns[].actor object
actor da suíte de verificações proprietária.checkRuns[].actor.user objeto
checkRuns[].actor.user.id string
checkRuns[].actor.user.email string
checkRuns[].actor.user.displayName string
checkRuns[].actor.user.handle string
@. Presente apenas enquanto esse perfil estiver visível publicamente; omitido caso contrário.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 object
checkRuns[].output.title string
checkRuns[].output.summary string
checkRuns[].output.text string
checkRuns[].deadlineAt string
checkRuns[].isRerequestable boolean
checkRuns[].rerequestedAt string
status é rerequested e a execução permanece no estado de verificação mais recente do commit e é considerada pendente, com conclusion e os tempos ainda refletindo o resultado substituído, de modo que uma verificação obrigatória bloqueia o merge até que o app responda.checkRuns[].rerequestedBy object
actor. Presente sempre que rerequestedAt estiver definido, e removida junto com ele.results matriz
results[].checkRun objeto
outcome é created ou updated, e a execução como já estava nos demais casos. Contém os mesmos campos que checkRuns[].results[].outcome string
results[].checkRun. Valores permitidos: created, updated, unchanged, ignored_stale. Tanto uma execução ignorada por estar obsoleta quanto uma execução que repetiu os valores armazenados retornam a execução armazenada, portanto este campo é a única forma de distingui-las.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." } } ]}'Formato da resposta:
{ "checkSuite": { "id": "crg_01k2ja2000e0080000000000h8", "repository": { "id": "repo_01k2ja2000e0080000000000q4", "name": "rocket", "owner": { "slug": "acme", "id": "ns_01k2ja2000e0080000000000p3", "type": "team" } }, "sha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4", "key": "ci-8842", "name": "CI", "detailsUrl": "https://ci.acme.dev/runs/8842", "createdAt": "2026-08-01T09:30:00Z", "updatedAt": "2026-08-02T14:45:00Z", "externalId": "build-8842", "actor": { "user": { "id": "user_01k2ja2000e0080000000000c3", "email": "[email protected]" } } }, "checkRuns": [ { "id": "cr_01k2ja2000e0080000000000g7", "repository": { "id": "repo_01k2ja2000e0080000000000q4", "name": "rocket", "owner": { "slug": "acme", "id": "ns_01k2ja2000e0080000000000p3", "type": "team" } }, "checkSuite": { "id": "crg_01k2ja2000e0080000000000h8" }, "sha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4", "key": "ci-8842-unit-tests", "name": "unit-tests", "status": "completed", "conclusion": "success", "detailsUrl": "https://ci.acme.dev/runs/8842", "externalUpdatedAt": "2026-08-02T14:44:30Z", "startedAt": "2026-08-02T14:40:00Z", "completedAt": "2026-08-02T14:44:30Z", "createdAt": "2026-08-01T09:30:00Z", "updatedAt": "2026-08-02T14:45:00Z", "externalId": "run-8842", "actor": { "user": { "id": "user_01k2ja2000e0080000000000c3", "email": "[email protected]" } }, "output": { "title": "Unit tests", "summary": "128 tests passed.", "text": "All suites green." } } ], "results": [ { "checkRun": { "id": "cr_01k2ja2000e0080000000000g7", "repository": { "id": "repo_01k2ja2000e0080000000000q4", "name": "rocket", "owner": { "slug": "acme", "id": "ns_01k2ja2000e0080000000000p3", "type": "team" } }, "checkSuite": { "id": "crg_01k2ja2000e0080000000000h8" }, "sha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4", "key": "ci-8842-unit-tests", "name": "unit-tests", "status": "completed", "conclusion": "success", "detailsUrl": "https://ci.acme.dev/runs/8842", "externalUpdatedAt": "2026-08-02T14:44:30Z", "startedAt": "2026-08-02T14:40:00Z", "completedAt": "2026-08-02T14:44:30Z", "createdAt": "2026-08-01T09:30:00Z", "updatedAt": "2026-08-02T14:45:00Z", "externalId": "run-8842", "actor": { "user": { "id": "user_01k2ja2000e0080000000000c3", "email": "[email protected]" } }, "output": { "title": "Unit tests", "summary": "128 tests passed.", "text": "All suites green." } }, "outcome": "created" } ]}Obter execução de verificação
/v1/origin/repos/{ownerSlug}/{repoName}/check-runs/{checkRunId}Retorna uma única execução de verificação pelo id atribuído pelo servidor (cr_...).
Parâmetros de caminho
ownerSlug string Obrigatório
repoName string Obrigatório
checkRunId string Obrigatório
cr_...).Campos da resposta
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. Omitido quando desconhecido.checkSuite objeto
checkSuite.id string
sha string
key string
name string
status string
conclusion string
status for completed.detailsUrl string
externalUpdatedAt string
startedAt string
completedAt string
createdAt string
updatedAt string
externalId string
actor object
actor da suíte de verificações proprietária.actor.user object
actor.user.id string
actor.user.email string
actor.user.displayName string
actor.user.handle string
@. Presente apenas enquanto esse perfil estiver visível publicamente; omitido caso contrário.actor.app object
actor.app.id string
actor.app.displayName string
actor.serviceAccount object
actor.serviceAccount.id string
output object
output.title string
output.summary string
output.text string
deadlineAt string
isRerequestable boolean
rerequestedAt string
status é rerequested e a execução permanece no estado de verificação mais recente do commit e aparece como pendente, com conclusion e os horários ainda contendo o resultado substituído, então uma verificação obrigatória bloqueia a mesclagem até o app responder.rerequestedBy objeto
actor. Presente sempre que rerequestedAt estiver definido e removido juntamente com ele.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'Formato da resposta:
{ "id": "cr_01k2ja2000e0080000000000g7", "repository": { "id": "repo_01k2ja2000e0080000000000q4", "name": "rocket", "owner": { "slug": "acme", "id": "ns_01k2ja2000e0080000000000p3", "type": "team" } }, "checkSuite": { "id": "crg_01k2ja2000e0080000000000h8" }, "sha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4", "key": "ci-8842-unit-tests", "name": "unit-tests", "status": "completed", "conclusion": "success", "detailsUrl": "https://ci.acme.dev/runs/8842", "externalUpdatedAt": "2026-08-02T14:44:30Z", "startedAt": "2026-08-02T14:40:00Z", "completedAt": "2026-08-02T14:44:30Z", "createdAt": "2026-08-01T09:30:00Z", "updatedAt": "2026-08-02T14:45:00Z", "externalId": "run-8842", "actor": { "user": { "id": "user_01k2ja2000e0080000000000c3", "email": "[email protected]" } }, "output": { "title": "Unit tests", "summary": "128 tests passed.", "text": "All suites green." }}Listar anotações de execuções de verificação
/v1/origin/repos/{ownerSlug}/{repoName}/check-runs/{checkRunId}/annotationsLista as anotações de uma execução de verificação em ordem crescente de ID.
Os IDs de anotações são ordenáveis por tempo, então a ordem crescente dos IDs também é a ordem de criação. Um token de página fixa o escopo para o restante da sequência.
Parâmetros de caminho
ownerSlug string Obrigatório
repoName string Obrigatório
checkRunId string Obrigatório
Parâmetros de consulta
pageSize integer
pageToken string
nextPageToken de uma resposta anterior. Omita-o na primeira página. O pageSize em uma solicitação de acompanhamento se aplica a essa página; omita-o para manter o tamanho de página anterior.Campos da resposta
annotations matriz
annotations[].id string
annotations[].checkRunId string
annotations[].annotationLevel string
notice, warning, failure.annotations[].message string
annotations[].title string
annotations[].rawDetails string
annotations[].createdAt string
annotations[].updatedAt string
annotations[].location objeto
annotations[].location.path string
annotations[].location.startLine integer
annotations[].location.endLine integer
annotations[].location.columns objeto
annotations[].location.columns.startColumn integer
annotations[].location.columns.endColumn integer
nextPageToken string
curl --request GET \ --url 'https://api.cursor.com/v1/origin/repos/OWNER_SLUG/REPO_NAME/check-runs/CHECK_RUN_ID/annotations' \ --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN'Estrutura da resposta:
{ "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 } } ]}Criar anotações de Check Run
/v1/origin/repos/{ownerSlug}/{repoName}/check-runs/{checkRunId}/annotationsAdiciona de 1 a 25 anotações a uma execução de verificação em um único lote atômico.
Uma execução de verificação comporta no máximo 100 anotações. Um lote que ultrapasse esse limite é rejeitado com ResourceExhausted (HTTP 429) e nada é gravado; um lote fora do intervalo de 1 a 25 é rejeitado com InvalidArgument (HTTP 400). A operação é apenas de acréscimo e não é idempotente, portanto tentar novamente após uma falha de transporte ambígua pode adicionar duplicatas e consumir capacidade. Conteúdo idêntico é permitido.
Parâmetros de caminho
ownerSlug string Obrigatório
repoName string Obrigatório
checkRunId string Obrigatório
Corpo da solicitação
annotations matriz Obrigatório
annotations[].annotationLevel string Obrigatório
notice, warning, failure.annotations[].message string Obrigatório
annotations[].title string
annotations[].rawDetails string
annotations[].location object
annotations[].location.path string Obrigatório
annotations[].location.startLine integer Obrigatório
annotations[].location.endLine integer Obrigatório
startLine.annotations[].location.columns object
startLine e endLine estiverem na mesma linha, e ambas as colunas devem ser enviadas juntas.annotations[].location.columns.startColumn integer
annotations[].location.columns.endColumn integer
startColumn.Campos da resposta
annotations matriz
annotations[].id string
annotations[].checkRunId string
annotations[].annotationLevel string
notice, warning, failure.annotations[].message string
annotations[].title string
annotations[].rawDetails string
annotations[].createdAt string
annotations[].updatedAt string
annotations[].location object
annotations[].location.path string
annotations[].location.startLine integer
annotations[].location.endLine integer
annotations[].location.columns object
annotations[].location.columns.startColumn integer
annotations[].location.columns.endColumn integer
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 } } ]}'Estrutura da resposta:
{ "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 } } ]}Requisitar novamente a execução de verificação
/v1/origin/repos/{ownerSlug}/{repoName}/check-runs/{checkRunId}/rerequestSolicita ao app que reportou um check run que o execute novamente. O Origin registra a solicitação na execução como rerequestedAt e notifica o app proprietário com repository.check_run.rerequested. O app responde publicando uma nova execução para o mesmo head SHA e key, seja uma execução nova ou uma atualização desta, o que limpa rerequestedAt e armazena o status publicado. Enquanto a solicitação estiver pendente, o status da execução é rerequested; sua conclusion e os tempos continuam descrevendo a tentativa substituída. A chamada retorna a execução com rerequestedAt definido e status rerequested.
A execução deve estar completed, deve ter isRerequestable, deve ser a tentativa atual para sua key e deve estar no head atual de uma pull request aberta. Qualquer outra situação retorna FailedPrecondition (HTTP 400).
Uma re-solicitação pode ficar pendente por execução. Uma solicitação repetida enquanto rerequestedAt estiver definida retorna AlreadyExists (HTTP 409 Conflict), e a execução volta a poder ser re-solicitada assim que o app proprietário responder. Qualquer entidade com repository:contents:write pode re-solicitar qualquer execução re-solicitável, independentemente do app que a reportou. Um checkRunId desconhecido, ou que pertença a outro repositório, retorna 404.
Parâmetros de caminho
ownerSlug string Obrigatório
repoName string Obrigatório
checkRunId string Obrigatório
cr_...).Corpo da solicitação
A solicitação não aceita campos. Envie um objeto JSON vazio.
Campos da resposta
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. Omitido quando desconhecido.checkSuite objeto
checkSuite.id string
sha string
key string
name string
status string
conclusion string
status for completed.detailsUrl string
externalUpdatedAt string
startedAt string
completedAt string
createdAt string
updatedAt string
externalId string
actor object
actor da suíte de verificações proprietária.actor.user object
actor.user.id string
actor.user.email string
actor.user.displayName string
actor.user.handle string
@. Presente apenas enquanto esse perfil estiver visível publicamente; omitido caso contrário.actor.app object
actor.app.id string
actor.app.displayName string
actor.serviceAccount object
actor.serviceAccount.id string
output object
output.title string
output.summary string
output.text string
deadlineAt string
isRerequestable boolean
rerequestedAt string
status é rerequested e a execução permanece no estado de verificação mais recente do commit e é exibida como pendente, com conclusion e os horários ainda contendo o resultado substituído; portanto, uma verificação obrigatória bloqueia a mesclagem até que o aplicativo responda.rerequestedBy objeto
actor. Presente sempre que rerequestedAt estiver definido e removido junto com ele.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 '{}'Formato da resposta:
{ "id": "cr_01k2ja2000e0080000000000g7", "repository": { "id": "repo_01k2ja2000e0080000000000q4", "name": "rocket", "owner": { "slug": "acme", "id": "ns_01k2ja2000e0080000000000p3", "type": "team" } }, "checkSuite": { "id": "crg_01k2ja2000e0080000000000h8" }, "sha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4", "key": "ci-8842-unit-tests", "name": "unit-tests", "status": "rerequested", "conclusion": "failure", "detailsUrl": "https://ci.acme.dev/runs/8842", "externalUpdatedAt": "2026-08-02T14:44:30Z", "startedAt": "2026-08-02T14:40:00Z", "completedAt": "2026-08-02T14:44:30Z", "createdAt": "2026-08-01T09:30:00Z", "updatedAt": "2026-08-02T15:02:10Z", "externalId": "run-8842", "actor": { "app": { "id": "app_01k2ja2000e0080000000000a1", "displayName": "Acme CI" } }, "output": { "title": "Unit tests", "summary": "3 of 128 tests failed." }, "isRerequestable": true, "rerequestedAt": "2026-08-02T15:02:10Z", "rerequestedBy": { "user": { "id": "user_01k2ja2000e0080000000000c3", "email": "[email protected]" } }}Obter suíte de verificação
/v1/origin/repos/{ownerSlug}/{repoName}/check-suites/{checkSuiteId}Retorna os metadados da suíte de verificação pelo id atribuído pelo servidor (crg_...). Não incorpora as execuções de verificação; use ListCheckRunsForSuite para obter as execuções da suíte.
Parâmetros de caminho
ownerSlug string Obrigatório
repoName string Obrigatório
checkSuiteId string Obrigatório
crg_...).Campos da resposta
id 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, user. Omitido quando desconhecido.sha string
key string
name string
detailsUrl string
createdAt string
updatedAt string
externalId string
actor object
actor.user object
actor.user.id string
actor.user.email string
actor.user.displayName string
actor.user.handle string
@. Presente apenas enquanto esse perfil estiver visível publicamente; omitido caso contrário.actor.app object
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'Formato da resposta:
{ "id": "crg_01k2ja2000e0080000000000h8", "repository": { "id": "repo_01k2ja2000e0080000000000q4", "name": "rocket", "owner": { "slug": "acme", "id": "ns_01k2ja2000e0080000000000p3", "type": "team" } }, "sha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4", "key": "ci-8842", "name": "CI", "detailsUrl": "https://ci.acme.dev/runs/8842", "createdAt": "2026-08-01T09:30:00Z", "updatedAt": "2026-08-02T14:45:00Z", "externalId": "build-8842", "actor": { "user": { "id": "user_01k2ja2000e0080000000000c3", "email": "[email protected]" } }}Listar check runs de uma suite
/v1/origin/repos/{ownerSlug}/{repoName}/check-suites/{checkSuiteId}/check-runsLista as execuções de verificação atuais de uma suíte. Quando uma chave de execução foi informada mais de uma vez na suíte, apenas a tentativa mais recente para essa chave é retornada; tentativas substituídas são omitidas. Publicar execução de verificação define qual tentativa é a mais recente. Uma execução que foi requisitada novamente permanece na listagem e aparece como pendente, com status rerequested e rerequestedAt definidos, e sua conclusion e os tempos (timings) das tentativas substituídas inalterados, até que o app que a possui responda. Leia uma tentativa substituída pelo seu próprio id com Obter execução de verificação. Paginado.
Parâmetros de caminho
ownerSlug string Obrigatório
repoName string Obrigatório
checkSuiteId string Obrigatório
crg_...).Parâmetros de consulta
pageSize integer
pageToken string
next_page_token de uma resposta anterior. Vazio na primeira página. Codifica o ID do último check-run visto no escopo desta suíte. O pageSize em uma solicitação de acompanhamento se aplica a essa página; omita-o para manter o tamanho de página anterior.Campos de resposta
checkRuns matriz
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. Omitido quando desconhecido.checkRuns[].checkSuite objeto
checkRuns[].checkSuite.id string
checkRuns[].sha string
checkRuns[].key string
checkRuns[].name string
checkRuns[].status string
checkRuns[].conclusion string
status for completed.checkRuns[].detailsUrl string
checkRuns[].externalUpdatedAt string
checkRuns[].startedAt string
checkRuns[].completedAt string
checkRuns[].createdAt string
checkRuns[].updatedAt string
checkRuns[].externalId string
checkRuns[].actor objeto
actor da suíte de verificação proprietária.checkRuns[].actor.user objeto
checkRuns[].actor.user.id string
checkRuns[].actor.user.email string
checkRuns[].actor.user.displayName string
checkRuns[].actor.user.handle string
@. Presente apenas enquanto esse perfil estiver visível publicamente; omitido caso contrário.checkRuns[].actor.app objeto
checkRuns[].actor.app.id string
checkRuns[].actor.app.displayName string
checkRuns[].actor.serviceAccount objeto
checkRuns[].actor.serviceAccount.id string
checkRuns[].output objeto
checkRuns[].output.title string
checkRuns[].output.summary string
checkRuns[].output.text string
checkRuns[].deadlineAt string
checkRuns[].isRerequestable boolean
checkRuns[].rerequestedAt string
status é rerequested e a execução permanece no estado de verificação mais recente do commit e é considerada pendente, com conclusion e os tempos ainda registrando o resultado suprimido, de modo que uma verificação obrigatória bloqueia a mesclagem até que o aplicativo responda.checkRuns[].rerequestedBy objeto
actor. Presente sempre que rerequestedAt estiver definido e removido junto com ele.nextPageToken string
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'Formato da resposta:
{ "checkRuns": [ { "id": "cr_01k2ja2000e0080000000000g7", "repository": { "id": "repo_01k2ja2000e0080000000000q4", "name": "rocket", "owner": { "slug": "acme", "id": "ns_01k2ja2000e0080000000000p3", "type": "team" } }, "checkSuite": { "id": "crg_01k2ja2000e0080000000000h8" }, "sha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4", "key": "ci-8842-unit-tests", "name": "unit-tests", "status": "completed", "conclusion": "success", "detailsUrl": "https://ci.acme.dev/runs/8842", "externalUpdatedAt": "2026-08-02T14:44:30Z", "startedAt": "2026-08-02T14:40:00Z", "completedAt": "2026-08-02T14:44:30Z", "createdAt": "2026-08-01T09:30:00Z", "updatedAt": "2026-08-02T14:45:00Z", "externalId": "run-8842", "actor": { "user": { "id": "user_01k2ja2000e0080000000000c3", "email": "[email protected]" } }, "output": { "title": "Unit tests", "summary": "128 tests passed.", "text": "All suites green." } } ]}Listar check runs de um commit
/v1/origin/repos/{ownerSlug}/{repoName}/commits/{sha}/check-runsLista as execuções de verificação atuais de um commit em todas as suítes: somente execuções pertencentes à tentativa mais recente de cada suíte e, dentro de cada suíte, somente a tentativa mais recente por chave de execução. Tentativas suprimidas são omitidas; Publicar execução de verificação define qual tentativa é a mais recente. Uma execução que foi requisitada novamente permanece na listagem e aparece como pendente, com status rerequested e rerequestedAt definidos, e sua conclusion e os tempos da tentativa suprimida inalterados, até que o app que a possui responda. Leia uma tentativa suprimida pelo seu próprio id com Obter execução de verificação. Opcionalmente filtrado por nome da verificação e por status. Paginado.
Os filtros se aplicam ao conjunto colapsado, portanto uma execução corresponde ao status de sua tentativa mais recente e um filtro nunca reexibe uma tentativa suprimida. Os tokens de página incorporam os filtros sob os quais foram emitidos, então um token reproduzido com filtros diferentes é rejeitado; reinicie a paginação quando um filtro mudar.
Parâmetros de caminho
ownerSlug string Obrigatório
repoName string Obrigatório
sha string Obrigatório
Parâmetros de consulta
pageSize integer
pageToken string
next_page_token de uma resposta anterior. Vazio na primeira página. Codifica o id do último check-run visto com escopo neste commit e nos filtros abaixo; reutilizar um token com filtros diferentes retorna InvalidArgument (HTTP 400). O pageSize em uma solicitação de acompanhamento se aplica apenas a essa página; omita-o para manter o tamanho de página anterior.checkName string
checkRuns[].name. Omita para listar execuções com qualquer nome.status string
queued, in_progress, completed, rerequested. Qualquer outro valor retorna InvalidArgument (HTTP 400). Omita para listar execuções em qualquer status.Campos de resposta
checkRuns matriz
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. Omitido quando desconhecido.checkRuns[].checkSuite objeto
checkRuns[].checkSuite.id string
checkRuns[].sha string
checkRuns[].key string
checkRuns[].name string
checkRuns[].status string
checkRuns[].conclusion string
status for completed.checkRuns[].detailsUrl string
checkRuns[].externalUpdatedAt string
checkRuns[].startedAt string
checkRuns[].completedAt string
checkRuns[].createdAt string
checkRuns[].updatedAt string
checkRuns[].externalId string
checkRuns[].actor object
actor da suíte de verificação proprietária.checkRuns[].actor.user objeto
checkRuns[].actor.user.id string
checkRuns[].actor.user.email string
checkRuns[].actor.user.displayName string
checkRuns[].actor.user.handle string
@. Presente apenas enquanto esse perfil estiver publicamente visível; caso contrário, é omitido.checkRuns[].actor.app object
checkRuns[].actor.app.id string
checkRuns[].actor.app.displayName string
checkRuns[].actor.serviceAccount object
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 é rerequested e a execução permanece no estado de verificação mais recente do commit e aparece como pendente, com conclusion e os horários ainda contendo o resultado substituído; assim, uma verificação obrigatória bloqueia a mesclagem até que o app responda.checkRuns[].rerequestedBy object
actor. Presente sempre que rerequestedAt estiver definido, e removido junto com ele.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'Formato da resposta:
{ "checkRuns": [ { "id": "cr_01k2ja2000e0080000000000g7", "repository": { "id": "repo_01k2ja2000e0080000000000q4", "name": "rocket", "owner": { "slug": "acme", "id": "ns_01k2ja2000e0080000000000p3", "type": "team" } }, "checkSuite": { "id": "crg_01k2ja2000e0080000000000h8" }, "sha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4", "key": "ci-8842-unit-tests", "name": "unit-tests", "status": "completed", "conclusion": "success", "detailsUrl": "https://ci.acme.dev/runs/8842", "externalUpdatedAt": "2026-08-02T14:44:30Z", "startedAt": "2026-08-02T14:40:00Z", "completedAt": "2026-08-02T14:44:30Z", "createdAt": "2026-08-01T09:30:00Z", "updatedAt": "2026-08-02T14:45:00Z", "externalId": "run-8842", "actor": { "user": { "id": "user_01k2ja2000e0080000000000c3", "email": "[email protected]" } }, "output": { "title": "Unit tests", "summary": "128 tests passed.", "text": "All suites green." } } ]}Listar suítes de verificação para um commit
/v1/origin/repos/{ownerSlug}/{repoName}/commits/{sha}/check-suitesLista as suítes de verificação relatadas para um commit. Retorna apenas a tentativa mais recente de cada suíte, por ator que reporta e chave da suíte; tentativas substituídas são omitidas, e Post Check Run define qual tentativa é a mais recente. Leia uma tentativa substituída pelo seu próprio id com Get Check Suite. Retorna apenas os metadados da suíte (sem execuções incorporadas). Paginado.
Parâmetros de caminho
ownerSlug string Obrigatório
repoName string Obrigatório
sha string Obrigatório
Parâmetros de consulta
pageSize integer
pageToken string
next_page_token. Vazio na primeira página. Codifica o ID da última check-suite vista no escopo deste commit. O pageSize em uma solicitação subsequente se aplica a essa página; omita-o para manter o tamanho de página anterior.Campos da resposta
checkSuites matriz
checkSuites[].id string
checkSuites[].repository objeto
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. Omitido quando desconhecido.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 apenas enquanto esse perfil estiver visível publicamente; caso contrário, omitido.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'Formato da resposta:
{ "checkSuites": [ { "id": "crg_01k2ja2000e0080000000000h8", "repository": { "id": "repo_01k2ja2000e0080000000000q4", "name": "rocket", "owner": { "slug": "acme", "id": "ns_01k2ja2000e0080000000000p3", "type": "team" } }, "sha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4", "key": "ci-8842", "name": "CI", "detailsUrl": "https://ci.acme.dev/runs/8842", "createdAt": "2026-08-01T09:30:00Z", "updatedAt": "2026-08-02T14:45:00Z", "externalId": "build-8842", "actor": { "user": { "id": "user_01k2ja2000e0080000000000c3", "email": "[email protected]" } } } ]}Commits e conteúdo
Um commit separa os metadados do objeto Git em commit dos relacionamentos de nível superior do repositório. As respostas de listagem omitem stats; Obter commit inclui stats agregadas de todo o commit. Os arquivos alterados são retornados apenas pela coleção paginada Listar arquivos do commit. author e committer são identidades Git registradas no commit, não objetos de usuário do Origin.
Uma comparação é apenas um resumo: nunca incorpora listas de commits ou diffs de arquivos. status é exatamente identical, ahead, behind ou diverged; aheadBy e behindBy são contagens de commits. baseCommit, headCommit e mergeBaseCommit usam a projeção esparsa do commit (sem stats ou arquivos).
Listar commits
/v1/origin/repos/{ownerSlug}/{repoName}/commitsLista os commits de um branch ou de uma ref inicial.
Os resultados da listagem omitem stats. Use Get Commit para obter os stats agregados e List Commit Files para o diff paginado dos arquivos.
Parâmetros de caminho
ownerSlug string Obrigatório
repoName string Obrigatório
Parâmetros de consulta
sha string
HEAD) a partir da qual iniciar a listagem. Vazio significa a branch padrão do repositório.pageSize integer
pageToken string
nextPageToken. Vazio na primeira página. Codifica o ref inicial, a posição de percurso e os filtros de e-mail; sha, pageSize, authorEmails e committerEmails são ignorados quando um token é fornecido. Uma página filtrada pode conter menos de pageSize commits, ou nenhum, mesmo que nextPageToken esteja definido. Continue paginando até que ele fique vazio.authorEmails matriz
committerEmails matriz
authorEmails; vazio significa sem filtro. Quando os dois filtros estão definidos, o commit precisa corresponder às duas listas. Cada página verifica no máximo 1.000 commits em busca de correspondências.Campos da resposta
commits matriz
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 matriz
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'Estrutura da resposta:
{ "commits": [ { "sha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4", "commit": { "author": { "name": "Jane Doe", "email": "[email protected]", "date": "2026-08-01T09:30:00Z" }, "committer": { "name": "Jane Doe", "email": "[email protected]", "date": "2026-08-01T09:30:00Z" }, "message": "Add launch telemetry", "tree": { "sha": "a7b6c5d4e3f2a1b0c9d8e7f6a5b4c3d2e1f0a9b8" } }, "parents": [ { "sha": "3b1f9c2d8a7e6f5049c8b7a6d5e4f3a2b1c0d9e8" } ], "stats": { "additions": 128, "deletions": 46, "total": 174 } } ]}Consultar commit
/v1/origin/repos/{ownerSlug}/{repoName}/commits/{sha}Retorna um único commit por SHA ou ref com as stats agregadas do commit inteiro. Não inclui arquivos alterados; use Listar arquivos do commit.
author e committer são identidades do git registradas no commit, não objetos de usuário do Origin.
Parâmetros de caminho
ownerSlug string Obrigatório
repoName string Obrigatório
sha string Obrigatório
HEAD) do commit a ser buscado. Um SHA abreviado é resolvido da mesma forma que em Consultar commit do Git.Campos da resposta
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 matriz
parents[].sha string
stats objeto
stats.additions integer
stats.deletions integer
stats.total integer
curl --request GET \ --url 'https://api.cursor.com/v1/origin/repos/OWNER_SLUG/REPO_NAME/commits/SHA' \ --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN'formato de resposta:
{ "sha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4", "commit": { "author": { "name": "Jane Doe", "email": "[email protected]", "date": "2026-08-01T09:30:00Z" }, "committer": { "name": "Jane Doe", "email": "[email protected]", "date": "2026-08-01T09:30:00Z" }, "message": "Add launch telemetry", "tree": { "sha": "a7b6c5d4e3f2a1b0c9d8e7f6a5b4c3d2e1f0a9b8" } }, "parents": [ { "sha": "3b1f9c2d8a7e6f5049c8b7a6d5e4f3a2b1c0d9e8" } ], "stats": { "additions": 128, "deletions": 46, "total": 174 }}Listar arquivos de um commit
/v1/origin/repos/{ownerSlug}/{repoName}/commits/{sha}/filesLista os arquivos alterados por um commit.
sha pode ser um SHA de commit, branch, tag ou ref simbólica como HEAD. Por padrão, os resultados trazem 30 arquivos e são limitados a 100. Um token de página fixa o commit resolvido e o cursor de arquivo; em solicitações posteriores, sha deve corresponder ao token. Cada arquivo inclui filename, status, additions, deletions, changes, patch e previousFilename quando renomeado ou copiado. patch fica vazio para arquivos binários.
Parâmetros de caminho
ownerSlug string Obrigatório
repoName string Obrigatório
sha string Obrigatório
HEAD) do commit cujos arquivos devem ser listados. Um SHA abreviado é resolvido da mesma forma que em Obter commit do Git.Parâmetros de consulta
pageSize integer
pageToken string
next_page_token de uma resposta anterior. Vazio na primeira página. O token fixa o commit resolvido e o cursor do arquivo, portanto sha em uma solicitação subsequente deve corresponder ao token. pageSize em uma solicitação subsequente se aplica a essa página; omita-o para manter o tamanho de página anterior.Campos de resposta
files matriz
files[].filename string
files[].status string
files[].additions integer
files[].deletions integer
files[].changes integer
files[].patch string
files[].previousFilename string
nextPageToken string
curl --request GET \ --url 'https://api.cursor.com/v1/origin/repos/OWNER_SLUG/REPO_NAME/commits/SHA/files' \ --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN'Formato de resposta:
{ "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, refs ou tags em relação à base de merge. basehead é "{base}...{head}"; refs que contêm "/" devem usar o SHA correspondente.
base e head podem ser, cada um, um SHA, branch, tag ou ref simbólica como HEAD. A resposta é um resumo não paginado: status é identical, ahead, behind ou diverged; os três objetos de commit são esparsos e omitem stats e arquivos. Nenhum campo totalCommits, commits embutidos ou files é retornado. Históricos não relacionados retornam 404.
Parâmetros de caminho
ownerSlug string Obrigatório
repoName string Obrigatório
basehead string Obrigatório
"{base}...{head}", em que cada revisão pode ser um SHA, uma branch, uma tag ou uma referência simbólica como HEAD.Campos da resposta
status string
aheadBy integer
behindBy integer
baseCommit object
baseCommit.sha string
baseCommit.commit object
baseCommit.commit.author object
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 matriz
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 matriz
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 matriz
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'Formato da resposta:
{ "status": "ahead", "aheadBy": 2, "behindBy": 0, "baseCommit": { "sha": "3b1f9c2d8a7e6f5049c8b7a6d5e4f3a2b1c0d9e8", "commit": { "author": { "name": "Jane Doe", "email": "[email protected]", "date": "2026-08-01T09:30:00Z" }, "committer": { "name": "Jane Doe", "email": "[email protected]", "date": "2026-08-01T09:30:00Z" }, "message": "Add launch telemetry", "tree": { "sha": "a7b6c5d4e3f2a1b0c9d8e7f6a5b4c3d2e1f0a9b8" } }, "parents": [ { "sha": "3b1f9c2d8a7e6f5049c8b7a6d5e4f3a2b1c0d9e8" } ], "stats": { "additions": 128, "deletions": 46, "total": 174 } }, "headCommit": { "sha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4", "commit": { "author": { "name": "Jane Doe", "email": "[email protected]", "date": "2026-08-01T09:30:00Z" }, "committer": { "name": "Jane Doe", "email": "[email protected]", "date": "2026-08-01T09:30:00Z" }, "message": "Add launch telemetry", "tree": { "sha": "a7b6c5d4e3f2a1b0c9d8e7f6a5b4c3d2e1f0a9b8" } }, "parents": [ { "sha": "3b1f9c2d8a7e6f5049c8b7a6d5e4f3a2b1c0d9e8" } ], "stats": { "additions": 128, "deletions": 46, "total": 174 } }, "mergeBaseCommit": { "sha": "3b1f9c2d8a7e6f5049c8b7a6d5e4f3a2b1c0d9e8", "commit": { "author": { "name": "Jane Doe", "email": "[email protected]", "date": "2026-08-01T09:30:00Z" }, "committer": { "name": "Jane Doe", "email": "[email protected]", "date": "2026-08-01T09:30:00Z" }, "message": "Add launch telemetry", "tree": { "sha": "a7b6c5d4e3f2a1b0c9d8e7f6a5b4c3d2e1f0a9b8" } }, "parents": [ { "sha": "3b1f9c2d8a7e6f5049c8b7a6d5e4f3a2b1c0d9e8" } ], "stats": { "additions": 128, "deletions": 46, "total": 174 } }}Listar arquivos da comparação
/v1/origin/repos/{ownerSlug}/{repoName}/compare/{basehead}/filesLista os arquivos alterados por uma comparação: o diff de head em relação à base de merge entre base e head.
basehead é "{base}...{head}"; refs contendo "/" devem usar seu SHA. A lista de arquivos sempre corresponde ao resumo de Comparar commits, então uma comparação identical ou behind retorna uma lista vazia, e históricos não relacionados retornam 404. Os resultados padrão são 30 arquivos e são limitados a 100. Cada arquivo contém os mesmos campos de Listar arquivos de um commit.
Parâmetros de caminho
ownerSlug string Obrigatório
repoName string Obrigatório
basehead string Obrigatório
"{base}...{head}", em que qualquer uma das revisões pode ser um SHA, branch, tag ou referência simbólica, como HEAD.Parâmetros de consulta
pageSize integer
pageToken string
next_page_token de uma resposta anterior. Vazio na primeira página. O token está vinculado à comparação resolvida e ao cursor do arquivo, portanto basehead em uma solicitação subsequente deve corresponder ao token. O Origin resolve novamente a comparação em cada página; quando os commits dele tiverem avançado desde a emissão do token, a solicitação retorna InvalidArgument (HTTP 400) e a listagem deve ser reiniciada a partir da primeira página. pageSize em uma solicitação subsequente se aplica somente a essa página; omita-o para manter o tamanho de página anterior.Campos de resposta
files matriz
files[].filename string
files[].status string
files[].additions integer
files[].deletions integer
files[].changes integer
files[].patch string
files[].previousFilename string
nextPageToken string
curl --request GET \ --url 'https://api.cursor.com/v1/origin/repos/OWNER_SLUG/REPO_NAME/compare/BASE...HEAD/files' \ --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN'Formato de resposta:
{ "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" } ]}Obter conteúdo
/v1/origin/repos/{ownerSlug}/{repoName}/contentsRetorna o conteúdo de um arquivo ou diretório em uma ref. O caminho é informado pelo parâmetro de consulta path (com suporte a caminhos aninhados); omita-o ou deixe-o vazio para acessar o diretório raiz do repositório. Arquivos maiores que 1 MiB (decodificados) são rejeitados com FailedPrecondition (HTTP 400).
Arquivos contêm conteúdo em base64. Diretórios contêm filhos diretos em entries. As entradas de diretório são representações resumidas dos itens filhos e contêm type, name, path, sha e size; consulte o caminho de um filho para ler seu conteúdo.
Parâmetros de caminho
ownerSlug string Obrigatório
repoName string Obrigatório
Parâmetros de consulta
path string
ref string
HEAD) a ser lida. Se estiver vazio, usa a branch padrão do repositório.Campos de resposta
type string
encoding string
size string
name string
path string
sha string
content string
entries matriz
curl --request GET \ --url 'https://api.cursor.com/v1/origin/repos/OWNER_SLUG/REPO_NAME/contents' \ --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN'Formato de resposta:
{ "type": "file", "encoding": "base64", "size": "312", "name": "telemetry.ts", "path": "src/telemetry.ts", "sha": "c9d8e7f6a5b4c3d2e1f0a9b8c7d6e5f4a3b2c1d0", "content": "Y29uc29sZS5sb2coImxhdW5jaCIpOwo="}Obter conteúdo em lote
/v1/origin/repos/{ownerSlug}/{repoName}/contents:batchGetRetorna o conteúdo de vários caminhos explícitos em um ref em uma única solicitação. Cada caminho solicitado gera um resultado indicando se foi encontrado; um caminho encontrado possui a mesma estrutura Content do GetContents (arquivos em base64, diretórios com entries imediatas, links simbólicos como arquivos). Os caminhos são correspondidos exatamente, sem globs ou padrões, e no máximo 20 podem ser solicitados; duplicatas são removidas. Os resultados preservam a ordem da primeira ocorrência na solicitação. Um único arquivo maior que o limite de 1 MiB do Get Contents faz com que todo o lote falhe com FailedPrecondition (HTTP 400). Usa POST porque a lista de caminhos é enviada no corpo da requisição.
Parâmetros de caminho
ownerSlug string Obrigatório
repoName string Obrigatório
Corpo da solicitação
paths matriz Obrigatório
ref string
HEAD) para leitura. Se estiver vazio, significa a branch padrão do repositório.Campos de resposta
results matriz
results[].path string
results[].found boolean
results[].content objeto
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 matriz
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"}'formato de resposta:
{ "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}:grepPesquisa o texto dos arquivos do repositório em uma ref e retorna as linhas correspondentes, além das linhas de contexto ao redor que forem solicitadas. A busca é orientada a linhas: um pattern nunca corresponde através de uma quebra de linha, e cada entrada retornada é uma única linha. O repositório é escaneado a cada solicitação, portanto não há paginação nem cursor; a resposta só é completa quando limitHit é false. Um repositório vazio, sem referências do Git, não retorna correspondências e traz limitHit como false. Usa POST porque os parâmetros de busca trafegam no corpo da solicitação.
Parâmetros de caminho
ownerSlug string Obrigatório
repoName string Obrigatório
Corpo da solicitação
ref string
HEAD) para pesquisar. Vazio significa a branch padrão do repositório.query string Obrigatório
literal para procurar o texto exatamente. Espaços em branco são significativos e são pesquisados conforme fornecidos. Quando literal é false, a correspondência sem diferenciar maiúsculas de minúsculas é indicada por (?i) no início do padrão (por exemplo (?i)launch) e a correspondência de palavra inteira é \b ao redor dele (por exemplo \blaunch\b). Um padrão vazio retorna InvalidArgument (HTTP 400). Tamanho máximo em UTF-8: 4096 bytes.literal boolean
query como texto exato, e não como expressão regular.caseInsensitive boolean
literal é true. Ignorado em buscas por expressão regular; escreva (?i) no início de query.wholeWord boolean
literal é true. Ignorado em buscas por expressão regular; nesse caso, escreva \b ao redor do padrão.contextBefore integer
contextAfter integer
filterPath string
includes matriz
/ corresponde em qualquer depth, * corresponde dentro de um único segmento de caminho e ** corresponde entre segmentos. Quando há algum include, um caminho que não corresponda a nenhum deles não é pesquisado. No máximo 20 entries. Tamanho UTF-8 máximo por padrão: 4096 bytes.excludes matriz
includes. Um exclude prevalece sobre um include, e excluir um directory deixa de fora tudo o que está dentro dele. No máximo 20 entries. Tamanho UTF-8 máximo por pattern: 4096 bytes.maxResults integer
Campos de resposta
matches matriz
matches[].path string
matches[].lineNumber integer
matches[].line string
matches[].kind string
match, context.matches[].submatches matriz
line. Sempre vazio em uma linha de contexto. Quando limitHit é true, a última linha que contém correspondência pode trazer apenas parte de suas correspondências. Intervalos que ficam totalmente além de line são omitidos, e intervalos que se estenderiam além de line são reduzidos aos bytes que restam.matches[].submatches[].start integer
matches[].submatches[].end integer
limitHit boolean
maxResults. Restrinja query, filterPath ou as listas de glob para pesquisar um conjunto menor de arquivos.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}Dados do Git
Objetos Git de baixo nível. Leituras exigem repository:contents:read, e um repositório vazio retorna 409. Create Commit From Files e Create referência do Git gravam objetos Git e exigem repository:contents:write.
Além de branches e tags, Get referência do Git lê a prévia de merge de um pull request em pull/{pullNumber}/merge (normalizado para refs/pull/{pullNumber}/merge): um commit que mergeia o head atual do pull request na ponta do seu base branch no momento da última atualização. O Origin a atualiza quando o pull request é criado, quando é feito push no seu head, quando ele é redirecionado para outro alvo e quando é reaberto, antes da publicação dos eventos de webhook pull_request.* correspondentes e dentro de um limite de tempo definido; uma atualização que não termina a tempo mantém a referência anterior, e os eventos são publicados mesmo assim. O Origin não a atualiza quando o base branch avança por conta própria, e exclui a referência quando o merge tem conflitos, então um 404 em um pull request aberto significa conflitos ou uma prévia ainda não preparada. Cada versão do pull request também informa seu próprio merge de teste em version.potentialMergeCommit, cujo state distingue esses dois casos; consulte Pull requests. O mergeCommitSha do pull request é um commit diferente, definido somente após ele ter sido mergeado.
Obter blob
/v1/origin/repos/{ownerSlug}/{repoName}/git/blobs/{sha}Retorna um objeto blob do Git pelo SHA. Por padrão, a resposta é um JSON com content em base64 encapsulado em MIME. Na interface REST, passe Accept: application/vnd.origin.raw+json (ou application/vnd.origin.raw) para receber os bytes brutos do blob. Blobs maiores que 4 MiB (decodificados) são rejeitados; para arquivos maiores, clone o repositório por Git HTTPS. Repositórios vazios retornam 409 Conflict.
Parâmetros de caminho
ownerSlug string Obrigatório
repoName string Obrigatório
sha string Obrigatório
Campos de resposta
sha string
size integer
encoding string
content string
curl --request GET \ --url 'https://api.cursor.com/v1/origin/repos/OWNER_SLUG/REPO_NAME/git/blobs/SHA' \ --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN'Formato de resposta:
{ "sha": "c9d8e7f6a5b4c3d2e1f0a9b8c7d6e5f4a3b2c1d0", "size": 312, "encoding": "base64", "content": "Y29uc29sZS5sb2coImxhdW5jaCIpOwo="}Obter commit do Git
/v1/origin/repos/{ownerSlug}/{repoName}/git/commits/{sha}Retorna um objeto de commit do Git pelo SHA (ou por uma revisão resolvível). Esta é a estrutura de commit de baixo nível do Git Database (author/message/tree planos), não o recurso de nível mais alto GetCommit em /commits/{sha}. sha aceita um SHA de commit, branch, tag ou referência simbólica como HEAD. Repositórios vazios retornam 409 Conflict.
Parâmetros de caminho
ownerSlug string Obrigatório
repoName string Obrigatório
sha string Obrigatório
HEAD. Uma abreviação precisa ter pelo menos 5 caracteres hexadecimais e é resolvida apenas entre objetos de commit; a resolução falha se nenhum commit ou mais de um commit corresponder a ela.Campos da resposta
sha string
author object
author.name string
author.email string
author.date string
committer object
committer.name string
committer.email string
committer.date string
message string
tree object
tree.sha string
parents matriz
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'Formato da resposta:
{ "sha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4", "author": { "name": "Jane Doe", "email": "[email protected]", "date": "2026-08-01T09:30:00Z" }, "committer": { "name": "Jane Doe", "email": "[email protected]", "date": "2026-08-01T09:30:00Z" }, "message": "Add launch telemetry", "tree": { "sha": "a7b6c5d4e3f2a1b0c9d8e7f6a5b4c3d2e1f0a9b8" }, "parents": [ { "sha": "3b1f9c2d8a7e6f5049c8b7a6d5e4f3a2b1c0d9e8" } ]}Criar commit a partir de arquivos
/v1/origin/repos/{ownerSlug}/{repoName}/git/commits:createFromFilesCria um commit em uma branch a partir de alterações inline de arquivos e avança a branch até ele.
As alterações são aplicadas à tree em expectedHeadSha, que se torna o parent do novo commit. Uma branch que tenha sido movida ou que não exista, um conjunto de alterações que deixe a tree inalterada, a exclusão de um path que a tree não contém, uma gravação bloqueada por um ruleset de push e um repositório cujo conteúdo é espelhado de outro host retornam, cada um, FailedPrecondition (HTTP 400).
Uma solicitação comporta no máximo 1.000 alterações de arquivo, 8 MiB por arquivo e 32 MiB de conteúdo no total. Exceder um limite, repetir um caminho ou enviar um campo malformado retorna InvalidArgument (HTTP 400), com violações de campo em google.rpc.BadRequest indicando a entrada files[i] problemática.
O branch já deve existir. Primeiro, crie-o com Create Git Ref e depois faça commit nele.
Parâmetros de path
ownerSlug string Obrigatório
repoName string Obrigatório
Corpo da solicitação
targetBranch string Obrigatório
<branch>, heads/<branch> ou refs/heads/<branch>. O branch já deve existir. HEAD é rejeitado em qualquer grafia.expectedHeadSha string Obrigatório
message string Obrigatório
author object Obrigatório
author.name string Obrigatório
author.email string Obrigatório
committer object
author como valor padrão quando omitido.committer.name string
committer estiver presente.committer.email string
committer estiver presente.files matriz Obrigatório
files[].path string Obrigatório
/ como separador, por exemplo: docs/changelog.md.files[].content string
files[].encoding. Cria o arquivo ou substitui seu conteúdo. Defina exatamente um entre files[].content e files[].delete.files[].delete boolean
true quando definido. Defina exatamente um entre files[].content e files[].delete.files[].encoding string
files[].content. Valores permitidos: utf-8 (padrão), base64. Ignorado em exclusões.files[].mode string
files[].content. Valores permitidos: file (padrão), executable, symlink, em que o conteúdo é o destino do link. Ignorado em exclusões.Campos da resposta
sha string
treeSha string
previousHeadSha string
curl --request POST \ --url 'https://api.cursor.com/v1/origin/repos/OWNER_SLUG/REPO_NAME/git/commits:createFromFiles' \ --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN' \ --header 'Content-Type: application/json' \ --data '{ "targetBranch": "feature/login", "expectedHeadSha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4", "message": "Add login telemetry", "author": { "name": "Jane Doe", "email": "[email protected]" }, "files": [ { "path": "src/login/telemetry.ts", "content": "export const LOGIN_EVENT = 1;" }, { "path": "assets/login.png", "content": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNkYPhfDwAChwGA60e6kgAAAABJRU5ErkJggg==", "encoding": "base64" }, { "path": "src/login/legacy.ts", "delete": true } ]}'Formato da resposta:
{ "sha": "5c4d3e2f1a0b9c8d7e6f5a4b3c2d1e0f9a8b7c6d", "treeSha": "a7b6c5d4e3f2a1b0c9d8e7f6a5b4c3d2e1f0a9b8", "previousHeadSha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4"}Obter referência do Git
/v1/origin/repos/{ownerSlug}/{repoName}/git/ref/{ref}Retorna uma única referência do Git pelo nome. ref normalmente é heads/<branch> ou tags/<tag> (com ou sem refs/ no início), ou o HEAD simbólico. Apenas correspondências exatas; use ListMatchingGitRefs para prefixos. Repositórios vazios retornam 409 Conflict.
pull/<number>/merge é a prévia de merge de uma pull request: um commit que faz merge do head atual dela na ponta da ramificação base dela a partir da última atualização. Ela é um commit diferente de mergeCommitSha da pull request, que é definido apenas quando a pull request sofre merge. O version.potentialMergeCommit da pull request informa o merge de teste por versão: enquanto uma versão for a mais recente e seu state for prepared, seu sha será o commit para o qual esta referência do Git aponta.
O Origin atualiza a prévia quando uma pull request é criada, quando seu head recebe push, quando seu destino é alterado e quando ela é reaberta, antes da publicação dos eventos de webhook pull_request.* correspondentes e dentro de um limite de tempo definido. Uma atualização que não termina a tempo mantém a referência anterior, e os eventos ainda são publicados. O Origin não a atualiza apenas porque a ramificação base avançou e exclui a referência quando há conflitos de merge; portanto, um 404 em uma pull request aberta significa que há conflitos de merge ou que a prévia ainda não está preparada.
Parâmetros de caminho
ownerSlug string Obrigatório
repoName string Obrigatório
ref string Obrigatório
heads/<branch> ou tags/<tag>; refs/ no início é aceito e normalizado. O HEAD simbólico também é aceito (retornado como ref: "HEAD" com o commit de ponta), assim como pull/<number>/merge para a prévia de merge de uma pull request. Correspondência exata do nome completo da referência do Git.Campos de resposta
ref string
object object
object.type é "tag" e object.sha é o SHA do objeto de tag.object.sha string
object.type string
curl --request GET \ --url 'https://api.cursor.com/v1/origin/repos/OWNER_SLUG/REPO_NAME/git/ref/REF' \ --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN'Response shape:
{ "ref": "refs/heads/main", "object": { "sha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4", "type": "commit" }}Criar Git Ref
/v1/origin/repos/{ownerSlug}/{repoName}/git/refsCria uma referência de branch apontando para um commit existente.
Somente referências de branch podem ser criadas. Uma tag ou qualquer outro namespace de referência, e um sha que não seja o hex SHA completo de um commit do repositório, retornam InvalidArgument (HTTP 400). Criar uma branch que já aponta para sha é bem-sucedido e retorna a referência existente; uma branch que existe em qualquer outro commit retorna AlreadyExists (HTTP 409 Conflict). Uma criação bloqueada por um ruleset de push, ou em um repositório cujo conteúdo é espelhado de outro host, retorna FailedPrecondition (HTTP 400).
Path Parameters
ownerSlug string Obrigatório
repoName string Obrigatório
Request Body
ref string Obrigatório
refs/heads/<branch> ou heads/<branch>.sha string Obrigatório
Response Fields
ref string
object object
object.type é "commit".object.sha string
object.type string
curl --request POST \ --url 'https://api.cursor.com/v1/origin/repos/OWNER_SLUG/REPO_NAME/git/refs' \ --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN' \ --header 'Content-Type: application/json' \ --data '{ "ref": "refs/heads/feature/login", "sha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4"}'Formato da resposta:
{ "ref": "refs/heads/feature/login", "object": { "sha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4", "type": "commit" }}Excluir referência do Git
/v1/origin/repos/{ownerSlug}/{repoName}/git/refs/{ref}Exclui uma referência de branch. O corpo da resposta fica vazio.
Somente referências de branch podem ser excluídas. Um branch inexistente retorna 404. O default branch do repositório, um branch protegido por uma regra de exclusão e um repositório cujo conteúdo é espelhado de outro host retornam FailedPrecondition (HTTP 400). Pull requests cujo head é o branch excluído são fechados, como ocorre após uma exclusão por push. Um branch cuja ponta muda enquanto a exclusão está em andamento falha com FailedPrecondition (HTTP 400) ou Aborted (HTTP 409 Conflict); repita a operação para excluir a nova ponta.
Parâmetros de caminho
ownerSlug string Obrigatório
repoName string Obrigatório
ref string Obrigatório
refs/heads/<branch> ou heads/<branch>.Campos de resposta
Solicitações bem-sucedidas não retornam corpo da resposta.
curl --request DELETE \ --url 'https://api.cursor.com/v1/origin/repos/OWNER_SLUG/REPO_NAME/git/refs/REF' \ --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN'Resposta:
204 No ContentListar referências do Git correspondentes
/v1/origin/repos/{ownerSlug}/{repoName}/git/matching-refsLista referências do Git cujos nomes começam com o prefixo fornecido. As respostas REST retornam diretamente uma matriz JSON (por meio de response_body). Uma barra no final de ref é preservada (heads/ → refs/heads/). O HEAD simbólico é correspondido exatamente (não está em refs/). Repositórios vazios retornam 409 Conflict.
Parâmetros de caminho
ownerSlug string Obrigatório
repoName string Obrigatório
Parâmetros de consulta
ref string
heads/<prefix> ou tags/<prefix>; refs/ no início é aceito e normalizado. Se vazio, lista todas as referências do Git (vinculação REST sem um segmento de caminho final).Campos de resposta
A resposta é uma matriz. Cada item contém:
ref string
object object
object.type é "tag" e object.sha é o SHA do objeto de tag.object.sha string
object.type string
curl --request GET \ --url 'https://api.cursor.com/v1/origin/repos/OWNER_SLUG/REPO_NAME/git/matching-refs' \ --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN'Formato de resposta:
{ "refs": [ { "ref": "refs/heads/main", "object": { "sha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4", "type": "commit" } } ]}Listar referências do Git correspondentes por caminho
/v1/origin/repos/{ownerSlug}/{repoName}/git/matching-refs/{ref}Lista referências do Git cujos nomes começam com o prefixo informado. As respostas REST retornam diretamente uma matriz JSON (via response_body). Uma barra final em ref é preservada (heads/ → refs/heads/). O HEAD simbólico corresponde exatamente (não está em refs/). Repositórios vazios retornam 409 Conflict.
Parâmetros de caminho
ownerSlug string Obrigatório
repoName string Obrigatório
ref string Obrigatório
heads/<prefix> ou tags/<prefix>; um refs/ inicial é aceito e normalizado. Vazio lista todas as referências do Git (vinculação REST sem segmento de caminho final).Campos de resposta
A resposta é uma matriz. Cada item contém:
ref string
object object
object.type é "tag" e object.sha é o SHA do objeto de tag.object.sha string
object.type string
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'formato de resposta:
{ "refs": [ { "ref": "refs/heads/main", "object": { "sha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4", "type": "commit" } } ]}Obter tag
/v1/origin/repos/{ownerSlug}/{repoName}/git/tags/{sha}Retorna um objeto de tag anotada do Git pelo SHA. Tags leves não são objetos de tag e retornam NotFound. Repositórios vazios retornam 409 Conflict.
Parâmetros de caminho
ownerSlug string Obrigatório
repoName string Obrigatório
sha string Obrigatório
Campos da resposta
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'Formato da resposta:
{ "sha": "e1f0a9b8c7d6e5f4a3b2c1d0e9f8a7b6c5d4e3f2", "tag": "v1.2.0", "message": "Release v1.2.0", "tagger": { "name": "Jane Doe", "email": "[email protected]", "date": "2026-08-01T09:30:00Z" }, "object": { "sha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4", "type": "commit" }}Obter árvore
/v1/origin/repos/{ownerSlug}/{repoName}/git/trees/{sha}Retorna um objeto tree do Git pelo SHA ou por uma revisão resolvível. sha aceita um SHA de tree, SHA de commit, branch, tag ou referência simbólica como HEAD. Defina recursive=true (ou 1) para percorrer toda a árvore; omitir o parâmetro ou passar qualquer outro valor lista apenas os filhos imediatos. Listagens recursivas são truncadas em 100.000 entradas ou 7 MiB e definem truncated=true. Repositórios vazios retornam 409 Conflict.
Parâmetros de caminho
ownerSlug string Obrigatório
repoName string Obrigatório
sha string Obrigatório
HEAD.Parâmetros de consulta
recursive boolean
true e 1 ativam a recursão; omitir o parâmetro ou passar qualquer outro valor (incluindo false e 0) lista apenas os filhos imediatos.Campos da resposta
sha string
tree matriz
tree[].path string
tree[].mode string
tree[].type string
tree[].sha string
tree[].size integer
int32 garante que o JSON REST emita um número; blobs individuais com mais de 2 GiB não podem ser representados.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'Formato da resposta:
{ "sha": "a7b6c5d4e3f2a1b0c9d8e7f6a5b4c3d2e1f0a9b8", "tree": [ { "path": "src/telemetry.ts", "mode": "100644", "type": "blob", "sha": "c9d8e7f6a5b4c3d2e1f0a9b8c7d6e5f4a3b2c1d0", "size": 312 } ], "truncated": false}Grants
Um grant vincula um principal a um repositório ou a um owner com uma permissão. Esses endpoints leem, definem e removem os grants mantidos diretamente em um resource, permitindo que alterações de acesso sejam automatizadas por script e revisadas como código. As gravações reutilizam as verificações por trás da Codebase permissions UI e registram os mesmos eventos de auditoria repository.access_changed e namespace.access_changed. Para conhecer os tipos de principal, as duas escalas de permissão e como os grants em nível de owner interagem com os de nível de repositório, leia API de grants do Origin.
Listar Concessões do Repositório
/v1/origin/repos/{ownerSlug}/{repoName}/grantsLista os usuários, grupos e grupos da equipe proprietária que possuem uma permissão concedida diretamente em um repositório. Permissões herdadas do proprietário do repositório não estão incluídas.
Parâmetros de caminho
ownerSlug string Obrigatório
repoName string Obrigatório
Parâmetros de consulta
pageSize integer
pageToken string
next_page_token de uma resposta anterior. Vazio na primeira página. O pageSize em uma solicitação de acompanhamento se aplica a essa página; omita-o para manter o tamanho de página anterior.Campos de resposta
grants matriz
pageSize.grants[].user object
user, group ou teamGroup está presente.grants[].user.id string
user_.grants[].user.email string
grants[].user.displayName string
grants[].user.handle string
@. Presente apenas enquanto esse perfil estiver visível publicamente; caso contrário, é omitido.grants[].group object
grants[].group.id string
grp_.grants[].teamGroup objeto
grants[].teamGroup.kind string
members, admins.grants[].permission string
read, write, admin, custom. custom indica uma política personalizada, que o Upsert Repository Grant não aceita.repository object
nextPageToken string
curl --request GET \ --url 'https://api.cursor.com/v1/origin/repos/{ownerSlug}/{repoName}/grants' \ --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN'Formato de resposta:
{ "grants": [ { "group": { "id": "grp_01k2ja2000e0080000000000n2" }, "permission": "admin" }, { "teamGroup": { "kind": "admins" }, "permission": "admin" }, { "teamGroup": { "kind": "members" }, "permission": "write" }, { "user": { "id": "user_01k2ja2000e0080000000000c3", "email": "[email protected]" }, "permission": "read" } ], "repository": { "id": "repo_01k2ja2000e0080000000000q4", "name": "rocket", "owner": { "slug": "acme", "id": "ns_01k2ja2000e0080000000000p3", "type": "team" } }, "nextPageToken": ""}Upsert de concessão de repositório
/v1/origin/repos/{ownerSlug}/{repoName}/grantsDefine a permissão que um usuário, grupo ou grupo da equipe proprietária tem diretamente sobre um repositório, substituindo qualquer permissão concedida diretamente a esse principal anteriormente. Repetir uma concessão que o principal já possui é bem-sucedido e não gera alteração. O usuário precisa ser membro ativo da equipe ou organização do proprietário do repositório. O grupo precisa ser um grupo pertencente à equipe do proprietário ou um grupo ativo na organização dessa equipe; caso contrário, a solicitação retorna FailedPrecondition (HTTP 400).
Parâmetros de caminho
ownerSlug string Obrigatório
repoName string Obrigatório
Corpo da solicitação
user object
user, group ou teamGroup está presente.user.id string
user_.user.email string
user.displayName string
user.handle string
@. Presente apenas enquanto esse perfil estiver visível publicamente; caso contrário, é omitido.group object
group.id string
grp_.teamGroup object
teamGroup.kind string
members, admins.permission string Obrigatório
read, write, admin. custom retorna InvalidArgument (HTTP 400); políticas personalizadas estão fora do escopo desta API.Campos de resposta
user object
user, group ou teamGroup está presente.user.id string
user_.user.email string
user.displayName string
user.handle string
@. Presente apenas enquanto esse perfil estiver visível publicamente; caso contrário, é omitido.group object
group.id string
grp_.teamGroup object
teamGroup.kind string
members, admins.permission string
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"}'Formato de resposta:
{ "user": { "id": "user_01k2ja2000e0080000000000c3", "email": "[email protected]" }, "permission": "write"}Excluir Grant de Repositório
/v1/origin/repos/{ownerSlug}/{repoName}/grantsRemove a permissão que um usuário, grupo ou grupo da equipe proprietária tem diretamente sobre um repositório. As permissões herdadas do owner do repositório não são afetadas, de modo que o grupo da equipe proprietária volta ao default do nível de owner. Remover uma permissão que o principal não tem diretamente é bem-sucedido e não altera nada. O corpo da resposta vem vazio.
Path Parameters
ownerSlug string Obrigatório
repoName string Obrigatório
Request Body
user object
user, group ou teamGroup está presente.user.id string
user_.user.email string
user.displayName string
user.handle string
@. Presente apenas enquanto esse perfil estiver publicamente visível; caso contrário, omitido.group object
group.id string
grp_.teamGroup object
teamGroup.kind string
members, admins.Campos de resposta
Solicitações bem-sucedidas não retornam corpo da resposta.
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" }}'Resposta:
204 No ContentListar grants de namespace
/v1/origin/owners/{ownerSlug}/grantsLista quem recebeu acesso a um owner: usuários, grupos e os grupos admin e member integrados da equipe proprietária. Cada grant carrega a permissão que concede a todos os repositórios sob o owner. Grants feitos em repositórios individuais não estão incluídos; para lê-los, use List Repository Grants.
Parâmetros de path
ownerSlug string Obrigatório
Parâmetros de consulta
pageSize integer
pageToken string
next_page_token de uma resposta anterior. Vazio na primeira página. O pageSize em uma solicitação de acompanhamento se aplica a essa página; omita-o para manter o tamanho de página anterior.Campos de resposta
grants matriz
pageSize.grants[].user object
user, group ou teamGroup está presente.grants[].user.id string
user_.grants[].user.email string
grants[].user.displayName string
grants[].user.handle string
@. Presente apenas enquanto esse perfil estiver visível publicamente; caso contrário, é omitido.grants[].group object
grants[].group.id string
grp_.grants[].teamGroup objeto
grants[].teamGroup.kind string
members, admins.grants[].permission string
PERMISSION_READ, PERMISSION_CONTRIBUTOR, PERMISSION_WRITE, PERMISSION_ADMIN, PERMISSION_CUSTOM. PERMISSION_CUSTOM indica uma custom policy, que o Upsert Namespace Grant não aceita.nextPageToken string
curl --request GET \ --url 'https://api.cursor.com/v1/origin/owners/{ownerSlug}/grants' \ --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN'Formato de resposta:
{ "grants": [ { "group": { "id": "grp_01k2ja2000e0080000000000n2" }, "permission": "PERMISSION_ADMIN" }, { "teamGroup": { "kind": "admins" }, "permission": "PERMISSION_ADMIN" }, { "teamGroup": { "kind": "members" }, "permission": "PERMISSION_CONTRIBUTOR" }, { "user": { "id": "user_01k2ja2000e0080000000000c3", "email": "[email protected]" }, "permission": "PERMISSION_WRITE" } ], "nextPageToken": ""}Upsert de grant de namespace
/v1/origin/owners/{ownerSlug}/grantsDefine a permissão que um usuário, grupo ou grupo da equipe proprietária detém diretamente sobre um owner, substituindo qualquer permissão concedida anteriormente de forma direta a esse principal. Repetir uma concessão que o principal já possui é bem-sucedido e não gera alteração. A solicitação retorna FailedPrecondition (HTTP 400) quando o usuário não é membro ativo da equipe proprietária ou de sua organização, quando o grupo não pertence a essa equipe nem é um grupo ativo em sua organização, ou quando a gravação deixaria o owner sem um admin.
Parâmetros de caminho
ownerSlug string Obrigatório
Corpo da solicitação
user object
user, group ou teamGroup está presente.user.id string
user_.user.email string
user.displayName string
user.handle string
@. Presente apenas enquanto esse perfil estiver visível publicamente; caso contrário, é omitido.group object
group.id string
grp_.teamGroup object
teamGroup.kind string
members, admins.permission string Obrigatório
PERMISSION_READ, PERMISSION_CONTRIBUTOR, PERMISSION_WRITE, PERMISSION_ADMIN. PERMISSION_READ, PERMISSION_CONTRIBUTOR e PERMISSION_WRITE conferem esse nível nos repositórios internos do proprietário, e PERMISSION_ADMIN administra o próprio proprietário. PERMISSION_CUSTOM retorna InvalidArgument (HTTP 400).Campos de resposta
user object
user, group ou teamGroup está presente.user.id string
user_.user.email string
user.displayName string
user.handle string
@. Presente apenas enquanto esse perfil estiver visível publicamente; caso contrário, é omitido.group object
group.id string
grp_.teamGroup object
teamGroup.kind string
members, admins.permission string
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"}'Formato de resposta:
{ "user": { "id": "user_01k2ja2000e0080000000000c3", "email": "[email protected]" }, "permission": "PERMISSION_WRITE"}Excluir grant de namespace
/v1/origin/owners/{ownerSlug}/grantsRemove a permissão que um user, grupo ou grupo da equipe proprietária detém diretamente sobre um owner. Os grants por repositório não são afetados. Remover uma permissão que o principal não detém diretamente é bem-sucedido e não altera nada, e uma remoção que deixaria o owner sem um admin retorna FailedPrecondition (HTTP 400). O corpo da resposta é vazio.
Path Parameters
ownerSlug string Obrigatório
Corpo da solicitação
user object
user, group ou teamGroup está presente.user.id string
user_.user.email string
user.displayName string
user.handle string
@. Presente apenas enquanto esse profile estiver visível publicamente; caso contrário, é omitido.group object
group.id string
grp_.teamGroup object
teamGroup.kind string
members, admins.Campos de resposta
Solicitações bem-sucedidas não retornam corpo da resposta.
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" }}'Resposta:
204 No ContentRótulos
Uma definição de rótulo pertence a um repositório e é identificada pelo nome. A atribuição de rótulos a um pull request é uma funcionalidade separada; consulte Definir rótulos do pull request.
Listar rótulos
/v1/origin/repos/{ownerSlug}/{repoName}/labelsLista os rótulos definidos em um repositório, ordenados por nome.
Os tokens de página estão vinculados ao repositório para o qual foram emitidos. Um token reutilizado em outro repositório, ou qualquer outro token malformado, retorna InvalidArgument (HTTP 400).
Parâmetros de caminho
ownerSlug string Obrigatório
repoName string Obrigatório
Parâmetros de consulta
pageSize integer
pageToken string
nextPageToken de uma resposta anterior. Omita-o na primeira página. Em uma solicitação de acompanhamento, o pageSize se aplica a essa página; omita-o para manter o tamanho de página anterior.Campo da resposta
labels matriz
labels[].id string
labels[].name string
labels[].color string
# no início.labels[].description string
nextPageToken string
curl --request GET \ --url 'https://api.cursor.com/v1/origin/repos/OWNER_SLUG/REPO_NAME/labels' \ --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN'Formato de resposta:
{ "labels": [ { "id": "lbl_01k2ja2000e0080000000000m1", "name": "bug", "color": "d73a4a", "description": "Something isn't working" } ]}Criar rótulo
/v1/origin/repos/{ownerSlug}/{repoName}/labelsCria um rótulo em um repositório.
Se o nome já estiver em uso por outro rótulo no repositório, retorna AlreadyExists (HTTP 409 Conflict). Se color não tiver seis caracteres hexadecimais, name tiver mais de 50 caracteres ou description tiver mais de 255 caracteres, retorna InvalidArgument (HTTP 400).
Parâmetros de caminho
ownerSlug string Obrigatório
repoName string Obrigatório
Corpo da solicitação
name string Obrigatório
color string Obrigatório
# no início. Valores em maiúsculas são armazenados em minúsculas.description string
Campos de resposta
id string
name string
color string
# no início.description string
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"}'Formato da resposta:
{ "id": "lbl_01k2ja2000e0080000000000m1", "name": "bug", "color": "d73a4a", "description": "Something isn't working"}Obter rótulo
/v1/origin/repos/{ownerSlug}/{repoName}/labels/{labelName}Retorna um rótulo específico do repositório pelo nome.
Um nome inexistente retorna 404. Um labelName vazio retorna InvalidArgument (HTTP 400).
Parâmetros de caminho
ownerSlug string Obrigatório
repoName string Obrigatório
labelName string Obrigatório
Campos de resposta
id string
name string
color string
# inicial.description string
curl --request GET \ --url 'https://api.cursor.com/v1/origin/repos/OWNER_SLUG/REPO_NAME/labels/LABEL_NAME' \ --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN'Formato da resposta:
{ "id": "lbl_01k2ja2000e0080000000000m1", "name": "bug", "color": "d73a4a", "description": "Something isn't working"}Excluir rótulo
/v1/origin/repos/{ownerSlug}/{repoName}/labels/{labelName}Exclui um rótulo de um repositório pelo nome. A resposta não tem corpo.
Excluir um rótulo também o remove de todas as pull requests às quais foi atribuído. Um nome desconhecido retorna 404. Um labelName vazio retorna InvalidArgument (HTTP 400).
Parâmetros de caminho
ownerSlug string Obrigatório
repoName string Obrigatório
labelName string Obrigatório
Campo da resposta
Solicitações bem-sucedidas não retornam corpo da resposta.
curl --request DELETE \ --url 'https://api.cursor.com/v1/origin/repos/OWNER_SLUG/REPO_NAME/labels/LABEL_NAME' \ --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN'Resposta:
204 No ContentAtualizar rótulo
/v1/origin/repos/{ownerSlug}/{repoName}/labels/{labelName}Atualiza um rótulo de repositório identificado pelo nome atual.
Os campos omitidos permanecem inalterados. Uma solicitação que omite os três retorna o rótulo como está. Renomear para um nome já usado por outro rótulo retorna AlreadyExists (HTTP 409 Conflict). Um labelName desconhecido retorna 404.
Parâmetros de caminho
ownerSlug string Obrigatório
repoName string Obrigatório
labelName string Obrigatório
Corpo da solicitação
name string
color string
# inicial. Omita para não alterar.description string
Campo da resposta
id string
name string
color string
# inicial.description string
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"}'Formato da resposta:
{ "id": "lbl_01k2ja2000e0080000000000m1", "name": "bug", "color": "b60205", "description": "Something isn't working"}Pull requests
Pull requests fechados ou mergeados também podem incluir closedAt, mergedAt e mergeCommitSha. Trate head.ref e base.ref como strings opacas de referência do Origin; elas podem ser nomes curtos de branches ou valores refs/heads/… totalmente qualificados.
version é a última revisão numerada do pull request. O Origin registra uma nova versão quando é feito push do head, quando o pull request é redirecionado para outra base e quando um pull request é reaberto depois que seu head foi movido enquanto ele estava fechado, cada uma com seu próprio headSha, baseSha e estatísticas de diff. Uma reabertura que registra uma versão envia pull_request.head_ref.pushed, o mesmo evento enviado por um push. O avanço isolado da branch base não registra nada, então version.baseSha (e base.sha, que o espelha) é a ponta da base conforme resolvida no momento em que a versão foi registrada e pode ficar defasada em relação à ponta atual da branch até que a próxima versão seja registrada. Leia a ponta atual da branch com Get Git Ref.
mergeCommitSha é o commit que o merge gravou na branch base: definido após o merge, indefinido antes. A prévia pré-merge é a ref pull/{pullNumber}/merge, um commit diferente; veja Dados do Git.
version.potentialMergeCommit relata o merge de teste do Origin para essa versão: se ele está prepared, encontrou um merge_conflict ou ainda está unknown e, depois de preparado, o sha do commit de merge e o baseSha a partir do qual ele foi gerado. Ele descreve apenas essa versão, então um pull request mergeado continua a relatá-lo. Os payloads de webhook pull_request.* o incluem com o estado do momento do evento. Um evento aguarda a preparação apenas dentro de um limite de tempo, então pode indicar unknown enquanto um Get Pull Request posterior indica prepared; leia o pull request novamente ou aguarde o próximo evento.
O verdict da revisão é approve, request_changes ou comment. submittedAt está ausente em uma draft review não enviada. dismissal está ausente enquanto o veredito permanece ativo. Revisões descartadas continuam visíveis nas listagens de revisões. Revisões automaticamente substituídas por uma decisão mais recente recebem uma mensagem gerada pelo servidor.
Os comentários expõem uma referência de thread para agrupamento. As solicitações de criação de comentários ainda aceitam o parâmetro de comando escalar threadId ao responder. Resolva ou reabra um thread com Atualizar Thread do Pull Request.
Listar Pull Requests
/v1/origin/repos/{ownerSlug}/{repoName}/pullsLista pull requests em um repositório, opcionalmente filtrados pelo branch de origem, branch de destino, autor, intervalo de data de criação e estado. Cada pull request inclui os rótulos atribuídos.
Os resultados são ordenados pela ordem de criação ou pela última atualização, selecionadas com sortBy, do mais recente para o mais antigo. Defina direction=asc para a ordem contrária. Os tokens de página incorporam a ordenação e os filtros sob os quais foram emitidos; portanto, um token reproduzido com uma ordenação ou conjunto de filtros diferente é rejeitado. Reinicie a paginação quando qualquer um deles mudar.
Parâmetros de caminho
ownerSlug string Obrigatório
repoName string Obrigatório
Parâmetros de consulta
head string
state string
open (o padrão), closed, merged, all. closed abrange todos os pull requests que não estão mais abertos, incluindo os mesclados; merged restringe ao subconjunto dos mesclados. Qualquer outro valor retorna InvalidArgument (HTTP 400).pageSize integer
pageToken string
nextPageToken de uma resposta anterior. Omita-o na primeira página. Em uma solicitação de acompanhamento, pageSize se aplica a essa página; omita-o para manter o tamanho de página anterior.author string
pullRequests[].author.user.id, pullRequests[].author.app.id ou pullRequests[].author.serviceAccount.id (user_…, app_… ou sa_…), ou o endereço de e-mail exato de um usuário. A correspondência de e-mail não diferencia maiúsculas de minúsculas. Aplicativos e contas de serviço não têm identidade de e-mail, portanto apenas autores que são usuários podem ser selecionados dessa forma. Um autor sem solicitações de pull retorna uma lista vazia, assim como um e-mail que não corresponda a um único usuário. Qualquer outro valor, incluindo o ID compartilhado origin-cursor-managed-actor, retorna InvalidArgument (HTTP 400).base string
main) ou uma referência totalmente qualificada (refs/heads/main). Omita para listar todas as branches base.direction string
sortBy. "desc" é o padrão: com sortBy=created retorna primeiro os mais recentemente criados, e com sortBy=updated os mais recentemente atualizados. "asc" inverte cada um. Qualquer outro valor retorna InvalidArgument (HTTP 400).since string
2026-08-01T00:00:00Z. Retorna apenas pull requests criados naquele instante ou depois dele. Um carimbo de data/hora malformado retorna InvalidArgument (HTTP 400).until string
since. Retorna apenas pull requests criadas naquele instante ou antes dele. Um timestamp malformado retorna InvalidArgument (HTTP 400).sortBy string
created (ordem de criação, padrão) ou updated (horário da última atualização). Qualquer outro valor retorna InvalidArgument (HTTP 400).headSha string
head.sha em cada resultado para distingui-los. Os outros filtros ainda se aplicam, e state tem como padrão open, então informe state=all para incluir pull requests mescladas e fechadas. SHAs malformados, abreviados ou desconhecidos não correspondem a nada.stackId string
pullRequests[].stack.id. Retorna apenas os membros dessa stack, na ordem de classificação solicitada, e não na ordem da stack; portanto, reconstrua a stack a partir de stack.parentPullRequest de cada membro. state continua tendo como padrão open, que exclui membros mesclados; passe state=all para obter a stack inteira. Um ID bem-formado que não identifica nenhuma stack neste repositório retorna uma lista vazia; qualquer outro valor retorna InvalidArgument (HTTP 400).Campos da resposta
pullRequests matriz
pullRequests[].id string
pullRequests[].number string
pullRequests[].state string
pullRequests[].draft boolean
pullRequests[].merged boolean
pullRequests[].title string
pullRequests[].body string
pullRequests[].head objeto
pullRequests[].head.ref string
pullRequests[].head.sha string
pullRequests[].base objeto
pullRequests[].base.ref string
pullRequests[].base.sha string
pullRequests[].author objeto
pullRequests[].author.user objeto
pullRequests[].author.user.id string
pullRequests[].author.user.email string
pullRequests[].author.user.displayName string
pullRequests[].author.user.handle string
@. Presente apenas enquanto esse perfil estiver visível publicamente; caso contrário, é omitido.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 string
pullRequests[].closedAt string
pullRequests[].mergedAt string
pullRequests[].mergeCommitSha string
pull/<number>/merge com Obter referência do Git.pullRequests[].additions integer
pullRequests[].deletions integer
pullRequests[].changedFiles integer
pullRequests[].labels lista
pullRequests[].labels[].id string
pullRequests[].labels[].name string
pullRequests[].labels[].color string
# no início.pullRequests[].labels[].description string
pullRequests[].stack objeto
pullRequests[].stack.id string
stackId em Listar Pull Requests para ler os demais membros.pullRequests[].stack.parentPullRequest objeto
pullRequests[].stack.parentPullRequest.id string
pullRequests[].stack.parentPullRequest.number string
pullRequests[].stack.parentPullRequest.repository objeto
id, name e owner que o campo repository de uma execução de verificação. As stacks nunca abrangem mais de um repositório, portanto este é sempre o próprio repositório da pull request.pullRequests[].version objeto
pullRequests[].version.number string
pullRequests[].version.headSha string
pullRequests[].version.baseSha string
pullRequests[].version.createdAt string
pullRequests[].version.potentialMergeCommit objeto
headSha no topo do branch base — e o estágio alcançado na preparação desse merge. Presente em todas as versões. Descreve apenas esta versão e continua legível após o merge do pull request; é um commit diferente de mergeCommitSha. Em um pull request empilhado, o branch base é o branch do pull request pai; portanto, o merge de teste abrange apenas as alterações deste pull request sobre esse branch.pullRequests[].version.potentialMergeCommit.state string
unknown, prepared, merge_conflict. unknown significa que o merge de teste não está preparado: a versão está aguardando a preparação, ou a preparação expirou ou falhou. Toda nova versão começa como unknown, portanto nunca carrega o commit de outra versão. prepared significa que o merge de teste existe e é descrito por sha e baseSha. merge_conflict significa que mergear headSha na ponta do branch base gerou conflito, portanto não há merge de teste; essa é a condição que Get Pull Request Mergeability relata como um bloqueio merge_conflict, e reabrir o pull request prepara a versão novamente. Trate qualquer valor não reconhecido como unknown.pullRequests[].version.potentialMergeCommit.sha string
baseSha deste objeto e o segundo pai é o headSha da versão. Presente apenas quando state for prepared. A ref pull/{pullNumber}/merge aponta para ele enquanto esta versão for a mais recente. Depois disso, ele continua acessível para leitura pelo SHA por meio de Obter commit, mas não pode ser obtido pelo SHA via Git.pullRequests[].version.potentialMergeCommit.baseSha string
state for prepared. Pode ser mais recente que pullRequests[].version.baseSha, e a Origin não a atualiza quando o branch base simplesmente avança.nextPageToken string
curl --request GET \ --url 'https://api.cursor.com/v1/origin/repos/OWNER_SLUG/REPO_NAME/pulls' \ --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN'Formato da resposta:
{ "pullRequests": [ { "id": "pr_01k2ja2000e0080000000000d4", "number": "17", "state": "open", "draft": false, "merged": false, "title": "Add launch telemetry", "body": "Adds structured launch telemetry to the ignition path.", "head": { "ref": "add-telemetry", "sha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4" }, "base": { "ref": "add-telemetry-schema", "sha": "3b1f9c2d8a7e6f5049c8b7a6d5e4f3a2b1c0d9e8" }, "author": { "user": { "id": "user_01k2ja2000e0080000000000c3", "email": "[email protected]" } }, "createdAt": "2026-08-01T09:30:00Z", "updatedAt": "2026-08-02T14:45:00Z", "additions": 128, "deletions": 46, "changedFiles": 5, "labels": [ { "id": "lbl_01k2ja2000e0080000000000m1", "name": "bug", "color": "d73a4a", "description": "Something isn't working" } ], "stack": { "id": "stk_01k2ja2000e0080000000000s1", "parentPullRequest": { "id": "pr_01k2ja2000e0080000000000d3", "number": "16", "repository": { "id": "repo_01k2ja2000e0080000000000q4", "name": "rocket", "owner": { "slug": "acme", "id": "ns_01k2ja2000e0080000000000p3", "type": "team" } } } }, "version": { "number": "3", "headSha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4", "baseSha": "3b1f9c2d8a7e6f5049c8b7a6d5e4f3a2b1c0d9e8", "createdAt": "2026-08-01T09:30:00Z" } } ]}Obter pull request
/v1/origin/repos/{ownerSlug}/{repoName}/pulls/{pullNumber}Retorna uma única pull request, incluindo os rótulos atribuídos a ela.
Pull requests fechadas ou mescladas podem incluir adicionalmente closedAt, mergedAt e mergeCommitSha. Trate head.ref e base.ref como strings opacas de referência Origin; elas podem ser nomes de branch curtos ou valores totalmente qualificados refs/heads/….
Parâmetros de caminho
ownerSlug string Obrigatório
repoName string Obrigatório
pullNumber string Obrigatório
Campos da resposta
id string
number string
state string
draft boolean
merged boolean
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
@. Presente apenas enquanto esse perfil estiver visível publicamente; caso contrário, omitido.author.app objeto
author.app.id string
author.app.displayName string
author.serviceAccount objeto
author.serviceAccount.id string
createdAt string
updatedAt string
closedAt string
mergedAt string
mergeCommitSha string
pull/<number>/merge com Obter referência do Git.additions integer
deletions integer
changedFiles integer
labels matriz
labels[].id string
labels[].name string
labels[].color string
# inicial.labels[].description string
stack objeto
stack.id string
stackId em Listar pull requests para ler os demais membros.stack.parentPullRequest objeto
stack.parentPullRequest.id string
stack.parentPullRequest.number string
stack.parentPullRequest.repository objeto
id, name e owner que o repository de uma execução de verificação. As stacks nunca abrangem mais de um repositório, portanto este é sempre o repositório da própria pull request.version objeto
version.number string
version.headSha string
version.baseSha string
version.createdAt string
version.potentialMergeCommit objeto
headSha dela na ponta da branch base) e até onde a preparação desse merge avançou. Presente em todas as versões. Descreve apenas esta versão e continua disponível para leitura depois que a pull request é mesclada; é um commit diferente de mergeCommitSha. Em uma pull request empilhada, a branch base é a branch da pull request pai, portanto o merge de teste abrange apenas as alterações desta pull request sobre ela.version.potentialMergeCommit.state string
unknown, prepared, merge_conflict. unknown significa que o merge de teste não está preparado: a versão está aguardando a preparação, ou a preparação expirou ou falhou. Toda nova versão começa como unknown, então nunca carrega o commit de outra versão. prepared significa que o merge de teste existe e que sha e baseSha o descrevem. merge_conflict significa que mergear headSha na ponta da branch base gerou conflito, então não há merge de teste; é a condição que Obter mergeabilidade da pull request relata como um bloqueio merge_conflict, e reabrir a pull request prepara a versão novamente. Trate qualquer valor não reconhecido como unknown.version.potentialMergeCommit.sha string
baseSha deste objeto e o segundo pai é o headSha da versão. Presente apenas quando state for prepared. A referência pull/{pullNumber}/merge aponta para ele enquanto esta versão for a mais recente. Depois disso, ele continua disponível para leitura por SHA via Obter commit, mas não pode ser buscado por SHA pelo Git.version.potentialMergeCommit.baseSha string
state for prepared. Pode ser mais recente que version.baseSha, e a Origin não a atualiza quando a branch base simplesmente avança.curl --request GET \ --url 'https://api.cursor.com/v1/origin/repos/OWNER_SLUG/REPO_NAME/pulls/PULL_NUMBER' \ --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN'Estrutura da resposta:
{ "id": "pr_01k2ja2000e0080000000000d4", "number": "17", "state": "open", "draft": false, "merged": false, "title": "Add launch telemetry", "body": "Adds structured launch telemetry to the ignition path.", "head": { "ref": "add-telemetry", "sha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4" }, "base": { "ref": "add-telemetry-schema", "sha": "3b1f9c2d8a7e6f5049c8b7a6d5e4f3a2b1c0d9e8" }, "author": { "user": { "id": "user_01k2ja2000e0080000000000c3", "email": "[email protected]" } }, "createdAt": "2026-08-01T09:30:00Z", "updatedAt": "2026-08-02T14:45:00Z", "additions": 128, "deletions": 46, "changedFiles": 5, "labels": [ { "id": "lbl_01k2ja2000e0080000000000m1", "name": "bug", "color": "d73a4a", "description": "Something isn't working" } ], "stack": { "id": "stk_01k2ja2000e0080000000000s1", "parentPullRequest": { "id": "pr_01k2ja2000e0080000000000d3", "number": "16", "repository": { "id": "repo_01k2ja2000e0080000000000q4", "name": "rocket", "owner": { "slug": "acme", "id": "ns_01k2ja2000e0080000000000p3", "type": "team" } } } }, "version": { "number": "3", "headSha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4", "baseSha": "3b1f9c2d8a7e6f5049c8b7a6d5e4f3a2b1c0d9e8", "createdAt": "2026-08-01T09:30:00Z", "potentialMergeCommit": { "state": "prepared", "sha": "c7b6a5948372615049f8e7d6c5b4a3928170605f", "baseSha": "5e2d1c0b9a8f7e6d5c4b3a2918070605f4e3d2c1" } }}Criar pull request
/v1/origin/repos/{ownerSlug}/{repoName}/pullsCria uma solicitação de pull de head para base.
Opcionalmente, parent_pull_number empilha esta alteração em outra pull request aberta ou em rascunho no mesmo repositório.
Um title com mais de 256 caracteres, ou um body com mais de 65.536 caracteres, retorna InvalidArgument (HTTP 400). Ambos os limites contam pontos de código Unicode.
Uma head sem histórico em comum com base retorna InvalidArgument (HTTP 400) e não cria nada. Se um push posterior deixar a head de uma pull request aberta sem histórico em comum com sua base, o Origin fechará a pull request e emitirá pull_request.closed; um push relacionado subsequente não a reabrirá.
Parâmetros de caminho
ownerSlug string Obrigatório
repoName string Obrigatório
Corpo da solicitação
title string Obrigatório
body string
head string Obrigatório
base string Obrigatório
InvalidArgument (HTTP 400).draft booleano
parentPullRequest objeto
clear retorna InvalidArgument (HTTP 400).parentPullRequest.number string
parentPullRequest.id string
id.Campos da resposta
id string
number string
state string
draft booleano
merged boolean
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
@. Presente apenas enquanto esse perfil estiver publicamente visível; caso contrário, é omitido.author.app objeto
author.app.id string
author.app.displayName string
author.serviceAccount objeto
author.serviceAccount.id string
createdAt string
updatedAt string
closedAt string
mergedAt string
mergeCommitSha string
pull/<number>/merge com Obter referência do Git.additions integer
deletions integer
changedFiles integer
labels matriz
labels[].id string
labels[].name string
labels[].color string
# no início.labels[].description string
stack objeto
stack.id string
stackId para Listar pull requests para ler os outros membros.stack.parentPullRequest objeto
stack.parentPullRequest.id string
stack.parentPullRequest.number string
stack.parentPullRequest.repository objeto
id, name e owner do repository de uma execução de verificação. Stacks nunca abrangem vários repositórios; portanto, este é sempre o repositório da própria Pull Request.version objeto
version.number string
version.headSha string
version.baseSha string
version.createdAt string
version.potentialMergeCommit objeto
headSha dela sobre a ponta do branch base) e até onde a preparação dele avançou. Presente em todas as versões. Descreve apenas esta versão e continua disponível para leitura depois que o pull request é mesclado; é um commit diferente do mergeCommitSha. Em um pull request empilhado, o branch base é o branch do pull request pai, então o merge de teste abrange apenas as alterações deste pull request sobre ele.version.potentialMergeCommit.state string
unknown, prepared, merge_conflict. unknown significa que o merge de teste não está preparado: a versão está aguardando a preparação, ou a preparação expirou ou falhou. Toda nova versão começa como unknown, portanto nunca carrega o commit de outra versão. prepared significa que o merge de teste existe e que sha e baseSha o descrevem. merge_conflict significa que mergear headSha na ponta do branch base gerou conflito, portanto não há merge de teste; essa é a condição que Get Pull Request Mergeability relata como um bloqueio merge_conflict, e reabrir a pull request prepara a versão novamente. Trate qualquer valor não reconhecido como unknown.version.potentialMergeCommit.sha string
baseSha deste objeto e o segundo é o headSha da versão. Presente apenas quando state é prepared. A ref pull/{pullNumber}/merge aponta para ele enquanto esta for a versão mais recente. Depois disso, ele continua podendo ser lido pelo SHA por meio de Get Commit, mas não pode ser consultado pelo SHA via Git.version.potentialMergeCommit.baseSha string
state for prepared. Pode ser mais recente que version.baseSha, e a Origin não a atualiza quando o branch base simplesmente avança.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}'Formato de resposta:
{ "id": "pr_01k2ja2000e0080000000000d4", "number": "17", "state": "open", "draft": false, "merged": false, "title": "Add launch telemetry", "body": "Adds structured launch telemetry to the ignition path.", "head": { "ref": "add-telemetry", "sha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4" }, "base": { "ref": "main", "sha": "3b1f9c2d8a7e6f5049c8b7a6d5e4f3a2b1c0d9e8" }, "author": { "user": { "id": "user_01k2ja2000e0080000000000c3", "email": "[email protected]" } }, "createdAt": "2026-08-01T09:30:00Z", "updatedAt": "2026-08-02T14:45:00Z", "additions": 128, "deletions": 46, "changedFiles": 5, "labels": [ { "id": "lbl_01k2ja2000e0080000000000m1", "name": "bug", "color": "d73a4a", "description": "Something isn't working" } ], "version": { "number": "3", "headSha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4", "baseSha": "3b1f9c2d8a7e6f5049c8b7a6d5e4f3a2b1c0d9e8", "createdAt": "2026-08-01T09:30:00Z" }}Atualizar Pull Request
/v1/origin/repos/{ownerSlug}/{repoName}/pulls/{pullNumber}Atualiza o título, o corpo, a branch base, a branch pai da stack e/ou o estado de ciclo de vida de um pull request.
Campos omitidos permanecem inalterados. Os campos presentes são aplicados nesta ordem: metadata, depois reopen/draft/ready-for-review, depois base, depois o parent da stack e, por fim, close. O close é executado por último para que um retarget na mesma solicitação ainda consiga ver uma alteração aberta; o reopen é executado antes do base para que um pull fechado possa ser retargetado; o parent da stack é executado após base para que um parent explícito prevaleça sobre aquele derivado de uma alteração de base. Se uma etapa posterior falhar, as etapas anteriores podem já ter sido commitadas.
Um title com mais de 256 caracteres, ou um body com mais de 65.536 caracteres, retorna InvalidArgument (HTTP 400). Ambos os limites contam pontos de código Unicode.
Parâmetros de caminho
ownerSlug string Obrigatório
repoName string Obrigatório
pullNumber string Obrigatório
Corpo da solicitação
title string
body string
state string
"open" ou "closed". "closed" fecha o pull request. "open" sem draft: true marca como pronto para revisão, incluindo a publicação de um rascunho existente. Reabrir um pull request cujo head mudou enquanto estava fechado registra uma nova version e envia pull_request.head_ref.pushed. Merged não é gravável; use MergePullRequest.draft boolean
true marca o pull request como rascunho; false marca como pronto para revisão (e reabre se estiver atualmente fechado, o que pode registrar uma nova version). Ignorado quando state for "closed".base string
InvalidArgument (HTTP 400).parentPullRequest objeto
number ou id empilha este pull request sobre esse parent, substituindo qualquer parent atual, e clear remove o parent. Omita o campo para deixar a stack inalterada. Um seletor vazio, clear: false ou mais de um membro retorna InvalidArgument (HTTP 400). Trata-se apenas de uma associação: nenhuma branch é reescrita, e base só é redirecionada se você também a enviar. O Origin aplica isso depois de base, então um parent explícito prevalece sobre aquele derivado de uma alteração de base.parentPullRequest.number string
parentPullRequest.id string
id.parentPullRequest.clear boolean
true é aceito.Campos da resposta
id string
number string
state string
draft boolean
merged boolean
title string
body string
head object
head.ref string
head.sha string
base object
base.ref string
base.sha string
author object
author.user object
author.user.id string
author.user.email string
author.user.displayName string
author.user.handle string
@. Presente apenas enquanto esse perfil estiver publicamente visível; caso contrário, é omitido.author.app object
author.app.id string
author.app.displayName string
author.serviceAccount object
author.serviceAccount.id string
createdAt string
updatedAt string
closedAt string
mergedAt string
mergeCommitSha string
pull/<number>/merge usando Obter referência do Git.additions integer
deletions integer
changedFiles integer
labels matriz
labels[].id string
labels[].name string
labels[].color string
# inicial.labels[].description string
stack object
stack.id string
stackId para List Pull Requests para ler os demais membros.stack.parentPullRequest object
stack.parentPullRequest.id string
stack.parentPullRequest.number string
stack.parentPullRequest.repository object
id, name e owner que o repository de uma execução de verificação. As stacks nunca atravessam repositórios, então este é sempre o próprio repositório do pull request.version object
version.number string
version.headSha string
version.baseSha string
version.createdAt string
version.potentialMergeCommit object
headSha dela na ponta da branch base) e até onde sua preparação avançou. Presente em todas as versões. Descreve apenas esta versão e continua disponível para leitura depois que o pull request é mesclado; é um commit diferente de mergeCommitSha. Em um pull request empilhado, a branch base é a branch do pull request pai, então o merge de teste abrange apenas as alterações deste pull request sobre ela.version.potentialMergeCommit.state string
unknown, prepared, merge_conflict. unknown significa que o merge de teste não está preparado: a versão está aguardando a preparação, ou a preparação excedeu o tempo limite ou falhou. Toda nova versão começa como unknown, portanto nunca carrega o commit de outra versão. prepared significa que o merge de teste existe e que sha e baseSha o descrevem. merge_conflict significa que mergear headSha na ponta da branch base gerou conflito e, por isso, não há merge de teste; essa é a condição que Get Pull Request Mergeability relata como um bloqueio merge_conflict, e reabrir o pull request prepara a versão novamente. Trate qualquer valor não reconhecido como unknown.version.potentialMergeCommit.sha string
baseSha deste objeto e o segundo é o headSha da versão. Presente apenas quando state for prepared. O ref pull/{pullNumber}/merge aponta para ele enquanto esta for a versão mais recente. Depois disso, ele ainda pode ser lido pelo SHA por meio de Get Commit, mas não pode ser buscado pelo SHA via Git.version.potentialMergeCommit.baseSha string
state for prepared. Pode ser mais recente que version.baseSha, e o Origin não a atualiza quando a branch base apenas avança.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"}'Formato de resposta:
{ "id": "pr_01k2ja2000e0080000000000d4", "number": "17", "state": "open", "draft": false, "merged": false, "title": "Add launch telemetry", "body": "Adds structured launch telemetry to the ignition path.", "head": { "ref": "add-telemetry", "sha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4" }, "base": { "ref": "main", "sha": "3b1f9c2d8a7e6f5049c8b7a6d5e4f3a2b1c0d9e8" }, "author": { "user": { "id": "user_01k2ja2000e0080000000000c3", "email": "[email protected]" } }, "createdAt": "2026-08-01T09:30:00Z", "updatedAt": "2026-08-02T14:45:00Z", "additions": 128, "deletions": 46, "changedFiles": 5, "labels": [ { "id": "lbl_01k2ja2000e0080000000000m1", "name": "bug", "color": "d73a4a", "description": "Something isn't working" } ], "version": { "number": "3", "headSha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4", "baseSha": "3b1f9c2d8a7e6f5049c8b7a6d5e4f3a2b1c0d9e8", "createdAt": "2026-08-01T09:30:00Z" }}Listar comentários do pull request
/v1/origin/repos/{ownerSlug}/{repoName}/pulls/{pullNumber}/commentsLista todos os comentários de uma pull request em ordem cronológica, opcionalmente limitados a um intervalo de tempo de criação. Cada comentário inclui toda a sua thread: ID, âncora do diff e estado de resolução. Agrupe a resposta plana por thread.id sem fazer uma segunda solicitação.
Os page tokens incorporam os filtros sob os quais foram emitidos, portanto um token reutilizado com filtros diferentes é rejeitado; reinicie a paginação quando um filtro for alterado.
Parâmetros de caminho
ownerSlug string Obrigatório
repoName string Obrigatório
pullNumber string Obrigatório
Parâmetros de consulta
pageSize integer
pageToken string
nextPageToken de uma resposta anterior. Omita-o na primeira página. O pageSize informado em uma solicitação de acompanhamento vale para essa página; omita-o para manter o tamanho de página anterior.since string
2026-08-01T00:00:00Z. Retorna apenas comentários criados nesse instante ou depois. Um carimbo de data/hora malformado retorna InvalidArgument (HTTP 400).until string
since. Retorna apenas comentários criados naquele instante ou antes dele. Um carimbo de data/hora malformado retorna InvalidArgument (HTTP 400).threadIds matriz
InvalidArgument (HTTP 400).Campos da resposta
comments matriz
comments[].id string
comments[].thread objeto
comments[].thread.id string
comments[].thread.version objeto
comments[].thread.version.number string
comments[].thread.version.headSha string
comments[].thread.version.baseSha string
comments[].thread.path string
comments[].thread.side string
left, right. Não definido para tópicos de discussão geral.comments[].thread.startLine integer
side do arquivo. 0 para threads no nível do arquivo e de discussão geral.comments[].thread.endLine integer
0 quando a âncora está em uma única linha ou não possui intervalo de linhas.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 string
comments[].author.user.email string
comments[].author.user.displayName string
comments[].author.user.handle string
@. Presente apenas enquanto esse perfil estiver visível publicamente; omitido caso contrário.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 string
comments[].updatedAt string
pullRequest objeto
pullRequest.id string
pullRequest.number string
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. Omitido quando desconhecido.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'Estrutura da resposta:
{ "comments": [ { "id": "cmt_01k2ja2000e0080000000000e5", "thread": { "id": "cth_01k2ja2000e0080000000000s6", "version": { "number": "3", "headSha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4", "baseSha": "3b1f9c2d8a7e6f5049c8b7a6d5e4f3a2b1c0d9e8" }, "path": "src/telemetry/retry.ts", "side": "right", "startLine": 42, "endLine": 45, "createdAt": "2026-08-01T09:30:00Z", "updatedAt": "2026-08-02T14:45:00Z" }, "body": "Should the retry budget be configurable?", "author": { "user": { "id": "user_01k2ja2000e0080000000000c3", "email": "[email protected]" } }, "createdAt": "2026-08-01T09:30:00Z", "updatedAt": "2026-08-02T14:45:00Z" } ], "pullRequest": { "id": "pr_01k2ja2000e0080000000000d4", "number": "17", "repository": { "id": "repo_01k2ja2000e0080000000000q4", "name": "rocket", "owner": { "slug": "acme", "id": "ns_01k2ja2000e0080000000000p3", "type": "team" } } }}Obter comentário de pull request
/v1/origin/repos/{ownerSlug}/{repoName}/pulls/comments/{commentId}Retorna um único comentário de pull request pelo seu ID estável do Origin. Um comentário fora do repositório autorizado, ou um comentário de revisão pendente que não esteja visível para o chamador, retorna 404.
Parâmetros de caminho
ownerSlug string Obrigatório
repoName string Obrigatório
commentId string Obrigatório
Campos da resposta
id string
thread object
thread.id string
thread.version object
thread.version.number string
thread.version.headSha string
thread.version.baseSha string
thread.path string
thread.side string
left, right. Não definido para tópicos de discussão geral.thread.startLine integer
side do arquivo. 0 para threads no nível do arquivo e de discussão geral.thread.endLine integer
0 quando a âncora corresponde a uma única linha ou não possui intervalo de linhas.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
@. Exibido apenas enquanto esse perfil estiver visível publicamente; omitido caso contrário.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'Formato da resposta:
{ "id": "cmt_01k2ja2000e0080000000000e5", "thread": { "id": "cth_01k2ja2000e0080000000000s6", "version": { "number": "3", "headSha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4", "baseSha": "3b1f9c2d8a7e6f5049c8b7a6d5e4f3a2b1c0d9e8" }, "path": "src/telemetry/retry.ts", "side": "right", "startLine": 42, "endLine": 45, "createdAt": "2026-08-01T09:30:00Z", "updatedAt": "2026-08-02T14:45:00Z" }, "body": "Should the retry budget be configurable?", "author": { "user": { "id": "user_01k2ja2000e0080000000000c3", "email": "[email protected]" } }, "createdAt": "2026-08-01T09:30:00Z", "updatedAt": "2026-08-02T14:45:00Z"}Excluir comentário de pull request
/v1/origin/repos/{ownerSlug}/{repoName}/pulls/comments/{commentId}Exclui um comentário de pull request pelo seu ID estável do Origin. O corpo da resposta fica vazio.
O autor do comentário sempre pode excluí-lo. Qualquer outro chamador precisa ter acesso de gravação ao repositório, o que repository:contents:write concede; caso contrário, recebe PermissionDenied (HTTP 403). Excluir o último comentário de um thread remove o thread; excluir qualquer outro comentário, inclusive o que abriu o thread, mantém o thread e os demais comentários no lugar. A resolução do thread não é um requisito. As reações ao comentário e seu histórico de edições são removidos junto com ele.
Um ID desconhecido, um comentário já excluído e um comentário em outro repositório retornam 404. Um ID malformado retorna InvalidArgument (HTTP 400).
Parâmetros de caminho
ownerSlug string Obrigatório
repoName string Obrigatório
commentId string Obrigatório
Campos da resposta
Solicitações bem-sucedidas não retornam corpo da resposta.
curl --request DELETE \ --url 'https://api.cursor.com/v1/origin/repos/OWNER_SLUG/REPO_NAME/pulls/comments/COMMENT_ID' \ --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN'Resposta:
204 No ContentCriar comentário de Pull Request
/v1/origin/repos/{ownerSlug}/{repoName}/pulls/{pullNumber}/commentsCria um comentário em um pull request do Origin. O comentário tem exatamente um entre quatro alvos: threadId responde a uma thread existente, seja de discussão geral ou inline; inline abre uma nova thread ancorada a um intervalo de linhas no diff da versão do pull request; file abre uma nova thread em um arquivo inteiro desse diff; se nenhum deles for fornecido, uma nova thread de discussão geral será aberta. Conteúdos com mais de 65.536 caracteres são rejeitados com InvalidArgument (HTTP 400).
Uma âncora inline deve referenciar o diff da versão. O path deve fazer parte desse diff, e o side deve ter conteúdo nele; por isso, tentar ancorar left em um arquivo adicionado ou right em um arquivo excluído resulta em InvalidArgument (HTTP 400). É possível ancorar qualquer linha de um arquivo alterado, e o intervalo não se restringe aos hunks do diff. O intervalo deve caber no arquivo do lado ancorado, que left lê no commit base e right no head: um intervalo que ultrapassa a última linha resulta em InvalidArgument (HTTP 400). O Origin nunca recorre a um comentário de discussão geral quando uma âncora é inválida.
Uma âncora file contém apenas o caminho. O Origin determina o lado a partir do tipo de alteração do arquivo — a versão base para um arquivo excluído e a versão head caso contrário — e o retorna em thread.side. Envie o caminho excluído em caso de exclusão e o caminho head para qualquer outra alteração. Um caminho fora do diff é rejeitado com InvalidArgument (HTTP 400), assim como o caminho de origem anterior à renomeação de um arquivo renomeado.
Parâmetros de caminho
ownerSlug string Obrigatório
repoName string Obrigatório
pullNumber string Obrigatório
Corpo da solicitação
body string Obrigatório
threadId string
versionNumber.inline object
threadId.inline.path string Obrigatório
inline.side string Obrigatório
left para a versão base do arquivo, right para a versão head.inline.startLine inteiro Obrigatório
side do arquivo. O intervalo não pode ultrapassar o fim desse arquivo.inline.endLine integer
startLine. Omitir para uma âncora de linha única.file object
threadId ou inline.file.path string Obrigatório
versionNumber string
0 ou não definido significa a versão mais recente no momento da chamada. Só é relevante para novas threads.Campos da resposta
id string
thread object
thread.id string
thread.version object
thread.version.number string
thread.version.headSha string
thread.version.baseSha string
thread.path string
thread.side string
left, right. Não definido para tópicos de discussão geral.thread.startLine integer
side do arquivo. 0 para threads de nível de arquivo e de discussão geral.thread.endLine integer
0 quando a âncora é uma única linha ou não tem intervalo de linhas.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 apenas enquanto esse perfil estiver visível publicamente; caso contrário, omitido.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?"}'Formato da resposta:
{ "id": "cmt_01k2ja2000e0080000000000e5", "thread": { "id": "cth_01k2ja2000e0080000000000s6", "version": { "number": "3", "headSha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4", "baseSha": "3b1f9c2d8a7e6f5049c8b7a6d5e4f3a2b1c0d9e8" }, "path": "src/telemetry/retry.ts", "side": "right", "startLine": 42, "endLine": 45, "createdAt": "2026-08-01T09:30:00Z", "updatedAt": "2026-08-02T14:45:00Z" }, "body": "Should the retry budget be configurable?", "author": { "user": { "id": "user_01k2ja2000e0080000000000c3", "email": "[email protected]" } }, "createdAt": "2026-08-01T09:30:00Z", "updatedAt": "2026-08-02T14:45:00Z"}Atualizar comentário do pull request
/v1/origin/repos/{ownerSlug}/{repoName}/pulls/comments/{commentId}Atualiza um comentário de pull request pelo seu ID estável do Origin.
Substitui o corpo do comentário. O comentário deve pertencer ao repositório no caminho, ser visível para o solicitante e ter sido escrito por esse solicitante. Comentários de repositórios diferentes e comentários ocultos pendentes de revisão retornam 404; um comentário visível pertencente a outro autor retorna 403. Corpos com mais de 65.536 caracteres são rejeitados com InvalidArgument (HTTP 400).
Parâmetros de caminho
ownerSlug string Obrigatório
repoName string Obrigatório
commentId string Obrigatório
Corpo da solicitação
body string Obrigatório
Campos de resposta
id string
thread object
thread.id string
thread.version object
thread.version.number string
thread.version.headSha string
thread.version.baseSha string
thread.path string
thread.side string
left, right. Não definido para tópicos de discussão geral.thread.startLine integer
side do arquivo. 0 para tópicos no nível do arquivo e de discussão geral.thread.endLine integer
0 quando a âncora corresponde a uma única linha ou não possui intervalo de linhas.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 somente enquanto esse perfil estiver publicamente visível; omitido caso contrário.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?"}'Formato da resposta:
{ "id": "cmt_01k2ja2000e0080000000000e5", "thread": { "id": "cth_01k2ja2000e0080000000000s6", "version": { "number": "3", "headSha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4", "baseSha": "3b1f9c2d8a7e6f5049c8b7a6d5e4f3a2b1c0d9e8" }, "path": "src/telemetry/retry.ts", "side": "right", "startLine": 42, "endLine": 45, "createdAt": "2026-08-01T09:30:00Z", "updatedAt": "2026-08-02T14:45:00Z" }, "body": "Should the retry budget be configurable?", "author": { "user": { "id": "user_01k2ja2000e0080000000000c3", "email": "[email protected]" } }, "createdAt": "2026-08-01T09:30:00Z", "updatedAt": "2026-08-02T14:45:00Z"}Atualizar thread do pull request
/v1/origin/repos/{ownerSlug}/{repoName}/pulls/threads/{threadId}Resolve ou reabre uma discussão de comentários de pull request e retorna o estado atualizado da discussão. Resolver uma discussão já resolvida, ou reabrir uma já aberta, não tem efeito.
O thread deve pertencer ao repositório indicado no caminho; um thread armazenado em outro repositório retorna 404. É permitido responder a um thread resolvido com Create Pull Request Comment, e isso não o reabre.
Parâmetros de caminho
ownerSlug string Obrigatório
repoName string Obrigatório
threadId string Obrigatório
Corpo da solicitação
resolved boolean Obrigatório
true resolve a conversa; false reabre a conversa.Campos da resposta
id string
version object
version.number string
version.headSha string
version.baseSha string
path string
side string
left, right. Não definido para threads de discussão geral.startLine integer
side do arquivo. 0 para threads no nível do arquivo e de discussão geral.endLine integer
0 quando a âncora é uma única linha ou não tem intervalo de linhas.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}'Estrutura da resposta:
{ "id": "cth_01k2ja2000e0080000000000s6", "version": { "number": "3", "headSha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4", "baseSha": "3b1f9c2d8a7e6f5049c8b7a6d5e4f3a2b1c0d9e8" }, "path": "src/telemetry/retry.ts", "side": "right", "startLine": 42, "endLine": 45, "resolvedAt": "2026-08-03T10:00:00Z", "createdAt": "2026-08-01T09:30:00Z", "updatedAt": "2026-08-03T10:00:00Z"}Listar commits do pull request
/v1/origin/repos/{ownerSlug}/{repoName}/pulls/{pullNumber}/commitsLista os commits de um pull request.
Retorna os commits do pull request como objetos Commit esparsos (sem stats). Os resultados padrão são 30 e são limitados a 100, com no máximo 250 commits visíveis ao todo. Um token de página fixa a versão do pull request e o cursor de commits; um token que não corresponda mais ao head ou base atual retorna 400.
Parâmetros de caminho
ownerSlug string Obrigatório
repoName string Obrigatório
pullNumber string Obrigatório
Parâmetros de consulta
pageSize integer
pageToken string
next_page_token. Vazio na primeira página. O token está vinculado ao repositório, à versão da pull request e ao deslocamento do commit. O pageSize informado em uma solicitação de acompanhamento vale para essa página; omita-o para manter o tamanho de página anterior.Campos da resposta
commits matriz
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 matriz
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'Formato da resposta:
{ "commits": [ { "sha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4", "commit": { "author": { "name": "Jane Doe", "email": "[email protected]", "date": "2026-08-01T09:30:00Z" }, "committer": { "name": "Jane Doe", "email": "[email protected]", "date": "2026-08-01T09:30:00Z" }, "message": "Add launch telemetry", "tree": { "sha": "a7b6c5d4e3f2a1b0c9d8e7f6a5b4c3d2e1f0a9b8" } }, "parents": [ { "sha": "3b1f9c2d8a7e6f5049c8b7a6d5e4f3a2b1c0d9e8" } ], "stats": { "additions": 128, "deletions": 46, "total": 174 } } ]}Listar arquivos do pull request
/v1/origin/repos/{ownerSlug}/{repoName}/pulls/{pullNumber}/filesLista os arquivos alterados em um pull request.
Retorna o nome do arquivo, o status, a contagem de linhas, o patch e, opcionalmente, o nome anterior do arquivo. Por padrão, os resultados trazem 30 arquivos, com limite máximo de 100. Um page token fixa a versão da pull request e o cursor de arquivos; um token que não corresponda mais ao head ou à base atual retorna 400.
Parâmetros de caminho
ownerSlug string Obrigatório
repoName string Obrigatório
pullNumber string Obrigatório
Parâmetros de consulta
pageSize integer
pageToken string
next_page_token). Vazio na primeira página. O token está vinculado ao repositório, à versão da pull request e ao cursor de arquivo alterado. O pageSize em uma solicitação de acompanhamento se aplica a essa página; omita-o para manter o tamanho de página anterior.Campos da resposta
files matriz
files[].filename string
files[].status string
files[].additions integer
files[].deletions integer
files[].changes integer
files[].patch string
files[].previousFilename string
nextPageToken string
curl --request GET \ --url 'https://api.cursor.com/v1/origin/repos/OWNER_SLUG/REPO_NAME/pulls/PULL_NUMBER/files' \ --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN'Estrutura da resposta:
{ "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 rótulos de pull request
/v1/origin/repos/{ownerSlug}/{repoName}/pulls/{pullNumber}/labelsLista todos os rótulos atribuídos a um pull request, ordenados por nome.
A resposta contém a lista completa de rótulos atribuídos, em vez de uma página dela; portanto, este endpoint não aceita parâmetros de paginação. Um pull request pode ter no máximo 100 rótulos. Um pull request desconhecido retorna 404.
Parâmetros de caminho
ownerSlug string Obrigatório
repoName string Obrigatório
pullNumber string Obrigatório
Campos da resposta
labels array
labels[].id string
labels[].name string
labels[].color string
# no início.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'Formato da resposta:
{ "labels": [ { "id": "lbl_01k2ja2000e0080000000000m1", "name": "bug", "color": "d73a4a", "description": "Something isn't working" } ]}Definir rótulos do Pull Request
/v1/origin/repos/{ownerSlug}/{repoName}/pulls/{pullNumber}/labelsSubstitui todos os rótulos atribuídos a um pull request pelos rótulos indicados.
Uma lista vazia remove todos os rótulos atribuídos. Os rótulos já devem existir no repositório; um nome desconhecido ou um pull request desconhecido retorna 404. Um pull request pode ter no máximo 100 rótulos, portanto especificar mais de 100 retorna FailedPrecondition (HTTP 400). A resposta lista os rótulos atribuídos após a substituição, ordenados por nome.
Parâmetros de caminho
ownerSlug string Obrigatório
repoName string Obrigatório
pullNumber string Obrigatório
Corpo da solicitação
labels matriz
Campos da resposta
labels matriz
id, name, color e 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" ]}'Formato da resposta:
{ "labels": [ { "id": "lbl_01k2ja2000e0080000000000m1", "name": "bug", "color": "d73a4a", "description": "Something isn't working" } ]}Adicionar rótulos a uma pull request
/v1/origin/repos/{ownerSlug}/{repoName}/pulls/{pullNumber}/labelsAdiciona rótulos existentes do repositório a uma pull request.
Os rótulos já atribuídos à pull request permanecem atribuídos. Os rótulos já devem existir no repositório; um nome ou uma pull request desconhecidos resultam em 404. A solicitação deve especificar entre 1 e 100 rótulos, e uma pull request pode ter no máximo 100 rótulos no total; portanto, uma solicitação que ultrapassaria esse limite resulta em FailedPrecondition (HTTP 400). A resposta lista os rótulos especificados, não o conjunto completo da pull request; consulte o conjunto completo em Listar rótulos da pull request.
Parâmetros de caminho
ownerSlug string Obrigatório
repoName string Obrigatório
pullNumber string Obrigatório
Corpo da solicitação
labels matriz Obrigatório
Campos da resposta
labels matriz
id, name, color e 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" ]}'Formato da resposta:
{ "labels": [ { "id": "lbl_01k2ja2000e0080000000000m1", "name": "bug", "color": "d73a4a", "description": "Something isn't working" } ]}Remover todos os rótulos de um pull request
/v1/origin/repos/{ownerSlug}/{repoName}/pulls/{pullNumber}/labelsRemove todos os rótulos de um pull request.
A solicitação é bem-sucedida quando o pull request não possui rótulos. Um pull request inexistente retorna 404. O corpo da resposta está vazio.
Parâmetros de caminho
ownerSlug string Obrigatório
repoName string Obrigatório
pullNumber string Obrigatório
Campos da resposta
Solicitações bem-sucedidas não retornam corpo da resposta.
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'Resposta:
204 No ContentRemover rótulo de Pull Request
/v1/origin/repos/{ownerSlug}/{repoName}/pulls/{pullNumber}/labels/{labelName}Remove um rótulo de um pull request.
Um rótulo não atribuído ao pull request retorna 404, assim como um pull request desconhecido. A resposta lista os rótulos restantes no pull request, ordenados por nome.
Parâmetros de caminho
ownerSlug string Obrigatório
repoName string Obrigatório
pullNumber string Obrigatório
labelName string Obrigatório
Campos da resposta
labels matriz
id, name, color e 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'Formato da resposta:
{ "labels": [ { "id": "lbl_01k2ja2000e0080000000000m1", "name": "bug", "color": "d73a4a", "description": "Something isn't working" } ]}Mesclar pull request
/v1/origin/repos/{ownerSlug}/{repoName}/pulls/{pullNumber}/mergeFaz o merge de um pull request em sua base.
Para um pull request em pilha, faz merge de todo o prefixo da raiz ao destino, que termina neste número de pull, não apenas deste pull. Compatível apenas com repositórios Origin nativos; repositórios espelhados são rejeitados.
O merge incorpora o commit mais recente da version mais recente da solicitação de pull. Se a branch de origem avançou além desse commit — por exemplo, porque um push foi feito, mas o Origin ainda não o registrou como uma nova versão —, a solicitação retorna Aborted (HTTP 409 Conflict), a mesma resposta que para um expectedHeadSha desatualizado, e nada é mesclado. Tente novamente depois que Obter solicitação de pull informar o novo head em version.headSha.
Parâmetros de caminho
ownerSlug string Obrigatório
repoName string Obrigatório
pullNumber string Obrigatório
Corpo da solicitação
expectedHeadSha string
ABORTED (HTTP 409 Conflict), e nada será mesclado. Valores que não sejam um SHA completo de commit serão rejeitados com InvalidArgument (HTTP 400). Omita esse valor para mesclar o head atual, seja ele qual for. Essa verificação não é feita quando o pull request já foi mesclado; nesse caso, a operação retorna sucesso idempotente.mergeMethod string
merge, que cria um commit de merge, e squash, que cria um único commit squash. Um método não permitido pelo repositório é rejeitado com FailedPrecondition (HTTP 400), e qualquer outro valor é rejeitado com InvalidArgument (HTTP 400). Omita-o para usar o padrão do repositório: um commit de merge quando permitido; caso contrário, um squash. Se o branch base exigir um histórico linear, será usado um squash.Campos da resposta
mergeCommitSha string
pull/<number>/merge com Obter referência do Git.mergedPullNumbers vetor
pullRequest object
pullRequest.id string
pullRequest.number string
pullRequest.state string
pullRequest.draft boolean
pullRequest.merged boolean
pullRequest.title string
pullRequest.body string
pullRequest.head object
pullRequest.head.ref string
pullRequest.head.sha string
pullRequest.base objeto
pullRequest.base.ref string
pullRequest.base.sha string
pullRequest.author object
pullRequest.author.user objeto
pullRequest.author.user.id string
pullRequest.author.user.email string
pullRequest.author.user.displayName string
pullRequest.author.user.handle string
@. Presente apenas enquanto esse perfil estiver visível publicamente; caso contrário, é omitido.pullRequest.author.app objeto
pullRequest.author.app.id string
pullRequest.author.app.displayName string
pullRequest.author.serviceAccount objeto
pullRequest.author.serviceAccount.id string
pullRequest.createdAt string
pullRequest.updatedAt string
pullRequest.closedAt string
pullRequest.mergedAt string
pullRequest.mergeCommitSha string
pull/<number>/merge com Obter referência do Git.pullRequest.additions integer
pullRequest.deletions integer
pullRequest.changedFiles integer
pullRequest.labels matriz
pullRequest.labels[].id string
pullRequest.labels[].name string
pullRequest.labels[].color string
# inicial.pullRequest.labels[].description string
pullRequest.stack objeto
pullRequest.stack.id string
stackId para Listar solicitações de pull para consultar os outros membros.pullRequest.stack.parentPullRequest objeto
pullRequest.stack.parentPullRequest.id string
pullRequest.stack.parentPullRequest.number string
pullRequest.stack.parentPullRequest.repository objeto
id, name e owner do repository de uma execução de verificação. Stacks nunca cruzam repositórios, portanto este é sempre o próprio repositório do pull request.pullRequest.version objeto
pullRequest.version.number string
pullRequest.version.headSha string
pullRequest.version.baseSha string
pullRequest.version.createdAt string
pullRequest.version.potentialMergeCommit object
headSha à ponta da branch base, além do estágio alcançado pela preparação. Presente em todas as versões. Descreve apenas esta versão e continua acessível após o merge do pull request; é um commit diferente de mergeCommitSha. Para um pull request empilhado, a branch base é a branch do pull request pai. Assim, o merge de teste inclui apenas as alterações deste pull request sobre essa branch.pullRequest.version.potentialMergeCommit.state string
unknown, prepared, merge_conflict. unknown significa que o merge de teste não está preparado: a versão está aguardando a preparação, ou a preparação excedeu o tempo limite ou falhou. Toda nova versão começa como unknown, portanto nunca contém o commit de outra versão. prepared significa que o merge de teste existe e que sha e baseSha o descrevem. merge_conflict significa que houve um conflito ao mesclar headSha na ponta do branch base, portanto não há merge de teste; essa é a condição que Obter possibilidade de merge do pull request relata como um impedimento merge_conflict, e reabrir o pull request prepara a versão novamente. Trate um valor não reconhecido como unknown.pullRequest.version.potentialMergeCommit.sha string
baseSha deste objeto e o segundo é o headSha da versão. Presente apenas quando state é prepared. A ref pull/{pullNumber}/merge aponta para ele enquanto esta for a versão mais recente. Depois disso, ele continua disponível para leitura pelo SHA por meio de Obter commit, mas não pode ser consultado pelo SHA via Git.pullRequest.version.potentialMergeCommit.baseSha string
state é prepared. Ele pode ser mais recente que pullRequest.version.baseSha, e o Origin não o atualiza quando a branch base simplesmente avança.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"}'Formato da resposta:
{ "mergeCommitSha": "5c4d3e2f1a0b9c8d7e6f5a4b3c2d1e0f9a8b7c6d", "mergedPullNumbers": [ "17" ], "pullRequest": { "id": "pr_01k2ja2000e0080000000000d4", "number": "17", "state": "closed", "draft": false, "merged": true, "title": "Add launch telemetry", "body": "Adds structured launch telemetry to the ignition path.", "head": { "ref": "add-telemetry", "sha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4" }, "base": { "ref": "main", "sha": "3b1f9c2d8a7e6f5049c8b7a6d5e4f3a2b1c0d9e8" }, "author": { "user": { "id": "user_01k2ja2000e0080000000000c3", "email": "[email protected]" } }, "createdAt": "2026-08-01T09:30:00Z", "updatedAt": "2026-08-02T14:45:00Z", "closedAt": "2026-08-03T10:15:00Z", "mergedAt": "2026-08-03T10:15:00Z", "mergeCommitSha": "5c4d3e2f1a0b9c8d7e6f5a4b3c2d1e0f9a8b7c6d", "additions": 128, "deletions": 46, "changedFiles": 5, "labels": [ { "id": "lbl_01k2ja2000e0080000000000m1", "name": "bug", "color": "d73a4a", "description": "Something isn't working" } ], "version": { "number": "3", "headSha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4", "baseSha": "3b1f9c2d8a7e6f5049c8b7a6d5e4f3a2b1c0d9e8", "createdAt": "2026-08-01T09:30:00Z" } }}Obter capacidade de mesclagem da pull request
/v1/origin/repos/{ownerSlug}/{repoName}/pulls/{pullNumber}/mergeabilityRetorna se a pull request pode ser mesclada e, quando não pode, as condições que a bloqueiam. O veredito é avaliado com base nas mesmas condições que Merge Pull Request impõe, portanto um veredito mergeable significa que espera-se que uma mesclagem do mesmo head seja bem-sucedida. Para uma pull request empilhada, o veredito abrange todas as pull requests desde a raiz da pilha até esta, e cada bloqueador identifica a pull request a que pertence.
Uma stack com mais de 200 pull requests no total, incluindo ancestrais já mesclados, retorna FailedPrecondition (HTTP 400).
Esta operação está em prévia e seu formato pode mudar enquanto o contrato não estiver definido. Decodifique as respostas tolerando campos desconhecidos e valores de enum desconhecidos, trate um verdict não reconhecido como blocked e renderize blockers[].message quando não reconhecer blockers[].kind.
Parâmetros de caminho
ownerSlug string Obrigatório
repoName string Obrigatório
pullNumber string Obrigatório
Parâmetros de consulta
expectedHeadSha string
Aborted (HTTP 409 Conflict) em vez de um resultado. Um valor que não seja um SHA completo de commit retorna InvalidArgument (HTTP 400).Campos de resposta
pullRequest objeto
pullRequest.id string
pullRequest.number string
pullRequest.repository objeto
pullRequest.repository.id string
pullRequest.repository.name string
pullRequest.repository.owner object
pullRequest.repository.owner.slug string
pullRequest.repository.owner.id string
pullRequest.repository.owner.type string
team, user. Omitido quando desconhecido.verdict string
evaluatedPullRequests. Valores permitidos: mergeable, indicando que mergear pullRequest integra todos eles, e blocked. Trate qualquer valor não reconhecido como blocked.blockers matriz
verdict é mergeable. No máximo um bloqueador por pull request por tipo, exceto required_checks, que tem um por estado, e rule_failure e ruleset_error, que têm um por mensagem distinta.blockers[].pullRequest objeto
evaluatedPullRequests ao qual este bloqueador pertence. Possui os mesmos campos que pullRequest.blockers[].kind string
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. Novos tipos são adicionados ao longo do tempo; um blocker cujo tipo for mais recente que o seu client é decodificado com kind sem valor e continua bloqueando.blockers[].message string
kind não for reconhecido.blockers[].requiredChecks objeto
required_checks.blockers[].requiredChecks.state string
missing, pending, failing, action_required.blockers[].requiredChecks.checks matriz
blockers[].requiredChecks.checks[].name string
blockers[].requiredChecks.checks[].owner objeto
actor de uma execução de verificação.blockers[].requiredChecks.checks[].checkRun objeto
headSha que corresponde a este requisito, por referência. Omitida quando nenhuma foi relatada, o que corresponde ao estado missing. Ela traz apenas id, name e checkSuite.id, porque esta operação pode ser lida apenas com repository:pull_requests:read, enquanto o status, a conclusão, a saída e a URL de detalhes de uma execução exigem repository:checks:read; leia esses dados com Obter execução de verificação.blockers[].requiredApprovals objeto
required_approvals.blockers[].requiredApprovals.requiredCount integer
blockers[].requiredApprovals.approvedCount integer
blockers[].codeownerApproval objeto
codeowner_approval.blockers[].codeownerApproval.requirements matriz
blockers[].codeownerApproval.requirements[].owners matriz
blockers[].codeownerApproval.requirements[].paths matriz
blockers[].mergeConflict object
merge_conflict.blockers[].mergeConflict.conflictedPaths matriz
blockers[].mergeConflict.truncated booleano
blockers[].mergeConflict.inheritedFromDownstack booleano
blockers[].stackShape objeto
invalid_stack.blockers[].stackShape.reason string
partially_merged, cycle, missing_parent, cross_repository_parent, base_branch_missing.blockers[].stackShape.relatedPullRequests matriz
pullRequest.evaluatedPullRequests matriz
pullRequest iria resultar, começando pela raiz da stack e terminando em pullRequest. Ancestrais que já foram mesclados fazem parte do histórico e não são listados. Exatamente um elemento para um pull request não empilhado. Cada um contém os mesmos campos de pullRequest.headSha string
pullRequest que foi avaliado.baseRef string
baseSha string
baseRef em evaluatedAt. Um push posterior para baseRef pode alterar o veredito. Fica vazio quando a branch base não pôde ser determinada, por exemplo em uma stack inválida.evaluatedAt string
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": "Approving review count is 0; 1 required. Request reviews and wait for the required approvals.", "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": "Required status checks are pending. Wait for checks to finish or fix the failing checks.", "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 revisores solicitados de um pull request
/v1/origin/repos/{ownerSlug}/{repoName}/pulls/{pullNumber}/requested_reviewersLista os usuários e grupos cuja revisão está solicitada atualmente em um pull request.
Uma solicitação direta é encerrada quando aquele usuário envia uma revisão, e uma solicitação de grupo é encerrada quando qualquer membro atual do grupo envia. Revisões em draft não enviadas mantêm a solicitação pendente, e solicitar revisão novamente após um envio devolve o revisor a esta lista. Grupos sem um identificador público legível são omitidos.
Parâmetros de caminho
ownerSlug string Obrigatório
repoName string Obrigatório
pullNumber string Obrigatório
Campos da resposta
users matriz
users[].id string
user_…), no mesmo formato usado pela API da organização.users[].email string
users[].displayName string
users[].handle string
@. Presente apenas enquanto esse perfil estiver visível publicamente; omitido caso contrário.groups matriz
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'Formato da resposta:
{ "users": [ { "id": "user_01k2ja2000e0080000000000c3", "email": "[email protected]" } ], "groups": [ { "id": "grp_01k2ja2000e0080000000000n2" } ]}Request Pull Request Reviewers
/v1/origin/repos/{ownerSlug}/{repoName}/pulls/{pullNumber}/requested_reviewersSolicita revisões dos usuários e grupos informados em um pull request e retorna os reviewers solicitados por essa chamada.
Os identificadores são resolvidos em relação aos candidatos a revisor do repositório por ID público, e-mail do usuário ou slug do grupo. Nomes de exibição não são resolvidos. Um identificador desconhecido ou ambíguo retorna InvalidArgument (HTTP 400) nomeando o identificador, e é necessário pelo menos uma entrada não vazia entre users e groups.
Solicitar um reviewer que já foi solicitado atualiza o timestamp da solicitação, fazendo com que um reviewer que já havia enviado uma revisão volte a aparecer como pendente. Um reviewer que não é candidato do repositório retorna PermissionDenied (HTTP 403).
Path Parameters
ownerSlug string Obrigatório
repoName string Obrigatório
pullNumber string Obrigatório
Corpo da solicitação
users array
user_… ou e-mail.groups matriz
grp_…, slug de grupo qualificado ou slug do grupo.Response Fields
users matriz
users[].id string
user_…), no mesmo formato usado pela API da organização.users[].email string
users[].displayName string
users[].handle string
@. Presente apenas enquanto esse perfil estiver publicamente visível; caso contrário, é omitido.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" ]}'Formato da resposta:
{ "users": [ { "id": "user_01k2ja2000e0080000000000c3", "email": "[email protected]" } ], "groups": [ { "id": "grp_01k2ja2000e0080000000000n2" } ]}Remover revisores solicitados de um pull request
/v1/origin/repos/{ownerSlug}/{repoName}/pulls/{pullNumber}/requested_reviewersRemove as revisões solicitadas aos usuários e grupos informados em um pull request. O corpo da resposta é vazio.
Os identificadores são resolvidos entre os candidatos a revisor do repositório por public id, email do usuário ou slug do grupo. Nomes de exibição não são resolvidos. Um identificador desconhecido ou ambíguo retorna InvalidArgument (HTTP 400) indicando o identificador, e é necessária pelo menos uma entrada não vazia entre users e groups.
Remover um usuário ou grupo que não esteja solicitado no momento não tem efeito. Um identificador que não seja mais um candidato a revisor ainda é aceito quando for um public id estável (user_… ou grp_…), de modo que um revisor que saiu do repositório possa ser removido.
Parâmetros de caminho
ownerSlug string Obrigatório
repoName string Obrigatório
pullNumber string Obrigatório
Corpo da solicitação
users matriz
user_… ou email.groups matriz
grp_…, slug de grupo qualificado ou slug de grupo.Campos da resposta
Solicitações bem-sucedidas não retornam corpo da resposta.
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" ]}'Resposta:
204 No ContentListar revisões de pull request
/v1/origin/repos/{ownerSlug}/{repoName}/pulls/{pullNumber}/reviewsLista as revisões enviadas em um pull request, ordenadas por submitted_at em ordem crescente. Revisões pendentes são omitidas.
Parâmetros de caminho
ownerSlug string Obrigatório
repoName string Obrigatório
pullNumber string Obrigatório
Parâmetros de consulta
pageSize integer
pageToken string
nextPageToken de uma resposta anterior. Omita-o na primeira página. O pageSize em uma solicitação de acompanhamento se aplica a essa página; omita-o para manter o tamanho de página anterior.Campos da resposta
reviews matriz
reviews[].id string
reviews[].author object
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 apenas enquanto esse perfil estiver publicamente visível; omitido caso contrário.reviews[].author.app object
reviews[].author.app.id string
reviews[].author.app.displayName string
reviews[].author.serviceAccount objeto
reviews[].author.serviceAccount.id string
reviews[].verdict string
reviews[].body string
reviews[].submittedAt string
reviews[].pullRequestVersion objeto
reviews[].pullRequestVersion.number string
reviews[].pullRequestVersion.headSha string
reviews[].pullRequestVersion.baseSha string
reviews[].dismissal object
reviews[].dismissal.dismissedBy objeto
reviews[].dismissal.dismissedBy.user objeto
reviews[].dismissal.dismissedBy.user.id string
reviews[].dismissal.dismissedBy.user.email string
reviews[].dismissal.dismissedBy.user.displayName string
reviews[].dismissal.dismissedBy.user.handle string
@. Presente apenas enquanto esse perfil estiver publicamente visível; omitido caso contrário.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 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, user. Omitido quando desconhecido.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'Formato da resposta:
{ "reviews": [ { "id": "rev_01k2ja2000e0080000000000f6", "author": { "user": { "id": "user_01k2ja2000e0080000000000c3", "email": "[email protected]" } }, "verdict": "approve", "body": "Approving. The telemetry schema matches the spec.", "submittedAt": "2026-08-02T15:00:00Z", "pullRequestVersion": { "number": "3", "headSha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4", "baseSha": "3b1f9c2d8a7e6f5049c8b7a6d5e4f3a2b1c0d9e8" } } ], "pullRequest": { "id": "pr_01k2ja2000e0080000000000d4", "number": "17", "repository": { "id": "repo_01k2ja2000e0080000000000q4", "name": "rocket", "owner": { "slug": "acme", "id": "ns_01k2ja2000e0080000000000p3", "type": "team" } } }}Criar revisão de pull request
/v1/origin/repos/{ownerSlug}/{repoName}/pulls/{pullNumber}/reviewsCria e envia uma revisão em uma pull request, opcionalmente com seus comentários, em uma única solicitação atômica. Cada comentário aceita os mesmos destinos aceitos por Criar comentário de pull request: comments[].inline para um intervalo de linhas, comments[].file para um arquivo inteiro, comments[].threadId para uma resposta, e nenhum deles para discussão geral.
A revisão é enviada imediatamente. Uma nova revisão approve ou request_changes substitui a revisão de decisão ativa anterior do chamador na mesma pull request, que é descartada. Autores de pull requests não podem approve suas próprias pull requests. Falha com FAILED_PRECONDITION enquanto o chamador tiver uma revisão de rascunho não enviada na pull request.
Quando comments está definido, cada âncora é validada em relação ao diff da versão revisada antes de qualquer gravação, usando a mesma verificação no diff de Create Pull Request Comment. Se um comentário falhar, toda a solicitação falha com InvalidArgument (HTTP 400) e nada é publicado. Os comentários ficam visíveis de forma atômica junto com a revisão: nenhum comentário ou evento pode ser observado até que a revisão seja enviada; então, cada comentário emite seu próprio webhook pull_request.comment.created, juntamente com o evento da revisão.
A operação não inclui uma chave de idempotência, portanto uma nova tentativa após uma falha de transporte ambígua pode criar uma segunda revisão. Chame Listar revisões do pull request antes de tentar novamente.
Parâmetros de caminho
ownerSlug string Obrigatório
repoName string Obrigatório
pullNumber string Obrigatório
Corpo da solicitação
verdict string Obrigatório
PULL_REQUEST_REVIEW_VERDICT_UNSPECIFIED, approve, request_changes, comment.body string
versionNumber string
PullRequestVersion.number). Omitir para revisar a versão mais recente no momento da chamada. Os comentários são ancorados nessa mesma versão.comments array
comments[].body string Obrigatório
comments[].inline objeto
inline em Criar comentário de pull request. Não pode ser combinada com comments[].threadId.comments[].inline.path string Obrigatório
comments[].inline.side string Obrigatório
left para a versão base do arquivo, right para a versão head.comments[].inline.startLine inteiro Obrigatório
side do arquivo. O intervalo não pode ultrapassar o fim desse arquivo.comments[].inline.endLine integer
startLine. Omitir para uma âncora de linha única.comments[].threadId string
comments[].inline, comments[].file e este campo para abrir uma nova thread de discussão geral.comments[].file objeto
file em Criar comentário de pull request. Não pode ser combinada com comments[].inline nem com comments[].threadId.comments[].file.path string Obrigatório
Campos da resposta
id string
author objeto
author.user objeto
author.user.id string
author.user.email string
author.user.displayName string
author.user.handle string
@. Presente apenas enquanto esse perfil estiver visível publicamente; omitido caso contrário.author.app objeto
author.app.id string
author.app.displayName string
author.serviceAccount objeto
author.serviceAccount.id string
verdict string
body string
submittedAt string
pullRequestVersion objeto
pullRequestVersion.number string
pullRequestVersion.headSha string
pullRequestVersion.baseSha string
dismissal objeto
dismissal.dismissedBy objeto
dismissal.dismissedBy.user objeto
dismissal.dismissedBy.user.id string
dismissal.dismissedBy.user.email string
dismissal.dismissedBy.user.displayName string
dismissal.dismissedBy.user.handle string
@. Presente apenas enquanto esse perfil estiver visível publicamente; omitido caso contrário.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 string
dismissal.message string
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"}'Estrutura da resposta:
{ "id": "rev_01k2ja2000e0080000000000f6", "author": { "user": { "id": "user_01k2ja2000e0080000000000c3", "email": "[email protected]" } }, "verdict": "approve", "body": "Approving. The telemetry schema matches the spec.", "submittedAt": "2026-08-02T15:00:00Z", "pullRequestVersion": { "number": "3", "headSha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4", "baseSha": "3b1f9c2d8a7e6f5049c8b7a6d5e4f3a2b1c0d9e8" }}Atualizar revisão do Pull Request
/v1/origin/repos/{ownerSlug}/{repoName}/pulls/{pullNumber}/reviews/{reviewId}Atualiza o corpo de uma revisão. Somente o autor da revisão pode atualizá-la; outros chamadores recebem PERMISSION_DENIED. Uma revisão que não pertence ao pull request especificado retorna NOT_FOUND.
As revisões de rascunho não enviadas também podem ser atualizadas; a resposta de um rascunho não tem submitted_at.
Parâmetros de caminho
ownerSlug string Obrigatório
repoName string Obrigatório
pullNumber string Obrigatório
reviewId string Obrigatório
Corpo da solicitação
body string Obrigatório
Campos de resposta
id string
author object
author.user object
author.user.id string
author.user.email string
author.user.displayName string
author.user.handle string
@. Presente somente enquanto esse perfil estiver visível publicamente; caso contrário, é omitido.author.app object
author.app.id string
author.app.displayName string
author.serviceAccount object
author.serviceAccount.id string
verdict string
body string
submittedAt string
pullRequestVersion object
pullRequestVersion.number string
pullRequestVersion.headSha string
pullRequestVersion.baseSha string
dismissal object
dismissal.dismissedBy object
dismissal.dismissedBy.user object
dismissal.dismissedBy.user.id string
dismissal.dismissedBy.user.email string
dismissal.dismissedBy.user.displayName string
dismissal.dismissedBy.user.handle string
@. Presente somente enquanto esse perfil estiver visível publicamente; caso contrário, é omitido.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 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."}'Formato da resposta:
{ "id": "rev_01k2ja2000e0080000000000f6", "author": { "user": { "id": "user_01k2ja2000e0080000000000c3", "email": "[email protected]" } }, "verdict": "approve", "body": "Approving. The telemetry schema matches the spec.", "submittedAt": "2026-08-02T15:00:00Z", "pullRequestVersion": { "number": "3", "headSha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4", "baseSha": "3b1f9c2d8a7e6f5049c8b7a6d5e4f3a2b1c0d9e8" }}Descartar revisão do Pull Request
/v1/origin/repos/{ownerSlug}/{repoName}/pulls/{pullNumber}/reviews/{reviewId}/dismissalsDescarta uma revisão enviada para que seu veredito deixe de ser considerado no estado de revisão do pull request. A própria revisão é mantida e continua aparecendo em ListPullRequestReviews, com dismissal definido.
Para dispensar uma revisão, não é necessário tê-la criado; basta ter permissão de gravação nas revisões de pull request do repositório.
Somente as revisões approve e request_changes podem ser descartadas, e apenas uma vez: uma revisão comment, uma revisão de rascunho não enviada ou uma revisão já descartada retorna FAILED_PRECONDITION, e repetir a chamada mantém o primeiro descarte. Uma revisão que não pertence ao pull request especificado retorna NOT_FOUND.
Parâmetros de caminho
ownerSlug string Obrigatório
repoName string Obrigatório
pullNumber string Obrigatório
reviewId string Obrigatório
Corpo da solicitação
message string Obrigatório
Campos de resposta
id string
author object
author.user object
author.user.id string
author.user.email string
author.user.displayName string
author.user.handle string
@. Presente apenas enquanto esse perfil estiver visível publicamente; omitido caso contrário.author.app object
author.app.id string
author.app.displayName string
author.serviceAccount object
author.serviceAccount.id string
verdict string
body string
submittedAt string
pullRequestVersion object
pullRequestVersion.number string
pullRequestVersion.headSha string
pullRequestVersion.baseSha string
dismissal object
dismissal.dismissedBy object
dismissal.dismissedBy.user object
dismissal.dismissedBy.user.id string
dismissal.dismissedBy.user.email string
dismissal.dismissedBy.user.displayName string
dismissal.dismissedBy.user.handle string
@. Presente apenas enquanto esse perfil estiver visível publicamente; omitido caso contrário.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."}'Formato da resposta:
{ "id": "rev_01k2ja2000e0080000000000f6", "author": { "user": { "id": "user_01k2ja2000e0080000000000c3", "email": "[email protected]" } }, "verdict": "approve", "body": "Approving. The telemetry schema matches the spec.", "submittedAt": "2026-08-02T15:00:00Z", "pullRequestVersion": { "number": "3", "headSha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4", "baseSha": "3b1f9c2d8a7e6f5049c8b7a6d5e4f3a2b1c0d9e8" }, "dismissal": { "dismissedBy": { "user": { "id": "user_01k2ja2000e0080000000000c3", "email": "[email protected]" } }, "dismissedAt": "2026-08-02T15:00:00Z", "message": "Superseded by a newer review." }}Conjuntos de regras
Listar conjuntos de regras
/v1/origin/repos/{ownerSlug}/{repoName}/rulesetsLista todos os conjuntos de regras configurados em um repositório.
Os conjuntos de regras por repositório são uma configuração limitada, portanto o conjunto completo é retornado em uma única resposta e este endpoint não faz paginação. repository é içado (hoisted) uma vez e descreve o repositório compartilhado por cada conjunto de regras na resposta.
Parâmetros de caminho
ownerSlug string Obrigatório
repoName string Obrigatório
Campos da resposta
rulesets matriz
rulesets[].id string
rulesets[].name string
rulesets[].description string
rulesets[].enforcement string
active, evaluate, disabled.rulesets[].kind string
merge_branch, push_branch, push_tag, push_repository.rulesets[].includedRefNames matriz
~ALL e ~DEFAULT_BRANCH.rulesets[].excludedRefNames matriz
rulesets[].includedRefNames.rulesets[].rules matriz
rulesets[].rules[].id string
rulesets[].rules[].ruleType string
pull_request, require_status_checks, require_branch_up_to_date, deletion ou non_fast_forward.rulesets[].rules[].parameters objeto
rulesets[].rules[].ruleType.rulesets[].bypassActors matriz
rulesets[].bypassActors[].id string
rulesets[].bypassActors[].bypassMode string
always, pull_request_only.rulesets[].bypassActors[].user objeto
user, team, app ou 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. Omitido quando desconhecido.curl --request GET \ --url 'https://api.cursor.com/v1/origin/repos/OWNER_SLUG/REPO_NAME/rulesets' \ --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN'Estrutura da resposta:
{ "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" } }}Criar conjunto de regras
/v1/origin/repos/{ownerSlug}/{repoName}/rulesetsCria um conjunto de regras do repositório.
A resposta inclui o conjunto de regras armazenado, incluindo os IDs que o Origin atribui a cada regra e agente de bypass. Um name vazio é rejeitado com InvalidArgument (HTTP 400).
Parâmetros de caminho
ownerSlug string Obrigatório
repoName string Obrigatório
Corpo da solicitação
name string Obrigatório
descrição string
enforcement string Obrigatório
active, evaluate, disabled.kind string Obrigatório
merge_branch, push_branch, push_tag, push_repository.includedRefNames matriz
~ALL e ~DEFAULT_BRANCH. Valores acima de 64 entradas são rejeitados com InvalidArgument (HTTP 400).excludedRefNames matriz
includedRefNames.rules matriz
ruleType e parameters opcionais; a Origin atribui o id de cada regra. Mais de 20 entradas são rejeitadas com InvalidArgument (HTTP 400).bypassActors matriz
bypassMode e exatamente um entre user, team, app ou originRole; o Origin atribui o id de cada ator. Valores acima de 15 entradas são rejeitados com InvalidArgument (HTTP 400).Campos de resposta
id string
name string
descrição string
enforcement string
active, evaluate, disabled.kind string
merge_branch, push_branch, push_tag, push_repository.includedRefNames matriz
~ALL e ~DEFAULT_BRANCH.excludedRefNames matriz
includedRefNames.rules matriz
rules[].id string
rules[].ruleType string
pull_request, require_status_checks, require_branch_up_to_date, deletion ou non_fast_forward.rules[].parameters objeto
rules[].ruleType.bypassActors matriz
bypassActors[].id string
bypassActors[].bypassMode string
always, pull_request_only.bypassActors[].user objeto
user, team, app ou originRole está presente.bypassActors[].user.id string
bypassActors[].equipe object
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" } } ]}'Estrutura da resposta:
{ "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" } } ]}Obter conjunto de regras
/v1/origin/repos/{ownerSlug}/{repoName}/rulesets/{rulesetId}Retorna um conjunto de regras do repositório pelo ID estável da Origin.
Tanto um repositório desconhecido quanto um conjunto de regras desconhecido retornam 404; a mensagem permite diferenciá-los.
Parâmetros de caminho
ownerSlug string Obrigatório
repoName string Obrigatório
rulesetId string Obrigatório
Campos de resposta
id string
name string
description string
enforcement string
active, evaluate, disabled.kind string
merge_branch, push_branch, push_tag, push_repository.includedRefNames matriz
~ALL e ~DEFAULT_BRANCH.excludedRefNames matriz
includedRefNames.rules matriz
rules[].id string
rules[].ruleType string
pull_request, require_status_checks, require_branch_up_to_date, deletion ou non_fast_forward.rules[].parameters object
rules[].ruleType.bypassActors matriz
bypassActors[].id string
bypassActors[].bypassMode string
always, pull_request_only.bypassActors[].user objeto
user, team, app ou originRole está presente.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'Formato da resposta:
{ "id": "rs_01k2ja2000e0080000000000t7", "name": "require-review", "description": "Exigir uma revisão aprovada antes de mergear na 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_01k2ja2000e0080000000x0" } } ]}Atualizar conjunto de regras
/v1/origin/repos/{ownerSlug}/{repoName}/rulesets/{rulesetId}Atualiza um conjunto de regras do repositório existente.
A solicitação substitui toda a configuração do conjunto de regras. rules e bypassActors são substituídos integralmente, em vez de serem mesclados, e o Origin atribui novos IDs às entradas armazenadas. Portanto, envie todas as regras e todos os atores de bypass que deseja manter.
Parâmetros de caminho
ownerSlug string Obrigatório
repoName string Obrigatório
rulesetId string Obrigatório
Corpo da solicitação
name string Obrigatório
description string
enforcement string Obrigatório
active, evaluate, disabled.kind string Obrigatório
merge_branch, push_branch, push_tag, push_repository.includedRefNames matriz
~ALL e ~DEFAULT_BRANCH. Valores acima de 64 entradas são rejeitados com InvalidArgument (HTTP 400).excludedRefNames matriz
includedRefNames.rules matriz
ruleType e parameters opcionais; a Origin atribui o id de cada regra. Valores acima de 20 entradas são rejeitados com InvalidArgument (HTTP 400).bypassActors matriz
bypassMode e exatamente um entre user, team, app ou originRole; a Origin atribui o id de cada ator. Valores acima de 15 itens são rejeitados com InvalidArgument (HTTP 400).Campos da resposta
id string
name string
description string
enforcement string
active, evaluate, disabled.kind string
merge_branch, push_branch, push_tag, push_repository.includedRefNames matriz
~ALL e ~DEFAULT_BRANCH.excludedRefNames matriz
includedRefNames.rules matriz
rules[].id string
rules[].ruleType string
pull_request, require_status_checks, require_branch_up_to_date, deletion ou non_fast_forward.rules[].parameters objeto
rules[].ruleType.bypassActors matriz
bypassActors[].id string
bypassActors[].bypassMode string
always, pull_request_only.bypassActors[].user objeto
user, team, app ou originRole está presente.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 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": "Exigir uma revisão aprovadora antes de mesclar para main.", "enforcement": "active", "kind": "merge_branch", "includedRefNames": [ "refs/heads/main" ], "rules": [ { "ruleType": "pull_request", "parameters": { "requiredApprovingReviewCount": 1 } } ], "bypassActors": [ { "bypassMode": "always", "user": { "id": "act_01k2ja2000e0080000000000x0" } } ]}'Formato da resposta:
{ "id": "rs_01k2ja2000e0080000000000t7", "name": "require-review", "description": "Exige uma revisão aprovada antes de mergear na 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" } } ]}Excluir conjunto de regras
/v1/origin/repos/{ownerSlug}/{repoName}/rulesets/{rulesetId}Exclui um conjunto de regras do repositório pelo ID estável do Origin. O corpo da resposta fica vazio.
Um repositório desconhecido e um conjunto de regras desconhecido retornam 404; a mensagem permite diferenciá-los. Um conjunto de regras armazenado em outro repositório é tratado como desconhecido. Um rulesetId vazio retorna InvalidArgument (HTTP 400).
Parâmetros de caminho
ownerSlug string Obrigatório
repoName string Obrigatório
rulesetId string Obrigatório
Campos de resposta
Solicitações bem-sucedidas não retornam corpo da resposta.
curl --request DELETE \ --url 'https://api.cursor.com/v1/origin/repos/OWNER_SLUG/REPO_NAME/rulesets/RULESET_ID' \ --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN'Resposta:
204 No ContentAutoridades de certificação SSH
Uma autoridade de certificação SSH é uma chave pública em que um proprietário confia: os certificados de usuário assinados por ela autenticam o git via SSH nos repositórios do proprietário, permitindo que os membros da equipe proprietária usem git via SSH sem registrar uma chave SSH. Estes endpoints listam as autoridades em que um proprietário confia, adicionam e removem autoridades e definem se o proprietário exige certificados. As autoridades pertencem a proprietários do tipo equipe, e a verificação de duplicidade ao adicionar se restringe ao proprietário, e não ao Origin como um todo. Assim, mais de um proprietário pode confiar na mesma autoridade.
A listagem aceita tokens de instalação e de usuário. Para adicionar e remover autoridades e definir a exigência, é necessária uma credencial de usuário do Cherri Code com namespace:settings:write. Tokens de app e de instalação não são aceitos.
Listar autoridades certificadoras SSH
/v1/origin/owners/{ownerSlug}/ssh-certificate-authoritiesLista as autoridades certificadoras SSH em que um proprietário confia para git via SSH, das mais recentes para as mais antigas, e indica se o proprietário exige certificados. A resposta não é paginada: todas as autoridades são retornadas.
Parâmetros de caminho
ownerSlug string Obrigatório
Campos de resposta
certificateAuthorities array
certificateAuthorities[].id string
certificateAuthorityId em Excluir autoridade certificadora SSH.certificateAuthorities[].name string
certificateAuthorities[].keyType string
ssh-ed25519.certificateAuthorities[].fingerprint string
SHA256:<base64>, o mesmo exibido por ssh-keygen -l.certificateAuthorities[].publicKey string
<key_type> <base64>, sem comentário.certificateAuthorities[].createdAt string
requireCertificates boolean
curl --request GET \ --url 'https://api.cursor.com/v1/origin/owners/OWNER_SLUG/ssh-certificate-authorities' \ --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN'Formato de resposta:
{ "certificateAuthorities": [ { "id": "nsca_01k2ja2000e0080000000000s5", "name": "Acme production CA", "keyType": "ssh-ed25519", "fingerprint": "SHA256:D5vlIclvaSZlwq4gmckavfLE7n7F542Eyhk/PvXkRq0", "publicKey": "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIPwoQNzBuiWhDF4EKwRyt8h48XRY7Bc4yWbQ9s3Tnj7Q", "createdAt": "2026-08-02T14:45:00Z" } ], "requireCertificates": true}Adicionar autoridade de certificação SSH
/v1/origin/owners/{ownerSlug}/ssh-certificate-authoritiesAdiciona uma autoridade de certificação SSH confiável para o proprietário e a retorna. Depois disso, os membros da equipe proprietária podem usar git via SSH nos repositórios do proprietário com certificados de usuário assinados pela autoridade, sem precisar registrar uma chave SSH.
publicKey é a chave pública da própria autoridade, informada como uma linha de authorized_keys do OpenSSH. Um certificado, um tipo de chave não compatível ou uma chave RSA com menos de 2048 bits retorna InvalidArgument (HTTP 400). Uma chave que já está na lista do proprietário retorna AlreadyExists (HTTP 409 Conflict); a verificação se restringe ao proprietário, então mais de um proprietário pode confiar na mesma autoridade. Autoridades só podem ser adicionadas a proprietários que pertencem a uma equipe; qualquer outro proprietário retorna FailedPrecondition (HTTP 400).
O chamador deve ser uma credencial de usuário do Cherri Code com namespace:settings:write. Tokens de app e tokens de acesso da instalação não são aceitos.
Parâmetros de caminho
ownerSlug string Obrigatório
Corpo da solicitação
publicKey string Obrigatório
authorized_keys do OpenSSH (<key_type> <base64> [comment]). Os tipos de chave aceitos são ssh-ed25519, ecdsa-sha2-nistp256, ecdsa-sha2-nistp384, ecdsa-sha2-nistp521 e ssh-rsa com módulo de pelo menos 2048 bits. Certificados não são aceitos.name string Obrigatório
Campos de resposta
id string
certificateAuthorityId em Excluir autoridade de certificação SSH.name string
keyType string
ssh-ed25519.fingerprint string
SHA256:<base64>, o mesmo exibido por ssh-keygen -l.publicKey string
<key_type> <base64>, sem comentário.createdAt string
curl --request POST \ --url 'https://api.cursor.com/v1/origin/owners/OWNER_SLUG/ssh-certificate-authorities' \ --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN' \ --header 'Content-Type: application/json' \ --data '{ "publicKey": "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIPwoQNzBuiWhDF4EKwRyt8h48XRY7Bc4yWbQ9s3Tnj7Q acme-ssh-ca", "name": "Acme production CA"}'Formato de resposta:
{ "id": "nsca_01k2ja2000e0080000000000s5", "name": "Acme production CA", "keyType": "ssh-ed25519", "fingerprint": "SHA256:D5vlIclvaSZlwq4gmckavfLE7n7F542Eyhk/PvXkRq0", "publicKey": "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIPwoQNzBuiWhDF4EKwRyt8h48XRY7Bc4yWbQ9s3Tnj7Q", "createdAt": "2026-08-02T14:45:00Z"}Excluir autoridade de certificação SSH
/v1/origin/owners/{ownerSlug}/ssh-certificate-authorities/{certificateAuthorityId}Remove uma autoridade de certificação SSH do proprietário. Todos os certificados assinados por essa autoridade deixam de funcionar. Enquanto o proprietário exigir certificados, a última autoridade dele não pode ser removida; nesse caso, a solicitação retorna FailedPrecondition (HTTP 400). O corpo da resposta é vazio.
O chamador deve ser uma credencial de usuário do Cherri Code com namespace:settings:write. Tokens de app e de instalação não são aceitos.
Parâmetros de caminho
ownerSlug string Obrigatório
certificateAuthorityId string Obrigatório
id da autoridade a ser removida.Campos de resposta
Solicitações bem-sucedidas não retornam corpo da resposta.
curl --request DELETE \ --url 'https://api.cursor.com/v1/origin/owners/OWNER_SLUG/ssh-certificate-authorities/CERTIFICATE_AUTHORITY_ID' \ --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN'Resposta:
204 No ContentDefinir exigência de certificado SSH
/v1/origin/owners/{ownerSlug}/ssh-certificate-authorities:setRequirementDefine se o proprietário exige certificados SSH e retorna a configuração do proprietário. Enquanto a exigência estiver ativa, o git via SSH nos repositórios do proprietário só aceita certificados emitidos pelas autoridades do proprietário: chaves SSH registradas por usuários são recusadas, assim como chaves de API de usuário via HTTPS. Para exigir certificados, é necessário ter pelo menos uma autoridade cadastrada; caso contrário, a solicitação retorna FailedPrecondition (HTTP 400). Definir o valor atual é bem-sucedido e não gera nenhuma alteração.
O chamador deve ser uma credencial de usuário do Cherri Code com namespace:settings:write. Tokens de app e de instalação não são aceitos.
Parâmetros de caminho
ownerSlug string Obrigatório
Corpo da solicitação
requireCertificates boolean Obrigatório
Campos de resposta
requireCertificates boolean
curl --request POST \ --url 'https://api.cursor.com/v1/origin/owners/OWNER_SLUG/ssh-certificate-authorities:setRequirement' \ --header 'Authorization: Bearer YOUR_ORIGIN_TOKEN' \ --header 'Content-Type: application/json' \ --data '{ "requireCertificates": true}'Formato de resposta:
{ "requireCertificates": true}Webhooks
O Origin envia solicitações HTTP POST assinadas para a URL HTTPS de webhook registrada do app, com content-type: application/json.
A entrega é feita pelo menos uma vez. Elimine duplicatas de tentativas usando webhook-id, aceite a solicitação de forma durável, retorne 2xx rapidamente e processe o evento de forma assíncrona.
O Origin aguarda 10 segundos pelos cabeçalhos de resposta do destinatário. Esse prazo cobre a resolução de DNS, a conexão, o handshake TLS e o tempo até a resposta, e se aplica a cada tentativa. Uma tentativa que exceda esse prazo é registrada como erro de transporte e repetida conforme o cronograma de Tentativas. Falhas repetidas podem desativar a entrega automaticamente.
Para confirmar que um destinatário funciona antes que qualquer evento real o alcance, chame Ping Webhook.
O Origin entrega eventos para repositórios espelhados, e os payloads de eventos de instalação os listam nas matrizes de repositórios selecionados. A entrega não amplia o que a instalação pode chamar: consulte Repositórios espelhados.
Cabeçalhos
| Cabeçalho | Descrição |
|---|---|
content-type | application/json |
user-agent | Cherri Code-Origin-Webhook/1.0 |
webhook-id | ID de entrega estável e chave de idempotência. |
webhook-timestamp | Timestamp Unix incluído na assinatura. |
webhook-signature | v1ed,BASE64_SIGNATURE |
webhook-event-type | Slug do evento para roteamento. |
webhook-event-id | ID do evento Origin subjacente, espelhado do corpo assinado. |
webhook-app-id | ID do app de destino. |
webhook-installation-id | ID da instalação de destino. |
Os cabeçalhos de roteamento são apenas conveniências. Após a verificação da assinatura, o corpo é a fonte oficial.
Verificação de assinatura
Use o corpo bruto da solicitação antes de processá-lo. Crie:
lowercaseHex(SHA-256("<webhook-id>.<webhook-timestamp>.<raw-request-body>"))Verifique a assinatura Ed25519 dos bytes UTF-8 desse resumo hexadecimal usando uma chave JWKS ativa da Origin. Rejeite timestamps que estejam a mais de cinco minutos do horário atual.
As bibliotecas do Standard Webhooks não verificam as entregas da Origin. Os cabeçalhos usam os nomes do Standard Webhooks, mas a Origin assina o resumo SHA-256 em vez do próprio conteúdo assinado, com uma tag de versão v1ed que não está definida na especificação do Standard Webhooks. Faça a verificação com a construção acima, como no exemplo a seguir.
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"); // Em produção, mantenha esta resposta em cache. 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; } });}Envelope de entrega
Cada solicitação encapsula o payload do evento com as informações de identificação da entrega, do app e da instalação:
{ "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 permanece estável entre as tentativas. event.id identifica o evento de domínio subjacente.
Tentativas
O Origin tenta novamente em caso de erros de transporte e respostas 429 e 5xx, em até sete tentativas no total. Outras respostas 4xx são definitivas.
A primeira tentativa é o envio original. As seis tentativas seguintes aguardam 5 segundos, 30 segundos, 1 minuto, 2 minutos, 4 minutos e 8 minutos, nessa ordem.
Um destinatário que falhe em todas as tentativas recebe sete POSTs ao longo de cerca de 16 minutos. O webhook-id permanece o mesmo em todas as tentativas. Elimine duplicatas com base nele.
Desativação automática
O proprietário pode pausar a entrega de webhooks de um app nas configurações do app. O Origin também a desativa por conta própria quando o destinatário falha em pelo menos 20 rodadas de entrega dentro de uma janela de 72 horas, sem nenhuma entrega bem-sucedida nesse período, e as falhas atingem mais de um namespace instalador.
A entrega fica interrompida até que um proprietário a retome. Batch Redeliver Webhook Deliveries retorna FailedPrecondition (HTTP 400) e não enfileira nada. A API não expõe nenhum campo para o estado pausado, então use esse FailedPrecondition como sinal.
Limpar o webhookUrl do app por meio de Update App é uma ação à parte. Isso cancela as entregas pendentes, e definir uma URL novamente não as traz de volta.
Recuperação
Use um JWT do app para consultar GET /app/webhook/deliveries. Filtre por status da entrega, tipo de evento, instalação, intervalo de tempo ou token de página. delivered=false retorna todas as entregas que o destinatário ainda não confirmou com 2xx. As entregas permanecem listáveis por sete dias, então recupere dentro desse período.
Use POST /app/webhook/deliveries:batchRedeliver para enfileirar a reentrega de até 100 IDs de entrega. A operação elimina IDs duplicados e informa o resultado de cada entrega. Um app pausado ou desativado automaticamente rejeita a chamada com FailedPrecondition (HTTP 400) e não enfileira nada.
Referência de webhooks
Todos os eventos que o Origin entrega, com o payload de cada evento documentado campo a campo. Para detalhes sobre o funcionamento da assinatura, cabeçalhos, verificação de assinatura, o envelope de entrega, o cronograma de tentativas e a desativação automática, consulte Webhooks.
Eventos
| Evento | Entregue quando |
|---|---|
repository.created | Um repositório é criado. |
repository.deleted | Um repositório é excluído. |
repository.pushed | Uma ou mais referências do Git são alteradas em um push. |
repository.metadata.updated | O branch padrão de um repositório é alterado. |
pull_request.created | Uma pull request é aberta. |
pull_request.head_ref.pushed | A head da pull request avança. |
pull_request.base_ref.updated | A referência base ou o commit base resolvido é alterado. |
pull_request.metadata.updated | O título ou a descrição é alterado. |
pull_request.closed | Uma pull request é fechada sem ser mergeada, inclusive quando o Origin a fecha porque um push deixou sua head sem histórico em comum com sua base. |
pull_request.merged | Uma pull request é mergeada. |
pull_request.reopened | Uma pull request fechada é reaberta. |
pull_request.published | Uma pull request em rascunho é aberta. |
pull_request.label.added | Um rótulo é atribuído a uma pull request. |
pull_request.label.removed | Um rótulo deixa de estar atribuído a uma pull request, inclusive quando a definição do rótulo é excluída. |
pull_request.comment.created | Um comentário visível em uma pull request é criado. |
pull_request.comment.reaction.added | Uma reação é adicionada a um comentário de pull request. Adicionar novamente uma reação que o usuário já possui entrega este evento novamente. |
pull_request.comment.reaction.removed | Uma reação é removida de um comentário de pull request. Remover uma reação que o usuário não possui não entrega nada. |
pull_request.review.submitted | Uma revisão é enviada com qualquer veredito. |
pull_request.review.dismissed | Uma revisão enviada é descartada, explicitamente ou por ser substituída. |
pull_request.reviewer.added | Um revisor é solicitado. |
pull_request.reviewer.removed | Um revisor é removido. |
pull_request.reviewer.rerequested | Um revisor é solicitado novamente. |
repository.check_run.created | Uma execução de verificação é criada. |
repository.check_run.completed | Uma execução de verificação é concluída. |
repository.check_run.rerequested | Uma execução de verificação concluída é solicitada novamente. Entregue apenas ao app que é dono da execução. |
installation.created | O app é instalado. |
installation.updated | Os escopos, a seleção de repositório ou o slug do namespace do proprietário são alterados. |
installation.suspended | A instalação é suspensa. |
installation.unsuspended | Uma instalação suspensa é restaurada. |
installation.deleted | O app é desinstalado. |
O formato do payload de cada evento está documentado campo por campo em Payloads de eventos.
Os cinco eventos installation.* são enviados ao próprio app, e não a uma assinatura de repositório. O Origin sempre os envia, portanto eles não aparecem na lista de eventos selecionáveis do app. Todos os outros eventos desta tabela são assinaturas com escopo de repositório.
Um app novo não vem inscrito em nenhum dos eventos com escopo de repositório. Selecione os de que você precisa nas configurações do app ou defina-os com o campo events de Create App ou Update App. O Origin só entrega um evento a apps inscritos nele que tenham uma URL de webhook definida e cuja instalação abranja o repositório e tenha o escopo exigido pelo evento. Caso contrário, não há entrega nem erro: nada é enviado e nada aparece em List Webhook Deliveries.
O Origin não envia repository.pushed para um repositório que ele espelha do GitHub. Esses pushes pertencem ao GitHub, que envia seus próprios webhooks de push, então uma entrega do Origin os duplicaria. Pushes para repositórios nativos do Origin e para espelhos de saída são enviados normalmente, e o estado de espelhamento não afeta nenhum outro evento. O repository.deleted é enviado para um repositório espelhado do GitHub: interromper a sincronização exclui apenas o repositório do lado do Cherri Code, e o GitHub não envia nada para ele.
Payloads de eventos
O envelope de entrega de cada evento carrega o objeto de payload do evento em payload. Eventos com o mesmo formato pertencem à mesma família de payload; cada família abaixo documenta os eventos que a entregam, seus campos e um payload de exemplo, gerados a partir da especificação OpenAPI. Na especificação, a extensão x-origin-webhook-events de cada schema de payload lista os eventos que o entregam.
Repositório criado
repository.createdCampos do payload
repository object
repository.id string
repository.name string Obrigatório
repository.fullName string
repository.owner object
repository.owner.slug string
repository.owner.id string
repository.owner.type string
team ou user. Disponível apenas na saída; fica indefinido quando desconhecido. Um entre 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 ou private. Um dos valores: internal, private.repository.allowMergeCommit boolean
repository.allowSquashMerge boolean
repository.deleteBranchOnMerge boolean
Exemplo 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" }}Repositório excluído
repository.deletedCampos do 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 ou user. Disponível apenas na saída; fica indefinido quando desconhecido. Um entre team, user.deletedAt string
Exemplo de event.payload:
{ "repository": { "id": "repo_01k2ja2000e0080000000000q4", "name": "rocket", "owner": { "slug": "acme", "id": "ns_01k2ja2000e0080000000000p3", "type": "team" } }, "deletedAt": "2026-08-03T08:15:00Z"}Push no repositório
repository.pushedUm push atômico, que pode atualizar várias referências do Git. Não há matriz de commits; cada atualização de referência traz apenas metadados da ponta, em regime de melhor esforço.
Campos do 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 ou user. Disponível apenas na saída; fica indefinido quando desconhecido. Um entre team, user.refUpdates matriz
refUpdates[].ref string
refs/heads/main ou refs/tags/v3.14.1.refUpdates[].before string
ref antes do push. Formado só por zeros (0000000000000000000000000000000000000000) quando a ref acabou de ser criada.refUpdates[].after string
ref após o push. Contém apenas zeros (0000000000000000000000000000000000000000) quando a ref foi excluída.refUpdates[].created boolean
refUpdates[].deleted boolean
refUpdates[].forced boolean
refUpdates[].headCommit object
refUpdates[].headCommit.sha string
refUpdates[].headCommit.author object
refUpdates[].headCommit.author.name string
refUpdates[].headCommit.author.email string
refUpdates[].headCommit.author.date string
refUpdates[].headCommit.committer object
refUpdates[].headCommit.committer.name string
refUpdates[].headCommit.committer.email string
refUpdates[].headCommit.committer.date string
refUpdates[].headCommit.message string
pushedAt string
pusher object
pusher.user object
pusher.user.id string
pusher.user.email string Obrigatório
pusher.user.displayName string
pusher.user.handle string
pusher.user.performedVia object
pusher.user.performedVia.app objeto
pusher.user.performedVia.app.id string
pusher.user.performedVia.app.displayName string
pusher.app objeto
pusher.app.id string
pusher.app.displayName string
pusher.serviceAccount objeto
pusher.serviceAccount.id string
refUpdatesCount integer
Exemplo de event.payload:
{ "repository": { "id": "repo_01k2ja2000e0080000000000q4", "name": "rocket", "owner": { "slug": "acme", "id": "ns_01k2ja2000e0080000000000p3", "type": "team" } }, "refUpdates": [ { "ref": "refs/heads/add-telemetry", "before": "5c8d7e6f5a4b3c2d1e0f9a8b7c6d5e4f3a2b1c0d", "after": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4", "created": false, "deleted": false, "forced": false, "headCommit": { "sha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4", "author": { "name": "Jane Doe", "email": "[email protected]", "date": "2026-08-01T09:30:00Z" }, "committer": { "name": "Jane Doe", "email": "[email protected]", "date": "2026-08-01T09:30:00Z" }, "message": "Add launch telemetry" } } ], "pushedAt": "2026-08-02T14:45:00Z", "pusher": { "user": { "id": "user_01k2ja2000e0080000000000c3", "email": "[email protected]" } }, "refUpdatesCount": 1}Metadados do repositório atualizados
repository.metadata.updatedContém o snapshot completo do repositório, sem delta e sem actor de atualização. Compare snapshots sucessivos ou consulte o repositório novamente para ver o que mudou.
Campos do payload
repository object
repository.id string
repository.name string Obrigatório
repository.fullName string
repository.owner object
repository.owner.slug string
repository.owner.id string
repository.owner.type string
team ou user. Disponível apenas na saída; fica indefinido quando desconhecido. Um entre 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 ou private. Um destes: internal, private.repository.allowMergeCommit boolean
repository.allowSquashMerge boolean
repository.deleteBranchOnMerge boolean
Exemplo de event.payload:
{ "repository": { "id": "repo_01k2ja2000e0080000000000q4", "name": "rocket", "fullName": "acme/rocket", "owner": { "slug": "acme", "id": "ns_01k2ja2000e0080000000000p3", "type": "team" }, "defaultBranch": "release", "createdAt": "2026-08-01T09:30:00Z", "updatedAt": "2026-08-03T08:15:00Z", "cloneUrl": "https://origin.cursor.com/git/acme/rocket.git", "pushedAt": "2026-08-02T14:45:00Z" }}Eventos de pull request
pull_request.createdpull_request.publishedpull_request.reopenedpull_request.closedpull_request.mergedpull_request.metadata.updatedpull_request.head_ref.pushedpull_request.base_ref.updatedpull_request.stack_parent.updatedUma alteração no ciclo de vida de um pull request. A ação do ciclo de vida é o event.type do envelope; não existe um campo de ação separado.
Campos do payload
pullRequest object
GetPullRequest.pullRequest.id string
pullRequest.number string
pullRequest.state string
pullRequest.draft boolean
pullRequest.merged boolean
pullRequest.title string
pullRequest.body string
pullRequest.head object
pullRequest.head.ref string
pullRequest.head.sha string
base, este é o base_sha da versão, que pode estar atrás do commit mais recente do branch (consulte PullRequestVersion).pullRequest.base object
pullRequest.base.ref string
pullRequest.base.sha string
base, este é o base_sha da versão, que pode estar atrás do commit mais recente do branch (consulte PullRequestVersion).pullRequest.author object
pullRequest.author.user object
pullRequest.author.user.id string
pullRequest.author.user.email string Obrigatório
pullRequest.author.user.displayName string
pullRequest.author.user.handle string
pullRequest.author.user.performedVia object
pullRequest.author.user.performedVia.app object
pullRequest.author.user.performedVia.app.id string
pullRequest.author.user.performedVia.app.displayName string
pullRequest.author.app object
pullRequest.author.app.id string
pullRequest.author.app.displayName string
pullRequest.author.serviceAccount object
pullRequest.author.serviceAccount.id string
pullRequest.createdAt string
pullRequest.updatedAt string
pullRequest.closedAt string
pullRequest.mergedAt string
pullRequest.mergeCommitSha string
pull/\<number>/merge (consulte GetGitRef), um commit diferente.pullRequest.additions integer
pullRequest.deletions integer
pullRequest.changedFiles integer
pullRequest.stack object
pullRequest.stack.id string
stack_id para ListPullRequests a fim de listar os membros da stack.pullRequest.stack.parentPullRequest object
pullRequest.stack.parentPullRequest.id string
pullRequest.stack.parentPullRequest.number string
pullRequest.stack.parentPullRequest.repository object
pullRequest.stack.parentPullRequest.repository.id string
pullRequest.stack.parentPullRequest.repository.name string
pullRequest.stack.parentPullRequest.repository.owner object
pullRequest.stack.parentPullRequest.repository.owner.slug string
pullRequest.stack.parentPullRequest.repository.owner.id string
pullRequest.stack.parentPullRequest.repository.owner.type string
team ou user. Disponível apenas na saída; sem valor quando desconhecido. Um entre team, user.pullRequest.version object
pullRequest.version.number string
pullRequest.version.headSha string
pullRequest.version.baseSha string
pullRequest.version.createdAt string
pullRequest.version.potentialMergeCommit object
state). Calculado para esta versão: o segundo pai do commit é head_sha; o primeiro é o base_sha do merge de teste, a ponta da branch base no momento da preparação, que pode ser mais recente que o base_sha desta versão. A ref pull/\<number>/merge aponta apenas para o commit da versão mais recente; commits antigos continuam acessíveis por SHA pela API (GetCommit), mas não podem ser buscados por SHA via git. Diferente de PullRequest.merge_commit_sha, que só é definido após o merge. Definido em PullRequest.version e PullRequestWebhook.version.pullRequest.version.potentialMergeCommit.state string
unknown até que sua própria preparação seja concluída. Valores não reconhecidos devem ser tratados como unknown. Um dos valores unknown, prepared, merge_conflict.pullRequest.version.potentialMergeCommit.sha string
state é prepared: o commit de teste de merge com dois pais, sendo o segundo pai o head_sha da versão e o primeiro pai o base_sha; a ponta de pull/\<number>/merge enquanto esta for a versão mais recente; pode ser consultado pelo SHA posteriormente.pullRequest.version.potentialMergeCommit.baseSha string
state é prepared: a ponta da branch base no momento da preparação; pode ser mais recente que o base_sha da versão; não é atualizado quando a branch base apenas avança; preparado novamente ao reabrir.repository object
repository.id string
repository.name string
repository.owner object
repository.owner.slug string
repository.owner.id string
repository.owner.type string
team ou user. Disponível apenas na saída; sem valor quando desconhecido. Um entre team, user.Exemplo de event.payload:
{ "pullRequest": { "id": "pr_01k2ja2000e0080000000000d4", "number": "17", "state": "open", "draft": false, "merged": false, "title": "Add launch telemetry", "body": "Adds structured launch telemetry to the ignition path.", "head": { "ref": "add-telemetry", "sha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4" }, "base": { "ref": "add-telemetry-schema", "sha": "3b1f9c2d8a7e6f5049c8b7a6d5e4f3a2b1c0d9e8" }, "author": { "user": { "id": "user_01k2ja2000e0080000000000c3", "email": "[email protected]" } }, "createdAt": "2026-08-01T09:30:00Z", "updatedAt": "2026-08-02T14:45:00Z", "additions": 128, "deletions": 46, "changedFiles": 5, "stack": { "id": "stk_01k2ja2000e0080000000000s1", "parentPullRequest": { "id": "pr_01k2ja2000e0080000000000d3", "number": "16", "repository": { "id": "repo_01k2ja2000e0080000000000q4", "name": "rocket", "owner": { "slug": "acme", "id": "ns_01k2ja2000e0080000000000p3", "type": "team" } } } }, "version": { "number": "3", "headSha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4", "baseSha": "3b1f9c2d8a7e6f5049c8b7a6d5e4f3a2b1c0d9e8", "createdAt": "2026-08-01T09:30:00Z" } }, "repository": { "id": "repo_01k2ja2000e0080000000000q4", "name": "rocket", "owner": { "slug": "acme", "id": "ns_01k2ja2000e0080000000000p3", "type": "team" } }}Eventos de rótulo de Pull Request
pull_request.label.addedpull_request.label.removedUma alteração nos rótulos atribuídos ao pull request. Faça a leitura do conjunto atual com ListPullRequestLabels.
Campos do 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 ou user. Disponível apenas na saída; fica indefinido quando desconhecido. Um entre team e user.label object
label.id string
label.name string
label.color string
# no início.label.description string
actor object
actor.user object
actor.user.id string
actor.user.email string Obrigatório
actor.user.displayName string
actor.user.handle string
actor.user.performedVia object
actor.user.performedVia.app object
actor.user.performedVia.app.id string
actor.user.performedVia.app.displayName string
actor.app object
actor.app.id string
actor.app.displayName string
actor.serviceAccount object
actor.serviceAccount.id string
Exemplo de event.payload:
{ "pullRequest": { "id": "pr_01k2ja2000e0080000000000d4", "number": "17", "repository": { "id": "repo_01k2ja2000e0080000000000q4", "name": "rocket", "owner": { "slug": "acme", "id": "ns_01k2ja2000e0080000000000p3", "type": "team" } } }, "label": { "id": "lbl_01k2ja2000e0080000000000m1", "name": "bug", "color": "d73a4a", "description": "Something isn't working" }, "actor": { "user": { "id": "user_01k2ja2000e0080000000000c3", "email": "[email protected]" } }}Pull Request Comment
pull_request.comment.createdUm comentário criado em um pull request. Comentários enviados junto com uma revisão são entregues no momento em que a revisão é submetida, um evento por comentário.
Campos do 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 ou user. Disponível apenas na saída; fica indefinido quando desconhecido. Um de team, user.comment object
comment.thread.id. O estado de resolução da thread não faz parte do evento; consulte-o com 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.path string
comment.thread.side string
left e right.comment.thread.startLine integer
side do arquivo. 0 para tópicos no nível do arquivo e de discussão geral.comment.thread.endLine integer
comment.thread.resolvedAt string
comment.thread.createdAt string
comment.thread.updatedAt string
comment.body string
comment.author object
comment.author.user object
comment.author.user.id string
comment.author.user.email string Obrigatório
comment.author.user.displayName string
comment.author.user.handle string
comment.author.user.performedVia object
comment.author.user.performedVia.app object
comment.author.user.performedVia.app.id string
comment.author.user.performedVia.app.displayName string
comment.author.app object
comment.author.app.id string
comment.author.app.displayName string
comment.author.serviceAccount object
comment.author.serviceAccount.id string
comment.createdAt string
comment.updatedAt string
Exemplo de event.payload:
{ "pullRequest": { "id": "pr_01k2ja2000e0080000000000d4", "number": "17", "repository": { "id": "repo_01k2ja2000e0080000000000q4", "name": "rocket", "owner": { "slug": "acme", "id": "ns_01k2ja2000e0080000000000p3", "type": "team" } } }, "comment": { "id": "cmt_01k2ja2000e0080000000000e5", "thread": { "id": "cth_01k2ja2000e0080000000000s6", "version": { "number": "3", "headSha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4", "baseSha": "3b1f9c2d8a7e6f5049c8b7a6d5e4f3a2b1c0d9e8" }, "path": "src/telemetry/retry.ts", "side": "right", "startLine": 42, "endLine": 45, "createdAt": "2026-08-01T09:30:00Z", "updatedAt": "2026-08-02T14:45:00Z" }, "body": "Should the retry budget be configurable?", "author": { "user": { "id": "user_01k2ja2000e0080000000000c3", "email": "[email protected]" } }, "createdAt": "2026-08-01T09:30:00Z", "updatedAt": "2026-08-02T14:45:00Z" }}Eventos de reação a comentários de Pull Request
pull_request.comment.reaction.addedpull_request.comment.reaction.removedUma reação adicionada a um comentário de pull request ou removida dele. O event.type do envelope indica a ação. Uma adição é entregue pelo menos uma vez: adicionar ao comentário uma reação que o usuário já possui gera outro pull_request.comment.reaction.added para o mesmo (comment, reactor, content); remover uma reação que o usuário não possui não gera nada.
Campos do 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 ou user. Somente saída; fica indefinido quando desconhecido. Um entre team, user.comment object
comment.id string
comment.thread object
comment.thread.id string
reaction objeto
reaction.content string
thumbs_up, thumbs_down, laugh, hooray, confused, heart, rocket, eyes.reaction.reactor objeto
reaction.reactor.user object
reaction.reactor.user.id string
reaction.reactor.user.email string Obrigatório
reaction.reactor.user.displayName string
reaction.reactor.user.handle string
reaction.reactor.user.performedVia object
reaction.reactor.user.performedVia.app object
reaction.reactor.user.performedVia.app.id string
reaction.reactor.user.performedVia.app.displayName string
reaction.reactor.app object
reaction.reactor.app.id string
reaction.reactor.app.displayName string
reaction.reactor.serviceAccount object
reaction.reactor.serviceAccount.id string
Exemplo de event.payload:
{ "pullRequest": { "id": "pr_01k2ja2000e0080000000000d4", "number": "17", "repository": { "id": "repo_01k2ja2000e0080000000000q4", "name": "rocket", "owner": { "slug": "acme", "id": "ns_01k2ja2000e0080000000000p3", "type": "team" } } }, "comment": { "id": "cmt_01k2ja2000e0080000000000e5", "thread": { "id": "cth_01k2ja2000e0080000000000s6" } }, "reaction": { "content": "thumbs_up", "reactor": { "user": { "id": "user_01k2ja2000e0080000000000c3", "email": "[email protected]" } } }}Eventos de revisão de pull request
pull_request.review.submittedpull_request.review.dismissedCampos da carga útil
pullRequest object
pullRequest.id string
pullRequest.number string
pullRequest.repository object
pullRequest.repository.id string
pullRequest.repository.name string
pullRequest.repository.owner object
pullRequest.repository.owner.slug string
pullRequest.repository.owner.id string
pullRequest.repository.owner.type string
team ou user. Disponível apenas na saída; fica sem definição quando desconhecido. Um entre team, user.review object
review.dismissal é definido.review.id string
review.author object
review.author.user object
review.author.user.id string
review.author.user.email string Obrigatório
review.author.user.displayName string
review.author.user.handle string
review.author.user.performedVia object
review.author.user.performedVia.app object
review.author.user.performedVia.app.id string
review.author.user.performedVia.app.displayName string
review.author.app object
review.author.app.id string
review.author.app.displayName string
review.author.serviceAccount object
review.author.serviceAccount.id string
review.verdict string
approve, request_changes, comment.review.body string
review.submittedAt string
review.pullRequestVersion object
review.pullRequestVersion.number string
review.pullRequestVersion.headSha string
review.pullRequestVersion.baseSha string
review.dismissal objeto
review.dismissal.dismissedBy object
review.dismissal.dismissedBy.user object
review.dismissal.dismissedBy.user.id string
review.dismissal.dismissedBy.user.email string Obrigatório
review.dismissal.dismissedBy.user.displayName string
review.dismissal.dismissedBy.user.handle string
review.dismissal.dismissedBy.user.performedVia object
review.dismissal.dismissedBy.user.performedVia.app object
review.dismissal.dismissedBy.user.performedVia.app.id string
review.dismissal.dismissedBy.user.performedVia.app.displayName 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
Exemplo de event.payload:
{ "pullRequest": { "id": "pr_01k2ja2000e0080000000000d4", "number": "17", "repository": { "id": "repo_01k2ja2000e0080000000000q4", "name": "rocket", "owner": { "slug": "acme", "id": "ns_01k2ja2000e0080000000000p3", "type": "team" } } }, "review": { "id": "rev_01k2ja2000e0080000000000f6", "author": { "user": { "id": "user_01k2ja2000e0080000000000c3", "email": "[email protected]" } }, "verdict": "approve", "body": "Approving. The telemetry schema matches the spec.", "submittedAt": "2026-08-02T15:00:00Z", "pullRequestVersion": { "number": "3", "headSha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4", "baseSha": "3b1f9c2d8a7e6f5049c8b7a6d5e4f3a2b1c0d9e8" } }}Eventos do revisor de pull requests
pull_request.reviewer.addedpull_request.reviewer.removedpull_request.reviewer.rerequestedUma alteração nos requested reviewers do pull request. Leia o set pendente atual com ListPullRequestRequestedReviewers.
Campos do 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 ou user. Disponível apenas na saída; fica indefinido quando desconhecido. Um entre team, user.reviewer object
reviewer.user object
reviewer.user.id string
reviewer.user.email string Obrigatório
reviewer.user.displayName string
reviewer.user.handle string
reviewer.user.performedVia object
reviewer.user.performedVia.app object
reviewer.user.performedVia.app.id string
reviewer.user.performedVia.app.displayName string
reviewer.group object
grp_…). Atualmente, apenas id.reviewer.group.id string
createdVia string
manual, codeowners.createdBy object
createdBy.user object
createdBy.user.id string
createdBy.user.email string Obrigatório
createdBy.user.displayName string
createdBy.user.handle string
createdBy.user.performedVia object
createdBy.user.performedVia.app object
createdBy.user.performedVia.app.id string
createdBy.user.performedVia.app.displayName string
createdBy.app object
createdBy.app.id string
createdBy.app.displayName string
createdBy.serviceAccount object
createdBy.serviceAccount.id string
createdAt string
Exemplo de event.payload:
{ "pullRequest": { "id": "pr_01k2ja2000e0080000000000d4", "number": "17", "repository": { "id": "repo_01k2ja2000e0080000000000q4", "name": "rocket", "owner": { "slug": "acme", "id": "ns_01k2ja2000e0080000000000p3", "type": "team" } } }, "reviewer": { "user": { "id": "user_01k2ja2000e0080000000000c3", "email": "[email protected]" } }, "createdVia": "codeowners", "createdAt": "2026-08-02T14:45:00Z"}Eventos de execução de verificações
repository.check_run.createdrepository.check_run.updatedrepository.check_run.completedInstantâneo confirmado para um evento do ciclo de vida de uma execução de verificação do Origin.
Campos do 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 ou user. Somente para saída; não definido quando desconhecido. Um entre team e user.checkSuite objeto
checkSuite.id string
checkSuite.repository objeto
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 ou user. Somente saída; não definido quando desconhecido. Um entre team e user.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 Obrigatório
checkSuite.actor.user.displayName string
checkSuite.actor.user.handle string
checkSuite.actor.user.performedVia object
checkSuite.actor.user.performedVia.app object
checkSuite.actor.user.performedVia.app.id string
checkSuite.actor.user.performedVia.app.displayName 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 ou user. Somente saída; não definido quando desconhecido. Um entre team e user.checkRun.checkSuite objeto
checkRun.checkSuite.id string
checkRun.sha string
checkRun.key string
checkRun.name string
checkRun.status string
failing é uma execução ainda em andamento cujo app já sabe que não será aprovada: pendente para os critérios de aprovação e as verificações obrigatórias, ainda sem conclusion, um aviso antecipado para os leitores. rerequested é uma execução concluída cuja reexecução foi solicitada e ainda não recebeu resposta do app responsável: pendente para os leitores (renderizada como queued), com conclusion e os tempos ainda descrevendo a tentativa substituída. Definido apenas pela Origin quando uma nova solicitação é feita (RerequestCheckRun); os apps não podem publicá-lo. Um dos valores: queued, in_progress, completed, rerequested, failing.checkRun.conclusion string
status for completed ou rerequested. Para uma execução rerequested, é o veredito da tentativa substituída: trate a execução como pendente e leia conclusion apenas quando status == completed. Um dos valores: success, failure, neutral, cancelled, skipped, timed_out, action_required, stale.checkRun.detailsUrl string
checkRun.externalUpdatedAt string
checkRun.startedAt string
checkRun.completedAt string
checkRun.createdAt string
checkRun.updatedAt string
PostCheckRunResponse.outcome), portanto não é possível distinguir esses dois casos. Carimbo de data e hora no formato RFC 3339.checkRun.externalId string
CheckRunInput.external_id: o estilo recomendado é usar um por execução).checkRun.actor object
actor da suíte proprietária.checkRun.actor.user objeto
checkRun.actor.user.id string
checkRun.actor.user.email string Obrigatório
checkRun.actor.user.displayName string
checkRun.actor.user.handle string
checkRun.actor.user.performedVia object
checkRun.actor.user.performedVia.app object
checkRun.actor.user.performedVia.app.id string
checkRun.actor.user.performedVia.app.displayName string
checkRun.actor.app object
checkRun.actor.app.id string
checkRun.actor.app.displayName string
checkRun.actor.serviceAccount object
checkRun.actor.serviceAccount.id string
checkRun.output object
checkRun.output.title string
checkRun.output.summary string
checkRun.output.text string
checkRun.deadlineAt string
timed_out (veja CheckRunInput.deadline_at). Data e hora no formato RFC 3339.checkRun.isRerequestable boolean
CheckRunInput.is_rerequestable).checkRun.rerequestedAt string
status é rerequested e a execução permanece pendente no estado de CI do commit' (conclusion e os tempos correspondem ao resultado substituído); o aplicativo responsável responde publicando a execução que se comprometeu a fornecer ao declarar is_rerequestable — uma nova execução para a mesma key ou uma atualização desta execução (que limpa este campo) —, após o que ela poderá ser solicitada novamente. Carimbo de data/hora no formato RFC 3339.checkRun.rerequestedBy object
rerequested_at estiver definido; é removido junto com ele quando o aplicativo proprietário responde.checkRun.rerequestedBy.user object
checkRun.rerequestedBy.user.id string
checkRun.rerequestedBy.user.email string Obrigatório
checkRun.rerequestedBy.user.displayName string
checkRun.rerequestedBy.user.handle string
checkRun.rerequestedBy.user.performedVia object
checkRun.rerequestedBy.user.performedVia.app objeto
checkRun.rerequestedBy.user.performedVia.app.id string
checkRun.rerequestedBy.user.performedVia.app.displayName string
checkRun.rerequestedBy.app objeto
checkRun.rerequestedBy.app.id string
checkRun.rerequestedBy.app.displayName string
checkRun.rerequestedBy.serviceAccount object
checkRun.rerequestedBy.serviceAccount.id string
Exemplo de event.payload:
{ "repository": { "id": "repo_01k2ja2000e0080000000000q4", "name": "rocket", "owner": { "slug": "acme", "id": "ns_01k2ja2000e0080000000000p3", "type": "team" } }, "checkSuite": { "id": "crg_01k2ja2000e0080000000000h8", "repository": { "id": "repo_01k2ja2000e0080000000000q4", "name": "rocket", "owner": { "slug": "acme", "id": "ns_01k2ja2000e0080000000000p3", "type": "team" } }, "sha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4", "key": "ci-8842", "name": "CI", "detailsUrl": "https://ci.acme.dev/runs/8842", "createdAt": "2026-08-01T09:30:00Z", "updatedAt": "2026-08-02T14:45:00Z", "externalId": "build-8842", "actor": { "user": { "id": "user_01k2ja2000e0080000000000c3", "email": "[email protected]" } } }, "checkRun": { "id": "cr_01k2ja2000e0080000000000g7", "repository": { "id": "repo_01k2ja2000e0080000000000q4", "name": "rocket", "owner": { "slug": "acme", "id": "ns_01k2ja2000e0080000000000p3", "type": "team" } }, "checkSuite": { "id": "crg_01k2ja2000e0080000000000h8" }, "sha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4", "key": "ci-8842-unit-tests", "name": "unit-tests", "status": "completed", "conclusion": "success", "detailsUrl": "https://ci.acme.dev/runs/8842", "externalUpdatedAt": "2026-08-02T14:44:30Z", "startedAt": "2026-08-02T14:40:00Z", "completedAt": "2026-08-02T14:44:30Z", "createdAt": "2026-08-01T09:30:00Z", "updatedAt": "2026-08-02T14:45:00Z", "externalId": "run-8842", "actor": { "user": { "id": "user_01k2ja2000e0080000000000c3", "email": "[email protected]" } }, "output": { "title": "Unit tests", "summary": "128 tests passed.", "text": "All suites green." } }}Nova solicitação de execução de verificação
repository.check_run.rerequestedPayload do webhook repository.check_run.rerequested, entregue apenas ao app que possui o check run. Responda publicando uma nova execução para o mesmo SHA da branch head e a mesma chave — uma nova execução (com um novo external_id) ou uma atualização da execução solicitada novamente. A execução marcada apresenta status: rerequested (sua conclusão e seus tempos correspondem ao resultado substituído) até que a publicação da resposta limpe rerequested_at. Cada nova solicitação aceita emite um evento, e uma execução pode ser solicitada novamente após ser respondida; portanto, deduplique as reentregas usando apenas o ID do evento. check_run.rerequested_at contém a marcação da solicitação pendente. O payload não inclui contexto de pull request (as execuções de verificação estão associadas a (repository, sha)): um consumidor que precise do pull request deve resolvê-lo a partir de check_run.sha, usando seu próprio mapeamento de head, ou consultar ListPullRequests filtrando pela branch head usada na compilação.
Campos do 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 ou user. Somente saída; permanece indefinido quando desconhecido. Um entre team, user.checkSuite object
checkSuite.id string
checkSuite.repository objeto
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 ou user. Apenas para saída; não definido quando desconhecido. Um 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 object
checkSuite.actor.user objeto
checkSuite.actor.user.id string
checkSuite.actor.user.email string Obrigatório
checkSuite.actor.user.displayName string
checkSuite.actor.user.handle string
checkSuite.actor.user.performedVia objeto
checkSuite.actor.user.performedVia.app objeto
checkSuite.actor.user.performedVia.app.id string
checkSuite.actor.user.performedVia.app.displayName string
checkSuite.actor.app objeto
checkSuite.actor.app.id string
checkSuite.actor.app.displayName string
checkSuite.actor.serviceAccount objeto
checkSuite.actor.serviceAccount.id string
checkRun object
status: rerequested); check_run.rerequested_at registra o carimbo e check_run.rerequested_by o responsável que solicitou.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 ou user. Somente saída; não definido quando desconhecido. Um entre team e user.checkRun.checkSuite object
checkRun.checkSuite.id string
checkRun.sha string
checkRun.key string
checkRun.name string
checkRun.status string
failing é uma execução ainda em andamento cujo aplicativo já sabe que ela não vai passar: pendente para gates e verificações obrigatórias, ainda sem conclusion, funcionando como um aviso antecipado para os leitores. rerequested é uma execução concluída cuja reexecução foi solicitada e ainda não foi respondida pelo aplicativo responsável: pendente para os leitores (renderizar como queued), com conclusion e os tempos ainda descrevendo a tentativa substituída. Definido apenas pelo Origin quando há uma nova solicitação (RerequestCheckRun); os aplicativos não podem publicá-lo. Um dos valores: queued, in_progress, completed, rerequested, failing.checkRun.conclusion string
status for completed ou rerequested. Para uma execução rerequested, é o veredito da tentativa substituída: trate a execução como pendente e leia conclusion apenas quando status == completed. Um dos valores: success, failure, neutral, cancelled, skipped, timed_out, action_required, stale.checkRun.detailsUrl string
checkRun.externalUpdatedAt string
checkRun.startedAt string
checkRun.completedAt string
checkRun.createdAt string
checkRun.updatedAt string
PostCheckRunResponse.outcome), portanto não é possível distinguir esses dois casos. Carimbo de data/hora no formato RFC 3339.checkRun.externalId string
CheckRunInput.external_id: recomenda-se uma por execução).checkRun.actor object
actor da suíte proprietária.checkRun.actor.user object
checkRun.actor.user.id string
checkRun.actor.user.email string Obrigatório
checkRun.actor.user.displayName string
checkRun.actor.user.handle string
checkRun.actor.user.performedVia objeto
checkRun.actor.user.performedVia.app objeto
checkRun.actor.user.performedVia.app.id string
checkRun.actor.user.performedVia.app.displayName string
checkRun.actor.app object
checkRun.actor.app.id string
checkRun.actor.app.displayName string
checkRun.actor.serviceAccount object
checkRun.actor.serviceAccount.id string
checkRun.output object
checkRun.output.title string
checkRun.output.summary string
checkRun.output.text string
checkRun.deadlineAt string
timed_out (veja CheckRunInput.deadline_at). Carimbo de data/hora no formato RFC 3339.checkRun.isRerequestable boolean
CheckRunInput.is_rerequestable).checkRun.rerequestedAt string
status é rerequested e a execução permanece pendente no estado de CI do commit (conclusion e os tempos correspondem ao resultado substituído); o aplicativo responsável responde publicando a execução que se comprometeu a fornecer, declarando is_rerequestable — uma nova execução para a mesma key ou uma atualização desta execução (o que limpa este campo) —, após o que a execução poderá ser solicitada novamente. Carimbo de data/hora no formato RFC 3339.checkRun.rerequestedBy object
rerequested_at estiver definido; é removido junto com ele quando o aplicativo proprietário responde.checkRun.rerequestedBy.user objeto
checkRun.rerequestedBy.user.id string
checkRun.rerequestedBy.user.email string Obrigatório
checkRun.rerequestedBy.user.displayName string
checkRun.rerequestedBy.user.handle string
checkRun.rerequestedBy.user.performedVia objeto
checkRun.rerequestedBy.user.performedVia.app objeto
checkRun.rerequestedBy.user.performedVia.app.id string
checkRun.rerequestedBy.user.performedVia.app.displayName string
checkRun.rerequestedBy.app objeto
checkRun.rerequestedBy.app.id string
checkRun.rerequestedBy.app.displayName string
checkRun.rerequestedBy.serviceAccount objeto
checkRun.rerequestedBy.serviceAccount.id string
Exemplo de event.payload:
{ "repository": { "id": "repo_01k2ja2000e0080000000000q4", "name": "rocket", "owner": { "slug": "acme", "id": "ns_01k2ja2000e0080000000000p3", "type": "team" } }, "checkSuite": { "id": "crg_01k2ja2000e0080000000000h8", "repository": { "id": "repo_01k2ja2000e0080000000000q4", "name": "rocket", "owner": { "slug": "acme", "id": "ns_01k2ja2000e0080000000000p3", "type": "team" } }, "sha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4", "key": "ci-8842", "name": "CI", "detailsUrl": "https://ci.acme.dev/runs/8842", "createdAt": "2026-08-01T09:30:00Z", "updatedAt": "2026-08-02T15:10:00Z", "externalId": "build-8842", "actor": { "user": { "id": "user_01k2ja2000e0080000000000c3", "email": "[email protected]" } } }, "checkRun": { "id": "cr_01k2ja2000e0080000000000g7", "repository": { "id": "repo_01k2ja2000e0080000000000q4", "name": "rocket", "owner": { "slug": "acme", "id": "ns_01k2ja2000e0080000000000p3", "type": "team" } }, "checkSuite": { "id": "crg_01k2ja2000e0080000000000h8" }, "sha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4", "key": "ci-8842-unit-tests", "name": "unit-tests", "status": "rerequested", "conclusion": "failure", "detailsUrl": "https://ci.acme.dev/runs/8842", "externalUpdatedAt": "2026-08-02T14:44:30Z", "startedAt": "2026-08-02T14:40:00Z", "completedAt": "2026-08-02T14:44:30Z", "createdAt": "2026-08-01T09:30:00Z", "updatedAt": "2026-08-02T15:10:00Z", "externalId": "run-8842", "actor": { "user": { "id": "user_01k2ja2000e0080000000000c3", "email": "[email protected]" } }, "output": { "title": "Unit tests", "summary": "1 of 129 tests failed.", "text": "FAIL telemetry.spec.ts > flushes queued events on shutdown" }, "isRerequestable": true, "rerequestedAt": "2026-08-02T15:10:00Z", "rerequestedBy": { "user": { "id": "user_01k2ja2000e0080000000000c3", "email": "[email protected]" } } }}Instalação criada
installation.createdCampos do payload
installation object
installation.id string
installation.appId string
app.id no payload.installation.target object
installation.target.slug string
installation.target.id string
installation.target.type string
team ou user. Disponível apenas na saída; fica indefinido quando desconhecido. Um entre team, user.installation.repoSelectionMode string
all, selected.installation.repositories lista
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 ou user. Disponível apenas na saída; não definido quando desconhecido. Um entre team, user.installation.scopes lista
installation.repositoriesCount integer
installation.createdAt string
installation.updatedAt string
installation.deletedAt string
installation.suspendedAt string
installation.installedBy object
installation.installedBy.id string
installation.installedBy.email string Obrigatório
installation.installedBy.displayName string
installation.installedBy.handle string
installation.installedBy.performedVia object
installation.installedBy.performedVia.app object
installation.installedBy.performedVia.app.id string
installation.installedBy.performedVia.app.displayName string
app object
app.id string
app.displayName string
Exemplo de event.payload:
{ "installation": { "id": "inst_01k2ja2000e0080000000000b2", "appId": "app_01k2ja2000e0080000000000a1", "target": { "slug": "acme", "id": "ns_01k2ja2000e0080000000000p3", "type": "team" }, "repoSelectionMode": "selected", "repositories": [ { "id": "repo_01k2ja2000e0080000000000q4", "name": "rocket", "owner": { "slug": "acme", "id": "ns_01k2ja2000e0080000000000p3", "type": "team" } } ], "scopes": [ "repository:contents:read", "repository:pull_requests:read" ], "repositoriesCount": 1, "createdAt": "2026-08-01T09:30:00Z", "updatedAt": "2026-08-01T09:30:00Z", "installedBy": { "id": "user_01k2ja2000e0080000000000c3", "email": "[email protected]" } }, "app": { "id": "app_01k2ja2000e0080000000000a1", "displayName": "CI Status Bot" }}Instalação atualizada
installation.updatedCampos do payload
installation object
installation.id string
installation.appId string
app.id no payload.installation.target object
installation.target.slug string
installation.target.id string
installation.target.type string
team ou user. Disponível apenas na saída; fica indefinido quando desconhecido. Um entre team, user.installation.repoSelectionMode string
all, selected.installation.repositories vetor
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 ou user. Disponível apenas na saída; não definido quando desconhecido. Um entre team e user.installation.scopes vetor
installation.repositoriesCount integer
installation.createdAt string
installation.updatedAt string
installation.deletedAt string
installation.suspendedAt string
installation.installedBy object
installation.installedBy.id string
installation.installedBy.email string Obrigatório
installation.installedBy.displayName string
installation.installedBy.handle string
installation.installedBy.performedVia object
installation.installedBy.performedVia.app object
installation.installedBy.performedVia.app.id string
installation.installedBy.performedVia.app.displayName string
app object
app.id string
app.displayName string
Exemplo de event.payload:
{ "installation": { "id": "inst_01k2ja2000e0080000000000b2", "appId": "app_01k2ja2000e0080000000000a1", "target": { "slug": "acme", "id": "ns_01k2ja2000e0080000000000p3", "type": "team" }, "repoSelectionMode": "selected", "repositories": [ { "id": "repo_01k2ja2000e0080000000000q4", "name": "rocket", "owner": { "slug": "acme", "id": "ns_01k2ja2000e0080000000000p3", "type": "team" } } ], "scopes": [ "repository:contents:read", "repository:pull_requests:read" ], "repositoriesCount": 1, "createdAt": "2026-08-01T09:30:00Z", "updatedAt": "2026-08-02T14:45:00Z", "installedBy": { "id": "user_01k2ja2000e0080000000000c3", "email": "[email protected]" } }, "app": { "id": "app_01k2ja2000e0080000000000a1", "displayName": "CI Status Bot" }}Instalação suspensa
installation.suspendedCampos do payload
installation object
installation.id string
installation.appId string
app.id no payload.installation.target object
installation.target.slug string
installation.target.id string
installation.target.type string
team ou user. Disponível apenas na saída; fica indefinido quando desconhecido. Um entre team, user.installation.repoSelectionMode string
all, selected.installation.repositories matriz
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 ou user. Disponível apenas na saída; fica indefinido quando desconhecido. Um entre team, user.installation.scopes matriz
installation.repositoriesCount integer
installation.createdAt string
installation.updatedAt string
installation.deletedAt string
installation.suspendedAt string
installation.installedBy object
installation.installedBy.id string
installation.installedBy.email string Obrigatório
installation.installedBy.displayName string
installation.installedBy.handle string
installation.installedBy.performedVia object
installation.installedBy.performedVia.app object
installation.installedBy.performedVia.app.id string
installation.installedBy.performedVia.app.displayName string
app object
app.id string
app.displayName string
Exemplo de event.payload:
{ "installation": { "id": "inst_01k2ja2000e0080000000000b2", "appId": "app_01k2ja2000e0080000000000a1", "target": { "slug": "acme", "id": "ns_01k2ja2000e0080000000000p3", "type": "team" }, "repoSelectionMode": "selected", "repositories": [ { "id": "repo_01k2ja2000e0080000000000q4", "name": "rocket", "owner": { "slug": "acme", "id": "ns_01k2ja2000e0080000000000p3", "type": "team" } } ], "scopes": [ "repository:contents:read", "repository:pull_requests:read" ], "repositoriesCount": 1, "createdAt": "2026-08-01T09:30:00Z", "installedBy": { "id": "user_01k2ja2000e0080000000000c3", "email": "[email protected]" }, "suspendedAt": "2026-08-03T08:15:00Z" }, "app": { "id": "app_01k2ja2000e0080000000000a1", "displayName": "CI Status Bot" }}Instalação reativada
installation.unsuspendedCampos do payload
installation object
installation.id string
installation.appId string
app.id no payload.installation.target object
installation.target.slug string
installation.target.id string
installation.target.type string
team ou user. Disponível apenas na saída; fica indefinido quando desconhecido. Um entre team, user.installation.repoSelectionMode string
all, selected.installation.repositories lista
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 ou user. Disponível apenas na saída; fica indefinido quando desconhecido. Um entre team, user.installation.scopes vetor
installation.repositoriesCount integer
installation.createdAt string
installation.updatedAt string
installation.deletedAt string
installation.suspendedAt string
installation.installedBy objeto
installation.installedBy.id string
installation.installedBy.email string Obrigatório
installation.installedBy.displayName string
installation.installedBy.handle string
installation.installedBy.performedVia object
installation.installedBy.performedVia.app objeto
installation.installedBy.performedVia.app.id string
installation.installedBy.performedVia.app.displayName string
app object
app.id string
app.displayName string
Exemplo de event.payload:
{ "installation": { "id": "inst_01k2ja2000e0080000000000b2", "appId": "app_01k2ja2000e0080000000000a1", "target": { "slug": "acme", "id": "ns_01k2ja2000e0080000000000p3", "type": "team" }, "repoSelectionMode": "selected", "repositories": [ { "id": "repo_01k2ja2000e0080000000000q4", "name": "rocket", "owner": { "slug": "acme", "id": "ns_01k2ja2000e0080000000000p3", "type": "team" } } ], "scopes": [ "repository:contents:read", "repository:pull_requests:read" ], "repositoriesCount": 1, "createdAt": "2026-08-01T09:30:00Z", "installedBy": { "id": "user_01k2ja2000e0080000000000c3", "email": "[email protected]" } }, "app": { "id": "app_01k2ja2000e0080000000000a1", "displayName": "CI Status Bot" }}Instalação excluída
installation.deletedCampos do payload
installation object
installation.id string
installation.appId string
app.id no payload.installation.target object
installation.target.slug string
installation.target.id string
installation.target.type string
team ou user. Disponível apenas na saída; fica indefinido quando desconhecido. Um entre team, user.installation.repoSelectionMode string
all, selected.installation.repositories matriz
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 ou user. Disponível apenas na saída; fica indefinido quando desconhecido. Um entre team, user.installation.scopes matriz
installation.repositoriesCount integer
installation.createdAt string
installation.updatedAt string
installation.deletedAt string
installation.suspendedAt string
installation.installedBy object
installation.installedBy.id string
installation.installedBy.email string Obrigatório
installation.installedBy.displayName string
installation.installedBy.handle string
installation.installedBy.performedVia object
installation.installedBy.performedVia.app object
installation.installedBy.performedVia.app.id string
installation.installedBy.performedVia.app.displayName string
app object
app.id string
app.displayName string
Exemplo de event.payload:
{ "installation": { "id": "inst_01k2ja2000e0080000000000b2", "appId": "app_01k2ja2000e0080000000000a1", "target": { "slug": "acme", "id": "ns_01k2ja2000e0080000000000p3", "type": "team" }, "repoSelectionMode": "selected", "repositories": [ { "id": "repo_01k2ja2000e0080000000000q4", "name": "rocket", "owner": { "slug": "acme", "id": "ns_01k2ja2000e0080000000000p3", "type": "team" } } ], "scopes": [ "repository:contents:read", "repository:pull_requests:read" ], "repositoriesCount": 1, "createdAt": "2026-08-01T09:30:00Z", "installedBy": { "id": "user_01k2ja2000e0080000000000c3", "email": "[email protected]" }, "deletedAt": "2026-08-03T08:15:00Z" }, "app": { "id": "app_01k2ja2000e0080000000000a1", "displayName": "CI Status Bot" }}Anotações da execução de verificação
repository.check_run.annotations.createdUma solicitação CreateCheckRunAnnotations acrescenta anotações a uma execução de verificação (repository.check_run.annotations.created). As anotações são somente de acréscimo (nunca são editadas nem removidas individualmente), então .created representa todo o ciclo de vida delas, e cada solicitação corresponde a um evento. check_run é uma referência, não um instantâneo: consulte GetCheckRun para obter o status, a conclusão e a saída da execução'. annotations segue a ordem da solicitação e pode conter menos itens do que annotations_count quando o Origin limita a lista para que o corpo possa ser entregue; consulte as páginas restantes com ListCheckRunAnnotations. Como nos outros webhooks de check-run, o payload não traz contexto de pull request: identifique o pull request a partir de sha.
Campos do 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 ou user. Somente saída; não definido quando desconhecido. Um entre team e user.checkRun object
checkRun.id string
checkRun.name string
checkRun.checkSuite objeto
checkRun.checkSuite.id string
sha string
annotations matriz
annotations[].id string
annotations[].checkRunId string
annotations[].annotationLevel string
notice, warning, failure.annotations[].message string
annotations[].title string
annotations[].rawDetails string
annotations[].createdAt string
annotations[].updatedAt string
annotations[].location objeto
path, start_line e end_line são obrigatórios sempre que a anotação envolvente fornecer esta mensagem. path é canônico e relativo ao repositório; linhas e colunas são coordenadas positivas, inclusivas e numeradas a partir de 1; columns só é compatível com intervalos de uma única linha.annotations[].location.path string Obrigatório
annotations[].location.startLine integer Obrigatório
annotations[].location.endLine integer Obrigatório
annotations[].location.columns objeto
annotations[].location.columns.startColumn integer
annotations[].location.columns.endColumn integer
annotationsCount integer
createdAt string
Exemplo de event.payload:
{ "repository": { "id": "repo_01k2ja2000e0080000000000q4", "name": "rocket", "owner": { "slug": "acme", "id": "ns_01k2ja2000e0080000000000p3", "type": "team" } }, "checkRun": { "id": "cr_01k2ja2000e0080000000000g7", "name": "unit-tests", "checkSuite": { "id": "crg_01k2ja2000e0080000000000h8" } }, "sha": "9a41f0c3d2b8e7f6a5c4d3e2f1b0a9c8d7e6f5a4", "annotations": [ { "id": "cra_01k2ja2000e0080000000000v1", "checkRunId": "cr_01k2ja2000e0080000000000g7", "annotationLevel": "warning", "message": "Deprecated API usage; migrate to the v2 client.", "title": "Deprecated API", "createdAt": "2026-08-02T14:45:00Z", "updatedAt": "2026-08-02T14:45:00Z", "location": { "path": "src/telemetry.ts", "startLine": 42, "endLine": 42, "columns": { "startColumn": 5, "endColumn": 31 } } }, { "id": "cra_01k2ja2000e0080000000000v2", "checkRunId": "cr_01k2ja2000e0080000000000g7", "annotationLevel": "failure", "message": "Three tests failed in telemetry.test.ts.", "title": "Test failures", "rawDetails": "FAIL telemetry.test.ts flushes on shutdown (expected 1 call, received 0)", "createdAt": "2026-08-02T14:45:00Z", "updatedAt": "2026-08-02T14:45:00Z" } ], "annotationsCount": 2, "createdAt": "2026-08-02T14:45:00Z"}