Docker Hub Repository Scraper avatar

Docker Hub Repository Scraper

Pricing

from $2.67 / 1,000 results

Go to Apify Store
Docker Hub Repository Scraper

Docker Hub Repository Scraper

Collect Docker Hub repository records through keyword searches, publisher listings or direct lookups. Results include repository names, publishers, descriptions, pull and star counts, update dates and official status; optionally include recent tags and their architectures.

Pricing

from $2.67 / 1,000 results

Rating

0.0

(0)

Developer

Axiom Works

Axiom Works

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

5 days ago

Last modified

Categories

Share

Docker Hub Image Scraper

Returns: one row per Docker Hub repository with repository, publisher, description, pullCount, starCount, lastUpdated, isOfficial and tags. Input: {"searchQueries": ["postgres"], "maxItems": 10, "includeTags": true, "maxTagsPerRepo": 3} Best for: container image catalogues, tracking pull and star counts over time, finding fresh and popular images.

{
"id": "library/postgres",
"sourceUrl": "https://hub.docker.com/v2/repositories/library/postgres/",
"repository": "library/postgres",
"description": "The PostgreSQL object-relational database system provides reliability and data integrity.",
"pullCount": 11882301384,
"starCount": 15033,
"lastUpdated": "2026-10-07T22:07:37.55173Z",
"isOfficial": true
}

The local search-URL check returned library/alpine with tag latest. One platform entry from that run was:

{
"architecture": "amd64",
"os": "linux",
"variant": null,
"digest": "sha256:d56c381f961d307a21b3ca004cf1e3910f106644aefb1f43e654c8a56c4fd395",
"size": 3849738,
"lastPushed": "2026-09-17T23:24:21.672705237Z",
"lastPulled": "2026-10-15T23:59:50.236887877Z"
}

What does Docker Hub Image Scraper do?

Docker Hub Image Scraper collects public image repository data from Docker Hub and returns it as clean, structured records. You can search images by keyword, list every public repository of a publisher such as an organisation or a user, or look up a list of specific images by name or URL. Each record carries the repository name, publisher, short description, pull count, star count, last update time, official flag, registration date, Docker Hub categories and, if you ask for it, the most recently updated tags with the architectures they were built for.

No Docker login or access token is needed. Public API requests are paced at two per second with retries. This Actor is not affiliated with or endorsed by Docker, Inc.

Typical uses of the data:

  • Compare the pull count and star count of images, and rerun the Actor on a schedule to build your own history.
  • Build a catalogue of every public image published by one organisation, for example a vendor you depend on.
  • Find which images are Docker Official Images and which are community builds, using the official flag.
  • Check how fresh an image is by reading its last update time and the update time of its latest tags.
  • Read the architectures listed for each recent tag, such as linux/arm64, to see which platforms it was built for.
  • Feed a list of image names into a dashboard, a spreadsheet, a database or a language model pipeline.

What data can you get?

Every record has a stable id (the repository name in namespace/name form) and a sourceUrl that tells you which API endpoint the data came from. Official images such as nginx live in the library namespace, so their id is library/nginx.

FieldTypeDescription
idstringStable identifier, namespace/name.
sourceUrlstringAPI endpoint the record was read from.
urlstringPublic Docker Hub page of the repository.
repositorystringFull repository name, namespace/name.
namespacestringNamespace the repository lives in.
namestringRepository name without the namespace.
publisherstringUser or organisation that publishes the image. Official images show library.
descriptionstringShort description of the image. Some repositories have none.
pullCountnumberTotal number of pulls.
starCountnumberNumber of stars.
lastUpdatedstringTime of the last push, in ISO 8601 format.
isOfficialbooleanTrue for Docker Official Images.
dateRegisteredstringWhen the repository was created, in ISO 8601 format.
categoriesarrayCategory names Docker Hub lists for the repository, when it has any.
tagsarrayRecent tags, each with name, lastUpdated, lastPushed, fullSize (bytes), digest and architectures. Present when tags are included.
isAutomatedbooleanTrue if the repository uses Docker Hub automated builds.
lastModifiedstringWhen the repository metadata last changed, ISO 8601.
hubUserstringDocker Hub account that maintains the repository.
statusstringRepository status, for example active.
fullDescriptionstringFull README text of the repository. Only present when you turn it on.
categorystringPurpose chosen by an AI processor. Only present when you turn AI classification on and it succeeds.

Architectures are written as os/arch or os/arch/variant, for example linux/amd64 or linux/arm/v7. Entries with an unknown platform, which are the attestation manifests that some builds attach, are left out so that the list shows real platforms only.

