Skip to content

Update Config

PUT
/config
curl --request PUT \
--url https://example.com/config \
--header 'Content-Type: application/json' \
--data '{ "ai_api_key": "example", "ai_base_url": "example", "ai_model": "example", "ai_provider": "none", "audit_retention_days": 1, "grafana_url": "example", "oidc_auto_provision": true, "oidc_client_id": "example", "oidc_client_secret": "example", "oidc_issuer": "example", "price_api_key": "example", "price_provider": "none", "price_stale_days": 1, "privacy_amount": true, "privacy_purchase": true, "session_idle_hours": 1, "session_ttl_days": 1, "sync_schedule": { "hour": 1, "minute": 1, "preset": "daily" }, "transfer_auto_link": true }'
Media typeapplication/json
ConfigUpdate

Partial update: absent fields are untouched; null is accepted only for NULLABLE_KEYS (reset a key to its env default with DELETE).

object
ai_api_key
Any of:
string
ai_base_url
Any of:
string
ai_model
Any of:
string
ai_provider
Any of:
string
Allowed values: none openai anthropic
audit_retention_days
Any of:
integer
>= 7 <= 3650
grafana_url
Any of:
string
oidc_auto_provision
Any of:
boolean
oidc_client_id
Any of:
string
oidc_client_secret
Any of:
string
oidc_issuer
Any of:
string
price_api_key
Any of:
string
price_provider
Any of:
string
Allowed values: none tiingo
price_stale_days
Any of:
integer
>= 1 <= 365
privacy_amount
Any of:
boolean
privacy_purchase
Any of:
boolean
session_idle_hours
Any of:
integer
>= 1 <= 720
session_ttl_days
Any of:
integer
>= 1 <= 365
sync_schedule
Any of:
SyncSchedule

User-facing SimpleFIN sync schedule (UTC).

Presets rather than raw cron. hour/minute apply to daily only; the interval presets are anchored so every choice lands a fresh sync just before the 06:45 UTC matching job, and hourly (24 runs/day) sits exactly at the SimpleFIN Bridge budget — the per-connection fetch guard fails soft beyond it.

object
hour
Any of:
integer
<= 23
minute
Any of:
integer
<= 59
preset
Preset
string
default: daily
Allowed values: daily every_12h every_6h hourly
transfer_auto_link
Any of:
boolean

Successful Response

Media typeapplication/json
ConfigOut
object
ai_api_key_set
required
Ai Api Key Set
boolean
encryption
required
EncryptionStatus

Read-only posture block (issue #123). Field-level Fernet encryption is mandatory (startup fails closed without a working key), so this mostly attests rather than warns. Since #137 the narrative layer (payee names, descriptions, memos, schedule names, audit/event payloads) is encrypted too; only the numeric skeleton (amounts, dates, statuses, ltree paths, ids) and the readmodel v2 views over it stay plaintext by design (decision 36). Storage-level encryption remains a deployment concern the app can’t attest.

object
canary_ok
required
Canary Ok
boolean
encrypted_scopes
required
Encrypted Scopes
Array<string>
field_encryption_active
required
Field Encryption Active
boolean
key_acknowledged_at
required
Any of:
string format: date-time
key_fingerprint
required
Key Fingerprint
string
oidc_client_secret_set
required
Oidc Client Secret Set
boolean
overridden
required
Overridden
Array<string>
price_api_key_set
required
Price Api Key Set
boolean
sync_reschedule_live
required
Sync Reschedule Live
boolean
values
required
ConfigValues
object
ai_base_url
required
Ai Base Url
string
ai_model
required
Any of:
string
ai_provider
required
Ai Provider
string
audit_retention_days
required
Audit Retention Days
integer
grafana_url
required
Any of:
string
oidc_auto_provision
required
Oidc Auto Provision
boolean
oidc_client_id
required
Any of:
string
oidc_enabled
required
Oidc Enabled
boolean
oidc_issuer
required
Any of:
string
price_provider
required
Price Provider
string
price_stale_days
required
Price Stale Days
integer
privacy_amount
required
Privacy Amount
boolean
privacy_purchase
required
Privacy Purchase
boolean
session_idle_hours
required
Session Idle Hours
integer
session_ttl_days
required
Session Ttl Days
integer
sync_schedule
required
SyncSchedule

User-facing SimpleFIN sync schedule (UTC).

Presets rather than raw cron. hour/minute apply to daily only; the interval presets are anchored so every choice lands a fresh sync just before the 06:45 UTC matching job, and hourly (24 runs/day) sits exactly at the SimpleFIN Bridge budget — the per-connection fetch guard fails soft beyond it.

object
hour
Any of:
integer
<= 23
minute
Any of:
integer
<= 59
preset
Preset
string
default: daily
Allowed values: daily every_12h every_6h hourly
transfer_auto_link
required
Transfer Auto Link
boolean

Example

{
"values": {
"sync_schedule": {
"preset": "daily"
}
}
}

Validation Error

Media typeapplication/json
HTTPValidationError
object
detail
Detail
Array<object>
ValidationError
object
ctx
Context
object
input
Input
loc
required
Location
Array
msg
required
Message
string
type
required
Error Type
string

Example generated

{
"detail": [
{
"ctx": {},
"input": "example",
"loc": [
"example"
],
"msg": "example",
"type": "example"
}
]
}