# GitHub Activity Stream — AI Agent Dev Monitoring API (`logiover/github-activity-stream`) Actor

Keyless GitHub activity stream for AI agents: commits, pull requests, issues, releases and events for any repo, org or user. Time-windowed, paginated, thousands of events per run. Actors, additions, labels, states and URLs per row. No API key, no browser.

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

## Pricing

from $3.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

## GitHub Activity Stream — AI Agent Dev Monitoring API

> **Keyless GitHub activity stream for AI coding agents.** Pull commits, pull requests, issues, releases and public events for any repo, org or user. Time-windowed, paginated — thousands of events per run. Each event becomes one structured row with actor, state, additions/deletions, labels and URL. No API key, no headless browser.

Built for the new wave of **AI agents that reason about software development** — coding agents that summarize "what changed in this repo this week", dependency-monitoring agents that detect security commits and releases, release-tracking agents that watch for new versions, and RAG pipelines that ground LLM answers in current dev activity instead of stale training-set snapshots.

---

### 🎯 What this Actor is for

GitHub is the heartbeat of open-source and most dev teams, but its activity is scattered across commits, PRs, issues, releases and events — each a separate API endpoint with its own schema. When an AI agent is asked *"what did the React team ship this week?"* or *"any security commits in kubernetes/kubernetes lately?"*, it needs **structured, time-windowed, multi-type activity** — not raw API JSON to re-parse. `github-activity-stream` is that dev-grounding layer:

- **One repo → all activity.** Commits, PRs, issues and releases for a repo in one run, normalized to a common schema. Big repos yield thousands of events.
- **Org-wide monitoring.** `org` mode lists an org's public repos (sorted by recent activity) and pulls activity from each — monitor an entire ecosystem (kubernetes, vercel, facebook) in one run.
- **User activity.** `user` mode pulls a user's public event feed (commits, PRs, reviews, pushes) — 90 days of history.
- **Time-windowed.** `since` filter keeps only events after a date — ideal for daily/weekly delta runs.
- **Triage-ready schema.** Every event carries `type` (commit/pull/issue/release), `repo`, `actor`, `title`, `state`, `createdAt`, `additions`/`deletions` (PRs), `labels`, `tagName`/`isPrerelease` (releases), and `url`.
- **AI-agent friendly.** Predictable fields, ISO dates, nullable values. Drop straight into a prompt or a vector store.
- **No keys, no browser.** Pure HTTP + JSON API on a small Node 20 container, with Apify proxy IP rotation to spread GitHub's keyless 60 req/hr/IP limit. Optional token raises to 5000/hr.

---

### ✨ Key features

- **📦 Commits** — `/repos/{o}/{r}/commits?since=…` paginated. First-line message as `title`, author + date.
- **🔀 Pull requests** — `/repos/{o}/{r}/pulls?state=all&sort=created` paginated + `since` filter. `additions`, `deletions`, `commits`, `merged`, `state`, `labels`.
- **❗ Issues** — `/repos/{o}/{r}/issues?state=all&since=…` (PRs filtered out — they come from `/pulls`). `state`, `labels`.
- **🏷️ Releases** — `/repos/{o}/{r}/releases` paginated. `tagName`, `isPrerelease`, `name`, publish date.
- **👤 User events** — `/users/{u}/events/public` (up to 10 pages, 90 days). Push/PR/issue/review events.
- **🏢 Org scan** — `/orgs/{org}/repos?type=public&sort=updated` then per-repo activity. Cap with `maxOrgRepos`.
- **📅 Time window** — `since` (ISO date) filters commits/issues/PRs to a delta window.
- **🌐 Proxy IP rotation** — Apify datacenter proxy rotates IPs per request to mitigate GitHub's keyless 60 req/hr/IP. Optional `ghToken` for 5000/hr.
- **🔁 Retry/backoff** — 403 (rate-limit) and 5xx trigger exponential backoff retry (up to 6 attempts).
- **💰 Pay-per-result** — charged per saved event, not per run. Empty results are free.

---

### 🤖 Why AI agents need this

Dev activity is high-signal, high-frequency grounding for coding agents — and tedious to collect. Each GitHub object type is a separate endpoint with pagination, rate limits and schema quirks. An agent that hits them directly reinvents merging and normalization every time, and burns the 60/hr keyless limit fast. `github-activity-stream` wraps it all into one reliable, proxy-rotated, pay-per-result Actor:

