REFERENCE
API keys
How external callers authenticate. The key is a signing seed rather than a password, so it never travels and we store nothing that can authenticate.
The key is a seed, not a password
The SDK derives an Ed25519 + ML-DSA-65 keypair from it and signs every request. The seed itself is never transmitted, and ForgeZero stores only the public halves — a full dump of our key collection yields nothing anyone can sign with.
fz_live_<keyId>_<seed> fz_test_... outside productionScope every key to exactly what it needs
Scopes name exact entries; wildcards are not accepted. An external key can never read a whole vault — a full project sync is available only to an attested managed node, and that is checked on the credential itself rather than on the scope list, so it cannot be granted by mistake.
vault.read:<project>/<env>/<entry>
vault.write:<project>/<env>/<entry>
vault.list:<project>/<env>Controls, and what each is actually worth
Scopes, expiry and revocation are real: status is read fresh on every call, so a revoked key stops working on the next request rather than when some token expires. An IP allowlist is real for fixed egress. An origin allowlist is advisory only — any server-side caller can set that header — and the interface says so rather than implying a guarantee it cannot make.
Read-only unless you say otherwise
Write scope is opt-in and listed separately, because the person who writes a secret should not silently become the person handing out access to it. A leaked key should cost you one entry, not the vault.