# Dataset License & Access Change Monitor (`quietdatatools/dataset-license-access-change-monitor`) Actor

Track public Hugging Face dataset license declarations, gating and disabled-status changes. Persistent before/after history and configurable license-label or ungated warnings for dataset inventory workflows. No files or login. $0.01 per successful check, including baseline and unchanged.

- **URL**: https://apify.com/quietdatatools/dataset-license-access-change-monitor.md
- **Developed by:** [QuietDataTools](https://apify.com/quietdatatools) (community)
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$10.00 / 1,000 successful dataset policy checks

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

## Dataset License & Access Change Monitor

Monitor the public policy metadata of one Hugging Face dataset. Each successful check compares license declarations, custom license name/link, gating and disabled status against a persistent snapshot. Use this in recurring dataset inventory reviews and data ingestion alerts, without downloading dataset files.

### What makes this different

A general dataset scraper returns metadata to compare yourself. This Actor maintains history per Apify user, Actor, dataset ID and monitor name, ignores download counters and timestamps, and returns typed before/after changes. Optional exact-label license preferences and an ungated preference produce structured warnings. This is a narrow metadata workflow; Hugging Face also offers native webhooks for users building their own integrations.

### Input example

```json
{"datasetId":"stanfordnlp/sst2","monitorName":"default","acceptedLicenses":["apache-2.0"],"requireUngated":true,"includeUnchanged":true}
```

Use an exact namespace/dataset ID, not a URL. No account token is accepted. Reuse the monitor name for history; a new name starts a baseline. Preference changes do not reset history. Schedule with Apify Tasks or Schedules for periodic checks.

### Output and history

`BASELINE` establishes the first snapshot; `CHANGED` lists field names and previous/current values; `UNCHANGED` confirms the same policy metadata. Each emitted dataset row includes previous/current snapshots, source URL, timestamp and policyWarnings. Default key-value record `OUTPUT` summarizes every check, even if unchanged rows are suppressed.

Warnings: `DATASET_GATED`, `NO_ACCEPTED_LICENSE_REPORTED`, and `CARD_AND_TAG_LICENSES_DIFFER`. Missing card licenses or disabled flags remain unknown, not an assumed permissive state. License labels are publisher declarations. At least one matching declared label satisfies the optional label check, including a tag; this is not verification of license terms. A license link is recorded but never visited.

Failed source checks, private/incomplete metadata, invalid inputs or delivery/charging failures do not replace the last committed snapshot. A bounded best-effort lease rejects overlapping checks; avoid scheduling the same monitor concurrently because key-value storage does not provide an atomic lock. Named history storage persists until you delete it or the platform changes its retention. Changing/deleting it starts a new baseline. Output may exist before a failed charge; trust SUCCESS and committed history rather than a partial row alone.

### Pricing

$0.01 per successful dataset policy check, with platform usage included. Baseline and unchanged checks are charged, including checks that suppress unchanged rows. Failed source checks are not charged. One dataset per run, one successful-check event, no separate per-row or startup charge. Set a maximum charged amount of at least $0.01 for one check.

### Scope and limits

Public Hugging Face dataset metadata only. No dataset files, crawling, login, gated terms acceptance, private repositories, proxy service, bulk search, model metadata or legal compliance determination. Gating metadata does not prove your ability to access files, and an ungated declaration does not grant rights to use data. Automatic/manual gating and disabled flags are tracked when reported. One fixed API endpoint, 20-second network deadline, 2 MB response cap and same-origin redirects. A large metadata response or unsupported schema fails safely. Upstream rate limits or schema changes may require maintenance.

Built on Node.js and Apify SDK 3.7.2; native HTTPS source requests use no cookies or response cache. A known transitive http-cache-semantics advisory GHSA-ch52-4w7c-c8xp has no published patch as checked October 5, 2026. The vulnerable cross-user cache scenario is not used by this source client; this is not a claim that the whole SDK dependency tree is vulnerability-free. Dependency follow-up remains tracked.

Unaffiliated with Hugging Face. Source documentation: https://huggingface.co/docs/hub/api , https://huggingface.co/docs/hub/datasets-gated and https://huggingface.co/docs/hub/datasets-cards .

# Actor input Schema

## `datasetId` (type: `string`):

Exact namespace/dataset on Hugging Face. No URLs, tokens or private datasets.

## `monitorName` (type: `string`):

Reuse this name for continuity; change it to start a separate baseline.

## `acceptedLicenses` (type: `array`):

Optional exact case-sensitive metadata labels. A warning is emitted if none match; not a legal clearance decision.

## `requireUngated` (type: `boolean`):

Warn when the public metadata reports automatic or manual gating.

## `includeUnchanged` (type: `boolean`):

False suppresses unchanged dataset rows; successful checks remain charged and OUTPUT still records results.

## Actor input object example

```json
{
  "datasetId": "stanfordnlp/sst2",
  "monitorName": "default",
  "acceptedLicenses": [],
  "requireUngated": false,
  "includeUnchanged": true
}
```

# Actor output Schema

## `results` (type: `string`):

No description

## `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 = {
    "datasetId": "stanfordnlp/sst2"
};

// Run the Actor and wait for it to finish
const run = await client.actor("quietdatatools/dataset-license-access-change-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 = { "datasetId": "stanfordnlp/sst2" }

# Run the Actor and wait for it to finish
run = client.actor("quietdatatools/dataset-license-access-change-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 '{
  "datasetId": "stanfordnlp/sst2"
}' |
apify call quietdatatools/dataset-license-access-change-monitor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,quietdatatools/dataset-license-access-change-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/HAkxCuYCO6rDn4N9U/builds/eqQ76DBU3iqeuWC5A/openapi.json
