# crates.io

> Read the Rust package registry from a workflow. Search all 300,000+ crates by name, description, category or keyword, read a crate's metadata, licence, owners and README, and walk its full version history with each release's date, size, checksum and minimum Rust version. List what a version depends on and which crates depend on it, chart 90 days of downloads for a crate or a single version, and get the download URL and SHA-256 of any .crate file. Browse the registry's categories and keywords, look up users and teams, read the front-page summary, and check whether crates.io is accepting writes before a release goes out. Every action reads: nothing here changes anything on crates.io. No account or API token required.

App · Code Repositories · 22 actions. Web page: https://docs.lodol.com/docs/integrations/crates-io

## Actions

### Get a category

Get one category with its description, how many crates it holds, and the categories above and below it (crates.io nests them, so 'no-std' has 'no-std::no-alloc' under it). No API token required.

**Inputs**

- Category (`category`, text, required): Which category to read. The list comes from crates.io, so it is always the categories that actually exist.

**Outputs**

- `category` (object): One of crates.io's curated categories.
- `parent_categories` (list): The categories it sits under.
- `subcategories` (list): The categories nested under it.

**Example output**

```json
{
  "category": {
    "crates_count": 3798,
    "created_at": "2019-12-13T13:46:41Z",
    "description": "For crates that focus on some individual part of accelerating the development of games.",
    "name": "Game development",
    "slug": "game-development",
    "url": "https://crates.io/categories/game-development"
  },
  "parent_categories": [],
  "subcategories": []
}
```

### Get a crate

Get everything crates.io publishes about a crate: what it is, its current version, its licence, its repository, how many times it has been downloaded all time and in the last 90 days, and the keywords and categories it is filed under. The starting point for almost any workflow about a crate. No API token required.

**Inputs**

- Crate name (`crate`, text, required): The crate's name on crates.io, e.g. serde. Hyphens and underscores are interchangeable, so 'serde-json' and 'serde_json' both find the same crate.

**Outputs**

- `categories` (list): The categories it is filed under.
- `crate` (object): A crate as crates.io describes it.
- `default_version` (object): The full metadata of the version the crate's page shows, so a lookup usually needs only this one step.
- `keywords` (list): Its keywords, each with how many other crates use it.
- `requested_name` (text): The name that was asked for.
- `resolved_name` (text): The spelling crates.io stores the crate under, which differs from the name asked for when that spelled a hyphen where the crate has an underscore, or the other way round.

**Example output**

```json
{
  "categories": [
    {
      "crates_count": 3798,
      "created_at": "2019-12-13T13:46:41Z",
      "description": "For crates that focus on some individual part of accelerating the development of games.",
      "name": "Game development",
      "slug": "game-development",
      "url": "https://crates.io/categories/game-development"
    }
  ],
  "crate": {
    "categories": [
      "no-std",
      "encoding",
      "no-std::no-alloc"
    ],
    "created_at": "2014-12-05T20:20:39Z",
    "default_version": "1.0.229",
    "description": "A generic serialization/deserialization framework",
    "documentation": "https://docs.rs/serde",
    "downloads": 1301029880,
    "homepage": "https://serde.rs",
    "keywords": [
      "no_std",
      "serde",
      "serialization"
    ],
    "name": "serde",
    "newest_version": "1.0.229",
    "num_versions": 316,
    "recent_downloads": 277037661,
    "repository": "https://github.com/serde-rs/serde",
    "trusted_publishing_only": false,
    "updated_at": "2026-07-18T23:05:13Z",
    "url": "https://crates.io/crates/serde",
    "yanked": false
  },
  "default_version": {
    "audit_trail": [
      {
        "action": "publish",
        "at": "2026-07-18T23:05:13Z",
        "by": {
          "avatar_url": "https://avatars.githubusercontent.com/u/1940490?v=4",
          "created_at": "2012-07-09T03:55:40Z",
          "github_url": "https://github.com/dtolnay",
          "id": 3618,
          "login": "dtolnay",
          "name": "David Tolnay",
          "url": "https://crates.io/users/dtolnay"
        }
      }
    ],
    "binary_names": [],
    "checksum": "4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba",
    "crate": "serde",
    "created_at": "2026-07-18T23:05:13Z",
    "description": "A generic serialization/deserialization framework",
    "documentation": "https://docs.rs/serde",
    "download_url": "https://crates.io/api/v1/crates/serde/1.0.229/download",
    "downloads": 43016438,
    "edition": "2021",
    "features": [
      {
        "enables": [
          "std"
        ],
        "name": "default"
      }
    ],
    "has_library": true,
    "homepage": "https://serde.rs",
    "id": 2817185,
    "license": "MIT OR Apache-2.0",
    "line_counts": {
      "languages": [
        {
          "code_lines": 11574,
          "comment_lines": 302,
          "files": 25,
          "language": "Rust"
        }
      ],
      "total_code_lines": 11574,
      "total_comment_lines": 302
    },
    "links_native_library": null,
    "published_by": {
      "avatar_url": "https://avatars.githubusercontent.com/u/1940490?v=4",
      "created_at": "2012-07-09T03:55:40Z",
      "github_url": "https://github.com/dtolnay",
      "id": 3618,
      "login": "dtolnay",
      "name": "David Tolnay",
      "url": "https://crates.io/users/dtolnay"
    },
    "published_via": null,
    "repository": "https://github.com/serde-rs/serde",
    "rust_version": "1.56",
    "size_bytes": 83669,
    "updated_at": "2026-07-18T23:05:13Z",
    "url": "https://crates.io/crates/serde/1.0.229",
    "version": "1.0.229",
    "yank_message": null,
    "yanked": false
  },
  "keywords": [
    {
      "crates_count": 1512,
      "created_at": "2014-11-20T20:14:31Z",
      "keyword": "serialization",
      "url": "https://crates.io/keywords/serialization"
    }
  ],
  "requested_name": "serde",
  "resolved_name": "serde"
}
```

