Skip to content

Update Desk Org Settings

PUT
/desk/org-settings

Update org-level desk settings. PARTIAL - unset fields are untouched.

Requires settings:write, declared on this route because the app’s own gate is a Depends-defaulted PARAMETER of the handler and a direct call resolves nothing.

THIS IS THE ORG’S ON SWITCH, AND ITS SPEND CAPS. Saving here registers the org on the desk worker’s poll list - and saving every decision off unregisters it - so this one call starts or stops the desk producing work for the whole organisation. It also carries max_auto_account_plans_per_day, max_account_replans_per_day and max_skill_plans_per_day, which are daily caps on CHARGED model calls, and desk_acts_on_signals, desk_drafts_with_ai and stalled_deal_send_email, which let the desk act and email on its own. A plain write would make raising an org’s spend cap the same grant as renaming a record.

400 with the reason on anything the settings validator refuses, including an empty body - “no settings provided” is an error here rather than a silent no-op.

Authorizations

Parameters

Header Parameters

X-Target-Org-Id
Any of:
string

Request Body required

Org-level desk settings. PARTIAL - an unset field is left untouched.

Mirrors desk.interfaces.fastapi.dtos.DeskOrgSettingsUpdate field for field, pinned by test, because it is constructed inside the proxy.

THREE KINDS OF FIELD LIVE HERE AND THEY ARE NOT EQUALLY QUIET

Most are thresholds and ids. But max_auto_account_plans_per_day, max_account_replans_per_day, max_skill_plans_per_day and max_ai_reads_per_day are the org’s DAILY SPEND CAPS on charged model calls, and desk_acts_on_signals, desk_drafts_with_ai, desk_ai_card_reads, desk_writes_deal_plans, reps_may_fire_workflows and stalled_deal_send_email are the switches that let the desk act - and email - on its own. That is why this operation is not tiered a plain write; see the router docstring.

Every value is validated by the app’s own validated_payload() and save_desk_org_settings, which answer 400 with the reason. This surface does not second-guess either.

object
contact_update_planned_deals_only
Any of:
boolean
daily_action_target
Any of:
integer
<= 200
desk_acts_on_signals
Any of:
boolean
desk_ai_card_reads
Any of:
boolean
desk_drafts_with_ai
Any of:
boolean
desk_escalates_to_managers
Any of:
boolean
desk_keeps_crm_tidy
Any of:
boolean
desk_writes_deal_plans
Any of:
boolean
enrichment_win_fields
Any of:
Array<string>
<= 9 items
expected_version
Any of:
string
<= 64 characters
fallback_owner_emails
Any of:
Array<string>
<= 20 items
lead_sla_minutes
Any of:
integer
<= 240
max_account_replans_per_day
Any of:
integer
<= 100
max_ai_reads_per_day
Any of:
integer
<= 500
max_auto_account_plans_per_day
Any of:
integer
<= 100
max_cards_per_generator_per_day
Any of:
integer
>= 1 <= 500
max_skill_plans_per_day
Any of:
integer
<= 100
no_reply_channels
Any of:
Array<string>
<= 2 items
no_reply_threshold_days
Any of:
integer
>= 1 <= 60
overdue_self_task_enabled
Any of:
boolean
overdue_task_max_age_days
Any of:
integer
<= 365
pipeline_target_quarterly
Any of:
integer
plan_required_stage_ids
Any of:
Array<string>
<= 20 items
reps_may_fire_workflows
Any of:
boolean
sdr_committee_max
Any of:
integer
>= 1 <= 25
sdr_committee_min
Any of:
integer
>= 1 <= 25
signal_policies
Any of:
object
key
additional properties

Per-signal policy override. Mirrors the app’s DeskSignalPolicyUpdate.

Open (extra="allow") rather than pinned: this nests inside a JSONB settings blob the desk extends per signal family, and a closed mirror would reject a key the app has just learned to read.

object
key
additional properties
any
signals_enabled
Any of:
object
key
additional properties
boolean
stalled_deal_approve_after_days
Any of:
integer
>= 1 <= 60
stalled_deal_enabled
Any of:
boolean
stalled_deal_fallback_manager_user_id
Any of:
string
<= 320 characters
stalled_deal_manager_user_id
Any of:
string
<= 320 characters
stalled_deal_min_amount
Any of:
integer
stalled_deal_min_deal_age_days
Any of:
integer
<= 365
stalled_deal_reassign_to_user_id
Any of:
string
<= 320 characters
stalled_deal_reminder_after_hours
Any of:
integer
>= 1 <= 168
stalled_deal_require_activity_evidence
Any of:
boolean
stalled_deal_send_email
Any of:
boolean
stalled_deal_skip_crm_synced_transfer
Any of:
boolean
stalled_deal_stage_ids
Any of:
Array<string>
<= 200 items
stalled_deal_undo_window_minutes
Any of:
integer
<= 1440
stalled_deal_warn_after_days
Any of:
integer
>= 1 <= 60

Responses

200

Successful Response

object
data
required

An open envelope for one desk object.

Open on purpose - see the module docstring. A rebuilder gets every field the desk returns, including ones added after this contract version.

object
key
additional properties
any
pagination
Any of:
object
has_next
required

Whether there are more pages

boolean
limit
required

Items per page

integer
next_cursor
Any of:
string
notes
Any of:
Array<string>
page
required

Current page number (1-indexed)

integer
total
required

Total number of items

integer
total_available
Any of:
integer
total_is_lower_bound
Any of:
boolean

422

Validation Error

object
detail
Array<object>
object
loc
required
Array
msg
required
string
type
required
string