---
title: "Update a contact"
method: PATCH
path: "/api/v1/contacts/{id}"
tags: ["contacts"]
---

# Update a contact

`PATCH /api/v1/contacts/{id}`

## Request

- Base URL: `https://app.blueticked.com`
- URL: `https://app.blueticked.com/api/v1/contacts/{id}`
- Auth: HTTP bearer

Partially update a contact's profile, tags, or suppressed flag.

Send only the fields you want to change, and at least one field: an empty body answers 400 validation_failed. Changing or clearing phone/email clears consent for the old identifier.

Set a matching *_consent field to true to record fresh permission for the effective identifier. Email consent still follows the business's double opt-in policy.

## Path parameters

- `id` string, required

## Request body

- object
  - `business_id` string, uuid, nullable
  - `phone` string, nullable: Phone in international form (+27821234567) or South African national form (082 123 4567); spaces and dashes are ignored. A number without a leading + or 00 is read as South African, so write a foreign number with its +. Stored and returned as E.164.
  - `email` string, nullable
  - `first_name` string, nullable
  - `last_name` string, nullable
  - `tags` string[]
  - `custom_fields` object
  - `suppressed` boolean
  - `whatsapp_consent` true
  - `sms_consent` true
  - `email_consent` true

## Response `200`

Success

- object
  - `custom_fields` object, required
  - `id` string, uuid, required
  - `business_id` string, uuid, nullable, required
  - `first_name` string, nullable, required
  - `last_name` string, nullable, required
  - `phone` string, nullable, required
  - `email` string, nullable, required
  - `tags` string[], required
  - `channels` object, required
    - `has_whatsapp` boolean, required
    - `whatsapp_opted_in_at` string, date-time, nullable, required
    - `has_sms` boolean, required
    - `sms_opted_in_at` string, date-time, nullable, required
    - `has_email` boolean, required
    - `email_opted_in_at` string, date-time, nullable, required
    - `email_optin_status` string, required
  - `suppressed` boolean, required
  - `created_at` string, date-time, required
  - `updated_at` string, date-time, required
  - `request_id` string, required

## Other responses

- `400`: Validation failed
- `401`: Unauthorized: missing or invalid API key
- `402`: Insufficient wallet balance
- `403`: Forbidden: scope, plan limit, or suspension
- `404`: Not found
- `409`: Conflict (idempotency-key reuse or resource in use)
- `413`: Request body above the endpoint's size limit
- `422`: Understood but refused: the request is well-formed, the action is not permitted for this resource
- `429`: Rate limited
- `500`: Internal error
- `502`: An upstream provider refused or failed the request
- `503`: Channel or send queue unavailable

---

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