# GitLab Scraper — Projects, Issues, MRs & Users (`logiover/gitlab-scraper`) Actor

Scrape GitLab by keyword, project IDs, or username. Extract project stats, issues, merge requests, and user repos. No API key, no login. Paginate to thousands of results.

- **URL**: https://apify.com/logiover/gitlab-scraper.md
- **Developed by:** [Logiover](https://apify.com/logiover) (community)
- **Categories:** Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 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

## GitLab Scraper — Projects, Issues, Merge Requests & User Repos

Scrape public GitLab repositories, issues, merge requests, and user project lists at scale — no API key, no login, no credentials required.

### What does GitLab Scraper do?

GitLab Scraper hits the official GitLab REST API v4 at `https://gitlab.com/api/v4/` using only public, unauthenticated endpoints. It supports four modes:

- **projects** — search public projects by keyword, sorted by star count, last activity, or creation date. Paginates through hundreds to thousands of results per run.
- **issues** — fetch open issues for one or more project IDs or paths, with full metadata including author, labels, and timestamps.
- **mergeRequests** — fetch open merge requests for given projects, including state, author, and merge timestamps.
- **userProjects** — list all public repositories for a specific GitLab username.

The actor uses `got-scraping` for resilient HTTP requests with automatic retries, respects GitLab's pagination headers, and gracefully handles rate limits and transient errors. Each run can return 200–5,000 rows depending on your `maxResults` setting.

### Who is it for?

- **Developers and engineers** researching the GitLab ecosystem for libraries, frameworks, or tooling by keyword and star count.
- **Data scientists and analysts** building datasets of open-source projects for trend analysis, NLP, or academic research.
- **DevRel and marketing teams** monitoring GitLab activity, tracking competitor repos, or identifying top contributors.
- **Recruiters and talent scouts** finding active open-source developers on GitLab by username and project activity.
- **Security researchers** scanning public repositories for specific technologies, frameworks, or known-vulnerable patterns at scale.

### Use cases

- Extract the top 1,000 most-starred public GitLab projects tagged "kubernetes" for a competitive analysis dashboard.
- Fetch all open issues from a list of infrastructure repos to build a centralized bug tracker feed.
- Monitor merge request activity on GitLab's own open-source repos to track release cycles.
- List all public repos for a specific GitLab user as part of a developer profile enrichment pipeline.
- Build a dataset of GitLab projects by topic for a machine learning classifier that predicts project quality.

### Why use GitLab Scraper?

- **No API key needed**: works entirely with GitLab's public unauthenticated API — zero setup, zero cost for credentials.
- **14 output fields per project**: id, name, path, namespace, description, stars, forks, open issues, last activity, URL, topics, visibility, created date, default branch.
- **Bulk pagination**: fetches up to 5,000 results per run by iterating through all API pages automatically.
- **4 modes in one actor**: projects search, issues, merge requests, and user projects — no need for separate scrapers.
- **Export to CSV, JSON, Excel**: all output formats available natively in Apify datasets.
- **Pay-per-result**: only pay for what you extract — Apify's compute-unit pricing scales linearly with data volume.

### What data can you extract?

The actor outputs structured records for projects, issues, and merge requests. Project records include:

| Field | Type | Description |
|-------|------|-------------|
| `type` | string | Record type: `project`, `issue`, or `merge_request` |
| `id` | string | GitLab numeric ID of the project |
| `name` | string | Project name |
| `path` | string | Full path with namespace (e.g. `gitlab-org/gitlab`) |
| `namespace` | string | Owner namespace (user or group path) |
| `description` | string | Project description text |
| `starCount` | number | Number of stars |
| `forksCount` | number | Number of forks |
| `openIssuesCount` | number | Count of open issues |
| `lastActivityAt` | string | ISO 8601 timestamp of last activity |
| `webUrl` | string | Full URL to the project on GitLab.com |
| `topics` | string | Comma-separated list of topics/tags |
| `visibility` | string | `public`, `internal`, or `private` |
| `createdAt` | string | ISO 8601 project creation timestamp |
| `defaultBranch` | string | Default branch name (e.g. `main`, `master`) |

Issue and merge request records add:

| Field | Type | Description |
|-------|------|-------------|
| `projectId` | string | Parent project's numeric ID |
| `projectPath` | string | Parent project path identifier |
| `number` | number | Internal issue/MR number (iid) |
| `title` | string | Issue or MR title |
| `state` | string | `opened`, `closed`, `merged` |
| `author` | string | GitLab username of the author |
| `labels` | string | Comma-separated labels |
| `createdAtItem` | string | ISO 8601 creation timestamp |
| `updatedAt` | string | ISO 8601 last update timestamp |
| `closedAt` | string | ISO 8601 close/merge timestamp |

**Sample output (project):**

```json
{
  "type": "project",
  "id": "278964",
  "name": "GitLab",
  "path": "gitlab-org/gitlab",
  "namespace": "gitlab-org",
  "description": "GitLab is an open source end-to-end software development platform with built-in version control, issue tracking, code review, CI/CD, and more.",
  "starCount": 23400,
  "forksCount": 6890,
  "openIssuesCount": 42015,
  "lastActivityAt": "2026-07-08T08:00:00.000Z",
  "webUrl": "https://gitlab.com/gitlab-org/gitlab",
  "topics": "DevOps, CI/CD, Ruby, Go",
  "visibility": "public",
  "createdAt": "2017-01-01T09:00:00.000Z",
  "defaultBranch": "master"
}
````

### How to use

#### Option A — Search projects by keyword

Use `mode: "projects"` with a search query to find relevant public repositories sorted by star count.

1. Open the actor on Apify and go to **Input**.
2. Set `mode` to `projects`.
3. Enter a `query` like `kubernetes`, `rust web framework`, or `machine learning`.
4. Set `maxResults` (default 200, up to 5000).
5. Click **Start** and wait for results.

```json
{
  "mode": "projects",
  "query": "kubernetes",
  "orderBy": "star_count",
  "maxResults": 500,
  "proxyConfiguration": { "useApifyProxy": true }
}
```

#### Option B — Fetch issues or MRs by project ID

Use `mode: "issues"` or `mode: "mergeRequests"` with a list of project IDs or paths to fetch activity data.

1. Find the project ID from the GitLab UI (Settings > General) or use the path like `gitlab-org/gitlab`.
2. Set `projectIds` to a list of IDs or paths.
3. Set `maxResults` to control total items per run.

```json
{
  "mode": "issues",
  "projectIds": ["gitlab-org/gitlab", "278964"],
  "maxResults": 1000,
  "proxyConfiguration": { "useApifyProxy": true }
}
```

#### Option C — List all projects for a user

Use `mode: "userProjects"` to fetch all public repos for a GitLab username.

```json
{
  "mode": "userProjects",
  "username": "torvalds",
  "maxResults": 200,
  "proxyConfiguration": { "useApifyProxy": true }
}
```

### Input parameters

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `mode` | string | `projects` | Scraping mode: `projects`, `issues`, `mergeRequests`, `userProjects` |
| `query` | string | — | Keyword search for projects mode |
| `projectIds` | array | — | List of project IDs or paths for issues/MR modes |
| `username` | string | — | GitLab username for userProjects mode |
| `maxResults` | integer | `200` | Max items to return (1–5000) |
| `orderBy` | string | `star_count` | Sort field for projects: `star_count`, `last_activity_at`, `created_at`, `id`, `name` |
| `proxyConfiguration` | object | Apify datacenter | Proxy settings |

**Full input JSON:**

```json
{
  "mode": "projects",
  "query": "react",
  "projectIds": [],
  "username": "",
  "maxResults": 300,
  "orderBy": "star_count",
  "proxyConfiguration": { "useApifyProxy": true, "apifyProxyGroups": [] }
}
```

### Output example

```json
{
  "type": "project",
  "id": "12584701",
  "name": "StackGres",
  "path": "ongresinc/stackgres",
  "namespace": "ongresinc",
  "description": "StackGres Operator, Full Stack PostgreSQL on Kubernetes",
  "starCount": 140,
  "forksCount": 63,
  "openIssuesCount": 45,
  "lastActivityAt": "2026-07-07T21:19:05.216Z",
  "webUrl": "https://gitlab.com/ongresinc/stackgres",
  "topics": "PgBouncer, envoy, java, k8s, kubernetes, operator, patroni, postgresql",
  "visibility": "public",
  "createdAt": "2019-05-29T11:46:15.548Z",
  "defaultBranch": "main"
}
```

### Tips for best results

- **Use specific queries**: `"kubernetes operator"` returns more targeted results than `"k8s"`.
- **Paginate large datasets**: set `maxResults` to 2000–5000 for comprehensive coverage of a topic.
- **Combine modes**: run `projects` first to get IDs, then use `issues` mode with those IDs in a follow-up run.
- **Sort by last\_activity\_at** to find the most recently updated repos instead of the most popular.
- **Use path strings**: you can pass `"gitlab-org/gitlab"` directly in `projectIds` — the actor handles URL encoding.
- **Export to Google Sheets**: use Apify's built-in integration to pipe results into a live spreadsheet.
- **Schedule regularly**: set up a weekly schedule for competitive monitoring of rival projects' issue velocity.
- **Filter post-export**: download as JSON and filter by `starCount > 500` or `topics` containing specific frameworks.
- **Rate limits**: GitLab public API is rate-limited to ~60 req/min unauthenticated. For very large runs (>2000 results), the actor handles this gracefully with retries.
- **Proxy not required**: GitLab's public API doesn't block datacenter IPs — proxy is optional but helps stability.

### Integrations

**Google Sheets**: Connect Apify to Google Sheets via the native integration. New project records appear automatically as rows — ideal for team collaboration dashboards.

**Slack**: Use Apify webhooks to send a Slack message whenever a run completes. Combine with a schedule for daily repo monitoring alerts.

**Zapier / Make**: Trigger Zapier or Make workflows from Apify dataset events. For example: new GitLab project scraped → add to CRM → notify sales team.

**Webhooks**: POST run results to any endpoint via Apify's webhook system. Use this to pipe data into Elasticsearch, BigQuery, or your own database.

**Schedule**: Run on a daily or weekly cron in Apify Scheduler. Monitor new repositories in your niche or track issue counts over time without manual intervention.

### API usage

**cURL:**

```bash
curl -X POST \
  "https://api.apify.com/v2/acts/logiover~gitlab-scraper/runs?token=YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"mode":"projects","query":"kubernetes","maxResults":200}'
```

**Node.js (Apify client):**

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

const client = new ApifyClient({ token: 'YOUR_API_TOKEN' });

const run = await client.actor('logiover/gitlab-scraper').call({
  mode: 'projects',
  query: 'rust web framework',
  maxResults: 500,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

**Python:**

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_API_TOKEN")

run = client.actor("logiover/gitlab-scraper").call(run_input={
    "mode": "projects",
    "query": "machine learning",
    "maxResults": 300,
})

for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["name"], item["starCount"])
```

### Use with AI agents (MCP)

GitLab Scraper is compatible with the Apify MCP (Model Context Protocol) server, which lets AI assistants like Claude or GPT-4 call this actor directly as a tool. Ask your AI agent: *"Use the GitLab Scraper to find the top 100 most-starred public projects tagged 'security' and summarize the most active ones"* — the agent calls the actor, retrieves structured data, and processes it inline.

### FAQ

#### Does GitLab Scraper require an API key?

No. It uses only public GitLab API endpoints at `https://gitlab.com/api/v4/` which are accessible without authentication. You do not need a GitLab account or Personal Access Token.

#### What is the coverage? Does it include private repos?

Only public repositories are accessible. GitLab's unauthenticated API returns all projects with `visibility: public`. Private and internal projects are not included.

#### What is the maximum number of results I can get?

You can set `maxResults` up to 5,000 per run. For projects mode, GitLab's API has deep pagination support. Practical limits depend on search result availability — a broad query like "react" may have thousands of matching repos.

#### Why am I getting zero results?

- Check your `query` for typos or overly specific terms with no matches.
- For `issues`/`mergeRequests` mode, verify your `projectIds` are valid public project IDs or paths.
- For `userProjects` mode, ensure the username is correct and the user has public repos.

#### Some fields are null — is that expected?

Yes. Fields like `openIssuesCount` may be null if a project has issues tracking disabled. `topics` is null if the project has no tags. These are natural data gaps in GitLab's API response.

#### How do I export the data to Excel?

In the Apify dataset view, click **Export** and choose **XLSX**. For large datasets, use JSON or CSV which handle more rows without Excel's row limit.

#### How fast does it run?

The actor fetches 100 records per API call. For 1,000 records, expect roughly 10–20 seconds of runtime. For 5,000, around 1–2 minutes depending on API response times and proxy latency.

#### Is this legal? Can I scrape GitLab?

Yes. The actor only accesses GitLab's official public REST API at documented endpoints. This is equivalent to any developer querying the API in their own application. No login bypasses, no scraping of private data. See GitLab's ToS for usage policies at https://about.gitlab.com/terms/.

#### What other scrapers are related?

- [GitHub Repository Scraper](https://apify.com/logiover/github-repository-scraper) — scrape GitHub repos, issues, and contributors.
- [Docker Hub Scraper](https://apify.com/logiover/docker-hub-scraper) — scrape Docker Hub images and tags.
- [npm Package Intelligence Scraper](https://apify.com/logiover/npm-package-intelligence-scraper) — scrape npm for package metadata, downloads, and dependencies.

#### How often is the data updated?

The actor fetches live data from GitLab's API on every run. There is no caching — each run returns the current state of projects and issues at the time of execution.

#### Can I fetch merge requests that are already merged or closed?

Currently the actor fetches `state=opened` items by default. You can modify the actor's `baseUrl` if you deploy a custom version, or request a new input parameter via the actor's GitHub issues.

### Is it legal?

This actor accesses only publicly available data through GitLab's official documented API. No authentication bypass, no private data, no terms-of-service violation. All extracted data is the same data accessible to any user visiting GitLab.com or making direct API calls. You are responsible for how you use the extracted data. Always review the platform's Terms of Service at https://about.gitlab.com/terms/ and applicable privacy laws (GDPR, CCPA) before using scraped data for commercial purposes.

### Related scrapers

- **[GitHub Repository Scraper](https://apify.com/logiover/github-repository-scraper)** — mirror tool for GitHub.com with stars, forks, contributors, and repo metadata.
- **[npm Package Intelligence Scraper](https://apify.com/logiover/npm-package-intelligence-scraper)** — extract npm registry data including weekly downloads, dependencies, and maintainer info.
- **[Docker Hub Scraper](https://apify.com/logiover/docker-hub-scraper)** — scrape Docker Hub for images, tags, pull counts, and descriptions.
- **[Crates.io Scraper](https://apify.com/logiover/crates-io-scraper)** — Rust package registry data including crate metadata, versions, and download stats.

# Actor input Schema

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

Scraping mode: 'projects' searches public projects by query/stars, 'issues' fetches issues for given project IDs, 'mergeRequests' fetches merge requests for given project IDs, 'userProjects' fetches projects for a given username.

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

Keyword to search for public projects (used in 'projects' mode). E.g. 'kubernetes', 'react', 'machine learning'.

## `projectIds` (type: `array`):

List of GitLab project IDs (numbers) or path\_with\_namespace strings (e.g. 'gitlab-org/gitlab'). Used in 'issues' and 'mergeRequests' modes.

## `username` (type: `string`):

GitLab username to fetch public projects for (used in 'userProjects' mode).

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

Maximum number of results to return. Default 200, max 5000.

## `orderBy` (type: `string`):

Sort projects by this field (projects mode only).

## `proxyConfiguration` (type: `object`):

Apify proxy configuration. Uses automatic proxy selection by default, with a direct-connection fallback for this clean public API.

## Actor input object example

```json
{
  "mode": "projects",
  "maxResults": 200,
  "orderBy": "star_count",
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `results` (type: `string`):

All records extracted by this run. Open the Dataset tab to browse, filter, and export as CSV, JSON, or Excel.

# 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 = {
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("logiover/gitlab-scraper").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 = { "proxyConfiguration": { "useApifyProxy": True } }

# Run the Actor and wait for it to finish
run = client.actor("logiover/gitlab-scraper").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 '{
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call logiover/gitlab-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "GitLab Scraper — Projects, Issues, MRs & Users",
        "description": "Scrape GitLab by keyword, project IDs, or username. Extract project stats, issues, merge requests, and user repos. No API key, no login. Paginate to thousands of results.",
        "version": "1.0",
        "x-build-id": "5CNYe8CIQqehQPAZv"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/logiover~gitlab-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-logiover-gitlab-scraper",
                "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/logiover~gitlab-scraper/runs": {
            "post": {
                "operationId": "runs-sync-logiover-gitlab-scraper",
                "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/logiover~gitlab-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-logiover-gitlab-scraper",
                "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": {
                    "mode": {
                        "title": "Mode",
                        "enum": [
                            "projects",
                            "issues",
                            "mergeRequests",
                            "userProjects"
                        ],
                        "type": "string",
                        "description": "Scraping mode: 'projects' searches public projects by query/stars, 'issues' fetches issues for given project IDs, 'mergeRequests' fetches merge requests for given project IDs, 'userProjects' fetches projects for a given username.",
                        "default": "projects"
                    },
                    "query": {
                        "title": "Search Query",
                        "type": "string",
                        "description": "Keyword to search for public projects (used in 'projects' mode). E.g. 'kubernetes', 'react', 'machine learning'."
                    },
                    "projectIds": {
                        "title": "Project IDs",
                        "type": "array",
                        "description": "List of GitLab project IDs (numbers) or path_with_namespace strings (e.g. 'gitlab-org/gitlab'). Used in 'issues' and 'mergeRequests' modes.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "username": {
                        "title": "Username",
                        "type": "string",
                        "description": "GitLab username to fetch public projects for (used in 'userProjects' mode)."
                    },
                    "maxResults": {
                        "title": "Max Results",
                        "minimum": 1,
                        "maximum": 5000,
                        "type": "integer",
                        "description": "Maximum number of results to return. Default 200, max 5000.",
                        "default": 200
                    },
                    "orderBy": {
                        "title": "Order By (projects mode)",
                        "enum": [
                            "star_count",
                            "last_activity_at",
                            "created_at",
                            "id",
                            "name"
                        ],
                        "type": "string",
                        "description": "Sort projects by this field (projects mode only).",
                        "default": "star_count"
                    },
                    "proxyConfiguration": {
                        "title": "Proxy Configuration",
                        "type": "object",
                        "description": "Apify proxy configuration. Uses automatic proxy selection by default, with a direct-connection fallback for this clean public API.",
                        "default": {
                            "useApifyProxy": true
                        }
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
