You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
[Schema Inaccuracy] Some conditions of "Download step logs for a workflow run job" availability seem to be missing #7369
However, all I'm getting is a 404, even though I got the step number directly from the list of steps given by the API in the "Get a job for a workflow run" endpoint:
I expected to get 302 Found response with a Location header when specifying valid job ID and step number.
Reproduction Steps
The token used is a fine-grained user token with "Actions" repository permission per the documentation:
though per the documentation, I would also expect this endpoint to work without authentication as well since the repository is public.
Here's the command I ran (replacing github_pat_... with a valid token)
I hit the same problem while building a CI tracker, and did some extra
digging that may help narrow this down. Short version: the endpoint never
gets as far as the 302 — it answers with a 404 before any Location is
produced, and that 404 is not a "route not found" 404.
Environment
rhosocial/python-activerecord (public), run 40632965464, job 122633372679, step 3 ("Check out the repository")
fine-grained PAT that can read this repository's Actions; the same token
gets 200/302 from the endpoints used as controls below
GET /repos/{owner}/{repo}/actions/jobs/{job_id}/steps/{step_number}/logs
→ 302 with a Location pointing at a plain-text log.
What actually happens
GET /repos/rhosocial/python-activerecord/actions/jobs/122633372679/steps/3/logs
HTTP/2 404
content-type: application/json; charset=utf-8
x-github-api-version-selected: 2026-03-10
x-github-request-id: 8DBC:12702D:B78CAD:11FA621:6AE1A342
(no Location)
{"message":"Not Found",
"documentation_url":"https://docs.github.com/rest/actions/workflow-jobs#download-step-logs-for-a-workflow-run-job",
"status":"404"}
Control, same job and same token:
GET /repos/rhosocial/python-activerecord/actions/jobs/122633372679/logs
HTTP/2 302
location: https://productionresultssa32.blob.core.windows.net/.../job-logs.txt?...
So there is no redirect and no signed URL to test for expiry or permission
problems — the failure happens before the redirect.
Why this doesn't look like a typo / missing route
Request
Status
documentation_url
version header
.../jobs/{id}/steps/3/logs
404
operation-specific anchor
present
.../jobs/{id}/bogus
404
generic https://docs.github.com/rest
absent
.../jobs/{id}/steps/3 (no /logs)
404
generic
absent
.../jobs/{id}/steps/3/logs/ (trailing slash)
404
generic
absent
.../jobs/{id}/steps/three/logs
404
operation-specific anchor
present
.../jobs/999999999999 (known route, missing job)
404
...#get-a-job-for-a-workflow-run
present
Also:
OPTIONS .../jobs/{id}/steps/3/logs → 204, while OPTIONS .../jobs/{id}/bogus → 404.
HEAD behaves like GET (404).
A non-numeric step (three) still resolves to this operation, so the
route is not validating step_number as an integer; it looks like a
handler-level "no such step log", not a path mismatch.
That combination — operation-specific 404, API-version header, OPTIONS
204, exact path matching — is what a real endpoint returns when the
resource is missing, not what an unknown path returns.
Scope of the reproduction
I could not find any combination that returns 302:
several private repositories in my organization (same result)
jobs in completed and in_progress state
step numbers 0–13, plus the non-contiguous sets the Jobs API returns
(e.g. [1,2,3,4,5,6,10,11,12,13], [1,...,14,27,28])
with and without a token; 2026-03-10 and 2022-11-28; Accept set to application/vnd.github+json, application/json, and application/vnd.github.raw
All 404.
For contrast: the job-level endpoint is fine
GET .../jobs/{id}/logs → 302 → text/plain (288,675 bytes for a 10-step
job). The blob URL works without Authorization; forwarding the GitHub
token gives 401 InvalidAuthenticationInfo from Azure. That part of the
docs matches reality.
Why this matters
I'm building a CI tracker; downloading the entire job log just to display
one step is expensive (some jobs are 20k+ lines, and this one is ~289 KB for
10 steps). The web UI's per-step URL
(/commit/{sha}/checks/{job_id}/logs/{n}) is session-auth only — the same
limitation described in cli/cli#11157. This endpoint is exactly what's
needed to avoid that.
Questions
The section does not appear in the 2026-09-27 Wayback snapshot of the page
but does now, so this may be docs merged ahead of the rollout.
Is the endpoint deployed? If not, could the docs be marked as "not yet
available" (or removed) until it is?
If it is deployed, what are the missing conditions? (org/repo plan,
runner type, region, log-storage backend, token type?)
Is a per-step log guaranteed to exist for every completed job/step, or
only for a subset?
Activity
vistart commentedon Oct 28, 2026
I hit the same problem while building a CI tracker, and did some extra
digging that may help narrow this down. Short version: the endpoint never
gets as far as the 302 — it answers with a 404 before any
Locationisproduced, and that 404 is not a "route not found" 404.
Environment
rhosocial/python-activerecord(public), run40632965464, job122633372679, step3("Check out the repository")gets 200/302 from the endpoints used as controls below
X-GitHub-Api-Version: 2026-03-10,Accept: application/vnd.github+jsonWhat the docs promise
GET /repos/{owner}/{repo}/actions/jobs/{job_id}/steps/{step_number}/logs→ 302 with a
Locationpointing at a plain-text log.What actually happens
Control, same job and same token:
So there is no redirect and no signed URL to test for expiry or permission
problems — the failure happens before the redirect.
Why this doesn't look like a typo / missing route
documentation_url.../jobs/{id}/steps/3/logs.../jobs/{id}/bogushttps://docs.github.com/rest.../jobs/{id}/steps/3(no/logs).../jobs/{id}/steps/3/logs/(trailing slash).../jobs/{id}/steps/three/logs.../jobs/999999999999(known route, missing job)...#get-a-job-for-a-workflow-runAlso:
OPTIONS .../jobs/{id}/steps/3/logs→ 204, whileOPTIONS .../jobs/{id}/bogus→ 404.HEADbehaves likeGET(404).three) still resolves to this operation, so theroute is not validating
step_numberas an integer; it looks like ahandler-level "no such step log", not a path mismatch.
That combination — operation-specific 404, API-version header,
OPTIONS204, exact path matching — is what a real endpoint returns when the
resource is missing, not what an unknown path returns.
Scope of the reproduction
I could not find any combination that returns 302:
rhosocial/python-activerecord,actions/setup-python,microsoft/vscode,github/docs,vercel/next.js,rust-lang/rust,kubernetes/kubernetes,python/cpython,home-assistant/corecompletedandin_progressstate0–13, plus the non-contiguous sets the Jobs API returns(e.g.
[1,2,3,4,5,6,10,11,12,13],[1,...,14,27,28])2026-03-10and2022-11-28;Acceptset toapplication/vnd.github+json,application/json, andapplication/vnd.github.rawAll 404.
For contrast: the job-level endpoint is fine
GET .../jobs/{id}/logs→ 302 →text/plain(288,675 bytes for a 10-stepjob). The blob URL works without
Authorization; forwarding the GitHubtoken gives
401 InvalidAuthenticationInfofrom Azure. That part of thedocs matches reality.
Why this matters
I'm building a CI tracker; downloading the entire job log just to display
one step is expensive (some jobs are 20k+ lines, and this one is ~289 KB for
10 steps). The web UI's per-step URL
(
/commit/{sha}/checks/{job_id}/logs/{n}) is session-auth only — the samelimitation described in cli/cli#11157. This endpoint is exactly what's
needed to avoid that.
Questions
The section does not appear in the 2026-09-27 Wayback snapshot of the page
but does now, so this may be docs merged ahead of the rollout.
available" (or removed) until it is?
runner type, region, log-storage backend, token type?)
only for a subset?
Thanks!