API reference

Repository contents

A repository's settings, files, commits, diffs and insights.

The routes behind the Git portal. To clone and push, use Git over HTTPS.

GET /v1/orgs/:orgId/git-credentials

The caller's machine keys in the org (names, scopes, expiry; never secrets).

Auth: user access token or platform agent key · Scope: git:read

Path parameterDescription
:orgIdOrganization id (org_…).

Response 200

{
  keys: {
    keyId: string
    orgId: string
    name: string
    kind: "api" | "mcp" | "agent"
    scopes: string[]
    createdBy: string
    machineId?: string
    expiresAt?: number
    createdAt?: number
  }[]
}

Errors

StatusMessage
403Sign in with the command line to create git credentials.

POST /v1/orgs/:orgId/git-credentials

Creates a key with the caller's git scopes in the org (git:read, and git:write when they hold it) for one machine, replacing the machine's previous key. The key is returned once; it expires after 90 days. Needs a second factor confirmed in the last 10 minutes (403 code: "step_up": the CLI runs ID's step-up sign-in and asks again), and tells the org's owners (security.git_key).

Auth: user access token or platform agent key · Scope: git:read

Path parameterDescription
:orgIdOrganization id (org_…).

Request body

FieldTypeRequiredNotes
machineIdstringYesmatches ^[A-Za-z0-9_-]{16,64}$
machinestringYes1–64 characters; trimmed

Response 201

{
  key: string
  keyId: string
  name: string
  scopes: ("platform:admin" | "platform:infra" | "platform:analytics" | "platform:coverage" | "org:read" | "org:write" | "audit:read" | "tenant:read" | "tenant:write" | "members:read" | "members:write" | "projects:read" | "projects:write" | "deployments:read" | "deployments:write" | "env:read" | "env:write" | "keys:read" | "keys:use" | "keys:write" | "domains:read" | "domains:write" | "resources:read" | "resources:write" | "git:read" | "git:write" | "git:admin" | "logs:read" | "analytics:read" | "knowledge:read" | "knowledge:write" | "connectors:read" | "connectors:write" | "chat:use" | "mcp:connect" | "agents:read" | "agents:write" | "agents:run" | "mail:read" | "mail:send" | "mail:admin" | "calendar:read" | "calendar:write" | "contacts:read" | "contacts:write" | "issues:read" | "issues:write" | "issues:admin" | "maps:read" | "maps:write" | "drive:read" | "drive:write" | "crm:read" | "crm:write" | "crm:admin" | "marketing:read" | "marketing:write" | "marketing:send" | "marketing:admin" | "health:read" | "health:write" | "weather:read" | "weather:write" | "food:read" | "food:write")[]
  expiresAt: number
}

Errors

StatusMessage
403Sign in with the command line to create git credentials.

DELETE /v1/orgs/:orgId/git-credentials/:keyId

Revokes one of the caller's machine keys.

Auth: user access token or platform agent key · Scope: git:read

Path parameterDescription
:orgIdOrganization id (org_…).
:keyIdKey id (key_…).

Response 204 with no body.

Errors

StatusMessage
403Sign in with the command line to create git credentials.
404Key not found

GET /v1/orgs/:orgId/repos/:name/branches

Branches with their last commit.

Auth: user access token or platform agent key · Scope: git:read

Path parameterDescription
:orgIdOrganization id (org_…).
:nameRepository name.

Response 200

{
  defaultBranch: null | string
  branches: {
    name: string
    commit: {
      id: string
      message: string
      author: {
        name?: string
        email?: string
        date?: number
      }
      committedAt: null | number
    }
    isDefault: boolean
    protected: boolean
    openPull: null | number
  }[]
}

Errors

StatusMessage
404Repository not found

GET /v1/orgs/:orgId/repos/:name/branches/divergence

Commits ahead of / behind the default branch, per name (repeatable), bounded.

Auth: user access token or platform agent key · Scope: git:read

Path parameterDescription
:orgIdOrganization id (org_…).
:nameRepository name.

Response 200

{
  base: null | string
  divergence: {}
}
| {
  base: null | string
  divergence: {
    [key: string]: null | {
      ahead: number
      behind: number
      exact: boolean
    }
  }
}

Errors

StatusMessage
404Repository not found
404Not found
404Commit not found

POST /v1/orgs/:orgId/repos/:name/branches

Creates a branch from a branch, tag or commit.

Auth: user access token or platform agent key · Scopes: git:read, git:write

Path parameterDescription
:orgIdOrganization id (org_…).
:nameRepository name.

Request body

FieldTypeRequiredNotes
namestringYes1–256 characters; trimmed
fromstringYes1–256 characters

Response 201

{
  branch: {
    name: string
    commitId: string
  }
}

Errors

StatusMessage
400That commit doesn't exist.
404Repository not found
404Not found
404Branch or tag not found
409A branch with this name already exists.
409A tag with this name already exists.

DELETE /v1/orgs/:orgId/repos/:name/branches

Deletes the branch name. The default branch and branches whose rule blocks deletion can't be deleted.

Auth: user access token or platform agent key · Scopes: git:read, git:write

Path parameterDescription
:orgIdOrganization id (org_…).
:nameRepository name.
Query parameterTypeRequiredNotes
namestringYes1–256 characters

Response 200

{
  deleted: string
  commitId: null | string
}

Errors

StatusMessage
400The default branch can't be deleted.
404Repository not found
404Branch not found.

GET /v1/orgs/:orgId/repos/:name/tags

Tags and their commits. Create tags by pushing them with git.

Auth: user access token or platform agent key · Scope: git:read

Path parameterDescription
:orgIdOrganization id (org_…).
:nameRepository name.

Response 200

{
  tags: {
    name: string
    annotated: boolean
    object: string
    commit: {
      id: string
      message: string
      author: {
        name?: string
        email?: string
        date?: number
      }
      committedAt: null | number
    }
  }[]
}

Errors

StatusMessage
404Repository not found

POST /v1/orgs/:orgId/repos/:name/contents

Commits file changes from the web: add or replace (base64 content), move or delete files, on branch or a newBranch. Fails if the branch moved since parentCommitId, 403 where a branch rule needs a pull request (unless you're on its bypass list), and 422 secret_detected with the findings when secret scanning finds something nobody allowed.

Auth: user access token or platform agent key · Scopes: git:read, git:write

Path parameterDescription
:orgIdOrganization id (org_…).
:nameRepository name.

Request body

FieldTypeRequiredNotes
uploadIdstringNomatches ^[0-9a-f]{32}$
branchstringYes1–256 characters
parentCommitIdstringNomatches ^[0-9a-f]{40}$
messagestringYes1–1,000 characters; trimmed
descriptionstringNoup to 20,000 characters
newBranchstringNoup to 256 characters; trimmed
changes(object | object | object | object)[]Yes1–1,000 items

Response 201

{
  commitId?: string
  branch: string
}

Response 422

{
  error: string
  code: string
  findings: {
    line: number
    fingerprint: string
    preview: string
    path?: string
    rule: "aws_access_key" | "aws_secret_key" | "stripe_key" | "private_key" | "si_token" | "github_token"
    label: string
  }[]
}

Errors

StatusMessage
400…: …
400… is changed more than once.
400A file can't be moved onto itself.
400uploadId is required for uploaded files.
400parentCommitId is required.
400Invalid upload id.
400An uploaded file is missing. Upload the files again.
404Repository not found
404Branch … not found.
409A branch named … already exists.
409A tag named … already exists.
413Web commits can change up to 1000 files and 50 MB of content. Push larger changes with git.

POST /v1/orgs/:orgId/repos/:name/contents/uploads

Presigned upload URLs for a large web commit, one per file (sizes in bytes); the commit then names uploadId and each file's upload index. Uploads not committed are removed after a day.

Auth: user access token or platform agent key · Scopes: git:read, git:write

Path parameterDescription
:orgIdOrganization id (org_…).
:nameRepository name.

Request body

FieldTypeRequiredNotes
filesobject[]Yes1–1,000 items
files[].sizeintegerYes0–52428800

Response 201

{
  uploadId: string
  uploads: {
    index: number
    url: string
  }[]
}

Errors

StatusMessage
404Repository not found
413Web commits are limited to 50 MB. Push larger changes with git.

POST /v1/orgs/:orgId/repos/:name/contents/archive

ZIP of a branch, tag or commit built in the background (for archives too large for the portal): pending until it exists, then a download link valid for 15 minutes.

Auth: user access token or platform agent key · Scope: git:read

Path parameterDescription
:orgIdOrganization id (org_…).
:nameRepository name.

Request body

FieldTypeRequiredNotes
refstringYes1–256 characters

Response 200

{
  status: "ready"
  url: string
} | {
  status: "pending"
} | {
  status: "failed"
  error: string
}

Errors

StatusMessage
404Repository not found
404Branch or tag not found

GET /v1/orgs/:orgId/repos/:name/contents/raw

File bytes; the portal's /raw route serves them with the right type. Files over 4 MB (a Lambda response's limit, base64) answer JSON with x-si-raw: large instead: a download link from the staging bucket (ready), pending while the archiver fetches it, or failed.

Auth: user access token or platform agent key · Scope: git:read

Path parameterDescription
:orgIdOrganization id (org_…).
:nameRepository name.
Query parameterTypeRequiredNotes
refstringYesat least 1 character
pathstringYesat least 1 character
download"0" | "1"No

Response 200

{
  blobId: string
  commitId: string
  status: "ready"
  url: string
} | {
  blobId: string
  commitId: string
  status: "pending"
} | {
  blobId: string
  commitId: string
  status: "failed"
  error: string
}

Errors

StatusMessage
404Repository not found
404Not found
404Branch or tag not found

GET /v1/orgs/:orgId/repos/:name/contents/files

Every file path at a ref (for the file finder and archives), bounded.

Auth: user access token or platform agent key · Scope: git:read

Path parameterDescription
:orgIdOrganization id (org_…).
:nameRepository name.
Query parameterTypeRequiredNotes
refstringYesat least 1 character

Response 200

{
  files: {
    path: string
    blobId: string
    mode: string
    type: "file" | "link"
  }[]
  truncated: boolean
  commitId: string
}

Errors

StatusMessage
404Repository not found
404Not found
404Branch or tag not found

POST /v1/orgs/:orgId/repos/:name/contents/blobs

Blob contents (base64) in request order, as many as fit in one response; the caller asks again for the rest. Blobs too large for a response are marked tooLarge.

Auth: user access token or platform agent key · Scope: git:read

Path parameterDescription
:orgIdOrganization id (org_…).
:nameRepository name.

Request body

FieldTypeRequiredNotes
idsstring[]Yes1–50 items; each matches ^[0-9a-f]{40}$

Response 200

{
  blobs: {
    id: string
    content?: string
    tooLarge?: true
  }[]
}

Errors

StatusMessage
404Repository not found

GET /v1/orgs/:orgId/repos/:name/compare

Commits and changed files on head since it diverged from base, whether it merges cleanly, and any open pull request between them.

Auth: user access token or platform agent key · Scope: git:read

Path parameterDescription
:orgIdOrganization id (org_…).
:nameRepository name.
Query parameterTypeRequiredNotes
basestringYes1–256 characters
headstringYes1–256 characters

Response 200

{
  mergeBase: string
  status: string
  aheadBy: number
  behindBy: number
  exact: true
  commits: []
  commitsTruncated: false
  files: []
  total: number
  truncated: false
  mergeOptions: []
  conflicts: []
  base: {
    ref: string
    commitId: string
  }
  head: {
    ref: string
    commitId: string
  }
  pull: null | number
}
| {
  mergeOptions: ("fast-forward" | "squash" | "three-way")[]
  conflicts: {
    path: string
    conflicts: number
    binary: boolean
    kind: "type" | "mode" | "content"
  }[]
  files: {
    path: string
    previousPath?: string
    change: "added" | "deleted" | "modified" | "renamed"
    similarity?: number
    additions: number
    deletions: number
    binary?: boolean
    collapsed?: boolean
    hunks: {
      oldStart: number
      oldLines: number
      newStart: number
      newLines: number
      lines: string[]
    }[]
  }[]
  total: number
  truncated: boolean
  mergeBase: null | string
  status: string
  aheadBy: number
  behindBy: number
  exact: boolean
  commits: {
    id: string
    message: string
    author: {
      name?: string
      email?: string
      date?: number
    }
    parents: string[]
    committedAt?: number
  }[]
  commitsTruncated: boolean
  base: {
    ref: string
    commitId: string
  }
  head: {
    ref: string
    commitId: string
  }
  pull: null | number
}

Errors

StatusMessage
400These branches are too far apart to compare.
404Repository not found
404Not found
404Branch or tag not found
404Branch or commit not found.
404Commit not found

GET /v1/orgs/:orgId/repos/:name/labels

The repository's labels.

Auth: user access token or platform agent key · Scope: git:read

Path parameterDescription
:orgIdOrganization id (org_…).
:nameRepository name.

Response 200

{
  labels: {
    name: string
    color: string
    description: string
  }[]
}

Errors

StatusMessage
404Repository not found

PUT /v1/orgs/:orgId/repos/:name/labels

Creates or updates a label by name.

Auth: user access token or platform agent key · Scopes: git:read, git:write

Path parameterDescription
:orgIdOrganization id (org_…).
:nameRepository name.

Request body

FieldTypeRequiredNotes
namestringYes1–50 characters; trimmed
color"chart-1" | "chart-2" | "chart-3" | "chart-4" | "chart-5" | "destructive" | "primary" | "muted-foreground"Yes
descriptionstringNoup to 100 characters; trimmed

Response 200

{
  label: {
    name: string
    color: string
    description: string
  }
}

Errors

StatusMessage
400A repository can have up to 100 labels.
404Repository not found

DELETE /v1/orgs/:orgId/repos/:name/labels

Deletes the label name and removes it from issues and pull requests.

Auth: user access token or platform agent key · Scopes: git:read, git:write

Path parameterDescription
:orgIdOrganization id (org_…).
:nameRepository name.
Query parameterTypeRequiredNotes
namestringYes1–50 characters

Response 204 with no body.

Errors

StatusMessage
404Repository not found

GET /v1/orgs/:orgId/repos/-/notifications

Your email settings for issues and pull requests in the organization: all off, and the repositories you muted. People only.

Auth: user access token or platform agent key · Scope: git:read

Path parameterDescription
:orgIdOrganization id (org_…).

Response 200

{
  off: boolean
  muted: {
    repoId: string
    name: string
  }[]
}

Errors

StatusMessage
403Notification settings belong to people.

PUT /v1/orgs/:orgId/repos/-/notifications

Turns your email about issues and pull requests in the organization off (off: true) or back on. Muted repositories stay muted.

Auth: user access token or platform agent key · Scope: git:read

Path parameterDescription
:orgIdOrganization id (org_…).

Request body

FieldTypeRequiredNotes
offbooleanYes

Response 200

{
  off: boolean
  muted: {
    repoId: string
    name: string
  }[]
}

Errors

StatusMessage
403Notification settings belong to people.

PUT /v1/orgs/:orgId/repos/:name/notifications

Mutes (or unmutes) one repository for the person.

Auth: user access token or platform agent key · Scope: git:read

Path parameterDescription
:orgIdOrganization id (org_…).
:nameRepository name.

Request body

FieldTypeRequiredNotes
mutedbooleanYes

Response 200

{
  muted: boolean
  off: boolean
}

Errors

StatusMessage
403Notification settings belong to people.
404Repository not found

GET /v1/orgs/:orgId/repos

The organization's repositories with their default branch, language and last update.

Auth: user access token or platform agent key · Scope: git:read

Path parameterDescription
:orgIdOrganization id (org_…).

Response 200

{
  repos: {
    name: string
    resourceId: string
    description: null | string
    defaultBranch: null | string
    createdAt?: number
    updatedAt?: number
    language?: null | string
    access?: {
      mode: "org" | "restricted"
      level: "none" | "write" | "admin" | "read"
    }
  }[]
}

GET /v1/orgs/:orgId/repos/-/available

Whether name can be used for a new repository, and why not.

Auth: user access token or platform agent key · Scope: git:read

Path parameterDescription
:orgIdOrganization id (org_…).
Query parameterTypeRequiredNotes
namestringYesup to 100 characters

Response 200

{
  name: string
  available: boolean
  reason: null | string
}

GET /v1/orgs/:orgId/repos/-/people

Org members, for assignees and @mentions; with repo, only those who can read that repository.

Auth: user access token or platform agent key · Scope: git:read

Path parameterDescription
:orgIdOrganization id (org_…).
Query parameterTypeRequiredNotes
repostringNoup to 100 characters

Response 200

{
  people: {
    userId: string
    name: null | string
    email: string
    handle: string
  }[]
}

Errors

StatusMessage
404Repository not found

POST /v1/orgs/:orgId/repos

Creates a repository, optionally with a first commit holding a README, a .gitignore template (Node, Next.js, Python, Go or Rust) and a license (MIT or Apache 2.0).

Auth: user access token or platform agent key · Scope: git:write

Path parameterDescription
:orgIdOrganization id (org_…).

Request body

FieldTypeRequiredDefaultNotes
namestringYesmatches ^[a-z0-9][a-z0-9-]{1,38}[a-z0-9]$
descriptionstringNoup to 1,000 characters; trimmed
readmebooleanNofalse
gitignore``No
license``No
defaultBranchstringNo"main"trimmed

Response 201

{
  repo: {
    defaultBranch: string
    empty: boolean
    region: string
    type: "repository" | "database" | "bucket"
    name: string
    status?: "error" | "active" | "creating" | "deleting"
    createdAt?: number
    updatedAt?: number
    orgId: string
    resourceId: string
    createdBy: string
    projectId?: string
    location: string
    arn?: string
    physicalName: string
    restoredFrom?: string
    pendingSetup?: boolean
  }
}

Errors

StatusMessage
400Unknown location: undefined
409A repository with this name already exists.
502Could not create the repository.
502Could not create the initial commit.

POST /v1/orgs/:orgId/repos/:name/rename

Renames a repository. Clone URLs change with it.

Auth: user access token or platform agent key · Scope: git:write

Path parameterDescription
:orgIdOrganization id (org_…).
:nameRepository name.

Request body

FieldTypeRequiredNotes
namestringYesmatches ^[a-z0-9][a-z0-9-]{1,38}[a-z0-9]$

Response 200

{
  name: string
}

Errors

StatusMessage
404Repository not found
409A repository with this name already exists.

DELETE /v1/orgs/:orgId/repos/:name

Deletes a repository with its history. confirm must be the repository name.

Auth: user access token or platform agent key · Scopes: git:write, git:admin (when c.get("repo")?.access.mode === "restricted")

Path parameterDescription
:orgIdOrganization id (org_…).
:nameRepository name.
Query parameterTypeRequiredNotes
confirmstringYes

Response 204 with no body.

Errors

StatusMessage
400Type the repository name to confirm.
404Repository not found

GET /v1/orgs/:orgId/repos/:name/protection

The default branch's protection: how many approvals pull requests into it need. The full rules are at branch-rules.

Auth: user access token or platform agent key · Scope: git:read

Path parameterDescription
:orgIdOrganization id (org_…).
:nameRepository name.

Response 200

{
  requiredApprovals: number
  branch: null | string
}

Errors

StatusMessage
404Repository not found

PUT /v1/orgs/:orgId/repos/:name/protection

Sets how many approvals (0–10) pull requests into the default branch need before they can be merged, as the default branch's rule (which also blocks force pushes and deletion; its bypass list stays). 0 lets direct pushes in again. Needs git:admin.

Auth: user access token or platform agent key · Scope: git:admin

Path parameterDescription
:orgIdOrganization id (org_…).
:nameRepository name.

Request body

FieldTypeRequiredNotes
requiredApprovalsintegerYes0–10

Response 200

{
  requiredApprovals: number
  branch: string
}

Errors

StatusMessage
400Push a branch before protecting it.
404Repository not found

GET /v1/orgs/:orgId/repos/:name/access

Who can reach the repository (docs/repo-access.md): its mode, the people, groups and machines on its list with names for them, and the last change. For those who can read the repository, and for owners (who manage the list without seeing the code).

Auth: user access token or platform agent key

Path parameterDescription
:orgIdOrganization id (org_…).
:nameRepository name.

Response 200

{
  access: {
    mode: "org" | "restricted"
    users: {
      userId: string
      level: "write" | "admin" | "read"
    }[]
    teams: {
      teamId: string
      level: "write" | "admin" | "read"
    }[]
    machines: {
      id: "checks" | "pipelines" | string | "service:issues"
      level: "write" | "read"
    }[]
  }
  canManage: boolean
  updatedAt: null | number
  updatedBy: null | {
    userId: string
    name: null | string
    email: string
  }
  labels: {
    users: {
      [key: string]: {
        name?: string
        email: string
      }
    }
    teams: {
      [key: string]: {
        name: string
      }
    }
    machines: {
      [key: string]: {
        label: string
        detail?: string
      }
    }
  }
}

Errors

StatusMessage
404Repository not found

PUT /v1/orgs/:orgId/repos/:name/access

Changes who can reach the repository: org owners only (a break-glass, audited), never through a key or an assistant.

Auth: user access token or platform agent key

Path parameterDescription
:orgIdOrganization id (org_…).
:nameRepository name.

Request body

FieldTypeRequiredNotes
mode"org" | "restricted"Yes
usersobject[]Yesup to 100 items
users[].userIdstringYes1–64 characters
users[].level"read" | "write" | "admin"Yes
teamsobject[]Yesup to 50 items
teams[].teamIdstringYes1–64 characters
teams[].level"read" | "write" | "admin"Yes
machinesobject[]Yesup to 50 items
machines[].idstringYes1–64 characters
machines[].level"read" | "write"Yes

Response 200

{
  access: {
    mode: "org" | "restricted"
    users: {
      userId: string
      level: "write" | "admin" | "read"
    }[]
    teams: {
      teamId: string
      level: "write" | "admin" | "read"
    }[]
    machines: {
      id: "checks" | "pipelines" | string | "service:issues"
      level: "write" | "read"
    }[]
  }
  canManage: boolean
  updatedAt: null | number
  updatedBy: null | {
    userId: string
    name: null | string
    email: string
  }
  labels: {
    users: {
      [key: string]: {
        name?: string
        email: string
      }
    }
    teams: {
      [key: string]: {
        name: string
      }
    }
    machines: {
      [key: string]: {
        label: string
        detail?: string
      }
    }
  }
}

Errors

StatusMessage
403Only owners of the organization can change who can access a repository.
404Repository not found

POST /v1/orgs/:orgId/repos/:name/checks

Starts checks of a branch in a sandbox: install, then the typecheck, lint, test and build scripts (or si.json checks). Nothing is deployed. Returns checkId (202). Needs git:write.

Auth: user access token or platform agent key · Scope: git:write

Path parameterDescription
:orgIdOrganization id (org_…).
:nameRepository name.

Request body

FieldTypeRequiredNotes
branchstringYes1–200 characters; trimmed

Response 202

{
  checkId: string
}

Errors

StatusMessage
400Invalid branch name.
404Repository not found

GET /v1/orgs/:orgId/repos/:name/checks/:checkId

A check run's status (queued, running, passed, failed, stopped, timed_out), steps and the end of its output (tail lines, default 80).

Auth: user access token or platform agent key · Scope: git:read

Path parameterDescription
:orgIdOrganization id (org_…).
:nameRepository name.
:checkIdCheck run id, as returned when the checks started (si-<stage>-checker:<uuid>).
Query parameterTypeRequiredDefaultNotes
tailintegerNo800–500; coerced from a string

Response 200

{
  run: {
    checkId: string
    status: "queued" | "failed" | "timed_out" | "running" | "passed" | "stopped"
    branch: string
    startedAt?: number
    endedAt?: number
    steps: {
      name: string
      status: "skipped" | "failed" | "running" | "passed"
    }[]
    log: string[]
  }
}

Errors

StatusMessage
404Repository not found
404Check run not found

DELETE /v1/orgs/:orgId/repos/:name/checks/:checkId

Stops a check run. Needs git:write.

Auth: user access token or platform agent key · Scope: git:write

Path parameterDescription
:orgIdOrganization id (org_…).
:nameRepository name.
:checkIdCheck run id, as returned when the checks started (si-<stage>-checker:<uuid>).

Response 204 with no body.

Errors

StatusMessage
404Repository not found
404Check run not found

GET /v1/orgs/:orgId/repos/:name/branch-rules

The branch rules in force (pull requests, approvals, code owners, force-push and deletion blocks, bypass list), whether they were saved or are the defaults, secret scanning (block or off), and the CODEOWNERS file found at the default branch with its errors.

Auth: user access token or platform agent key · Scope: git:read

Path parameterDescription
:orgIdOrganization id (org_…).
:nameRepository name.

Response 200

{
  rules: {
    branch: string
    requirePullRequest: boolean
    requiredApprovals: number
    requireCodeOwners: boolean
    blockForcePush: boolean
    blockDeletion: boolean
    bypass: string[]
  }[]
  explicit: boolean
  secretScanning: "off" | "block"
  defaultBranch: null | string
  codeowners: {
    path: null | string
    rules: number
    errors: {
      line: number
      message: string
    }[]
  }
}

Errors

StatusMessage
404Repository not found

PUT /v1/orgs/:orgId/repos/:name/branch-rules

Replaces the branch rules (up to 20; a name or a prefix ending in *) and optionally sets secret scanning. People on a bypass list must be able to write the repository. Open pull requests get the approval rules their target now asks for. Needs git:admin.

Auth: user access token or platform agent key · Scopes: git:read, git:admin

Path parameterDescription
:orgIdOrganization id (org_…).
:nameRepository name.

Request body

FieldTypeRequiredDefaultNotes
rulesobject[]Yesup to 20 items
rules[].branchstringYes1–256 characters
rules[].requirePullRequestbooleanYes
rules[].requiredApprovalsintegerYes0–10
rules[].requireCodeOwnersbooleanYes
rules[].blockForcePushbooleanYes
rules[].blockDeletionbooleanYes
rules[].bypassstring[]No[]up to 20 items; each up to 64 characters
secretScanning"block" | "off"No

Response 200

{
  rules: {
    branch: string
    requirePullRequest: boolean
    requiredApprovals: number
    requireCodeOwners: boolean
    blockForcePush: boolean
    blockDeletion: boolean
    bypass: string[]
  }[]
  explicit: true
  secretScanning: "off" | "block"
  defaultBranch: null | string
}

Errors

StatusMessage
404Repository not found

POST /v1/orgs/:orgId/repos/:name/secret-scan/allowances

Says findings a push or commit was refused for aren't secrets: their fingerprints (1–20) with a reason. Covers your pushes and web commits in this repository for an hour; audited. People only, with git:write.

Auth: user access token or platform agent key · Scopes: git:read, git:write

Path parameterDescription
:orgIdOrganization id (org_…).
:nameRepository name.

Request body

FieldTypeRequiredNotes
fingerprintsstring[]Yes1–20 items; each matches ^[0-9a-f]{16}$
reasonstringYes1–500 characters; trimmed

Response 201

{
  allowanceId: string
  expiresAt: number
}

Errors

StatusMessage
403Only people can allow a detected secret.
404Repository not found

POST /v1/orgs/:orgId/repos/:name/branches/promote

Fast-forwards a protected branch to the tip of from (for pushes too large for the git host to check), never forcing. Only where its rule lets you update it directly (you're on its bypass list, or it doesn't require pull requests), after a secret scan of the changes; audited.

Auth: user access token or platform agent key · Scopes: git:read, git:write

Path parameterDescription
:orgIdOrganization id (org_…).
:nameRepository name.

Request body

FieldTypeRequiredNotes
branchstringYes1–256 characters
fromstringYes1–256 characters

Response 200

{
  commitId: string
}

Response 422

{
  error: string
  code: string
  findings: {
    line: number
    fingerprint: string
    preview: string
    path?: string
    rule: "aws_access_key" | "aws_secret_key" | "stripe_key" | "private_key" | "si_token" | "github_token"
    label: string
  }[]
}

Errors

StatusMessage
400Choose two different branches.
404Repository not found
404Branch … not found.
409… isn't ahead of …: merge or rebase it first.
409… changed. Try again.
409The branches have diverged too far to promote.

GET /v1/orgs/:orgId/repos/:name/read-audit

The repository's read auditing (all, clones or off) and whether owners get clone alerts, defaults filled in.

Auth: user access token or platform agent key · Scope: git:read

Path parameterDescription
:orgIdOrganization id (org_…).
:nameRepository name.

Response 200

{
  readAudit: "off" | "all" | "clones"
  cloneAlerts: boolean
}

Errors

StatusMessage
404Repository not found

PUT /v1/orgs/:orgId/repos/:name/read-audit

Changes which reads are recorded (readAudit) and clone alerts (cloneAlerts); audited as repo.read_audit_update.

Auth: user access token or platform agent key · Scope: git:admin

Path parameterDescription
:orgIdOrganization id (org_…).
:nameRepository name.

Request body

FieldTypeRequiredNotes
readAudit"all" | "clones" | "off"No
cloneAlertsbooleanNo

Also checked: Unknown fields are rejected. Nothing to change.

Response 200

{
  readAudit: "off" | "all" | "clones"
  cloneAlerts: boolean
}

Errors

StatusMessage
404Repository not found

GET /v1/orgs/:orgId/repos/:name

Repository details: description, default branch, branches and open issue and pull request counts.

Auth: user access token or platform agent key · Scope: git:read

Path parameterDescription
:orgIdOrganization id (org_…).
:nameRepository name.

Response 200

{
  resourceId: string
  description: null | string
  defaultBranch: null | string
  branches: string[]
  tags: string[]
  initialBranch: null | string
  protectedBranch: null | string
  createdAt?: string
  updatedAt?: string
  openIssues: number
  openPulls: number
  scopes: ("platform:admin" | "platform:infra" | "platform:analytics" | "platform:coverage" | "org:read" | "org:write" | "audit:read" | "tenant:read" | "tenant:write" | "members:read" | "members:write" | "projects:read" | "projects:write" | "deployments:read" | "deployments:write" | "env:read" | "env:write" | "keys:read" | "keys:use" | "keys:write" | "domains:read" | "domains:write" | "resources:read" | "resources:write" | "git:read" | "git:write" | "git:admin" | "logs:read" | "analytics:read" | "knowledge:read" | "knowledge:write" | "connectors:read" | "connectors:write" | "chat:use" | "mcp:connect" | "agents:read" | "agents:write" | "agents:run" | "mail:read" | "mail:send" | "mail:admin" | "calendar:read" | "calendar:write" | "contacts:read" | "contacts:write" | "issues:read" | "issues:write" | "issues:admin" | "maps:read" | "maps:write" | "drive:read" | "drive:write" | "crm:read" | "crm:write" | "crm:admin" | "marketing:read" | "marketing:write" | "marketing:send" | "marketing:admin" | "health:read" | "health:write" | "weather:read" | "weather:write" | "food:read" | "food:write")[]
  access: {
    mode: "org" | "restricted"
    level: "none" | "write" | "admin" | "read"
  }
  notifications: null | {
    off: boolean
    muted: boolean
  }
}

Errors

StatusMessage
404Repository not found
404Not found

PATCH /v1/orgs/:orgId/repos/:name

Updates the description or the default branch.

Auth: user access token or platform agent key · Scopes: git:read, git:write

Path parameterDescription
:orgIdOrganization id (org_…).
:nameRepository name.

Request body

FieldTypeRequiredNotes
descriptionstringNoup to 1,000 characters
defaultBranchstringNo1–255 characters

Response 200

{
  ok: true
}

Errors

StatusMessage
400Branch not found.
404Repository not found

GET /v1/orgs/:orgId/repos/:name/tree

Lists a directory at a branch or commit.

Auth: user access token or platform agent key · Scope: git:read

Path parameterDescription
:orgIdOrganization id (org_…).
:nameRepository name.
Query parameterTypeRequiredDefaultNotes
refstringNo"main"
pathstringNo"/"

Response 200

{
  commitId?: string
  path: string
  entries: {
    type: "dir"
    name: string
    path: string
  } | {
    type: "file"
    name: string
    path: string
  } | {
    type: "link"
    name: string
    path: string
  } | {
    type: "submodule"
    name: string
    path: string
  }[]
}

Errors

StatusMessage
404Repository not found
404Not found

GET /v1/orgs/:orgId/repos/:name/blob

A file at a branch or commit. text is null for binary files and files over 1 MB. path is required.

Auth: user access token or platform agent key · Scope: git:read

Path parameterDescription
:orgIdOrganization id (org_…).
:nameRepository name.
Query parameterTypeRequiredDefaultNotes
pathstringNo
refstringNo"main"

Response 200

{
  path: string
  size: null
  commitId: string
  blobId: string
  mode?: "EXECUTABLE" | "NORMAL" | "SYMLINK"
  text: null
}
| {
  path: string
  size: number
  commitId?: string
  blobId?: string
  mode?: "EXECUTABLE" | "NORMAL" | "SYMLINK"
  text: null | string
}

Errors

StatusMessage
400path is required
404Repository not found
404Not found
404Branch or tag not found

GET /v1/orgs/:orgId/repos/:name/commits

First-parent history, newest first. With path, only commits that touch that file or folder (scanned reports how far the search went). Pass the returned next as cursor to continue.

Auth: user access token or platform agent key · Scope: git:read

Path parameterDescription
:orgIdOrganization id (org_…).
:nameRepository name.
Query parameterTypeRequiredDefaultNotes
refstringNo"main"at least 1 character
cursorstringNomatches ^[0-9a-f]{40}$
limitintegerNo201–50; coerced from a string
pathstringNo

Response 200

{
  commits: {
    id: string
    message: string
    author: {
      name?: string
      email?: string
      date?: number
    }
    parents: string[]
    committedAt?: number
  }[]
  next: null | string
  scanned: number
}
| {
  commits: {
    id: string
    message: string
    author: {
      name?: string
      email?: string
      date?: number
    }
    parents: string[]
    committedAt?: number
  }[]
  next: null | string
}

Errors

StatusMessage
404Repository not found
404Not found
404Branch or tag not found
404Commit not found
503The repository is busy. Try again in a moment.

GET /v1/orgs/:orgId/repos/:name/last-commits

The last commit that touched each entry of a folder. complete is false while more entries can be resolved by asking again (pending counts them, and their entries are null until then); once complete, null means older than the search reached. When the repository is busy the answer has head: null and nothing resolved; ask again.

Auth: user access token or platform agent key · Scope: git:read

Path parameterDescription
:orgIdOrganization id (org_…).
:nameRepository name.
Query parameterTypeRequiredDefaultNotes
refstringNo"main"at least 1 character
pathstringNo""

Response 200

{
  head: string
  latest: null | {
    id: string
    message: string
    author: {
      name?: string
      date?: number
    }
  }
  entries: {
    [key: string]: null | {
      id: string
      message: string
      author: {
        name?: string
        date?: number
      }
    }
  }
  complete: boolean
  pending: number
  scanned: number
  path: string
} | {
  pending: number
  entries: {
    [key: string]: null | {
      id: string
      message: string
      author: {
        name?: string
        date?: number
      }
    }
  }
  complete: boolean
  latest: null | {
    id: string
    message: string
    author: {
      name?: string
      date?: number
    }
  }
  scanned: number
  head: null
  path: string
}

Errors

StatusMessage
404Repository not found
404Not found
404Branch or tag not found

GET /v1/orgs/:orgId/repos/:name/last-commit

The last commit that touched a file. complete is false while it can still be found by asking again; head: null means the repository was busy.

Auth: user access token or platform agent key · Scope: git:read

Path parameterDescription
:orgIdOrganization id (org_…).
:nameRepository name.
Query parameterTypeRequiredDefaultNotes
refstringNo"main"at least 1 character
pathstringYesat least 1 character

Response 200

{
  head: string
  commit: null | {
    id: string
    message: string
    author: {
      name?: string
      date?: number
    }
  }
  complete: boolean
  scanned: number
  path: string
} | {
  head: null
  commit: null
  complete: boolean
  scanned: number
  path: string
}

Errors

StatusMessage
404Repository not found
404Not found
404Branch or tag not found
404File not found

GET /v1/orgs/:orgId/repos/:name/commits/:sha

A commit and its changes against its first parent.

Auth: user access token or platform agent key · Scope: git:read

Path parameterDescription
:orgIdOrganization id (org_…).
:nameRepository name.
:shaFull commit id or branch name.

Response 200

{
  files: {
    path: string
    previousPath?: string
    change: "added" | "deleted" | "modified" | "renamed"
    similarity?: number
    additions: number
    deletions: number
    binary?: boolean
    collapsed?: boolean
    hunks: {
      oldStart: number
      oldLines: number
      newStart: number
      newLines: number
      lines: string[]
    }[]
  }[]
  total: number
  truncated: boolean
  commit: {
    id: string
    message: string
    author: {
      name?: string
      email?: string
      date?: number
    }
    parents: string[]
    committedAt?: number
  }
}

Errors

StatusMessage
404Repository not found
404Not found
404Commit not found
404Branch or tag not found

GET /v1/orgs/:orgId/repos/:name/insights

Contributors, weekly commit activity and languages for a branch (the default branch when ref is omitted).

Auth: user access token or platform agent key · Scope: git:read

Path parameterDescription
:orgIdOrganization id (org_…).
:nameRepository name.
Query parameterTypeRequiredNotes
refstringNo

Response 200

{
  ref: string
  head: string
  commitsAnalyzed: number
  historyComplete: boolean
  since: null | number
  contributors: {
    name: string
    email?: string
    commits: number
    lastAt?: number
  }[]
  weeks: {
    week: number
    commits: number
  }[]
  languages: {
    language: string
    files: number
    share: number
  }[]
  languagesComplete: boolean
}

Errors

StatusMessage
404Repository not found
404Not found
404Branch or tag not found
404Commit not found