# GitHub Repo Monitor (`foxk1996/github-repo-monitor`) Actor

Create compact GitHub repository intelligence digests from api.github.com: stars, forks, issues, latest release, and deltas for a repo watchlist. Optional token supported.

- **URL**: https://apify.com/foxk1996/github-repo-monitor.md
- **Developed by:** [Kronos Fox](https://apify.com/foxk1996) (community)
- **Categories:** Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$10.00 / 1,000 repo digests

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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 Repo Monitor

Create compact repository intelligence digests from the public GitHub REST API. This Apify actor is designed for devtools marketers, venture analysts, product researchers, developer-relations teams, and founders who track a watchlist of GitHub projects and need clean, agent-friendly JSON instead of manually opening repository pages.

### GitHub repository monitoring for stars, forks, issues, and releases

The actor accepts repositories as `owner/name` strings or full GitHub repository URLs, then calls `api.github.com` to collect current repository signals. Each output row includes stars, forks, watchers, open issues, subscribers, language, topics, license, default branch, archive/fork status, created/updated/pushed timestamps, homepage, and repository URLs. When enabled, it also fetches the latest GitHub release and records the tag, name, URL, published date, prerelease flag, and draft flag.

### What you get

Every dataset row is a compact `repo-digest` object suitable for spreadsheets, dashboards, alerts, and LLM agents. The output includes a `summary` block with the highest-signal metrics and optional delta fields: star delta, fork delta, issue delta, whether the latest release changed, and the previous release tag. Provide a `previousSnapshot` keyed by `owner/repo` from an earlier run to populate deltas; omit it to get current snapshots only. Error rows are pushed for inaccessible repositories or transient API problems so one bad watchlist item never crashes the whole run.

### Use cases for devtools marketers and VCs

Use this actor to monitor competitor momentum, track open-source category leaders, build weekly devtools market reports, spot release activity after funding announcements, compare fast-growing infrastructure projects, qualify integration partners, or create lightweight alerts when a watched repository starts gaining stars quickly. Venture analysts can feed the compact JSON into notebooks or CRM enrichment. Developer marketing teams can use it to watch ecosystem projects and time campaigns around releases.

### How to use

Start with the default input (`psf/requests` and `octocat/Hello-World`) to produce a small digest in under five minutes. Add up to `maxRepos` repositories to the `repos` list. The actor truncates client-side exactly at `maxRepos`, uses timeouts on every request, and includes polite delays because unauthenticated GitHub API usage is limited to roughly 60 requests per hour. For larger watchlists, add an optional GitHub token in `githubToken`; the token is treated as a secret input and only used as an Authorization header.

### Pricing

This actor uses Apify pay-per-event pricing. The single paid event is `repo-digest` at $0.01 per successfully exported repository digest. There are no extra paid events for release lookups or error rows. Local, free, or non-PPE runs are capped by the built-in free-run guard.

### FAQ

#### Does this scrape GitHub web pages?

No. It only calls HTTP public endpoints under `api.github.com` and does not use proxies, browser automation, or logins.

#### Do I need a GitHub token?

No for small watchlists. Without a token, GitHub allows limited unauthenticated API use. Add a token only when you need higher rate limits or more reliable batch monitoring.

#### How are deltas calculated?

Pass `previousSnapshot` as an object keyed by repository name, such as `{"psf/requests": {"stargazersCount": 52000, "forksCount": 9500, "openIssuesCount": 300, "latestReleaseTag": "v2.31.0"}}`. The actor subtracts those baseline values from the current API response.

#### What happens if a repository has no releases?

The actor still exports the repository digest and leaves latest-release fields empty. Missing releases do not count as errors.

# Actor input Schema

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

GitHub repositories to monitor, formatted as owner/name or full GitHub repository URLs. One compact digest row is created per repository.
## `githubToken` (type: `string`):

Optional GitHub personal access token or fine-grained token for higher API rate limits. Leave empty for unauthenticated public API access (about 60 requests/hour).
## `maxRepos` (type: `integer`):

Maximum number of repositories to process from the watchlist. The actor truncates client-side exactly at this cap.
## `includeLatestRelease` (type: `boolean`):

Fetch each repository's latest release from the public GitHub releases endpoint and include release-tag/name/date fields when available.
## `previousSnapshot` (type: `object`):

Optional baseline keyed by owner/repo for delta fields. Each value may include stargazersCount, forksCount, openIssuesCount, and latestReleaseTag from a prior run.

## Actor input object example

```json
{
  "repos": [
    "psf/requests",
    "octocat/Hello-World"
  ],
  "maxRepos": 10,
  "includeLatestRelease": true
}
````

# 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 = {
    "repos": [
        "psf/requests",
        "octocat/Hello-World"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("foxk1996/github-repo-monitor").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 = { "repos": [
        "psf/requests",
        "octocat/Hello-World",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("foxk1996/github-repo-monitor").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 '{
  "repos": [
    "psf/requests",
    "octocat/Hello-World"
  ]
}' |
apify call foxk1996/github-repo-monitor --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "GitHub Repo Monitor",
        "description": "Create compact GitHub repository intelligence digests from api.github.com: stars, forks, issues, latest release, and deltas for a repo watchlist. Optional token supported.",
        "version": "0.1",
        "x-build-id": "850ZuKQ6ZM7as6FJ6"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/foxk1996~github-repo-monitor/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-foxk1996-github-repo-monitor",
                "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/foxk1996~github-repo-monitor/runs": {
            "post": {
                "operationId": "runs-sync-foxk1996-github-repo-monitor",
                "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/foxk1996~github-repo-monitor/run-sync": {
            "post": {
                "operationId": "run-sync-foxk1996-github-repo-monitor",
                "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": [
                    "repos"
                ],
                "properties": {
                    "repos": {
                        "title": "Repositories",
                        "type": "array",
                        "description": "GitHub repositories to monitor, formatted as owner/name or full GitHub repository URLs. One compact digest row is created per repository.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "githubToken": {
                        "title": "GitHub token (optional)",
                        "type": "string",
                        "description": "Optional GitHub personal access token or fine-grained token for higher API rate limits. Leave empty for unauthenticated public API access (about 60 requests/hour)."
                    },
                    "maxRepos": {
                        "title": "Max repositories",
                        "minimum": 1,
                        "maximum": 100,
                        "type": "integer",
                        "description": "Maximum number of repositories to process from the watchlist. The actor truncates client-side exactly at this cap.",
                        "default": 10
                    },
                    "includeLatestRelease": {
                        "title": "Include latest release",
                        "type": "boolean",
                        "description": "Fetch each repository's latest release from the public GitHub releases endpoint and include release-tag/name/date fields when available.",
                        "default": true
                    },
                    "previousSnapshot": {
                        "title": "Previous snapshot",
                        "type": "object",
                        "description": "Optional baseline keyed by owner/repo for delta fields. Each value may include stargazersCount, forksCount, openIssuesCount, and latestReleaseTag from a prior run."
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
