# Docker Hub Tag and Digest Watchlist (`jpmarketdata/docker-hub-tag-digest-watchlist`) Actor

Check exact public Docker Hub image tags or bounded recent tag lists across repositories, returning tag/platform digests, image sizes and timestamps for deployment and update review.

- **URL**: https://apify.com/jpmarketdata/docker-hub-tag-digest-watchlist.md
- **Developed by:** [h ichi](https://apify.com/jpmarketdata) (community)
- **Categories:** Developer tools, Automation
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$2.00 / 1,000 delivered evidence rows

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

## Docker Hub Tag and Digest Watchlist

DevOps/release teams periodically inspect exact deployment tags and recent upstream tag evidence before pinning immutable digests or preparing update reviews.

### Input

- `images`: One to ten namespace/repository\[:tag] values. Exact tag when supplied; otherwise most recently updated tags. Use library/ for official images. Default: `["library/python:latest", "library/nginx:latest"]`.
- `tagsPerRepository`: Maximum recently updated tags for each untagged input; one source page only. No full historical enumeration. Default: `10`.
- `maxItems`: Global delivered tag/snapshot cap, also limited by the PPE event budget. Default: `100`.

### Output

- `type`: Row kind.
- `sourceUrl`: Official API link for this tag. Recent-list mode constructs it from the returned tag name; the individual tag endpoint is not fetched.
- `fetchedAt`: UTC observation time.
- `repository`: Matched namespace/repository.
- `tag`: Exact tag or recently updated tag name.
- `status`: present or tag-not-found; tag-not-found requires a valid public repository.
- `digest`: Top-level tag digest if present in source.
- `platforms`: Architecture/OS/variant/digest/size per published image; unknown attestations are not runtime platform evidence.
- `lastUpdated`: UTC tag update time.
- `lastPushed`: UTC tag last push time if provided.
- `totalTags`: Upstream repository tag count in recent mode; null for exact mode.
- `repositoryTagsTruncated`: Recent tag source has further pages beyond tagsPerRepository or the output cap.
- `reason`: Evidence outcome; source metadata is not a security scan or availability guarantee.

### Pricing

Price: $0.002 per delivered `image-tag-snapshot` row, including only any explicitly documented useful negative snapshot. No run-start event. Local non-PPE runs save all valid rows without event charging. PPE budget is checked before acquisition and before each push; short charging fails. No trial configured.

### Limits

1–10 public namespace/repository\[:tag] targets; exact tag or one bounded recent page (1–100 tags). Each exact missing tag is rechecked against repository metadata before returning a negative. No login, registry pull, binaries, vulnerabilities, SBOM, signatures or private repositories. At most 21 sequential requests, 2 MiB per response, 15-second HTTP timeout, 180-second run timeout. One tag-list page only. Fail rate-limit/auth/shape/timeout; no deeper anonymous pagination or authentication workaround.

A tag 404 plus a structurally valid matching public-repository response emits a tag-not-found snapshot; repo 404 is an error. Negative tag evidence supports pre-deploy checks without claiming permanent absence.

### Privacy

Exclude creator IDs, accounts, descriptions, profiles and contributor data. Only repository/tag metadata, digests, platform architecture, size and timestamps.

### Sources

Official source only. Source robots are checked before acquisition and Disallow changes fail. The source does not endorse this Actor.

# Actor input Schema

## `images` (type: `array`):

One to ten namespace/repository\[:tag] values. Exact tag when supplied; otherwise most recently updated tags. Use library/ for official images. On paid runs, saved result rows are billed; the run's spending limit in $ also applies.

## `tagsPerRepository` (type: `integer`):

Maximum recently updated tags for each untagged input; one source page only. No full historical enumeration. On paid runs, saved result rows are billed; the run's spending limit in $ also applies.

## `maxItems` (type: `integer`):

Global delivered tag/snapshot cap, also limited by the run spending limit. On paid runs, saved result rows are billed; the run's spending limit in $ also applies.

## Actor input object example

```json
{
  "images": [
    "library/python:latest",
    "library/nginx:latest"
  ],
  "tagsPerRepository": 10,
  "maxItems": 100
}
```

# Actor output Schema

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

Check exact public Docker Hub image tags or bounded recent tag lists across repositories, returning tag/platform digests, image sizes and timestamps for deployment and update review.

# 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 = {
    "images": [
        "library/python:latest",
        "library/nginx:latest"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("jpmarketdata/docker-hub-tag-digest-watchlist").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 = { "images": [
        "library/python:latest",
        "library/nginx:latest",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("jpmarketdata/docker-hub-tag-digest-watchlist").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 '{
  "images": [
    "library/python:latest",
    "library/nginx:latest"
  ]
}' |
apify call jpmarketdata/docker-hub-tag-digest-watchlist --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,jpmarketdata/docker-hub-tag-digest-watchlist"
        }
    }
}
```

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/UmDajULKGpCNTlLMz/builds/5w1UAapigakWIztce/openapi.json
