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.
# 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.
# zfs send -Rw tank@2026-09-14T03:00 | \ curl -T - "https://us-sw-01.zfsrecv.com/v1/recv/tank?token=YOUR-TOKEN-HERE"
-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.
# 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.