### Get a crate's download history

Get a crate's last 90 days of downloads: a total for each day, a total for each of its five newest versions, and the busiest day in the window. crates.io answers this one with around 450 raw rows; they are folded here into the series a chart or an alert actually wants. Narrow it to a date range to compare before and after a release. No API token required.

**Inputs**

- Crate name (`crate`, text, required): The crate's name on crates.io, e.g. serde. Hyphens and underscores are interchangeable, so 'serde-json' and 'serde_json' both find the same crate.
- From (`start_date`, date): Optional. Only days on or after this one. crates.io keeps 90 days, so anything earlier returns nothing.
- To (`end_date`, date): Optional. Only days on or before this one.

**Outputs**

- `average_per_day` (number): Mean downloads per day over the window.
- `busiest_day` (text): The day with the most downloads, as YYYY-MM-DD.
- `busiest_day_downloads` (number): How many downloads that day saw.
- `crate` (text): The crate this is about, as crates.io spells it.
- `daily` (list): One entry per day, oldest first, counting every version together.
- `days_covered` (number): How many days the window holds.
- `end_date` (text): The last day in the window.
- `older_versions_downloads` (number): Downloads of everything older than those five, which crates.io reports only as a lump sum.
- `start_date` (text): The first day in the window.
- `total_downloads` (number): Downloads over the whole window.
- `versions` (list): The five newest versions with their totals over the window, most downloaded first.

**Example output**

```json
{
  "average_per_day": 3084982.5,
  "busiest_day": "2026-08-20",
  "busiest_day_downloads": 4468532,
  "crate": "serde",
  "daily": [
    {
      "date": "2026-08-23",
      "downloads": 3084982
    }
  ],
  "days_covered": 90,
  "end_date": "2026-08-23",
  "older_versions_downloads": 49028058,
  "start_date": "2026-05-26",
  "total_downloads": 277648428,
  "versions": [
    {
      "downloads": 183868590,
      "version": "1.0.228"
    }
  ]
}
```

### Get a crate's README

Get the README shown on a crate's page. crates.io stores it already rendered, so this returns both the HTML and a plain-text flattening of it: the first to publish somewhere, the second to summarise, search or hand to an AI step. Kept out of Get a crate because it can run to hundreds of kilobytes, and cut to a length you choose. No API token required.

**Inputs**

- Crate name (`crate`, text, required): The crate's name on crates.io, e.g. serde. Hyphens and underscores are interchangeable, so 'serde-json' and 'serde_json' both find the same crate.
- Version (`version`, text): Optional. Which version to read. The list is fetched from crates.io, so it is always the versions this crate actually published. Leave blank for the version the crate's page shows.
- Maximum length (`max_characters`, number): Optional. Cut the README to this many characters. Between 1 and 200,000; 20,000 by default. From 1 to 200000. Default: `20000`.

**Outputs**

- `characters` (number): How long the plain text is before any cut.
- `crate` (text): The crate this is about, as crates.io spells it.
- `has_readme` (true/false): False when the version shipped without a README.
- `html` (text): The README as crates.io renders it, cut to the length asked for.
- `text` (text): The same README with the markup stripped, which is what to feed a summarising or searching step.
- `truncated` (true/false): True when the README was longer than the limit.
- `url` (text): Where crates.io stores the rendered README. Null when the version shipped without one.
- `version` (text): The version this is about.

**Example output**

```json
{
  "characters": 1619,
  "crate": "serde",
  "has_readme": true,
  "html": "<p><strong>Serde is a framework for serializing...</strong></p>",
  "text": "Serde is a framework for serializing and deserializing Rust data structures.",
  "truncated": false,
  "url": "https://static.crates.io/readmes/serde/serde-1.0.229.html",
  "version": "1.0.229"
}
```

### Get a keyword

Get one keyword and how many crates carry it, so a workflow can check whether a keyword is in use and how crowded it is before filtering a search by it. No API token required.

**Inputs**

- Keyword (`keyword`, text, required): The keyword to look up, exactly as authors spell it. Keywords are lower case and hold no spaces.

**Outputs**

- `keyword` (object): A keyword a crate's author chose for it.

**Example output**

```json
{
  "keyword": {
    "crates_count": 1512,
    "created_at": "2014-11-20T20:14:31Z",
    "keyword": "serialization",
    "url": "https://crates.io/keywords/serialization"
  }
}
```

### Get a team

Get a GitHub team that owns crates, by its crates.io login. Team logins are spelled github:<org>:<team>, e.g. github:rust-lang:crates-io. No API token required.

**Inputs**

- Team login (`team`, text, required): The team's crates.io login, spelled github:<org>:<team>. List a crate's owners shows the login of any team that owns a crate.

**Outputs**

- `team` (object): A GitHub team that can own crates.

**Example output**

```json
{
  "team": {
    "avatar_url": "https://avatars.githubusercontent.com/u/5430905?v=4",
    "github_url": "https://github.com/rust-lang",
    "id": 3393,
    "login": "github:rust-lang:crates-io",
    "name": "crates-io"
  }
}
```

### Get a user

Get a crates.io account by its username: their display name, their avatar, their GitHub profile and the numeric id the rest of the API uses. No API token required.

**Inputs**

- Username (`user`, text, required): Their crates.io username, which is their GitHub one. A pasted profile URL works too.

