GitHub Scraper - Repos, Stars, Forks and Users avatar

GitHub Scraper - Repos, Stars, Forks and Users

Pricing

from $0.87 / 1,000 items

Go to Apify Store
GitHub Scraper - Repos, Stars, Forks and Users

GitHub Scraper - Repos, Stars, Forks and Users

Search GitHub for repositories and users with the query you would type into GitHub's search box, or paste a list of usernames or repos. Repository rows give stars, forks, issues, language, topics, licence and dates; user rows give name, bio, company, location and followers. $0.90 per 1,000 rows.

Pricing

from $0.87 / 1,000 items

Rating

5.0

(2)

Developer

Dami's Studio

Dami's Studio

Maintained by Community

Actor stats

1

Bookmarked

59

Total users

24

Monthly active users

2 days ago

Last modified

Share

Scrape GitHub repositories and users from a search query or a list: type the query you would type into GitHub's own search box, language:rust stars:>10000, or paste the usernames or owner/repo names you already have, and get one row per result. For repositories that is stars, forks, open issues, language, topics, licence, the three dates and, if you ask, the README. For users it is the profile: name, bio, company, location, followers and public repo count.

The cap is GitHub's, not ours: any search stops at 1,000 results, however many matches it reports. Split a big job by star range or by date and put the pieces in one run.

InputA GitHub search query in GitHub's own syntax, up to 10 of them, or a list of usernames or repositories
OutputOne row per repository (stars, forks, issues, language, topics, licence, dates, README on request) or per user (name, bio, company, location, followers)
Ceiling1,000 results per search, which is GitHub's own limit; 1,000 names per list
Account neededNone. Your own GitHub token is optional and lifts the rate limits a long way
Price$0.90 per 1,000 rows on the free plan, down to $0.87 on Business. The free plan's $5 a month covers about 5,500

🔍 What GitHub Scraper does

It runs your query against GitHub's search, pages through the results 100 at a time, and writes a row for each one. Repository searches sort by stars, forks, recent update, help-wanted issues or best match. User searches sort by followers, public repositories or join date, or GitHub's own ranking.

Every qualifier GitHub documents works, since the query goes through as you wrote it: topic:cli created:>2023-01-01, location:berlin followers:>500, fullstack in:bio. If you would rather not write qualifiers, the Language, Minimum stars and Topics fields add them for you.

Already know what you want? Paste usernames or profile links into Usernames, or owner/repo names into Repositories, and it reads each one directly. A list run does no search.

Duplicates are dropped before anything is written, so a repository that turns up twice, across pages or across your searches, does not cost you twice.

Add your own GitHub token and the run gets GitHub's signed-in allowance, 5,000 requests an hour and 30 searches a minute. No special scopes: public data only.

📋 What data you get from each GitHub repository or user

What you getField
The repository and who owns itfullName, name, owner, url, description
Stars, forks and open issuesstars, forks, openIssues
Main language, topic tags and licencelanguage, topics, license
Homepage and default branchhomepage, defaultBranch
Created, last updated and last pushedcreatedAt, updatedAt, pushedAt
Whether it is a fork, archived or a template, and its sizeisFork, archived, isTemplate, sizeKb
The README as plain text, when you switch it onreadme, readmeTruncated
A user or organisationlogin, url, type, id
Their profile textname, bio, company, location, blog
Followers, following, public repos and gistsfollowers, following, publicRepos, publicGists
The X handle and the available-for-hire setting they put on the profiletwitterUsername, hireable
When the account was made and when the profile last changedcreatedAt, updatedAt
When the row was read, and which of your searches found itscrapedAt, searchQuery

▶️ How to scrape GitHub repositories

  1. Open GitHub Scraper and click Try for free.
  2. Put your query into Search query. Build it on GitHub first if you are not sure of it, then paste it across. Or fill Usernames or Repositories instead.
  3. Pick Search type: repositories or users.
  4. Set Max items, up to 1,000. For anything past a hundred or so, paste a GitHub token.
  5. Click Start, then download the dataset as JSON, CSV or Excel, or read it from the API.

💰 How much does it cost to scrape GitHub repositories?

