Crates.io Scraper
Pricing
from $3.00 / 1,000 results
Crates.io Scraper
Scrape Crates.io with the official Rust package registry. Search crates, lookup by exact name, browse by category or keyword, list a user's crates, and pull reverse dependencies. Returns downloads, versions, licenses, repository URLs, categories, keywords, and more.
Pricing
from $3.00 / 1,000 results
Rating
5.0
(7)
Developer
Crawler Bros
Maintained by CommunityActor stats
7
Bookmarked
2
Total users
1
Monthly active users
3 days ago
Last modified
Categories
Share
Scrape Crates.io — the official Rust package registry — at scale via the public REST API. Search crates, look up exact names, browse categories or keywords, list a user's published crates, or pull reverse dependencies for any crate. Returns full metadata: downloads, version history, license, repository, categories, keywords, owners, and more.
What this actor does
-
Six modes:
search— free-text query over the crate catalogbyCrates— exact crate-name lookup (one record per name)byCategory— browse a category slug (58 categories supported)byKeyword— browse a keyword tag (cli,async,wasm, etc.)userCrates— every crate published by a given crates.io userreverseDeps— every crate that depends on a given source crate
-
Sort orders: relevance, alphabetical, recent updates, recent downloads (90-day), all-time downloads, newest
-
Powerful filters: all-time download range, 90-day download range, version-count range, updated-since-days, substring keyword match
-
Optional enrichments: full version history (per-crate), owner users + teams
-
Pure HTTP via the public
crates.io/api/v1JSON API — no proxy, no cookies, no API key
Output per crate
| Field | Description |
|---|---|
id | Crate name (same as name) |
name | Crate name |
description | Short description from Cargo.toml |
homepage | Project homepage URL |
documentation | External docs URL (usually docs.rs/...) |
repository | Source repository URL |
downloads | All-time downloads |
recentDownloads | Downloads in the last 90 days |
maxVersion | Highest version published (incl. pre-release) |
maxStableVersion | Highest stable version |
newestVersion | Most recently published version |
defaultVersion | The version shown on the crate page |
versionCount | Total number of published versions |
yanked | true if the latest version is yanked |
categories[] | Category slugs |
categoryTitles[] | Human-readable category names (detail mode) |
keywords[] | Keyword tags |
createdAt | First-publish timestamp (ISO 8601) |
updatedAt | Latest-update timestamp (ISO 8601) |
exactMatch | Whether the search query matched this crate's name exactly |
badges[] | Crate badges |
links{} | Absolute URLs to upstream sub-resources (versions, owners, etc.) |
crateUrl | https://crates.io/crates/{name} |
docsRsUrl | https://docs.rs/{name} |
versions[] | (optional) Per-version detail: num, downloads, license, crateSize, publishedAt, publishedBy, features, rustVersion, edition |
owners{} | (optional) users[] + teams[] lists |
recordType | crate (or reverseDependency for that mode) |
scrapedAt | ISO 8601 timestamp |
Empty fields are omitted — every key in the output has a real value.
reverseDeps mode output
When mode=reverseDeps, each record is a consumer crate (one that depends on the source crate), with: name, crateUrl, versionNum, requirement, kind (normal/dev/build), optional, defaultFeatures, features[], consumerDownloads, license, publishedAt, plus sourceCrate for context.
Input
| Field | Type | Default | Description |
|---|---|---|---|
mode | string | search | One of search, byCrates, byCategory, byKeyword, userCrates, reverseDeps |
searchQuery | string | tokio | Free-text query (mode=search) |
crateNames | array | – | Exact crate names (mode=byCrates) |
category | enum | – | Category slug (58 options) |
keyword | string | – | Keyword tag |
userLogin | string | – | Crates.io username (mode=userCrates) |
sourceCrate | string | – | Crate name (mode=reverseDeps) |
sortBy | enum | relevance | relevance, alphabetical, recent-updates, recent-downloads, downloads, new |
minDownloads / maxDownloads | int | – | All-time download bounds |
minRecentDownloads / maxRecentDownloads | int | – | 90-day download bounds |
minVersionCount / maxVersionCount | int | – | Version-count bounds |
updatedSinceDays | int | – | Only emit crates updated within N days |
containsKeyword | string | – | Case-insensitive substring filter |
includeVersions | bool | false | Fetch full version history per crate |
includeOwners | bool | false | Fetch owner users + teams per crate |
maxItems | int | 20 | Hard cap (1–5000) |
Example use cases
Find the most-downloaded async runtimes
{"mode": "byCategory","category": "asynchronous","sortBy": "downloads","maxItems": 25}
Top CLI crates updated in the last 30 days
{"mode": "byKeyword","keyword": "cli","sortBy": "recent-updates","updatedSinceDays": 30,"maxItems": 50}
Lookup specific crates with full version history
{"mode": "byCrates","crateNames": ["serde", "tokio", "clap"],"includeVersions": true,"includeOwners": true}
All crates by David Tolnay
{"mode": "userCrates","userLogin": "dtolnay","sortBy": "downloads","maxItems": 100}
Reverse dependencies of clap
{"mode": "reverseDeps","sourceCrate": "clap","maxItems": 200}
Data Source
All data comes from the public crates.io REST API (https://crates.io/api/v1). The API is rate-limited by user-agent — this actor identifies itself politely per the crates.io data-access policy.
No authentication. No proxy required. No cookies. Works on the Apify free plan.
Limitations
- The crates.io reverse-dependencies endpoint can 500 for extremely popular crates (e.g.
serde_json,tokio). The actor surfaces this via a status message and asks you to pick a smaller source crate. - Crates.io paginates search results; this actor stops after 2–3 consecutive empty pages (after filters) or when
maxItemsis hit. - Versions enrichment is capped at the 50 most recent versions per crate to keep payloads reasonable.
FAQ
Q: Do I need an API key? No. crates.io's REST API is fully public.
Q: Does it work without proxy? Yes. The actor runs without any proxy configuration.
Q: How fresh is the data? Real-time. Every record is built from a live API call.
Q: Can I get download stats per day?
The per-version daily download stats are available via the /crates/{name}/downloads upstream endpoint. To keep dataset payloads compact, this actor surfaces aggregated downloads (all-time) and recentDownloads (90-day) on every record. Daily breakdown is exposed only when needed and is out of scope for this version.
Q: Why am I missing some fields for some crates?
Empty fields are dropped from the output (no nulls, no empty strings). If a crate has no homepage or no repository, those keys won't appear on its record.