# GitHub Repositories & Users Search (No Login) (`cliqtomedia/github-search`) Actor

Search GitHub repositories or users with GitHub's own search syntax. Get stars, forks, language, topics, licence and last push, or user name, company, location and followers. Works without a token; add your own for higher limits. No emails.

- **URL**: https://apify.com/cliqtomedia/github-search.md
- **Developed by:** [Cliqto Media](https://apify.com/cliqtomedia) (community)
- **Categories:** Developer tools, Lead generation
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.60 / 1,000 repository results

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

Search GitHub repositories or GitHub users with GitHub's own search syntax and get clean rows: stars, forks, language, topics, licence and last push for repositories, or name, company, location, followers and public repos for users. No login and no token needed. A typical 10-repository run finishes in a few seconds and costs under $0.01.

Use it for developer relations, open-source research, tool tracking or technical recruiting. The smallest run is one query, such as `apify actor`, and 10 results.

![GitHub Repositories & Users Search: type a GitHub query, get repository or user rows with stars, forks, licence and public profile fields, export to JSON or CSV](https://api.apify.com/v2/key-value-stores/fQfxdsIGD4Uhj4N5N/records/README-BANNER-20261017.png)

### Table of contents

- [What it does](#what-it-does)
- [How it works](#how-it-works)
- [Quick start](#quick-start)
- [Use cases](#use-cases)
- [Input](#input)
- [Output](#output)
- [Pricing](#pricing)
- [Limits](#limits)
- [API, export and integrations](#api-export-and-integrations)
- [Troubleshooting](#troubleshooting)
- [FAQ](#faq)
- [Related Actors](#related-actors)
- [Support](#support)

### What it does

The Actor sends your query to the official [GitHub REST API](https://docs.github.com/en/rest/search/search) search and saves one row per result in the Dataset.

- **Repositories mode:** one row per repository with `fullName`, `url`, `description`, `stars`, `forks`, `language`, `topics`, `license`, `pushedAt` and more.
- **Users mode:** one row per user or organisation with `login`, `url`, `name`, `company`, `location`, `followers`, `publicRepos` and more. Profile details come from the public GitHub profile.

The Actor never collects email addresses. If a bio, blog or company text contains an email address, it is replaced with `[email removed]`.

Every row has `query`, `rank`, `source` and `fetchedAt`, so you always know where and when the value came from.

#### Good fit

- Find the most-starred repositories for a topic or language, for example `web scraper language:python` sorted by `stars`.
- Track tools in your niche: repositories with a topic, licence or recent activity (`pushed:>2026-01-01`).
- Build a list of public developer profiles by location and language, for example `location:berlin language:rust`, sorted by followers.

#### Not a fit / limits

- No code search, issues, pull requests, commits or README text. Only repositories and users.
- No emails and no private data. Only public fields that GitHub shows to anyone.
- GitHub returns at most **1,000 results per query**. To get more, split the query, for example by `created:` date ranges or by `language:`, and put the parts in **More search queries**.
- Without a token, GitHub gives about 60 full profile lookups per hour to the shared Apify IP. Bigger users runs still finish, but some profiles are partial or unavailable (see [Limits](#limits)).

> **👉 [Try it now: open the input form](https://console.apify.com/actors/ZRSUHfsaZZm9rJqDH/input)**

### How it works

1. You type a search query in GitHub's own search syntax and choose repositories or users.
2. The Actor sends the query to GitHub's public search and reads the results page by page, up to your `maxItems`. In users mode it also opens each public profile for the name, company, location and follower counts. When GitHub's anonymous profile quota runs out, it reads the public github.com user search results for the remaining users instead (`detailsSource = web_search`, `detailsStatus = partial`).
3. It saves one row per result in the Dataset, plus a `RUN_SUMMARY` record with the status, counts and warnings.

> **👉 [Try it now: open the input form](https://console.apify.com/actors/ZRSUHfsaZZm9rJqDH/input)**

### Quick start

[![Input form with the prefill: box 1 What to search, box 2 Search query, box 3 Max results per query, box 4 Start](https://api.apify.com/v2/key-value-stores/fQfxdsIGD4Uhj4N5N/records/quick-start-form-20261028.png)](https://console.apify.com/actors/ZRSUHfsaZZm9rJqDH/input)

1. On the **Input** tab, keep **What to search** (`mode`) as `Repositories` (box 1).
2. Keep the prefilled **Search query** (`query`) `apify actor`, or type your own query (box 2). Leave **More search queries** (`extraQueries`) empty for this first run.
3. Keep **Max results** (`maxItems`) at the prefilled `10` (box 3). The limit applies to each query.
4. Click **Start** (box 4 on the form). When the run finishes, open the **Output** tab: the **Repositories** view shows one row per repository with stars, forks and language (box 4 on the table).

   [![Output table of the prefill run: box 4 marks the repository, stars, forks and language columns](https://api.apify.com/v2/key-value-stores/fQfxdsIGD4Uhj4N5N/records/output-table-20261028.png)](https://api.apify.com/v2/key-value-stores/fQfxdsIGD4Uhj4N5N/records/output-table-20261028.png)

Expected result: 10 repository rows in a few seconds, with stars, forks, language, licence and topics.

> **👉 [Try it now: open the input form](https://console.apify.com/actors/ZRSUHfsaZZm9rJqDH/input)**

### Use cases

| Buyer job | Input path | Output entity | Key fields | Next integration |
| --- | --- | --- | --- | --- |
| Find popular projects for a topic | `mode=repositories`, `query`, `sort=stars` | Repository | `fullName`, `stars`, `language`, `topics` | Export to CSV or Google Sheets |
| Watch recent activity in a niche | `query` with `pushed:>YYYY-MM-DD`, `sort=updated` | Repository | `fullName`, `pushedAt`, `isArchived` | Schedule the run and compare Datasets |
| Build a list of public developer profiles | `mode=users`, `query` with `location:` and `language:`, `sort=followers` | User | `login`, `name`, `location`, `company`, `followers` | Your CRM or spreadsheet |

> **👉 [Try it now: open the input form](https://console.apify.com/actors/ZRSUHfsaZZm9rJqDH/input)**

### Input

#### Input fields

| Field | Plain name | Type | Required | Default / prefill | Allowed values | Effect |
| --- | --- | --- | --- | --- | --- | --- |
| `mode` | What to search | string | no | default `repositories` | `repositories`, `users` | Repository rows or user rows |
| `query` | Search query | string | **yes** | prefill `apify actor` | 1–256 characters, GitHub search qualifiers allowed | The GitHub search query |
| `extraQueries` | More search queries | list of strings | no | empty | up to 9 queries, 1–256 characters each | More queries in the same run; each gets up to `maxItems` rows |
| `sort` | Sort by | string | no | default `best-match` | repositories: `best-match`, `stars`, `forks`, `updated`, `help-wanted-issues`; users: `best-match`, `followers`, `repositories`, `joined` | Result order |
| `order` | Order | string | no | default `desc` | `desc`, `asc` | Sort direction. Ignored with `best-match` |
| `maxItems` | Max results | integer | no | default `100`, prefill `10` | 1–1000 | How many rows to save per query |
| `includeUserDetails` | Add profile details | boolean | no | default `true` | `true`, `false` | Users mode only: adds name, company, location, followers and other profile fields |
| `githubToken` | GitHub token | secret string | no | none | a GitHub personal access token | Uses your own GitHub quota (see below) |

The query uses [GitHub search syntax](https://docs.github.com/en/search-github/searching-on-github/searching-for-repositories). Useful qualifiers:

- repositories: `language:`, `topic:`, `stars:>100`, `license:mit`, `pushed:>2026-01-01`, `user:` or `org:`, `archived:false`
- users: `location:`, `language:`, `followers:>100`, `repos:>10`, `type:user` or `type:org`

Filters such as language, minimum stars, topic, forks or archived repositories go into the query itself, for example `topic:scraper language:go stars:>50 fork:false archived:false`.

The token is stored as a secret input. It is not saved in the Dataset, the summary or the logs. A token without any scopes is enough for public data.

#### Interacting settings

| When | Input A | Input B | Effective behavior |
| --- | --- | --- | --- |
| Sort does not match the mode | `mode=repositories` | `sort=followers` | The run fails at once with a clear message. Use a sort from the list for your mode |
| Users without details | `mode=users` | `includeUserDetails=false` | Rows have only `login`, `url`, `accountType`, `avatarUrl` and `rank`. Faster; the price per row is the same |
| More results than GitHub serves | `maxItems=1000` | a query with 6,000 matches | The Actor saves 1,000 rows and the summary says that GitHub stops at 1,000 |
| Several queries | `query` | `extraQueries` | Queries run one after another. A result found by an earlier query is saved once, under that query. If GitHub rejects one query, the others still run and the run ends as `PARTIAL` with `partialReason = QUERY_FAILED` |
| Token | `mode=users` | `githubToken` set | Profiles use your token's quota instead of the shared anonymous one |

#### Input examples

##### Popular Python scraping repositories

```json
{
  "mode": "repositories",
  "query": "web scraper language:python",
  "sort": "stars",
  "maxItems": 100
}
```

Expected output: 100 repository rows, most stars first.

##### Rust developers in Berlin

```json
{
  "mode": "users",
  "query": "location:berlin language:rust",
  "sort": "followers",
  "maxItems": 25
}
```

Expected output: 25 user rows with profile details, most followers first.

##### Three topics in one run

```json
{
  "mode": "repositories",
  "query": "topic:web-scraping",
  "extraQueries": ["topic:crawler", "topic:headless-browser"],
  "sort": "stars",
  "maxItems": 50
}
```

Expected output: up to 150 repository rows, up to 50 per topic; a repository with two of these topics appears once.

> **👉 [Try it now: open the input form](https://console.apify.com/actors/ZRSUHfsaZZm9rJqDH/input)**

### Output

#### Output example (repository)

From the prefill run (`apify actor`, 10 results):

```json
{
  "type": "repository",
  "query": "apify actor",
  "rank": 5,
  "id": 117851913,
  "fullName": "apify/apify-cli",
  "name": "apify-cli",
  "owner": "apify",
  "ownerType": "Organization",
  "url": "https://github.com/apify/apify-cli",
  "description": "Apify command-line interface helps you create, develop, build and run Apify Actors, and manage the Apify cloud platform.",
  "homepage": "https://docs.apify.com/cli",
  "stars": 259,
  "forks": 69,
  "openIssues": 176,
  "watchers": 259,
  "language": "TypeScript",
  "topics": ["apify", "command-line", "hacktoberfest", "headless-chrome", "puppeteer", "serveless"],
  "license": "Apache-2.0",
  "licenseName": "Apache License 2.0",
  "isFork": false,
  "isArchived": false,
  "isTemplate": false,
  "defaultBranch": "master",
  "sizeKb": 20339,
  "createdAt": "2018-01-17T15:05:58Z",
  "updatedAt": "2026-10-14T22:40:34Z",
  "pushedAt": "2026-10-16T20:23:39Z",
  "source": "GitHub REST API (api.github.com)",
  "fetchedAt": "2026-10-17T11:42:29.711Z"
}
```

#### Output example (user)

An organisation account from the query `apify type:org`:

```json
{
  "type": "user",
  "query": "apify type:org",
  "rank": 1,
  "id": 24586296,
  "login": "apify",
  "url": "https://github.com/apify",
  "accountType": "Organization",
  "avatarUrl": "https://avatars.githubusercontent.com/u/24586296?v=4",
  "name": "Apify",
  "company": null,
  "location": null,
  "bio": "Put the web to work.",
  "blog": "https://apify.com/",
  "twitterUsername": "apify",
  "followers": 2468,
  "following": 0,
  "publicRepos": 270,
  "publicGists": 0,
  "hireable": null,
  "createdAt": "2016-12-15T10:36:52Z",
  "updatedAt": "2026-10-01T22:13:36Z",
  "detailsStatus": "full",
  "detailsSource": "api",
  "source": "GitHub REST API (api.github.com)",
  "fetchedAt": "2026-10-17T12:16:05.220Z"
}
```

Here `company` and `location` are `null` because the profile does not fill them, while `following` is a real `0`.

`null` means GitHub does not have or does not show the value. `0` is a real zero. For example, `license` is `null` when a repository has no licence file or GitHub cannot detect it (`NOASSERTION`).

#### Repository fields

| Field | Meaning | Type | Can be null? |
| --- | --- | --- | --- |
| `type` | Row kind, always `repository` | string | no |
| `query`, `rank` | The query that found the row and its position in that query's results (1 = first) | string, integer | no |
| `id` | GitHub repository ID | integer | no |
| `fullName`, `name`, `owner` | `owner/name`, name, owner login | string | no |
| `ownerType` | `User` or `Organization` | string | yes |
| `url`, `homepage` | GitHub page and project website | string | homepage: yes |
| `description` | Repository description | string | yes |
| `stars`, `forks`, `openIssues`, `watchers` | Counts from GitHub search (`openIssues` includes pull requests) | integer | yes |
| `language` | Main language | string | yes |
| `topics` | Topics | array of strings | empty array when none |
| `license`, `licenseName` | SPDX ID (for example `MIT`) and licence name | string | yes |
| `isFork`, `isArchived`, `isTemplate` | Repository flags | boolean | yes |
| `defaultBranch`, `sizeKb` | Default branch and size in KB | string, integer | yes |
| `createdAt`, `updatedAt`, `pushedAt` | ISO dates. `pushedAt` is the last code push | string | yes |
| `source`, `fetchedAt` | Where and when the row was collected | string | no |

#### User fields

| Field | Meaning | Type | Can be null? |
| --- | --- | --- | --- |
| `type` | Row kind, always `user` | string | no |
| `query`, `rank` | The query that found the row and its position in that query's results | string, integer | no |
| `id`, `login`, `url`, `avatarUrl` | GitHub ID, login, profile page, avatar | integer, string | no |
| `accountType` | `User` or `Organization` | string | yes |
| `name`, `company`, `location`, `bio`, `blog`, `twitterUsername` | Public profile text. Emails are removed | string | yes |
| `followers`, `following`, `publicRepos`, `publicGists` | Public counts | integer | yes |
| `hireable` | The "available for hire" flag | boolean | yes |
| `createdAt`, `updatedAt` | Account dates | string | yes |
| `detailsStatus` | `full`, `partial`, `not_requested`, `not_found` or `unavailable` | string | no |
| `detailsSource` | `api` (GitHub API profile) or `web_search` (github.com user search) | string | yes |
| `source`, `fetchedAt` | Where and when the row was collected | string | no |

`detailsStatus` tells you how complete a profile row is:

- `full`: all profile fields from the GitHub API.
- `partial`: name, location, bio, followers and public repos from github.com user search; `company`, `blog`, `twitterUsername`, `following`, `publicGists`, `hireable` and dates are `null`.
- `not_requested`: you set `includeUserDetails=false`.
- `not_found`: the account was deleted between search and lookup.
- `unavailable`: no time or quota was left for this profile; only the search fields are filled.

#### Output surfaces and run statuses

| Situation | Where | What you see |
| --- | --- | --- |
| Normal run | Dataset views **Repositories** or **Users** | One row per result |
| Query with 0 matches | Dataset is empty, run **Succeeded** | Status message: "GitHub search returned no repositories for this query." |
| Some profiles without details | Run **Succeeded**, `RUN_SUMMARY.partialReason = DETAILS_UNAVAILABLE` | Rows with `detailsStatus` `partial` or `unavailable` |
| GitHub search timed out on its side | Run **Succeeded**, `partialReason = INCOMPLETE_RESULTS` | Rows GitHub returned (can be 0); try again or narrow the query |
| One of several queries rejected or unavailable | Run **Succeeded**, `partialReason = QUERY_FAILED` | Rows from the other queries; `RUN_SUMMARY.search.queries` says which query failed and why |
| Your spending limit reached | Run **Succeeded**, `partialReason = CHARGE_LIMIT` | Rows saved up to the limit |
| GitHub error or time limit after some rows | Run **Failed**, `partialReason = SOURCE_ERROR` or `DEADLINE` | Rows saved so far stay in the Dataset |
| Broken query or bad token | Run **Failed**, no rows | A message that says what to fix |

The `RUN_SUMMARY` record in the key-value store has the status, counts, the GitHub total and the number of results GitHub can serve (`reachableResults`, at most 1,000 per query), one entry per query in `search.queries`, and warnings.

> **👉 [Try it now: open the input form](https://console.apify.com/actors/ZRSUHfsaZZm9rJqDH/input)**

### Pricing

This Actor uses pay-per-event pricing. You pay only for the events below; platform usage is included.

| Event | Free plan | Bronze | Silver | Gold |
| --- | ---: | ---: | ---: | ---: |
| Actor start (once per run) | $0.0009 | $0.0009 | $0.0009 | $0.0009 |
| Repository row saved | $0.00085 | $0.000765 | $0.00068 | $0.000595 |
| User row saved | $0.00085 | $0.000765 | $0.00068 | $0.000595 |

- The start fee scales with run memory (per GB of memory). This Actor runs with at most 512 MB, so it is charged once per run.
- A run with 0 results costs only the start: $0.0009.
- A failed run (for example a broken query) costs only the start.
- Every saved user row is charged once, whatever its `detailsStatus`.
- Set **Maximum cost per run** in the run options to cap the cost. The Actor stops when the next row would go over it and saves what fits.

#### Cost examples (Free plan)

| Scenario | Rows | Cost |
| --- | ---: | ---: |
| Prefill: `apify actor`, 10 repositories | 10 | $0.0094 |
| 100 repositories | 100 | $0.0859 |
| Three queries, 50 repositories each | 150 | $0.1284 |
| 1,000 repositories (GitHub maximum for one query) | 1,000 | $0.8509 |
| 25 users | 25 | $0.02215 |
| Query with no results | 0 | $0.0009 |

> **👉 [Try it now: open the input form](https://console.apify.com/actors/ZRSUHfsaZZm9rJqDH/input)**

### Limits

Measured without a token on the default 256 MB memory:

| Run | Rows | Time | Notes |
| --- | ---: | ---: | --- |
| 10 repositories (prefill) | 10 | about 2–4 s | up to about 40 s when GitHub asks the shared IP to slow down |
| 1,000 repositories | 1,000 | about 30 s, up to about 4 min | GitHub serves at most 1,000 per query; slow runs waited for GitHub's rate limit |
| 200 users with details | 200 | about 75 s | 60 full profiles, the rest `partial` after the anonymous quota ran out |
| 500 users with details | 500 | about 205 s | 80 profiles `unavailable` because of the run time limit |
| 3 queries × 50 repositories | 150 | about 9 s | one search page per query |

- The default run timeout is 300 seconds. The Actor stops searching and saving at about 240 seconds so that the run ends cleanly.
- `maxItems` is 1–1000. Users mode was tested up to 500 rows in one run without a token.
- Several queries share one run and its 240 seconds. Without a token GitHub allows about 10 search pages per minute, so 10 queries × 1,000 results (100 pages) do not fit in one run: the rows reached stay in the Dataset, the run stops with `partialReason = DEADLINE`, and queries that did not start show `NOT_RUN` in `RUN_SUMMARY.search.queries`. For big multi-query jobs, add a `githubToken` or split the queries across runs.
- GitHub sometimes asks the shared Apify IP to slow down (a "secondary rate limit"). The Actor then waits about a minute and continues. Your cost does not change: you pay per saved row, not per second.
- Without a token, GitHub allows about 10 searches per minute (100 results each) and about 60 full profile lookups per hour for the shared IP. [GitHub documents](https://docs.github.com/en/rest/using-the-rest-api/rate-limits-for-the-rest-api) higher limits for requests made with a token.
- For more than about 60 users with full profiles per hour, add a `githubToken`. For more than about 300 users, split the search into smaller runs (for example by `location:` or `followers:` ranges).

> **👉 [Try it now: open the input form](https://console.apify.com/actors/ZRSUHfsaZZm9rJqDH/input)**

### API, export and integrations

- **API:** start the Actor with the [Apify API](https://docs.apify.com/api/v2) and read rows from the default Dataset. Use `?view=repositories` or `?view=users` for the table columns.
- **Export:** download the Dataset as JSON, CSV, Excel, XML or HTML from the run page.
- **Scheduling:** run a saved input daily or weekly with [Apify schedules](https://docs.apify.com/platform/schedules), for example to follow new repositories in a topic.

#### Use with AI agents (MCP)

Add this Actor to an AI agent with the Apify MCP server: `https://mcp.apify.com?tools=cliqtomedia/github-search`.

Smallest useful input:

```json
{ "mode": "repositories", "query": "apify actor", "maxItems": 10 }
```

Key output fields: `fullName` (owner/name), `url`, `stars`, `language`, `pushedAt`; in users mode `login`, `followers`, `location`. A 10-row call finishes in a few seconds and costs $0.0094 on the Free plan. Results stop at 1,000 per query.

> **👉 [Try it now: open the input form](https://console.apify.com/actors/ZRSUHfsaZZm9rJqDH/input)**

### Troubleshooting

#### The run failed with "GitHub rejected the query (HTTP 422)"

Symptom: the run fails at once with no rows.
Likely reason: a qualifier has a wrong value, for example `stars:>abc`.
Action: fix the qualifier. The message quotes GitHub's own explanation.

#### "GitHub rejected the githubToken (HTTP 401)"

Likely reason: the token is wrong, expired or revoked.
Action: create a new token on GitHub, or leave the field empty to run without one.

#### Fewer rows than `maxItems`

Check `RUN_SUMMARY.search.totalCount`. If GitHub found fewer matches, you get all of them. If it found more than 1,000, GitHub serves only the first 1,000; split the query by date or language.

#### The run is slow, or the status says GitHub's rate limit was reached

Likely reason: GitHub limits anonymous requests from the shared Apify IP. The Actor waits and continues while time allows; `RUN_SUMMARY.http.rateLimitWaitMs` shows how long it waited.
Action: add a `githubToken` so that requests use your own GitHub quota, or run again later.

#### Many users have `detailsStatus` "partial" or "unavailable"

Likely reason: without a token, the shared anonymous quota for full profiles (about 60 per hour) ran out.
Action: add a `githubToken`, or run smaller users searches.

> **👉 [Try it now: open the input form](https://console.apify.com/actors/ZRSUHfsaZZm9rJqDH/input)**

### FAQ

#### Do I need a GitHub account or token?

No. The Actor works without a login. A token only gives you your own GitHub quota, which helps for big users searches.

#### Does it return email addresses?

No. The Actor never reads the email field and removes email addresses from bio, blog and company text.

#### How fresh is the data?

Each row is read from GitHub at run time; `fetchedAt` shows when. Star and follower counts change all the time.

#### Is the result complete?

You get what GitHub search returns for your query, up to 1,000 results. GitHub can report `incomplete_results` when its search times out; the summary then shows a warning.

#### Can I use the data for outreach?

Use profile data only within GitHub's [Acceptable Use Policies](https://docs.github.com/en/site-policy/acceptable-use-policies/github-acceptable-use-policies) and your local privacy law. Do not use it for spam or resell personal information.

> **👉 [Try it now: open the input form](https://console.apify.com/actors/ZRSUHfsaZZm9rJqDH/input)**

### Related Actors

- [GitHub Releases Scraper & Monitor](https://apify.com/cliqtomedia/github-releases-monitor-scraper): after you find repositories, follow their new releases, notes and assets.
- [Hacker News Scraper](https://apify.com/cliqtomedia/hacker-news-stories-comments-scraper): see which repositories and tools developers discuss on Hacker News.
- [Website Tech Stack Detector](https://apify.com/cliqtomedia/tech-stack-detector): check the CMS, frameworks and CDN of the project and company websites you found.

> **👉 [Try it now: open the input form](https://console.apify.com/actors/ZRSUHfsaZZm9rJqDH/input)**

### Support

For bugs, questions or feature requests, open an issue on the **Issues** tab of this Actor. Include the run ID and your input without the token.

> **👉 [Try it now: open the input form](https://console.apify.com/actors/ZRSUHfsaZZm9rJqDH/input)**

# Changelog

This Actor's version history is a separate document: https://apify.com/cliqtomedia/github-search/changelog.md

# Actor input Schema

## `mode` (type: `string`):

Search repositories or user/organisation accounts.

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

Same syntax as the GitHub search box. Repositories: <code>apify actor</code>, <code>language:python stars:>1000</code>, <code>topic:scraper pushed:>2026-01-01</code>, <code>org:apify</code>. Users: <code>location:berlin language:rust</code>, <code>followers:>500 type:user</code>, <code>type:org location:paris</code>. Max 256 characters.

## `extraQueries` (type: `array`):

Run up to 9 more queries in the same run, same syntax as Search query. Each query gets up to Max results rows; a result found by an earlier query is saved once. If GitHub rejects one query, the others still run and the run ends as PARTIAL.

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

best-match is GitHub's default relevance order. Repositories: stars, forks, updated, help-wanted-issues. Users: followers, repositories, joined. A sort that does not fit the mode is rejected.

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

Direction for the chosen sort. Ignored for best match.

## `maxItems` (type: `integer`):

How many results to save, 1–1,000. GitHub serves at most the first 1,000 matches of any query; split a larger search into narrower queries (for example by created: or stars: ranges).

## `includeUserDetails` (type: `boolean`):

Users mode: add name, company, location, bio, followers and public repo counts to each user. Without a token, GitHub allows 60 profile lookups per hour per IP; after that the Actor uses github.com user search, which fills name, location, bio, followers and repo counts but not company (detailsStatus "partial"). Turn off for the fastest login-only list.

## `githubToken` (type: `string`):

Optional personal access token with no scopes (read-only public data). Raises GitHub limits to 30 searches per minute and 5,000 profile lookups per hour, so every user gets full details. Stored encrypted, never logged or saved to output.

## Actor input object example

```json
{
  "mode": "repositories",
  "query": "apify actor",
  "sort": "best-match",
  "order": "desc",
  "maxItems": 10,
  "includeUserDetails": true
}
```

# Actor output Schema

## `repositories` (type: `string`):

Repository rows as a table.

## `users` (type: `string`):

User and organisation rows as a table.

## `runSummary` (type: `string`):

Status, counts, GitHub total matches and rate-limit statistics.

# 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 = {
    "mode": "repositories",
    "query": "apify actor",
    "maxItems": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("cliqtomedia/github-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 = {
    "mode": "repositories",
    "query": "apify actor",
    "maxItems": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("cliqtomedia/github-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 '{
  "mode": "repositories",
  "query": "apify actor",
  "maxItems": 10
}' |
apify call cliqtomedia/github-search --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,cliqtomedia/github-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/ZRSUHfsaZZm9rJqDH/builds/6ZKjEAOfQfr6weAkO/openapi.json
