How to export GitHub issues to CSV or Excel (all pages)
Published 2026-10-13 by Sidecar Tools. GitHub's web UI has no export button, and the community request for one has been open since 2019. Here are the three ways people actually do it, from no-install to no-code.
Option 1: the gh CLI, no script
If you have GitHub's official CLI installed and are signed in (gh auth login), this is the fastest path for a one-off export and needs no extra tooling beyond jq:
# all open issues in a repo, as JSON, then flattened to CSV
gh issue list --repo OWNER/REPO --state all --limit 1000 \
--json number,title,state,author,labels,assignees,createdAt,updatedAt,closedAt \
| jq -r '["number","title","state","author","labels","assignees","created","updated","closed"],
(.[] | [.number, .title, .state, .author.login,
(.labels | map(.name) | join("; ")),
(.assignees | map(.login) | join("; ")),
.createdAt, .updatedAt, .closedAt]) | @csv' > issues.csv
Limits: gh issue list caps at 1,000 results in one call (--limit cannot exceed it), it covers issues OR pull requests separately (use gh pr list for PRs), and there is no per-item comment count field in the JSON output, so comment volume is not included.
Option 2: the REST API with paging, for more than 1,000 items
GitHub's issues endpoint paginates at 100 items per request. A repo with more than 1,000 open+closed issues needs real paging, not just a bigger --limit:
page=1
while :; do
resp=$(curl -s -H "Authorization: Bearer $GH_TOKEN" \
"https://api.github.com/repos/OWNER/REPO/issues?state=all&per_page=100&page=$page")
count=$(echo "$resp" | jq 'length')
[ "$count" -eq 0 ] && break
echo "$resp" >> all_issues.jsonl
page=$((page+1))
done
Notes: this endpoint returns pull requests mixed in with issues (each item has a pull_request key if it's a PR); an unauthenticated request is capped at 60 requests/hour, a token raises that to 5,000/hour; and GitHub does not promise a stable sort without an explicit sort/direction query parameter, so add one if you are paging over a repo that's actively getting new issues.
Option 3: the point-and-click version
Both options above need a terminal and, for anything beyond a single small repo, a few lines of scripting around pagination and rate limits. If you just want to open a GitHub issues or pull-requests list in your browser, apply your usual filters (label, milestone, assignee, search text), and download the whole filtered list as CSV, Excel, or JSON in one click, that's what our GitHub Export extension does: it drives the same official REST API from your browser, pages through lists past 1,000 items automatically, and never sends your data anywhere but api.github.com.
Comparison
gh CLI | REST API script | GitHub Export extension | |
|---|---|---|---|
| Setup | Install gh + jq | Write/maintain a script | None, browser only |
| Past 1,000 items | No | Yes, with paging code | Yes, automatic |
| Respects your current UI filters | No, rebuild as flags | No, rebuild as query params | Yes, reads the page you're on |
| Output | CSV via jq | JSON, CSV with more code | CSV, XLSX, or JSON |