---
title: "Put Payroll Settings"
method: PUT
path: "/companies/{company_id}/payroll/settings"
tags: ["payroll"]
---

# Put Payroll Settings

`PUT /companies/{company_id}/payroll/settings`

## Request

- Base URL: `https://app.zeno-works.ch` (the document declares no server; this is the origin it was published from)
- URL: `https://app.zeno-works.ch/companies/{company_id}/payroll/settings`
- Auth: none declared

Patch semantics: an omitted key keeps its value, an explicit ``null`` clears it.

⚠️ ``exclude_unset`` is load-bearing (ZCT-518). ``ApiModel`` does not set it, so
a plain ``model_dump()`` emits **all four** account keys with ``None`` for the
ones the caller omitted, and ``update_settings`` writes every key it is handed
(``setattr(row, key, value or None)``). A partial PUT — say
``{"payroll_clearing_account_code": "2265"}``, which is exactly how the ZCT-518
reporter unblocked their tenant, and exactly what the
``payroll_clearing_unconfigured`` work item now sends people to do — therefore
wiped an explicitly configured ``salary_payable_account_code`` back to its
catalog default, silently. The SPA happened to submit all four, so only the raw
API and MCP were exposed. The non-account keys in the same body already had
keep-semantics (``DELIVERY_MODE_KEY``/``AUTO_RUN_KEY``/``QST_THIRTEENTH_KEY``/
``SALARY_PRORATION_KEY``, ``None`` = keep); this makes the four account keys agree with them.

## Path parameters

- `company_id` string, required

## Headers

- `authorization` string, nullable

## Cookies

- `access_token` string, nullable

## Request body

- PayrollSettingsPut
  - `salary_payable_account_code` string, nullable
  - `payroll_clearing_account_code` string, nullable
  - `qst_liability_account_code` string, nullable
  - `employee_receivable_account_code` string, nullable
  - `payslip_delivery_mode` 'download' | 'email': How a company delivers payslips (workflow gap #6 — H9/H11). ``download`` (default) = the accountant downloads/hands out the PDFs; ``email`` = the post handler's best-effort phase emails each rendered slip to ``gl_employee.email`` (skips without an address are surfaced, never fatal — the retry endpoint covers stragglers).
  - `payroll_auto_run_enabled` boolean, nullable
  - `qst_thirteenth_method` 'ks45_frequency' | 'swissdec_periodic': How the QST rate-determining income treats a 13th salary (F2644; plan D4). ``ks45_frequency`` (default) = KS 45 §6.3 / §6.6: an annual 13th is converted to the 360-day period it is paid for (``13th / insured days YTD × 360``) and a monthly accrual is part of the month's gross; ``swissdec_periodic`` = ELM 6.0 §10.6.1.2: the 13th is a periodic item, extrapolated with the month's other periodic pay (declared Swissdec-certified software; the Swissdec worked examples M17–M22). The two differ by up to 2,500 of rate-determining income on the M17 facts.
  - `salary_proration` 'calendar' | '30' | 'working': The day basis a derived monthly salary is prorated on (F2752). ``calendar`` (default, what the product always did) = actual calendar days (act/act: 15 of 31 days is 15/31); ``30`` = the 30/360 convention of the ELM insured days and KS 45 §6.6 (a whole month is 30 days, the 31st and 28/29 February count as the 30th: 15 of 31 days is 15/30); ``working`` = Monday-to-Friday working days of the employed window over those of the month (no holiday calendar). One company-wide choice: it prorates hire/exit months and the salary days an unpaid-leave or EO event removes.

## Response `200`

Successful Response

- PayrollSettingsOut
  - `salary_payable` PayrollSettingsAccountOut, required
    - `code` string, nullable
    - `source` string, required
    - `account_id` string, nullable
    - `resolved` boolean
  - `payroll_clearing` PayrollSettingsAccountOut, required
    - `code` string, nullable
    - `source` string, required
    - `account_id` string, nullable
    - `resolved` boolean
  - `qst_liability` PayrollSettingsAccountOut, required
    - `code` string, nullable
    - `source` string, required
    - `account_id` string, nullable
    - `resolved` boolean
  - `employee_receivable` PayrollSettingsAccountOut, required
    - `code` string, nullable
    - `source` string, required
    - `account_id` string, nullable
    - `resolved` boolean
  - `payslip_delivery_mode` 'download' | 'email', required: How a company delivers payslips (workflow gap #6 — H9/H11). ``download`` (default) = the accountant downloads/hands out the PDFs; ``email`` = the post handler's best-effort phase emails each rendered slip to ``gl_employee.email`` (skips without an address are surfaced, never fatal — the retry endpoint covers stragglers).
  - `payroll_auto_run_enabled` boolean
  - `qst_thirteenth_method` 'ks45_frequency' | 'swissdec_periodic': How the QST rate-determining income treats a 13th salary (F2644; plan D4). ``ks45_frequency`` (default) = KS 45 §6.3 / §6.6: an annual 13th is converted to the 360-day period it is paid for (``13th / insured days YTD × 360``) and a monthly accrual is part of the month's gross; ``swissdec_periodic`` = ELM 6.0 §10.6.1.2: the 13th is a periodic item, extrapolated with the month's other periodic pay (declared Swissdec-certified software; the Swissdec worked examples M17–M22). The two differ by up to 2,500 of rate-determining income on the M17 facts.
  - `salary_proration` 'calendar' | '30' | 'working': The day basis a derived monthly salary is prorated on (F2752). ``calendar`` (default, what the product always did) = actual calendar days (act/act: 15 of 31 days is 15/31); ``30`` = the 30/360 convention of the ELM insured days and KS 45 §6.6 (a whole month is 30 days, the 31st and 28/29 February count as the 30th: 15 of 31 days is 15/30); ``working`` = Monday-to-Friday working days of the employed window over those of the month (no holiday calendar). One company-wide choice: it prorates hire/exit months and the salary days an unpaid-leave or EO event removes.
  - `resolved_fiscal_year_id` string, nullable
  - `resolved_fiscal_year` integer, nullable

## Other responses

- `422`: Validation Error

---

[API](https://skmtc.dev/zeno-works/apis/zeno-api.md) · [All operations](https://skmtc.dev/zeno-works/apis/zeno-api/llms.txt) · [OpenAPI document](https://skmtc.dev/zeno-works/apis/zeno-api/revisions/1eb93dde146c?raw)
