Skip to main content
Instance settings are a singleton, instance-global key/value store (the app_settings table). Reads (List, Get) are open to MANAGER and above; writes (Put, Delete) require OWNER or ADMIN. Sensitive-value redaction. Values under these key patterns always read back as ***, even on the same request that set them (write-only on read):
  • smtp.password*
  • oauth.*.client_secret
  • webhook.*.secret
Protected keys. Bootstrap markers cannot be deleted — DELETE returns 403 (with application/problem+json) for:
  • instance.bootstrap_at
  • instance.first_user_id
  • schema.version

List Settings

Returns every setting row, ordered by key ascending. Sensitive values are redacted. Auth: OWNER, ADMIN, or MANAGER role (create tier) Response: 200 OK

Response Fields


Get Setting

Returns one key/value pair, redacting the value if sensitive. Auth: OWNER, ADMIN, or MANAGER role Response: 200 OK — a single setting object (same shape as a List item).

Set Setting

Upserts a value for key. An empty string is a valid value (e.g. clearing a banner); only an absent value field is rejected. Auth: OWNER or ADMIN role (manage tier) Request Body:
Response: 200 OK — the stored row, with redaction applied if the key is sensitive.
WebSocket event: instance_setting.updated

Delete Setting

Removes a key. Protected bootstrap markers cannot be deleted — the guard fires before the delete, so a 403 is returned even if the row does not exist (a probing client cannot tell whether the marker was ever set). Auth: OWNER or ADMIN role Response: 204 No Content WebSocket event: instance_setting.deleted