Skip to content

Secrets API

All endpoints require authentication via Bearer token.

  • Cloud: https://api.soup.dev/api/v1
  • Self-hosted: http://your-server:8080/api/v1

Get all secrets for an environment with inheritance and reference resolution.

Terminal window
GET /projects/{project_id}/environments/{env_id}/secrets
ParameterTypeDefaultDescription
resolvebooleantrueResolve ${VAR} references
{
"data": {
"DATABASE_URL": "postgres://localhost:5432/mydb",
"API_KEY": "sk_live_...",
"LOG_LEVEL": "info"
}
}
Terminal window
# Get resolved secrets
curl -H "Authorization: Bearer $TOKEN" \
"https://api.soup.dev/api/v1/projects/proj_123/environments/env_456/secrets"
# Get unresolved (raw values)
curl -H "Authorization: Bearer $TOKEN" \
"https://api.soup.dev/api/v1/projects/proj_123/environments/env_456/secrets?resolve=false"
Terminal window
GET /projects/{project_id}/environments/{env_id}/secrets/{key}
{
"data": {
"key": "DATABASE_URL",
"value": "postgres://localhost:5432/mydb"
}
}
StatusErrorDescription
404Secret not foundKey doesn’t exist in this environment or parents
403Permission deniedUser doesn’t have access to this project

Create or update a secret.

Terminal window
POST /projects/{project_id}/environments/{env_id}/secrets
Content-Type: application/json
{
"key": "DATABASE_URL",
"value": "postgres://localhost:5432/mydb"
}
{
"data": {
"key": "DATABASE_URL"
}
}

Status: 201 Created

Keys must:

  • Start with a letter (A-Z)
  • Contain only uppercase letters, numbers, and underscores
  • Be 1-255 characters

Valid: DATABASE_URL, API_KEY_V2, MY_VAR Invalid: database_url, 123_KEY, my-var

Terminal window
DELETE /projects/{project_id}/environments/{env_id}/secrets/{key}

Status: 204 No Content

  • Only deletes from the specified environment
  • If the key exists in a parent environment, child environments will inherit it after deletion

Get just the keys (not values) for an environment.

Terminal window
GET /projects/{project_id}/environments/{env_id}/secrets/keys
{
"data": [
"DATABASE_URL",
"API_KEY",
"LOG_LEVEL"
]
}

The CLI’s export command uses the secrets endpoint:

Terminal window
soup export my-app production
# Calls: GET /projects/{id}/environments/{id}/secrets
# Formats as shell exports

Bulk import from .env file:

Terminal window
soup import my-app production --file .env
TierRequests/minute
Self-hostedUnlimited
Cloud Free100
Cloud Pro1,000
Cloud Enterprise10,000
Terminal window
# Set a secret
curl -X POST \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"key": "API_KEY", "value": "sk_live_..."}' \
https://api.soup.dev/api/v1/projects/proj_123/environments/env_456/secrets
# Get all secrets
curl -H "Authorization: Bearer $TOKEN" \
https://api.soup.dev/api/v1/projects/proj_123/environments/env_456/secrets
# Delete a secret
curl -X DELETE \
-H "Authorization: Bearer $TOKEN" \
https://api.soup.dev/api/v1/projects/proj_123/environments/env_456/secrets/OLD_KEY
const response = await fetch(
`${API_URL}/projects/${projectId}/environments/${envId}/secrets`,
{
headers: {
'Authorization': `Bearer ${token}`,
},
}
);
const { data } = await response.json();
console.log(data.DATABASE_URL);
import requests
response = requests.get(
f"{API_URL}/projects/{project_id}/environments/{env_id}/secrets",
headers={"Authorization": f"Bearer {token}"}
)
secrets = response.json()["data"]
print(secrets["DATABASE_URL"])