$0.90 per 1,000 rows, which is $0.0009 each. That is the free plan's price; paid plans pay a little less: $0.89 on Starter, $0.88 on Scale and $0.87 on Business. On the free plan, the $5 Apify gives you each month covers about 5,500 rows.

You pay per result row, repository or user, and the README text costs nothing on top. Diagnostics are not charged, nor are names GitHub doesn't know, nor duplicates, since they are dropped before anything is written.

📥 What you give it

{
"query": "language:python stars:>5000 web framework",
"type": "repositories",
"sort": "stars",
"maxItems": 200
}

For a list instead: {"usernames": ["torvalds", "octocat"]} or {"repositories": ["rust-lang/rust"], "includeReadme": true}.

FieldDefaultWhat it is
querynoneGitHub search syntax, exactly as the site takes it. The form arrives with an example in it.
queriesnoneUp to 10 searches in one run, each up to maxItems. When set, query is not run.
usernamesnoneUp to 1,000 usernames or profile links. When this or repositories is set, no search runs.
repositoriesnoneUp to 1,000 repositories as owner/repo or links.
typerepositoriesrepositories or users, for searches. Users and organisations both come back under users.
sortstarsstars, forks, updated or help-wanted-issues for repositories; followers, repositories or joined for users; or best-match. A value that doesn't fit the search type gets best match.
languagenoneAdds language: to every search.
minStarsnoneAdds stars:>= to every repository search.
topicsnoneAdds topic: for each one. All must match: GitHub can't do either-of for topics.
includeReadmefalseREADME text on repository rows, cut at 20,000 characters.
maxItems1001 to 1,000 per search. GitHub stops at 1,000 for any single query. Lists are read in full.
githubTokennoneYour own personal access token, marked secret. No scopes needed for public data. Recommended for anything past a small run.
notionConnector, notionParentIdnoneOptional. Also write each row into your connected Notion workspace.
proxyConfigurationnoneOptional and usually unnecessary.

📤 What you get back

A real repository row from a real run:

{
"ok": true,
"fullName": "fastapi/fastapi",
"name": "fastapi",
"owner": "fastapi",
"url": "https://github.com/fastapi/fastapi",
"description": "FastAPI framework, high performance, easy to learn, fast to code, ready for production",
"stars": 103143,
"forks": 10048,
"openIssues": 81,
"language": "Python",
"topics": ["api", "async", "asyncio", "fastapi", "framework", "json", "openapi", "python", "rest", "swagger"],
"license": "MIT",
"homepage": "https://fastapi.tiangolo.com/",
"defaultBranch": "master",
"createdAt": "2018-12-08T08:21:47Z",
"updatedAt": "2026-10-16T16:24:31Z",
"pushedAt": "2026-10-16T14:13:36Z",
"isFork": false,
"archived": false,
"isTemplate": false,
"sizeKb": 55214,
"scrapedAt": "2026-10-16T17:46:00.033Z"
}
FieldHow to read it
fullNameThe repo and its owner in one string. Use it as your key.
stars, forks, openIssuesNumbers at read time, not running totals.
licenseThe licence as its SPDX id.
homepage, defaultBranchAs set on the repo. Null when there is none.
pushedAt, updatedAtpushedAt is the one that tells you whether a project is alive. updatedAt moves on a star, too.
sizeKbThe size GitHub reports for the repository, in kilobytes.
readmeNull when the repository has no README. readmeTruncated is true when it was cut at 20,000 characters.
typeOn user rows, separates a person from an organisation.
name, bio, company, location, blog, twitterUsernameOn user rows, profile text as filled in. Plenty of accounts leave these empty.
hireableTrue only when the person ticked it on their profile.

🧾 Reading the output

Data rows carry ok: true. Notes carry ok: false and an errorCode, and are never charged.

RowHow to spot itCharged
A repository or userok is trueyes
A diagnosticok is false, and errorCode says what happenedno
CodeWhat it means
BAD_INPUTThe query was empty, GitHub refused the query or the token (its reason is in error), or a list entry is not a username or owner/repo.
NO_RESULTSGitHub returned no matches for that search.
RATE_LIMITEDGitHub's limit was hit. rateLimitResetsAt says when it clears. Add a token, or ask for fewer items.
NOT_SERVEDThis request was not served this run. Re-run it later. Until 12 October 2026 this code was called BLOCKED.
NOT_FOUNDA username or repository from your list that GitHub doesn't know. input says which.
SERVER_ERRORGitHub's own error. Worth one re-run.
NETWORKGitHub was unreachable or answered badly.
TIME_LIMITThe run got close to its time limit and stopped on its own. The results delivered before that are complete and charged. Give the run more time, or ask for fewer items, to get the rest.

