Versions
Giving a secret a new value does not overwrite the old one. It writes a new immutable version — numbered from 1, with its own ciphertext, nonce and wrapped key — and points the secret at it. Nothing is lost, and the previous value stays readable. Renaming a secret or editing its description does not create a version. Only a new value does.Reading an older value
Listing versions
ciphertext, nonce and the wrapped dek — not plaintext. It is there to show what history exists; use ?version=n on the list route to actually read a value.
Version history is a paid capability; without it this route answers 402. See Plans and limits.
The audit log
Every secret carries a log of what has happened to it:actor_id — the workspace membership that did it, which you can resolve against GET /workspaces/{workspace_id}/members.
A share redemption is attributed to the member who created the link, not to whoever opened it — the recipient is anonymous by construction. An
ACCESSED entry against a secret that also has a recent SHARED entry is someone spending that link.Rotation
Every environment gets a rotation cadence when it is created —default_policy, in days, falling back to the deployment’s default when you do not name one. Individual secrets can carry their own cadence, which wins over the environment’s.
Each secret read reports both halves of the picture:
Rotation is advisory: Sink records the cadence and the last change so you can see what is overdue. It does not expire a secret or refuse to serve a stale one — the value keeps working until you replace it.
Rotating is just an update, which is to say a new version:
PATCH the single secret with its new value. The previous value stays in history, so a rollback is a --version away.