fshy

fshy / Storage

PyPI

pypi.org · Storage · 1 record · JSON

PyPI (Python Package Index) Storage

★ qualifiesemail?card?Rper-object-cap

pypi.org · registry · storage/pypi · JSON · compare

Free tier100 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
Pricenone stated
Per-object cap100 MB per file (100000000 bytes)
Retention| Deletion is permanent and irreversible ('cannot be undone without administrative intervention')
EgressFree and unmetered. files.pythonhosted.org probe: Server: cloudflare, Cache-Control: 'max-age=365000000, immutable, public', Access-Control-Allow-Origin: *, no auth.
Identityemail (placeholder) not published
Limits
  • per-object-cap 100 MB per file source
  • per-object-cap 100 MB/file source
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.
Bindingper-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
Interfacerest, rclone rest
ToolingLegacy 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 withUNBOUNDED 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.
ReliabilityDeletion 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.
Notes100 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 rungreported One page read moves it to documented.
Checked2026-10-21 (inherited); stale on 2026-11-04
Parsed numbers
  • $.limits[0].value limit:per-object-cap 100.0 MB
  • $.limits[1].value limit:per-object-cap 100.0 MB
Evidence (6)
datesourcewhat it proved
2026-10-21docs.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-21github.com/pypa/warehouse/blob/main/warehouse/constants.pyMAX_FILESIZE = 100 * ONE_MIB; MAX_PROJECT_SIZE = 10 * ONE_GIB; UPLOAD_LIMIT_CAP = ONE_GIB; MAXIMUM_AGE_FOR_NEW_UPLOADS = 14 days
2026-10-21github.com/pypa/warehouse/blob/main/warehouse/config.pyPROJECT_CREATE_USER_RATELIMIT_STRING default '20 per hour'; PROJECT_CREATE_IP '40 per hour'; PROJECT_CREATE_ORGANIZATION '10 per day'
2026-10-21github.com/pypi/support/issues/4260'Project Limit Request: uv - 40 GB' (grant path is real and used)
2026-10-21pypi.org/pypi/six/jsonprobe: GET -> 200, info.version 1.17.0, 2 urls (JSON API works anonymously)
2026-10-21files.pythonhosted.org/packages/71/39/.../six-1.16.0.tar.gzprobe: GET -> 200, Content-Length: 34041, Cache-Control: 'max-age=365000000, immutable, public', Server: cloudflare
Unknown or withheld values (5)
  • $.free_tier.notes process
  • $.identity_cost.detail defaulted
  • $.identity_cost.kind identity-defaulted
  • $.per_object_cap.notes not-extracted
  • $.retention.notes not-extracted