Skip to content

Secrets

Set secret

Create or replace a workspace or caller-owned personal secret. New workspace secrets require workspace write access; existing ones require workspace Admin or secret Admin access. Omit `value` to update an existing workspace secret’s metadata; a missing secret returns `404`. Personal secrets always require `value`. This operation returns metadata only; List secrets can reveal permitted workspace values marked `unredacted`. Workspace API keys return `403`; use a personal API key or scoped OAuth token. OAuth scope: `api:write`.

PUT/api/v2/secrets/{name}

Create or replace a workspace or caller-owned personal secret. New workspace secrets require workspace write access; existing ones require workspace Admin or secret Admin access. Omit value to update an existing workspace secret’s metadata; a missing secret returns 404. Personal secrets always require value. This operation returns metadata only; List secrets can reveal permitted workspace values marked unredacted. Workspace API keys return 403; use a personal API key or scoped OAuth token.

OAuth scope: api:write.

Authentication

Send a personal or workspace API key in X-API-Key. See key types and access; operations that reject workspace keys say so in their description.

Send X-API-Key in the request header.

Alternatively

Send a Sim OAuth access token in Authorization: Bearer. See OAuth authentication and scopes.

Authorization: Bearer YOUR_ACCESS_TOKEN

Required scopes: api:write

OAuth flows
json
{
  "authorizationCode": {
    "authorizationUrl": "https://www.sim.ai/api/auth/oauth2/authorize",
    "tokenUrl": "https://www.sim.ai/api/auth/oauth2/token",
    "refreshUrl": "https://www.sim.ai/api/auth/oauth2/token",
    "scopes": {
      "api:read": "Read your workspaces, workflows, files, tables, and logs",
      "api:write": "Read, create, change, run, and delete resources in your workspaces",
      "offline_access": "Stay signed in without asking again"
    }
  }
}

OAuth scope: api:write.

Path parameters

namestringRequired

Secret to create or replace.

minLength
1
maxLength
255
pattern
^[A-Za-z0-9_]+$

Request body

Required

Ownership scope and write-only value for the secret. A workspace secret may instead send description or unredacted alone, without a value.

object

Ownership scope and write-only value for the secret. A workspace secret may instead send description or unredacted alone, without a value.

5 fields
workspaceIdstringRequired

Workspace the request is authorized against. A workspace secret is written to it; a personal secret is written to the caller and is available in all of their workspaces.

minLength
1
maxLength
128
scopestringRequired

Whether the secret belongs to the workspace or to the caller. A personal secret belongs to the caller across every workspace, not to one workspace.

enum
["workspace","personal"]
valuestring

Secret value, omitted from the Set secret response. For an existing workspace secret, omit it to change only description or unredacted. Personal secrets always require a value and accept no writable metadata.

minLength
1
maxLength
65536
writeOnly
true
descriptionvalue

What the secret is for, shown to teammates. Workspace scope only — sending it for a personal secret is rejected. Omit it to leave an existing description untouched; send null or an empty string to clear one.

Schema details

Any of

Option 1string
maxLength
500
Option 2null
unredactedboolean

Opt the workspace secret out of redaction: its value then appears in plaintext in run logs, model-visible content, and files, including publicly shared log links. Workspace scope only — sending it for a personal secret is rejected. Omit it to leave the current setting untouched.

Additional properties are not allowed.

Request example 1

json
{
  "workspaceId": "a91c4b2e-6d3f-4e8a-b5c7-0d9e2f1a8c64",
  "scope": "workspace",
  "value": "YOUR_SECRET_VALUE"
}

Request example 2

json
{
  "workspaceId": "a91c4b2e-6d3f-4e8a-b5c7-0d9e2f1a8c64",
  "scope": "workspace",
  "unredacted": false
}

Responses

200

The existing secret value was replaced, or its metadata was updated in place.

object

Metadata for the created or replaced secret without its value.

1 field
dataobjectRequired

Response data.

7 fields
namestringRequired

Secret name containing only letters, numbers, and underscores.

minLength
1
maxLength
255
pattern
^[A-Za-z0-9_]+$
scopestringRequired

Whether the secret belongs to the workspace or to the caller. A personal secret belongs to the caller across every workspace, not to one workspace.

enum
["workspace","personal"]
descriptionvalueRequired

What the secret is for, as set on the workspace secret. Always null for a personal secret, which has no shared audience.

Schema details

Any of

Option 1string
Option 2null
unredactedbooleanRequired

Whether the workspace secret opts out of redaction, so its value appears in plaintext in run logs and model-visible content. Always false for a personal secret.

rolestringRequired

Caller role for the secret.

enum
["admin","member"]
createdAtstringRequired

ISO 8601 timestamp when the secret was created.

format
date-time
pattern
^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
updatedAtstringRequired

ISO 8601 timestamp when the secret was last updated.

format
date-time
pattern
^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$

Additional properties are not allowed.

Additional properties are not allowed.

Response example 1

json
{
  "data": {
    "name": "STRIPE_API_KEY",
    "scope": "workspace",
    "description": "Production billing key — rotate quarterly.",
    "unredacted": false,
    "role": "admin",
    "createdAt": "2026-06-01T09:14:00.000Z",
    "updatedAt": "2026-06-20T14:02:11.000Z"
  }
}

Response headers

X-RateLimit-Limitinteger

Maximum requests allowed in the current window.

minimum
0
maximum
9007199254740991
X-RateLimit-Remaininginteger

Requests remaining in the current window.

minimum
0
maximum
9007199254740991
X-RateLimit-Resetstring

ISO 8601 timestamp when the current rate-limit window resets.

format
date-time
pattern
^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$
Was this helpful?
Suggest an edit