# Update a follow-up policy

`PATCH https://api.parasend.com/v1/reminder_policies/{id}`

Source: https://parasend.com/docs/api/follow-up-policies/update

Authentication: `Authorization: Bearer <API key>` (a `ps_test_` key in test mode, `ps_live_` in live mode).

Changes a follow-up policy. An archived policy answers 409 `policy_archived`. Changing the steps of `rpol_default` or `rpol_debt_collection` makes your organisation's own version of it, under the same ID, and `customized` becomes true; their names stay Parasend's. `rpol_none` takes no steps (403 `system_policy_immutable`). Any of Parasend's policies can be made your account default.

## Path parameters

- `id` (string, required): The policy's ID.

## Body (application/json)

- `name` (string, required): Your name for the policy: 1–100 characters, without control characters; leading and trailing spaces are trimmed.
- `steps` (array of object, required)
  - `steps[].after_days` (integer, required): Days after the first notice when the step is due: a whole number from 1 to 365, never smaller than the step before it. The reminder goes within the send window and at least 24 hours after the delivery's last message.
  - `steps[].channel` (string, required): How the step's reminder goes: `email` or `sms`. A step whose channel the recipient has no contact for is skipped. `alternate_email` and `paper` are refused with `policy_step_invalid` until they are available. One of: `email`, `sms`, `alternate_email`, `paper`.
  - `steps[].conditions` (array of string, optional): What must all hold for the step to go, else it is skipped: `not_delivered` (always included, listed or not); `email_not_opened`, no e-mail to the recipient has been opened (a hint, not proof); `email_bounced`, an e-mail to the recipient bounced or failed. One of: `not_delivered`, `email_not_opened`, `email_bounced`.
  - `steps[].requires_approval` (boolean · nullable, optional): Paper defaults to approval-required.
  - `steps[].message` (object, optional): The wording a follow-up step's reminder sends. Left out: Parasend's standard reminder. `preset` picks Parasend's wording; `custom` holds your own, by language (Plan 1–3 and Enterprise). A field or language left out comes from the preset.
    - `steps[].message.preset` (string, optional): `standard` is the usual reminder; `firmer` and `final` are Parasend's stronger wordings. One of: `standard`, `firmer`, `final`. Default: `"standard"`.
    - `steps[].message.custom` (object, optional): Your own wording, by language (`is`, `en`); a field or a language left out comes from `preset`. Needs Plan 1–3 or Enterprise; otherwise refused with `theme_knob_plan_gated`.
      - `steps[].message.custom.is` (object, optional): Plain text. An e-mail step takes `subject`, `heading` and `text`; an SMS step `text` only. Variables: {{recipient.name}}, {{recipient.first_name}}, {{sender.name}}, {{delivery.title}}, {{delivery.sent_on}}, {{delivery.expires_on}}, {{files.count}}; an SMS only the two dates. No links, e-mail addresses or phone numbers. An e-mail may hold the gender word {{recipient.gender: male | female | other}}.
      - `steps[].message.custom.en` (object, optional): Plain text. An e-mail step takes `subject`, `heading` and `text`; an SMS step `text` only. Variables: {{recipient.name}}, {{recipient.first_name}}, {{sender.name}}, {{delivery.title}}, {{delivery.sent_on}}, {{delivery.expires_on}}, {{files.count}}; an SMS only the two dates. No links, e-mail addresses or phone numbers. An e-mail may hold the gender word {{recipient.gender: male | female | other}}.
    - `steps[].message.source` (object, optional): The saved wording and version this step's wording was loaded from. A record only: the step keeps its own copy. Not on a saved wording's own message.
      - `steps[].message.source.wording` (string, required)
      - `steps[].message.source.version` (integer, required)
- `stop_on` (string, optional): When the follow-ups stop: `confirmed`, the only value, once the recipient confirms receipt.
- `is_account_default` (boolean, optional): The organisation's pre-fill for new batches and deliveries; never applied by itself. Needs organization.update. Default: `false`.

## Example: Wait longer before the SMS

```bash
curl -X PATCH "https://api.parasend.com/v1/reminder_policies/rpol_01M6R27T5NK3830GCN9QPS9M95" \
  -H "Authorization: Bearer $PARASEND_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Payment reminders",
    "steps": [
      {
        "after_days": 3,
        "channel": "email",
        "conditions": [
          "not_delivered"
        ]
      },
      {
        "after_days": 7,
        "channel": "email",
        "conditions": [
          "not_delivered"
        ],
        "message": {
          "preset": "firmer"
        }
      },
      {
        "after_days": 14,
        "channel": "sms",
        "conditions": [
          "not_delivered"
        ]
      }
    ]
  }'
```

```js
const res = await fetch('https://api.parasend.com/v1/reminder_policies/rpol_01M6R27T5NK3830GCN9QPS9M95', {
  method: 'PATCH',
  headers: {
    Authorization: `Bearer ${process.env.PARASEND_KEY}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    name: 'Payment reminders',
    steps: [
      {
        after_days: 3,
        channel: 'email',
        conditions: ['not_delivered'],
      },
      {
        after_days: 7,
        channel: 'email',
        conditions: ['not_delivered'],
        message: {
          preset: 'firmer',
        },
      },
      {
        after_days: 14,
        channel: 'sms',
        conditions: ['not_delivered'],
      },
    ],
  }),
});
const data = await res.json();
```

## Response 200

Updated.

```json
{
  "id": "rpol_01M6R27T5NK3830GCN9QPS9M95",
  "object": "reminder_policy",
  "name": "Payment reminders",
  "system": false,
  "version": 2,
  "version_id": "rpv_01M6R27T60DW1D6WAYM11GBDER",
  "steps": [
    {
      "channel": "email",
      "after_days": 3,
      "conditions": [
        "not_delivered"
      ],
      "available": true
    },
    {
      "channel": "email",
      "message": {
        "preset": "firmer"
      },
      "after_days": 7,
      "conditions": [
        "not_delivered"
      ],
      "available": true
    },
    {
      "channel": "sms",
      "after_days": 14,
      "conditions": [
        "not_delivered"
      ],
      "available": true
    }
  ],
  "stop_on": "confirmed",
  "customized": false,
  "is_account_default": false,
  "in_use_by_batches": 0,
  "in_use_by_deliveries": 0,
  "created_at": "2026-11-06T09:15:05.781Z",
  "updated_at": "2026-11-06T09:15:05.792Z",
  "archived_at": null
}
```

Errors: one shape, `{"error": {type, code, message, param, request_id}}`; every code is listed at https://parasend.com/docs/errors.
