KeyEnvKeyEnv
API Reference

Secrets

Secret management (encrypted key-value pairs)

Secrets

Secret management (encrypted key-value pairs)

List secrets

GET /api/v1/projects/{projectId}/environments/{environmentId}/secrets

Returns all secrets in an environment (keys and metadata only, no values). Includes inherited secrets from parent environments.

Operation ID: listSecrets · Authentication: Authorization: Bearer <token>

Path parameters

NameTypeRequiredDescription
projectIdstringyesProject UUID or slug (e.g., "my-project")
environmentIdstringyesEnvironment UUID or name (e.g., "development", "staging", "production")

Responses

StatusDescriptionBody
200List of secretsobject
401Authentication requiredError
403Insufficient permissionsError
404Resource not foundError

Response body (200)

FieldTypeDescription
secretsobject[]

Example

curl -X GET "https://api.keyenv.dev/api/v1/projects/{projectId}/environments/{environmentId}/secrets" \
  -H "Authorization: Bearer $KEYENV_TOKEN"

Create secret

POST /api/v1/projects/{projectId}/environments/{environmentId}/secrets

Creates a new secret in an environment

Operation ID: createSecret · Authentication: Authorization: Bearer <token>

Path parameters

NameTypeRequiredDescription
projectIdstringyesProject UUID or slug (e.g., "my-project")
environmentIdstringyesEnvironment UUID or name (e.g., "development", "staging", "production")

Request body

application/json (required)

FieldTypeRequiredDescription
keystringyesMust be uppercase letters, numbers, and underscores, starting with a letter
valuestringyes
descriptionstringno

Responses

StatusDescriptionBody
201Secret createdobject
400Invalid requestError
401Authentication requiredError
403Insufficient permissionsError
409Resource already existsError
429Plan limit exceededLimitError

Response body (201)

FieldTypeDescription
secretSecret

Example

curl -X POST "https://api.keyenv.dev/api/v1/projects/{projectId}/environments/{environmentId}/secrets" \
  -H "Authorization: Bearer $KEYENV_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"key":"DATABASE_URL","value":"string","description":"string"}'

Export secrets

GET /api/v1/projects/{projectId}/environments/{environmentId}/secrets/export

Exports all secrets with their decrypted values. Use this for CI/CD or local development. Includes inherited secrets from parent environments.

Note: This endpoint logs an audit event for compliance.

Operation ID: exportSecrets · Authentication: Authorization: Bearer <token>

Path parameters

NameTypeRequiredDescription
projectIdstringyesProject UUID or slug (e.g., "my-project")
environmentIdstringyesEnvironment UUID or name (e.g., "development", "staging", "production")

Responses

StatusDescriptionBody
200Secrets with valuesobject
401Authentication requiredError
403Insufficient permissionsError
404Resource not foundError

Response body (200)

FieldTypeDescription
secretsobject[]

Example

curl -X GET "https://api.keyenv.dev/api/v1/projects/{projectId}/environments/{environmentId}/secrets/export" \
  -H "Authorization: Bearer $KEYENV_TOKEN"

Bulk import secrets

POST /api/v1/projects/{projectId}/environments/{environmentId}/secrets/bulk

Imports multiple secrets at once. Useful for migrating from .env files or other systems.

  • Maximum 100 secrets per request
  • Set overwrite: true to update existing secrets
  • Set overwrite: false to skip existing secrets

Operation ID: bulkImportSecrets · Authentication: Authorization: Bearer <token>

Path parameters

NameTypeRequiredDescription
projectIdstringyesProject UUID or slug (e.g., "my-project")
environmentIdstringyesEnvironment UUID or name (e.g., "development", "staging", "production")

Request body

application/json (required)

FieldTypeRequiredDescription
secretsobject[]yes
overwritebooleannoWhether to overwrite existing secrets

Responses

StatusDescriptionBody
200Import resultsBulkImportResult
400Invalid requestError
401Authentication requiredError
403Insufficient permissionsError
429Plan limit exceededLimitError

Response body (200)

