REST API endpoints for self-hosted runners

Use the REST API to interact with self-hosted runners in GitHub Actions.

About self-hosted runners in GitHub Actions

You can use the REST API to register, view, and delete self-hosted runners in GitHub Actions. Self-hosted runners allow you to host your own runners and customize the environment used to run jobs in your GitHub Actions workflows. For more information, see Managing self-hosted runners.

Note

Most endpoints use Authorization: Bearer <YOUR-TOKEN> and Accept: application/vnd.github+json headers, plus X-GitHub-Api-Version: 2026-03-10. Curl examples below omit these standard headers for brevity.

List self-hosted runners for an organization

GET /orgs/{org}/actions/runners

Lists all self-hosted runners configured in an organization.
Authenticated users must have admin access to the organization to use this endpoint.
OAuth app tokens and personal access tokens (classic) need the admin:org scope to use this endpoint. If the repository is private, the repo scope is also required.

Parameters

Headers

Path and query parameters

HTTP response status codes

Code examples

Example

Request:

curl -L \
  -X GET \
  https://api.github.com/orgs/ORG/actions/runners

Response schema (Status: 200):

Get runner version end-of-life schedule for an organization

GET /orgs/{org}/actions/runners/deprecations/{version}

Gets the end-of-life schedule for a specific runner version in an organization. Returns the runner version
and the dates when registration and runtime support will end.
Authenticated users must have admin access to the organization to use this endpoint.
OAuth app tokens and personal access tokens (classic) need the admin:org scope to use this endpoint.

Parameters

Headers

Path and query parameters

HTTP response status codes

Code examples

Example

Request:

curl -L \
  -X GET \
  https://api.github.com/orgs/ORG/actions/runners/deprecations/VERSION

Response schema (Status: 200):

List runner applications for an organization

GET /orgs/{org}/actions/runners/downloads

Lists binaries for the runner application that you can download and run.
Authenticated users must have admin access to the organization to use this endpoint.
OAuth app tokens and personal access tokens (classic) need the admin:org scope to use this endpoint. If the repository is private, the repo scope is also required.

Parameters

Headers

Path and query parameters

HTTP response status codes

Code examples

Example

Request:

curl -L \
  -X GET \
  https://api.github.com/orgs/ORG/actions/runners/downloads

Response schema (Status: 200):

Array of Runner Application:

Create configuration for a just-in-time runner for an organization

POST /orgs/{org}/actions/runners/generate-jitconfig

Generates a configuration that can be passed to the runner application at startup.
The authenticated user must have admin access to the organization.
OAuth tokens and personal access tokens (classic) need theadmin:org scope to use this endpoint. If the repository is private, OAuth tokens and personal access tokens (classic) need the repo scope to use this endpoint.

Parameters

Headers

Path and query parameters

Body parameters

HTTP response status codes

Code examples

Example

Request:

curl -L \
  -X POST \
  https://api.github.com/orgs/ORG/actions/runners/generate-jitconfig \
  -d '{
  "name": "New runner",
  "runner_group_id": 1,
  "labels": [
    "self-hosted",
    "X64",
    "macOS",
    "no-gpu"
  ],
  "work_folder": "_work"
}'

Response schema (Status: 201):

Create a registration token for an organization

POST /orgs/{org}/actions/runners/registration-token

Returns a token that you can pass to the config script. The token expires after one hour.
For example, you can replace TOKEN in the following example with the registration token provided by this endpoint to configure your self-hosted runner:
./config.sh --url https://github.com/octo-org --token TOKEN

Authenticated users must have admin access to the organization to use this endpoint.
OAuth tokens and personal access tokens (classic) need theadmin:org scope to use this endpoint. If the repository is private, OAuth tokens and personal access tokens (classic) need the repo scope to use this endpoint.

Parameters

Headers

Path and query parameters

HTTP response status codes

Code examples

Example

Request:

curl -L \
  -X POST \
  https://api.github.com/orgs/ORG/actions/runners/registration-token

Response schema (Status: 201):

Create a remove token for an organization

POST /orgs/{org}/actions/runners/remove-token

Returns a token that you can pass to the config script to remove a self-hosted runner from an organization. The token expires after one hour.
For example, you can replace TOKEN in the following example with the registration token provided by this endpoint to remove your self-hosted runner from an organization:
./config.sh remove --token TOKEN

Authenticated users must have admin access to the organization to use this endpoint.
OAuth tokens and personal access tokens (classic) need theadmin:org scope to use this endpoint. If the repository is private, OAuth tokens and personal access tokens (classic) need the repo scope to use this endpoint.

Parameters

Headers

Path and query parameters

HTTP response status codes

Code examples

Example

Request:

curl -L \
  -X POST \
  https://api.github.com/orgs/ORG/actions/runners/remove-token

