PyPI
pypi.org · Storage · 1 record · JSON
PyPI (Python Package Index) Storage
★ qualifiesemail?card?Rper-object-cap
| Free tier | 100 MB per file, 10 GB per project — both are *defaults*, both are raisable by filing a GitHub issue. Unlimited number of projects. Verified in warehouse source: MAX_FILESIZE = 100 * ONE_MIB, MAX_PROJECT_SIZE = 10 * ONE_GIB, UPLOAD_LIMIT_CAP = 1 GiB. unit GiB; metered on unstated |
|---|---|
| Price | none stated |
| Per-object cap | 100 MB per file (100000000 bytes) |
| Retention | | Deletion is permanent and irreversible ('cannot be undone without administrative intervention') |
| Egress | Free and unmetered. files.pythonhosted.org probe: Server: cloudflare, Cache-Control: 'max-age=365000000, immutable, public', Access-Control-Allow-Origin: *, no auth. |
| Identity | email (placeholder) not published |
| Limits | 100 MB/file, 10 GB/project (both raisable; 40 GB grants are routine for large projects). 20 project creations/hour/user, 10/day/organization, 40/hour/IP (warehouse config.py defaults). Files cannot be uploaded to a release older than 14 days (MAXIMUM_AGE_FOR_NEW_UPLOADS). Deleting a file frees quota; yanking does NOT. |
| Binding | per-object-cap the per-object cap sets the shard size and therefore the object count; it bounds the total more tightly than any headline quota |
| Interface | rest, rclone rest |
| Tooling | Legacy upload API POST /legacy/ (twine), JSON API GET /pypi/<name>/json for metadata, direct file GET from files.pythonhosted.org. Orgs/teams exist. Named wrapper class: pypi/* tools, twine, and warehouse itself. No rclone backend. |
| Composes with | UNBOUNDED via projects: unlimited projects x 10 GB each (raisable to 40 GB — uv and ruff were both granted 40 GB). 10 TiB = 1,024 projects at default 10 GB. Project creation is rate limited to 20/hour and 40/hour per IP, which is the binding constraint, not bytes. |
| Reliability | Deletion is permanent and irreversible ('cannot be undone without administrative intervention'). Releases are append-only in practice but files *can* be deleted to free project quota, so unlike npm this is not immutable-by-design — treat it as stable-but-deletable. Quota enforcement is a hard 400 at upload, so budget against the 10 GB project figure. |
| Notes | 100 MB per file, 10 GB per project — both are *defaults*, both are raisable by filing a GitHub issue. Unlimited number of projects. Verified in warehouse source: MAX_FILESIZE = 100 * ONE_MIB, MAX_PROJECT_SIZE = 10 * ONE_GIB, UPLOAD_LIMIT_CAP = 1 GiB. |
| Evidence rung | reported One page read moves it to documented. |
| Checked | 2026-10-21 (inherited); stale on 2026-11-04 |
| Parsed numbers |
|
Evidence (6)
| date | source | what it proved |
|---|---|---|
| 2026-10-21 | docs.pypi.org/project-management/storage-limits/ | 'The current default limits are 100.0 MB for individual files and 10.0 GB for the entire project'; 'we can sometimes increase your limit' |
| 2026-10-21 | github.com/pypa/warehouse/blob/main/warehouse/constants.py | MAX_FILESIZE = 100 * ONE_MIB; MAX_PROJECT_SIZE = 10 * ONE_GIB; UPLOAD_LIMIT_CAP = ONE_GIB; MAXIMUM_AGE_FOR_NEW_UPLOADS = 14 days |
| 2026-10-21 | github.com/pypa/warehouse/blob/main/warehouse/config.py | PROJECT_CREATE_USER_RATELIMIT_STRING default '20 per hour'; PROJECT_CREATE_IP '40 per hour'; PROJECT_CREATE_ORGANIZATION '10 per day' |
| 2026-10-21 | github.com/pypi/support/issues/4260 | 'Project Limit Request: uv - 40 GB' (grant path is real and used) |
| 2026-10-21 | pypi.org/pypi/six/json | probe: GET -> 200, info.version 1.17.0, 2 urls (JSON API works anonymously) |
| 2026-10-21 | files.pythonhosted.org/packages/71/39/.../six-1.16.0.tar.gz | probe: GET -> 200, Content-Length: 34041, Cache-Control: 'max-age=365000000, immutable, public', Server: cloudflare |
Unknown or withheld values (5)
$.free_tier.notesprocess$.identity_cost.detaildefaulted$.identity_cost.kindidentity-defaulted$.per_object_cap.notesnot-extracted$.retention.notesnot-extracted