User Manual#

This is a guide for how to prepare and push a software deposit with the swh deposit commands.


You need to have an account on the Software Heritage deposit application to be able to use the service.

Please contact the Software Heritage team for more information on how to get access to this service.

For testing purpose, a test instance is available [1] and will be used in the examples below.

Once you have an account, you should get a set of access credentials as a login and a password (identified as <name> and <pass> in the remaining of this document). A deposit account also comes with a “provider URL” which is used by SWH to build the Origin URL of deposits created using this account.


To install the swh.deposit command line tools, you need a working Python 3.7+ environment. It is strongly recommended you use a virtualenv for this.

$ python3 -m virtualenv deposit
$ source deposit/bin/activate
(deposit)$ pip install swh.deposit
(deposit)$ swh deposit --help
Usage: swh deposit [OPTIONS] COMMAND [ARGS]...

  Deposit main command

  -h, --help  Show this message and exit.

  admin   Server administration tasks (manipulate user or...
  status  Deposit's status
  upload  Software Heritage Public Deposit Client Create/Update...

Note: in the examples below, we use the jq tool to make json outputs nicer. If you do have it already, you may install it using your distribution’s packaging system. For example, on a Debian system:

$ sudo apt install jq

Prepare a deposit#

  • compress the files in a supported archive format:

    • zip: common zip archive (no multi-disk zip files).

    • tar: tar archive without compression or optionally any of the

      following compression algorithm gzip (.tar.gz, .tgz), bzip2 (.tar.bz2) , or lzma (.tar.lzma)

  • (Optional) prepare a metadata file (more details Deposit metadata):


Assuming you want to deposit the source code of belenios version 1.12

(deposit)$ wget
2020-10-28 11:40:37 (4,56 MB/s) - ‘’ saved [449880/449880]

Then you need to prepare a metadata file allowing you to give detailed information on your deposited source code. A rather minimal Atom with Codemeta file could be:

(deposit)$ cat metadata.xml
<?xml version="1.0" encoding="utf-8"?>
<entry xmlns=""
  <title>Verifiable online voting system</title>
  <codemeta:keywords>Online voting</codemeta:keywords>
  <codemeta:description>Verifiable online voting system</codemeta:description>
    <codemeta:name>GNU Affero General Public License</codemeta:name>
    <codemeta:name>Belenios Test User</codemeta:name>
      <swh:origin url="" />


Please read the Deposit metadata page for a more detailed view on the metadata file formats and semantics; and Origin creation with the <swhdeposit:create_origin> tag for a description of the <swh:create_origin> tag.

Push a deposit#

You can push a deposit with:

  • a single deposit (archive + metadata):

    The user posts in one query a software source code archive and associated metadata. The deposit is directly marked with status deposited.

  • a multisteps deposit:

    1. Create an incomplete deposit (marked with status partial)

    2. Add data to a deposit (in multiple requests if needed)

    3. Finalize deposit (the status becomes deposited)

  • a metadata-only deposit:

    The user posts in one query an associated metadata file on a SWHID object. The deposit is directly marked with status done.

Overall, a deposit can be a in series of steps as follow:

The important things to notice for now is that it can be:


the deposit is partially received


deposit has been there too long and is now deemed ready to be garbage collected


deposit is complete and is ready to be checked to ensure data consistency


deposit is fully received, checked, and ready for loading


loading is ongoing on swh’s side


loading is successful


loading is a failure

When you push a deposit, it is either in the deposited state or in the partial state if you asked for a partial upload.

Single deposit#

Once the files are ready for deposit, we want to do the actual deposit in one shot, i.e. sending both the archive (zip) file and the metadata file.

  • 1 archive (content-type application/zip or application/x-tar)

  • 1 metadata file in atom xml format (content-type: application/atom+xml;type=entry)

For this, we need to provide the:

  • arguments: --username 'name' --password 'pass' as credentials

  • archive’s path (example: --archive path/to/archive-name.tgz)

  • metadata file path (example: --metadata path/to/metadata.xml)

to the swh deposit upload command.


To push the Belenios 1.12 we prepared previously on the testing instance of the deposit:

(deposit)$ ls  metadata.xml deposit
(deposit)$ swh deposit upload --username <name> --password <secret> \
               --url \
               --create-origin \
               --archive \
               --metadata metadata.xml \
               --format json | jq
  'deposit_status': 'deposited',
  'deposit_id': '1',
  'deposit_date': 'Oct. 28, 2020, 1:52 p.m.',
  'deposit_status_detail': None


You just posted a deposit to your main collection on Software Heritage (staging area)!

The returned value is a JSON dict, in which you will notably find the deposit id (needed to check for its status later on) and the current status, which should be deposited if no error has occurred.

Note: As the deposit is in deposited status, you can no longer update the deposit after this query. It will be answered with a 403 (Forbidden) answer.

If something went wrong, an equivalent response will be given with the error and detail keys explaining the issue, e.g.:

  'error': 'Unknown collection name xyz',
  'detail': None,
  'deposit_status': None,
  'deposit_status_detail': None,
  'deposit_swh_id': None,
  'status': 404

Once the deposit has been done, you can check its status using the swh deposit status command:

(deposit)$ swh deposit status --username <name> --password <secret> \
               --url \
               --deposit-id 1 -f json | jq
  "deposit_id": "1",
  "deposit_status": "done",
  "deposit_status_detail": "The deposit has been successfully loaded into the Software Heritage archive",
  "deposit_swh_id": "swh:1:dir:63a6fc0ed8f69bf66ccbf99fc0472e30ef0a895a",
  "deposit_swh_id_context": "swh:1:dir:63a6fc0ed8f69bf66ccbf99fc0472e30ef0a895a;origin=;visit=swh:1:snp:0ae536667689da7047bfb7aa9f37f5958e9f4647;anchor=swh:1:rev:17ad98c940104d45b6b6bd6fba9aa832eeb95638;path=/",
  "deposit_external_id": "belenios-01234065"

Metadata-only deposit#

This allows to deposit only metadata information on a SWHID reference. Prepare a metadata file as described in the prepare deposit section

Ensure this metadata file also declares a SWHID reference:

<entry xmlns="..."

  <!-- ... -->

      <swh:object swhid="swh:1:dir:31b5c8cc985d190b5a7ef4878128ebfdc2358f49" />

  <!-- ... -->


For this, we then need to provide the following information:

  • arguments: --username 'name' --password 'pass' as credentials

  • metadata file path (example: --metadata path/to/metadata.xml)

to the swh deposit metadata-only command.


(deposit) swh deposit metadata-only --username <name> --password <secret> \
--url \
--metadata ../deposit-swh.metadata-only.xml \
--format json | jq .
  "deposit_id": "29",
  "deposit_status": "done",
  "deposit_date": "Dec. 15, 2020, 11:37 a.m."

For details on the metadata-only deposit, see the metadata-only deposit protocol reference

Multisteps deposit#

In this case, the deposit is created by several requests, uploading objects piece by piece. The steps to create a multisteps deposit:

1. Create an partial deposit#

First use the --partial argument to declare there is more to come

$ swh deposit upload --username name --password secret \
                     --archive foo.tar.gz \

2. Add content or metadata to the deposit#

Continue the deposit by using the --deposit-id argument given as a response for the first step. You can continue adding content or metadata while you use the --partial argument.

To only add one new archive to the deposit:

$ swh deposit upload --username name --password secret \
                     --archive add-foo.tar.gz \
                     --deposit-id 42 \

To only add metadata to the deposit:

$ swh deposit upload --username name --password secret \
                     --metadata add-foo.tar.gz.metadata.xml \
                     --deposit-id 42 \

3. Finalize deposit#

On your last addition (same command as before), by not declaring it --partial, the deposit will be considered completed. Its status will be changed to deposited:

$ swh deposit upload --username name --password secret \
                     --metadata add-foo.tar.gz.metadata.xml \
                     --deposit-id 42

Update deposit#

  • Update deposit metadata:

    • only possible if the deposit status is done, --deposit-id <id> and --swhid <swhid> are provided

    • by using the --metadata flag, a path to an xml file

$ swh deposit upload \
  --username name --password secret \
  --deposit-id 11 \
  --swhid swh:1:dir:2ddb1f0122c57c8479c28ba2fc973d18508e6420 \
  --metadata ../deposit-swh.update-metadata.xml
  • Replace deposit:

    • only possible if the deposit status is partial and --deposit-id <id> is provided

    • by using the --replace flag

      • --metadata-deposit replaces associated existing metadata

      • --archive-deposit replaces associated archive(s)

      • by default, with no flag or both, you’ll replace associated metadata and archive(s):

$ swh deposit upload --username name --password secret \
                     --deposit-id 11 \
                     --archive updated-je-suis-gpl.tgz \
  • Update a loaded deposit with a new version (this creates a new deposit):

    • by using --add-to-origin with an origin URL previously created with --create-origin, you will link the new deposit with its parent deposit:

$ swh deposit upload --username name --password secret \
                     --archive je-suis-gpl-v2.tgz \
                     --add-to-origin ''

Check the deposit’s status#

You can check the status of the deposit by using the --deposit-id argument:

$ swh deposit status --username name --password secret \
                     --deposit-id 11
  "deposit_id": 11,
  "deposit_status": "deposited",
  "deposit_swh_id": null,
  "deposit_status_detail": "Deposit is ready for additional checks \
                            (tarball ok, metadata, etc...)"

When the deposit has been loaded into the archive, the status will be marked done. In the response, will also be available the <deposit_swh_id>, <deposit_swh_id_context>. For example:

  "deposit_id": 11,
  "deposit_status": "done",
  "deposit_swh_id": "swh:1:dir:d83b7dda887dc790f7207608474650d4344b8df9",
  "deposit_swh_id_context": "swh:1:dir:d83b7dda887dc790f7207608474650d4344b8df9;\
  "deposit_status_detail": "The deposit has been successfully \
                            loaded into the Software Heritage archive"