**Outputs**

- `user` (object): A crates.io account.

**Example output**

```json
{
  "user": {
    "avatar_url": "https://avatars.githubusercontent.com/u/1940490?v=4",
    "created_at": "2012-07-09T03:55:40Z",
    "github_url": "https://github.com/dtolnay",
    "id": 3618,
    "login": "dtolnay",
    "name": "David Tolnay",
    "url": "https://crates.io/users/dtolnay"
  }
}
```

### Get a user's download total

Get how many times everything a person has published has been downloaded, all time. crates.io's own endpoint wants an internal numeric id, so this takes the username and looks the id up for you. No API token required.

**Inputs**

- Username (`user`, text, required): Their crates.io username, which is their GitHub one. A pasted profile URL works too.

**Outputs**

- `total_downloads` (number): Downloads of every crate they own, added together, since each was published.
- `user` (object): A crates.io account.

**Example output**

```json
{
  "total_downloads": 25149708372,
  "user": {
    "avatar_url": "https://avatars.githubusercontent.com/u/1940490?v=4",
    "created_at": "2012-07-09T03:55:40Z",
    "github_url": "https://github.com/dtolnay",
    "id": 3618,
    "login": "dtolnay",
    "name": "David Tolnay",
    "url": "https://crates.io/users/dtolnay"
  }
}
```

### Get a version

Get one specific version of a crate: its licence, its size and checksum, the Cargo features it defines, the Rust edition and minimum compiler it needs, who published it and whether it came from a CI workflow rather than a person's token. Use it to read the metadata of the version a project pins, rather than whatever is newest today. No API token required.

**Inputs**

- Crate name (`crate`, text, required): The crate's name on crates.io, e.g. serde. Hyphens and underscores are interchangeable, so 'serde-json' and 'serde_json' both find the same crate.
- Version (`version`, text): Optional. Which version to read. The list is fetched from crates.io, so it is always the versions this crate actually published. Leave blank for the version the crate's page shows.

**Outputs**

- `crate` (text): The crate this is about, as crates.io spells it.
- `version` (object): One published version of a crate.

**Example output**

```json
{
  "crate": "serde",
  "version": {
    "audit_trail": [
      {
        "action": "publish",
        "at": "2026-07-18T23:05:13Z",
        "by": {
          "avatar_url": "https://avatars.githubusercontent.com/u/1940490?v=4",
          "created_at": "2012-07-09T03:55:40Z",
          "github_url": "https://github.com/dtolnay",
          "id": 3618,
          "login": "dtolnay",
          "name": "David Tolnay",
          "url": "https://crates.io/users/dtolnay"
        }
      }
    ],
    "binary_names": [],
    "checksum": "4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba",
    "crate": "serde",
    "created_at": "2026-07-18T23:05:13Z",
    "description": "A generic serialization/deserialization framework",
    "documentation": "https://docs.rs/serde",
    "download_url": "https://crates.io/api/v1/crates/serde/1.0.229/download",
    "downloads": 43016438,
    "edition": "2021",
    "features": [
      {
        "enables": [
          "std"
        ],
        "name": "default"
      }
    ],
    "has_library": true,
    "homepage": "https://serde.rs",
    "id": 2817185,
    "license": "MIT OR Apache-2.0",
    "line_counts": {
      "languages": [
        {
          "code_lines": 11574,
          "comment_lines": 302,
          "files": 25,
          "language": "Rust"
        }
      ],
      "total_code_lines": 11574,
      "total_comment_lines": 302
    },
    "links_native_library": null,
    "published_by": {
      "avatar_url": "https://avatars.githubusercontent.com/u/1940490?v=4",
      "created_at": "2012-07-09T03:55:40Z",
      "github_url": "https://github.com/dtolnay",
      "id": 3618,
      "login": "dtolnay",
      "name": "David Tolnay",
      "url": "https://crates.io/users/dtolnay"
    },
    "published_via": null,
    "repository": "https://github.com/serde-rs/serde",
    "rust_version": "1.56",
    "size_bytes": 83669,
    "updated_at": "2026-07-18T23:05:13Z",
    "url": "https://crates.io/crates/serde/1.0.229",
    "version": "1.0.229",
    "yank_message": null,
    "yanked": false
  }
}
```

### Get a version's download history

Get one version's daily downloads over the last 90 days, with its total, its average and its busiest day. Use it to watch a new release take up, or to see how much traffic an old version still gets before yanking it. No API token required.

**Inputs**

- Crate name (`crate`, text, required): The crate's name on crates.io, e.g. serde. Hyphens and underscores are interchangeable, so 'serde-json' and 'serde_json' both find the same crate.
- Version (`version`, text): Optional. Which version to read. The list is fetched from crates.io, so it is always the versions this crate actually published. Leave blank for the version the crate's page shows.
- Before (`before_date`, date): Optional. Only days before this one, which is how crates.io lets you look further back than the default window.

**Outputs**

- `average_per_day` (number): Mean downloads per day over the window.
- `busiest_day` (text): The day with the most downloads.
- `busiest_day_downloads` (number): How many downloads that day saw.
- `crate` (text): The crate this is about, as crates.io spells it.
- `daily` (list): One entry per day, oldest first.
- `days_covered` (number): How many days the window holds.
- `end_date` (text): The last day in the window.
- `start_date` (text): The first day in the window.
- `total_downloads` (number): Downloads over the whole window.
- `version` (text): The version this is about.

**Example output**