Response schema (Status: 201):

Same response schema as Create a registration token for an organization.

Get a self-hosted runner for an organization

GET /orgs/{org}/actions/runners/{runner_id}

Gets a specific self-hosted runner configured in an organization.
Authenticated users must have admin access to the organization to use this endpoint.
OAuth app tokens and personal access tokens (classic) need the admin:org scope to use this endpoint. If the repository is private, the repo scope is also required.

Parameters

Headers

Path and query parameters

HTTP response status codes

Code examples

Example

Request:

curl -L \
  -X GET \
  https://api.github.com/orgs/ORG/actions/runners/RUNNER_ID

Response schema (Status: 200):

Delete a self-hosted runner from an organization

DELETE /orgs/{org}/actions/runners/{runner_id}

Forces the removal of a self-hosted runner from an organization. You can use this endpoint to completely remove the runner when the machine you were using no longer exists.
Authenticated users must have admin access to the organization to use this endpoint.
OAuth tokens and personal access tokens (classic) need theadmin:org scope to use this endpoint. If the repository is private, OAuth tokens and personal access tokens (classic) need the repo scope to use this endpoint.

Parameters

Headers

Path and query parameters

HTTP response status codes

Code examples

Example

Request:

curl -L \
  -X DELETE \
  https://api.github.com/orgs/ORG/actions/runners/RUNNER_ID

Response schema (Status: 204):

List labels for a self-hosted runner for an organization

GET /orgs/{org}/actions/runners/{runner_id}/labels

Lists all labels for a self-hosted runner configured in an organization.
Authenticated users must have admin access to the organization to use this endpoint.
OAuth app tokens and personal access tokens (classic) need the admin:org scope to use this endpoint. If the repository is private, the repo scope is also required.

Parameters

Headers

Path and query parameters

HTTP response status codes

Code examples

Example

Request:

curl -L \
  -X GET \
  https://api.github.com/orgs/ORG/actions/runners/RUNNER_ID/labels

Response schema (Status: 200):

Add custom labels to a self-hosted runner for an organization

POST /orgs/{org}/actions/runners/{runner_id}/labels

Adds custom labels to a self-hosted runner configured in an organization.
Authenticated users must have admin access to the organization to use this endpoint.
OAuth tokens and personal access tokens (classic) need the admin:org scope to use this endpoint.

Parameters

Headers

Path and query parameters

Body parameters

HTTP response status codes

Code examples

Example

Request:

curl -L \
  -X POST \
  https://api.github.com/orgs/ORG/actions/runners/RUNNER_ID/labels \
  -d '{
  "labels": [
    "gpu",
    "accelerated"
  ]
}'

Response schema (Status: 200):

Same response schema as List labels for a self-hosted runner for an organization.

Set custom labels for a self-hosted runner for an organization

PUT /orgs/{org}/actions/runners/{runner_id}/labels

Remove all previous custom labels and set the new custom labels for a specific
self-hosted runner configured in an organization.
Authenticated users must have admin access to the organization to use this endpoint.
OAuth app tokens and personal access tokens (classic) need the admin:org scope to use this endpoint. If the repository is private, the repo scope is also required.

Parameters

Headers

Path and query parameters

Body parameters

HTTP response status codes

Code examples

Example

Request:

curl -L \
  -X PUT \
  https://api.github.com/orgs/ORG/actions/runners/RUNNER_ID/labels \
  -d '{
  "labels": [
    "gpu",
    "accelerated"
  ]
}'

Response schema (Status: 200):

Same response schema as List labels for a self-hosted runner for an organization.

Remove all custom labels from a self-hosted runner for an organization

DELETE /orgs/{org}/actions/runners/{runner_id}/labels

Remove all custom labels from a self-hosted runner configured in an
organization. Returns the remaining read-only labels from the runner.
Authenticated users must have admin access to the organization to use this endpoint.
OAuth app tokens and personal access tokens (classic) need the admin:org scope to use this endpoint. If the repository is private, the repo scope is also required.

Parameters

Headers

Path and query parameters

HTTP response status codes

Code examples

Example

Request:

curl -L \
  -X DELETE \
  https://api.github.com/orgs/ORG/actions/runners/RUNNER_ID/labels

Response schema (Status: 200):

Same response schema as List labels for a self-hosted runner for an organization.

Remove a custom label from a self-hosted runner for an organization

DELETE /orgs/{org}/actions/runners/{runner_id}/labels/{name}

Remove a custom label from a self-hosted runner configured
in an organization. Returns the remaining labels from the runner.
This endpoint returns a 404 Not Found status if the custom label is not
present on the runner.
Authenticated users must have admin access to the organization to use this endpoint.
OAuth app tokens and personal access tokens (classic) need the admin:org scope to use this endpoint. If the repository is private, the repo scope is also required.

