> ## Documentation Index
> Fetch the complete documentation index at: https://docs.zavu.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# Update a contact



## OpenAPI

````yaml /api-reference/v2/openapi.json patch /v2/contacts/{contactId}
openapi: 3.0.3
info:
  title: Zavu API v2
  version: 2.0.0
  description: >-
    The second version of the Zavu API. It runs on the same engine as /v1: the
    same API keys, the same per-project rate limit, the same sending limits,
    prices and reviews. /v1 keeps working unchanged, and you can mix calls to
    both.


    **Addresses, not senders.** /v2 has no sender object. Where a message leaves
    from is named the way the recipient sees it: an E.164 number, an email
    address, `@botname` for Telegram, `@username` for Instagram, the Facebook
    Page id for Messenger, and the literal `sms_oneway` for one-way SMS (sent
    from shared numbers, never a number of your own). `GET /v2/channels` lists
    one entry per (address, type); a number that carries WhatsApp and SMS is two
    entries with the same address.


    **What else changes.** No `Zavu-Sender` header (`from` or `conversationId`
    instead); every send reports how it was routed; one project webhook carries
    every event; every error is `{code, message, details}` at the root.


    **Wrong method.** A path under `/v2/messages`, `/v2/conversations`,
    `/v2/contacts`, `/v2/channels`, `/v2/templates`, `/v2/campaigns`,
    `/v2/agents`, `/v2/webhook` or `/v2/email-domains` called with a method it
    does not take answers `405 method_not_allowed`, with `details.allowed` and
    an `Allow` header.


    **Money.** Every amount is USD, rounded to 6 decimals.
servers:
  - url: https://api.zavu.dev
security:
  - bearerAuth: []
tags:
  - name: Messages
    description: Send, list and read messages.
  - name: Conversations
    description: Inbox threads, one per contact across channels.
  - name: Contacts
    description: Contacts and the identifiers they are reached at.
  - name: Channels
    description: 'Where the project can send from: one entry per (address, type).'
  - name: Templates
    description: WhatsApp message templates.
  - name: Campaigns
    description: One message to many recipients.
  - name: Webhook
    description: The one project webhook for every event.
  - name: Agents
    description: AI agents and the addresses they answer on.
  - name: Numbers
    description: Search and buy phone numbers.
  - name: Email Domains
    description: Domains to send email from.
  - name: Functions
    description: Configure Zavu Functions.
paths:
  /v2/contacts/{contactId}:
    patch:
      tags:
        - Contacts
      summary: Update a contact
      operationId: updateContactV2
      parameters:
        - name: contactId
          in: path
          required: true
          description: ''
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ContactUpdateRequest'
      responses:
        '200':
          description: Updated.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Contact'
        '400':
          description: Invalid update.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '401':
          description: Unauthorized.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '404':
          description: Contact not found, or it belongs to another project.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      security:
        - bearerAuth: []
