{"eid":"softwareheritage","name":"Software Heritage","domain":"softwareheritage.org","resolved_by":"domain","topics":["storage"],"n_records":2,"best_vorder":1,"review":null,"aliases":["Software Heritage","Software Heritage Archive (CAPI read side) + Save Code Now (anonymous crawl trigger)","software heritage deposit (swh-deposit, the push api)","softwareheritage.org"],"records":[{"rid":"storage/software-heritage-archive-save-code-now","card":{"rid":"storage/software-heritage-archive-save-code-now","eid":"softwareheritage","topic":"storage","slug":"software-heritage-archive-save-code-now","provider":"Software Heritage Archive (CAPI read side) + Save Code Now (anonymous crawl trigger)","url":"https://archive.softwareheritage.org","domain":"softwareheritage.org","category":"academic","tier":null,"verdict":"qualifies-with-caveat","vorder":1,"grp":"usable","confidence":"reported","binding":"per-object-cap","identity_kind":"institution","identity_basis":"stated","needs_card":0,"needs_phone":0,"needs_id":0,"needs_institution":1,"country":null,"crypto":null,"interfaces":"rest,git,rclone","egress_metered":0,"per_object_bytes":104857600,"retention_days":null,"verified_at":"2026-10-21T00:00:00.000Z","verified_basis":"inherited","checked_on":"2026-10-21","stale_on":"2026-11-04","n_evidence":6,"usd_month":null,"usd_per_tb_month":null,"summary":"No storage quota is imposed on the depositor, because the depositor never uploads bytes. The archive stores content-addressed git objects from public reposit...","duplicate_of":null,"n_unknown":6},"record":{"topic":"storage","slug":"software-heritage-archive-save-code-now","provider":"Software Heritage Archive (CAPI read side) + Save Code Now (anonymous crawl trigger)","url":"https://archive.softwareheritage.org","category":"academic","free_tier":{"stated":"No storage quota is imposed on the depositor, because the depositor never uploads bytes. The archive stores content-addressed git objects from public repositories, deduplicated by sha1_git, and growth is the Foundation's problem, not yours. Live scale reference: the `torvalds/linux` origin is at visit 500 ('visit':500, date 2026-10-18). Deposit (push) is separate and capped: swh-deposit docs say 'upload limitation of 100Mib', and the source default in swh/deposit/config.py is \"max_upload_size\": 209715200 (200 MiB).","unit":"mixed","metered_on":"stored-bytes","source_url":"https://docs.softwareheritage.org/user/deposit/references/limits.html","read_on":"2026-10-21","notes":null},"per_object_cap":{"stated":"per-object-cap (deposit only): 100 MiB","bytes":104857600,"source_url":"https://docs.softwareheritage.org/user/deposit/references/limits.html","notes":"not stated"},"retention":{"stated":"list-rate-limited, and this is the binding constraint on *reading* a large tree (walking a repo = 1 call per directory). retention: permanent and intrinsic - this is a preservation archive, deletion is not part of the model; `visit_status: full` snapshots are retained per visit","source_url":"https://docs.softwareheritage.org/user/deposit/references/limits.html","notes":"not stated"},"egress":{"terms":"Free and unmetered - no pricing page, no billing, a public research archive. Downloads are direct `GET .../raw/` byte streams from Varnish. Note there is no CDN requirement to satisfy: nothing to pay.","metered":false},"interface":["rest","git","rclone"],"interface_detail":"rest","tooling":"Official Web API v1 (documented route index at https://archive.softwareheritage.org/api/1/); Python `swh.model`/`swh.web.client`; no rclone backend. Read paths: /api/1/origin/<url>/get/, /api/1/origin/<url>/visit/latest/, /api/1/snapshot/<id>/, /api/1/revision/<id>/, /api/1/directory/<id>/, /api/1/content/sha1_git:<h>/raw/.","chaining":"This is the strongest chaining object in the niche and it is NOT a place to upload - it is a place to make arbitrary public git content *addressable and permanent*. The mechanism: POST /api/1/origin/save/git/url/<URL>/ anonymously, with no account and no key, and it returns {\"save_task_status\":\"pending\",\"loading_task_id\":422136312}. So: unlimited free git hosts (one repo each, any size) -> anonymous SWH crawl request per URL -> content permanently in SWH under a sha1_git you can fetch forever. The upload-to-SWH step costs zero bytes of your quota; the bytes live in the free git host and SWH becomes the durability + retrieval layer. Multiply by unlimited origins. Combine with round-1's GitHub Releases finding: the archive is a free permanence layer over storage you already have.","limits":[{"kind":"per-object-cap","value":"per-object-cap (deposit only): 100 MiB","source":"https://docs.softwareheritage.org/user/deposit/references/limits.html"}],"limits_note":"per-object-cap (deposit only): 100 MiB documented, 200 MiB default in swh-deposit config. request-rate: SWH CAPI sends `X-Ratelimit-Limit: 120` / `X-Ratelimit-Remaining` / `X-Ratelimit-Reset` (observed 114->118 remaining across calls) - 120 requests per window per IP, i.e. list-rate-limited, and this is the binding constraint on *reading* a large tree (walking a repo = 1 call per directory). retention: permanent and intrinsic - this is a preservation archive, deletion is not part of the model; `visit_status: full` snapshots are retained per visit. Write access: /api/1/origin/save/ is open anonymously; deposit.softwareheritage.org returns 401 to anonymous PUT/POST.","identity_cost":{"kind":"institution","detail":"derived from the record's prose, not from an identity field, and no signup was executed: content *addressable and permanent*. The mechanism: POST /api/1/origin/save/git/url/<URL>/ anonymously, with no account and no key, and it returns {\"save_task_status\":\"pending\",\"loa","country":null},"reliability_note":"Read path is reliable but rate-shaped: 120 req/window/IP will throttle a naive tree walk of a 20 TiB corpus - parallelise across IPs or batch directory listings. docs.softwareheritage.org sits behind Anubis PoW (proof-of-work bot wall) and returns a challenge page with upstream_status 200, so doc numbers must be taken from the GitHub source, not the docs site. Anonymous save requests are queued ('pending'), not instant - ingestion lag is hours to days.","confidence":"reported","confidence_note":"One page read moves it to documented.","evidence":[{"url":"https://archive.softwareheritage.org/api/1/origin/https://github.com/torvalds/linux/visit/latest/","date":"2026-10-21","proved":"probe: GET -> 200, {\"visit\":500,\"date\":\"2026-10-18...\",\"snapshot\":\"221b3be5a85f08858a1410e5987f88e77603adb1\",\"status\":\"full\",\"type\":\"git\"}"},{"url":null,"date":"2026-10-21","proved":"probe: GET /api/1/snapshot/221b3be5.../ -> 200, branches include HEAD + refs/heads/master + refs/pull/10/head (full graph, anonymous)"},{"url":null,"date":"2026-10-21","proved":"probe: GET /api/1/content/sha1_git:010c587224224ba1254657b42b091a6c62c39e92/raw/ -> 200, Content-Length 6034, body begins 'Linux kernel\\n============' - real original bytes, not a re-encode"},{"url":"https://github.com/josephmisiti/awesome-machine-learning/","date":"2026-10-21","proved":"probe: POST /api/1/origin/save/git/url/ -> 200 {\"id\":2567968,\"save_request_status\":\"accepted\",\"save_task_status\":\"pending\"} - anonymous, no credential"},{"url":null,"date":"2026-10-21","proved":"probe: headers on /api/1/origin/.../get/ -> X-Ratelimit-Limit: 120, X-Ratelimit-Remaining: 114"},{"url":"https://deposit.softwareheritage.org/1/softwareheritage/","date":"2026-10-21","proved":"probe: POST (anon multipart) -> 401 (write gated)"}],"verdict":"qualifies-with-caveat","verified_at":"2026-10-21T00:00:00.000Z","notes":"No storage quota is imposed on the depositor, because the depositor never uploads bytes. The archive stores content-addressed git objects from public repositories, deduplicated by sha1_git, and growth is the Foundation's problem, not yours. Live scale reference: the `torvalds/linux` origin is at visit 500 ('visit':500, date 2026-10-18). Deposit (push) is separate and capped: swh-deposit docs say 'upload limitation of 100Mib', and the source default in swh/deposit/config.py is \"max_upload_size\": 209715200 (200 MiB).","extras":{"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."},"binding":"per-object-cap","binding_note":"the per-object cap sets the shard size and therefore the object count; it bounds the total more tightly than any headline quota"},"claims":[{"path":"$.free_tier.stated","kind":"free-quota","num":100.0,"unit":"Mib","per":null,"currency":null,"usd":null,"fx_date":null,"parse":"ok"},{"path":"$.limits[0].value","kind":"limit:per-object-cap","num":100.0,"unit":"MiB","per":null,"currency":null,"usd":null,"fx_date":null,"parse":"ok"}],"unknown":[["$.evidence[1].url","private-url"],["$.evidence[2].url","private-url"],["$.evidence[4].url","private-url"],["$.free_tier.notes","process"],["$.per_object_cap.notes","not-extracted"],["$.retention.notes","not-extracted"]],"history":[],"drift":[]},{"rid":"storage/software-heritage-deposit","card":{"rid":"storage/software-heritage-deposit","eid":"softwareheritage","topic":"storage","slug":"software-heritage-deposit","provider":"software heritage deposit (swh-deposit, the push api)","url":"https://deposit.softwareheritage.org/1/softwareheritage/","domain":"softwareheritage.org","category":"rejected-provider","tier":null,"verdict":"fails-quota","vorder":6,"grp":"rejected","confidence":"reported","binding":"none","identity_kind":"email","identity_basis":"defaulted","needs_card":null,"needs_phone":null,"needs_id":null,"needs_institution":null,"country":null,"crypto":null,"interfaces":null,"egress_metered":0,"per_object_bytes":null,"retention_days":null,"verified_at":"2026-10-21T00:00:00.000Z","verified_basis":"inherited","checked_on":"2026-10-21","stale_on":"2026-11-04","n_evidence":2,"usd_month":null,"usd_per_tb_month":null,"summary":"Upload capped at 100 MiB documented / 200 MiB default in config, and requires HTTP Basic auth - anonymous POST to deposit.softwareheritage.org/1/<collection>...","duplicate_of":null,"n_unknown":15},"record":{"topic":"storage","slug":"software-heritage-deposit","provider":"software heritage deposit (swh-deposit, the push api)","url":"https://deposit.softwareheritage.org/1/softwareheritage/","category":"rejected-provider","free_tier":{"stated":"Upload capped at 100 MiB documented / 200 MiB default in config, and requires HTTP Basic auth - anonymous POST to deposit.softwareheritage.org/1/<collection>/ returns 401. Only useful for so","unit":"none","metered_on":"none","source_url":"https://deposit.softwareheritage.org/1/softwareheritage/","read_on":"2026-10-21","notes":null},"per_object_cap":{"stated":"not recorded","bytes":null,"source_url":"https://deposit.softwareheritage.org/1/softwareheritage/","notes":"not recorded"},"retention":{"stated":"not recorded","days":null,"source_url":"https://deposit.softwareheritage.org/1/softwareheritage/","notes":null},"egress":{"terms":"not recorded","metered":false},"interface":["unknown"],"interface_detail":null,"tooling":"not recorded","chaining":"not recorded","limits":[],"limits_note":null,"identity_cost":{"kind":"email","detail":null,"country":null},"reliability_note":"Upload capped at 100 MiB documented / 200 MiB default in config, and requires HTTP Basic auth - anonymous POST to deposit.softwareheritage.org/1/<collection>/ returns 401. Only useful for so","confidence":"reported","confidence_note":null,"evidence":[{"url":"https://deposit.softwareheritage.org/1/softwareheritage/","date":"2026-10-21","proved":"Upload capped at 100 MiB documented / 200 MiB default in config, and requires HTTP Basic auth - anonymous POST to deposit.softwareheritage.org/1/<collection>/ returns 401. Only useful for so"},{"url":"https://raw.githubusercontent.com/softwareheritage/swh-deposit/master/docs/api/api-documentation.rst","date":"2026-10-21","proved":"cited as the basis of the rejection: Upload capped at 100 MiB documented / 200 MiB default in config, and requires HTTP Basic auth - anonymous POST to deposit.softwareheritage.org/1/<collection>/ returns 401. Only useful for so"}],"verdict":"fails-quota","verified_at":"2026-10-21T00:00:00.000Z","notes":"Upload capped at 100 MiB documented / 200 MiB default in config, and requires HTTP Basic auth - anonymous POST to deposit.softwareheritage.org/1/<collection>/ returns 401. Only useful for so","extras":{"dead_end":{"failure_class":"quota","why":"Upload capped at 100 MiB documented / 200 MiB default in config, and requires HTTP Basic auth - anonymous POST to deposit.softwareheritage.org/1/<collection>/ returns 401. Only useful for so","retry_when":null,"first_recorded":"2026-10-21"}},"binding":"none","binding_note":"no constraint of a named kind was recorded; the verdict rests on the quota sentence rather than on a named limit"},"claims":[{"path":"$.free_tier.stated","kind":"free-quota","num":100.0,"unit":"MiB","per":null,"currency":null,"usd":null,"fx_date":null,"parse":"ok"}],"unknown":[["$.chaining","not-recorded"],["$.confidence_note","withheld"],["$.egress.terms","not-recorded"],["$.extras.dead_end.retry_when","process"],["$.free_tier.notes","process"],["$.identity_cost.detail","defaulted"],["$.identity_cost.kind","identity-defaulted"],["$.interface","interface-unknown"],["$.interface_detail","withheld"],["$.limits_note","process"],["$.per_object_cap.notes","not-recorded"],["$.per_object_cap.stated","not-recorded"],["$.retention.notes","process"],["$.retention.stated","not-recorded"],["$.tooling","not-recorded"]],"history":[],"drift":[]}]}