Update Setting
PUT/api/v2/settings/:slug
Updates a single setting by slug. Body shape varies per slug — for simple settings the body is {"value": ...}; for grouped settings (e.g. purchase-order, forecasting, general) the body is a flat object of allowed keys.
settings:writeGrant this scope to your token under Settings → Developer → Personal Access Tokens.
Slug purchase-order accepts:
cc_outgoing_email(string|null, max 500) — comma-separated CC list applied to outgoing PO emails.
Slug general accepts (validated keys):
weight_unit(string:lb|g|kg|oz) anddimension_unit(string:in|cm|mm) — the units new products start with.connectivity_alert_sound_enabled(boolean) — play a repeating audio alert on the device when the app loses connection to the server, and a confirmation tone when restored. Non-boolean values are rejected with 422.stranded_order_minimum_age_days(integer, 0-90) — whole business days (Mon-Fri; weekends do not count) an order must go without producing a fulfillment order before the "Stuck, Never Dispatched" dashboard tile counts it as stranded.0disables the floor; values outside 0-90 are rejected with 422.
Slug packing-slip-rules accepts (every field optional; an empty list turns the rule off):
suppressed_line_descriptions(array of strings, each max 255) — line descriptions to leave off the packing slip entirely, such as shipping protection or insurance lines a warehouse cannot pick. Matched case-insensitively against the full line description.highlighted_shipping_methods(object of keyword => colour name, each value max 32 chars) — when the order's shipping method contains the keyword, the shipping method prints highlighted. The value must be one ofblue,green,purple,orange,red; anything else is rejected with 422. It is a colour name, never CSS.highlighted_address_keywords(array of strings, each max 255) — when the shipping address contains one of these, the name and address block print highlighted.brand_sizing_notes(object of brand name => note, each value max 255) — note printed under that brand's lines. Brand names are matched case-insensitively.
Authentication: Requires Bearer token.
Requires permission: settings.update
Slug inventory accepts the inventory-debt controls:
-
negative_inventory_policy(string:block|warn|allow) — whether a sale may ship when it would take a warehouse below zero on hand.blockis the default and refuses the shipment;warnallows it once acknowledged with a reason;allowrecords it silently. Anything other thanblockrequires an Inventory Debt Clearing account to be mapped first, otherwise the request is refused with 422 — the shipment would otherwise succeed while its journal could not be built. This policy governs shipments a PERSON chooses to make. A shipment already reported by a sales channel is not governed by it at all: the goods have left, so the units SKU cannot cover are always recorded as inventory debt regardless of this setting — including underblock. Serial-tracked and lot-tracked products are the exception and are never recorded as debt, because SKU cannot owe a serial it never held; those surface for manual reconciliation instead. -
negative_inventory_applies_to(array ofsale|transfer|manufacturing|vendor_return) — which operations the policy covers. Counts and adjustments can never be included. Like the policy itself this scopes operator-initiated work only; a shipment already reported by a sales channel is recorded as debt even when its operation is not listed here, because the goods have gone either way. -
debt_cost_estimate_chain(array, min 1, oflast_purchase_price|average_cost|product_default_cost|zero) — the ordered list of bases tried until one yields a cost above zero. The first entry is the preferred basis.zerostops the search, so entries after it are never consulted. -
debt_requires_reason(boolean) — require a reason when acknowledging a shipment below zero. -
block_period_close_with_debt(boolean) — make outstanding debt block the month-end close rather than warn.
Slug product accepts:
days_of_sales_history(integer, 1-365) — days of sales history used for daily average consumption.show_barcodes_on_lines(boolean, defaulttrue) — show each product's barcode on sales order, purchase order and sales credit lines. Non-boolean values are rejected with 422.
Slug warehouse accepts the transfer numbering defaults:
transfer_prefix(string|null, max 20) — prefix for new transfer numbers.transfer_num_of_digits(integer, 0-10) — zero-padded digits after the prefix. Values outside 0-10 are rejected with 422.transfer_shipping_method_id(integer|null) — shipping method new transfers start with.
Slug pos accepts the register toggles:
enabled(boolean) — turn the point-of-sale register on.require_customer(boolean) — every sale must have a customer; checkout without one is rejected with 422.auto_print_receipt(boolean) — open the printable receipt when a sale completes.auto_show_new_products_in_register(boolean, defaulttrue) — new products appear on the register's product grid.payment_processor(string:square|stripe) andsquare_location_id(string|null, max 64).
Serial format. For inventory-tracking, default_serial_format must include a sequence token, {seq} or {seq:N}, so every generated serial is different. A format without one fails with 422 on default_serial_format.
For general: timezone must be an IANA-style zone name (for example America/New_York); anything else is a 422. For accounting: Custom close checklist items (close_custom_checklist_items) must have distinct keys; keys that differ only in case or punctuation (for example "Freight" and "freight") are a 422 on the second item.
Request
Responses
- 200
- 401
- 403
- 404
- 422
- 429
OK
Unauthenticated — the bearer token is missing, revoked, expired, or malformed. Never retry automatically; fix the credential. See the Errors guide.
Forbidden — the token lacks a required scope, the endpoint is not available to API tokens, or the user behind the token lacks the permission. A human must adjust the token scopes or user permissions; do not retry.
Not found — no record with the given identifier (or the route does not exist). Verify the ID before retrying.
Unprocessable Entity
Rate limited — platform limit is 1,000 requests/min; individual tokens may carry lower limits. Honor the Retry-After header before retrying. See the Rate Limits guide.