A note never fails the run, except one: when the time limit stopped the run before any result came back, the run ends as failed, with a TIME_LIMIT row saying so.

The default table view is built for repositories, so a users run looks blank in it. Open a row, or export the dataset, and the profile fields are all there.

💡 What people use it for

  • Tracking a topic over time. The same query weekly, keyed on fullName, shows what is growing.
  • Checking a dependency list: paste every owner/repo you rely on and filter for archived, or a pushedAt more than a year old.
  • Licence audits across a topic, using the SPDX id on every row.
  • Building a reading set from READMEs, with includeReadme on a topic: search.
  • Feeding a Notion database of interesting repos straight from the run.

🚧 What it does not do

  • 1,000 results per search. GitHub's cap. Split by stars:1000..5000, by created: window, or by language, and put the pieces in Several searches.
  • No repo contents beyond the README. No file tree, no issues, no pull requests, no contributor list.
  • No private data. Public repositories and public profiles only, whatever token you paste.
  • No e-mail addresses, even where a profile shows one.
  • A rate limit part-way through a single search loses that run's rows. Use a token for long jobs. With lists, several searches or README text, the rows read before the limit are kept.
  • The odd user row from a search comes back thin, with only the login and URL, when GitHub's profile call did not answer for that account. It is charged like any other row.
  • Counts are a snapshot. Stars move.
  • It is not an official GitHub tool. Dami's Studio is independent and is not affiliated with or endorsed by GitHub, or by any other company named on this page.

🧭 Which developer scraper do you need?

If you wantUse
Articles from DEV.to by tag or author, with the full text on requestDEV.to Scraper
Hacker News stories, Ask and Show HN posts, and commentsHacker News Scraper
Stack Overflow questions with the body and the accepted answerStack Overflow Scraper
Repositories and developer profiles from a GitHub search or a listThis one
npm and PyPI package details and download countsnpm + PyPI Package Scraper
Product launches and their upvotesProduct Hunt Scraper

❓ Questions people ask

Do I need a GitHub token to scrape repositories?

Not for a small run. For anything bigger, yes, because the signed-out allowance is tight and a run that hits it stops. A list or README text uses one request per name, so past about 60 you need one.

Is my GitHub token safe?

It goes in a secret input field, it is only sent to GitHub, and it never appears in the dataset or the log. A read-only token with no scopes is enough.

Why did my GitHub search return nothing?

If GitHub refused the query, you get a BAD_INPUT row with GitHub's own reason, such as a misspelt qualifier (star:>1000 instead of stars:>1000). A NO_RESULTS row means GitHub really found nothing.

How do I get more than 1,000 repositories?

Split the job into narrower ranges, star bands or creation-date windows, and put up to 10 of them in Several searches. A repository two of them find is charged once.

Can I get specific GitHub users or organisations?

Yes. Paste their usernames or profile links into Usernames. Organisations also come back in a users search, with type telling you which is which.

Can I call it from code or connect it to an AI assistant?

Yes. The API tab has ready-made code for Python, JavaScript and the command line. For Claude, ChatGPT or another MCP client, connect https://mcp.apify.com/?tools=fetch-actor-details,dami_studio/github-scraper. Either way the run happens on your Apify account at the same price.

This returns public repositories and public profiles only, read through GitHub's public API. Profiles are personal data under GDPR and similar laws, so have a reason for holding them, and the rules on unsolicited contact apply if you use a profile's links to reach someone. GitHub's own terms also limit what you may do with data taken from it. Apify's write-up on the legality of web scraping is a good starting point, and we are not lawyers.

🆘 If something breaks

Open the Issues tab on the actor page. Send the exact query and the run ID. If a diagnostic row landed, its errorCode and hint usually name the reason already. Never paste your token into an issue.