Use the REST API to manage check runs.
Note
Write permission for the REST API to interact with checks is only available to GitHub Apps. OAuth apps and authenticated users can view check runs and check suites, but they are not able to create them. If you aren't building a GitHub App, you might be interested in using the REST API to interact with commit statuses.
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.
POST /repos/{owner}/{repo}/check-runs
Creates a new check run for a specific commit in a repository.
To create a check run, you must use a GitHub App. OAuth apps and authenticated users are not able to create a check suite.
In a check suite, GitHub limits the number of check runs with the same name to 1000. Once these check runs exceed 1000, GitHub will start to automatically delete older check runs.
Note
The Checks API only looks for pushes in the repository where the check suite or check run were created. Pushes to a branch in a forked repository are not detected and return an empty pull_requests array.
accept (string)application/vnd.github+json is recommended.owner (string) (required)
The account owner of the repository. The name is not case sensitive.
repo (string) (required)
The name of the repository without the .git extension. The name is not case sensitive.
name (string) (required)
The name of the check. For example, "code-coverage".
head_sha (string) (required)
The SHA of the commit.
details_url (string)
The URL of the integrator's site that has the full details of the check. If the integrator does not provide this, then the homepage of the GitHub app is used.
external_id (string)
A reference for the run on the integrator's system.
status (string)
The current status of the check run. Only GitHub Actions can set a status of waiting, pending, or requested.
Default: queued
Can be one of: queued, in_progress, completed, waiting, requested, pending
started_at (string)
The time that the check run began. This is a timestamp in ISO 8601 format: YYYY-MM-DDTHH:MM:SSZ.
conclusion (string)
Required if you provide completed_at or a status of completed. The final conclusion of the check.
Note: Providing conclusion will automatically set the status parameter to completed. You cannot change a check run conclusion to stale, only GitHub can set this.
Can be one of: action_required, cancelled, failure, neutral, success, skipped, stale, timed_out
completed_at (string)
The time the check completed. This is a timestamp in ISO 8601 format: YYYY-MM-DDTHH:MM:SSZ.
output (object)
Check runs can accept a variety of data in the output object, including a title and summary and can optionally provide descriptive details about the run.
title (string) (required)summary (string) (required)text (string)annotations (array of objects)path (string) (required)start_line (integer) (required)end_line (integer) (required)start_column (integer)end_column (integer)annotation_level (string) (required)notice, warning, failuremessage (string) (required)title (string)raw_details (string)images (array of objects)alt (string) (required)image_url (string) (required)caption (string)actions (array of objects)
Displays a button on GitHub that can be clicked to alert your app to do additional tasks. For example, a code linting app can display a button that automatically fixes detected errors. The button created in this object is displayed after the check run completes. When a user clicks the button, GitHub sends the check_run.requested_action webhook to your app. Each action includes a label, identifier and description. A maximum of three actions are accepted. To learn more about check runs and requested actions, see "Check runs and requested actions."
label (string) (required)description (string) (required)identifier (string) (required)Request:
curl -L \
-X POST \
https://api.github.com/repos/OWNER/REPO/check-runs \
-d '{
"name": "mighty_readme",
"head_sha": "ce587453ced02b1526dfb4cb910479d431683101",
"status": "in_progress",
"external_id": "42",
"started_at": "2018-05-04T01:14:52Z",
"output": {
"title": "Mighty Readme report",
"summary": "",
"text": ""
}
}'
Response schema (Status: 201):
id: required, integer, format: int64head_sha: required, stringnode_id: required, stringexternal_id: required, string or nullurl: required, stringhtml_url: required, string or nulldetails_url: required, string or nullstatus: required, string, enum: queued, in_progress, completed, waiting, requested, pendingconclusion: required, string or null, enum: success, failure, neutral, cancelled, skipped, timed_out, action_required, nullstarted_at: required, string or null, format: date-timecompleted_at: required, string or null, format: date-timeoutput: required, object:
title: required, string or nullsummary: required, string or nulltext: required, string or nullannotations_count: required, integerannotations_url: required, string, format: uriname: required, stringcheck_suite: required, object or null:
id: required, integerapp: required, any of:
id: required, integerslug: stringnode_id: required, stringclient_id: stringowner: required, one of:
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: stringdescription: string or nullhtml_url: required, string, format: uriwebsite_url: string or null, format: uriid: required, integernode_id: required, stringname: required, stringslug: required, stringcreated_at: required, string or null, format: date-timeupdated_at: required, string or null, format: date-timeavatar_url: required, string, format: uriname: required, stringdescription: required, string or nullexternal_url: required, string, format: urihtml_url: required, string, format: uricreated_at: required, string, format: date-timeupdated_at: required, string, format: date-timepermissions: required, object, additional properties: string:
issues: stringchecks: stringmetadata: stringcontents: stringdeployments: stringevents: required, array of stringinstallations_count: integerpull_requests: required, array of Pull Request Minimal:
id: required, integer, format: int64number: required, integerurl: required, stringhead: required, object:
ref: required, stringsha: required, stringrepo: required, object:
id: required, integer, format: int64url: required, stringname: required, stringbase: required, object:
ref: required, stringsha: required, stringrepo: required, object:
id: required, integer, format: int64url: required, stringname: required, stringdeployment: Deployment:
url: required, string, format: uriid: required, integernode_id: required, stringtask: required, stringoriginal_environment: stringenvironment: required, stringdescription: required, string or nullcreated_at: required, string, format: date-timeupdated_at: required, string, format: date-timestatuses_url: required, string, format: urirepository_url: required, string, format: uritransient_environment: booleanproduction_environment: booleanperformed_via_github_app: any of:
Request:
curl -L \
-X POST \
https://api.github.com/repos/OWNER/REPO/check-runs \
-d '{
"name": "mighty_readme",
"head_sha": "ce587453ced02b1526dfb4cb910479d431683101",
"status": "completed",
"started_at": "2017-11-30T19:39:10Z",
"conclusion": "success",
"completed_at": "2017-11-30T19:49:10Z",
"output": {
"title": "Mighty Readme report",
"summary": "There are 0 failures, 2 warnings, and 1 notices.",
"text": "You may have some misspelled words on lines 2 and 4. You also may want to add a section in your README about how to install your app.",
"annotations": [
{
"path": "README.md",
"annotation_level": "warning",
"title": "Spell Checker",
"message": "Check your spelling for '\''banaas'\''.",
"raw_details": "Do you mean '\''bananas'\'' or '\''banana'\''?",
"start_line": 2,
"end_line": 2
},
{
"path": "README.md",
"annotation_level": "warning",
"title": "Spell Checker",
"message": "Check your spelling for '\''aples'\''",
"raw_details": "Do you mean '\''apples'\'' or '\''Naples'\''",
"start_line": 4,
"end_line": 4
}
],
"images": [
{
"alt": "Super bananas",
"image_url": "http://example.com/images/42"
}
]
},
"actions": [
{
"label": "Fix",
"identifier": "fix_errors",
"description": "Allow us to fix these errors for you"
}
]
}'
Response schema (Status: 201):
id: required, integer, format: int64head_sha: required, stringnode_id: required, stringexternal_id: required, string or nullurl: required, stringhtml_url: required, string or nulldetails_url: required, string or nullstatus: required, string, enum: queued, in_progress, completed, waiting, requested, pendingconclusion: required, string or null, enum: success, failure, neutral, cancelled, skipped, timed_out, action_required, nullstarted_at: required, string or null, format: date-timecompleted_at: required, string or null, format: date-timeoutput: required, object:
title: required, string or nullsummary: required, string or nulltext: required, string or nullannotations_count: required, integerannotations_url: required, string, format: uriname: required, stringcheck_suite: required, object or null:
id: required, integerapp: required, any of:
id: required, integerslug: stringnode_id: required, stringclient_id: stringowner: required, one of:
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: stringdescription: string or nullhtml_url: required, string, format: uriwebsite_url: string or null, format: uriid: required, integernode_id: required, stringname: required, stringslug: required, stringcreated_at: required, string or null, format: date-timeupdated_at: required, string or null, format: date-timeavatar_url: required, string, format: uriname: required, stringdescription: required, string or nullexternal_url: required, string, format: urihtml_url: required, string, format: uricreated_at: required, string, format: date-timeupdated_at: required, string, format: date-timepermissions: required, object, additional properties: string:
issues: stringchecks: stringmetadata: stringcontents: stringdeployments: stringevents: required, array of stringinstallations_count: integerpull_requests: required, array of Pull Request Minimal:
id: required, integer, format: int64number: required, integerurl: required, stringhead: required, object:
ref: required, stringsha: required, stringrepo: required, object:
id: required, integer, format: int64url: required, stringname: required, stringbase: required, object:
ref: required, stringsha: required, stringrepo: required, object:
id: required, integer, format: int64url: required, stringname: required, stringdeployment: Deployment:
url: required, string, format: uriid: required, integernode_id: required, stringtask: required, stringoriginal_environment: stringenvironment: required, stringdescription: required, string or nullcreated_at: required, string, format: date-timeupdated_at: required, string, format: date-timestatuses_url: required, string, format: urirepository_url: required, string, format: uritransient_environment: booleanproduction_environment: booleanperformed_via_github_app: any of:
GET /repos/{owner}/{repo}/check-runs/{check_run_id}
Gets a single check run using its id.
Note
The Checks API only looks for pushes in the repository where the check suite or check run were created. Pushes to a branch in a forked repository are not detected and return an empty pull_requests array.
OAuth app tokens and personal access tokens (classic) need the repo scope to use this endpoint on a private repository.
accept (string)application/vnd.github+json is recommended.owner (string) (required)
The account owner of the repository. The name is not case sensitive.
repo (string) (required)
The name of the repository without the .git extension. The name is not case sensitive.
check_run_id (integer) (required)
The unique identifier of the check run.
Request:
curl -L \
-X GET \
https://api.github.com/repos/OWNER/REPO/check-runs/CHECK_RUN_ID
Response schema (Status: 200):
Same response schema as Create a check run.
PATCH /repos/{owner}/{repo}/check-runs/{check_run_id}
Updates a check run for a specific commit in a repository.
Note
The endpoints to manage checks only look for pushes in the repository where the check suite or check run were created. Pushes to a branch in a forked repository are not detected and return an empty pull_requests array.
OAuth apps and personal access tokens (classic) cannot use this endpoint.
accept (string)application/vnd.github+json is recommended.owner (string) (required)
The account owner of the repository. The name is not case sensitive.
repo (string) (required)
The name of the repository without the .git extension. The name is not case sensitive.
check_run_id (integer) (required)
The unique identifier of the check run.
name (string)
The name of the check. For example, "code-coverage".
details_url (string)
The URL of the integrator's site that has the full details of the check.
external_id (string)
A reference for the run on the integrator's system.
started_at (string)
This is a timestamp in ISO 8601 format: YYYY-MM-DDTHH:MM:SSZ.
status (string)
The current status of the check run. Only GitHub Actions can set a status of waiting, pending, or requested.
Can be one of: queued, in_progress, completed, waiting, requested, pending
conclusion (string)
Required if you provide completed_at or a status of completed. The final conclusion of the check.
Note: Providing conclusion will automatically set the status parameter to completed. You cannot change a check run conclusion to stale, only GitHub can set this.
Can be one of: action_required, cancelled, failure, neutral, success, skipped, stale, timed_out
completed_at (string)
The time the check completed. This is a timestamp in ISO 8601 format: YYYY-MM-DDTHH:MM:SSZ.
output (object)
Check runs can accept a variety of data in the output object, including a title and summary and can optionally provide descriptive details about the run.
title (string)summary (string) (required)text (string)annotations (array of objects)path (string) (required)start_line (integer) (required)end_line (integer) (required)start_column (integer)end_column (integer)annotation_level (string) (required)notice, warning, failuremessage (string) (required)title (string)raw_details (string)images (array of objects)alt (string) (required)image_url (string) (required)caption (string)actions (array of objects)
Possible further actions the integrator can perform, which a user may trigger. Each action includes a label, identifier and description. A maximum of three actions are accepted. To learn more about check runs and requested actions, see "Check runs and requested actions."
label (string) (required)description (string) (required)identifier (string) (required)Request:
curl -L \
-X PATCH \
https://api.github.com/repos/OWNER/REPO/check-runs/CHECK_RUN_ID \
-d '{
"name": "mighty_readme",
"started_at": "2018-05-04T01:14:52Z",
"status": "completed",
"conclusion": "success",
"completed_at": "2018-05-04T01:14:52Z",
"output": {
"title": "Mighty Readme report",
"summary": "There are 0 failures, 2 warnings, and 1 notices.",
"text": "You may have some misspelled words on lines 2 and 4. You also may want to add a section in your README about how to install your app.",
"annotations": [
{
"path": "README.md",
"annotation_level": "warning",
"title": "Spell Checker",
"message": "Check your spelling for '\''banaas'\''.",
"raw_details": "Do you mean '\''bananas'\'' or '\''banana'\''?",
"start_line": 2,
"end_line": 2
},
{
"path": "README.md",
"annotation_level": "warning",
"title": "Spell Checker",
"message": "Check your spelling for '\''aples'\''",
"raw_details": "Do you mean '\''apples'\'' or '\''Naples'\''",
"start_line": 4,
"end_line": 4
}
],
"images": [
{
"alt": "Super bananas",
"image_url": "http://example.com/images/42"
}
]
}
}'
Response schema (Status: 200):
Same response schema as Create a check run.
GET /repos/{owner}/{repo}/check-runs/{check_run_id}/annotations
Lists annotations for a check run using the annotation id.
OAuth app tokens and personal access tokens (classic) need the repo scope to use this endpoint on a private repository.
accept (string)application/vnd.github+json is recommended.owner (string) (required)
The account owner of the repository. The name is not case sensitive.
repo (string) (required)
The name of the repository without the .git extension. The name is not case sensitive.
check_run_id (integer) (required)
The unique identifier of the check run.
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/repos/OWNER/REPO/check-runs/CHECK_RUN_ID/annotations
Response schema (Status: 200):
Array of Check Annotation:
path: required, stringstart_line: required, integerend_line: required, integerstart_column: required, integer or nullend_column: required, integer or nullannotation_level: required, string or nulltitle: required, string or nullmessage: required, string or nullraw_details: required, string or nullblob_href: required, stringPOST /repos/{owner}/{repo}/check-runs/{check_run_id}/rerequest
Triggers GitHub to rerequest an existing check run, without pushing new code to a repository. This endpoint will trigger the check_run webhook event with the action rerequested. When a check run is rerequested, the status of the check suite it belongs to is reset to queued and the conclusion is cleared. The check run itself is not updated. GitHub apps recieving the check_run webhook with the rerequested action should then decide if the check run should be reset or updated and call the update check_run endpoint to update the check_run if desired.
For more information about how to re-run GitHub Actions jobs, see "Re-run a job from a workflow run".
accept (string)application/vnd.github+json is recommended.owner (string) (required)
The account owner of the repository. The name is not case sensitive.
repo (string) (required)
The name of the repository without the .git extension. The name is not case sensitive.
check_run_id (integer) (required)
The unique identifier of the check run.
201 - Created
403 - Forbidden if the check run is not rerequestable or doesn't belong to the authenticated GitHub App
404 - Resource not found
422 - Validation error if the check run is not rerequestable
Request:
curl -L \
-X POST \
https://api.github.com/repos/OWNER/REPO/check-runs/CHECK_RUN_ID/rerequest
Response schema (Status: 201):
GET /repos/{owner}/{repo}/check-suites/{check_suite_id}/check-runs
Lists check runs for a check suite using its id.
Note
The endpoints to manage checks only look for pushes in the repository where the check suite or check run were created. Pushes to a branch in a forked repository are not detected and return an empty pull_requests array.
OAuth app tokens and personal access tokens (classic) need the repo scope to use this endpoint on a private repository.
accept (string)application/vnd.github+json is recommended.owner (string) (required)
The account owner of the repository. The name is not case sensitive.
repo (string) (required)
The name of the repository without the .git extension. The name is not case sensitive.
check_suite_id (integer) (required)
The unique identifier of the check suite.
check_name (string)
Returns check runs with the specified name.
status (string)
Returns check runs with the specified status.
Can be one of: queued, in_progress, completed
filter (string)
Filters check runs by their completed_at timestamp. latest returns the most recent check runs.
Default: latest
Can be one of: latest, all
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/repos/OWNER/REPO/check-suites/CHECK_SUITE_ID/check-runs
Response schema (Status: 200):
total_count: required, integercheck_runs: required, array of CheckRun:
id: required, integer, format: int64head_sha: required, stringnode_id: required, stringexternal_id: required, string or nullurl: required, stringhtml_url: required, string or nulldetails_url: required, string or nullstatus: required, string, enum: queued, in_progress, completed, waiting, requested, pendingconclusion: required, string or null, enum: success, failure, neutral, cancelled, skipped, timed_out, action_required, nullstarted_at: required, string or null, format: date-timecompleted_at: required, string or null, format: date-timeoutput: required, object:
title: required, string or nullsummary: required, string or nulltext: required, string or nullannotations_count: required, integerannotations_url: required, string, format: uriname: required, stringcheck_suite: required, object or null:
id: required, integerapp: required, any of:
id: required, integerslug: stringnode_id: required, stringclient_id: stringowner: required, one of:
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: stringdescription: string or nullhtml_url: required, string, format: uriwebsite_url: string or null, format: uriid: required, integernode_id: required, stringname: required, stringslug: required, stringcreated_at: required, string or null, format: date-timeupdated_at: required, string or null, format: date-timeavatar_url: required, string, format: uriname: required, stringdescription: required, string or nullexternal_url: required, string, format: urihtml_url: required, string, format: uricreated_at: required, string, format: date-timeupdated_at: required, string, format: date-timepermissions: required, object, additional properties: string:
issues: stringchecks: stringmetadata: stringcontents: stringdeployments: stringevents: required, array of stringinstallations_count: integerpull_requests: required, array of Pull Request Minimal:
id: required, integer, format: int64number: required, integerurl: required, stringhead: required, object:
ref: required, stringsha: required, stringrepo: required, object:
id: required, integer, format: int64url: required, stringname: required, stringbase: required, object:
ref: required, stringsha: required, stringrepo: required, object:
id: required, integer, format: int64url: required, stringname: required, stringdeployment: Deployment:
url: required, string, format: uriid: required, integernode_id: required, stringtask: required, stringoriginal_environment: stringenvironment: required, stringdescription: required, string or nullcreated_at: required, string, format: date-timeupdated_at: required, string, format: date-timestatuses_url: required, string, format: urirepository_url: required, string, format: uritransient_environment: booleanproduction_environment: booleanperformed_via_github_app: any of:
GET /repos/{owner}/{repo}/commits/{ref}/check-runs
Lists check runs for a commit ref. The ref can be a SHA, branch name, or a tag name.
Note
The endpoints to manage checks only look for pushes in the repository where the check suite or check run were created. Pushes to a branch in a forked repository are not detected and return an empty pull_requests array.
If there are more than 1000 check suites on a single git reference, this endpoint will limit check runs to the 1000 most recent check suites. To iterate over all possible check runs, use the List check suites for a Git reference endpoint and provide the check_suite_id parameter to the List check runs in a check suite endpoint.
OAuth app tokens and personal access tokens (classic) need the repo scope to use this endpoint on a private repository.
accept (string)application/vnd.github+json is recommended.owner (string) (required)
The account owner of the repository. The name is not case sensitive.
repo (string) (required)
The name of the repository without the .git extension. The name is not case sensitive.
ref (string) (required)
The commit reference. Can be a commit SHA, branch name (heads/BRANCH_NAME), or tag name (tags/TAG_NAME). For more information, see "Git References" in the Git documentation.
check_name (string)
Returns check runs with the specified name.
status (string)
Returns check runs with the specified status.
Can be one of: queued, in_progress, completed
filter (string)
Filters check runs by their completed_at timestamp. latest returns the most recent check runs.
Default: latest
Can be one of: latest, all
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
app_id (integer)
Request:
curl -L \
-X GET \
https://api.github.com/repos/OWNER/REPO/commits/REF/check-runs
Response schema (Status: 200):
Same response schema as List check runs in a check suite.