FieldTypeDescription
createdintegerNumber of secrets created
updatedintegerNumber of secrets updated (when overwrite=true)
skippedintegerNumber of secrets skipped (existing, when overwrite=false)

Example

curl -X POST "https://api.keyenv.dev/api/v1/projects/{projectId}/environments/{environmentId}/secrets/bulk" \
  -H "Authorization: Bearer $KEYENV_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"secrets":[{"key":"string","value":"string","description":"string"}],"overwrite":false}'

Get secret

GET /api/v1/projects/{projectId}/environments/{environmentId}/secrets/{key}

Returns a single secret with its decrypted value

Operation ID: getSecret · Authentication: Authorization: Bearer <token>

Path parameters

NameTypeRequiredDescription
projectIdstringyesProject UUID or slug (e.g., "my-project")
environmentIdstringyesEnvironment UUID or name (e.g., "development", "staging", "production")
keystringyesSecret key (uppercase letters, numbers, underscores)

Responses

StatusDescriptionBody
200Secret with valueobject
401Authentication requiredError
403Insufficient permissionsError
404Resource not foundError

Response body (200)

FieldTypeDescription
secretobject

Example

curl -X GET "https://api.keyenv.dev/api/v1/projects/{projectId}/environments/{environmentId}/secrets/{key}" \
  -H "Authorization: Bearer $KEYENV_TOKEN"

Update secret

PUT /api/v1/projects/{projectId}/environments/{environmentId}/secrets/{key}

Updates a secret's value and/or description. Previous values are preserved in history.

Operation ID: updateSecret · Authentication: Authorization: Bearer <token>

Path parameters

NameTypeRequiredDescription
projectIdstringyesProject UUID or slug (e.g., "my-project")
environmentIdstringyesEnvironment UUID or name (e.g., "development", "staging", "production")
keystringyesSecret key (uppercase letters, numbers, underscores)

Request body

application/json (required)

FieldTypeRequiredDescription
valuestringyes
descriptionstringno

Responses

StatusDescriptionBody
200Secret updatedobject
400Invalid requestError
401Authentication requiredError
403Insufficient permissionsError
404Resource not foundError

Response body (200)

FieldTypeDescription
secretSecret

Example

curl -X PUT "https://api.keyenv.dev/api/v1/projects/{projectId}/environments/{environmentId}/secrets/{key}" \
  -H "Authorization: Bearer $KEYENV_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"value":"string","description":"string"}'

Delete secret

DELETE /api/v1/projects/{projectId}/environments/{environmentId}/secrets/{key}

Permanently deletes a secret

Operation ID: deleteSecret · Authentication: Authorization: Bearer <token>

Path parameters

NameTypeRequiredDescription
projectIdstringyesProject UUID or slug (e.g., "my-project")
environmentIdstringyesEnvironment UUID or name (e.g., "development", "staging", "production")
keystringyesSecret key (uppercase letters, numbers, underscores)

Responses

StatusDescriptionBody
204Secret deleted
401Authentication requiredError
403Insufficient permissionsError
404Resource not foundError

Example

curl -X DELETE "https://api.keyenv.dev/api/v1/projects/{projectId}/environments/{environmentId}/secrets/{key}" \
  -H "Authorization: Bearer $KEYENV_TOKEN"

Get secret history

GET /api/v1/projects/{projectId}/environments/{environmentId}/secrets/{key}/history

Returns the version history of a secret with decrypted values

Operation ID: getSecretHistory · Authentication: Authorization: Bearer <token>

Path parameters

NameTypeRequiredDescription
projectIdstringyesProject UUID or slug (e.g., "my-project")
environmentIdstringyesEnvironment UUID or name (e.g., "development", "staging", "production")
keystringyesSecret key (uppercase letters, numbers, underscores)

Responses

StatusDescriptionBody
200Secret historyobject
401Authentication requiredError
403Insufficient permissionsError
404Resource not foundError

Response body (200)

FieldTypeDescription
historyobject[]

Example

curl -X GET "https://api.keyenv.dev/api/v1/projects/{projectId}/environments/{environmentId}/secrets/{key}/history" \
  -H "Authorization: Bearer $KEYENV_TOKEN"

On this page