Use the REST API to interact with workflow jobs in GitHub Actions.
You can use the REST API to view logs and workflow jobs in GitHub Actions. A workflow job is a set of steps that execute on the same runner. For more information, see Workflow syntax for GitHub Actions.
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 /repos/{owner}/{repo}/actions/jobs/{job_id}
Gets a specific job in a workflow run.
Anyone with read access to the repository can use this endpoint.
If the repository is private, OAuth tokens and personal access tokens (classic) need the repo scope to 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.
job_id (integer) (required)
The unique identifier of the job.
Request:
curl -L \
-X GET \
https://api.github.com/repos/OWNER/REPO/actions/jobs/JOB_ID
Response schema (Status: 200):
id: required, integer, format: int64run_id: required, integer, format: int64run_url: required, stringrun_attempt: integernode_id: required, stringhead_sha: required, stringurl: required, stringhtml_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, nullcreated_at: required, string, format: date-timestarted_at: required, string, format: date-timecompleted_at: required, string or null, format: date-timename: required, stringsteps: array of objects:
status: required, string, enum: queued, in_progress, completedconclusion: required, string or nullname: required, stringnumber: required, integerstarted_at: string or null, format: date-timecompleted_at: string or null, format: date-timecheck_run_url: required, stringlabels: required, array of stringrunner_id: required, integer or nullrunner_name: required, string or nullrunner_group_id: required, integer or nullrunner_group_name: required, string or nullworkflow_name: required, string or nullhead_branch: required, string or nullGET /repos/{owner}/{repo}/actions/jobs/{job_id}/logs
Gets a redirect URL to download a plain text file of logs for a workflow job. This link expires after 1 minute. Look
for Location: in the response header to find the URL for the download.
Anyone with read access to the repository can use this endpoint.
If the repository is private, OAuth tokens and personal access tokens (classic) need the repo scope to 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.
job_id (integer) (required)
The unique identifier of the job.
Request:
curl -L \
-X GET \
https://api.github.com/repos/OWNER/REPO/actions/jobs/JOB_ID/logs
Response schema (Status: 302):
GET /repos/{owner}/{repo}/actions/jobs/{job_id}/steps/{step_number}/logs
Gets a redirect URL to download a plain text file of logs for a specific step of a workflow job. This link expires after
1 minute. Look for Location: in the response header to find the URL for the download.
This endpoint is intended for selective retrieval of one step. To download complete job logs, use the
job logs endpoint.
Anyone with read access to the repository can use this endpoint.
If the repository is private, OAuth tokens and personal access tokens (classic) need the repo scope to 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.
job_id (integer) (required)
The unique identifier of the job.
step_number (integer) (required)
The zero-based position number of the step in the job.
Request:
curl -L \
-X GET \
https://api.github.com/repos/OWNER/REPO/actions/jobs/JOB_ID/steps/STEP_NUMBER/logs
Response schema (Status: 302):
GET /repos/{owner}/{repo}/actions/runs/{run_id}/attempts/{attempt_number}/jobs
Lists jobs for a specific workflow run attempt. You can use parameters to narrow the list of results. For more information
about using parameters, see Parameters.
Anyone with read access to the repository can use this endpoint.
OAuth app tokens and personal access tokens (classic) need the repo scope to use this endpoint with 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.
run_id (integer) (required)
The unique identifier of the workflow run.
attempt_number (integer) (required)
The attempt number of the workflow 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
200 - OK
404 - Resource not found
Request:
curl -L \
-X GET \
https://api.github.com/repos/OWNER/REPO/actions/runs/RUN_ID/attempts/ATTEMPT_NUMBER/jobs
Response schema (Status: 200):
total_count: required, integerjobs: required, array of Job:
id: required, integer, format: int64run_id: required, integer, format: int64run_url: required, stringrun_attempt: integernode_id: required, stringhead_sha: required, stringurl: required, stringhtml_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, nullcreated_at: required, string, format: date-timestarted_at: required, string, format: date-timecompleted_at: required, string or null, format: date-timename: required, stringsteps: array of objects:
status: required, string, enum: queued, in_progress, completedconclusion: required, string or nullname: required, stringnumber: required, integerstarted_at: string or null, format: date-timecompleted_at: string or null, format: date-timecheck_run_url: required, stringlabels: required, array of stringrunner_id: required, integer or nullrunner_name: required, string or nullrunner_group_id: required, integer or nullrunner_group_name: required, string or nullworkflow_name: required, string or nullhead_branch: required, string or nullGET /repos/{owner}/{repo}/actions/runs/{run_id}/jobs
Lists jobs for a workflow run. You can use parameters to narrow the list of results. For more information
about using parameters, see Parameters.
Anyone with read access to the repository can use this endpoint.
OAuth app tokens and personal access tokens (classic) need the repo scope to use this endpoint with 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.
run_id (integer) (required)
The unique identifier of the workflow run.
filter (string)
Filters jobs by their completed_at timestamp. latest returns jobs from the most recent execution of the workflow run. all returns all jobs for a workflow run, including from old executions of the workflow run.
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/actions/runs/RUN_ID/jobs
Response schema (Status: 200):
Same response schema as List jobs for a workflow run attempt.