---
title: "Choose a consumer's capabilities and modes"
method: PUT
path: "/consumers/{consumer_id}/syncs/{syncid}/capabilities"
tags: ["Syncs"]
---

# Choose a consumer's capabilities and modes

`PUT /consumers/{consumer_id}/syncs/{syncid}/capabilities`

## Request

- Base URL: `https://api.chift.eu`
- URL: `https://api.chift.eu/consumers/{consumer_id}/syncs/{syncid}/capabilities`
- Auth: HTTP bearer
- TypeScript: <https://skmtc.dev/chift/apis/chift-api/docs/consumers/:consumer_id/syncs/:syncid/capabilities/put.ts> (a function with typed inputs; its response is checked against the schema)

Replaces the consumer's choice of main capabilities and modes. Whatever they need is turned on automatically. Answers with the resulting setup and what changed. Mapping values of tables no longer needed are kept. Send `preflight: true` to get that answer without saving anything.

## Path parameters

- `consumer_id` string, uuid, required
- `syncid` string, uuid, required

## Query parameters

- `language` string, nullable: ISO 639-1 code of the language of the texts (en, fr, nl, de, es; any case), falling back to English. Without it, translation keys.

## Request body

- UpdateConsumerCapabilities
  - `selected` string[], required: Keys of the main capabilities the consumer turns on. Replaces the previous choice.
  - `modes` object: Capability key -> mode key, for the capabilities where the consumer chooses.
  - `preflight` boolean: Check the choice without saving it: the answer, or the refusal, is the one saving it would give, so a draft can be shown as it would run.

## Response `200`

Successful Response

