Quickstart: first secret in CI
Create a namespace, a service account and an API key, write a secret, and read it from a pipeline — in five steps.
This walks the whole loop: provision access in the console, then read a secret from a machine. It takes about five minutes.
1. Create a namespace#
Open your project → Secrets → Namespaces, pick an environment tab (e.g. prod), and create a
namespace such as product/web. A namespace mints its own encryption key, so this requires the
engine to be unsealed.
Secrets live inside a project, so every path starts with the project slug — acme-web in the
examples below. See The Shared project for the one project
PulsVault creates for you.
2. Create a machine identity#
Go to Secrets → Machine Identities → New. Give it a name (e.g. GitHub Actions) and a slug
(github-actions). The slug is how the machine appears in the audit trail.
3. Attach a policy#
In the wizard's second step, grant scoped access — for example actions read on the pattern
acme-web/prod/product/web/**. Policies match the full canonical path
{project}/{env}/{namespace}/{secret}. See Access policies.
4. Issue an API key#
In the third step (or later, from the account's API Keys tab), issue a key. The token is shown once:
Only a SHA-256 hash of the token is stored. If you lose it, revoke the key and issue a new one.
Store it as an encrypted CI secret (e.g. a GitHub Actions secret named PULSVAULT_TOKEN).
5. Write and read the secret#
Write a value once (from the CLI, using a key that also has write):
pulsvault login # paste the key at the prompt; input is hidden
pulsvault set acme-web/prod/product/web/db/password --from-file ./password.txtlogin checks the key against the server before storing it, so a mistyped or revoked key fails here
rather than later. Running your own PulsVault instance? Point the CLI at it once with
pulsvault login --profile mycorp --host https://vault.mycorp.com/api/v1 — see
Pointing the CLI at your own deployment.
Then read it from your pipeline. With the CLI:
export DATABASE_PASSWORD=$(pulsvault get acme-web/prod/product/web/db/password)Set --project (or PULSVAULT_PROJECT) once and you can drop the leading slug:
export PULSVAULT_PROJECT=acme-web
pulsvault get prod/product/web/db/passwordTo store it on the machine instead of re-exporting it in every shell, use pulsvault config project acme-web — see Profiles & defaults.
…or with plain curl:
curl -H "Authorization: Bearer $PULSVAULT_TOKEN" \
https://api.pulsvault.com/api/v1/secrets/acme-web/prod/product/web/db/password
# → {"path":"…","value":"…","versionNumber":1,"contentType":"text/plain","metadata":{}}Next: make it known-working#
Storing a secret is half the job. In the console, attach a validation probe to the path — that is what turns a stored string into a credential PulsVault keeps confirming still authenticates. Nothing validates until you do this; the CLI can run and read probes, never create them.
Once it is attached, the same path answers from your terminal or a pipeline:
pulsvault validation-status acme-web/prod/product/web/db # is it validated, and was it working?
pulsvault validate acme-web/prod/product/web/db && ./deploy.sh # check it right now, then deploy