---
title: "GitBucket"
description: "Use a self-hosted GitBucket server through the part of GitHub's REST API that it serves: issues, pull requests, statuses, releases and webhooks."
canonical_url: "https://forges.link/providers/gitbucket"
---
# GitBucket

> Use a self-hosted GitBucket server through the part of GitHub's REST API that it serves: issues, pull requests, statuses, releases and webhooks.

The GitBucket provider works with self-hosted GitBucket servers. GitBucket is a Git platform written in Scala, and it isn't related to Atlassian's [Bitbucket](https://forges.link/providers/bitbucket). It serves part of GitHub's REST API v3, so this provider runs the code of the [GitHub provider](https://forges.link/providers/github) against it and leaves out what GitBucket doesn't serve. Refs from this provider have `forge: 'gitbucket'`.

<provider-header provider="gitbucket">
<table>
<thead>
  <tr>
    <th>
      Detail
    </th>
    
    <th>
      Value
    </th>
  </tr>
</thead>

<tbody>
  <tr>
    <td>
      Import
    </td>
    
    <td>
      <code>
        forges/gitbucket
      </code>
    </td>
  </tr>
  
  <tr>
    <td>
      Factories
    </td>
    
    <td>
      <code>
        gitbucket()
      </code>
    </td>
  </tr>
  
  <tr>
    <td>
      Auth
    </td>
    
    <td>
      <code>
        token
      </code>
      
      , <code>
        anonymous
      </code>
    </td>
  </tr>
</tbody>
</table>
</provider-header>

<note>

The capabilities on this page are verified against recordings of a GitBucket 4.48.0 server. Other versions of GitBucket can serve more or less of the API. To learn what the levels mean, see [Capabilities](https://forges.link/concepts/capabilities).

</note>

## Authentication

The provider accepts a personal access token, which you create under **Account settings > Applications** on your server. GitBucket tokens have no scopes, so a token can do whatever its account can:

```ts
import { gitbucket } from 'forges/gitbucket'

const forge = gitbucket({
  baseUrl: 'https://gitbucket.example.com',
  auth: { type: 'token', token: process.env.GITBUCKET_TOKEN! },
})
```

If you leave out `auth`, the provider makes anonymous reads of public data.

## Instance

GitBucket has no public instance, so `baseUrl` is required. Set it to the root of your server, including the context path if GitBucket runs under one, such as `https://example.com/gitbucket`. The provider appends `/api/v3` itself. The `instance` in every ref defaults to the host of the server. Two GitBucket servers on one host, under different context paths, need an `instance` each, because a [registry](https://forges.link/guides/multiple-forges) takes one provider per forge and instance. Give it the shape of a host, without a slash, since refs and keys carry it:

```ts
import { createForges, gitbucket } from 'forges'

const forges = createForges([
  gitbucket({ baseUrl: 'https://example.com/team', instance: 'team.example.com' }),
  gitbucket({ baseUrl: 'https://example.com/lab', instance: 'lab.example.com' }),
])
```

## What GitBucket leaves out

GitBucket has no GraphQL, no check runs, no Actions, no reviews, no reactions and no search. It doesn't serve notifications, activity feeds, contributors, branch rules, comparisons, trees or commit comments either. `support()` reports each of those as `false`, or as `'not_applicable'` where GitBucket has no such feature at all, and calling one rejects with `UnsupportedOperationError` before any request goes out. The [capability matrix](https://forges.link/reference/capability-matrix) has the full list.

Some operations that GitBucket does serve still aren't supported, because the provider couldn't do what they promise. They reject with `UnsupportedOperationError` before any request goes out as well, and this is what GitBucket's endpoints do with them:

- `threads.setAssignees()` and `setMilestone()`, and `update()`, `close()` and `reopen()` on an issue, need GitBucket to edit an issue, which its API can't do. A pull request is different: `update()`, `close()` and `reopen()` work, for its title, body and state.
- `threads.create()` of a pull request with `labels` or `assignees`, and `threads.update()` of a pull request with either: GitBucket can't set them as part of the change. Open or update the pull request without them, then set its labels with `setLabels()`.
- `threads.deleteComment()`: GitBucket deletes the comment, but responds with the comment's id as the HTTP status code, so a deletion looks like a failed request.
- `repos.collaborators()` and `repos.addCollaborator()`: GitBucket lists collaborators without a role, and fails with a `500` for the roles that GitHub has beyond read, write and admin.
- `releases.create()` and `releases.update()`: GitBucket creates a release without its tag and drops `draft`, `prerelease` and `target`, and it updates a release only when it gets the whole of it.
- `webhooks.update()` and `webhooks.rotateSecret()`: GitBucket updates a hook only when it gets the whole of it, while the provider sends only what changes.

## Listing threads

GitBucket lists issues and pull requests apart, so pass `kind` to `threads.list()`. Without it, you get the issues and a `kind_unsupported` warning. GitBucket returns 25 threads to a page, whatever `perPage` asks for, and filters milestones by their title. It has no `since` or `involves` filter, so those come back with a `filter_unsupported` warning.

GitBucket ignores `sort` and `direction`, so the provider sorts each page itself. The pages themselves come in GitBucket's order, so a thread on the second page can sort before one on the first.

`threads.getMany()` reads each thread on its own, since GitBucket has no GraphQL to batch the reads with.

## Commits

GitBucket skips commits from the second page of a listing on, so `commits.list()` returns a single page. When that page is full, the result has no cursor and carries a `commits_truncated` warning. To see further back, narrow the listing with `since`, `until` or `path`, or raise `perPage`, up to 100.

## Checks

GitBucket has commit statuses but no check runs, so the `checks` of a pull request are its statuses, and their `url` is the pull request's page, where GitBucket shows them.

## Releases

GitBucket gives a release no id, so the `id` of a release ref is its tag. `releases.get()` reads the release by that tag.

## Merging

`merge()` takes the `merge`, `squash` and `rebase` methods. Without a `method`, GitBucket creates a merge commit. GitBucket writes the first line of the commit message itself, so `title` goes above `message` in the body of the message.

GitBucket responds to every merge with HTTP `200` and puts the real outcome in the response body. The provider reads that outcome, so a conflict rejects with `MergeConflictError`. A closed or draft pull request, or a method that the repository doesn't allow, rejects with `MergeBlockedError`. GitBucket ignores the head a merge expects and has no auto-merge, so `sha` and `whenChecksPass` reject with `UnsupportedOperationError`.

## Labels

GitBucket fails with a `500` when it adds a label that the thread already has. `threads.addLabels()` reads the labels first and sends only the ones that the thread lacks, and `threads.removeLabels()` sends only the ones that it has. Both read the labels again afterwards, because GitBucket responds with only the labels that it changed.

## Webhooks

GitBucket signs its deliveries like GitHub, with `X-Hub-Signature-256`, so `webhooks.verify()` and `webhooks.ingest()` work as they do on GitHub. It sends comments, review comments, issue and pull request changes, pushes, new branches and tags, and wiki edits, so `webhooks.create()` subscribes only to those. It accepts a few more event names that it never sends, and responds to a name it doesn't know with a `500`.

## Capabilities

<provider-capabilities provider="gitbucket">
<table>
<thead>
  <tr>
    <th>
      Capability
    </th>
    
    <th>
      Support
    </th>
    
    <th>
      Without credentials
    </th>
  </tr>
</thead>

<tbody>
  <tr>
    <td>
      <code>
        experimental
      </code>
    </td>
    
    <td>
      ❌
    </td>
    
    <td>
      ❌
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        sources.stream
      </code>
    </td>
    
    <td>
      ❌
    </td>
    
    <td>
      ❌
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        repos.get
      </code>
    </td>
    
    <td>
      ✅
    </td>
    
    <td>
      ✅
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        users.get
      </code>
    </td>
    
    <td>
      ✅
    </td>
    
    <td>
      ✅
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        users.me
      </code>
    </td>
    
    <td>
      ✅
    </td>
    
    <td>
      ❌
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        users.sponsorable
      </code>
    </td>
    
    <td>
      ∅
    </td>
    
    <td>
      ∅
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        users.sponsorableMany
      </code>
    </td>
    
    <td>
      ∅
    </td>
    
    <td>
      ∅
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        users.events
      </code>
    </td>
    
    <td>
      ❌
    </td>
    
    <td>
      ❌
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        users.block
      </code>
    </td>
    
    <td>
      ∅
    </td>
    
    <td>
      ∅
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        repos.list
      </code>
    </td>
    
    <td>
      ❌
    </td>
    
    <td>
      ❌
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        repos.byOwner
      </code>
    </td>
    
    <td>
      ✅
    </td>
    
    <td>
      ✅
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        repos.labels
      </code>
    </td>
    
    <td>
      ✅
    </td>
    
    <td>
      ✅
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        repos.createLabel
      </code>
    </td>
    
    <td>
      ✅
    </td>
    
    <td>
      ❌
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        repos.milestones
      </code>
    </td>
    
    <td>
      ✅
    </td>
    
    <td>
      ✅
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        repos.issueTypes
      </code>
    </td>
    
    <td>
      ∅
    </td>
    
    <td>
      ∅
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        repos.collaborators
      </code>
    </td>
    
    <td>
      ❌
    </td>
    
    <td>
      ❌
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        repos.contributors
      </code>
    </td>
    
    <td>
      ❌
    </td>
    
    <td>
      ❌
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        repos.contributorStats
      </code>
    </td>
    
    <td>
      ❌
    </td>
    
    <td>
      ❌
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        repos.templates
      </code>
    </td>
    
    <td>
      ✅
    </td>
    
    <td>
      ✅
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        repos.permissionFor
      </code>
    </td>
    
    <td>
      ❌
    </td>
    
    <td>
      ❌
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        repos.branchRules
      </code>
    </td>
    
    <td>
      ❌
    </td>
    
    <td>
      ❌
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        repos.addCollaborator
      </code>
    </td>
    
    <td>
      ❌
    </td>
    
    <td>
      ❌
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        repos.assignableUsers
      </code>
    </td>
    
    <td>
      ❌
    </td>
    
    <td>
      ❌
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        repos.reviewerCandidates
      </code>
    </td>
    
    <td>
      ∅
    </td>
    
    <td>
      ∅
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        repos.events
      </code>
    </td>
    
    <td>
      ❌
    </td>
    
    <td>
      ❌
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        orgs.teams
      </code>
    </td>
    
    <td>
      ∅
    </td>
    
    <td>
      ∅
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        orgs.teamMembers
      </code>
    </td>
    
    <td>
      ∅
    </td>
    
    <td>
      ∅
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        orgs.block
      </code>
    </td>
    
    <td>
      ∅
    </td>
    
    <td>
      ∅
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        threads.get
      </code>
    </td>
    
    <td>
      issue, PR
    </td>
    
    <td>
      issue, PR
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        threads.list
      </code>
    </td>
    
    <td>
      issue, PR
    </td>
    
    <td>
      issue, PR
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        threads.getMany
      </code>
    </td>
    
    <td>
      ✅
    </td>
    
    <td>
      ✅
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        threads.closingIssues
      </code>
    </td>
    
    <td>
      ❌
    </td>
    
    <td>
      ❌
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        threads.closingPullRequests
      </code>
    </td>
    
    <td>
      ❌
    </td>
    
    <td>
      ❌
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        threads.events
      </code>
    </td>
    
    <td>
      ❌
    </td>
    
    <td>
      ❌
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        threads.comments
      </code>
    </td>
    
    <td>
      issue, PR
    </td>
    
    <td>
      issue, PR
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        threads.getComment
      </code>
    </td>
    
    <td>
      issue, PR
    </td>
    
    <td>
      issue, PR
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        threads.createComment
      </code>
    </td>
    
    <td>
      issue, PR
    </td>
    
    <td>
      ❌
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        threads.updateComment
      </code>
    </td>
    
    <td>
      issue, PR
    </td>
    
    <td>
      ❌
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        threads.deleteComment
      </code>
    </td>
    
    <td>
      ❌
    </td>
    
    <td>
      ❌
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        threads.hideComment
      </code>
    </td>
    
    <td>
      ∅
    </td>
    
    <td>
      ∅
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        threads.reactions
      </code>
    </td>
    
    <td>
      ∅
    </td>
    
    <td>
      ∅
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        threads.react
      </code>
    </td>
    
    <td>
      ∅
    </td>
    
    <td>
      ∅
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        threads.create
      </code>
    </td>
    
    <td>
      issue, PR
    </td>
    
    <td>
      ❌
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        threads.update
      </code>
    </td>
    
    <td>
      PR
    </td>
    
    <td>
      ❌
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        threads.close
      </code>
    </td>
    
    <td>
      PR
    </td>
    
    <td>
      ❌
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        threads.reopen
      </code>
    </td>
    
    <td>
      PR
    </td>
    
    <td>
      ❌
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        threads.lock
      </code>
    </td>
    
    <td>
      ∅
    </td>
    
    <td>
      ∅
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        threads.setLabels
      </code>
    </td>
    
    <td>
      issue, PR
    </td>
    
    <td>
      ❌
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        threads.addLabels
      </code>
    </td>
    
    <td>
      issue, PR
    </td>
    
    <td>
      ❌
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        threads.removeLabels
      </code>
    </td>
    
    <td>
      issue, PR
    </td>
    
    <td>
      ❌
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        threads.setMilestone
      </code>
    </td>
    
    <td>
      ❌
    </td>
    
    <td>
      ❌
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        threads.setIssueType
      </code>
    </td>
    
    <td>
      ∅
    </td>
    
    <td>
      ∅
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        threads.setAssignees
      </code>
    </td>
    
    <td>
      ❌
    </td>
    
    <td>
      ❌
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        threads.requestReview
      </code>
    </td>
    
    <td>
      ∅
    </td>
    
    <td>
      ∅
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        threads.merge
      </code>
    </td>
    
    <td>
      ✅
    </td>
    
    <td>
      ❌
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        threads.updateBranch
      </code>
    </td>
    
    <td>
      ❌
    </td>
    
    <td>
      ❌
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        threads.transfer
      </code>
    </td>
    
    <td>
      ∅
    </td>
    
    <td>
      ∅
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        threads.markDuplicate
      </code>
    </td>
    
    <td>
      ∅
    </td>
    
    <td>
      ∅
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        threads.subscription
      </code>
    </td>
    
    <td>
      ❌
    </td>
    
    <td>
      ❌
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        threads.subscribe
      </code>
    </td>
    
    <td>
      ❌
    </td>
    
    <td>
      ❌
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        threads.checks
      </code>
    </td>
    
    <td>
      PR
    </td>
    
    <td>
      PR
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        threads.files
      </code>
    </td>
    
    <td>
      ❌
    </td>
    
    <td>
      ❌
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        threads.commits
      </code>
    </td>
    
    <td>
      ✅
    </td>
    
    <td>
      ✅
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        threads.reviews
      </code>
    </td>
    
    <td>
      ❌
    </td>
    
    <td>
      ❌
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        threads.getReview
      </code>
    </td>
    
    <td>
      ❌
    </td>
    
    <td>
      ❌
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        threads.createReview
      </code>
    </td>
    
    <td>
      ❌
    </td>
    
    <td>
      ❌
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        threads.submitReview
      </code>
    </td>
    
    <td>
      ❌
    </td>
    
    <td>
      ❌
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        threads.approve
      </code>
    </td>
    
    <td>
      ❌
    </td>
    
    <td>
      ❌
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        threads.replyToReviewComment
      </code>
    </td>
    
    <td>
      ❌
    </td>
    
    <td>
      ❌
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        threads.reviewThreads
      </code>
    </td>
    
    <td>
      ❌
    </td>
    
    <td>
      ❌
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        threads.resolveReviewThread
      </code>
    </td>
    
    <td>
      ❌
    </td>
    
    <td>
      ❌
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        notifications.list
      </code>
    </td>
    
    <td>
      ❌
    </td>
    
    <td>
      ❌
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        notifications.markRead
      </code>
    </td>
    
    <td>
      ❌
    </td>
    
    <td>
      ❌
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        notifications.markDone
      </code>
    </td>
    
    <td>
      ❌
    </td>
    
    <td>
      ❌
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        notifications.unsubscribe
      </code>
    </td>
    
    <td>
      ❌
    </td>
    
    <td>
      ❌
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        notifications.markAllRead
      </code>
    </td>
    
    <td>
      ❌
    </td>
    
    <td>
      ❌
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        notifications.markAllDone
      </code>
    </td>
    
    <td>
      ❌
    </td>
    
    <td>
      ❌
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        notifications.unreadCount
      </code>
    </td>
    
    <td>
      ❌
    </td>
    
    <td>
      ❌
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        installations.list
      </code>
    </td>
    
    <td>
      ❌
    </td>
    
    <td>
      ❌
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        checks.list
      </code>
    </td>
    
    <td>
      ✅
    </td>
    
    <td>
      ✅
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        checks.get
      </code>
    </td>
    
    <td>
      ∅
    </td>
    
    <td>
      ∅
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        checks.report
      </code>
    </td>
    
    <td>
      ✅
    </td>
    
    <td>
      ❌
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        checks.rerun
      </code>
    </td>
    
    <td>
      ∅
    </td>
    
    <td>
      ∅
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        ci.runs
      </code>
    </td>
    
    <td>
      ∅
    </td>
    
    <td>
      ∅
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        ci.getRun
      </code>
    </td>
    
    <td>
      ∅
    </td>
    
    <td>
      ∅
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        ci.jobs
      </code>
    </td>
    
    <td>
      ∅
    </td>
    
    <td>
      ∅
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        ci.getJob
      </code>
    </td>
    
    <td>
      ∅
    </td>
    
    <td>
      ∅
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        ci.log
      </code>
    </td>
    
    <td>
      ∅
    </td>
    
    <td>
      ∅
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        ci.rerunFailed
      </code>
    </td>
    
    <td>
      ∅
    </td>
    
    <td>
      ∅
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        contents.getFile
      </code>
    </td>
    
    <td>
      ✅
    </td>
    
    <td>
      ✅
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        contents.tree
      </code>
    </td>
    
    <td>
      ❌
    </td>
    
    <td>
      ❌
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        contents.branches
      </code>
    </td>
    
    <td>
      ✅
    </td>
    
    <td>
      ✅
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        contents.tags
      </code>
    </td>
    
    <td>
      ✅
    </td>
    
    <td>
      ✅
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        contents.resolveRef
      </code>
    </td>
    
    <td>
      ✅
    </td>
    
    <td>
      ✅
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        contents.compare
      </code>
    </td>
    
    <td>
      ❌
    </td>
    
    <td>
      ❌
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        contents.commitFiles
      </code>
    </td>
    
    <td>
      ❌
    </td>
    
    <td>
      ❌
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        commits.list
      </code>
    </td>
    
    <td>
      ✅
    </td>
    
    <td>
      ✅
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        commits.get
      </code>
    </td>
    
    <td>
      ✅
    </td>
    
    <td>
      ✅
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        commits.comments
      </code>
    </td>
    
    <td>
      ❌
    </td>
    
    <td>
      ❌
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        commits.getComment
      </code>
    </td>
    
    <td>
      ❌
    </td>
    
    <td>
      ❌
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        commits.createComment
      </code>
    </td>
    
    <td>
      ❌
    </td>
    
    <td>
      ❌
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        commits.updateComment
      </code>
    </td>
    
    <td>
      ❌
    </td>
    
    <td>
      ❌
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        commits.deleteComment
      </code>
    </td>
    
    <td>
      ❌
    </td>
    
    <td>
      ❌
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        commits.hideComment
      </code>
    </td>
    
    <td>
      ∅
    </td>
    
    <td>
      ∅
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        releases.list
      </code>
    </td>
    
    <td>
      ✅
    </td>
    
    <td>
      ✅
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        releases.get
      </code>
    </td>
    
    <td>
      ✅
    </td>
    
    <td>
      ✅
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        releases.latest
      </code>
    </td>
    
    <td>
      ✅
    </td>
    
    <td>
      ✅
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        releases.getByTag
      </code>
    </td>
    
    <td>
      ✅
    </td>
    
    <td>
      ✅
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        releases.downloadAsset
      </code>
    </td>
    
    <td>
      ❌
    </td>
    
    <td>
      ❌
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        releases.create
      </code>
    </td>
    
    <td>
      ❌
    </td>
    
    <td>
      ❌
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        releases.update
      </code>
    </td>
    
    <td>
      ❌
    </td>
    
    <td>
      ❌
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        webhooks.ingest
      </code>
    </td>
    
    <td>
      ✅
    </td>
    
    <td>
      ✅
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        webhooks.list
      </code>
    </td>
    
    <td>
      ✅
    </td>
    
    <td>
      ❌
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        webhooks.create
      </code>
    </td>
    
    <td>
      ✅
    </td>
    
    <td>
      ❌
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        webhooks.update
      </code>
    </td>
    
    <td>
      ❌
    </td>
    
    <td>
      ❌
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        webhooks.delete
      </code>
    </td>
    
    <td>
      ✅
    </td>
    
    <td>
      ❌
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        webhooks.rotateSecret
      </code>
    </td>
    
    <td>
      ❌
    </td>
    
    <td>
      ❌
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        webhooks.deliveries
      </code>
    </td>
    
    <td>
      ❌
    </td>
    
    <td>
      ❌
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        webhooks.redeliver
      </code>
    </td>
    
    <td>
      ❌
    </td>
    
    <td>
      ❌
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        search.threads
      </code>
    </td>
    
    <td>
      ❌
    </td>
    
    <td>
      ❌
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        search.repos
      </code>
    </td>
    
    <td>
      ❌
    </td>
    
    <td>
      ❌
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        search.commits
      </code>
    </td>
    
    <td>
      ❌
    </td>
    
    <td>
      ❌
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        search.code
      </code>
    </td>
    
    <td>
      ❌
    </td>
    
    <td>
      ❌
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        securityAlerts.list
      </code>
    </td>
    
    <td>
      ∅
    </td>
    
    <td>
      ∅
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        eventKinds
      </code>
    </td>
    
    <td>
      native
    </td>
    
    <td>
      native
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        authKinds
      </code>
    </td>
    
    <td>
      <code>
        token
      </code>
      
      , <code>
        anonymous
      </code>
    </td>
    
    <td>
      <code>
        token
      </code>
      
      , <code>
        anonymous
      </code>
    </td>
  </tr>
  
  <tr>
    <td>
      <code>
        limits
      </code>
    </td>
    
    <td>
      body 65536, comment 65536, label 50
    </td>
    
    <td>
      body 65536, comment 65536, label 50
    </td>
  </tr>
</tbody>
</table>
</provider-capabilities>


## Sitemap

See the full [sitemap](https://forges.link/sitemap.md) for all pages.
