Use the REST API to interact with self-hosted runner groups for GitHub Actions.
You can use the REST API to manage groups of self-hosted runners in GitHub Actions. For more information, see Managing access to self-hosted runners using groups.
These endpoints are available for authenticated users, OAuth apps, and GitHub Apps. Access tokens require repo scope for private repositories and public_repo scope for public repositories. GitHub Apps must have the administration permission for repositories or the organization_self_hosted_runners permission for organizations. Authenticated users must have admin access to repositories or organizations, or the manage_runners:enterprise scope for enterprises to use these endpoints.
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.
GET /orgs/{org}/actions/runner-groups
Lists all self-hosted runner groups configured in an organization and inherited from an enterprise.
OAuth app tokens and personal access tokens (classic) need the admin:org scope to use this endpoint.
accept (string)application/vnd.github+json is recommended.org (string) (required)
The organization name. The name is not case sensitive.
per_page (integer)
The number of results per page (max 100). For more information, see "Using pagination in the REST API."
Default: 30
page (integer)
The page number of the results to fetch. For more information, see "Using pagination in the REST API."
Default: 1
visible_to_repository (string)
Only return runner groups that are allowed to be used by this repository.
Request:
curl -L \
-X GET \
https://api.github.com/orgs/ORG/actions/runner-groups
Response schema (Status: 200):
total_count: required, numberrunner_groups: required, array of objects:
id: required, numbername: required, stringvisibility: required, stringdefault: required, booleanselected_repositories_url: stringrunners_url: required, stringhosted_runners_url: stringnetwork_configuration_id: stringinherited: required, booleaninherited_allows_public_repositories: booleanallows_public_repositories: required, booleanworkflow_restrictions_read_only: boolean, default: falserestricted_to_workflows: boolean, default: falseselected_workflows: array of stringPOST /orgs/{org}/actions/runner-groups
Creates a new self-hosted runner group for an organization.
OAuth tokens and personal access tokens (classic) need the admin:org scope to use this endpoint.
accept (string)application/vnd.github+json is recommended.org (string) (required)name (string) (required)
Name of the runner group.
visibility (string)
Visibility of a runner group. You can select all repositories, select individual repositories, or limit access to private repositories.
Default: all
Can be one of: selected, all, private
selected_repository_ids (array of integers)
List of repository IDs that can access the runner group.
runners (array of integers)
List of runner IDs to add to the runner group.
allows_public_repositories (boolean)
Whether the runner group can be used by public repositories.
Default: false
restricted_to_workflows (boolean)
If true, the runner group will be restricted to running only the workflows specified in the selected_workflows array.
Default: false
selected_workflows (array of strings)
List of workflows the runner group should be allowed to run. This setting will be ignored unless restricted_to_workflows is set to true.
network_configuration_id (string)
The identifier of a hosted compute network configuration.
Request:
curl -L \
-X POST \
https://api.github.com/orgs/ORG/actions/runner-groups \
-d '{
"name": "Expensive hardware runners",
"visibility": "selected",
"selected_repository_ids": [
32,
91
],
"runners": [
9,
2
]
}'
Response schema (Status: 201):
id: required, numbername: required, stringvisibility: required, stringdefault: required, booleanselected_repositories_url: stringrunners_url: required, stringhosted_runners_url: stringnetwork_configuration_id: stringinherited: required, booleaninherited_allows_public_repositories: booleanallows_public_repositories: required, booleanworkflow_restrictions_read_only: boolean, default: falserestricted_to_workflows: boolean, default: falseselected_workflows: array of stringGET /orgs/{org}/actions/runner-groups/{runner_group_id}
Gets a specific self-hosted runner group for an organization.
OAuth app tokens and personal access tokens (classic) need the admin:org scope to use this endpoint.
accept (string)application/vnd.github+json is recommended.org (string) (required)
The organization name. The name is not case sensitive.
runner_group_id (integer) (required)
Unique identifier of the self-hosted runner group.
Request:
curl -L \
-X GET \
https://api.github.com/orgs/ORG/actions/runner-groups/RUNNER_GROUP_ID
Response schema (Status: 200):
Same response schema as Create a self-hosted runner group for an organization.
PATCH /orgs/{org}/actions/runner-groups/{runner_group_id}
Updates the name and visibility of a self-hosted runner group in an organization.
OAuth app tokens and personal access tokens (classic) need the admin:org scope to use this endpoint.
accept (string)application/vnd.github+json is recommended.org (string) (required)
The organization name. The name is not case sensitive.
runner_group_id (integer) (required)
Unique identifier of the self-hosted runner group.
name (string) (required)
Name of the runner group.
visibility (string)
Visibility of a runner group. You can select all repositories, select individual repositories, or all private repositories.
Can be one of: selected, all, private
allows_public_repositories (boolean)
Whether the runner group can be used by public repositories.
Default: false
restricted_to_workflows (boolean)
If true, the runner group will be restricted to running only the workflows specified in the selected_workflows array.
Default: false
selected_workflows (array of strings)
List of workflows the runner group should be allowed to run. This setting will be ignored unless restricted_to_workflows is set to true.
network_configuration_id (string or null)
The identifier of a hosted compute network configuration.
Request:
curl -L \
-X PATCH \
https://api.github.com/orgs/ORG/actions/runner-groups/RUNNER_GROUP_ID \
-d '{
"name": "Expensive hardware runners",
"visibility": "selected"
}'
Response schema (Status: 200):
Same response schema as Create a self-hosted runner group for an organization.
DELETE /orgs/{org}/actions/runner-groups/{runner_group_id}
Deletes a self-hosted runner group for an organization.
OAuth tokens and personal access tokens (classic) need the admin:org scope to use this endpoint.
accept (string)application/vnd.github+json is recommended.org (string) (required)
The organization name. The name is not case sensitive.
runner_group_id (integer) (required)
Unique identifier of the self-hosted runner group.
Request:
curl -L \
-X DELETE \
https://api.github.com/orgs/ORG/actions/runner-groups/RUNNER_GROUP_ID
Response schema (Status: 204):
GET /orgs/{org}/actions/runner-groups/{runner_group_id}/hosted-runners
Lists the GitHub-hosted runners in an organization group.
OAuth app tokens and personal access tokens (classic) need the admin:org scope to use this endpoint.
accept (string)application/vnd.github+json is recommended.org (string) (required)
The organization name. The name is not case sensitive.
runner_group_id (integer) (required)
Unique identifier of the self-hosted runner group.
per_page (integer)
The number of results per page (max 100). For more information, see "Using pagination in the REST API."
Default: 30
page (integer)
The page number of the results to fetch. For more information, see "Using pagination in the REST API."
Default: 1
Request:
curl -L \
-X GET \
https://api.github.com/orgs/ORG/actions/runner-groups/RUNNER_GROUP_ID/hosted-runners
Response schema (Status: 200):
total_count: required, numberrunners: required, array of GitHub-hosted hosted runner:
id: required, integername: required, stringrunner_group_id: integerimage_details: required, any of:
id: required, stringsize_gb: required, integerdisplay_name: required, stringsource: required, string, enum: github, partner, customversion: stringmachine_size_details: required, Github-owned VM details.:
id: required, stringcpu_cores: required, integermemory_gb: required, integerstorage_gb: required, integerstatus: required, string, enum: Ready, Provisioning, Shutdown, Deleting, Stuckplatform: required, stringmaximum_runners: integer, default: 10public_ip_enabled: required, booleanpublic_ips: array of Public IP for a GitHub-hosted larger runners.:
enabled: booleanprefix: stringlength: integerlast_active_on: string or null, format: date-timeimage_gen: booleanGET /orgs/{org}/actions/runner-groups/{runner_group_id}/repositories
Lists the repositories with access to a self-hosted runner group configured in an organization.
OAuth app tokens and personal access tokens (classic) need the admin:org scope to use this endpoint.
accept (string)application/vnd.github+json is recommended.org (string) (required)
The organization name. The name is not case sensitive.
runner_group_id (integer) (required)
Unique identifier of the self-hosted runner group.
page (integer)
The page number of the results to fetch. For more information, see "Using pagination in the REST API."
Default: 1
per_page (integer)
The number of results per page (max 100). For more information, see "Using pagination in the REST API."
Default: 30
Request:
curl -L \
-X GET \
https://api.github.com/orgs/ORG/actions/runner-groups/RUNNER_GROUP_ID/repositories
Response schema (Status: 200):
total_count: required, numberrepositories: required, array of Minimal Repository:
id: required, integer, format: int64node_id: required, stringname: required, stringfull_name: required, stringowner: required, Simple User:
name: string or nullemail: string or nulllogin: required, stringid: required, integer, format: int64node_id: required, stringavatar_url: required, string, format: urigravatar_id: required, string or nullurl: required, string, format: urihtml_url: required, string, format: urifollowers_url: required, string, format: urifollowing_url: required, stringgists_url: required, stringstarred_url: required, stringsubscriptions_url: required, string, format: uriorganizations_url: required, string, format: urirepos_url: required, string, format: urievents_url: required, stringreceived_events_url: required, string, format: uritype: required, stringsite_admin: required, booleanstarred_at: stringuser_view_type: stringprivate: required, booleanhtml_url: required, string, format: uridescription: required, string or nullfork: required, booleanurl: required, string, format: uriarchive_url: required, stringassignees_url: required, stringblobs_url: required, stringbranches_url: required, stringcollaborators_url: required, stringcomments_url: required, stringcommits_url: required, stringcompare_url: required, stringcontents_url: required, stringcontributors_url: required, string, format: urideployments_url: required, string, format: uridownloads_url: required, string, format: urievents_url: required, string, format: uriforks_url: required, string, format: urigit_commits_url: required, stringgit_refs_url: required, stringgit_tags_url: required, stringgit_url: stringissue_comment_url: required, stringissue_events_url: required, stringissues_url: required, stringkeys_url: required, stringlabels_url: required, stringlanguages_url: required, string, format: urimerges_url: required, string, format: urimilestones_url: required, stringnotifications_url: required, stringpulls_url: required, stringreleases_url: required, stringssh_url: stringstargazers_url: required, string, format: uristatuses_url: required, stringsubscribers_url: required, string, format: urisubscription_url: required, string, format: uritags_url: required, string, format: uriteams_url: required, string, format: uritrees_url: required, stringclone_url: stringmirror_url: string or nullhooks_url: required, string, format: urisvn_url: stringhomepage: string or nulllanguage: string or nullforks_count: integerstargazers_count: integerwatchers_count: integersize: integerdefault_branch: stringopen_issues_count: integeris_template: booleantopics: array of stringhas_issues: booleanhas_projects: booleanhas_wiki: booleanhas_pages: booleanhas_discussions: booleanhas_pull_requests: booleanpull_request_creation_policy: string, enum: all, collaborators_onlyarchived: booleandisabled: booleanvisibility: stringpushed_at: string or null, format: date-timecreated_at: string or null, format: date-timeupdated_at: string or null, format: date-timepermissions: object:
admin: booleanmaintain: booleanpush: booleantriage: booleanpull: booleanrole_name: stringtemp_clone_token: stringdelete_branch_on_merge: booleansubscribers_count: integernetwork_count: integercode_of_conduct: Code Of Conduct:
key: required, stringname: required, stringurl: required, string, format: uribody: stringhtml_url: required, string or null, format: urilicense: object or null:
key: stringname: stringspdx_id: stringurl: string or nullnode_id: stringforks: integeropen_issues: integerwatchers: integerallow_forking: booleanweb_commit_signoff_required: booleansecurity_and_analysis: object or null:
advanced_security: object:
status: string, enum: enabled, disabledcode_security: object:
status: string, enum: enabled, disableddependabot_security_updates: object:
status: string, enum: enabled, disabledsecret_scanning: object:
status: string, enum: enabled, disabledsecret_scanning_push_protection: object:
status: string, enum: enabled, disabledsecret_scanning_non_provider_patterns: object:
status: string, enum: enabled, disabledsecret_scanning_ai_detection: object:
status: string, enum: enabled, disabledsecret_scanning_delegated_alert_dismissal: object:
status: string, enum: enabled, disabledsecret_scanning_delegated_bypass: object:
status: string, enum: enabled, disabledsecret_scanning_delegated_bypass_options: object:
reviewers: array of objects:
reviewer_id: required, integerreviewer_type: required, string, enum: TEAM, ROLEmode: string, enum: ALWAYS, EXEMPT, default: "ALWAYS"custom_properties: object, additional properties allowedPUT /orgs/{org}/actions/runner-groups/{runner_group_id}/repositories
Replaces the list of repositories that have access to a self-hosted runner group configured in an organization.
OAuth app tokens and personal access tokens (classic) need the admin:org scope to use this endpoint.
accept (string)application/vnd.github+json is recommended.org (string) (required)
The organization name. The name is not case sensitive.
runner_group_id (integer) (required)
Unique identifier of the self-hosted runner group.
selected_repository_ids (array of integers) (required)Request:
curl -L \
-X PUT \
https://api.github.com/orgs/ORG/actions/runner-groups/RUNNER_GROUP_ID/repositories \
-d '{
"selected_repository_ids": [
32,
91
]
}'
Response schema (Status: 204):
PUT /orgs/{org}/actions/runner-groups/{runner_group_id}/repositories/{repository_id}
Adds a repository to the list of repositories that can access a self-hosted runner group. The runner group must have visibility set to selected. For more information, see "Create a self-hosted runner group for an organization."
OAuth tokens and personal access tokens (classic) need the admin:org scope to use this endpoint.
accept (string)application/vnd.github+json is recommended.org (string) (required)
The organization name. The name is not case sensitive.
runner_group_id (integer) (required)
Unique identifier of the self-hosted runner group.
repository_id (integer) (required)
The unique identifier of the repository.
Request:
curl -L \
-X PUT \
https://api.github.com/orgs/ORG/actions/runner-groups/RUNNER_GROUP_ID/repositories/REPOSITORY_ID
Response schema (Status: 204):
DELETE /orgs/{org}/actions/runner-groups/{runner_group_id}/repositories/{repository_id}
Removes a repository from the list of selected repositories that can access a self-hosted runner group. The runner group must have visibility set to selected. For more information, see "Create a self-hosted runner group for an organization."
OAuth app tokens and personal access tokens (classic) need the admin:org scope to use this endpoint.
accept (string)application/vnd.github+json is recommended.org (string) (required)
The organization name. The name is not case sensitive.
runner_group_id (integer) (required)
Unique identifier of the self-hosted runner group.
repository_id (integer) (required)
The unique identifier of the repository.
Request:
curl -L \
-X DELETE \
https://api.github.com/orgs/ORG/actions/runner-groups/RUNNER_GROUP_ID/repositories/REPOSITORY_ID
Response schema (Status: 204):
GET /orgs/{org}/actions/runner-groups/{runner_group_id}/runners
Lists self-hosted runners that are in a specific organization group.
OAuth app tokens and personal access tokens (classic) need the admin:org scope to use this endpoint.
accept (string)application/vnd.github+json is recommended.org (string) (required)
The organization name. The name is not case sensitive.
runner_group_id (integer) (required)
Unique identifier of the self-hosted runner group.
per_page (integer)
The number of results per page (max 100). For more information, see "Using pagination in the REST API."
Default: 30
page (integer)
The page number of the results to fetch. For more information, see "Using pagination in the REST API."
Default: 1
Request:
curl -L \
-X GET \
https://api.github.com/orgs/ORG/actions/runner-groups/RUNNER_GROUP_ID/runners
Response schema (Status: 200):
total_count: required, numberrunners: required, array of Self hosted runners:
id: required, integerrunner_group_id: integername: required, stringos: required, stringstatus: required, stringbusy: required, booleanlabels: required, array of Self hosted runner label:
id: integername: required, stringtype: string, enum: read-only, customephemeral: booleanversion: string or nullPUT /orgs/{org}/actions/runner-groups/{runner_group_id}/runners
Replaces the list of self-hosted runners that are part of an organization runner group.
OAuth app tokens and personal access tokens (classic) need the admin:org scope to use this endpoint.
accept (string)application/vnd.github+json is recommended.org (string) (required)
The organization name. The name is not case sensitive.
runner_group_id (integer) (required)
Unique identifier of the self-hosted runner group.
runners (array of integers) (required)Request:
curl -L \
-X PUT \
https://api.github.com/orgs/ORG/actions/runner-groups/RUNNER_GROUP_ID/runners \
-d '{
"runners": [
9,
2
]
}'
Response schema (Status: 204):
PUT /orgs/{org}/actions/runner-groups/{runner_group_id}/runners/{runner_id}
Adds a self-hosted runner to a runner group configured in an organization.
OAuth tokens and personal access tokens (classic) need the admin:org scope to use this endpoint.
accept (string)application/vnd.github+json is recommended.org (string) (required)
The organization name. The name is not case sensitive.
runner_group_id (integer) (required)
Unique identifier of the self-hosted runner group.
runner_id (integer) (required)
Unique identifier of the self-hosted runner.
Request:
curl -L \
-X PUT \
https://api.github.com/orgs/ORG/actions/runner-groups/RUNNER_GROUP_ID/runners/RUNNER_ID
Response schema (Status: 204):
DELETE /orgs/{org}/actions/runner-groups/{runner_group_id}/runners/{runner_id}
Removes a self-hosted runner from a group configured in an organization. The runner is then returned to the default group.
OAuth app tokens and personal access tokens (classic) need the admin:org scope to use this endpoint.
accept (string)application/vnd.github+json is recommended.org (string) (required)
The organization name. The name is not case sensitive.
runner_group_id (integer) (required)
Unique identifier of the self-hosted runner group.
runner_id (integer) (required)
Unique identifier of the self-hosted runner.
Request:
curl -L \
-X DELETE \
https://api.github.com/orgs/ORG/actions/runner-groups/RUNNER_GROUP_ID/runners/RUNNER_ID
Response schema (Status: 204):