---
title: "Get a contact"
method: GET
path: "/v1/contacts/{contactId}"
tags: ["Contacts"]
---

# Get a contact

`GET /v1/contacts/{contactId}`

## Request

- Base URL: `https://api.postzen.dev`
- URL: `https://api.postzen.dev/v1/contacts/{contactId}`
- Auth: HTTP bearer

Requires read_only. Returns the contact with distinct conversationIds and channels, oldest first. Unknown or out-of-scope ids return 404 contactNotFound. Counters start when Contacts ships; history is not backfilled.

## Path parameters

- `contactId` string, required: Contact owning this channel.

## Response `200`

Get a contact.

- object
  - `contact` object, required: Contact details with conversation ids and updatedAt.
    - `id` string, required: Contact id.
    - `profileId` string, required: Owning profile id; immutable and must be in the API key scope.
    - `name` string, required: Trimmed contact name, 1–200 characters.
    - `email` string, nullable, required: Trimmed lowercase email; unique within its profile.
    - `company` string, nullable, required: Company name, at most 200 characters.
    - `avatarUrl` string, uri, nullable, required: Public HTTPS avatar URL, canonicalized on PATCH; inbox avatars are stored as supplied by the platform.
    - `tags` string[], required: At most 50 tags, trimmed and deduplicated case-insensitively, preserving original case. Send [] to clear.
    - `isSubscribed` boolean, required: Contact subscription state. False prevents comment automation sends.
    - `isBlocked` boolean, required: Blocked contacts cannot receive comment automation sends.
    - `notes` string, nullable, required: Free-form notes, at most 5000 characters.
    - `customFields` object, nullable, required: At most 50 keys of 1–64 characters. Keys follow Convex record rules: printable ASCII, not starting with $ or _. Values are strings (at most 1000 characters), finite numbers, booleans, or null. PATCH replaces the entire object.
    - `messagesSentCount` integer, required: Messages sent by the connected account, including automation DMs. Counters start when Contacts ships; history is not backfilled.
    - `messagesReceivedCount` integer, required: Messages received from this person since Contacts ships; re-syncing stored messages does not increment this count.
    - `lastMessageSentAt` string, date-time, nullable, required: Latest counted outbound message time, or null.
    - `lastMessageReceivedAt` string, date-time, nullable, required: Latest counted inbound message time, or null.
    - `source` 'api' | 'inbox' | 'automation', required: How this contact first came to exist; informational and immutable.
    - `createdAt` string, date-time, required: Contact creation time.
    - `updatedAt` string, date-time, required: Latest contact update time.
    - `conversationIds` string[], required: Distinct non-null platform conversation ids across the channels.
  - `channels` ContactChannel[], required: Channels ordered oldest first by createdAt.
    - `id` string, required: Contact channel id.
    - `contactId` string, required: Contact owning this channel.
    - `accountId` string, required: Connected account id; must belong to the same profile and caller.
    - `platform` 'x' | 'instagram' | 'tiktok' | 'linkedin' | 'facebook' | 'youtube' | 'threads' | 'pinterest' | 'bluesky' | 'telegram', required: PostZen platform. Always resolved from the connected account.
    - `platformIdentifier` string, required: Platform identity (IGSID, PSID, or handle), trimmed, 1–200 characters. Unique per connected account.
    - `displayIdentifier` string, nullable, required: Optional username or friendly handle, at most 200 characters.
    - `isSubscribed` boolean, required: Channel opt-in. False prevents comment automation sends on this channel.
    - `conversationId` string, nullable, required: Platform conversation id when known; not the PostZen inbox document id.
    - `metadata` object, nullable, required: Optional platform facts; same key and scalar value limits as customFields.
    - `lastActiveAt` string, date-time, nullable, required: Latest counted message time on this channel.
    - `createdAt` string, date-time, required: Channel creation time.

## Other responses

- `400`: Invalid request.
- `401`: Missing or invalid API key.
- `403`: The API key does not have sufficient permission or profile access.
- `404`: Resource not found.
- `429`: Rate limit exceeded. Retry after the interval indicated by the `Retry-After` header.
- `500`: Unexpected server error.

---

[API](https://skmtc.dev/postzen/apis/postzen-public-api.md) · [All operations](https://skmtc.dev/postzen/apis/postzen-public-api/llms.txt) · [OpenAPI document](https://skmtc.dev/postzen/apis/postzen-public-api/revisions/40863e3710ec?raw)
