GitHub Scraper - Repos, Stars, Forks and Users
Pricing
from $0.87 / 1,000 items
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
Maintained by CommunityActor stats
1
Bookmarked
59
Total users
24
Monthly active users
2 days ago
Last modified
Categories
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.
| Input | A GitHub search query in GitHub's own syntax, up to 10 of them, or a list of usernames or repositories |
| Output | One row per repository (stars, forks, issues, language, topics, licence, dates, README on request) or per user (name, bio, company, location, followers) |
| Ceiling | 1,000 results per search, which is GitHub's own limit; 1,000 names per list |
| Account needed | None. 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 get | Field |
|---|---|
| The repository and who owns it | fullName, name, owner, url, description |
| Stars, forks and open issues | stars, forks, openIssues |
| Main language, topic tags and licence | language, topics, license |
| Homepage and default branch | homepage, defaultBranch |
| Created, last updated and last pushed | createdAt, updatedAt, pushedAt |
| Whether it is a fork, archived or a template, and its size | isFork, archived, isTemplate, sizeKb |
| The README as plain text, when you switch it on | readme, readmeTruncated |
| A user or organisation | login, url, type, id |
| Their profile text | name, bio, company, location, blog |
| Followers, following, public repos and gists | followers, following, publicRepos, publicGists |
| The X handle and the available-for-hire setting they put on the profile | twitterUsername, hireable |
| When the account was made and when the profile last changed | createdAt, updatedAt |
| When the row was read, and which of your searches found it | scrapedAt, searchQuery |
▶️ How to scrape GitHub repositories
- Open GitHub Scraper and click Try for free.
- 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.
- Pick Search type: repositories or users.
- Set Max items, up to 1,000. For anything past a hundred or so, paste a GitHub token.
- 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}.
| Field | Default | What it is |
|---|---|---|
query | none | GitHub search syntax, exactly as the site takes it. The form arrives with an example in it. |
queries | none | Up to 10 searches in one run, each up to maxItems. When set, query is not run. |
usernames | none | Up to 1,000 usernames or profile links. When this or repositories is set, no search runs. |
repositories | none | Up to 1,000 repositories as owner/repo or links. |
type | repositories | repositories or users, for searches. Users and organisations both come back under users. |
sort | stars | stars, 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. |
language | none | Adds language: to every search. |
minStars | none | Adds stars:>= to every repository search. |
topics | none | Adds topic: for each one. All must match: GitHub can't do either-of for topics. |
includeReadme | false | README text on repository rows, cut at 20,000 characters. |
maxItems | 100 | 1 to 1,000 per search. GitHub stops at 1,000 for any single query. Lists are read in full. |
githubToken | none | Your own personal access token, marked secret. No scopes needed for public data. Recommended for anything past a small run. |
notionConnector, notionParentId | none | Optional. Also write each row into your connected Notion workspace. |
proxyConfiguration | none | Optional 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"}
| Field | How to read it |
|---|---|
fullName | The repo and its owner in one string. Use it as your key. |
stars, forks, openIssues | Numbers at read time, not running totals. |
license | The licence as its SPDX id. |
homepage, defaultBranch | As set on the repo. Null when there is none. |
pushedAt, updatedAt | pushedAt is the one that tells you whether a project is alive. updatedAt moves on a star, too. |
sizeKb | The size GitHub reports for the repository, in kilobytes. |
readme | Null when the repository has no README. readmeTruncated is true when it was cut at 20,000 characters. |
type | On user rows, separates a person from an organisation. |
name, bio, company, location, blog, twitterUsername | On user rows, profile text as filled in. Plenty of accounts leave these empty. |
hireable | True 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.
| Row | How to spot it | Charged |
|---|---|---|
| A repository or user | ok is true | yes |
| A diagnostic | ok is false, and errorCode says what happened | no |
| Code | What it means |
|---|---|
BAD_INPUT | The 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_RESULTS | GitHub returned no matches for that search. |
RATE_LIMITED | GitHub's limit was hit. rateLimitResetsAt says when it clears. Add a token, or ask for fewer items. |
NOT_SERVED | This request was not served this run. Re-run it later. Until 12 October 2026 this code was called BLOCKED. |
NOT_FOUND | A username or repository from your list that GitHub doesn't know. input says which. |
SERVER_ERROR | GitHub's own error. Worth one re-run. |
NETWORK | GitHub was unreachable or answered badly. |
TIME_LIMIT | The 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/repoyou rely on and filter forarchived, or apushedAtmore than a year old. - Licence audits across a topic, using the SPDX id on every row.
- Building a reading set from READMEs, with
includeReadmeon atopic: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, bycreated: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 want | Use |
|---|---|
| Articles from DEV.to by tag or author, with the full text on request | DEV.to Scraper |
| Hacker News stories, Ask and Show HN posts, and comments | Hacker News Scraper |
| Stack Overflow questions with the body and the accepted answer | Stack Overflow Scraper |
| Repositories and developer profiles from a GitHub search or a list | This one |
| npm and PyPI package details and download counts | npm + PyPI Package Scraper |
| Product launches and their upvotes | Product 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.
Is it legal to scrape GitHub?
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.