Skip to main content

Secrets

Encrypted storage for sensitive values such as API keys and credentials.

Overview​

Secrets belong to a project. Values are encrypted at rest with AES-256-GCM, never returned, and can only be replaced. Every response carries has_value.

Secrets supply credentials to AI Providers at inference time: Connect Third-Party LLMs - Step 3 (Store provider credentials as secrets) and Step 4 (Create provider records).

See the Permissions Reference for the IAM action strings for this module.

Data Model​

FieldTypeDescription
idstringPublic identifier (e.g. sec_…)
project_idstringID of the owning project
namestringHuman-readable label
has_valuebooleantrue when an encrypted value is stored
created_atstringISO 8601 creation timestamp
updated_atstringISO 8601 last-updated timestamp

Key Concepts​

Secret References ({{secret:...}})​

A string field supporting secret references may embed:

{{secret:sec_01HXYZ...}}

The token, not the value, is stored and echoed by GET/LIST; it is resolved at the point of use (e.g. before an outbound HTTP request). The token names the secret by id; any other form, such as the secret's name, is 400 INVALID_TEMPLATE_TOKEN at create/update. The secret must belong to the same project as the resource, else 400 SECRET_NOT_FOUND at create/update.

Supported fields:

ResourceFieldResolved when
Tool (http)execute.url, execute.headers valuesThe tool is called
Tool (mcp)mcp.url, mcp.headers valuesThe MCP server is contacted (tool listing and calls)
Triggertool_context valuesThe trigger fires
{
"execute": {
"url": "https://api.example.com/convert",
"headers": { "Authorization": "Bearer {{secret:sec_01HXYZ}}" }
}
}

Updating the secret's value rotates the credential for every referencing tool on its next call.

For referencing a secret created in the same Formation template, see Sub Expressions.

Deletion​

Deleting a secret still referenced by AI providers returns 409 Conflict; ?force=true cascade-deletes the dependents.

Configuration​

Environment VariableRequiredDescription
SECRETS_ENCRYPTION_KEYYes64-character hex string (32 bytes). Used for AES-256-GCM encryption of all stored secret values.

Generate a key with:

openssl rand -hex 32

Examples​

Create a secret​

soat create-secret --project-id proj_ABC --name "OpenAI Key" --value "sk-abc123..."

Update secret value​

soat update-secret --secret-id sec_01 --value sk-abc123...