---
title: "Update a policy"
method: PATCH
path: "/policies/{id}"
tags: ["Policies"]
---

# Update a policy

`PATCH /policies/{id}`

## Request

- Base URL: `https://www.happyscribe.com/api/v1`
- URL: `https://www.happyscribe.com/api/v1/policies/{id}`
- Auth: API key in header `Authorization`

Writes only the fields you send. Each owner takes a subset:

- **Workspace**: everything except `recording.enabled`. Needs a plan with notetaker customization.
- **Member**: everything except `recording.enabled` and `branding`.
- **Meeting**: `recording.enabled`, `recording.methods.bot.mode`, `transcription.language` and `summary.template`. A change applies to this occurrence and every later one of the series. A meeting started by a bot takes `recording.enabled: false` (stop), and, while upcoming, `transcription.language`, `summary.language`, `summary.template` and `recording.methods.bot.silence_detection.alert`; what the bot was dispatched with (`recording.methods.bot.start` and `.mode`) answers `409 not_supported`.

A field the policy does not have is refused with `422` and `unknown_field`.

Turning a meeting's recording off stops every bot of that meeting, whoever sent it: a scheduled
bot is withdrawn and one in the call leaves, keeping what it recorded. While a bot is still joining
the call the write answers `503`; retry a few seconds later. A live meeting only takes
`recording.enabled: false`.

Upcoming meetings are re-evaluated and a `meeting.updated` webhook is sent for each one that changes.

## Request body

- PolicyUpdate
  - `policy` Policy, required: What an object prefers for the meetings it covers. Every group is optional: an object shows only what it sets. Which fields each owner accepts is listed on [Update a policy](#operation/updatePolicy).
    - `recording` object: Which meetings get recorded, and how.
      - `scope` Scope[]: Which meetings get recorded (workspace, member). `[]` records none.
      - `enabled` boolean: Meeting only. Record this meeting or not.
      - `methods` object: How meetings are recorded.
        - `bot` object: The notetaker bot that joins the call.
          - `start` 'on_join' | 'on_command': When the bot starts recording. - `on_join`: as soon as it joins the call. - `on_command`: it joins paused, until someone types `!resume` in the chat.
          - `mode` 'audio_and_video' | 'audio_only': What the bot records. - `audio_and_video`: audio and video. - `audio_only`: audio only.
          - `silence_detection` object: What the bot does when nobody speaks for a while.
            - `alert` boolean: Whether the bot posts a chat message after a long silence.
    - `transcription` object: How the recording is transcribed.
      - `language` string: A language tag, `auto` or `multi`. See [Languages](/api-reference/languages).
    - `summary` object: How the summary is written.
      - `template` string, nullable: A built-in template's slug, such as `discovery_call`, or a custom template's `tpl_` id. Integer custom template ids are still accepted.
      - `language` string, nullable: A language tag (see [Languages](/api-reference/languages)); `null` follows the transcript's language.
    - `branding` object: How the notetaker is branded.
      - `brand_kit_id` string, nullable: Workspace only. The brand kit the workspace's bots use, beginning with `brk_`; `null` uses HappyScribe's default branding. The same link as the kit's `workspace_ids`. The kit must be used by a workspace the key belongs to. On a meeting's `effective_policy`, the kit its bot is sent with, `null` when the workspace's plan does not include notetaker customization.

## Response `200`

The updated policy.

- PolicyObject
  - `object` 'policy': Always `policy`.
  - `owner` object: Whose policy this is.
    - `type` 'workspace' | 'member' | 'meeting': Whose policy this is. - `workspace`: the workspace's defaults. - `member`: one member's own rules. - `meeting`: overrides for one meeting and the later occurrences of its series.
    - `id` string: A `wks_`, `mem_` or `mtg_` id, matching `type`.
  - `policy` Policy: What an object prefers for the meetings it covers. Every group is optional: an object shows only what it sets. Which fields each owner accepts is listed on [Update a policy](#operation/updatePolicy).
    - `recording` object: Which meetings get recorded, and how.
      - `scope` Scope[]: Which meetings get recorded (workspace, member). `[]` records none.
      - `enabled` boolean: Meeting only. Record this meeting or not.
      - `methods` object: How meetings are recorded.
        - `bot` object: The notetaker bot that joins the call.
          - `start` 'on_join' | 'on_command': When the bot starts recording. - `on_join`: as soon as it joins the call. - `on_command`: it joins paused, until someone types `!resume` in the chat.
          - `mode` 'audio_and_video' | 'audio_only': What the bot records. - `audio_and_video`: audio and video. - `audio_only`: audio only.
          - `silence_detection` object: What the bot does when nobody speaks for a while.
            - `alert` boolean: Whether the bot posts a chat message after a long silence.
    - `transcription` object: How the recording is transcribed.
      - `language` string: A language tag, `auto` or `multi`. See [Languages](/api-reference/languages).
    - `summary` object: How the summary is written.
      - `template` string, nullable: A built-in template's slug, such as `discovery_call`, or a custom template's `tpl_` id. Integer custom template ids are still accepted.
      - `language` string, nullable: A language tag (see [Languages](/api-reference/languages)); `null` follows the transcript's language.
    - `branding` object: How the notetaker is branded.
      - `brand_kit_id` string, nullable: Workspace only. The brand kit the workspace's bots use, beginning with `brk_`; `null` uses HappyScribe's default branding. The same link as the kit's `workspace_ids`. The kit must be used by a workspace the key belongs to. On a meeting's `effective_policy`, the kit its bot is sent with, `null` when the workspace's plan does not include notetaker customization.

## Other responses

- `401`: Missing or invalid API key, or the key is not an owner or admin of the workspace.
- `403`: A workspace policy write on a plan without notetaker customization (`plan_upgrade_required`).
- `404`: Nothing with that id in a workspace the key belongs to.
- `409`: The meeting is over (`meeting_not_upcoming`), live and only stoppable (`meeting_live`), started by a bot or no longer in any calendar of the workspace (`no_calendar_event`, `not_supported`), or attended by another workspace too (`shared_meeting`): its mode, language, template and folder belong to the occurrence both workspaces share, so only `recording.enabled` can be changed for this workspace.
- `422`: An invalid value, a field this owner does not take (`not_supported`), a combination HappyScribe cannot store yet (`not_supported`), a scope of the wrong kind (`wrong_scope_kind`), or summary emails for a member created through the API (`not_available`).
- `503`: The bot provider refused or failed (`provider_unavailable`); the message says what changed. A bot still joining the call refuses the whole write, and nothing is changed. Member calendars and bots are changed one by one: what was done stays done, and a retry finishes the rest (a scheduled bot withdrawn before the failure is sent again).

---

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