Docker Hub Repositories Scraper helps teams turn public container image pages into clean datasets. Use it to compare popular base images, audit release cadence, inventory tag digests, and monitor public repository metadata without manual copying.
Who is this for
- DevOps and platform teams tracking base image popularity, pulls, and tag freshness.
- Security and supply-chain teams exporting image digests, architectures, and timestamps for public dependencies.
- Product and market researchers comparing public container repository adoption across vendors.
What data can it export
- Public repository identity, namespace, Docker Hub URL, descriptions, type, status, and trust flags.
- Pull counts, star counts, registration and update timestamps.
- Bounded tag metadata including tag names, IDs, digests, architecture, OS, image size, and push/pull timestamps.
- Namespace inventories for public Docker Hub organizations.
Example input
{
"repositories": ["library/postgres", "library/redis"],
"includeTags": true,
"maxRepositories": 10,
"maxTagsPerRepository": 5,
"outputMode": "repositories"
}
Example output
{
"type": "repository",
"repository": "library/postgres",
"namespace": "library",
"name": "postgres",
"hubUrl": "https://hub.docker.com/r/library/postgres",
"shortDescription": "The PostgreSQL object-relational database system...",
"starCount": 14962,
"pullCount": 10980699991,
"isOfficial": true,
"tagCount": 1379,
"tagLimitReached": true,
"tags": [
{
"tagName": "latest",
"imageDigest": "sha256:...",
"architecture": "amd64",
"os": "linux",
"lastPushed": "2026-07-01T00:00:00Z"
}
],
"scrapedAt": "2026-07-14T00:00:00.000Z"
}
Input settings
| Field | Type | Description |
|---|---|---|
queries |
string[] | Docker Hub search terms such as postgres or redis. |
repositories |
string[] | Exact repositories as namespace/name; official images like postgres resolve to library/postgres. |
namespaces |
string[] | Public namespaces to enumerate, such as library or bitnami. |
includeTags |
boolean | Fetch tag metadata for each repository. |
outputMode |
string | repositories for one row per repository with nested tags, or tags for one row per tag. |
maxRepositories |
integer | Maximum unique repositories to output. |
maxTagsPerRepository |
integer | Maximum tags to fetch per repository. |
descriptionMaxLength |
integer | Maximum characters kept from full descriptions. |
maxRuntimeSeconds |
integer | Optional self-imposed cap (31–270 seconds). Before it is reached, the Actor stops taking new repositories, writes PENDING_REPOSITORIES, and leaves time to shut down cleanly. |
Input recipes
Search popular database images
{"queries":["postgres","mysql","redis"],"includeTags":true,"maxRepositories":30,"maxTagsPerRepository":3,"outputMode":"repositories"}
Export tag digest inventory
{"repositories":["library/postgres"],"includeTags":true,"maxRepositories":5,"maxTagsPerRepository":25,"outputMode":"tags"}
Enumerate a vendor namespace
{"namespaces":["bitnami"],"includeTags":false,"maxRepositories":50,"outputMode":"repositories"}
Tips and limits
- Keep
maxTagsPerRepositorybounded for official images with thousands of tags. - Use
outputMode: "tags"when you need a flat export of tag digests and architecture metadata. - Use repository mode when you want one row per image with a compact nested tag sample.
- The Actor only exports public Docker Hub metadata and does not access private repositories or vulnerability scan data.
- Every repository is saved progressively. If the run approaches its time limit,
PENDING_REPOSITORIESrecords the unprocessed work andRUN_SUMMARYexplains what completed and why. - Use
maxRuntimeSecondswhen you need a predictable bounded run. The pending-work record lists canonical repository names so you can run those names again in a later job; it never silently changes your search or namespace filters.
API usage
Node.js
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('fetch_cat/docker-hub-repositories-scraper').call({
repositories: ['library/postgres'],
includeTags: true,
maxTagsPerRepository: 10,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
Python
from apify_client import ApifyClient
client = ApifyClient('YOUR_APIFY_TOKEN')
run = client.actor('fetch_cat/docker-hub-repositories-scraper').call(run_input={
'repositories': ['library/postgres'],
'includeTags': True,
'maxTagsPerRepository': 10,
})
items = client.dataset(run['defaultDatasetId']).list_items().items
print(items)
cURL
curl -X POST 'https://api.apify.com/v2/acts/fetch_cat~docker-hub-repositories-scraper/runs?token=YOUR_APIFY_TOKEN' \
-H 'Content-Type: application/json' \
-d '{"repositories":["library/postgres"],"includeTags":true,"maxTagsPerRepository":10}'
MCP and agents
Use this Actor from AI agents through Apify MCP:
claude mcp add apify https://mcp.apify.com/?tools=fetch_cat/docker-hub-repositories-scraper
JSON config:
{
"mcpServers": {
"apify": {
"url": "https://mcp.apify.com/?tools=fetch_cat/docker-hub-repositories-scraper"
}
}
}
Example prompts:
- "Export the latest public tags for library/postgres from Docker Hub."
- "Find Docker Hub repositories matching redis and summarize pull counts."
- "Create a CSV of image digests and architectures for library/nginx."
Support
Questions or issues? Open the Issues tab on the Actor page and include:
- The input JSON you used.
- The expected output.
- The actual output or error message.
- A reproducible public URL from Docker Hub, such as a repository or namespace page.
- Your Apify run ID.