Search URLs can be supplied in searchQueries, for example {"searchQueries":["https://hub.docker.com/search?q=redis"],"maxItems":1}. The Actor reads the q or query parameter; other URL parameters do not apply filters. Use onlyOfficial, minStars and minPulls explicitly to filter results. Ordinary keyword inputs continue to work, and all target forms share the same repository limit.

Each tag now also contains images, an array of platform records with architecture, os, variant, digest, size, lastPushed and lastPulled. This connects each digest and byte size to its specific platform, rather than requiring callers to infer the relationship from the tag's architecture labels. Unknown attestation platforms are excluded just as they are from architectures. Missing platform values are null. These are registry observations, not signature checks or vulnerability assessments.

How to use Docker Hub Image Scraper

  1. Open the Actor and go to the Input tab.
  2. Fill in at least one of the three targets: search queries, repositories or publishers (namespaces). You can combine them in one run. Records are de-duplicated, so an image found through two routes is saved once.
  3. Set the maximum number of repositories. The run stops as soon as that many records are saved.
  4. Decide whether you want tags, the full README text and AI classification. Each of these is optional.
  5. Start the run and download the dataset as JSON, CSV, Excel or through the API.

A few details about how each target behaves:

For API and MCP calls, provide at least one target explicitly: the search prefill shown in the Console is not an API default. A small shared maxItems limit such as 1 or 10 keeps agent previews short. Set includeTags to false when only repository counts and descriptions are needed.

Search queries. The Actor calls Docker Hub's repository search and follows the result pages of 100 hits each. The search results do not include the last update time or the registration date, so the Actor makes one extra request per repository to read them. Docker Hub stops answering deep paging requests after roughly the first 10,000 results of a query; the Actor treats that as the end of the results and keeps what it has. The Actor keeps results whose name or short description contains every query word of at least three letters; numeric-only fragments are ignored. This filters unrelated fuzzy matches, including nonsense queries. If your search is broad, narrow it down or split it into several queries.

Repositories. Give namespace/name such as grafana/grafana, a bare official name such as nginx (which means library/nginx), or a Docker Hub URL such as https://hub.docker.com/r/bitnami/redis. A repository that does not exist or is private is skipped with a warning.

Publishers. Give an organisation or user name such as bitnami. The Actor lists all of its public repositories, 100 per page, and the listing holds counts and dates. The Actor also fetches repository details when the listing omits automated-build status or the maintaining account, so isAutomated and hubUser are populated when Docker Hub provides them.

Input

FieldTypeDescription
searchQueriesarray of stringsKeywords to search Docker Hub images, for example postgres.
repositoriesarray of stringsImages to look up: namespace/name, a bare official name or a Docker Hub URL.
namespacesarray of stringsPublisher or organisation names whose public repositories are all listed.
maxItemsintegerMaximum number of repositories to output, 1 to 10000. Default 50.
includeTagsbooleanAdd recent tags with update time and architectures. Default true.
maxTagsPerRepointegerNumber of recent tags per repository, 1 to 100. Default 5.
includeFullDescriptionbooleanAdd the full README text as fullDescription. Default false.
onlyOfficialbooleanKeep only Docker Official Images. Default false.
minStarsintegerSkip repositories with fewer stars. Default 0 (off).
minPullsintegerSkip repositories with fewer total pulls. Default 0 (off).
enrichWithAibooleanAdd an AI-chosen category. Default false.
proxyConfigurationobjectApify Proxy settings. Off by default.

The three filters (onlyOfficial, minStars, minPulls) are applied before counting, so maxItems counts only repositories that pass them.

Example input:

{
"searchQueries": ["postgres"],
"maxItems": 10,
"includeTags": true,
"maxTagsPerRepo": 3
}

Another example that lists a publisher without tags:

{
"namespaces": ["bitnami"],
"maxItems": 30,
"includeTags": false
}

And one that looks up named images:

{
"repositories": ["library/nginx", "grafana/grafana", "https://hub.docker.com/r/bitnami/redis"],
"includeTags": true
}

If none of the three targets is filled in, the run fails with a clear message. If a target finds nothing, for example a nonsense search term or a dead repository name, the run finishes with zero items and a warning in the log. Placeholder or error records are never added to the dataset.

Output

Each repository becomes one dataset item. This is a real item from a search for postgres, shortened to three tags:

{
"id": "circleci/postgres",
"sourceUrl": "https://hub.docker.com/v2/repositories/circleci/postgres/",
"url": "https://hub.docker.com/r/circleci/postgres",
"repository": "circleci/postgres",
"namespace": "circleci",
"name": "postgres",
"publisher": "circleci",
"description": "The PostgreSQL object-relational database system provides reliability and data integrity.",
"pullCount": 510217464,
"starCount": 35,
"lastUpdated": "2021-12-18T00:17:52.12949Z",
"isOfficial": false,
"dateRegistered": "2017-03-27T16:02:50.357893Z",
"categories": [],
"tags": [
{ "name": "9-bullseye-ram", "lastUpdated": "2021-12-18T00:17:51.834178Z", "architectures": ["linux/amd64"] },
{ "name": "9.6-bullseye-ram", "lastUpdated": "2021-12-18T00:17:51.276415Z", "architectures": ["linux/amd64"] },
{ "name": "9.6.24-bullseye-ram", "lastUpdated": "2021-12-18T00:17:50.800576Z", "architectures": ["linux/amd64"] }
]
}

The overview view of the dataset shows the repository, publisher, description, pull count, star count, last update, official flag, registration date, categories, tags and page URL as a table. Pull and star counts are numbers, so you can sort and filter them directly in a spreadsheet.

How much does it cost?

The Actor is charged per result: you pay for each repository record saved to the dataset, and runs that find nothing cost nothing for results. When you turn on AI classification, a repository whose category was successfully added is charged as an enriched result. If the AI step fails for a repository, the record is still saved with its normal data and no enrichment charge is made. See the Pricing tab of the Actor for the current rates, because they can change. Setting a low maxItems is the simplest way to cap the cost of a run, and the Actor never saves or charges for more records than that limit.

Use with AI agents (MCP)

You can call this Actor from an AI assistant through the Apify MCP server. Add the Actor to your client configuration like this:

{
"mcpServers": {
"apify": {
"url": "https://mcp.apify.com?tools=axiomworks/docker-hub-image-scraper"
}
}
}

Example prompts:

  • "Search Docker Hub for redis images and show me the five with the most pulls."
  • "List the public repositories published by bitnami and tell me which were updated this month."
  • "Look up grafana/grafana and library/nginx and compare their star counts and latest tag architectures."

For agents, the fields to know are searchQueries, repositories and namespaces for the target, and maxItems for the limit, 1 to 10000 with a default of 50.

Integrations and API

You can run the Actor from code and read the dataset through the Apify API. Use your own token, kept in the APIFY_TOKEN environment variable or sent as an Authorization Bearer header.

Python:

from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("axiomworks/docker-hub-image-scraper").call(
run_input={"searchQueries": ["postgres"], "maxItems": 10, "includeTags": True}
)
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item["repository"], item["pullCount"], item["starCount"])

JavaScript:

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('axiomworks/docker-hub-image-scraper').call({
namespaces: ['bitnami'],
maxItems: 30,
includeTags: false,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((i) => process.stdout.write(`${i.repository}\n`));

cURL:

curl -X POST "https://api.apify.com/v2/acts/axiomworks~docker-hub-image-scraper/run-sync-get-dataset-items" \
-H "Authorization: Bearer $APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"repositories": ["library/nginx", "grafana/grafana"], "includeTags": true}'

The Actor also works with Apify schedules, webhooks and integrations such as Google Sheets, Zapier, Make and n8n, so you can refresh your image catalogue on a timetable.

FAQ

Do I need a Docker account or token? No. Only public repositories are read, and nothing behind a login is accessed.

Why do I get fewer results than I asked for? Either fewer repositories exist for your input, or a search reached Docker Hub's paging cap of about 10,000 results. Warnings in the run log say which one happened.

Why is description empty for some repositories? Some publishers never write a description. The field is then null.

Why is categories empty? Categories are optional labels, and many repositories have none.

Why is tags null? You turned includeTags off, or the tag request failed after several retries. A repository with no tags returns an empty list.

What does the proxy setting do? By default the Actor connects directly. If you see rate limit warnings (HTTP 429) in your log, enable Apify Proxy in the input and the Actor will use a fresh proxy session on every retry.

How fast is it? Searches need about two to three requests per repository, so a run for 100 repositories with tags takes a few minutes. Publisher listings also need repository detail requests when the list omits automated-build status or the maintaining account.

Is the AI classification reliable? It is a quick guess from the name and description only. It uses a third-party AI processor, which receives the repository name and description. Check results before relying on them.

The Actor only collects public information that Docker Hub shows to any visitor without logging in, and it keeps a modest request rate. Public repository metadata such as names, counts and dates is generally not personal data, but a publisher name can identify a person, so handle it according to the privacy law that applies to you. Docker Hub's terms of service may limit automated access, and you are responsible for using the data in line with those terms and with the law in your country. This is not legal advice; ask a lawyer if you plan a commercial use that depends on the data.

Feedback

If a field is missing, a result looks wrong or you need another kind of data from Docker Hub, open an issue from the Actor page and include the input and the run link. Reports with a concrete example are fixed fastest.