```json
{
  "average_per_day": 1169994.8,
  "busiest_day": "2026-08-20",
  "busiest_day_downloads": 1622284,
  "crate": "serde",
  "daily": [
    {
      "date": "2026-08-23",
      "downloads": 1169994
    }
  ],
  "days_covered": 37,
  "end_date": "2026-08-23",
  "start_date": "2026-07-18",
  "total_downloads": 43289807,
  "version": "1.0.229"
}
```

### Get a version's download URL

Get the URL of a version's .crate file, with its size and its SHA-256 so a later step can check what it downloaded. This hands back the link rather than the file itself, so nothing large passes through the workflow. No API token required.

**Inputs**

- Crate name (`crate`, text, required): The crate's name on crates.io, e.g. serde. Hyphens and underscores are interchangeable, so 'serde-json' and 'serde_json' both find the same crate.
- Version (`version`, text): Optional. Which version to read. The list is fetched from crates.io, so it is always the versions this crate actually published. Leave blank for the version the crate's page shows.

**Outputs**

- `checksum_sha256` (text): Its SHA-256, as hexadecimal.
- `crate` (text): The crate this is about, as crates.io spells it.
- `download_url` (text): Where the .crate file can be downloaded from.
- `filename` (text): What the file is called, e.g. serde-1.0.229.crate.
- `size_bytes` (number): How big it is.
- `version` (text): The version this is about.
- `yanked` (true/false): True when this version has been withdrawn. It still downloads, but nothing new should depend on it.

**Example output**

```json
{
  "checksum_sha256": "4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba",
  "crate": "serde",
  "download_url": "https://static.crates.io/crates/serde/serde-1.0.229.crate",
  "filename": "serde-1.0.229.crate",
  "size_bytes": 83669,
  "version": "1.0.229",
  "yanked": false
}
```

### Get the registry summary

Get what crates.io shows on its front page: how many crates it holds and how often they have been downloaded, plus the ten newest crates, the ten just updated, the ten most downloaded, the ten most downloaded lately, and the most popular keywords and categories. One call for a digest of the whole registry. No API token required.

**Inputs**: None.

**Outputs**

- `just_updated` (list): The ten crates updated most recently.
- `most_downloaded` (list): The ten most downloaded crates of all time.
- `most_recently_downloaded` (list): The ten most downloaded in the last 90 days, which is a better read on what is popular now.
- `new_crates` (list): The ten most recently published crates.
- `popular_categories` (list): The ten categories holding the most crates.
- `popular_keywords` (list): The ten keywords on the most crates.
- `total_crates` (number): How many crates the registry holds.
- `total_downloads` (number): Downloads of everything on it, all time.

**Example output**

```json
{
  "just_updated": [
    {
      "categories": [
        "no-std",
        "encoding",
        "no-std::no-alloc"
      ],
      "created_at": "2014-12-05T20:20:39Z",
      "default_version": "1.0.229",
      "description": "A generic serialization/deserialization framework",
      "documentation": "https://docs.rs/serde",
      "downloads": 1301029880,
      "homepage": "https://serde.rs",
      "keywords": [
        "no_std",
        "serde",
        "serialization"
      ],
      "name": "serde",
      "newest_version": "1.0.229",
      "num_versions": 316,
      "recent_downloads": 277037661,
      "repository": "https://github.com/serde-rs/serde",
      "trusted_publishing_only": false,
      "updated_at": "2026-07-18T23:05:13Z",
      "url": "https://crates.io/crates/serde",
      "yanked": false
    }
  ],
  "most_downloaded": [
    {
      "categories": [
        "no-std",
        "encoding",
        "no-std::no-alloc"
      ],
      "created_at": "2014-12-05T20:20:39Z",
      "default_version": "1.0.229",
      "description": "A generic serialization/deserialization framework",
      "documentation": "https://docs.rs/serde",
      "downloads": 1301029880,
      "homepage": "https://serde.rs",
      "keywords": [
        "no_std",
        "serde",
        "serialization"
      ],
      "name": "serde",
      "newest_version": "1.0.229",
      "num_versions": 316,
      "recent_downloads": 277037661,
      "repository": "https://github.com/serde-rs/serde",
      "trusted_publishing_only": false,
      "updated_at": "2026-07-18T23:05:13Z",
      "url": "https://crates.io/crates/serde",
      "yanked": false
    }
  ],
  "most_recently_downloaded": [
    {
      "categories": [
        "no-std",
        "encoding",
        "no-std::no-alloc"
      ],
      "created_at": "2014-12-05T20:20:39Z",
      "default_version": "1.0.229",
      "description": "A generic serialization/deserialization framework",
      "documentation": "https://docs.rs/serde",
      "downloads": 1301029880,
      "homepage": "https://serde.rs",
      "keywords": [
        "no_std",
        "serde",
        "serialization"
      ],
      "name": "serde",
      "newest_version": "1.0.229",
      "num_versions": 316,
      "recent_downloads": 277037661,
      "repository": "https://github.com/serde-rs/serde",
      "trusted_publishing_only": false,
      "updated_at": "2026-07-18T23:05:13Z",
      "url": "https://crates.io/crates/serde",
      "yanked": false
    }
  ],
  "new_crates": [
    {
      "categories": [
        "no-std",
        "encoding",
        "no-std::no-alloc"
      ],
      "created_at": "2014-12-05T20:20:39Z",
      "default_version": "1.0.229",
      "description": "A generic serialization/deserialization framework",
      "documentation": "https://docs.rs/serde",
      "downloads": 1301029880,
      "homepage": "https://serde.rs",
      "keywords": [
        "no_std",
        "serde",
        "serialization"
      ],
      "name": "serde",
      "newest_version": "1.0.229",
      "num_versions": 316,
      "recent_downloads": 277037661,
      "repository": "https://github.com/serde-rs/serde",
      "trusted_publishing_only": false,
      "updated_at": "2026-07-18T23:05:13Z",
      "url": "https://crates.io/crates/serde",
      "yanked": false
    }
  ],
  "popular_categories": [
    {
      "crates_count": 3798,
      "created_at": "2019-12-13T13:46:41Z",
      "description": "For crates that focus on some individual part of accelerating the development of games.",
      "name": "Game development",
      "slug": "game-development",
      "url": "https://crates.io/categories/game-development"
    }
  ],
  "popular_keywords": [
    {
      "crates_count": 1512,
      "created_at": "2014-11-20T20:14:31Z",
      "keyword": "serialization",
      "url": "https://crates.io/keywords/serialization"
    }
  ],
  "total_crates": 321581,
  "total_downloads": 410410111515
}
```