1. **Weekly dev summary agent.** A coding agent runs `repo` mode with `since: <7 days ago>` on a watched repo, summarizes the commits/PRs/releases, and posts a digest.
2. **Release tracker.** An agent watches `releases` for a dependency org (`kubernetes`, `vercel`), alerts on new versions, and drafts upgrade notes from the release bodies.
3. **Security-commit detector.** An agent scans recent commits for `security`, `cve`, `vuln`, `fix` keywords and flags them.
4. **Dependency health.** An agent pulls issues (open count, stale, label distribution) and PRs (merge velocity) to score a repo's maintenance health before adoption.
5. **Contributor monitoring.** An agent tracks a key maintainer's public events (`user` mode) to spot activity shifts.
6. **Org-wide radar.** An agent scans an entire org's repos (`org` mode) for recent activity to map where work is happening.
7. **RAG over dev activity.** Embed commit messages + PR titles into a vector store; answer "when did X get fixed?" with citations to the exact commit.

Each of these is one Actor call (or a scheduled run). The output is a table of events ready for an LLM to summarize, filter, or alert on.

---

### 📦 What you get (output schema)

Every run streams **one activity event per row** to the default dataset. A pull request row looks like:

```json
{
  "repo": "microsoft/vscode",
  "type": "pull",
  "number": 210543,
  "title": "Fix terminal rendering on macOS",
  "action": null,
  "state": "closed",
  "actor": "user123",
  "createdAt": "2026-06-28T10:00:00Z",
  "updatedAt": "2026-07-01T15:00:00Z",
  "additions": 142,
  "deletions": 38,
  "commits": 3,
  "labels": ["bug", "terminal"],
  "merged": true,
  "isPrerelease": null,
  "tagName": null,
  "url": "https://github.com/microsoft/vscode/pull/210543",
  "scrapedAt": "2026-07-02T12:00:00.000Z"
}
````

A release row carries `type: "release"`, `tagName: "1.21.0"`, `isPrerelease: false`. A commit row carries `type: "commit"`, the first-line message as `title`. A user event carries the event `type` (PushEvent, PullRequestEvent, …).

Use the **Overview** view to scan all events, or the **By type** view to pivot on commit/PR/issue/release.

***

### 🚀 How to use

#### 1. Single repo weekly activity

```json
{
  "mode": "repo",
  "repos": ["microsoft/vscode"],
  "eventTypes": ["commits", "pulls", "issues", "releases"],
  "since": "2026-06-25",
  "maxPerType": 200
}
```

#### 2. Org-wide scan (monitor an ecosystem)

```json
{
  "mode": "org",
  "org": "kubernetes",
  "maxOrgRepos": 15,
  "eventTypes": ["pulls", "releases"],
  "since": "2026-06-01"
}
```

#### 3. User public activity

```json
{
  "mode": "user",
  "user": "torvalds",
  "maxPerType": 100
}
```

#### 4. Bulk: many repos

```json
{
  "mode": "bulk",
  "repos": ["facebook/react", "vercel/next.js", "microsoft/typescript"],
  "since": "2026-06-01"
}
```

#### From code (Apify SDK)

```js
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('logiover/github-activity-stream').call({
  mode: 'repo',
  repos: ['microsoft/vscode'],
  since: '2026-06-25',
  eventTypes: ['commits', 'releases'],
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
const releases = items.filter(i => i.type === 'release');
console.log(`${releases.length} releases this week`);
```

#### As an MCP tool for AI agents

Wrap this Actor in an MCP server. A coding agent calls the tool with a repo + time window and receives normalized activity — no GitHub API juggling, no rate-limit handling on the agent side.

***

### 🔧 Input fields

| Field | Type | Default | Description |
|---|---|---|---|
| `mode` | enum | `repo` | `repo` (one repo), `org` (all org repos), `user` (user events), `bulk` (many repos). |
| `repos` | array | — | `owner/repo` slugs for `repo`/`bulk` modes. |
| `org` | string | — | Org slug for `org` mode. |
| `user` | string | — | Username for `user` mode. |
| `eventTypes` | array | all | Which types: `commits`, `pulls`, `issues`, `releases`. |
| `since` | string | — | ISO date; only events after this. |
| `maxPerType` | int | 200 | Cap per type per repo (1–1000). |
| `maxOrgRepos` | int | 20 | Cap on repos in `org` mode (1–200). |
| `ghToken` | string | — | Optional GitHub token (60→5000 req/hr). |
| `useApifyProxy` | bool | true | Route through Apify datacenter proxy (IP rotation). |

***

### 🧩 How it works

1. **Resolve targets.** `repo`/`bulk` use the `repos` list. `org` lists public repos (`/orgs/{org}/repos?type=public&sort=updated`), capped at `maxOrgRepos`. `user` targets the user event feed.
2. **Fetch per type.** For each repo, fetch the enabled types concurrently-ish (sequentially per type, paginated): commits (`/commits?since=…`), PRs (`/pulls?state=all&sort=created` + client-side `since` filter), issues (`/issues?state=all&since=…`, PRs filtered), releases (`/releases`).
3. **IP rotation.** Each request goes through the Apify datacenter proxy (rotating source IP) to mitigate GitHub's keyless 60 req/hr/IP. A `ghToken` (if provided) raises the limit to 5000/hr and is sent as `Authorization: Bearer`.
4. **Retry/backoff.** 403 (rate-limit) and 5xx trigger exponential backoff (up to 6 attempts). 404 (deleted/private repo) is treated as graceful empty.
5. **Normalize.** Each object is mapped to a common record: `type`, `repo`, `number`, `title`, `actor`, `createdAt`, `updatedAt`, `state`, `additions`/`deletions`/`commits` (PRs), `labels`, `merged` (PRs), `tagName`/`isPrerelease` (releases), `url`.
6. **Stream.** Each event is pushed to the dataset and one `result` event is charged.

***

### 💡 Tips & best practices

- **Use `since` for deltas.** Without it, you pull full history (capped by `maxPerType`). For monitoring, always set `since` to the last run time.
- **Schedule weekly repo runs.** `since: <7 days ago>` each week for a digest. Big repos (linux, vscode) yield hundreds of events.
- **`org` mode for ecosystems.** Monitoring `kubernetes` or `vercel`? `org` mode + `maxOrgRepos: 15` + `eventTypes: ["pulls","releases"]` gives you the org's recent output in one run.
- **Trim types for speed.** If you only need releases, set `eventTypes: ["releases"]`. Commits are the highest-volume (and slowest) type.
- **Provide a `ghToken` for heavy use.** Keyless (60/hr/IP) is fine for monitoring a few repos via proxy rotation; for org-wide scans or frequent runs, a token (5000/hr) is much faster.
- **Detect security commits.** Filter commit/PR `title` for `security|cve|vuln|fix|patch` to surface security work; pair with `cve-security-advisory-monitor`.
- **Combine with related Actors.** Pair with `cve-security-advisory-monitor` (vuln DB), `certificate-transparency-monitor` (infra), and `docs-knowledge-base-scraper` (chunk the repo's docs).

***

### ❓ FAQ

#### Does this Actor need any API keys?

No. GitHub's API is keyless (60 req/hr/IP). The Apify proxy rotates IPs per request to effectively remove that cap. For heavy use, provide a `ghToken` (free Personal Access Token) to raise to 5000/hr.

#### Why doesn't it fetch commit additions/deletions?

The `/commits` list endpoint doesn't return per-commit stats (only the detail endpoint does). Fetching each commit's detail would multiply requests heavily. PR rows do carry `additions`/`deletions`/`commits` from the PR object. For per-commit stats, post-process by fetching specific commit URLs.

#### How far back can I go?

Commits/issues/PRs: as far as the repo history goes (capped by `maxPerType`). User events: GitHub keeps only 90 days of public events (10 pages max). Releases: all of them.

#### Does it work for private repos?

No. It uses public endpoints without auth (or with a token's public scope). For private repos, the token would need `repo` scope — but this Actor targets public monitoring.

#### Why are some PRs/commits missing the actor?

GitHub anonymizes some commits (noreply emails) or the author has no GitHub account. `actor` is null in those cases.

#### How is this priced?

Pay-per-result: one `result` event per saved activity row. Runs that yield zero events (empty/deleted repo) are free.

#### Will I get rate-limited?

Keyless is 60 req/hr/IP. Proxy rotation spreads this; a `ghToken` removes the concern. 403s trigger backoff retry.

#### Can AI agents call this directly?

Yes. Expose it through an MCP server or Apify tool integration; the agent passes a repo + time window and gets normalized activity back. This is the primary design target.

***

### 🔗 Related Actors

- **cve-security-advisory-monitor** — vulnerability DB (NVD/GHSA/OSV) for security context.
- **certificate-transparency-monitor** — new TLS certs (infra/attack-surface).
- **github-repository-scraper** — repo metadata search (complementary, search-focused).
- **npm-package-intelligence-scraper** — npm package metadata.
- **docs-knowledge-base-scraper** — chunk a repo's docs site for RAG.

***

### 📝 Changelog

#### 2026-07-02 — v1.0

- Initial release.
- 4 modes: `repo`, `org`, `user`, `bulk`.
- 4 event types: commits, pulls, issues, releases (+ user public events).
- `since` time window, pagination, `maxPerType`/`maxOrgRepos` caps.
- Optional `ghToken` (60→5000 req/hr).
- Apify datacenter proxy default (IP rotation).
- Pay-per-result (`result` event per saved event).

***

### ⚖️ Disclaimer

This Actor queries the public GitHub REST API (keyless or with a user-supplied token). Activity data is owned by the respective repository owners and contributors; respect GitHub's Terms of Service and rate limits. Use for dev monitoring, dependency tracking and AI-agent grounding on data that is already public.

# Actor input Schema

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

What to monitor.

• **repo** — activity for one repo (commits + PRs + issues + releases) (highest volume per target)
• **org** — all public repos of an org, each with activity
• **user** — a user's public events + their repos
• **bulk** — many repos/orgs in one run

## `repos` (type: `array`):

Array of `owner/repo` slugs for **repo** or **bulk** mode, e.g. `microsoft/vscode`, `facebook/react`.

## `org` (type: `string`):

GitHub organization slug for **org** mode, e.g. `kubernetes`, `vercel`.

## `user` (type: `string`):

GitHub username for **user** mode, e.g. `torvalds`.

## `eventTypes` (type: `array`):

Which activity types to collect. Defaults to all. Fewer = faster.

## `since` (type: `string`):

Only events after this date (YYYY-MM-DD or full ISO). Leave empty for all history (capped by maxResults).

## `maxPerType` (type: `integer`):

Cap per event type per repo (commits, PRs, issues, releases each).

## `maxOrgRepos` (type: `integer`):

Cap on repos to scan in org mode.

## `ghToken` (type: `string`):

Optional GitHub Personal Access Token (raises rate limit from 60 to 5000 req/hr). Leave empty for keyless (proxy rotation spreads the 60/hr/IP limit).

## `useApifyProxy` (type: `boolean`):

Route through Apify datacenter proxy (IP rotation). GitHub keyless is 60 req/hr/IP; rotation effectively removes the cap.

## Actor input object example

```json
{
  "mode": "repo",
  "repos": [
    "microsoft/vscode"
  ],
  "org": "kubernetes",
  "user": "torvalds",
  "eventTypes": [
    "commits",
    "pulls",
    "issues",
    "releases"
  ],
  "since": "2026-06-01",
  "maxPerType": 100,
  "maxOrgRepos": 10,
  "ghToken": "",
  "useApifyProxy": true
}
```

# Actor output Schema

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

Full dataset of normalized GitHub activity events.

# 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": "repo",
    "repos": [
        "microsoft/vscode"
    ],
    "org": "kubernetes",
    "user": "torvalds",
    "eventTypes": [
        "commits",
        "pulls",
        "issues",
        "releases"
    ],
    "since": "",
    "maxPerType": 100,
    "maxOrgRepos": 10,
    "useApifyProxy": true
};

// Run the Actor and wait for it to finish
const run = await client.actor("logiover/github-activity-stream").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": "repo",
    "repos": ["microsoft/vscode"],
    "org": "kubernetes",
    "user": "torvalds",
    "eventTypes": [
        "commits",
        "pulls",
        "issues",
        "releases",
    ],
    "since": "",
    "maxPerType": 100,
    "maxOrgRepos": 10,
    "useApifyProxy": True,
}

# Run the Actor and wait for it to finish
run = client.actor("logiover/github-activity-stream").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 '{
  "mode": "repo",
  "repos": [
    "microsoft/vscode"
  ],
  "org": "kubernetes",
  "user": "torvalds",
  "eventTypes": [
    "commits",
    "pulls",
    "issues",
    "releases"
  ],
  "since": "",
  "maxPerType": 100,
  "maxOrgRepos": 10,
  "useApifyProxy": true
}' |
apify call logiover/github-activity-stream --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "GitHub Activity Stream — AI Agent Dev Monitoring API",
        "description": "Keyless GitHub activity stream for AI agents: commits, pull requests, issues, releases and events for any repo, org or user. Time-windowed, paginated, thousands of events per run. Actors, additions, labels, states and URLs per row. No API key, no browser.",
        "version": "1.0",
        "x-build-id": "Vh358gMVT6VbSUXKF"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/logiover~github-activity-stream/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-logiover-github-activity-stream",
                "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~github-activity-stream/runs": {
            "post": {
                "operationId": "runs-sync-logiover-github-activity-stream",
                "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~github-activity-stream/run-sync": {
            "post": {
                "operationId": "run-sync-logiover-github-activity-stream",
                "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",
                "required": [
                    "mode"
                ],
                "properties": {
                    "mode": {
                        "title": "Mode",
                        "enum": [
                            "repo",
                            "org",
                            "user",
                            "bulk"
                        ],
                        "type": "string",
                        "description": "What to monitor.\n\n• **repo** — activity for one repo (commits + PRs + issues + releases) (highest volume per target)\n• **org** — all public repos of an org, each with activity\n• **user** — a user's public events + their repos\n• **bulk** — many repos/orgs in one run",
                        "default": "repo"
                    },
                    "repos": {
                        "title": "Repos (repo & bulk mode)",
                        "type": "array",
                        "description": "Array of `owner/repo` slugs for **repo** or **bulk** mode, e.g. `microsoft/vscode`, `facebook/react`.",
                        "items": {
                            "type": "string"
                        },
                        "default": []
                    },
                    "org": {
                        "title": "Org (org mode)",
                        "type": "string",
                        "description": "GitHub organization slug for **org** mode, e.g. `kubernetes`, `vercel`."
                    },
                    "user": {
                        "title": "User (user mode)",
                        "type": "string",
                        "description": "GitHub username for **user** mode, e.g. `torvalds`."
                    },
                    "eventTypes": {
                        "title": "Event types",
                        "type": "array",
                        "description": "Which activity types to collect. Defaults to all. Fewer = faster.",
                        "items": {
                            "type": "string"
                        },
                        "default": [
                            "commits",
                            "pulls",
                            "issues",
                            "releases"
                        ]
                    },
                    "since": {
                        "title": "Since (ISO date)",
                        "type": "string",
                        "description": "Only events after this date (YYYY-MM-DD or full ISO). Leave empty for all history (capped by maxResults)."
                    },
                    "maxPerType": {
                        "title": "Max events per type",
                        "minimum": 1,
                        "maximum": 1000,
                        "type": "integer",
                        "description": "Cap per event type per repo (commits, PRs, issues, releases each).",
                        "default": 200
                    },
                    "maxOrgRepos": {
                        "title": "Max org repos (org mode)",
                        "minimum": 1,
                        "maximum": 200,
                        "type": "integer",
                        "description": "Cap on repos to scan in org mode.",
                        "default": 20
                    },
                    "ghToken": {
                        "title": "GitHub token (optional)",
                        "type": "string",
                        "description": "Optional GitHub Personal Access Token (raises rate limit from 60 to 5000 req/hr). Leave empty for keyless (proxy rotation spreads the 60/hr/IP limit).",
                        "default": ""
                    },
                    "useApifyProxy": {
                        "title": "Use Apify datacenter proxy",
                        "type": "boolean",
                        "description": "Route through Apify datacenter proxy (IP rotation). GitHub keyless is 60 req/hr/IP; rotation effectively removes the cap.",
                        "default": 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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
