# UN Press Release Monitor - Official Updates and Changes (`maydit/un-press-release-monitor`) Actor

Monitor official UN press-release listings with document codes, dates, source links and bounded publisher excerpts. Filter literal topics and compare saved releases. No API key.

- **URL**: https://apify.com/maydit/un-press-release-monitor.md
- **Developed by:** [Brandt May](https://apify.com/maydit) (community)
- **Categories:** News, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.20 / 1,000 press release observations

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

![Keep official UN releases traceable — illustrative workflow](https://api.apify.com/v2/key-value-stores/YGxD9JRpduom8Q5Zd/records/un-press-release-monitor-9795b097f3b4.png?signature=klPKAF5yqZE2EwZlmqIe)

### Keep official UN releases traceable

For news and policy research: collect releases from the official UN Secretary-General and General Assembly press listings. Document codes, source dates, links and bounded publisher excerpts keep each observation traceable.

[Open this Actor in Console](https://console.apify.com/actors/jinZwlH7kccMSsnwQ/input) · [First run](#try-this-actor) · [Results](#result-preview) · [Cost](#usage-and-pricing) · [Full guide](#full-guide)

### Try this Actor

- **First run:** Use **Latest UN Secretary-General Press Releases** below: one listing page and up to five saved releases. Inspect the excerpt and source link before adding topic filters or saved comparisons.
- **Read the results:** Open the default Dataset for release rows and **SUMMARY** for listing coverage. Changed fields refer to saved listing observations, with original source links available for follow-up.
- **Keep in mind:** This does not collect every UN body or full release text. Excerpts are publisher text, not generated summaries. Literal keywords can miss words outside the excerpt, and capped listings are not a globally newest-first news feed.

**Latest UN Secretary-General Press Releases** — copy this input into the JSON editor in Console.

```json
{
  "bodies": [
    "secretary-general"
  ],
  "maxResults": 5,
  "maxPagesPerBody": 1
}
```

### Result preview

The dataset view highlights these columns:

- **Release ID** · `releaseId`
- **Document code** · `documentCode`
- **Headline** · `title`
- **Release date** · `publishedDate`
- **UN listing** · `sourceBody`
- **Publisher excerpt** · `excerpt`

Use the original source links and the field definitions below when interpreting the results. CSV works well for flat columns; JSON preserves nested values.

### Usage and pricing

Base result rate on the FREE tier: **$2 per 1,000 press release observations**. The [Pricing tab](https://apify.com/maydit/un-press-release-monitor/pricing) shows your plan's result rate and any Actor Start charge. Set a small result limit for the first run; the requested limit is not a guarantee of that many results.

***

### Full guide

Collect structured metadata from two official United Nations press-release listings. Each row has the publisher’s document code, headline, release date, canonical source URL and short publisher excerpt. Use literal topic filters and saved comparisons to build a press desk queue or track corrected headlines and excerpts.

#### Quick start

`{}` and Console prefill read one page from each supported listing and save at most 20 records. Empty `bodies` uses both supported bodies. Each additional page follows only the exact next page in the same listing. `windowTruncated` in SUMMARY shows more listing records exist; an intentional page/result cap is normal bounded coverage, not a source failure. A filtered run can correctly return zero. Some source pages or categories can return access challenges; these fail visibly without bypass.

#### Output and interpretation

`publishedDate` is day precision as displayed by the publisher. The listing’s internal noon timestamp is not presented as an exact publication time. `documentCode` is copied from the displayed field, not inferred from a URL. `releaseId` hashes the canonical source document URL; duplicate documents across listings save once. Bodies are processed in sorted order, so results are not globally date-ranked.

`excerpt` is the publisher’s listing excerpt, not a generated summary or full text. `excerptTruncated` only indicates additional shortening by this Actor. `excerptHash` covers the complete listing excerpt. Topic filters inspect the returned title, document code and bounded excerpt; they can miss topics present only in the full release. No article bodies are fetched to expand matching. A source statement is not independently verified by this Actor; no conflict prediction, numeric risk score, official voting record or inferred policy effect is generated.

Overview fields: `releaseId`, `documentCode`, `title`, `publishedDate`, `sourceBody`, `excerpt`, `url`, `matchedTerms`, `comparisonStatus`, `changedFields`, `observedAt`. Export JSON for nested evidence and section arrays. Every row has an observation time; it is not a source publication time.

#### Saved comparisons

Set `comparePrevious: true` to annotate matching rows as new, changed or unchanged. `onlyChanges: true` implies comparison and skips unchanged rows. A first run saves matching observations and logs a baseline warning. `SUMMARY.historyUpdated` confirms the final history write. No-op runs warn and may correctly return zero results.

History scope includes the sorted body list, keywords, date filters, excerpt length and `snapshotName`. Page/result limits do not change the scope. Comparisons cover title, document code, displayed release date and full listing-excerpt hash. A correction outside the listing excerpt cannot be detected. No missing-release or deletion inference is made from a rolling window.

Only confirmed saved rows advance the named persistent key-value-store history. Failed or charge-rejected writes do not advance it. Prior observations are retained on partial runs. One writer per history scope is required; a final read detects conflicting updates but this is not a transactional lock. Malformed history fails with an actionable error; choose a new `snapshotName`. History is capped at 20,000 identities. A result cap may leave unseen records for a later comparison run.

#### Coverage, failures and charging

No API key or login is required. Public-source requests use SSRF/DNS/redirect safeguards, robots checks and bounded compressed-body decoding. A request takes at most 25 seconds and remains within `maxRunSeconds` (default 240) and the platform deadline minus 25 seconds. Transient failures get at most two retries.

`SUMMARY` reports source coverage, failures, not-reached sources, saved rows, unchanged skips and time/spend limits. Errors and access challenges never become dataset rows. All-source failures fail the run; a successful source with an empty filter result warns. Source, history or budget failures make coverage incomplete. An intentional result/page limit is a bounded request. Do not interpret a partial or truncated observation as complete coverage.

Planned price: **$0.002 per saved record** on FREE/BRONZE, $0.0016 SILVER and $0.0012 GOLD/PLATINUM/DIAMOND, plus a $0.00005 Actor Start event. The Store pricing tab is authoritative. Unchanged skipped records and diagnostic errors do not create dataset charges. Normal platform usage may also apply according to the Store plan.

#### Three exact example inputs

##### Latest UN Secretary-General Press Releases

Read up to five official Secretary-General press releases with codes, dates, short publisher excerpts and source URLs.

Use the [copyable first-run input](#try-this-actor) above.

##### Latest UN General Assembly Press Releases

Read up to five official General Assembly press releases from the public publisher listing.

```json
{
  "bodies": [
    "general-assembly"
  ],
  "maxResults": 5,
  "maxPagesPerBody": 1
}
```

##### UN Press Desk Watch - Two Official Listings

Read the current bounded Secretary-General and General Assembly press-release lists with deduplicated document links.

```json
{
  "bodies": [
    "secretary-general",
    "general-assembly"
  ],
  "maxResults": 20,
  "maxPagesPerBody": 1
}
```

#### Sources and reuse

Sources are the explicit [Secretary-General](https://press.un.org/en/content/secretary-general/press-release) and [General Assembly](https://press.un.org/en/content/general-assembly/press-release) Press Release listings. Each eligible row must be labelled “Press Release”; live blogs and other types are excluded. The [official UN policy manual, sections 5.34–5.35](https://uncitral.un.org/sites/default/files/media-documents/uncitral/en/policy_manual_rev_sept_2020.pdf) identifies press releases as public-domain content. The [general website terms](https://www.un.org/en/about-us/terms-of-use) and separate restrictions on databases remain relevant: this Actor stays within those explicit press-release pages, metadata and bounded publisher excerpts. It does not download full article bodies, photos, logos, audiovisual content, third-party speeches or UN databases. No UN endorsement is implied.

#### Development

Node 20+, exact apify 3.7.2 and cheerio 1.1.2; basic-ftp 6.2.2 override. Run `npm ci --ignore-scripts` then `npm test`. Use an isolated `CRAWLEE_STORAGE_DIR` for local runs. Local and cloud bounded checks establish sample behavior, not exhaustive coverage or customer demand.

### Help with your run

Open the **Issues** tab on this Actor with the run URL, the input field that caused trouble and what you expected to receive. Remove API keys and private information before posting.

[Explore more Mayd-It Actors](https://apify.com/maydit)

### Understand your run

Open **Run report** in the run’s Output tab for saved-record counts, reported source issues and limits, and suggested next steps. Use **CSV export** to take the saved results into a spreadsheet. The existing JSON results and detailed machine-readable summary remain available.

The report reflects this run’s recorded coverage. A successful run or a saved result does not establish that every possible source record was collected.

# Actor input Schema

## `bodies` (type: `array`):

Choose secretary-general and/or general-assembly. Omitted/empty uses both. Only rows explicitly labelled Press Release are eligible. The Security Council category, live blogs and databases are not supported.

## `keywords` (type: `array`):

Optional case-insensitive ANY phrase match in the title, document code or returned bounded publisher excerpt. No inferred sentiment, conflict risk, country tagging or policy effect.

## `startDate` (type: `string`):

Optional real YYYY-MM-DD calendar date, inclusive. This is the displayed publication date; the source listing does not establish a precise release time.

## `endDate` (type: `string`):

Optional real YYYY-MM-DD calendar date, inclusive. Must not precede startDate.

## `maxPagesPerBody` (type: `integer`):

Read this many public listing pages per body, starting with the newest listing page. A bounded window may miss older keyword matches. No complete archive or full-history claim.

## `maxExcerptCharacters` (type: `integer`):

Return up to this many characters from the listing’s publisher-supplied excerpt. No full article is fetched. excerptTruncated marks our shortening; a source excerpt may already omit most of a release.

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

Maximum unique matching rows saved across the whole run. Normal requested caps are bounded coverage, not source failures.

## `comparePrevious` (type: `boolean`):

Return matching rows with new, changed or unchanged comparison status. Uses a named persistent store. Only confirmed saved rows advance history. The first run establishes observations, and SUMMARY confirms whether history was committed.

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

Implies comparison. Unchanged matching observations are skipped without a dataset charge. A first run saves matching observations; subsequent unchanged runs can correctly save zero. No disappearance/deletion inference.

## `snapshotName` (type: `string`):

Use 1-80 letters, digits, underscores or hyphens. History also includes the sorted sources/queries and content filters. Run only one writer at a time for each scope. Start a new name for an incompatible saved baseline.

## `maxRunSeconds` (type: `integer`):

Requests use this budget and the platform deadline minus 25 seconds. Each request is capped at 25 seconds. Partial coverage and spending stops are explicit in SUMMARY.

## Actor input object example

```json
{
  "bodies": [
    "secretary-general",
    "general-assembly"
  ],
  "maxPagesPerBody": 1,
  "maxExcerptCharacters": 1000,
  "maxResults": 20,
  "comparePrevious": false,
  "onlyChanges": false,
  "snapshotName": "default",
  "maxRunSeconds": 240
}
```

# Actor output Schema

## `dataset` (type: `string`):

No description

## `runReport` (type: `string`):

Readable summary of saved records, reported source coverage, limits and next steps. Available when this run saves its SUMMARY.

## `csvExport` (type: `string`):

Download saved dataset records as a CSV file for spreadsheets and other tools.

## `summary` (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 = {
    "bodies": [
        "secretary-general",
        "general-assembly"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("maydit/un-press-release-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 = { "bodies": [
        "secretary-general",
        "general-assembly",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("maydit/un-press-release-monitor").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 '{
  "bodies": [
    "secretary-general",
    "general-assembly"
  ]
}' |
apify call maydit/un-press-release-monitor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,maydit/un-press-release-monitor"
        }
    }
}
```

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/jinZwlH7kccMSsnwQ/builds/1CLJhahz3P7bBoOHn/openapi.json
