Maven Central Scraper: Java Artifacts & Coordinates
Pricing
from $0.37 / 1,000 artifact scrapeds
Maven Central Scraper: Java Artifacts & Coordinates
Search Maven Central for Java artifacts: groupId, artifactId, version history, packaging, classifiers and publish timestamps. No login, no proxy, no browser.
Pricing
from $0.37 / 1,000 artifact scrapeds
Rating
0.0
(0)
Developer
Arman Hossain
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
0
Monthly active users
19 days ago
Last modified
Categories
Share

Searches the Maven Central index for JVM artifacts and returns structured rows. You get groupId, artifactId, version, packaging, the classifier list, version count, publish timestamp and ready-made links to the artifact page and the raw repository directory.
Maven Central publishes a searchable index over the repository, and this Actor reads it directly. There's no browser, no proxy, no login and no credentials to manage. One query is one request, 200 rows come back per request, and paging is automatic.
Agent skill: SKILL.md
https://api.apify.com/v2/key-value-stores/t7YoTxpZEJOWvw4Ug/records/maven-central-scraper.md
What you get
| Field | What it holds |
|---|---|
query | The normalised Solr query the row came from |
coordinate | Full Maven coordinate: group:artifact in latest mode, group:artifact:version in per-version mode |
groupId, artifactId, version | The coordinate split into parts |
isLatestVersion | true when the row is the artifact's newest version, false for historical version rows |
versionCount | Total published versions, in latest mode only, null otherwise |
packaging | jar, pom, bundle, aar, war and friends |
classifiers | Every file extension and classifier published for the version, such as ["-sources.jar", "-javadoc.jar", ".jar", ".pom"] |
keywords | Description keywords from the index, per-version mode only |
repositoryId | Source repository, in practice always central, latest mode only |
publishedAt, publishedAtMs | Publish time as ISO 8601 and as the raw epoch milliseconds Maven returns |
artifactUrl, versionUrl | Sonatype Central pages for the artifact and for that exact version |
repositoryUrl | The repo1.maven.org directory holding the actual files |
scrapedAt | Run timestamp |
RUN_SUMMARY in the key-value store holds per-run counts, the filters you used, and any query that failed.
Use cases
- SBOM and dependency audits. Resolve every coordinate in a lockfile to its true latest version and publish date.
- Outdated-dependency reports. Compare what your builds pin against the latest version across whole groups.
- Release-history reconstruction. Turn
latestOnlyoff and get every version a library ever shipped, with dates. - Supply-chain checks. Spot artifacts with no
-sources.jar, unexpected packaging, or a suspiciously recent first publish. - OSS traction tracking. Release cadence per quarter is a decent proxy for whether a project is alive.
Quick start
Two artifacts, newest version of each:
{"queries": ["com.google.guava:guava", "org.springframework:spring-core"]}
Everything a group publishes, jars only:
{"queries": ["g:com.fasterxml.jackson.core", "g:org.apache.commons"],"latestOnly": true,"maxResultsPerQuery": 200,"packagingFilter": ["jar", "bundle"]}
Full release history for one library, one row per version:
{"queries": ["org.springframework:spring-core"],"latestOnly": false,"maxResultsPerQuery": 500}
Input
| Field | Type | Default | Notes |
|---|---|---|---|
queries | array | required | Solr syntax like g:com.google.guava, a coordinate like com.google.guava:guava which is expanded to g:. AND a:., or free-text keywords. |
latestOnly | boolean | true | On gives one row per artifact, newest version. Off gives one row per published version. |
maxResultsPerQuery | integer | 100 | Rows saved per query. 0 means everything the query matches. Paged 200 at a time. |
packagingFilter | array | [] | Keep only these packaging types. Applied after fetching, so it does not reduce request count. Empty means all. |
Free text only works in latest mode. The per-version index has no free-text field and answers HTTP 400 to keyword searches. The Actor checks for this before sending anything and records a query-specific message in RUN_SUMMARY.failures telling you to switch latestOnly on or name a group.
Output example
A real record from com.google.guava:guava:
{"query": "g:com.google.guava AND a:guava","coordinate": "com.google.guava:guava","groupId": "com.google.guava","artifactId": "guava","version": "33.4.8-jre","isLatestVersion": true,"versionCount": 150,"packaging": "bundle","classifiers": [".module", "-sources.jar", ".pom", "-javadoc.jar", ".jar"],"keywords": [],"repositoryId": "central","publishedAt": "2025-04-14T17:25:22.422Z","publishedAtMs": 1744651522422,"artifactUrl": "https://central.sonatype.com/artifact/com.google.guava/guava","versionUrl": "https://central.sonatype.com/artifact/com.google.guava/guava/33.4.8-jre","repositoryUrl": "https://repo1.maven.org/maven2/com/google/guava/guava/33.4.8-jre/","scrapedAt": "2026-08-06T11:45:18.892Z"}
The same query with latestOnly: false returns 150 rows instead of one. Same coordinate, one row per version, each with its own publishedAt, packaging and classifiers, plus keywords filled in and versionCount and repositoryId set to null.
Writing a query
| You want | Write |
|---|---|
| One artifact | com.google.guava:guava or g:com.google.guava AND a:guava |
| One exact version | com.google.guava:guava:33.4.8-jre |
| Everything in a group | g:org.apache.commons |
| Every group publishing a given artifact name | a:spring-core |
| Keyword search, latest mode only | kafka client |
Coordinates are the shortcut: group:artifact and group:artifact:version are rewritten into proper Solr clauses before the request. Anything already containing g:, a:, v:, AND or OR is passed through untouched, so full Solr expressions work as they are.
API example
curl -X POST "https://api.apify.com/v2/acts/arman-bd~maven-central-scraper/run-sync-get-dataset-items?token=YOUR_TOKEN" \-H "Content-Type: application/json" \-d '{"queries": ["com.google.guava:guava", "g:org.apache.commons"],"latestOnly": true,"maxResultsPerQuery": 50}'
JavaScript example
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: 'YOUR_TOKEN' });const run = await client.actor('arman-bd/maven-central-scraper').call({queries: ['org.springframework:spring-core'],latestOnly: false,maxResultsPerQuery: 300,});const { items } = await client.dataset(run.defaultDatasetId).listItems();for (const a of items) console.log(`${a.coordinate} (${a.packaging}) published ${a.publishedAt}`);
Limits and behaviour
- The index caps out at 200 rows per request. Solr accepts larger
rowsvalues but silently falls back to 20 above 200, so the Actor pages at exactly 200 and advances by the number of documents actually returned. - The index is intermittently slow. Requests that normally take 400 ms occasionally stall for a minute or more. Each request gets 30 seconds and up to three attempts with linear backoff, and a stalled request usually succeeds on the retry. Give broad runs a generous Actor timeout.
- There are two indexes with two shapes. Latest mode returns
versionCountandrepositoryIdbut no keywords, and per-version mode returnskeywordsbut neither of the other two. Both shapes are emitted with the same key set andnullwhere the index has nothing, so records never gain or lose fields. - Timestamps are publish times, not release announcements.
publishedAtis when the file landed in Central, which for a staged release is usually within minutes of the announcement rather than identical to it. - Filters are applied after fetching.
packagingFilterreduces the dataset, not the number of requests, andmaxResultsPerQuerycounts rows saved, so a strict filter pages further to fill the quota. - Public data only. No authentication, no personal data, nothing that gets around access controls.
FAQ
Do I need a Maven Central account? No. You supply no credentials.
Why did latestOnly: false reject my keyword search? The per-version index only supports field queries. Name a group or artifact with g:, a:, or a coordinate, or leave latestOnly on.
How many versions can I get for one artifact? All of them. Spring Core returns 311 rows, and maxResultsPerQuery: 0 removes the cap.
Does it download the JARs? No. It returns repositoryUrl, the directory on repo1.maven.org holding the .jar, .pom and signatures, so you can fetch exactly what you need.
Can I tell whether a version is a pre-release? Not from a dedicated field, because Maven has none. The version string carries it: -M6, -RC1, -SNAPSHOT, -alpha. Filter on version yourself.
Can I plug it into something else? Yes. Apify API, the client libraries, webhooks, scheduled runs, dataset exports to JSON, CSV or Excel, or MCP. The output is structured JSON.
