# GitHub Profile Scraper (Cheap) (`data_api/github-profile-scraper-cheap`) Actor

GitHub Profile Scraper that pulls followers, repos, bio, location, and contact info from any public GitHub account, so recruiters and researchers can build prospect lists without clicking through profiles one by one.

- **URL**: https://apify.com/data\_api/github-profile-scraper-cheap.md
- **Developed by:** [Data API](https://apify.com/data_api) (community)
- **Categories:** Lead generation, Developer tools, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.99 / 1,000 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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

## GitHub Profile Scraper

![GitHub Profile Scraper](cover.jpg)

Every developer on GitHub has a public profile, but reading them one by one in a browser does not scale. When you are sourcing engineers, mapping an open-source community, or building a contributor database, you want that data as rows, not browser tabs. Give this scraper a GitHub handle (or a whole list of them) and it returns each profile as one clean record: display name, bio, location, company, follower and following counts, public repo and gist totals, the combined stars and forks across every public repo, linked social accounts, and the public email when the user chose to show one. Run a single handle or thousands in one go.

### What you get

Each handle becomes exactly one record with a consistent shape. Fields the user left blank come back as `null` rather than disappearing, so your columns stay predictable when you load the data into a sheet or database. The fields fall into a few natural groups:

- **Identity** — `handle`, `displayName`, `profileBio`, `basedIn`, `affiliation`, `avatarLink`, `profileLink`
- **Reach** — `followerCount`, `followingCount`, `repoCount`, `gistCount`, `starCount`, `forkCount`
- **Contact and links** — `contactEmail`, `siteUrl`, `twitterHandle`, `linkedAccounts`
- **Account meta** — `openToWork`, `accountKind`, `joinedAt`, `lastActiveAt`, `collectedAt`, `errorMessage`

`starCount` and `forkCount` are summed across all of the user's public repositories, so you get a single reputation signal without paging through repo lists yourself.

### Quick start

1. Click **Try for free** and open the input form.
2. Type one handle into **GitHub handle**, or paste a list into **GitHub handles (batch)** for a bulk run.
3. Set a **Results limit** if you want to cap the run, and adjust **Timeout (seconds)** for slower connections.
4. Press **Start**, then export your results as JSON, CSV, Excel, or XML when the run finishes.

![How it works](how-it-works.jpg)

### Use cases

- **Technical recruiting** — turn a shortlist of GitHub handles into a sourcing sheet with location, company, follower count, and contact links
- **Developer relations** — measure reach and activity across the contributors in your ecosystem
- **Open-source research** — profile the maintainers behind a set of repositories and track how their following grows
- **Community building** — enrich a list of members with bios, websites, and linked social accounts
- **Sales and lead research** — qualify developer accounts by company, location, and public footprint
- **Talent market analysis** — aggregate stars, forks, and repo counts to gauge skill density in a region or stack

### Input

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `profileHandle` | string | One of `profileHandle` or `profileHandles` | A single GitHub username to look up. A leading `@` is removed automatically. Example `sindresorhus`. |
| `profileHandles` | array of strings | One of `profileHandle` or `profileHandles` | Several handles for a batch run, one per line. Duplicates are skipped. |
| `resultsLimit` | integer | No | How many profiles to process per run, capped at 1000. Default `50`. |
| `timeoutSeconds` | integer | No | Seconds to wait on each request before giving up. Default `45`; raise it on slow connections. |

#### Example input

```json
{
    "profileHandle": "sindresorhus",
    "profileHandles": ["sindresorhus", "yyx990803"],
    "resultsLimit": 50,
    "timeoutSeconds": 45
}
````

### Output

Every handle produces one record, and every field is always present — values the profile does not expose come back as `null` so your dataset stays rectangular.

#### Example output

```json
{
    "handle": "sindresorhus",
    "displayName": "Sindre Sorhus",
    "profileBio": "Full-Time Open-Sourcerer",
    "basedIn": "Thailand",
    "affiliation": "@sindresorhus",
    "siteUrl": "https://sindresorhus.com",
    "twitterHandle": "sindresorhus",
    "linkedAccounts": [
        {"provider": "mastodon", "url": "https://mastodon.social/@sindresorhus"}
    ],
    "contactEmail": null,
    "followerCount": 71240,
    "followingCount": 12,
    "repoCount": 1180,
    "gistCount": 42,
    "starCount": 528430,
    "forkCount": 21870,
    "openToWork": null,
    "accountKind": "User",
    "avatarLink": "https://avatars.githubusercontent.com/u/170270?v=4",
    "profileLink": "https://github.com/sindresorhus",
    "joinedAt": "2009-12-20T01:54:50Z",
    "lastActiveAt": "2026-06-28T09:14:33Z",
    "collectedAt": "2026-06-29T12:00:00.000000+00:00",
    "errorMessage": null
}
```

#### Output fields

| Field | Type | Description |
|-------|------|-------------|
| `handle` | string | The GitHub username that was looked up |
| `displayName` | string | The name shown on the profile |
| `profileBio` | string | The user's bio text |
| `basedIn` | string | Self-reported location |
| `affiliation` | string | Company or organization listed on the profile |
| `siteUrl` | string | Personal or project website linked from the profile |
| `twitterHandle` | string | Linked Twitter / X username |
| `linkedAccounts` | array | Social accounts the user connected, each with a provider and URL |
| `contactEmail` | string | Public email, when the user chose to show one |
| `followerCount` | integer | Number of followers |
| `followingCount` | integer | Number of accounts the user follows |
| `repoCount` | integer | Count of public repositories |
| `gistCount` | integer | Count of public gists |
| `starCount` | integer | Stars summed across all public repositories |
| `forkCount` | integer | Forks summed across all public repositories |
| `openToWork` | boolean | Whether the user flagged themselves as hireable |
| `accountKind` | string | Account type, such as User or Organization |
| `avatarLink` | string | URL of the profile avatar image |
| `profileLink` | string | Link to the GitHub profile page |
| `joinedAt` | string | ISO 8601 date the account was created |
| `lastActiveAt` | string | ISO 8601 date the profile was last updated |
| `collectedAt` | string | ISO 8601 timestamp of when the record was captured |
| `errorMessage` | string | Reason a handle failed; `null` on success |

### Tips for best results

- **Test with a few handles first.** Run three or four before a large batch so you can confirm the output fits your pipeline.
- **Use the batch field for volume.** Drop your full list into `profileHandles` and set `resultsLimit` to match — the run dedupes handles for you.
- **Star and fork totals scan up to 1000 repos.** For accounts with more public repositories, the totals reflect the most recently updated 1000.
- **Raise `timeoutSeconds` on slow links.** If you see timeout errors, lift it toward `90` and retry.
- **Failed handles are not lost.** A handle that cannot be resolved still returns a row with `errorMessage` filled in, so nothing silently drops out of your dataset.

### How can I use GitHub profile data?

**How can I use the GitHub Profile Scraper to source developer talent?**
Paste a list of handles into `profileHandles` and the scraper returns each developer's display name, location, company, follower count, and contact links as one row. Sort by `followerCount` or `starCount` to prioritize, and use `siteUrl` and `linkedAccounts` for outreach — a ready-made sourcing sheet built from a list of usernames.

**How can I look up a GitHub user's followers, repos, and bio in bulk?**
Feed one handle or thousands. For each, you get `followerCount`, `followingCount`, `repoCount`, `gistCount`, and the aggregate `starCount` and `forkCount` across all public repos, plus the bio and location. Everything that normally means paging through the GitHub UI by hand comes back as a single flat record per user.

**How can I export GitHub profile data to CSV or Excel for research?**
Run the scraper on your handles and download the dataset as JSON, CSV, Excel, or XML straight from the run. Because every field is always present, the file opens as a clean rectangular table you can pivot, filter, or join against other developer data without cleanup.

### Is it legal to scrape data?

Our actors are ethical and do not extract any private user data, such as email addresses or private contact information. They only extract what the user has chosen to share publicly. We therefore believe that our actors, when used for ethical purposes by Apify users, are safe.

However, you should be aware that your results could contain personal data. Personal data is protected by the GDPR in the European Union and by other regulations around the world. You should not scrape personal data unless you have a legitimate reason to do so. If you're unsure whether your reason is legitimate, consult your lawyers.

You can also read Apify's blog post on the [legality of web scraping](https://blog.apify.com/is-web-scraping-legal/).

### Support

Questions, feature requests, or a field you'd like added? Reach out at <data.apify@proton.me> and we'll get back to you.

# Actor input Schema

## `profileHandle` (type: `string`):

One GitHub username to look up, for example sindresorhus. A leading @ is removed for you.

## `profileHandles` (type: `array`):

Collect several GitHub profiles in a single run. Add one handle per line. Repeated entries are skipped.

## `resultsLimit` (type: `integer`):

How many profiles to handle in one run. The ceiling is 1000.

## `timeoutSeconds` (type: `integer`):

Seconds to wait on each request before giving up. Bump this up on slower connections.

## Actor input object example

```json
{
  "profileHandle": "yyx990803",
  "profileHandles": [
    "sindresorhus",
    "yyx990803"
  ],
  "resultsLimit": 50,
  "timeoutSeconds": 45
}
```

# 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 = {
    "profileHandle": "sindresorhus",
    "profileHandles": [
        "sindresorhus",
        "yyx990803",
        "kentcdodds"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("data_api/github-profile-scraper-cheap").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 = {
    "profileHandle": "sindresorhus",
    "profileHandles": [
        "sindresorhus",
        "yyx990803",
        "kentcdodds",
    ],
}

# Run the Actor and wait for it to finish
run = client.actor("data_api/github-profile-scraper-cheap").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{
  "profileHandle": "sindresorhus",
  "profileHandles": [
    "sindresorhus",
    "yyx990803",
    "kentcdodds"
  ]
}' |
apify call data_api/github-profile-scraper-cheap --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=data_api/github-profile-scraper-cheap",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "GitHub Profile Scraper (Cheap)",
        "description": "GitHub Profile Scraper that pulls followers, repos, bio, location, and contact info from any public GitHub account, so recruiters and researchers can build prospect lists without clicking through profiles one by one.",
        "version": "0.0",
        "x-build-id": "0fWJVbFI9Pg7EjmRn"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/data_api~github-profile-scraper-cheap/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-data_api-github-profile-scraper-cheap",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/data_api~github-profile-scraper-cheap/runs": {
            "post": {
                "operationId": "runs-sync-data_api-github-profile-scraper-cheap",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/data_api~github-profile-scraper-cheap/run-sync": {
            "post": {
                "operationId": "run-sync-data_api-github-profile-scraper-cheap",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "profileHandle": {
                        "title": "GitHub handle",
                        "type": "string",
                        "description": "One GitHub username to look up, for example sindresorhus. A leading @ is removed for you."
                    },
                    "profileHandles": {
                        "title": "GitHub handles (batch)",
                        "type": "array",
                        "description": "Collect several GitHub profiles in a single run. Add one handle per line. Repeated entries are skipped.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "resultsLimit": {
                        "title": "Results limit",
                        "minimum": 1,
                        "maximum": 1000,
                        "type": "integer",
                        "description": "How many profiles to handle in one run. The ceiling is 1000.",
                        "default": 50
                    },
                    "timeoutSeconds": {
                        "title": "Timeout (seconds)",
                        "minimum": 5,
                        "maximum": 120,
                        "type": "integer",
                        "description": "Seconds to wait on each request before giving up. Bump this up on slower connections.",
                        "default": 45
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
