# GitHub Releases Monitor and Scraper for Public Repos

> GitHub releases monitor for public repos: release notes, dates and asset details as JSON or CSV. Compare a past snapshot to find new releases.

URL: https://cliqtomedia.com/actors/github-releases-monitor-scraper/

Category: Developer & website monitoring · Status: live on Apify Store · Apify page: https://apify.com/cliqtomedia/github-releases-monitor-scraper?fpr=cliqto

Add up to 10 public repositories and get their releases as rows. Each row has notes, dates and asset details. Give an old snapshot to see what is new or changed.

## How to use it: 3 steps

1. **Make a free Apify account.** Apify is the cloud platform where our tools run. The free plan gives you $5 of usage every month, no credit card needed. You pay Apify, not us.
2. **Paste your input and press Start.** No code needed: you fill in a form (the input). It already has a working example. For example: `cli/cli` in Public repositories. Each start is one run.
3. **Download the results.** When the run ends, the results are in a table (the dataset). Open Output, press Export and pick Excel or CSV. JSON and the API are there too.

## What it does

Read published releases from known public GitHub repositories. Get release notes in Markdown, dates, stable release IDs and asset metadata. Compare your own previous snapshot to find new or changed releases.





## Price

Pay per event. Apify bills you, not us.

| What you pay for | Price | When |
|---|---|---|
| Start fee | $0.05 | Charged once per run. This tool uses 1 GB of memory or less by default; more memory costs more. |
| Published release saved | $0.0027 | One published release row saved in the default Dataset. Includes notes and retained asset metadata. |

- One release: about $0.05.
- 1,000 releases: about $2.75.
- Every day 100 releases, for 30 days: about $9.60 a month.

Free to try: the Apify free plan gives you $5 of usage every month, no credit card needed.

Prices checked on 24 October 2026. Current price: https://apify.com/cliqtomedia/github-releases-monitor-scraper?fpr=cliqto

## Questions

### Do I need a GitHub token?

No. It works without one. A token can help when the shared limit is used up.

### Can it read private repos?

No. It reads only public repositories.

### Does it download release files?

No. It saves file details and links, not the files.

### Are tags without a release included?

No. Only published GitHub Releases are returned.

### Can I scrape private repositories with my token?

No. The Actor first checks that the repository is anonymously accessible. A 404 cannot distinguish a missing repository from a private one.

### Does latest include prereleases or find the highest version?

No. It uses GitHub's stable latest endpoint. List mode can include prereleases. The Actor does not sort semantic versions.

### Does an unchanged run return zero rows?

Only if you pass a matching `previousSnapshot` and set `onlyChanges=true`. With the default `onlyChanges=false`, you still get current release rows with `change=unchanged`.

### Does a missing release mean it was removed?

Only when both scans have a complete and comparable full list history. Bounded windows and latest mode do not prove deletion. The baseline must be your real previous snapshot.

### Do download counts trigger a changed release?

No. Counts are returned as current metadata but excluded from the fingerprint. Notes, names, dates and retained asset metadata can trigger a change.

## Data fields

- `id` (string)
- `repository` (string)
- `owner` (string)
- `repositoryName` (string)
- `repositoryUrl` (string)
- `releaseId` (integer)
- `tagName` (string)
- `name` (string)
- `body` (string)
- `notesFormat` (string)
- `createdAt` (string)
- `publishedAt` (string)
- `prerelease` (boolean)
- `releaseUrl` (string)
- `author` (object)
- `assets` (array)
- `notesTruncated` (boolean)
- `assetsTruncated` (boolean)
- `retrievedAt` (string)
- `change` (string)

## Input settings

- `repositories` (array, required): 1–10 public owner/name values or exact https://github.com/owner/name URLs. Duplicates share one scan. API input must supply this field.
- `mode` (string): List a bounded source window, or use GitHub latest stable release. Latest does not mean highest semantic version.
- `includePrereleases` (boolean): Keep prereleases in list mode. Latest always returns a stable release.
- `maxReleasesPerRepository` (integer): Bound the source scan before filters. 1–500 raw releases per repository; includes skipped prereleases.
- `maxResults` (integer): 1–1000 saved Dataset rows in this run. A filter or unchanged scan can still read the full source window.
- `onlyChanges` (boolean): Requires previousSnapshot. Save only added/changed releases. Off returns the current releases each time.
- `previousSnapshot` (object): Paste the full SNAPSHOT record from your previous run. Contract v1, matching mode/filter/window, up to 1000 fingerprint entries. No shared server state.
- `githubToken` (string): Optional existing user token for public repositories. Stored encrypted by Apify; never added to results. Anonymous demo needs no token. Private repositories are blocked.
- `maxRequests` (integer): 1–30 attempts total, including retries, redirects and public checks. No proxy rotation.
- `requestTimeoutSecs` (integer): 5–30 seconds per request, also bounded by the scan deadline.
- `deadlineSecs` (integer): 10–180 seconds for source work and retries. Leaves time to save summary before the Cloud timeout.

## Step by step on Apify

1. Open Input in Apify Console.
2. Keep the form example: `repositories` is `["cli/cli"]`, `mode` is `list`, and both release limits are `2`.
3. Leave `githubToken` empty and `onlyChanges` off.
4. Click Start. Use the default build and 256 MB memory.
5. Open the Dataset. Check `repository`, `releaseId`, `tagName` and `assets`. Open `RUN_SUMMARY` to check coverage.

## Use cases

