Booting neural core...
Booting neural core...
portal.cybernethicc.com/api/v1Vault is a zero-knowledge password manager and Secret Send service. This API is the programmatic surface — chiefly for one-time secret distribution from CI, scripts, and integrations. Interactive use (item CRUD, browser extension) happens through the portal UI and is not part of this reference.
Zero-knowledge boundary
Plaintext of stored items and Secret Send payloads is encrypted in your browser before reaching the server. The API endpoints in this reference deal inciphertext_b64,iv_b64, andtag_b64— encryption keys never leave your client.
Two auth mechanisms, depending on the endpoint.
Service tokens are scoped to a single Secret Project + optional environment list. They carry the key material needed to decrypt that project's secrets server-side, so the holder never needs the master password. Used by CI runners, scripts, and tunnel clients.
Authorization: Bearer cyb_<token_id_prefix>_<key_fragment>Mint a service token from portal.cybernethicc.com/vault → project → Service tokens. The plaintext is shown once at creation; rotate by issuing a new one and revoking the old.
Secret Send links carry a URL-safe token in the path. No header needed. The token is consumed on first successful read for burn-on-read secrets.
GET /api/v1/public/vault/secrets/<url_token>Public, programmatic Vault endpoints. JWT-only routes (item CRUD, vault unlock, passkey, TOTP) are not listed — those are driven by the portal UI.
/api/v1/public/vault/secretsFetch decrypted secrets via service token/api/v1/public/vault/secrets/{token}Consume a Secret Send (burn-on-read)/api/v1/vault/secretsCreate a Secret Send (auth + unlocked vault required)/api/v1/vault/secrets/{id}Revoke a Secret Send before consumptionThe common CI pattern: store credentials in a Vault Secret Project, issue a service token scoped to that project + environment, and read values from a script.
/api/v1/public/vault/secrets| Field | Required | Notes |
|---|---|---|
env | no | Environment slug (e.g. prod, staging). Token must include this env in its scope. |
decrypt | no | Set to server for server-side decryption using the key fragment in the token. Omit to get ciphertext (for client-side decrypt). |
curl -fsS https://portal.cybernethicc.com/api/v1/public/vault/secrets?env=prod&decrypt=server \
-H "Authorization: Bearer cyb_6fc0b1c2789ed180_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"{
"values": {
"DB_PASSWORD": "s3cret-prod-pw",
"STRIPE_API_KEY": "sk_live_..."
}
}401 { "error": { "code": "UNAUTHORIZED", "message": "Token revoked or unknown" } }
401 { "error": { "code": "UNAUTHORIZED", "message": "Missing Authorization header" } }
403 { "error": { "code": "FORBIDDEN", "message": "Token has no access to the requested env(s)" } }Audit trail. Every fetch with a service token writes a row to the Vault audit log (visible in the portal). The row records the project, the token name/id prefix, the env, the source IP, and the user agent.
Receive-side endpoint for the public Secret Send link. Returns the encrypted blob plus metadata; decrypt locally using the password / key fragment shipped out-of-band.
/api/v1/public/vault/secrets/{token}curl -fsS https://portal.cybernethicc.com/api/v1/public/vault/secrets/abc123def456{
"data": {
"ciphertext_b64": "GpKx...",
"iv_b64": "qY1n...",
"tag_b64": "lZmd...",
"burn_on_read": true,
"views_remaining": 0,
"has_password": false
}
}If burn_on_read is true, the secret is deleted server-side at the moment of this response. Subsequent requests return 404.
404 { "error": { "code": "NOT_FOUND", "message": "Secret not found or already viewed" } }Service tokens have three pieces of state inside them, packed into a single bearer string:
Token format:
cyb_<token_id_prefix>_<base64url_key_fragment>Authorization: Bearer. Every use writes an audit row with IP + user agent.401 UNAUTHORIZED.Treat the token like a password. Anyone holding the plaintext can read every secret in the token's scope. Do not commit tokens to git; do not paste them into shared chats. Use the portal's built-in Secret Send (with a burn-on-read link) to hand a token to a teammate.
All error responses share the same shape:
{
"error": {
"code": "FORBIDDEN",
"message": "Token has no access to the requested env(s)"
}
}| Status | Code | When |
|---|---|---|
| 400 | BAD_REQUEST | Malformed input (e.g. body not JSON, missing required field). |
| 401 | UNAUTHORIZED | Missing/invalid auth, revoked service token, expired URL token. |
| 403 | FORBIDDEN | Authenticated but not allowed (env not in token scope, tier gate failure). |
| 404 | NOT_FOUND | Secret already viewed, expired, or never existed. |
| 429 | RATE_LIMITED | Tier daily quota hit (Free tier Secret Send creation only). |
| 500 | INTERNAL_ERROR | Server side. Open a support ticket and quote the response timestamp. |