# Hugging Face Model Change Monitor

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.

Canonical product page: https://mayd-it.com/data-tools/actors/huggingface-model-change-monitor/
Public Actor: https://apify.com/maydit/huggingface-model-change-monitor

## Example input

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

## Full guide

![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.
