# GitHub Releases Monitor & Scraper (`cliqtomedia/github-releases-monitor-scraper`) Actor

Read public GitHub release notes and asset metadata. Compare a previous snapshot to find new or changed releases. Start without a token and export JSON or CSV.

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

## Pricing

from $2.70 / 1,000 published release saveds

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/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

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.

Start with the small example in the Input form. No GitHub token is needed. The price is $0.05 per start plus $0.0027 per saved release. A source limit, rate limit or filter can make the result partial or empty. Check `RUN_SUMMARY` before using an empty result.

![GitHub Releases Monitor and Scraper: release notes, asset metadata, and snapshot comparison](https://api.apify.com/v2/key-value-stores/9lYjwy1W5AITjzKhv/records/github-releases-hero.png)

### Table of contents

- [What it does](#what-it-does)
- [Data you get](#data-you-get)
- [Quick start](#quick-start)
- [Input reference](#input-reference)
- [Input examples](#input-examples)
- [Output example](#output-example)
- [Output reference](#output-reference)
- [Price and cost examples](#price-and-cost-examples)
- [Use cases](#use-cases)
- [Monitoring and schedules](#monitoring-and-schedules)
- [API, export and integrations](#api-export-and-integrations)
- [Limits and partial results](#limits-and-partial-results)
- [Troubleshooting](#troubleshooting)
- [FAQ](#faq)
- [Related Actors](#related-actors)
- [Support](#support)

### What it does

Add up to 10 public repositories. Choose `list` for a bounded window of releases in GitHub source order. Choose `latest` for GitHub's selected stable release. Read the results as JSON or export CSV.

Use this Actor to watch software you depend on, collect release notes, or check asset names and download counts. It reads the [GitHub Releases REST API](https://docs.github.com/en/rest/releases/releases). A tag without a published Release is not a result.

### Data you get

Each Dataset row is one published release. It has the repository, immutable GitHub release ID, tag, nullable name and notes, dates, prerelease flag, release URL and author. Assets have IDs, names, sizes, content types, download counts and download URLs. The Actor reads metadata and does not download asset files.

Notes stay in Markdown. Notes may contain HTML text; the Actor does not render it. Notes are kept up to 20,000 UTF-16 code units and assets up to 100 per release. Flags show when these fields were cut.

### Quick start

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.

The example reads two releases each time. It reports `partial` because two releases are a small window, not the full repository history. The required `repositories` field has a UI **prefill**, not an API runtime default. API input `{}` fails validation; it does not run the demo for you.

### Input reference

| Field | Type / required | Runtime default / UI prefill | Allowed values | Effect and recommendation |
| --- | --- | --- | --- | --- |
| `repositories` | string array; required | no default; prefill `["cli/cli"]` | 1–10 input strings | Public `owner/name` or exact `https://github.com/owner/name`, with an optional final slash. Start with one repo. Case and duplicate values share one scan. |
| `mode` | string | `list` / `list` | `list`, `latest` | List a window or get the GitHub latest stable release. Latest is not a semantic-version sort. |
| `includePrereleases` | boolean | `true` / `true` | true, false | Filter prereleases in list mode. Latest always excludes them. |
| `maxReleasesPerRepository` | integer | `10` / `2` | 1–500 | Maximum raw releases examined per repo, before filtering. Skipped prereleases use this window. Latest examines at most one release. |
| `maxResults` | integer | `100` / `2` | 1–1,000 | Maximum saved Dataset rows across the run. Small output does not always mean a small source scan. |
| `onlyChanges` | boolean | `false` / `false` | true, false | Requires `previousSnapshot`. Saves only `added` and `changed` rows. Leave off for a repeatable demo. |
| `previousSnapshot` | object | absent / none | Snapshot v1, at most 1,000 entries | Paste your previous `SNAPSHOT` record. Mode, prerelease setting and per-repo window must match. Use the full record. |
| `githubToken` | secret string | absent / none | Existing token; letters, digits and underscore, up to 255 characters | Optional for public API requests. Apify encrypts this input. Do not put tokens in other fields. Private repositories stay blocked. |
| `maxRequests` | integer | `20` / none | 1–30 | Total attempts, including retries, redirects and public checks. Keep the default for a small scan. |
| `requestTimeoutSecs` | integer | `20` / none | 5–30 seconds | Timeout per request, within the scan deadline. |
| `deadlineSecs` | integer | `120` / none | 10–180 seconds | Deadline for scan work and retries. Keep the Cloud run timeout at 240–300 seconds so output can finish saving. |

Moved repository aliases can return a canonical GitHub URL with a new owner. The `repository`, `owner`, `repositoryName` and stable `id` keep your normalized input scope. Use one canonical name per repository; two different aliases are separate inputs.

Empty arrays, null settings, unknown fields, bad types and arbitrary URLs fail validation before source requests. URLs with credentials, query strings, fragments, encoded path parts or extra paths are not accepted. Omit an optional field to use its default; do not send `null`. A snapshot with a different scope fails validation.

#### Snapshot input fields

`previousSnapshot` uses the same fields as the `SNAPSHOT` output below. `contractVersion`, `scope`, `repositories` and `entries` are required. Every nested field listed there is required, including nullable coverage fields. Copy the whole record rather than making a new one by hand. Do not add credentials or release bodies to the snapshot.

#### Settings that work together

| Settings | Result |
| --- | --- |
| `mode=latest` + `includePrereleases=true` | GitHub latest still selects a stable release. |
| `includePrereleases=false` + small source window | The Dataset can be empty even when the repo has stable releases further back. Increase the window within the limits. |
| `onlyChanges=true` + unchanged snapshot | Empty Dataset; the new snapshot and coverage are still saved. Start price still applies. |
| `maxResults` or snapshot limit reached | Later work stops. A partial snapshot cannot prove deletion. |
| Optional token | An anonymous public-repository check happens first. It adds one request per repo. A token never gives access to private repos through this Actor. |

### Input examples

#### Two releases with notes and assets

```json
{
  "repositories": ["cli/cli"],
  "mode": "list",
  "includePrereleases": true,
  "maxReleasesPerRepository": 2,
  "maxResults": 2,
  "onlyChanges": false
}
```

Expect two release rows, with `releaseId`, `tagName`, `body` and `assets`. The list is a partial source window.

#### GitHub latest stable release

```json
{
  "repositories": ["react/react"],
  "mode": "latest"
}
```

Expect the release selected by GitHub's latest endpoint. A repo with no stable release returns zero rows and `complete`; a missing or inaccessible repo returns `not_found`.

#### Compare a previous scan

First run the list example and copy its `SNAPSHOT` record. Run the same example again with that object in `previousSnapshot`. Leave `onlyChanges=false` to keep the current release rows and see their `change` value. Use `onlyChanges=true` to keep only new or changed rows.

### Output example

```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"
}
```

This is a real row from the two-release example. For display, the notes are shown as a short excerpt and only the first asset is shown. The two truncation flags describe the actual run, not this shortened example. Download counts and current release tags can change.

### Output reference

All release fields below are present in every Dataset row. Nullable values come from the API; empty text is kept as empty text.

| Field | Type / null | Example | Meaning |
| --- | --- | --- | --- |
| `id` | string | `cli/cli:399674740` | Repository plus immutable release ID; use this to join scans. |
| `repository` | string | `cli/cli` | Normalized input owner/name, lower case. |
| `owner` | string | `cli` | Repository owner. |
| `repositoryName` | string | `cli` | Repository name without the owner. |
| `repositoryUrl` | string | `https://github.com/cli/cli` | Canonical public repository URL. A moved repository can have a different owner. |
| `releaseId` | integer | `399674740` | Immutable GitHub database ID, not the tag. |
| `tagName` | string | `v2.102.0` | Release tag as given by GitHub. |
| `name` | string or null | `GitHub CLI 2.102.0` | API release name. Empty and null are different. |
| `body` | string or null | `## Security` | Release notes in Markdown, up to 20,000 code units. |
| `notesFormat` | string | `markdown` | Notes format; does not mean rendered HTML. |
| `createdAt` | ISO string or null | `2026-09-30T02:34:29Z` | API creation time. It can refer to the release's commit time. |
| `publishedAt` | ISO string or null | `2026-09-30T02:40:02Z` | API publication time. |
| `prerelease` | boolean | `false` | Whether GitHub marks the release as a prerelease. |
| `releaseUrl` | string | URL in the example above | Canonical GitHub release page. |
| `author` | object or null | `{"login":"cli","url":"https://github.com/cli"}` | API author, when available. `login` and `url` are strings. |
| `assets` | array; empty allowed | See the example | Up to 100 asset records from the API; no binary download. |
| `notesTruncated` | boolean | `false` | Notes exceeded the retained limit. |
| `assetsTruncated` | boolean | `false` | The returned API asset array exceeded 100. |
| `retrievedAt` | ISO string | `2026-10-07T01:30:15.000Z` | Time this release was read. |
| `change` | string | `initial` | `initial` without a baseline; otherwise `added`, `changed` or `unchanged`. |

#### Asset fields

Each asset has all six fields: `id` (integer, API asset ID), `name` (string, file name), `contentType` (string or null, MIME type), `size` (integer bytes), `downloadCount` (integer downloads at fetch time) and `downloadUrl` (string, public GitHub download URL). For example, `size: 20747036` is metadata; these bytes were not downloaded by this Actor.

#### Dataset and Key-value store

| Surface | Contents |
| --- | --- |
| Default Dataset | Saved release rows only. Domain-empty and error results do not add fake release rows. |
| `OUTPUT` | `releases`, `repositories`, `snapshot`, `diff`, `summary`. Releases match the Dataset; the other fields match the records below. |
| `SNAPSHOT` | Fingerprints and coverage for your next scan. No token or notes body. |
| `RUN_SUMMARY` | Status, source scope, counters and reasons. Read it for empty or partial results. |

`SNAPSHOT.contractVersion` is integer `1`. `scope` has `mode` (list/latest), `includePrereleases` (boolean), `maxReleasesPerRepository` (integer; one in latest mode), `notesChars` (integer `20000`) and `assetsLimit` (integer `100`).

`SNAPSHOT.repositories` is an array of coverage objects. Each has `repository` (string), `status` (string), `fullHistory` (boolean), `reason` (string or null), `examined`, `emitted`, `attempts` (integers), `remaining` (integer or null, last API quota header) and `resetAt` (ISO string or null, last API reset header). Status is `complete`, `partial`, `not_found`, `rate_limited` or `error`. `fullHistory` is true only for a complete list scan with no next page. Latest is always a selected view, not full history.

`SNAPSHOT.entries` is an array of objects with `id`, `repository`, `fingerprint` (strings) and `releaseId` (integer). Fingerprints cover retained release fields. They exclude retrieval time and asset download counts. Changes beyond a truncated notes or assets window may not be detected.

`OUTPUT.diff` has `added`, `changed`, `removed` (arrays of stable ID strings) and `removalCheckedRepositories` (array of repo names). Removal is checked only when both scans cover a full list history with the same scope. A truncated list, latest scan, failed request or rate limit never proves removal. Added and changed arrays cover the successfully processed snapshot entries.

`RUN_SUMMARY` has `contractVersion` (integer), `status` (`complete`, `partial`, `error`, `invalid_input`), `reason` (string or null), `sourceCommit` (string), `startedAt`, `finishedAt` (ISO strings), `repositoryCount`, `releaseCount`, `examined`, `requests`, `retries`, `bytes`, `chargedRows` (integers), `stopped`, `authenticated` (booleans), and `repositories` (the coverage array above). `bytes` counts API response body bytes read; `requests` includes retries and redirects. `chargedRows` counts acknowledged saved rows; the platform billing record is the source for actual charges.

### Price and cost examples

The price is **$0.05 per Actor start + $0.0027 per saved release** ($2.70 per 1,000 release rows). Platform usage during a standard run is included. There are no proxy, token or asset-download events.

Start price applies to zero releases, a filter with no matches, and unchanged monitoring. Only Dataset release rows incur the release event. Duplicates in the input share one scan. Partial runs pay for the start and rows already saved. A failed or cancelled run may still have a start charge and saved rows. A storage acknowledgement failure is not replayed; a saved row and its charge cannot be made atomic across services.

| Saved releases in one standard run | Start | Release charge | Total |
| ---: | ---: | ---: | ---: |
| 0 | $0.05 | $0.00 | $0.05 |
| 1 | $0.05 | $0.0027 | $0.0527 |
| 10 | $0.05 | $0.027 | $0.077 |
| 100 | $0.05 | $0.27 | $0.32 |
| 1,000 | $0.05 | $2.70 | $2.75 |

These are event price calculations, not a promise of a fixed number of releases. Post-run storage reads, exports and retained storage may have standard Apify charges. Set a maximum total charge in Console or the API. If less than one more release fits, the Actor stops with `charge_limit`. A complete scan can still cost a start when no rows match.

### Use cases

| Job | 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 |

### Monitoring and schedules

You control the baseline. Save your run's `SNAPSHOT` and pass it to the next run. The Actor does not read a global state or another user's scan. If you keep `onlyChanges=false`, a repeat scan returns the current window even when nothing changed.

You may create an Apify schedule yourself for a list or latest snapshot. A schedule with changing baselines needs your own process to pass the previous `SNAPSHOT`. This Actor does not create a schedule or webhook and does not update a saved task for you.

### API, export and integrations

Start runs from Apify Console or the Actor API. Send JSON with `repositories` and the settings above. Use `maxTotalChargeUsd` as an API run option; it is not an Actor input field. Set memory to 256 MB and timeout to 240–300 seconds.

Read the default Dataset for releases, and the default Key-value store for `OUTPUT`, `RUN_SUMMARY` and `SNAPSHOT`. Dataset export supports JSON and CSV. In the [Apify run API](https://docs.apify.com/api/v2/actors-runs-post), the completed run gives you `defaultDatasetId`, `defaultKeyValueStoreId` and `buildId`. Use stable `id` values to join your records.

A downstream integration can start the run and read these storage records. This Actor does not include a custom MCP server or send messages to third-party services.

### Limits and partial results

- 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](https://docs.github.com/en/rest/using-the-rest-api/rate-limits-for-the-rest-api).
- 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.

### Troubleshooting

Use 256 MB memory. An unsupported resource setting fails with `RUN_SUMMARY.status=error` and `reason=resource_error`, before source requests. A longer Cloud timeout does not increase the source deadline or the 300-second process limit.

**Empty Dataset:** Check `RUN_SUMMARY`. A valid repo can have no releases, no stable latest release, no matching prereleases or no changes. A short window with `includePrereleases=false` may skip every entry. These cases differ from `not_found` and `rate_limited`.

**`rate_limited`:** Wait until the reported `resetAt`, reduce the scan or use an existing allowed token. Do not keep retrying against the same quota.

**`invalid_input`:** Check the required array, exact repo syntax, types and limits. For a snapshot, use the whole record with matching scope. API `{}` has no demo default.

**Missing fields or truncated notes:** Null comes from the API. Check `notesTruncated` and `assetsTruncated`. The retained window is also the comparison window.

**Run failed:** Read the safe reason in `RUN_SUMMARY`. An all-source failure ends the run as `FAILED`; it is not a successful empty scan. A storage failure can prevent the final records from being written. Keep the run ID for support.

### FAQ

#### Do I need a GitHub token?

No for the small demo. The optional `githubToken` field is encrypted using [Apify secret input](https://docs.apify.com/actors/development/actor-definition/input-schema/secret-input). Never paste it into repository URLs, notes or support messages. The authenticated path is covered by fixture tests; a live authenticated run has not been observed for this release.

#### 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.

### Related Actors

[RSS & Atom Feed Reader and Monitor](https://apify.com/cliqtomedia/rss-atom-feed-reader-monitor) reads feeds when your source publishes news or updates outside GitHub Releases.

### Support

Use the Actor's **Issues** tab in Apify Console for bugs or questions. Include the run ID, mode, public repository names and safe summary reason. Never include tokens, cookies or private account data.

# Actor input Schema

## `repositories` (type: `array`):

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` (type: `string`):

List a bounded source window, or use GitHub latest stable release. Latest does not mean highest semantic version.

## `includePrereleases` (type: `boolean`):

Keep prereleases in list mode. Latest always returns a stable release.

## `maxReleasesPerRepository` (type: `integer`):

Bound the source scan before filters. 1–500 raw releases per repository; includes skipped prereleases.

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

1–1000 saved Dataset rows in this run. A filter or unchanged scan can still read the full source window.

## `onlyChanges` (type: `boolean`):

Requires previousSnapshot. Save only added/changed releases. Off returns the current releases each time.

## `previousSnapshot` (type: `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` (type: `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` (type: `integer`):

1–30 attempts total, including retries, redirects and public checks. No proxy rotation.

## `requestTimeoutSecs` (type: `integer`):

5–30 seconds per request, also bounded by the scan deadline.

## `deadlineSecs` (type: `integer`):

10–180 seconds for source work and retries. Leaves time to save summary before the Cloud timeout.

## Actor input object example

```json
{
  "repositories": [
    "cli/cli"
  ],
  "mode": "list",
  "includePrereleases": true,
  "maxReleasesPerRepository": 2,
  "maxResults": 2,
  "onlyChanges": false,
  "maxRequests": 20,
  "requestTimeoutSecs": 20,
  "deadlineSecs": 120
}
```

# Actor output Schema

## `releases` (type: `string`):

No description

## `output` (type: `string`):

No description

## `summary` (type: `string`):

No description

## `snapshot` (type: `string`):

No description

# 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 = {
    "repositories": [
        "cli/cli"
    ],
    "mode": "list",
    "includePrereleases": true,
    "maxReleasesPerRepository": 2,
    "maxResults": 2,
    "onlyChanges": false
};

// Run the Actor and wait for it to finish
const run = await client.actor("cliqtomedia/github-releases-monitor-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 = {
    "repositories": ["cli/cli"],
    "mode": "list",
    "includePrereleases": True,
    "maxReleasesPerRepository": 2,
    "maxResults": 2,
    "onlyChanges": False,
}

# Run the Actor and wait for it to finish
run = client.actor("cliqtomedia/github-releases-monitor-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "repositories": [
    "cli/cli"
  ],
  "mode": "list",
  "includePrereleases": true,
  "maxReleasesPerRepository": 2,
  "maxResults": 2,
  "onlyChanges": false
}' |
apify call cliqtomedia/github-releases-monitor-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,cliqtomedia/github-releases-monitor-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/usp1E3elUZFclwSdw/builds/m9bjKEcdiDB2lMHPV/openapi.json
