GitHub Scraper - Repos & Users, $0.90 per 1,000
Pricing
from $0.90 / 1,000 item returneds
GitHub Scraper - Repos & Users, $0.90 per 1,000
GitHub's search box already understands `language:rust stars:>10000`, and that string is the input here. Repo rows carry stars, forks, issues, language, topics, licence and dates; user rows add bio, company and followers. Any query caps at 1,000 results. $0.90 per 1,000 rows.
Pricing
from $0.90 / 1,000 item returneds
Rating
5.0
(3)
Developer
Dami's Studio
Maintained by CommunityActor stats
1
Bookmarked
26
Total users
8
Monthly active users
2 days ago
Last modified
Share
GitHub Scraper — repositories and users, as flat rows
GitHub's search box already understands language:rust stars:>10000 and
location:berlin followers:>500. That same string is what you type here, and the results come back
as a table instead of paginated JSON. Repository searches come back with stars, forks, open issues,
language, topics, licence and the created / updated / pushed timestamps. User searches come back
with the profile filled in: name, bio, company, location, blog, follower count, public repo count.
It talks to GitHub's public REST search API. You can run it with no credentials at all, though for anything beyond a small job you'll want a token — see the rate-limit section, it matters more than most people expect.
What you get
Repositories (type: "repositories"):
{"ok": true,"fullName": "owner/repo","name": "repo","owner": "owner","url": "https://github.com/owner/repo","description": "What the repo says about itself, or null.","stars": 195096,"forks": 109008,"openIssues": 40,"language": "Rust","topics": ["cli", "search"],"license": "MIT","homepage": null,"defaultBranch": "main","createdAt": "2026-03-31T08:58:08Z","updatedAt": "2026-08-21T16:16:58Z","pushedAt": "2026-08-16T06:18:45Z"}
Users and organisations (type: "users"): login, url, type, id, name, bio,
company, location, blog, followers, publicRepos, createdAt. The search endpoint alone
only returns the first four of those, so the actor makes one extra profile call per result to fill
in the rest. Budget your rate limit accordingly.
Optional fields are null when the repo or user simply hasn't set them — no description, no
language on a docs-only repo, no company on a personal account. That's normal, and the row is
still a complete row.
Rows that aren't data carry ok: false with an errorCode (NO_RESULTS, BAD_INPUT,
RATE_LIMITED, NETWORK) and are never charged.
Input
{"query": "language:rust stars:>10000","type": "repositories","sort": "stars","maxItems": 100}
| Field | Default | Notes |
|---|---|---|
query | — | GitHub's own search syntax, exactly as you'd type it in the search box. language:python stars:>1000 machine learning, topic:cli created:>2023-01-01, location:berlin followers:>500, fullstack in:bio. |
type | repositories | Or users, which covers organisations too. |
sort | stars | stars, forks, updated, or best-match. Repository searches only — user search uses GitHub's relevance order and ignores this. |
maxItems | 100 | 1 to 1000. See the cap below. |
githubToken | — | Your personal access token. Stored as a secret. No scopes needed for public data. |
notionConnector / notionParentId | — | Optional: write each row into a Notion database as well as the dataset. |
proxyConfiguration | off | The GitHub API is a clean public endpoint, so a proxy is normally pointless. Set it only if your own address is being throttled. |
Rate limits and the 1,000-result cap
Two GitHub limits shape what you can do here, and neither of them is something this actor can talk its way around.
The search cap. Any single GitHub search query returns at most 1,000 results — ten pages of a
hundred. That's GitHub's limit, not a setting. To go past it, split the query: run
stars:1000..5000, then stars:5000..20000, then stars:>20000, or slice by created: date
ranges. Same for users.
The request budget. Without a token you get 60 requests an hour and 10 searches a minute. With a free personal access token that becomes 5,000 an hour and 30 searches a minute. A tokenless repository search of a few hundred results is fine. A tokenless user search is not, because each result costs an extra profile call, so a few dozen users can burn the whole hourly budget.
When you do run out, the actor stops cleanly and writes a RATE_LIMITED row with the reset
timestamp in it. It doesn't return an empty dataset and let you guess.
Billing
$0.0009 per row returned ($0.90 per 1,000), plus $0.001 when a run starts. Same rate on every Apify plan. There's no volume tier to climb and no minimum.
You're only charged for rows that carry data. A query with no matches, a missing query, a
rate-limit stop and a network failure all produce a diagnostic row and cost nothing beyond the
start fee. Duplicates are dropped by fullName / login before charging, so the same repo in two
result pages is billed once.