Parameters

Headers

Path and query parameters

HTTP response status codes

Code examples

Example

Request:

curl -L \
  -X DELETE \
  https://api.github.com/orgs/ORG/actions/runners/RUNNER_ID/labels/NAME

Response schema (Status: 200):

Same response schema as List labels for a self-hosted runner for an organization.

List self-hosted runners for a repository

GET /repos/{owner}/{repo}/actions/runners

Lists all self-hosted runners configured in a repository.
Authenticated users must have admin access to the repository to use this endpoint.
OAuth app tokens and personal access tokens (classic) need the repo scope to use this endpoint.

Parameters

Headers

Path and query parameters

HTTP response status codes

Code examples

Example

Request:

curl -L \
  -X GET \
  https://api.github.com/repos/OWNER/REPO/actions/runners

Response schema (Status: 200):

Same response schema as List self-hosted runners for an organization.

Get runner version end-of-life schedule for a repository

GET /repos/{owner}/{repo}/actions/runners/deprecations/{version}

Gets the end-of-life schedule for a specific runner version in a repository. Returns the runner version
and the dates when registration and runtime support will end.
Authenticated users must have admin access to the repository to use this endpoint.
OAuth app tokens and personal access tokens (classic) need the repo scope to use this endpoint.

Parameters

Headers

Path and query parameters

HTTP response status codes

Code examples

Example

Request:

curl -L \
  -X GET \
  https://api.github.com/repos/OWNER/REPO/actions/runners/deprecations/VERSION

Response schema (Status: 200):

Same response schema as Get runner version end-of-life schedule for an organization.

List runner applications for a repository

GET /repos/{owner}/{repo}/actions/runners/downloads

Lists binaries for the runner application that you can download and run.
Authenticated users must have admin access to the repository to use this endpoint.
OAuth app tokens and personal access tokens (classic) need the repo scope to use this endpoint.

Parameters

Headers

Path and query parameters

HTTP response status codes

Code examples

Example

Request:

curl -L \
  -X GET \
  https://api.github.com/repos/OWNER/REPO/actions/runners/downloads

Response schema (Status: 200):

Same response schema as List runner applications for an organization.

Create configuration for a just-in-time runner for a repository

POST /repos/{owner}/{repo}/actions/runners/generate-jitconfig

Generates a configuration that can be passed to the runner application at startup.
The authenticated user must have admin access to the repository.
OAuth tokens and personal access tokens (classic) need therepo scope to use this endpoint.

Parameters

Headers

Path and query parameters

Body parameters

HTTP response status codes

Code examples

Example

Request:

curl -L \
  -X POST \
  https://api.github.com/repos/OWNER/REPO/actions/runners/generate-jitconfig \
  -d '{
  "name": "New runner",
  "runner_group_id": 1,
  "labels": [
    "self-hosted",
    "X64",
    "macOS",
    "no-gpu"
  ],
  "work_folder": "_work"
}'

Response schema (Status: 201):

Same response schema as Create configuration for a just-in-time runner for an organization.

Create a registration token for a repository

POST /repos/{owner}/{repo}/actions/runners/registration-token

Returns a token that you can pass to the config script. The token expires after one hour.
For example, you can replace TOKEN in the following example with the registration token provided by this endpoint to configure your self-hosted runner:
./config.sh --url https://github.com/octo-org --token TOKEN

Authenticated users must have admin access to the repository to use this endpoint.
OAuth tokens and personal access tokens (classic) need the repo scope to use this endpoint.

Parameters

Headers

Path and query parameters

HTTP response status codes

Code examples

Example

Request:

curl -L \
  -X POST \
  https://api.github.com/repos/OWNER/REPO/actions/runners/registration-token

Response schema (Status: 201):

Same response schema as Create a registration token for an organization.

Create a remove token for a repository

POST /repos/{owner}/{repo}/actions/runners/remove-token

Returns a token that you can pass to the config script to remove a self-hosted runner from an repository. The token expires after one hour.
For example, you can replace TOKEN in the following example with the registration token provided by this endpoint to remove your self-hosted runner from an organization:
./config.sh remove --token TOKEN

Authenticated users must have admin access to the repository to use this endpoint.
OAuth tokens and personal access tokens (classic) need the repo scope to use this endpoint.

Parameters

Headers

Path and query parameters

HTTP response status codes

Code examples

Example

Request:

curl -L \
  -X POST \
  https://api.github.com/repos/OWNER/REPO/actions/runners/remove-token

Response schema (Status: 201):

Same response schema as Create a registration token for an organization.

Get a self-hosted runner for a repository

GET /repos/{owner}/{repo}/actions/runners/{runner_id}

