# Changelog / Docs Monitor API (`s3nafps/changelog-docs-monitor-api`) Actor

Extract recent product, docs, changelog, RSS, and GitHub release updates from public sources.

- **URL**: https://apify.com/s3nafps/changelog-docs-monitor-api.md
- **Developed by:** [mohamed senator](https://apify.com/s3nafps) (community)
- **Categories:** Developer tools, SEO tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-usage

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

## Changelog / Docs Monitor API

Extract recent product, documentation, changelog, RSS, sitemap, and GitHub release updates from public sources.

### What this Actor does

Changelog / Docs Monitor API reads public update sources, extracts recent items, detects change-related keywords, classifies likely update types, and saves structured records to the Apify Dataset.

It supports GitHub releases URLs, RSS/Atom feeds, sitemap XML, changelog pages, docs pages, and HTML fallback links.

### Use cases

- Monitor competitor changelogs.
- Track docs and API updates.
- Watch GitHub releases.
- Build release-note datasets.
- Surface possible breaking, security, deprecation, pricing, or API changes.

### Who this is for

Product teams, developer relations teams, competitive intelligence teams, agencies, platform teams, and AI agents that need recent public product changes.

### Input

- `sources` - Public changelog URLs, docs URLs, RSS/Atom feeds, GitHub releases URLs, or sitemap URLs. Required, 1-50 items.
- `daysBack` - Filter dated items to this recent window. Default: `30`, maximum: `365`.
- `maxItemsPerSource` - Maximum updates returned for each source. Default: `100`, maximum: `500`.
- `includeChangeKeywords` - Return important change keywords such as breaking, deprecated, API, and security. Default: `true`.

### Example input

```json
{
  "sources": ["https://github.com/apify/crawlee/releases", "https://docs.apify.com/changelog"],
  "daysBack": 30,
  "maxItemsPerSource": 50,
  "includeChangeKeywords": true
}
````

### Output

The Actor saves one Dataset item per detected update.

- `sourceUrl` - Source URL from the input.
- `itemUrl` - URL for the detected update.
- `title` - Update title when available.
- `publishedDate`, `modifiedDate` - Dates from the source when available.
- `category` - Feed category when available.
- `tags` - Feed tags or release tags.
- `excerpt` - Short update excerpt.
- `detectedUpdateType` - Heuristic type such as `github_release`, `breaking_change`, `security_update`, `deprecation_notice`, `api_docs_update`, `changelog_entry`, `docs_page`, or `unknown`.
- `importantKeywords` - Matched change keywords when enabled.
- `breakingChangePossible`, `apiChangePossible`, `securityChangePossible` - Boolean flags inferred from keywords and type.
- `scrapedAt` - ISO timestamp for the run.
- `discoveredFrom` - Discovery method such as `github_releases_api`, `rss_atom`, `sitemap`, or `html_page`.
- `extractionStatus` - `succeeded` or `failed`.
- `errorMessage` - Failure reason when no updates are found or a source request fails.

### Example output

```json
{
  "sourceUrl": "https://github.com/apify/crawlee/releases",
  "itemUrl": "https://github.com/apify/crawlee/releases/tag/v1.0.0",
  "title": "v1.0.0",
  "publishedDate": "2026-07-01T00:00:00Z",
  "modifiedDate": "2026-07-01T00:00:00Z",
  "category": null,
  "tags": ["v1.0.0"],
  "excerpt": "Release notes...",
  "detectedUpdateType": "github_release",
  "importantKeywords": ["release"],
  "breakingChangePossible": false,
  "apiChangePossible": false,
  "securityChangePossible": false,
  "scrapedAt": "2026-07-04T00:00:00.000Z",
  "discoveredFrom": "github_releases_api",
  "extractionStatus": "succeeded",
  "errorMessage": null
}
```

### How it works

- Reads the Actor input.
- Normalizes and deduplicates public sources.
- Uses the GitHub Releases API for GitHub release pages.
- Parses RSS/Atom feeds and sitemap XML when detected.
- Falls back to links found on public HTML pages.
- Filters dated items by `daysBack` when dates are available.
- Saves structured update records to the Apify Dataset.

### Limitations

- Public sources only.
- No login, private data, cookies, CAPTCHA bypass, or restricted content.
- Date filtering only applies when sources expose parseable dates.
- HTML fallback is heuristic and may miss updates on unusual page structures.
- No guaranteed completeness across every docs or changelog system.
- Dynamic sites may need a browser-based upgrade.

### Error handling

Invalid or empty `sources` input fails run validation. Failed requests return a failed Dataset item with `extractionStatus: "failed"` and `errorMessage`. Sources with no detected updates return a failed item with `No updates found` so empty results are visible.

### Troubleshooting

- If no updates are found, increase `daysBack` or confirm the source exposes recent public dates, feed entries, releases, or update links.
- If GitHub releases are missing, use the repository's `/releases` URL.
- If RSS or Atom results are incomplete, confirm the feed is public and valid XML.
- If docs-page results are broad, provide a more specific changelog, release, sitemap, or feed URL.

### API usage

```bash
curl -X POST "https://api.apify.com/v2/acts/USERNAME~changelog-docs-monitor-api/runs?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "sources": ["https://github.com/apify/crawlee/releases"],
    "daysBack": 30,
    "maxItemsPerSource": 50,
    "includeChangeKeywords": true
  }'
