Modrinth
modrinth.com · Storage · 1 record · JSON
Modrinth Storage
caveatemail?card?Rrequest-rate
| Free tier | 500 MiB per version file (hard code-level cap: read_from_field(field, 500 * (1 << 20), "Project file exceeds the maximum of 500MiB...")). No stated total-account storage quota. Per-user quotas read from user_limits: projects = 256, projects_per_day = 10, versions_per_project = 10000, versions_per_day = 150.unit mixed; metered on stored-bytes |
|---|---|
| Price | none stated |
| Per-object cap | not stated |
| Retention | not stated |
| Egress | Free. All files served from cdn.modrinth.com behind Cloudflare with Accept-Ranges: bytes, no auth, no signed URLs, no expiry. |
| Identity | email (placeholder) not published |
| Limits |
500 MiB/version-file; 150 version uploads/day; 10,000 versions per project; 256 projects; version_number must be unique per project (1-32 chars); moderation may reject non-mod content; project file type must be in project_file_type allowlist (jar/zip/mrpack etc.), so arbitrary blobs need wrapping. |
| Binding | request-rate calls are bounded rather than bytes, which is fatal to a nightly job on a monthly counter |
| Interface | rest, rclone rest |
| Tooling | Documented public REST API v2 (api.modrinth.com/v2/project/{id}/version, POST /version with multipart file upload + PAT auth); labrinth OpenAPI spec published at docs.modrinth.com. No rclone backend, but the API is simple enough for a dozen-line client. |
| Composes with | 256 projects x 10,000 versions/project x 500 MiB = ~1.22 PiB theoretical per account; practically throttled by versions_per_day=150 -> 150 x 500 MiB = 73 GiB/day/account = ~2.2 TiB/month/account. Unlimited free accounts; each new account resets all four counters. Idle accounts keep all existing files downloadable forever (no TTL on published versions). |
| Reliability | Moderated registry: junk projects can be removed and files hard-deleted; no rate-limit survival guarantee past 150 uploads/day. |
| Notes | 500 MiB per version file (hard code-level cap: read_from_field(field, 500 * (1 << 20), "Project file exceeds the maximum of 500MiB...")). No stated total-account storage quota. Per-user quotas read from user_limits: projects = 256, projects_per_day = 10, versions_per_project = 10000, versions_per_day = 150. |
| Evidence rung | reported One page read moves it to documented. |
| Checked | 2026-10-21 (inherited); stale on 2026-11-04 |
Evidence (5)
| date | source | what it proved |
|---|---|---|
| 2026-10-21 | raw.githubusercontent.com/modrinth/code/main/apps/labrinth/s | '500 * (1 << 20)' hard file cap for project version files |
| 2026-10-21 | raw.githubusercontent.com/modrinth/code/main/apps/labrinth/m | projects_per_day 10, versions_per_project 10000, versions_per_day 50 raised to 150 by 20260917120000_raise_versions_per_day_limit.sql |
| 2026-10-21 | raw.githubusercontent.com/modrinth/code/main/apps/labrinth/m | default projects 256, organizations 16 |
| 2026-10-21 | withheld | probe: GET api.modrinth.com/v2/version/g6ju16VJ -> 200, files[0].url = cdn.modrinth.com/data/AANobbMI/versions/g6ju16VJ/...jar, size 1912496 |
| 2026-10-21 | withheld | probe: GET cdn.modrinth.com/...jar with Range: bytes=0-0 -> 206 Partial Content, Content-Range bytes 0-0/1912496, Accept-Ranges: bytes, Server: cloudflare |
More fields (1)
{
"unit_note": "free_tier.unit is 'mixed' because the headline is denominated in MiB or KiB, which the schema enum does not carry; the verbatim free_tier.stated keeps the true unit. See the storage-dossier handover."
}Unknown or withheld values (9)
$.evidence[3].urlprivate-url$.evidence[4].urlprivate-url$.free_tier.notesprocess$.identity_cost.detaildefaulted$.identity_cost.kindidentity-defaulted$.per_object_cap.notesnot-extracted$.per_object_cap.statednot-extracted$.retention.notesnot-extracted$.retention.statednot-extracted