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 CLIREST API scriptGitHub Export extension
SetupInstall gh + jqWrite/maintain a scriptNone, browser only
Past 1,000 itemsNoYes, with paging codeYes, automatic
Respects your current UI filtersNo, rebuild as flagsNo, rebuild as query paramsYes, reads the page you're on
OutputCSV via jqJSON, CSV with more codeCSV, XLSX, or JSON
Want the click-and-download version? GitHub Export is a free Chrome extension: open any issues or pull-requests list, apply your filters, click Export. Get it on the Chrome Web Store.