---
title: "Admin Browse"
method: GET
path: "/admin/users/{account_id}/contacts"
tags: ["contacts"]
---

# Admin Browse

`GET /admin/users/{account_id}/contacts`

## Request

- Base URL: `https://api.instruxi.dev/api/v1/enforcer`
- URL: `https://api.instruxi.dev/api/v1/enforcer/admin/users/{account_id}/contacts`
- Auth: one of:
  - API key in header `Authorization`
  - API key in header `X-API-Key`

Lets support/tenant_admin/admin browse ANOTHER account's contacts (account_id path param), same filters and sort as GET /contacts. Tenant-scoped callers (tenant_admin, developer — any tenant_read grant) may only browse accounts in their own tenant; a foreign-tenant account id returns 404, never 403, so the route can't be used to probe which account ids exist elsewhere.

## Path parameters

- `account_id` string, required

## Query parameters

- `q` string
- `contact_type` string
- `active` boolean
- `blacklisted` boolean
- `favorite` boolean
- `sort` 'name' | 'display_name' | 'name_desc' | 'display_name_desc' | 'recent' | 'oldest'
- `limit` integer
- `offset` integer

## Response `200`

OK

- InternalDeliveryHttpHandlerContactPageResponse
  - `data` EnforcerV3InternalDomainContactContact[]
    - `active` boolean
    - `alerts` EnforcerV3InternalDomainContactContactAlerts
      - `received_unseen` integer
      - `sent_unseen` integer
      - `total` integer
    - `avatar_url` string: AvatarURL is the resolved picture the client should render: the owner's CustomAvatarURL override when set, else the linked person's own profile_image_url. Computed on list/get so the PWA has ONE field to read and never has to implement the precedence itself. Never stored.
    - `blacklisted` boolean
    - `contact_account_id` string
    - `contact_type` string
    - `created_at` string
    - `created_by` string
    - `custom_avatar_url` string: CustomAvatarURL is the OWNER's private picture override for this contact (migration 000057). Meaningful on both contact types: on a linked contact it shadows the linked person's own profile_image_url, on a custom contact it is the only picture there is. nil = no override.
    - `custom_email` string
    - `custom_first_name` string
    - `custom_last_name` string
    - `custom_phone_number` string
    - `custom_wallet_address` string: CustomWalletAddress is a manually-entered pay-to wallet on a custom contact (custom contacts have no account to derive WalletAddress from). Ported from v2; only custom contacts ever set it.
    - `description` string
    - `email` string
    - `favorite_rank` integer: FavoriteRank orders the owner's favorite contacts: nil = not favorited, 1 = first favorite. A user may hold MANY favorites — the rank is a per-owner ordering, not a single slot (unique per owner among non-null ranks, see migration 000056). Favorites float to the top of every list.
    - `first_name` string
    - `id` string
    - `last_name` string
    - `my_account_id` string
    - `name` string
    - `tenant_id` string
    - `updated_at` string
    - `updated_by` string
    - `username` string: FirstName/LastName/Email are computed display fields populated by the contacts usecase on list/get: for linked contacts from the contact's account, for custom contacts mirrored from the custom_* columns. This gives the PWA one uniform name/email shape per row (matching the legacy contacts list) without a second lookup. Never stored. Username is the linked contact's account handle (@username), populated on list/get so the PWA can show @handle instead of falling back to email. Custom contacts have no account, so it stays nil. Never stored.
    - `wallet_address` string: WalletAddress is a computed field populated by the contacts usecase for linked contacts — the embedded wallet of the contact's account. Never stored in the contacts table; loaded from accounts on list/get.
  - `limit` integer
  - `offset` integer
  - `success` boolean
  - `total` integer

## Other responses

- `400`: Bad Request
- `401`: Unauthorized
- `403`: Forbidden

---

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