### Get the registry's status

Check whether crates.io is accepting writes. During maintenance the registry goes read-only, and any publish, yank or ownership change fails until it comes back, so a release workflow can test this first and wait rather than fail. Also returns the banner message crates.io is showing, if any. No API token required.

**Inputs**: None.

**Outputs**

- `accepting_publishes` (true/false): The same thing the other way round, so a condition step reads the way you would say it aloud.
- `banner_message` (text): The notice crates.io is showing on every page, if there is one. Null the rest of the time.
- `cdn_base_url` (text): Where crate files and READMEs are served from.
- `commit` (text): The same commit, under the name the API gives it.
- `deployed_sha` (text): The commit crates.io is currently running.
- `read_only` (true/false): True while crates.io is in read-only mode, when nothing can be published, yanked or changed.

**Example output**

```json
{
  "accepting_publishes": true,
  "banner_message": null,
  "cdn_base_url": "https://static.crates.io",
  "commit": "42df592c355587e792e7424563b336c7f01344d0",
  "deployed_sha": "42df592c355587e792e7424563b336c7f01344d0",
  "read_only": false
}
```

### List a crate's owners

List who can publish new versions of a crate: the people and the GitHub teams. Use it to audit who holds publishing rights across the crates you depend on, or to check an ownership change landed. No API token required.

**Inputs**

- Crate name (`crate`, text, required): The crate's name on crates.io, e.g. serde. Hyphens and underscores are interchangeable, so 'serde-json' and 'serde_json' both find the same crate.
- Show (`owner_kind`, text): Optional. Which owners to list. Both kinds by default. One of: `all` (Users and teams), `users` (Users only), `teams` (Teams only). Default: `all`.

**Outputs**

- `count` (number): How many owners were returned.
- `crate` (text): The crate this is about, as crates.io spells it.
- `owner_kind` (text): Which kinds were asked for.
- `owners` (list): The owners that matched.
- `team_count` (number): How many are GitHub teams.
- `user_count` (number): How many of them are people.

**Example output**

```json
{
  "count": 1,
  "crate": "serde",
  "owner_kind": "all",
  "owners": [
    {
      "avatar_url": "https://avatars.githubusercontent.com/u/1940490?v=4",
      "github_url": "https://github.com/dtolnay",
      "id": 3618,
      "kind": "user",
      "login": "dtolnay",
      "name": "David Tolnay",
      "url": "https://crates.io/users/dtolnay"
    }
  ],
  "team_count": 0,
  "user_count": 1
}
```

### List a crate's versions

List the versions a crate has published, newest first, each with the date it went out, its size, its checksum, its minimum Rust version and whether it has since been yanked. Use it to build a release history, to see how often a project ships, or to find every version still on a supported release track. No API token required.

**Inputs**

- Crate name (`crate`, text, required): The crate's name on crates.io, e.g. serde. Hyphens and underscores are interchangeable, so 'serde-json' and 'serde_json' both find the same crate.
- Only these versions (`versions`, list): Optional. Return only these versions. The list is fetched from crates.io, so it is always the versions this crate actually published. Leave blank for all.
- Order by (`sort`, text): Optional. Highest version number first by default, which is not the same as most recent when a project back-ports fixes to an older series. One of: `semver` (Highest version number first), `date` (Most recently published first). Default: `semver`.
- Include withdrawn versions (`include_yanked`, true/false): Optional. Include versions that have been yanked. On by default; turn it off to see only what a new project could depend on. Default: `true`.
- Page (`page`, number): Optional. Which page of results to fetch. crates.io pages this listing one page at a time, so a later page costs a request per page before it and cannot go past 20. Raise the page size instead. 1 by default. From 1 to 20. Default: `1`.
- Results per page (`per_page`, number): Optional. How many results to return. Between 1 and 100, which is crates.io's own ceiling; 25 by default. From 1 to 100. Default: `25`.

**Outputs**

- `count` (number): How many results this page holds.
- `crate` (text): The crate this is about, as crates.io spells it.
- `has_more` (true/false): True when there is another page after this one.
- `next_page` (number): The page number that fetches the next page. Null when this is the last one.
- `page` (number): Which page this is.
- `per_page` (number): How many results were asked for per page.
- `release_tracks` (list): The highest version on each release series, so a crate maintaining 0.9.x alongside 1.x shows both.
- `sort` (text): The order the results came back in.
- `total_count` (number): How many results there are altogether. Null on the few listings crates.io does not count.
- `versions` (list): The versions on this page.

**Example output**

