# UK 360Giving Dataset Publication Watch (`nexgenwatch/uk-360giving-dataset-publication-watch`) Actor

UK grantmakers publishing and republishing their grants data to the 360Giving Standard: who published, what changed, the licence, and a direct link to the file.

- **URL**: https://apify.com/nexgenwatch/uk-360giving-dataset-publication-watch.md
- **Developed by:** [NexGen Watch](https://apify.com/nexgenwatch) (community)
- **Categories:** Business, News
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $67.00 / 1,000 dataset-publication deltas

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

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — 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

## UK 360Giving Dataset Publication Watch

UK grantmakers publishing and republishing their grants data to the 360Giving Standard: who published, what changed, the licence, and a direct link to the file. Withdrawals are reported too - a dataset leaving the registry is a take-down signal you need, not a row to drop quietly.

### Source and the routes that are CLOSED

`https://registry.threesixtygiving.org/data.json` - public, logged-out, no key, HTTP 200,
745,926 bytes. 360Giving's own take-down policy names this feed: *"These links are curated by
360Giving on the 360Giving Data Quality Dashboard and as a JSON feed."*

Probed 2026-07-29 and **not** used, with the reason:

| route | why not |
|---|---|
| GrantNav `/search`, `/recipients`, `/funders` | `robots.txt` **Disallow** for `User-agent: *` |
| `analytics.threesixtygiving.org` | `robots.txt` **Disallow: /** |
| `store.data.threesixtygiving.org` | **HTTP 401** on every path, including its robots.txt |

Measured on the registry: **873 datasets, 292 publishers**, every entry carrying a `modified`
timestamp. Licences: CC BY 4.0 696, OGL 3.0 121, CC BY-SA 4.0 35, CC0 21.

### Rate: 2 requests per second, strictly

360Giving asks for no more than two requests a second. Every call this Actor makes goes
through a token bucket whose capacity is pinned to **one** token, so the first request goes
immediately and every one after it waits the full interval. A bucket that starts full is not a
limiter - it passes its whole capacity instantly, which is how an earlier cell in this fleet
sent 13.3 req/s against an 8/s cap.

### Take-down and retention - YOUR duty, not just ours

360Giving's take-down policy is explicit that once data is open it *"may be taken and used by
different people in different applications that are beyond 360Giving's control"*, and that
when a take-down happens they *"will notify the owners of any of the online applications ...
and advise them on any actions they may need to take"*.

If you cache what this Actor emits, **you are one of those applications.** So:

- a dataset or grant that disappears from the source is emitted as a **`REMOVED` delta with
  `is_withdrawal: true`** - never dropped quietly, because you are the one who has to act;
- every record carries `take_down_policy` linking 360Giving's policy;
- every record carries `license_name`; most of this data is CC BY 4.0 and **attribution is a
  licence condition**, not a courtesy;
- grant records name identifiable individuals and organisations. Deleting on withdrawal is a
  data-protection obligation you inherit with the copy.

Read the policy: `https://www.threesixtygiving.org/take-down-policy/`

### Pricing

Pay-per-event on the ratified four-tier ladder (FREE → GOLD, with Platinum and Diamond floored
at the Gold rate). Apify applies its own plan discount on top.

| Event | FREE | BRONZE | SILVER | GOLD |
|---|---|---|---|---|
| Actor start (`apify-actor-start`) | $0.02 | $0.02 | $0.02 | $0.02 |
| Source check (`source-check`) | $0.10 | $0.09 | $0.08 | $0.067 |
| Dataset-publication delta (`g360-delta`) | $0.10 | $0.09 | $0.08 | $0.067 |

`source-check` is charged **once per run**, after the source enumeration terminates — seed runs
and no-change runs included. It is **not** charged when the source refused the read, an unnamed funder, an unsupported format or an oversized file.

`g360-delta` is charged **per emitted delta**, in watch mode only. Seed runs and no-change runs
charge nothing here.

`apify-actor-start` is the platform's reserved event, never charged in this code. The Actor is
clamped to **1024 MB on both settings**, so it is charged exactly **once** per run — the
platform bills it once per gigabyte of run memory.

### Snapshot mode is a PREVIEW

`watch_mode: false` returns at most **25 records**, hard-capped in code and labelled
`output_mode: "preview"`. This Actor sells change detection, not bulk export.

### Watch semantics

The first watch run stores a private baseline and emits **zero** deltas. Billed deltas are
capped at 500 per run; the overflow is a named PARTIAL withholding, never billed, and
re-detected next run.

### One slice per Actor

This Actor emits **dataset-publication** and nothing else. Its sibling reads 360Giving for the other
slice, each with its own baseline and its own price.

### Terminal states

`NORMAL` - `SUCCEEDED-0: GENUINE_EMPTY` - `SUCCEEDED-0` (no change) - `PARTIAL` - `BLOCKED`.
A zero with no evidence FAILS loud. A funder name that matches nothing FAILS naming the
registry, and a file that arrives and does not parse FAILS naming what arrived - neither is
ever reported as an empty source.

# Actor input Schema

## `funder` (type: `string`):

Optional. Narrow the watch to one grantmaker by name, 360Giving prefix or org id, matched case-insensitively across the 292 publishers in the registry. Leave empty to watch all 873 registered datasets.

## `watch_mode` (type: `boolean`):

On: emit CHANGES against a stored baseline (the product). Off: a labelled PREVIEW of at most 25 records, which is not an export path.

## `baseline_id` (type: `string`):

Names the stored baseline so different filter combinations can be watched independently without their baselines colliding.

## `license_contains` (type: `string`):

Keep only datasets whose licence name contains this text. Measured 2026-07-29: CC BY 4.0 696, OGL 3.0 121, CC BY-SA 4.0 35, CC0 21.

## `formats` (type: `array`):

Keep only datasets published in these formats. Measured: xlsx 643, json 32, csv 21, ods 11, and 151 with no file extension.

## Actor input object example

```json
{
  "funder": "",
  "watch_mode": true,
  "baseline_id": "default",
  "license_contains": "",
  "formats": []
}
```

# 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 = {
    "funder": "",
    "watch_mode": false,
    "baseline_id": "default",
    "license_contains": "",
    "formats": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("nexgenwatch/uk-360giving-dataset-publication-watch").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 = {
    "funder": "",
    "watch_mode": False,
    "baseline_id": "default",
    "license_contains": "",
    "formats": [],
}

# Run the Actor and wait for it to finish
run = client.actor("nexgenwatch/uk-360giving-dataset-publication-watch").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 '{
  "funder": "",
  "watch_mode": false,
  "baseline_id": "default",
  "license_contains": "",
  "formats": []
}' |
apify call nexgenwatch/uk-360giving-dataset-publication-watch --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,nexgenwatch/uk-360giving-dataset-publication-watch"
        }
    }
}

```

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/FM5dk0od9MCvDgF0H/builds/bkCj9DPR1Vw9emAhK/openapi.json