```

### Integration ideas

- Schedule weekly release monitoring.
- Send possible breaking or security updates to Slack.
- Feed update records into a product intelligence dashboard.
- Pair with Sitemap Intelligence API to discover docs or changelog URLs.

### SEO keywords

changelog API, docs monitor, GitHub releases API, RSS monitor, release notes scraper, product updates, API change monitor, deprecation monitor, security updates, Apify changelog actor

### Ethical use

This Actor is designed for public data and user-provided URLs only. Do not use it to access private, login-protected, or restricted content.

# Actor input Schema

## `sources` (type: `array`):

Changelog URLs, docs URLs, RSS/Atom feeds, GitHub releases URLs, or sitemap URLs.

## `daysBack` (type: `integer`):

Filter dated items to this recent window.

## `maxItemsPerSource` (type: `integer`):

Maximum updates to return for each source.

## `includeChangeKeywords` (type: `boolean`):

Return important change keywords such as breaking, deprecated, API, and security.

## Actor input object example

```json
{
  "sources": [
    "https://github.com/apify/crawlee/releases"
  ],
  "daysBack": 30,
  "maxItemsPerSource": 100,
  "includeChangeKeywords": true
}
```

# Actor output Schema

## `results` (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 = {
    "sources": [
        "https://github.com/apify/crawlee/releases"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("s3nafps/changelog-docs-monitor-api").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 = { "sources": ["https://github.com/apify/crawlee/releases"] }

# Run the Actor and wait for it to finish
run = client.actor("s3nafps/changelog-docs-monitor-api").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 '{
  "sources": [
    "https://github.com/apify/crawlee/releases"
  ]
}' |
apify call s3nafps/changelog-docs-monitor-api --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Changelog / Docs Monitor API",
        "description": "Extract recent product, docs, changelog, RSS, and GitHub release updates from public sources.",
        "version": "0.1",
        "x-build-id": "gxp6mVtl8P3UZx7He"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/s3nafps~changelog-docs-monitor-api/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-s3nafps-changelog-docs-monitor-api",
                "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/s3nafps~changelog-docs-monitor-api/runs": {
            "post": {
                "operationId": "runs-sync-s3nafps-changelog-docs-monitor-api",
                "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/s3nafps~changelog-docs-monitor-api/run-sync": {
            "post": {
                "operationId": "run-sync-s3nafps-changelog-docs-monitor-api",
                "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": [
                    "sources"
                ],
                "properties": {
                    "sources": {
                        "title": "Public sources",
                        "minItems": 1,
                        "maxItems": 50,
                        "type": "array",
                        "description": "Changelog URLs, docs URLs, RSS/Atom feeds, GitHub releases URLs, or sitemap URLs.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "daysBack": {
                        "title": "Days back",
                        "minimum": 1,
                        "maximum": 365,
                        "type": "integer",
                        "description": "Filter dated items to this recent window.",
                        "default": 30
                    },
                    "maxItemsPerSource": {
                        "title": "Maximum items per source",
                        "minimum": 1,
                        "maximum": 500,
                        "type": "integer",
                        "description": "Maximum updates to return for each source.",
                        "default": 100
                    },
                    "includeChangeKeywords": {
                        "title": "Include change keywords",
                        "type": "boolean",
                        "description": "Return important change keywords such as breaking, deprecated, API, and security.",
                        "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
