Getting started

Quickstart

Create an account, take a snapshot, and stream your first full send in under five minutes.

2 min read

You need a ZFS pool running OpenZFS and a ZFSRecv.com API token. No other tools, libraries, or applications required, the send is plain zfs send piped over HTTPS.

Create an account

A pool on ZFSRecv is the receive target for your dataset trees. Create one from your account page — sign up first if you don’t have one yet — and pick a region: tank in the US Southwest region becomes us-sw-01.zfsrecv.com/v1/recv/tank. Your API token is shown once, right there when the pool is created — copy it immediately, and save it somewhere safe, as it isn’t displayed again.

Take a snapshot

Snapshot recursively so each child datasets gets the same snapshot as the parent. You can use whatever snapshot scheme or tools you are already using (sanoid, a cron script, or your own tooling). Nothing is pruned automatically on our end. Snapshots stay until you destroy them yourself or through whatever tools you already use to manage snapshots.

snapshot
# zfs snapshot -r tank@2026-09-14T03:00

Send it

The first send is a full stream. Pipe it straight into the endpoint; curl -T - reads the stream from stdin and uploads it as it arrives, so nothing is staged on disk.

first full send
# zfs send -Rw tank@2026-09-14T03:00 | \
    curl -T - "https://us-sw-01.zfsrecv.com/v1/recv/tank?token=YOUR-TOKEN-HERE"
Why -Rw
-R makes the stream recursive and carries properties and child datasets. -w sends the raw, still-encrypted, compressed blocks — see raw encrypted sends.

Send an increment

Every send after the first should be incremental: -i names the snapshot ZFSRecv.com already has, and only the changed blocks go over the wire.

nightly increment
# zfs send -Rw -i @2026-09-14T03:00 \
      tank@2026-09-15T03:00 | \
    curl -T - "https://us-sw-01.zfsrecv.com/v1/recv/tank?token=YOUR-TOKEN-HERE"

Next steps

  • Setup automatic replication using cron, a systemd unit, or syncoid --recursive.
  • Confirm the pool holds what you expect with GET /v1/list.