GitLab Scraper · Projects, Stars, Issues & Namespaces
Pricing
from $0.85 / 1,000 gitlab project record scrapeds
GitLab Scraper · Projects, Stars, Issues & Namespaces
Scrape public GitLab projects, repositories, star counts, topics, programming languages, and namespaces without authentication. Returns clean structured metadata with total coverage.
Pricing
from $0.85 / 1,000 gitlab project record scrapeds
Rating
0.0
(0)
Developer
Tarek Etman
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
6 days ago
Last modified
Categories
Share

GitLab Scraper · Projects, Stars, Issues & Namespaces
Scrape public GitLab projects, repositories, star counts, topics, programming languages, and namespaces without authentication. Extract clean, structured project metadata directly from GitLab's open REST API.
Maintained by reapX. Every row cites the Apify run that produced it — nothing is inferred, modelled or filled in, and a field absent from the source is absent from the row. The extracted archive for this source is browsable at reapx.dev/data/gitlab-scraper/ and mirrored as an open dataset on Hugging Face and Kaggle. Questions: reapxdev@proton.me
Overview
The GitLab Scraper actor extracts structured public repository data from GitLab.com. Whether you are analyzing open-source software trends, benchmarking developer activity, monitoring organizational namespaces, or harvesting code metadata for machine learning models, this scraper delivers total coverage with addressable entity slugs.
Key capabilities include:
- Keyword & Search Queries: Search project titles, descriptions, and namespace paths for specific keywords.
- Topic Tag Filtering: Target specific technology stacks and tags like
kubernetes,machine-learning,devops, ordocker. - Language Filtering: Filter repositories by primary programming language (
Python,TypeScript,Rust,Go,C++, etc.). - Star Range Filtering: Define minimum and maximum star count bounds to target high-visibility projects or emerging codebases.
- Flexible Ordering: Sort by star count, last activity timestamp, creation date, update date, name, or project ID in descending or ascending sequence.
- Zero Authentication Required: Access public GitLab data without personal access tokens or API keys.
⬇️ Input
The actor accepts structured JSON configuration allowing precise filtering and pagination parameters.
Input Parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
search | String | No | "devops" (prefill) | Search query term to filter GitLab projects by name, description, or namespace path. |
topic | String | No | — | Filter projects tagged with a specific GitLab topic (e.g., kubernetes, react). |
language | String | No | — | Filter projects written in a primary programming language (e.g., Python, Rust). |
minStars | Integer | No | — | Minimum number of stars a project must have received. |
maxStars | Integer | No | — | Maximum number of stars a project may have received. |
visibility | String | No | public | Visibility level (public, internal, private). |
orderBy | String | No | star_count | Sort field (star_count, last_activity_at, created_at, updated_at, name, id). |
sort | String | No | desc | Sort direction (desc for descending, asc for ascending). |
maxItems | Integer | No | 50 | Maximum number of project records to fetch and push (1 to 5000). |
Example Input JSON
{"search": "devops","topic": "kubernetes","language": "Go","minStars": 100,"orderBy": "star_count","sort": "desc","maxItems": 100}
⬆️ Output
Every project record is emitted directly to the run's default dataset in standardized camelCase JSON format. Each item carries total identifier coverage (slug = path_with_namespace).
Output Fields Reference Table
| Field Name | Type | Example | Description |
|---|---|---|---|
slug | String | "gitlab-org/gitlab" | Canonical addressable identifier matching path_with_namespace. |
projectId | Integer | 278964 | Unique numeric project ID assigned by GitLab. |
name | String | "GitLab" | Short human-readable project name. |
nameWithNamespace | String | "GitLab / GitLab" | Full display name including parent namespace or group. |
description | String / Null | "GitLab DevOps platform" | Project description or summary. |
createdAt | String / Null | "2015-05-20T10:15:30.000Z" | ISO 8601 UTC timestamp of repository creation. |
defaultBranch | String / Null | "master" | Primary default git branch (e.g., master or main). |
topics | Array[String] | ["devops", "git", "ci-cd"] | List of topic tags associated with the project. |
starCount | Integer | 7166 | Total stars awarded to the repository. |
forksCount | Integer | 1200 | Total number of repository forks. |
lastActivityAt | String / Null | "2026-08-03T18:00:00.000Z" | Timestamp of the most recent commit or activity. |
visibility | String | "public" | Visibility level (public, internal, private). |
webUrl | String / Null | "https://gitlab.com/gitlab-org/gitlab" | Direct web page URL on GitLab. |
readmeUrl | String / Null | "https://gitlab.com/gitlab-org/gitlab/-/blob/master/README.md" | Direct URL to project README file. |
avatarUrl | String / Null | "https://gitlab.com/uploads/-/system/project/avatar/278964/logo.png" | Direct URL to project logo or avatar. |
sshUrl | String / Null | "git@gitlab.com:gitlab-org/gitlab.git" | Git SSH clone URL. |
httpUrl | String / Null | "https://gitlab.com/gitlab-org/gitlab.git" | Git HTTP clone URL. |
namespacePath | String / Null | "gitlab-org" | Full path of the owner namespace or organization group. |
namespaceKind | String / Null | "group" | Kind of namespace (group or user). |
Example Output Record
{"slug": "gitlab-org/gitlab","projectId": 278964,"name": "GitLab","nameWithNamespace": "GitLab / GitLab","description": "GitLab DevOps platform","createdAt": "2015-05-20T10:15:30.000Z","defaultBranch": "master","topics": ["devops","git","ci-cd"],"starCount": 7166,"forksCount": 1200,"lastActivityAt": "2026-08-03T18:00:00.000Z","visibility": "public","webUrl": "https://gitlab.com/gitlab-org/gitlab","readmeUrl": "https://gitlab.com/gitlab-org/gitlab/-/blob/master/README.md","avatarUrl": "https://gitlab.com/uploads/-/system/project/avatar/278964/logo-extra-large.png","sshUrl": "git@gitlab.com:gitlab-org/gitlab.git","httpUrl": "https://gitlab.com/gitlab-org/gitlab.git","namespacePath": "gitlab-org","namespaceKind": "group"}
How it works
The actor connects directly to GitLab's official v4 REST API (https://gitlab.com/api/v4/projects).
- Parameter Construction: The actor formats user filters (
search,topic,language,minStars,maxStars,visibility,orderBy,sort) into standard URL query strings. - Paginated Requests: HTTP requests fetch 100 items per page over secure connection.
- Resilient Rate Handling: Includes automatic exponential backoff retry logic to seamlessly handle temporary 429 rate limits or 5xx server errors without losing data.
- Data Normalization: Raw API payloads are transformed into structured camelCase schemas with total
slugaddressability. - Item-by-Item Stream & Billing: Each extracted record is pushed directly to the default dataset while triggering event billing ($0.001 per record), ensuring no memory loss during long runs.
Use Cases & Integration
- Technology Intelligence & Market Research: Track the growth of specific open-source tools, topics, and programming languages across GitLab codebases.
- Lead Generation & Namespace Discovery: Discover organizations, companies, and active maintainers hosting open-source software on GitLab.
- Machine Learning & Datasets: Collect repository metadata for code analysis, recommendation engines, and training data pipelines.
- Competitive Benchmarking: Monitor star counts, fork activity, and commit freshness across competing developer projects.
- Automated Data Pipelines: Integrate dataset outputs directly into analytics tools via REST API, Python SDK, or Apify Integrations (Slack, Google Sheets, PostgreSQL, Webhooks).
Performance & Rate Limits
- HTTP Native Speed: Built without heavy browser overhead. Executes hundreds of record extractions in seconds using lightweight HTTP requests.
- Rate Limit Respect: Built-in exponential backoff pauses execution if GitLab responds with HTTP 429 backoff signals.
- Budget Control: Enforces maximum run cost limits to ensure execution never exceeds configured financial thresholds.
❓ FAQ
1. Do I need a GitLab API token to run this actor?
No. The actor scrapes public GitLab project data over the unauthenticated REST API endpoint (https://gitlab.com/api/v4/projects).
2. What field is used as the unique record identifier?
The actor emits slug = path_with_namespace (e.g. gitlab-org/gitlab), ensuring every single record can be uniquely addressed. The numeric project ID is preserved in projectId.
3. How does pricing work?
This actor runs under Pay-Per-Event pricing. You are charged $0.001 per scraped project record pushed to your dataset. Empty runs that return zero rows cost $0 for event charges.
4. Can I scrape private GitLab repositories?
No. Unauthenticated REST requests can only access public projects (visibility=public).
5. What format can I export the dataset into?
You can download dataset items in JSON, CSV, XML, Excel (XLSX), or NDJSON formats directly from the Console or via Apify API.
💬 Your feedback
We actively maintain our scrapers and update them whenever upstream APIs change. If you encounter bugs, need additional fields, or want to request custom features, contact us at reapxdev@proton.me.
Disclaimer: Unofficial - not affiliated with GitLab. Collects public data only. reapx. Contact reapxdev@proton.me.
🧪 Example input
A real, runnable configuration — this is an actual input this Actor has run with.
{"language": "python","minStars": 10,"orderBy": "star_count","sort": "desc","maxItems": 50}
📄 Sample output
One real row from a real run of this Actor, unedited.
{"slug": "lytor/devops-screening-assignment-rush-deletion_scheduled-85071369","projectId": 85071369,"name": "devops-screening-assignment-rush-deletion_scheduled-85071369","nameWithNamespace": "lytor / devops-screening-assignment-rush-deletion_scheduled-85071369","description": null,"createdAt": "2026-08-03T13:17:36.376Z","defaultBranch": "main","topics": [],"starCount": 0,"forksCount": 0,"lastActivityAt": "2026-08-03T15:36:55.972Z","visibility": "public","webUrl": "https://gitlab.com/lytor/devops-screening-assignment-rush-deletion_scheduled-85071369","readmeUrl": "https://gitlab.com/lytor/devops-screening-assignment-rush-deletion_scheduled-85071369/-/blob/main/README.md","avatarUrl": null,"sshUrl": "git@gitlab.com:lytor/devops-screening-assignment-rush-deletion_scheduled-85071369.git","httpUrl": "https://gitlab.com/lytor/devops-screening-assignment-rush-deletion_scheduled-85071369.git","namespacePath": "lytor","namespaceKind": "user"}
⚠️ Run outcomes and error handling
This Actor reports what happened in the run's status message, and it always keeps whatever it collected. These are the outcomes you can get and what each one means.
| Outcome | What it means |
|---|---|
| Success | Rows were returned and you were charged project-scraped at $0.001 per row. |
| No matches | The source returned nothing for your filters. Nothing is charged. Widen the date window or drop a filter. |
| Partial - source refused | The source rate-limited or refused some requests. The affected items are skipped and named in the log, and everything already collected is still pushed. A block never discards a run's work. |
| Rejected filter | The source itself rejected the filter combination. The run fails fast with the source's own reason and nothing is charged. |
What is guaranteed either way
- Every row is pushed as it is built, not buffered to the end of the run. Anything that buffers output loses everything to a timeout, a block or a migration; this does not.
- A field absent from the source is absent from the row. Nothing is inferred, modelled or filled in to make a row look complete.