Maven Central Scraper: Java Artifacts & Coordinates avatar

Maven Central Scraper: Java Artifacts & Coordinates

Pricing

from $0.37 / 1,000 artifact scrapeds

Go to Apify Store
Maven Central Scraper: Java Artifacts & Coordinates

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

Arman Hossain

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

0

Monthly active users

19 days ago

Last modified

Share

Maven Central Scraper: Java artifacts by coordinate or group, group ID, artifact ID, version, packaging and publish date

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

FieldWhat it holds
queryThe normalised Solr query the row came from
coordinateFull Maven coordinate: group:artifact in latest mode, group:artifact:version in per-version mode
groupId, artifactId, versionThe coordinate split into parts
isLatestVersiontrue when the row is the artifact's newest version, false for historical version rows
versionCountTotal published versions, in latest mode only, null otherwise
packagingjar, pom, bundle, aar, war and friends
classifiersEvery file extension and classifier published for the version, such as ["-sources.jar", "-javadoc.jar", ".jar", ".pom"]
keywordsDescription keywords from the index, per-version mode only
repositoryIdSource repository, in practice always central, latest mode only
publishedAt, publishedAtMsPublish time as ISO 8601 and as the raw epoch milliseconds Maven returns
artifactUrl, versionUrlSonatype Central pages for the artifact and for that exact version
repositoryUrlThe repo1.maven.org directory holding the actual files
scrapedAtRun 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 latestOnly off 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

FieldTypeDefaultNotes
queriesarrayrequiredSolr syntax like g:com.google.guava, a coordinate like com.google.guava:guava which is expanded to g:. AND a:., or free-text keywords.
latestOnlybooleantrueOn gives one row per artifact, newest version. Off gives one row per published version.
maxResultsPerQueryinteger100Rows saved per query. 0 means everything the query matches. Paged 200 at a time.
packagingFilterarray[]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 wantWrite
One artifactcom.google.guava:guava or g:com.google.guava AND a:guava
One exact versioncom.google.guava:guava:33.4.8-jre
Everything in a groupg:org.apache.commons
Every group publishing a given artifact namea:spring-core
Keyword search, latest mode onlykafka 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 rows values 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 versionCount and repositoryId but no keywords, and per-version mode returns keywords but neither of the other two. Both shapes are emitted with the same key set and null where the index has nothing, so records never gain or lose fields.
  • Timestamps are publish times, not release announcements. publishedAt is 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. packagingFilter reduces the dataset, not the number of requests, and maxResultsPerQuery counts 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.