Gets a specific self-hosted runner configured in a repository.
Authenticated users must have admin access to the repository to use this endpoint.
OAuth app tokens and personal access tokens (classic) need the repo scope to use this endpoint.

Parameters

Headers

Path and query parameters

HTTP response status codes

Code examples

Example

Request:

curl -L \
  -X GET \
  https://api.github.com/repos/OWNER/REPO/actions/runners/RUNNER_ID

Response schema (Status: 200):

Same response schema as Get a self-hosted runner for an organization.

Delete a self-hosted runner from a repository

DELETE /repos/{owner}/{repo}/actions/runners/{runner_id}

Forces the removal of a self-hosted runner from a repository. You can use this endpoint to completely remove the runner when the machine you were using no longer exists.
Authenticated users must have admin access to the repository to use this endpoint.
OAuth tokens and personal access tokens (classic) need the repo scope to use this endpoint.

Parameters

Headers

Path and query parameters

HTTP response status codes

Code examples

Example

Request:

curl -L \
  -X DELETE \
  https://api.github.com/repos/OWNER/REPO/actions/runners/RUNNER_ID

Response schema (Status: 204):

List labels for a self-hosted runner for a repository

GET /repos/{owner}/{repo}/actions/runners/{runner_id}/labels

Lists all labels for a self-hosted runner configured in a repository.
Authenticated users must have admin access to the repository to use this endpoint.
OAuth app tokens and personal access tokens (classic) need the repo scope to use this endpoint.

Parameters

Headers

Path and query parameters

HTTP response status codes

Code examples

Example

Request:

curl -L \
  -X GET \
  https://api.github.com/repos/OWNER/REPO/actions/runners/RUNNER_ID/labels

Response schema (Status: 200):

Same response schema as List labels for a self-hosted runner for an organization.

Add custom labels to a self-hosted runner for a repository

POST /repos/{owner}/{repo}/actions/runners/{runner_id}/labels

Adds custom labels to a self-hosted runner configured in a repository.
Authenticated users must have admin access to the organization to use this endpoint.
OAuth tokens and personal access tokens (classic) need the repo scope to use this endpoint.

Parameters

Headers

Path and query parameters

Body parameters

HTTP response status codes

Code examples

Example

Request:

curl -L \
  -X POST \
  https://api.github.com/repos/OWNER/REPO/actions/runners/RUNNER_ID/labels \
  -d '{
  "labels": [
    "gpu",
    "accelerated"
  ]
}'

Response schema (Status: 200):

Same response schema as List labels for a self-hosted runner for an organization.

Set custom labels for a self-hosted runner for a repository

PUT /repos/{owner}/{repo}/actions/runners/{runner_id}/labels

Remove all previous custom labels and set the new custom labels for a specific
self-hosted runner configured in a repository.
Authenticated users must have admin access to the repository to use this endpoint.
OAuth app tokens and personal access tokens (classic) need the repo scope to use this endpoint.

Parameters

Headers

Path and query parameters

Body parameters

HTTP response status codes

Code examples

Example

Request:

curl -L \
  -X PUT \
  https://api.github.com/repos/OWNER/REPO/actions/runners/RUNNER_ID/labels \
  -d '{
  "labels": [
    "gpu",
    "accelerated"
  ]
}'

Response schema (Status: 200):

Same response schema as List labels for a self-hosted runner for an organization.

Remove all custom labels from a self-hosted runner for a repository

DELETE /repos/{owner}/{repo}/actions/runners/{runner_id}/labels

Remove all custom labels from a self-hosted runner configured in a
repository. Returns the remaining read-only labels from the runner.
Authenticated users must have admin access to the repository to use this endpoint.
OAuth app tokens and personal access tokens (classic) need the repo scope to use this endpoint.

Parameters

Headers

Path and query parameters

HTTP response status codes

Code examples

Example

Request:

curl -L \
  -X DELETE \
  https://api.github.com/repos/OWNER/REPO/actions/runners/RUNNER_ID/labels

Response schema (Status: 200):

Same response schema as List labels for a self-hosted runner for an organization.

Remove a custom label from a self-hosted runner for a repository

DELETE /repos/{owner}/{repo}/actions/runners/{runner_id}/labels/{name}

Remove a custom label from a self-hosted runner configured
in a repository. Returns the remaining labels from the runner.
This endpoint returns a 404 Not Found status if the custom label is not
present on the runner.
Authenticated users must have admin access to the repository to use this endpoint.
OAuth app tokens and personal access tokens (classic) need the repo scope to use this endpoint.

Parameters

Headers

Path and query parameters

HTTP response status codes

Code examples

Example

Request:

curl -L \
  -X DELETE \
  https://api.github.com/repos/OWNER/REPO/actions/runners/RUNNER_ID/labels/NAME

Response schema (Status: 200):

Same response schema as List labels for a self-hosted runner for an organization.