---
title: "The brand's contacts at one account, and the email domains that make a thread theirs"
method: GET
path: "/api/v1/wholesale/retailers/{partner_id}/contacts"
tags: ["wholesale"]
---

# The brand's contacts at one account, and the email domains that make a thread theirs

`GET /api/v1/wholesale/retailers/{partner_id}/contacts`

## Request

- Base URL: `https://api.app.tightly.io`
- URL: `https://api.app.tightly.io/api/v1/wholesale/retailers/{partner_id}/contacts`
- Auth: HTTP bearer

The brand's contacts at one account and the email domains that make a thread theirs: the account's name, its recorded domains, and one entry per contact with name, email, phone, role, department, contact type, last interaction date and whether they are the main contact.

Both in one read because they answer one question, which is how this account is reached.

`domains` null is not an account without domains: it means nobody has recorded one, which `domains_reason` says, and until one is recorded no inbound thread can be matched to this account at all. Recording a domain is a write on this prefix and is not public.

Sold with Essentials+: without Tightly Connect the answer is 403 `plan_excludes`.

Scope: `accounts:read`.

## Path parameters

- `partner_id` string, required

## Headers

- `Tightly-Version` string

## Response `200`

The account, its recorded email domains (or null with the reason there are none), and every contact with role, department, type and when we last heard from them.

- object
  - `data` object
    - `contacts` object[]
    - `domains` string[], nullable: Null where nobody has recorded one, not an account with no domains.
    - `domains_reason` string, nullable
    - `name` string, nullable
    - `trading_partner_id` string
  - `message` object: severity, service and desc.

## Other responses

- `401`: No usable key: malformed, unknown, revoked, expired or stopped. One refusal covers all five, telling a caller which is which maps the surface for them. A request with no Authorization header at all is refused 400 before any key is looked for.
- `403`: The key may not reach this operation. `plan_excludes` when Accounts is sold with Essentials+ and this organisation's plan does not include it; `scope_missing` when the key does not hold Accounts; `organization_mismatch` when the path names an organisation that is not the key's; `ip_not_allowed` when the caller's address is outside the key's allowlist; `account_mismatch` when a key issued to one account names another in the path, and the sentence names both accounts.
- `429`: The key has spent its allowance for this minute. 600 reads and 120 writes a minute, counted per key, refused calls included. `Retry-After` says how long to wait.
- `503`: The database is briefly out of reach, which is what a failover or a full connection pool looks like from outside. Wait the seconds `Retry-After` names and send the request again. A read is safe to repeat. A write is not, because the connection was lost in the middle of it, so read the object back before sending it a second time. Branch on the status rather than on `code`, which is `POSTGRES_UNAVAILABLE` from one of the two seams that raise this and `SERVICE_UNAVAILABLE` from the other.

---

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