How to use it: 3 steps
- Make a free Apify accountApify 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.
- Paste your input and press StartNo code needed: you fill in a form (the input). It already has a working example. For example:
cli/cliin Public repositories. Each start is one run. - Download the resultsWhen 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.
This tool is an Apify Actor: a small program that runs on Apify. You can also run it on a schedule, for example every Monday. New to it? Read how it works, step by step and the 8 words you need first.
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.
Who uses it
Developers
Watch the tools and libraries your project depends on.
DevOps teams
Check asset names, sizes and download links of new builds.
Product and docs teams
Build a report of release notes with dates.
Price
Pay per event: you pay for each result the tool saves, plus a small start fee for each run. The price includes Apify platform costs. Apify bills you, not us. Prices below are for the Apify free plan.
| 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. |
Examples
- 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. That is enough for about 1,800 releases.
Prices checked on 24 October 2026. See the current price on Apify.
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.
Details
Step by step on Apify
- Open Input in Apify Console.
- Keep the form example:
repositoriesis["cli/cli"],modeislist, and both release limits are2. - Leave
githubTokenempty andonlyChangesoff. - Click Start. Use the default build and 256 MB memory.
- Open the Dataset. Check
repository,releaseId,tagNameandassets. OpenRUN_SUMMARYto 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 for better results
- 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 and good to know
- 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
partialscan keeps useful saved rows. Reasons includerepository_limit,result_limit,snapshot_limit,request_limit,byte_limit,deadline,cancelledandcharge_limit. Check each repository outcome - No proxy is used. Rate-limit headers and
Retry-Afterare respected. If the reset is outside the deadline, the run reports the rate limit instead of waiting for an hour
For developers
Sample result
One result from a real test run, in JSON. Real values change from run to run. In Excel or CSV each field is a column.
{
"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. You need your Apify API token from Apify Console → Settings → API & Integrations.
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)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"}'# 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)The cURL call waits for the results, up to 300 seconds. For longer runs, start a run (/runs) and get the results with a webhook or by checking the run. Apify API docs. LlamaIndex, MCP for AI agents and the JavaScript client: AI agents & MCP.
Data fields (20)
| Field | Type |
|---|---|
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 (11)
The main fields of the input form. With the API you send them as JSON.
| Setting | Name in the API | Type | Example value |
|---|---|---|---|
| Public repositories required | repositories | array | ["cli/cli"] |
| Release mode | mode | string | "list" |
| Include prereleases | includePrereleases | boolean | true |
| Releases examined per repository | maxReleasesPerRepository | integer | 2 |
| Maximum saved releases | maxResults | integer | 2 |
| Return only changes | onlyChanges | boolean | false |
| Previous snapshot | previousSnapshot | object | |
| Optional GitHub token | githubToken | string | |
| Maximum request attempts | maxRequests | integer | 20 |
| Request timeout in seconds | requestTimeoutSecs | integer | 20 |
| Scan deadline in seconds | deadlineSecs | integer | 120 |
Use cases with this tool
Each guide shows all the steps and the other tools.