# Hugging Face Model Change Monitor (`maydit/huggingface-model-change-monitor`) Actor

Track public Hugging Face model revisions, declared license, gating, base models and artifact paths. Saved comparisons for deployment watchlists. Metadata only; no model download or execution.

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

## Pricing

from $1.80 / 1,000 public model metadata 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

![Review model changes before deployment — illustrative metadata workflow](https://api.apify.com/v2/key-value-stores/nemaYfVcrTgloz8Wn/records/huggingface-model-change-monitor-fdd5dff95107.png?signature=ecuZmIOEGFJA11ARHID8)

### Review model changes before deployment

Keep a reviewable record of the public Hugging Face repositories your application depends on. Collect revisions, declared licenses, access settings, base-model references and returned artifact paths, then compare them with your last saved observations.

**One result is one model observation.** Use it for a dependency review queue or a model inventory. The Actor reads public metadata without downloading weights or executing model code.

[Open in Console](https://console.apify.com/actors/Wo3ZWLOHnDE2HklRh/input) · [First run](#try-two-embedding-models) · [Output preview](#output-preview) · [Saved comparisons](#save-a-deployment-review-baseline) · [Pricing](#pricing)

### Try two embedding models

Copy this input into Console's JSON editor. It checks two exact repositories and caps saved output at five rows; the cap does not guarantee five results. No Hugging Face API key is required.

```json
{
  "modelIds": [
    "sentence-transformers/all-MiniLM-L6-v2",
    "BAAI/bge-small-en-v1.5"
  ],
  "maxResults": 5
}
```

Open the **Dataset** for observations and **Run report** for coverage. Check **SUMMARY** before treating a missing row as a completed check. Empty input uses these two models plus `openai/whisper-tiny`; it is a sample watchlist, not a ranking.

### Output preview

These fields form a compact deployment-review record. JSON preserves nested paths and prior values; CSV works for a flat inventory.

| Review question | Output fields | Interpretation |
| --- | --- | --- |
| Which repository? | `modelId`, `modelUrl` | Exact requested public model and its page |
| Did the revision change? | `revisionSha` | Publisher's repository commit; no weight checksum is calculated |
| What license is declared? | `licenseDeclared`, `licenseName`, `licenseLink` | Model-card declarations, or null when absent |
| What access is advertised? | `gated`, `disabled` | Reported settings; access or approval is not tested |
| What dependencies and files are listed? | `baseModels`, `artifactPaths`, `artifactCount` | Declared base models and complete paths returned by this bounded response |
| What changed since my saved check? | `comparisonStatus`, `changedFields`, `previous`, `previousObservedAt` | Exact snapshot differences and prior saved values |
| Which paths changed? | `addedArtifactPaths`, `removedArtifactPaths` | Differences between two complete returned inventories for the same model |
| Where is the evidence? | `sourceUrl`, `observedAt`, `contentHash` | API source, retrieval time and stable snapshot hash |

Task and library metadata are available as `pipelineTag` and `libraryName`. Likes, publisher timestamps and `downloadsLast30Days` are informational and excluded from comparisons. Downloads are the publisher's rolling 30-day metric, not unique users. Any repository commit can change `revisionSha` even when the selected declarations remain the same.

### Inspect a speech model

This second example reads Whisper Tiny's public metadata without downloading its files.

```json
{
  "modelIds": [
    "openai/whisper-tiny"
  ],
  "maxResults": 5
}
```

### Save a deployment-review baseline

The third example enables persistent comparison for one model.

```json
{
  "modelIds": [
    "sentence-transformers/all-MiniLM-L6-v2"
  ],
  "comparePrevious": true,
  "snapshotName": "minilm-deployment-review",
  "maxResults": 5
}
```

1. Run once to save a `new` observation. Review its source and declared license.
2. Repeat with the same exact watchlist, `snapshotName` and named history store. Rows become `changed` or `unchanged`, with prior values.
3. Add `onlyChanges: true` when you want to omit unchanged rows. It also enables comparison. A healthy repeat can save zero rows.
4. For Sheets, Make or n8n, read the completed run's SUMMARY and dataset, then upsert by `modelId`. Retain the run ID for replay and deduplicate repeated deliveries using `modelId + contentHash`.

History scope includes the versioned comparison schema, sorted watchlist and snapshot namespace. A different watchlist starts a separate comparison. Only confirmed saved rows advance history. Failed, unsaved or unchanged-skipped observations preserve their baseline; missing models never become deletion instructions.

Use **one writer per scope**. A check detects an already changed history before commit, but it is not an atomic lock. A history failure can leave useful saved rows: inspect `historyUpdated` and `failedSources.history`. Comparisons cover your last saved observations, not every change between runs. You configure any schedule, alerts and downstream accounts; the Actor does not modify deployments.

### Coverage and interpretation

- **Metadata only:** no model-quality assessment, security certification, license certification, file-byte verification or independently verified lineage. Read the linked publisher terms and model card before a deployment decision.
- **Bounded watchlist:** up to 30 model IDs, 1,000 saved rows, 5,000 returned paths per model and 2 MiB per response. “Complete” describes the returned path inventory, not verification of repository contents. Private, renamed, inaccessible or unsupported responses fail explicitly.
- **Supported declarations:** license metadata accepts a string or missing value. Unexpected structured declarations are rejected; optional missing fields remain null or empty.
- **Source access:** sequential public requests; one retry for 502/503/504 within the deadline. Access and rate refusals are reported without bypass. No paid source subscription is required.
- **Run limits:** `maxRunSeconds` defaults to 240, also bounded by the platform deadline minus 25 seconds. Set both `maxResults` and Apify's maximum total charge.

SUMMARY records saved/observed counts, unchanged skips, source coverage, unreached models, failures and limit flags. An intentional result cap is a bounded sample. Source, time or history failures are partial or failed; an all-source failure fails the run. Errors never become paid data rows.

### Pricing

Base result rate on the FREE tier: **$3 per 1,000 saved model observations**, plus the listed **Actor Start** charge. The [Pricing tab](https://apify.com/maydit/huggingface-model-change-monitor/pricing) is authoritative for your plan's current rates. Saved unchanged rows are billable; rows suppressed by `onlyChanges` create no dataset-item charge. Platform and storage charges may apply under your plan.

### Sources and support

[Hub API](https://huggingface.co/docs/hub/api) · [Model-card metadata](https://huggingface.co/docs/hub/model-cards) · [Field reference](https://huggingface.co/docs/huggingface_hub/en/package_reference/cards) · [Download metrics](https://huggingface.co/docs/hub/models-download-stats) · [Rate limits](https://huggingface.co/docs/hub/rate-limits)

Hugging Face also offers [native repository webhooks](https://huggingface.co/docs/hub/webhooks). This community Actor adds saved field comparisons and Apify exports for a bounded watchlist; it is not affiliated with Hugging Face.

For help, open **Issues** with the run URL, public model ID and expected field, or contact **bmay@mayd-it.com**. Remove credentials and private information before posting.

# Actor input Schema

## `modelIds` (type: `array`):

Up to 30 exact namespace/model identifiers. Omitted or empty uses the listed sample. No URLs, credentials or private models.

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

Maximum confirmed dataset rows. An unchanged observation skipped by onlyChanges does not use this limit. A capped run can leave selected models/routes unreached; see SUMMARY.

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

First observations are new. Later observations are changed or unchanged; only confirmed saved rows can advance history.

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

Implies comparePrevious. A fully unchanged run correctly saves zero rows. The initial comparison saves new observations.

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

1-80 letters, numbers, underscores or hyphens. History also includes the exact sorted model watchlist. Use one writer per namespace; overlapping runs are unsupported.

## `stateStoreName` (type: `string`):

3-63 letters, numbers or hyphens. Read/written only when comparisons are requested. Use your own dedicated store to isolate a workflow.

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

Includes source and history work, also bounded by the platform deadline minus 25 seconds.

## Actor input object example

```json
{
  "modelIds": [
    "sentence-transformers/all-MiniLM-L6-v2",
    "BAAI/bge-small-en-v1.5",
    "openai/whisper-tiny"
  ],
  "maxResults": 10,
  "comparePrevious": false,
  "onlyChanges": false,
  "snapshotName": "default",
  "stateStoreName": "maydit-huggingface-model-watchlists",
  "maxRunSeconds": 240
}
```

# Actor output Schema

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

Successful public metadata observations only. Failures are never synthetic paid rows.

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

Readable coverage, limits and history outcome from this run.

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

Saved/observed counts, failed sources, unreached models and time/spending stops.

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

Download the current run observations for spreadsheets.

# 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 = {
    "modelIds": [
        "sentence-transformers/all-MiniLM-L6-v2",
        "BAAI/bge-small-en-v1.5",
        "openai/whisper-tiny"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("maydit/huggingface-model-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 = { "modelIds": [
        "sentence-transformers/all-MiniLM-L6-v2",
        "BAAI/bge-small-en-v1.5",
        "openai/whisper-tiny",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("maydit/huggingface-model-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 '{
  "modelIds": [
    "sentence-transformers/all-MiniLM-L6-v2",
    "BAAI/bge-small-en-v1.5",
    "openai/whisper-tiny"
  ]
}' |
apify call maydit/huggingface-model-change-monitor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,maydit/huggingface-model-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/Wo3ZWLOHnDE2HklRh/builds/q81xtztrVAyu8xO8d/openapi.json