```json
{
  "count": 1,
  "crate": "serde",
  "has_more": true,
  "next_page": 2,
  "page": 1,
  "per_page": 25,
  "release_tracks": [
    {
      "highest": "1.0.229",
      "track": "1"
    },
    {
      "highest": "0.9.15",
      "track": "0.9"
    }
  ],
  "sort": "semver",
  "total_count": 316,
  "versions": [
    {
      "audit_trail": [
        {
          "action": "publish",
          "at": "2026-07-18T23:05:13Z",
          "by": {
            "avatar_url": "https://avatars.githubusercontent.com/u/1940490?v=4",
            "created_at": "2012-07-09T03:55:40Z",
            "github_url": "https://github.com/dtolnay",
            "id": 3618,
            "login": "dtolnay",
            "name": "David Tolnay",
            "url": "https://crates.io/users/dtolnay"
          }
        }
      ],
      "binary_names": [],
      "checksum": "4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba",
      "crate": "serde",
      "created_at": "2026-07-18T23:05:13Z",
      "description": "A generic serialization/deserialization framework",
      "documentation": "https://docs.rs/serde",
      "download_url": "https://crates.io/api/v1/crates/serde/1.0.229/download",
      "downloads": 43016438,
      "edition": "2021",
      "features": [
        {
          "enables": [
            "std"
          ],
          "name": "default"
        }
      ],
      "has_library": true,
      "homepage": "https://serde.rs",
      "id": 2817185,
      "license": "MIT OR Apache-2.0",
      "line_counts": {
        "languages": [
          {
            "code_lines": 11574,
            "comment_lines": 302,
            "files": 25,
            "language": "Rust"
          }
        ],
        "total_code_lines": 11574,
        "total_comment_lines": 302
      },
      "links_native_library": null,
      "published_by": {
        "avatar_url": "https://avatars.githubusercontent.com/u/1940490?v=4",
        "created_at": "2012-07-09T03:55:40Z",
        "github_url": "https://github.com/dtolnay",
        "id": 3618,
        "login": "dtolnay",
        "name": "David Tolnay",
        "url": "https://crates.io/users/dtolnay"
      },
      "published_via": null,
      "repository": "https://github.com/serde-rs/serde",
      "rust_version": "1.56",
      "size_bytes": 83669,
      "updated_at": "2026-07-18T23:05:13Z",
      "url": "https://crates.io/crates/serde/1.0.229",
      "version": "1.0.229",
      "yank_message": null,
      "yanked": false
    }
  ]
}
```

### List a user's or team's crates

List every crate one person or GitHub team owns. crates.io's own endpoint wants an internal numeric id, so this takes the login you can see and looks the id up for you. Use it to inventory what a team publishes, or to watch a maintainer's releases. No API token required.

**Inputs**

- User or team (`owner`, text, required): A crates.io username, e.g. dtolnay, or a team login spelled github:<org>:<team>, e.g. github:rust-lang:crates-io.
- This login is (`owner_kind`, text): Optional. Left alone, a login starting with 'github:' is read as a team and anything else as a person. One of: `auto` (Work it out from the login), `user` (A crates.io user), `team` (A GitHub team). Default: `auto`.
- Order by (`sort`, text): Optional. Name order by default. One of: `relevance` (Best match for the search text), `downloads` (Most downloads all time), `recent-downloads` (Most downloads in the last 90 days), `recent-updates` (Most recently updated), `new` (Most recently published), `alphabetical` (Crate name, A to Z). Default: `alphabetical`.
- Page (`page`, number): Optional. Which page of results to fetch. Use the next page from the previous result to walk through them. 1 by default. From 1 to 10000. Default: `1`.
- Results per page (`per_page`, number): Optional. How many results to return. Between 1 and 100, which is crates.io's own ceiling; 25 by default. From 1 to 100. Default: `25`.

**Outputs**

- `count` (number): How many results this page holds.
- `crates` (list): The crates on this page.
- `has_more` (true/false): True when there is another page after this one.
- `next_page` (number): The page number that fetches the next page. Null when this is the last one.
- `owner` (object): The account the crates belong to.
- `owner_kind` (text): user or team, after any auto-detection.
- `page` (number): Which page this is.
- `per_page` (number): How many results were asked for per page.
- `sort` (text): The order the results came back in.
- `total_count` (number): How many results there are altogether. Null on the few listings crates.io does not count.

**Example output**

```json
{
  "count": 1,
  "crates": [
    {
      "categories": [
        "no-std",
        "encoding",
        "no-std::no-alloc"
      ],
      "created_at": "2014-12-05T20:20:39Z",
      "default_version": "1.0.229",
      "description": "A generic serialization/deserialization framework",
      "documentation": "https://docs.rs/serde",
      "downloads": 1301029880,
      "homepage": "https://serde.rs",
      "keywords": [
        "no_std",
        "serde",
        "serialization"
      ],
      "name": "serde",
      "newest_version": "1.0.229",
      "num_versions": 316,
      "recent_downloads": 277037661,
      "repository": "https://github.com/serde-rs/serde",
      "trusted_publishing_only": false,
      "updated_at": "2026-07-18T23:05:13Z",
      "url": "https://crates.io/crates/serde",
      "yanked": false
    }
  ],
  "has_more": true,
  "next_page": 2,
  "owner": {
    "avatar_url": "https://avatars.githubusercontent.com/u/1940490?v=4",
    "created_at": "2012-07-09T03:55:40Z",
    "github_url": "https://github.com/dtolnay",
    "id": 3618,
    "login": "dtolnay",
    "name": "David Tolnay",
    "url": "https://crates.io/users/dtolnay"
  },
  "owner_kind": "user",
  "page": 1,
  "per_page": 25,
  "sort": "alphabetical",
  "total_count": 84
}
```

### List a version's dependencies

