GitHub Scraper — Repos, Users, Issues & Releases avatar

GitHub Scraper — Repos, Users, Issues & Releases

Pricing

from $2.00 / 1,000 row scrapeds

Go to Apify Store
GitHub Scraper — Repos, Users, Issues & Releases

GitHub Scraper — Repos, Users, Issues & Releases

Scrape GitHub repositories, users, contributors, issues and releases from the official REST API. Gets past the 1,000-result search wall by slicing queries, and waits out rate limits instead of failing on them.

Pricing

from $2.00 / 1,000 row scrapeds

Rating

0.0

(0)

Developer

Pixflor

Pixflor

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

0

Monthly active users

11 days ago

Last modified

Share

GitHub as clean rows: repositories with stars, forks, topics and real activity signals; user profiles with the fields search results leave out; contributors, issues, pull requests and releases.

No login needed. Add a free token if you want it fast.


Two things this does that other GitHub scrapers don't

1. It gets past the 1,000-result search wall

GitHub's search API tells you how many repositories match, then refuses to give you more than 1,000 of them. Page 11 comes back 422 — "Only the first 1000 search results are available".

Measured: language:rust reports 1,277,619 repositories and hands over 1,000.

This Actor splits an oversized query into star-count ranges that each fall below the ceiling, then merges the results. The slices are disjoint by construction, so nothing is duplicated and nothing is missed — verified in the test suite on every release.

Repositories reachable
A plain search query1,000, then a hard 422
Split into star rangesas many as match, in disjoint slices

2. It waits out rate limits instead of failing on them

The real constraint on GitHub isn't the data, it's the budget: 60 requests per hour and 10 searches per minute without a token. Most scrapers sprint into that wall and return an error, or worse, a partial result.

This one reads x-ratelimit-remaining and x-ratelimit-reset, paces itself to the budget it actually has, and waits for the window when it runs out. It also distinguishes a 403 that means "rate limited" from a 403 that means "you can't see this" — GitHub uses the same status for both, and retrying the second one forever is a good way to waste a run.

Supply a free personal access token (no scopes needed for public data) and the ceiling becomes 5,000/hour and 30 searches/minute.


What you get

RepositoriesfullName, owner, description, url, homepage, language, stars, forks, watchers, openIssues, topics, license, isFork, isArchived, isTemplate, defaultBranch, sizeKb, createdAt, updatedAt, pushedAt, plus daysSincePush and isActive — derived fields that answer "is this project alive?" without you doing date maths on every row.

Userslogin, name, company, location, blog, email, twitter, bio, hireable, followers, following, publicRepos, createdAt.

GitHub's user search returns almost none of that — no name, no company, no location, no follower count. This Actor fetches the full profile for every result, because those are the fields anyone doing lead-gen or recruiting is actually paying for.

Issues & pull requestsnumber, title, state, author, body, labels, comments, timestamps. Pull requests are typed separately from issues, because GitHub returns both from the issues endpoint and counting them together silently inflates issue totals.

Releasestag, name, author, isPrerelease, body, assetCount, and downloads summed across all assets.

Contributorslogin, contributions, profile URL, ranked.


Modes

ModeWhat it returns
Search repositoriesAny GitHub search, past the 1,000 wall
Search usersPeople and organisations, with full profiles hydrated
Repositories of a user/orgEverything one account owns
Repository contributorsWho built it, ranked by commits
Repository issues & PRsOpen, closed or all — typed apart
Repository releasesVersions, notes and download counts

Typical uses

  • Developer lead generation. Users in a location, above a follower threshold, with company and website filled in.
  • Recruiting. Contributors to the exact libraries your stack uses, ranked by contribution.
  • Competitive and ecosystem research. Every repository in a topic or language, with activity signals to separate live projects from abandoned ones.
  • Dependency and supply-chain review. Licence, archived status, last push, release cadence.
  • Market sizing. How many projects exist in a niche, and how that changes over time.
  • Feeding an LLM or agent. One row per item, consistent field names, no HTML.

Example input

Popular Python scraping repos, no forks, no dead projects:

{
"mode": "searchRepos",
"searchQuery": "web scraping",
"language": "python",
"minStars": 500,
"excludeForks": true,
"excludeArchived": true,
"sortBy": "stars",
"maxItems": 200
}

Open issues across specific repositories:

{
"mode": "issues",
"repositories": ["apify/crawlee", "scrapy/scrapy"],
"issueState": "open",
"maxItems": 300
}

Who actually builds a project:

{ "mode": "contributors", "repositories": ["apify/crawlee"], "maxItems": 100 }

Settings that matter

  • githubToken — the biggest lever here. Unauthenticated, GitHub allows 60 requests an hour; with a free personal token it's 5,000. Any run of real size wants one, and it's only ever used to sign requests.
  • partition — on by default. This is what gets past GitHub's hard 1,000-result search ceiling, by slicing one query into narrower ones. Turn it off only for small searches where you'd rather save the extra calls.
  • minStars / language / topic / license — these narrow the search before rows are produced, so they cut your bill as well as the noise.
  • excludeForks / excludeArchived — forks and abandoned repos are most of what makes a raw GitHub search useless for research.
  • maxItems — your cost ceiling. Set it deliberately.

Reliability

Official REST API only. There is no HTML parsing and no bot-detection workaround anywhere in this Actor.

A 57-assertion live test suite runs before every release, including assertions that the 1,000 wall still exists, that sliced results stay unique, that per_page still silently clamps at 100, and that the issues endpoint still mixes pull requests in. When GitHub changes something, the test says which thing.

The suite is deliberately frugal with live calls and skips gracefully when the unauthenticated budget is low — a test that fails on rate limits rather than on real problems is worse than no test at all.


Pricing

Pay per event. You are charged for the run start and for each row returned — nothing else, and platform compute is included free. Filters that GitHub understands are pushed into the search query itself, so they don't burn your result budget.


Questions or a bug?

Open an issue on the Issues tab of this Actor. Include your input JSON and the run ID — that's usually enough to reproduce it immediately.