| Task | Input | Useful output |
|---|---|---|
| Watch dependencies | Your known repositories; list or latest | `tagName`, `publishedAt`, `body`, `releaseUrl` |
| Check an asset catalogue | A CLI or desktop application's repo | Asset name, content type, size and download URL |
| Build a release-note report | Small list windows across several repos | Markdown notes, stable IDs and dates |
| Track release edits | Matching `previousSnapshot` | `change`, diff IDs and the current snapshot |

## Tips

- Start without a token. Add one only if you hit the GitHub rate limit.
- Use latest mode to get only the current stable release of each repo.
- Keep each run's snapshot. Use it next time to see what changed.

## Limits



- Up to 10 repository inputs, 500 raw releases per repository, 1,000 saved rows and 1,000 snapshot entries per run. A successful Cloud scan returned 1,000 real releases; smaller repositories can return fewer.
- Hard process deadline of 300 seconds; sequential requests; up to 30 attempts, two retries per request, 8 MiB per response and 32 MiB response bodies per run. No IP or proxy rotation to bypass GitHub quota.
- Anonymous GitHub REST requests are limited to 60 per hour per IP. Shared Cloud egress can use this quota before your run. Existing authenticated tokens often have higher limits, but secondary limits still apply. See GitHub rate limits.
- Source order is kept. No promise of all history, highest semantic version, every asset beyond the returned API array, or a consistent database snapshot while GitHub changes between pages.
- No private repositories, drafts, bare tags, issues, commit scraping, binary downloads, source mutations or repository search.
- A `partial` scan keeps useful saved rows. Reasons include `repository_limit`, `result_limit`, `snapshot_limit`, `request_limit`, `byte_limit`, `deadline`, `cancelled` and `charge_limit`. Check each repository outcome.
- No proxy is used. Rate-limit headers and `Retry-After` are respected. If the reset is outside the deadline, the run reports the rate limit instead of waiting for an hour.

## Sample result

```json
{
  "id": "cli/cli:399674740",
  "repository": "cli/cli",
  "owner": "cli",
  "repositoryName": "cli",
  "repositoryUrl": "https://github.com/cli/cli",
  "releaseId": 399674740,
  "tagName": "v2.102.0",
  "name": "GitHub CLI 2.102.0",
  "body": "## Security\n\nFour security vulnerabilities have been identified, and fixed, in this release. Users are advised to update gh to version `v2.102.0` as soon as possible.\n\n`gh release download`, `gh run download`, `gh repo read-file --output`, and `gh attestation download` could write remote content to an unintended local file when the destination contained symbolic links.\n\nSee https://github.com/cli/cli/security/advisories/GHSA-39wj-f2f4-978v for mo",
  "notesFormat": "markdown",
  "createdAt": "2026-09-30T02:18:02Z",
  "publishedAt": "2026-09-30T02:40:02Z",
  "prerelease": false,
  "releaseUrl": "https://github.com/cli/cli/releases/tag/v2.102.0",
  "author": {
    "login": "github-actions[bot]",
    "url": "https://github.com/apps/github-actions"
  },
  "assets": [
    {
      "id": 599854636,
      "name": "gh_2.102.0_checksums.txt",
      "contentType": "text/plain; charset=utf-8",
      "size": 1971,
      "downloadCount": 54188,
      "downloadUrl": "https://github.com/cli/cli/releases/download/v2.102.0/gh_2.102.0_checksums.txt"
    }
  ],
  "notesTruncated": false,
  "assetsTruncated": false,
  "retrievedAt": "2026-10-07T01:30:15.660Z",
  "change": "initial"
}
```

## Use it from code

Actor ID: `cliqtomedia/github-releases-monitor-scraper`

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("cliqtomedia/github-releases-monitor-scraper").call(run_input={
    "repositories": [
        "cli/cli"
    ],
    "mode": "list"
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)
```

```bash
curl -X POST "https://api.apify.com/v2/acts/cliqtomedia~github-releases-monitor-scraper/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"repositories": ["cli/cli"], "mode": "list"}'
```

```python
# pip install langchain-apify
# set APIFY_TOKEN in your environment
from langchain_apify import ApifyActorsTool

tool = ApifyActorsTool("cliqtomedia/github-releases-monitor-scraper")
result = tool.invoke({"run_input": {"repositories": ["cli/cli"], "mode": "list"}})
print(result)
```

run-sync waits up to 300 seconds; for longer runs start a run and use a webhook. LlamaIndex and MCP: https://cliqtomedia.com/actors/ai-agents/

## Use cases with this tool

- [Know what your competitors do](https://cliqtomedia.com/actors/use-cases/competitor-monitoring/): See what your competitors launch, hire, change and advertise. Every week, without opening their sites.

## Similar tools

- [RSS & Atom Feed Reader / Monitor](https://cliqtomedia.com/actors/rss-atom-feed-reader-monitor/)
- [Link Route Audit — Bulk HTTP Status & Redirects](https://cliqtomedia.com/actors/bulk-url-status-redirect-checker/)
- [Software End-of-Life Checker](https://cliqtomedia.com/actors/software-end-of-life-checker/)
- [Dependency Vulnerability Scanner (OSV)](https://cliqtomedia.com/actors/osv-dependency-vulnerability-scanner/)
- [GitHub Repositories & Users Search (No Login)](https://cliqtomedia.com/actors/github-search/)
- [OpenAPI Catalog & Breaking Change Detector](https://cliqtomedia.com/actors/openapi-spec-catalog-diff/)