List what a crate depends on: each dependency with the version range it asks for, whether it is a normal, dev or build dependency, whether a Cargo feature gates it and which platforms it applies to. Filter to normal dependencies alone to see what actually ships. No API token required.

**Inputs**

- Crate name (`crate`, text, required): The crate's name on crates.io, e.g. serde. Hyphens and underscores are interchangeable, so 'serde-json' and 'serde_json' both find the same crate.
- Version (`version`, text): Optional. Which version to read. The list is fetched from crates.io, so it is always the versions this crate actually published. Leave blank for the version the crate's page shows.
- Dependency kinds (`kinds`, list): Optional. Which kinds to return. All three when left blank. One or more of: `normal` (Normal - needed to build the crate itself), `dev` (Dev - needed only for its tests, examples and benchmarks), `build` (Build - needed only by its build script).
- Include optional dependencies (`include_optional`, true/false): Optional. Include dependencies that only a Cargo feature pulls in. On by default; turn it off to see what a default build actually compiles. Default: `true`.

**Outputs**

- `build_count` (number): How many are build dependencies.
- `count` (number): How many dependencies were returned.
- `crate` (text): The crate this is about, as crates.io spells it.
- `dependencies` (list): The dependencies that matched the filters.
- `dev_count` (number): How many are dev dependencies.
- `normal_count` (number): How many of them are normal dependencies.
- `optional_count` (number): How many are gated behind a Cargo feature.
- `version` (text): The version this is about.

**Example output**

```json
{
  "build_count": 0,
  "count": 1,
  "crate": "serde",
  "dependencies": [
    {
      "crate": "serde_derive",
      "default_features": true,
      "features": [],
      "kind": "normal",
      "optional": true,
      "requirement": "^1",
      "target": null,
      "url": "https://crates.io/crates/serde_derive"
    }
  ],
  "dev_count": 0,
  "normal_count": 1,
  "optional_count": 1,
  "version": "1.0.229"
}
```

### List categories

List the categories crates.io curates, each with what belongs in it and how many crates are filed under it. Unlike keywords, which any author can invent, these are a fixed set, so this is the way to see what the registry is organised into. No API token required.

**Inputs**

- Order by (`sort`, text): Optional. Name order by default. One of: `alpha` (Name, A to Z), `crates` (Most crates first). Default: `alpha`.
- Page (`page`, number): Optional. Which page of results to fetch. Use the next page from the previous result to walk through them. 1 by default. From 1 to 10000. Default: `1`.
- Results per page (`per_page`, number): Optional. How many results to return. Between 1 and 100, which is crates.io's own ceiling; 25 by default. From 1 to 100. Default: `25`.

**Outputs**

- `categories` (list): The categories on this page.
- `count` (number): How many results this page holds.
- `has_more` (true/false): True when there is another page after this one.
- `next_page` (number): The page number that fetches the next page. Null when this is the last one.
- `page` (number): Which page this is.
- `per_page` (number): How many results were asked for per page.
- `sort` (text): The order the results came back in.
- `total_count` (number): How many results there are altogether. Null on the few listings crates.io does not count.

**Example output**

```json
{
  "categories": [
    {
      "crates_count": 3798,
      "created_at": "2019-12-13T13:46:41Z",
      "description": "For crates that focus on some individual part of accelerating the development of games.",
      "name": "Game development",
      "slug": "game-development",
      "url": "https://crates.io/categories/game-development"
    }
  ],
  "count": 1,
  "has_more": true,
  "next_page": 2,
  "page": 1,
  "per_page": 25,
  "sort": "alpha",
  "total_count": 58
}
```

### List every category slug

List every category slug and its description in one call, including the nested ones such as 'no-std::no-alloc' that the paged category listing splits across pages. The quickest way to get the whole vocabulary for a step that has to pick a category. No API token required.

**Inputs**: None.

**Outputs**

- `category_slugs` (list): Every slug, in alphabetical order.
- `count` (number): How many slugs there are.

**Example output**

```json
{
  "category_slugs": [
    {
      "description": "For crates that focus on some individual part of accelerating the development of games.",
      "slug": "game-development"
    }
  ],
  "count": 104
}
```

### List keywords

List the keywords crate authors have used, each with how many crates carry it. Order by popularity to see what the registry is actually about, or use it to find the exact spelling of a keyword before filtering a search by it. No API token required.

**Inputs**

- Order by (`sort`, text): Optional. Alphabetical by default. There are tens of thousands of keywords, so 'Most crates first' is usually the useful one. One of: `alpha` (Name, A to Z), `crates` (Most crates first). Default: `alpha`.
- Page (`page`, number): Optional. Which page of results to fetch. Use the next page from the previous result to walk through them. 1 by default. From 1 to 10000. Default: `1`.
- Results per page (`per_page`, number): Optional. How many results to return. Between 1 and 100, which is crates.io's own ceiling; 25 by default. From 1 to 100. Default: `25`.

**Outputs**

- `count` (number): How many results this page holds.
- `has_more` (true/false): True when there is another page after this one.
- `keywords` (list): The keywords on this page.
- `next_page` (number): The page number that fetches the next page. Null when this is the last one.
- `page` (number): Which page this is.
- `per_page` (number): How many results were asked for per page.
- `sort` (text): The order the results came back in.
- `total_count` (number): How many results there are altogether. Null on the few listings crates.io does not count.

**Example output**

```json
{
  "count": 1,
  "has_more": true,
  "keywords": [
    {
      "crates_count": 1512,
      "created_at": "2014-11-20T20:14:31Z",
      "keyword": "serialization",
      "url": "https://crates.io/keywords/serialization"
    }
  ],
  "next_page": 2,
  "page": 1,
  "per_page": 25,
  "sort": "crates",
  "total_count": 55848
}
```