components:
  schemas:
    ContactUpdateRequest:
      type: object
      properties:
        displayName:
          type: string
          maxLength: 200
          nullable: true
          description: >-
            Human-readable name for this contact. Set to null to clear it and
            fall back to the contact's identifier. Contacts created
            automatically from an inbound message have no display name until you
            set one.
          example: John Doe
        defaultChannel:
          type: string
          enum:
            - sms
            - whatsapp
            - telegram
            - email
            - instagram
            - messenger
            - voice
          nullable: true
          description: Preferred channel for this contact. Set to null to clear.
        metadata:
          type: object
          additionalProperties:
            type: string
    Contact:
      type: object
      required:
        - id
        - availableChannels
        - verified
        - metadata
        - createdAt
      properties:
        id:
          type: string
        displayName:
          type: string
          description: Display name for the contact.
          example: John Doe
        phoneNumber:
          type: string
          description: >-
            DEPRECATED: Use primaryPhone instead. Primary phone number in E.164
            format.
          example: '+56912345678'
        primaryPhone:
          type: string
          description: Primary phone number in E.164 format.
          example: '+56912345678'
        primaryEmail:
          type: string
          format: email
          description: Primary email address.
          example: john@example.com
        countryCode:
          type: string
          example: CL
        profileName:
          type: string
          nullable: true
          description: >-
            Contact's WhatsApp profile name. Only available for WhatsApp
            contacts.
          example: John Doe
        availableChannels:
          type: array
          items:
            type: string
          description: List of available messaging channels for this contact.
        defaultChannel:
          type: string
          enum:
            - sms
            - whatsapp
            - telegram
            - email
            - instagram
            - messenger
            - voice
          description: Preferred channel for this contact.
        verified:
          type: boolean
          description: Whether this contact has been verified.
        channels:
          type: array
          items:
            $ref: '#/components/schemas/ContactChannel'
          description: All communication channels for this contact.
        metadata:
          type: object
          additionalProperties:
            type: string
        createdAt:
          type: string
          format: date-time
        updatedAt:
          type: string
          format: date-time
    Error:
      type: object
      required:
        - code
        - message
      description: >-
        Every v2 error has this shape at the root. There is no `{error: {...}}`
        wrapper anywhere in v2. A missing resource is `404 not_found` with the
        message `<Resource> not found`; an address the project does not have is
        `404 not_found`, `None of this project's channels has the address
        <address>.`, with the address in `details` under the name the request
        used (`from` or `address`). A `message` is written for the caller and
        never carries a stack trace or a source path. A body that is not JSON is
        `400 invalid_json`, with `details.errors` (`path: []`, the parse error
        in `message`).
      properties:
        code:
          type: string
          example: invalid_request
        message:
          type: string
        details:
          type: object
          additionalProperties: true
          description: >-
            Machine-readable context. Keys that mean the same thing everywhere:

            - `errors`: present on every `400 invalid_request` for an invalid
            body or query parameter, `[{path, message, ...}]`, `path` naming the
            field (`["to"]`, `["contacts", 2, "recipient"]`, `["limit"]`).

            - `recommendation`: one sentence saying what to do next.

            - `dashboardUrl`: the dashboard screen that fixes it.

            - `connect`: on `409 no_channel`, the channels this project can
            connect to reach the recipient, each `{type, request, note,
            available, dashboardUrl?}`; `request` is the exact call (`POST
            /v2/channels` with its body, or `POST /v2/numbers`), or null for a
            channel connected from the dashboard (WhatsApp, Instagram,
            Messenger). `available: false` says why in `note` (one-way SMS
            closed until business verification is approved).

            - `address` / `from`: the address the error is about, under the name
            the request used for it.
          properties:
            errors:
              type: array
              items:
                type: object
                required:
                  - path
                  - message
                properties:
                  path:
                    type: array
                    items:
                      oneOf:
                        - type: string
                        - type: integer
                  message:
                    type: string
                  code:
                    type: string
                additionalProperties: true
    ContactChannel:
      type: object
      description: A communication channel for a contact.
      required:
        - id
        - channel
        - identifier
        - isPrimary
        - verified
        - createdAt
      properties:
        id:
          type: string
        channel:
          type: string
          enum:
            - sms
            - whatsapp
            - email
            - telegram
            - instagram
            - messenger
            - voice
          description: Channel type.
        identifier:
          type: string
          description: Channel identifier (phone number or email address).
          example: '+14155551234'
        countryCode:
          type: string
          description: ISO country code for phone numbers.
          example: US
        label:
          type: string
          description: Optional label for the channel.
          example: work
        isPrimary:
          type: boolean
          description: Whether this is the primary channel for its type.
        verified:
          type: boolean
          description: Whether this channel has been verified.
        metrics:
          type: object
          description: Delivery metrics for this channel.
          properties:
            successCount:
              type: integer
            failureCount:
              type: integer
            totalAttempts:
              type: integer
            avgDeliveryTimeMs:
              type: number
            lastSuccessAt:
              type: string
              format: date-time
        lastInboundAt:
          type: string
          format: date-time
          description: Last time a message was received on this channel.
        metadata:
          type: object
          additionalProperties:
            type: string
        createdAt:
          type: string
          format: date-time
        updatedAt:
          type: string
          format: date-time
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.