# Write a different config to each of many patients

Canonical page: https://docs.ovok.com/signals/standalone/api/patient-config/write-a-different-config-to-each-of-many-patients

{/* Generated from the API Explorer document by scripts/generate-signals-api-pages.mjs. Edit ovok-core, not this page. */}


# Write a different config to each of many patients [#write-a-different-config-to-each-of-many-patients]

| Method | Path |
| --- | --- |
| `POST` | `/v1/signals/api/patient/config/batch` |

<Availability route="POST /v1/signals/api/patient/config/batch" />

The per-patient form, each entry with its own triggers, flags, `metadata` and `resolvedAt`. `results[]` has v1's `{id, matched, modified}` per entry; `staleIgnored` and `misses` are additions.

### Through ovok [#through-ovok]

- **Who can call it:** Manager apps, and users whose access policy grants the capabilities.
- **Capabilities, all required:** `signals_config:update`, `signals_silence:update`. Project admins have every capability; client applications get no admin bypass.
- A patient stamped with another project is refused.
- If your access covers only some patients (anyone but project admins, manager or submitter apps, and anyone whose Patient access has no criteria), every patient the body names must be one you can update. A patient is named by its Signals id, or by its Medplum Patient id where Signals takes a `refId`; ovok asks Signals which patient a Signals id is.

## Request [#request]

### Body [#body]

Required. Schema `V1BatchConfigDto`.

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `patients` | array of object | Yes | — |
| `patients[].id` | string | Yes | Signals patient id, or the caller's refId. |
| `patients[].triggers` | array of object | No | — |
| `patients[].metadata` | object | No | Labels for this patient, merged not replaced. Whatever key the notification feed is queried by must appear here, or the patient is invisible to it. |
| `patients[].resolvedAt` | string | No | ISO-8601 instant at which this entry's configuration was COMPUTED — not when it was sent. Per entry, because one batch can mix a fresh individual save with an older org fan-out slice. A push carrying one is ignored when the patient already holds a configuration resolved strictly later; omitting it applies the entry unconditionally. |
| `patients[].alertIfEmpty` | boolean | No | — |
| `patients[].alertIfNote` | boolean | No | — |
| `patients[].alertInactiveDays` | number | No | — |

## Responses [#responses]

| Status | Meaning |
| --- | --- |
| `200` | Match and modify totals, per-patient results, and the ids that missed. |
| `400` | The query carries a raw `#`, or more than 200 parameters. |
| `401` | Your ovok access token, or your client id and secret, are missing or invalid. |
| `403` | ovok refused the call: you lack a capability this route needs, or your session has no project, or a patient is stamped with another project, or your access covers only some patients and the call names none, or you can read a patient the call names but not update it. From Signals: Authenticated, but the client's role does not permit this, or it is not attached to the patient. |
| `404` | A patient the call names is not one you can read. |
| `409` | Your project has no Signals tenant of its own (`SIGNALS_TENANT_NOT_OWN`), or it is moving to another one. |
| `415` | The body is not JSON. |
| `422` | A patient id is not 1 to 64 letters, digits, `.`, `_`, `~` or `-`. More than 100 patients are named. A patient is named by something other than a string. From Signals: The payload failed validation. |
| `429` | Too many requests. Retry after the seconds in `Retry-After`. |
| `500` | ovok hit an unexpected fault, such as your project having no Signals submitter. |
| `502` | Signals answered with something ovok couldn't use, or refused ovok's own credential. |
| `503` | Signals is unavailable. Retry after the seconds in `Retry-After`. |
| `504` | Signals did not answer in time. |

## Example [#example]

```bash
curl --request POST 'https://api.sandbox.ovok.com/v1/signals/api/patient/config/batch' \
  --user "${OVOK_CLIENT_ID}:${OVOK_CLIENT_SECRET}" \
  --header 'Content-Type: application/json' \
  --data @body.json
```