### List reverse dependencies

List the crates that depend on a crate, with the version range each asks for and how often each is itself downloaded. The step for 'who would a breaking change here affect?' and for seeing which of your dependents are still on an old range. No API token required.

**Inputs**

- Crate name (`crate`, text, required): The crate's name on crates.io, e.g. serde. Hyphens and underscores are interchangeable, so 'serde-json' and 'serde_json' both find the same crate.
- Page (`page`, number): Optional. Which page of results to fetch. Use the next page from the previous result to walk through them. 1 by default. From 1 to 10000. Default: `1`.
- Results per page (`per_page`, number): Optional. How many results to return. Between 1 and 100, which is crates.io's own ceiling; 25 by default. From 1 to 100. Default: `25`.

**Outputs**

- `count` (number): How many results this page holds.
- `crate` (text): The crate this is about, as crates.io spells it.
- `dependents` (list): The crates depending on it, most downloaded first.
- `has_more` (true/false): True when there is another page after this one.
- `next_page` (number): The page number that fetches the next page. Null when this is the last one.
- `page` (number): Which page this is.
- `per_page` (number): How many results were asked for per page.
- `total_count` (number): How many results there are altogether. Null on the few listings crates.io does not count.

**Example output**

```json
{
  "count": 1,
  "crate": "serde",
  "dependents": [
    {
      "crate": "hashbrown",
      "default_features": false,
      "downloads": 2240835325,
      "features": [],
      "kind": "normal",
      "optional": true,
      "published_at": "2026-05-09T04:35:04Z",
      "requirement": "^1.0.220",
      "target": "cfg(any())",
      "url": "https://crates.io/crates/hashbrown",
      "version": "0.17.1",
      "yanked": false
    }
  ],
  "has_more": true,
  "next_page": 2,
  "page": 1,
  "per_page": 25,
  "total_count": 116773
}
```

### Search crates

Search the Rust package registry for crates by name, description and README text, or browse it by category, by keyword or by first letter. Order by relevance, by downloads, by recent downloads or by how recently each was published. The starting point for 'what is there for X in Rust?'. No API token required.

**Inputs**

- Search text (`query`, text): Optional. What to search for. crates.io matches names, descriptions and README text. Leave blank to browse with the filters below instead.
- Category (`category`, text): Optional. Only crates in this category, or one of its subcategories. The list comes from crates.io, so it is always the categories that actually exist.
- Keyword (`keyword`, text): Optional. Only crates whose authors listed this keyword. Keywords are free text chosen by each author, so List keywords is the way to see which exist.
- All of these keywords (`all_keywords`, list): Optional. Only crates carrying every one of these keywords. Overrides the single keyword above.
- Starting letter (`letter`, text): Optional. Only crates whose name starts with this letter. crates.io ignores it when a keyword filter is set. One of: `a`, `b`, `c`, `d`, `e`, `f`, `g`, `h`, `i`, `j`, and 16 more.
- Include withdrawn crates (`include_yanked`, true/false): Optional. Include crates whose every version has been yanked. Off by default, which is what crates.io's own search does. Default: `false`.
- Order by (`sort`, text): Optional. How to order the results. Best match when there is search text, name order when there is not. One of: `relevance` (Best match for the search text), `downloads` (Most downloads all time), `recent-downloads` (Most downloads in the last 90 days), `recent-updates` (Most recently updated), `new` (Most recently published), `alphabetical` (Crate name, A to Z).
- Page (`page`, number): Optional. Which page of results to fetch. Use the next page from the previous result to walk through them. 1 by default. From 1 to 10000. Default: `1`.
- Results per page (`per_page`, number): Optional. How many results to return. Between 1 and 100, which is crates.io's own ceiling; 25 by default. From 1 to 100. Default: `25`.

**Outputs**

- `count` (number): How many results this page holds.
- `crates` (list): The crates on this page.
- `filters` (object): The filters that were applied.
- `has_more` (true/false): True when there is another page after this one.
- `next_page` (number): The page number that fetches the next page. Null when this is the last one.
- `page` (number): Which page this is.
- `per_page` (number): How many results were asked for per page.
- `query` (text): The text that was searched for, if any.
- `sort` (text): The order the results came back in.
- `total_count` (number): How many results there are altogether. Null on the few listings crates.io does not count.

**Example output**

```json
{
  "count": 1,
  "crates": [
    {
      "categories": [
        "no-std",
        "encoding",
        "no-std::no-alloc"
      ],
      "created_at": "2014-12-05T20:20:39Z",
      "default_version": "1.0.229",
      "description": "A generic serialization/deserialization framework",
      "documentation": "https://docs.rs/serde",
      "downloads": 1301029880,
      "homepage": "https://serde.rs",
      "keywords": [
        "no_std",
        "serde",
        "serialization"
      ],
      "name": "serde",
      "newest_version": "1.0.229",
      "num_versions": 316,
      "recent_downloads": 277037661,
      "repository": "https://github.com/serde-rs/serde",
      "trusted_publishing_only": false,
      "updated_at": "2026-07-18T23:05:13Z",
      "url": "https://crates.io/crates/serde",
      "yanked": false
    }
  ],
  "filters": {
    "all_keywords": [],
    "category": null,
    "include_yanked": false,
    "keyword": null,
    "letter": null
  },
  "has_more": true,
  "next_page": 2,
  "page": 1,
  "per_page": 25,
  "query": "serialization",
  "sort": "relevance",
  "total_count": 2841
}
```
