# GitHub Repo Search Scraper: Stars, Language, License (`lepidata/github-repo-search`) Actor

Search GitHub repositories by keyword, language, stars or date and export repo name, description, stars, language, license, dates and owner login. Repo data only. Optional token. Unofficial.

- **URL**: https://apify.com/lepidata/github-repo-search.md
- **Developed by:** [Lepi Data](https://apify.com/lepidata) (community)
- **Categories:** Developer tools, Open source
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.80 / 1,000 repositories

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## GitHub Repo Search Scraper

*Unofficial tool. Not affiliated with, endorsed by, or sponsored by GitHub, Inc.*

Search public GitHub repositories the way you would in GitHub's search box (keyword, language, minimum stars, created or pushed date) and get one clean row per repository. It's for developers, researchers, investors and tool builders who need lists of repos to compare, track or analyze.

**Input:** a search query plus optional filters (language, stars, dates, sort) and a maximum number of results. An optional GitHub token, stored as a secret input and never logged, raises GitHub's rate limits.

**Output:** repo name, full name, description, URL, stars, forks, watchers, open issues, primary language, license, topics, created, updated and pushed dates, archived and fork flags, default branch, and the owner's login and type (User or Organization). Nothing else.

This Actor returns repository fields only. It does not collect emails, bios, followers or other personal profile data. Email addresses and phone numbers are removed from repo descriptions.

Data comes from GitHub's public REST search API, which returns at most 1,000 results per query. Without a token, GitHub allows only about 10 search requests per minute.

### GitHub search input

- `query`: keywords, as in GitHub search (qualifiers such as `topic:cli` or `org:<name>` also work)
- `language`: main language, e.g. `TypeScript`
- `minStars`: minimum stars
- `sort`: best-match, stars, forks, updated, help-wanted-issues; `order`: desc or asc
- `createdFrom` / `createdTo`, `pushedFrom` / `pushedTo`: YYYY-MM-DD
- `createdLastNDays` / `pushedLastNDays`: optional, repos created or pushed in the last N days, counted back from today's UTC date when the run starts. Each overrides its own From / To pair.
- `includeArchived`: default true
- `maxResults`: up to 1,000 (GitHub's search limit per query)
- `token`: optional GitHub personal access token (secret input, never logged or stored in results). A token with no scopes is enough.

### GitHub repositories output fields

`fullName`, `name`, `ownerLogin`, `ownerType`, `url`, `description`, `stars`, `forks`, `watchers`, `openIssues`, `language`, `license` (SPDX id), `topics`, `createdAt`, `updatedAt`, `pushedAt`, `archived`, `fork`, `defaultBranch`

Free status rows (not charged): `no-results`, `invalid-input`, `api-error`, `rate-limited`, `search-cap`, `free-plan-limit`, `charge-limit-reached`.

**Example:** `{"query":"web scraper","language":"JavaScript","minStars":50,"sort":"stars","maxResults":10}`

### Ready-made examples

- [Python Web Scraping Repos on GitHub by Stars](https://apify.com/lepidata/github-repo-search/examples/github-python-web-scraping-repos): open-source Python projects for web scraping, ranked by stars.
- [Trending New GitHub Repos, Last 30 Days](https://apify.com/lepidata/github-repo-search/examples/trending-new-github-repos): repositories created in the last 30 days that are picking up stars fastest.

Unofficial examples. Not affiliated with or endorsed by any company or agency named above.

### Limits and compliance

- Rate limits: without a token the Actor waits about 6.5 s between pages (GitHub allows 10 search requests a minute); with a token, about 2 s (30 a minute). If GitHub says the limit is hit, it waits up to about a minute, then stops with a free `rate-limited` row. It never rotates tokens.
- GitHub returns at most 1,000 results per query. Narrow the query (dates, stars) to get more.
- Repository fields only, as allowed by GitHub's Acceptable Use Policies. No user profiles, emails or followers.
- No GitHub logos or marks are used.
- Free-plan accounts get up to 100 results per run.

**Pricing.** Pay per result: $0.80 per 1,000 repositories ($0.0008 each), the same price on every plan, no start fee. Free status rows are never charged.

# Actor input Schema

## `query` (type: `string`):

Keywords matched against repo name, description and README, as in GitHub search. GitHub qualifiers such as topic:cli or org:vercel also work. Give at least one of a search query, language, minStars or a date filter; with none, the run returns a free invalid-input row and nothing is charged.

## `language` (type: `string`):

Only repos whose main language is this, e.g. TypeScript, Python, Go.

## `minStars` (type: `integer`):

Only repos with at least this many stars. e.g. 100.

## `sort` (type: `string`):

How GitHub orders the results: best match (default), stars, forks, recently updated, or help-wanted issues.

## `order` (type: `string`):

Descending (default) or ascending. Ignored for best match.

## `createdFrom` (type: `string`):

YYYY-MM-DD. Repos created on or after this date.

## `createdTo` (type: `string`):

YYYY-MM-DD, e.g. 2026-10-31. Repos created on or before this date.

## `pushedFrom` (type: `string`):

YYYY-MM-DD. Repos with a push on or after this date (active repos).

## `pushedTo` (type: `string`):

YYYY-MM-DD, e.g. 2026-10-31. Repos last pushed on or before this date.

## `createdLastNDays` (type: `integer`):

Optional. Repos created on or after today minus N days (UTC date, worked out when the run starts). Overrides Created from / Created to. Leave empty to use the fixed dates. e.g. 30.

## `pushedLastNDays` (type: `integer`):

Optional. Repos with a push on or after today minus N days (UTC date, worked out when the run starts). Overrides Last pushed from / Last pushed to. Leave empty to use the fixed dates. e.g. 7.

## `includeArchived` (type: `boolean`):

Turn off to skip archived repositories.

## `maxResults` (type: `integer`):

Up to 1,000 (GitHub's limit per search). Split bigger jobs by date range.

## `token` (type: `string`):

Your own GitHub personal access token (no scopes needed). Raises GitHub's search limit from 10 to 30 searches a minute. Stored encrypted by Apify, sent only to api.github.com, never logged or saved in results.

## Actor input object example

```json
{
  "query": "web scraper",
  "sort": "best-match",
  "order": "desc",
  "includeArchived": true,
  "maxResults": 10
}
```

# Actor output Schema

## `items` (type: `string`):

All rows from this run.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "query": "web scraper",
    "maxResults": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("lepidata/github-repo-search").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "query": "web scraper",
    "maxResults": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("lepidata/github-repo-search").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "query": "web scraper",
  "maxResults": 10
}' |
apify call lepidata/github-repo-search --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,lepidata/github-repo-search"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/jdqNhAo91q4ee233e/builds/fuIbjTw5zxGRptOzr/openapi.json
