---
title: "Update Customer"
description: "Updates customer details."
---

`PATCH /api/customers/:customerPublicId`

## Authentication

```bash
BASE_URL="https://uptimeify.io"
TOKEN="<your-api-token>"
```

## Request Body

All fields are optional. Omitted fields keep their current values.

```json
{
  "name": "New Name",
  "email": "new@deinkunde.com",
  "status": "active",
  "packageType": "business", // configured packageType or displayName for the organization
  "notificationEmail": "alerts@customer-a.de",
  "notificationPhoneNumber": "+491701234567",
  "monthlyReportsEnabled": true,
  "customFields": {
    "internalReference": "KD-999"
  }
}
```

Notes:

- `packageType` can contain the configured package key or the package display name of the organization. Known aliases such as `aquisition_test` are normalized automatically. A value that resolves to no package of this organization is rejected with `400` and `data.code` `invalidPackageType`; it is no longer stored as-is.

## Ownership & permission overrides (optional)

These fields control the customer's [managed vs. self-service](/monitoring/managed-vs-self-service) permissions and channel-type policy. They are **organization-write gated**: a customer-scoped caller's writes to these fields are silently ignored server-side.

`null` means *inherit from the customer's package config*.

| Field | Type | Default | Description |
|-------|------|---------|-------------|
| `allowSelfService` | boolean\|null | null (inherit) | Whether the customer may create and manage `self_service` monitors |
| `maxSelfServiceUrls` | number\|null | null (inherit) | Cap on the customer's **total** `self_service` monitors across all monitor types |
| `canEditManaged` | boolean | false | Exception: lets this customer edit `managed` monitors (class flips stay org-only). Changes are written to the audit log. |
| `enableEmailAlerts` | boolean\|null | null (inherit) | Channel-type policy override: email alerts |
| `enableSmsAlerts` | boolean\|null | null (inherit) | Channel-type policy override: SMS alerts |
| `enableWebhookAlerts` | boolean\|null | null (inherit) | Channel-type policy override: webhooks |
| `enableIntegrationAlerts` | boolean\|null | null (inherit) | Channel-type policy override: integrations |
| `enablePostRequestEscalation` | boolean\|null | null (inherit) | Channel-type policy override: POST-request escalation |

The legacy `notificationChannels` JSONB override is deprecated: channel-type policy lives in the `enable*` fields above.

## Example Request

```bash
curl -X PATCH "$BASE_URL/api/customers/6bfec6f6-245a-47ce-843b-157d97d56f88" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Customer A GmbH (Updated)",
    "monthlyReportsEnabled": true
  }'
```

## Example Response

```json
{
  "id": 101,
  "publicId": "6bfec6f6-245a-47ce-843b-157d97d56f88",
  "organizationId": 1,
  "name": "Customer A GmbH (Updated)",
  "email": "contact@customer-a.de",
  "notificationPhoneNumber": "+491701234567",
  "notificationEmail": "alerts@customer-a.de",
  "packageId": 3,
  "status": "active",
  "monthlyReportsEnabled": true,
  "customFields": {
    "internalReference": "KD-999"
  },
  "notificationChannels": null,
  "notificationTargets": null,
  "updatedAt": "2026-02-26T19:37:00.000Z"
}
```

## Common Errors

- `400` Invalid Customer identifier
- `400` Invalid packageId / packageType for this organization (`data.code`: `invalidPackageType`)
- `401` Unauthorized
- `403` Forbidden / Organization ID not found
- `404` Customer not found
- `500` Failed to update customer

