---
title: "Merge typed attributes without changing subscription or consent"
method: PATCH
path: "/v1/workspaces/{workspaceId}/contacts/{contactId}/attributes"
---

# Merge typed attributes without changing subscription or consent

`PATCH /v1/workspaces/{workspaceId}/contacts/{contactId}/attributes`

## Request

- Base URL: `https://api.bangermail.com`
- URL: `https://api.bangermail.com/v1/workspaces/{workspaceId}/contacts/{contactId}/attributes`
- Auth: HTTP bearer

Requires contacts:write and contacts:read. Updates an existing contact only. Omitted attributes are preserved, explicit false is stored, and null removes a field. Supply verified source facts; absent data is not false. Subscription, suppression, identity and source history are unchanged.

## Headers

- `Idempotency-Key` string, required

## Request body

- object
  - `attributes` object, required

## Response `200`

Current contact read-back; replayed is true when this mutation was already applied.

- object
  - `data` object, required
    - `id` string, uuid, required
    - `attributes` object, required
    - `status` 'subscribed' | 'unsubscribed' | 'bounced' | 'complained', required
    - `replayed` boolean, required

## Other responses

- `400`: Invalid attributes or idempotency key.
- `403`: Missing contact scope or product access.
- `404`: Contact does not exist in this product.
- `409`: Idempotency key reused with another contact or payload.
- `422`: Attribute value does not match its contact field type.

---

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