- ConsumerCapabilitiesUpdated
  - `flowid` string, uuid, required: The sync's one flow: what enable, disable, the answers' PATCH and the executions take as {flowid}.
  - `enabled` boolean, required: Whether the sync is enabled for this consumer.
  - `capabilities` ConsumerCapabilityItem[], required: The capabilities the account offers.
    - `key` string, required: Stable key, e.g. 'spend_to_accounting.SupplierInvoices'. Send it back as is.
    - `id` string, uuid, required: The stable uuid derived from the key, as the legacy sync routes identify the same item.
    - `title` string, required: Name to show, in the requested language; its translation key without one.
    - `description` string, required: What it does, the tooltip: in the requested language, its translation key without one.
    - `kind` 'main' | 'supporting', required: 'main': the consumer chooses it. 'supporting': shown as a tooltip, turned on by what needs it.
    - `selected` boolean, required: The consumer chose it. False for one running only because another needs it (`auto_enabled_by`).
    - `effective` boolean, required: It runs: chosen or needed by something that runs, and available.
    - `auto_enabled_by` string[], required: Keys of the capabilities running because of it. It cannot be turned off while there are some.
    - `requires` string[], required: Keys of the capabilities it needs directly, whatever its mode; each mode lists what it adds. Choosing it turns them on.
    - `available` boolean, required: Whether the consumer's connections can do it. An unavailable one cannot be chosen.
    - `reason_key` string, nullable, required: Why not, as a translation key, so a client can translate it itself. Null when there is no reason.
    - `reason` string, nullable, required: Why not, in the requested language; its translation key without one. Null when there is no reason.
    - `mode` string, nullable, required: Key of the mode in use. Null when it has no modes, is unavailable, or awaits the consumer's choice.
    - `chooses_mode` boolean, required: Several modes are available, so the consumer must choose one.
    - `awaits_mode` boolean, required: Chosen or needed, but no mode is chosen yet: it, and what needs it, run once the consumer chooses.
    - `default_mode` string, nullable, required: The mode your account preselects for the consumer's choice. Null when none is set.
    - `modes` ConsumerCapabilityMode[], required: The alternative ways of doing it, each with whether the connections can do it. Empty when there is only one.
      - `key` string, required: Key of the mode.
      - `title` string, required: Name to show, in the requested language; its translation key without one.
      - `description` string, required: What it does, the tooltip: in the requested language, its translation key without one.
      - `available` boolean, required: Whether the consumer's connections can do it this way.
      - `reason_key` string, nullable, required: Why not, as a translation key, so a client can translate it itself. Null when there is no reason.
      - `reason` string, nullable, required: Why not, in the requested language; its translation key without one. Null when there is no reason.
      - `requires` string[], required: Keys of the capabilities this mode needs on top of its capability's `requires`.
      - `requires_modes` RequiredMode[], required: The modes other capabilities must run in for this one to be available, so a screen can show or hide it as the consumer picks those modes, before saving. Empty when it has none.
        - `capability` string, required: Key of the other capability.
        - `mode` string, required: Key of the mode it must run in.
  - `tables` ConsumerTable[], required: The mapping tables the running capabilities need.
    - `key` string, required: Stable key, e.g. 'spend_to_accounting.SupplierInvoices'. Send it back as is.
    - `id` string, uuid, required: The stable uuid derived from the key, as the legacy sync routes identify the same item.
    - `title` string, required: Name to show, in the requested language; its translation key without one.
    - `description` string, required: What it does, the tooltip: in the requested language, its translation key without one.
    - `used_by` string[], required: Keys of the capabilities or modes that need it.
    - `rows` string[], nullable, required: The rows in use when only some are. Null when the whole table is.
  - `questions` ConsumerQuestion[], required: The questions the running capabilities ask.
    - `key` string, required: Stable key, e.g. 'spend_to_accounting.SupplierInvoices'. Send it back as is.
    - `id` string, uuid, required: The stable uuid derived from the key, as the legacy sync routes identify the same item.
    - `title` string, required: Name to show, in the requested language; its translation key without one.
    - `description` string, required: What it does, the tooltip: in the requested language, its translation key without one.
    - `used_by` string[], required: Keys of the capabilities or modes that ask it.
    - `required` boolean, required: It has no default, so it must be answered before the sync is enabled.
    - `field` SettingField, required: Declaration of one setting: everything a client needs to render it.
      - `key` string, required
      - `type` 'date' | 'str' | 'bool' | 'int' | 'enum' | 'str_list' | 'dict', required: The input control the frontend should render for a setting.
      - `group` 'period' | 'write' | 'state' | 'observability' | 'scope', required: Non-overlapping concerns. A setting belongs to exactly one.
      - `title` string, required
      - `tooltip` string, required
      - `default` unknown
      - `options` SettingOption[]
        - `value` string, required
        - `title` string, required
      - `supported` boolean
      - `unsupported_reason` string, nullable
  - `completeness` SetupCompleteness, required: What stops the consumer sync from being enabled. All empty: it can be.
    - `missing_connections` SetupMissingItem[], required: Verticals the sync needs and the consumer has no connection to, or none chosen.
      - `key` string, required: Key of what is missing.
      - `title` string, required: Name to show, in the requested language; its translation key without one.
    - `missing_questions` SetupMissingItem[], required: Questions with no default and no answer.
      - `key` string, required: Key of what is missing.
      - `title` string, required: Name to show, in the requested language; its translation key without one.
    - `missing_tables` SetupMissingItem[], required: Mapping tables with a row that has no value.
      - `key` string, required: Key of what is missing.
      - `title` string, required: Name to show, in the requested language; its translation key without one.
    - `missing_modes` SetupMissingItem[], required: Capabilities chosen or needed, with several modes and none chosen yet.
      - `key` string, required: Key of what is missing.
      - `title` string, required: Name to show, in the requested language; its translation key without one.
  - `connections` SyncConnection[], required: Each vertical of the sync, source first: whether the consumer's connection to it is in place.
    - `vertical` string, required: One of the sync's verticals.
    - `title` string, required: Name to show, in the requested language; its translation key without one.
    - `state` 'connected' | 'missing' | 'to_choose' | 'unavailable', required: `connected`: the sync uses the connection of `integration_id`. `missing`: the consumer has no active connection of this vertical. `to_choose`: it has several (`integration_ids`) and none was chosen for this sync. `unavailable`: the integration chosen for this sync (`integration_id`) has no active connection any more, and another is never used in its place. Until one is chosen, the vertical counts as not connected.
    - `integration_id` string, nullable, required: The integration of the connection the sync uses, or the one chosen when `unavailable`. Null otherwise.
    - `integration_ids` string[], required: The integrations to choose from, when `to_choose` or `unavailable`. Send the one to use as `integrationids` when linking the consumer to the sync again, or when enabling it.
  - `latest_preview_id` string, uuid, nullable, required: The most recent preview of this consumer sync, if any.
  - `changes` CapabilityChanges, required
    - `enabled` string[], required: Keys of the capabilities that now run.
    - `disabled` string[], required: Keys of the capabilities that no longer run.
    - `tables_added` string[], required: Keys of the tables that are now needed.
    - `tables_no_longer_needed` string[], required: Keys of the tables no longer needed. Their values are kept, not deleted.

## Other responses

- `404`: Not Found
- `422`: Unprocessable Entity

## Changes

- **2026-11-03** `020884969534`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/chift/apis/chift-api/changes/consumers/:consumer_id/syncs/:syncid/capabilities/put.md)

---

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