# platform.settings.update

Update invoicing numbering and defaults, letterhead text, compliance reminder preferences, and the inbox AI models, with a revision check. inboxAi.reading reads each email and its attachments into a draft; inboxAi.checking is the second opinion on anything left unclear. Each takes a model, one of openai/gpt-6.1-sol (GPT-6.1 Sol), openai/gpt-6-luna (GPT-6 Luna), google/gemini-3.8-flash (Gemini 3.8 Flash), zai/glm-5.3-flash (GLM-5.3 Flash), and a low, medium or high effort; null puts that step back on the recommended GPT-6 Luna at medium effort for reading and GPT-6 Luna at medium for the second opinion.

`POST /api/v1/accounting/platform.settings.update`

Permissions: `accounting:read`, `accounting:write`, `accounting:admin` · Roles: admin · Idempotency key required · Send `expectedRevision`

MCP tool: `accounting_platform_settings_update`

## Fields

| Field | Type | Required | Notes |
| --- | --- | --- | --- |
| `expectedRevision` | integer |  | The record's current revision, from the last time you read it. If someone changed the record since, the request is refused with a conflict so you can reload and check before trying again. at most 9007199254740991; greater than 0. |
| `idempotencyKey` | string | Yes | Any unique text you generate once per intended change, so a retried request only happens once. Send it as the Idempotency-Key header instead if you prefer; if you send both they must match. 8–200 characters. |
| `invoicing` | object |  | No other fields. |
| `invoicing.numberPattern` | string |  | 3–60 characters; Matches \{N+\}. Default `"INV-{YYYY}-{NNN}"`. |
| `invoicing.nextNumber` | integer |  | 1 to 999999999. Default `1`. |
| `invoicing.defaultDueDays` | integer |  | 0 to 365. Default `30`. |
| `invoicing.defaultNotes` | string |  | at most 2000 characters. Default `""`. |
| `invoicing.senderName` | string |  | at most 200 characters. Default `""`. |
| `invoicing.senderTitle` | string |  | at most 200 characters. Default `""`. |
| `invoicing.replyTo` | string (email) or null |  |  |
| `invoicing.reviewLeadDays` | integer |  | 0 to 60. Default `3`. |
| `invoicing.showTaxNumber` | boolean |  | Default `false`. |
| `invoicing.showLogo` | boolean |  | Default `false`. |
| `invoicing.payUrl` | string (uri) or null |  | Default `null`. |
| `invoicing.wisePayLink` | string or null |  |  |
| `branding` | object |  | No other fields. |
| `branding.letterheadTagline` | string or null |  | Default `null`. |
| `compliance` | object |  | No other fields. |
| `compliance.remindersEnabled` | boolean |  | Default `true`. |
| `compliance.weeklyAccountingDigestEnabled` | boolean |  | Default `true`. |
| `compliance.monthlySubscriptionsDigestEnabled` | boolean |  | Default `false`. |
| `compliance.receiptChaseEnabled` | boolean |  | Default `true`. |
| `compliance.receiptChaseEveryDays` | 7 or 14 |  | One of: `7`, `14`. Default `7`. |
| `compliance.receiptChaseEscalate` | boolean |  | Default `true`. |
| `compliance.receiptChaseEscalateDays` | integer |  | 4 to 60. Default `14`. |
| `compliance.recipients` | array of strings (email) |  | at most 20 items; each at most 320 characters. |
| `compliance.leadDays` | array of integers |  | 1–8 items; each 0 to 120. Default `[30,14,7,3,1,0]`. |
| `compliance.overdueEveryDays` | integer |  | 1 to 30. Default `3`. |
| `compliance.digestHour` | integer |  | 0 to 23. Default `9`. |
| `compliance.timezone` | string |  | 3–60 characters. Default `"America/Toronto"`. |
| `compliance.taxPrepStartDaysAfterYearEnd` | integer |  | 0 to 180. Default `30`. |
| `compliance.disabledRules` | array of strings |  | at most 50 items; each Matches ^[a-z][a-z0-9_]{1,60}$. Default `[]`. |
| `compliance.corporateJurisdiction` | enum or null |  | One of: `federal`, `ON`, `BC`, `AB`, `QC`, `other`. Default `null`. |
| `compliance.instalments` | enum |  | One of: `none`, `monthly`, `quarterly`. Default `"none"`. |
| `compliance.payrollEnabled` | boolean |  | Default `false`. |
| `compliance.constructionServices` | boolean |  | Default `false`. |
| `compliance.annualReturnMonthDay` | string or null |  | Default `null`. |
| `compliance.employeeCount` | enum or null |  | One of: `none`, `1-24`, `25-plus`. Default `null`. |
| `compliance.postsJobsPublicly` | boolean or null |  | Default `null`. |
| `compliance.usesAiScreening` | boolean or null |  | Default `null`. |
| `inboxAi` | object |  | No other fields. |
| `inboxAi.reading` | object or null |  |  |
| `inboxAi.reading.model` | enum | Yes | One of: `openai/gpt-6.1-sol`, `openai/gpt-6-luna`, `google/gemini-3.8-flash`, `zai/glm-5.3-flash`. |
| `inboxAi.reading.effort` | enum | Yes | One of: `low`, `medium`, `high`. |
| `inboxAi.checking` | object or null |  |  |
| `inboxAi.checking.model` | enum | Yes | One of: `openai/gpt-6.1-sol`, `openai/gpt-6-luna`, `google/gemini-3.8-flash`, `zai/glm-5.3-flash`. |
| `inboxAi.checking.effort` | enum | Yes | One of: `low`, `medium`, `high`. |

## Example request

```bash
curl https://app.getoatmilk.com/api/v1/accounting/platform.settings.update \
  -H "Authorization: Bearer $OATMILK_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{}'
```

Reference page: https://app.getoatmilk.com/docs/api/platform.settings.update
