---
title: "Update a profile's settings"
method: PUT
path: "/profiles/{id}"
tags: ["Profiles"]
---

# Update a profile's settings

`PUT /profiles/{id}`

## Request

- Base URL: `https://api.lumabill.ch/v1`
- URL: `https://api.lumabill.ch/v1/profiles/{id}`
- Auth: HTTP bearer

Partial update: only the fields sent change. Company and address fields feed the sender block of new documents; the `*NumberPrefix` and `*Count` fields drive numbering (`count` is the last number handed out). `baseCurrency` cannot change once journal entries exist (400). A key pinned to another profile, or a request scoped via `X-Profile-Id` to another profile, gets 404. Permission `profiles.update`; needs a read-write key.

## Request body

- ProfileUpdate: Partial update for PUT /profiles/{id}. Every property is optional; anything omitted stays as is. Same keys as `Profile` minus the read-only ones (`id`, `isDefault`, `createdAt`, `updatedAt`).
  - `companyName` string
  - `street` string
  - `addressLine` string: Second address line
  - `zip` string
  - `city` string
  - `countryCode` string
  - `email` string
  - `phone` string
  - `contactPerson` string
  - `uid` string
  - `vatRegistered` boolean
  - `defaultTaxRate` number
  - `paymentDeadlineDays` integer
  - `defaultCurrency` 'CHF' | 'EUR' | 'USD' | 'GBP' | 'JPY' | 'CAD' | 'AUD' | 'SEK' | 'NOK' | 'DKK' | 'HUF': ISO 4217 code of a currency the API converts (ESTV/BAZG rates). The same list applies to every currency field of the API.
  - `baseCurrency` 'CHF' | 'EUR' | 'USD' | 'GBP' | 'JPY' | 'CAD' | 'AUD' | 'SEK' | 'NOK' | 'DKK' | 'HUF': ISO 4217 code of a currency the API converts (ESTV/BAZG rates). The same list applies to every currency field of the API.
  - `defaultLanguage` 'de' | 'fr' | 'it' | 'en'
  - `defaultInvoiceFooter` string
  - `invoiceNumberPrefix` string
  - `invoiceCount` integer
  - `offerNumberPrefix` string
  - `offerCount` integer
  - `creditNotePrefix` string
  - `creditNoteCount` integer
  - `clientNumberPrefix` string
  - `clientCount` integer
  - `productNumberPrefix` string
  - `productCount` integer
  - `defaultRevenueAccountCode` string
  - `roundTotalTo` number
  - `hideZeroTax` boolean
  - `logoUrl` string
  - `currencyDefaults` object
  - `fxGainAccountId` string, uuid, nullable: An active income / expense account of this profile in the base currency (400 INVALID_FX_ACCOUNT); null = 6960 Kursdifferenzen
  - `fxLossAccountId` string, uuid, nullable: Same rules as fxGainAccountId, for exchange losses
  - `fxValuationPolicy` 'stichtag' | 'niederstwert': 400 INVALID_FX_VALUATION_POLICY for any other value
  - `fxVatRateMethod` object, nullable: Replaces the stored map; null clears it (daily everywhere). Keys YYYY, values daily / monthly (400 INVALID_FX_VAT_RATE_METHOD). Art. 45 Abs. 5 MWSTV: the method in force can only change for a year without foreign-currency documents yet, else 409 FX_VAT_RATE_METHOD_LOCKED with `years`.

## Response `200`

The updated profile

- Profile: camelCase, as the API returns it (the earlier snake_case description of this schema never matched the response). Read endpoints also merge the account's subscription fields (plan, status) into the object.
  - `id` string, uuid, required
  - `isDefault` boolean
  - `companyName` string, required
  - `street` string, nullable
  - `zip` string, nullable
  - `city` string, nullable
  - `countryCode` string, nullable
  - `email` string, nullable
  - `phone` string, nullable
  - `contactPerson` string, nullable
  - `iban` string, nullable: IBAN of the default currency slot in `currencyDefaults`
  - `currencyDefaults` object, nullable: Per-currency IBAN, payment template and QR preference, keyed by currency code
  - `logoUrl` string, nullable
  - `uid` string, nullable
  - `vatRegistered` boolean
  - `vatMethod` string, nullable
  - `defaultTaxRate` number, double
  - `defaultCurrency` 'CHF' | 'EUR' | 'USD' | 'GBP' | 'JPY' | 'CAD' | 'AUD' | 'SEK' | 'NOK' | 'DKK' | 'HUF': ISO 4217 code of a currency the API converts (ESTV/BAZG rates). The same list applies to every currency field of the API.
  - `baseCurrency` 'CHF' | 'EUR' | 'USD' | 'GBP' | 'JPY' | 'CAD' | 'AUD' | 'SEK' | 'NOK' | 'DKK' | 'HUF': ISO 4217 code of a currency the API converts (ESTV/BAZG rates). The same list applies to every currency field of the API.
  - `defaultLanguage` string
  - `paymentDeadlineDays` integer
  - `defaultInvoiceFooter` string, nullable
  - `invoiceNumberPrefix` string, nullable
  - `invoiceCount` integer: Last invoice number handed out; the next invoice gets count + 1
  - `offerNumberPrefix` string, nullable
  - `offerCount` integer
  - `creditNotePrefix` string, nullable
  - `creditNoteCount` integer
  - `clientNumberPrefix` string, nullable
  - `clientCount` integer
  - `productNumberPrefix` string, nullable
  - `productCount` integer
  - `defaultRevenueAccountCode` string, nullable
  - `roundTotalTo` number, nullable
  - `hideZeroTax` boolean
  - `fxGainAccountId` string, uuid, nullable: FX result account for exchange gains; null = 6960 Kursdifferenzen
  - `fxLossAccountId` string, uuid, nullable: FX result account for exchange losses; null = 6960 Kursdifferenzen
  - `fxValuationPolicy` 'stichtag' | 'niederstwert': Default policy of the year-end FX revaluation
  - `fxVatRateMethod` object: MWST exchange rate method by the first calendar year it applies: `daily` (ESTV/BAZG Tageskurs, the default) or `monthly` (Monatsmittelkurs). The entry with the greatest year up to a document's year wins.
  - `bookkeepingMode` 'simple' | 'double'
  - `createdAt` string, date-time, required
  - `updatedAt` string, date-time

## Other responses

- `400`: Validation error
- `401`: Invalid or missing API key
- `403`: Subscription required or read-only key on a write endpoint
- `404`: Resource not found
- `429`: Rate limit exceeded
- `500`: Internal server error

---

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