Contact and registry endpoints

Contacts

GET /api/contacts

page, pageSize.

Parameter Filter

search

Free text across name, email, phone and company

name, email, phone

Field-specific partial matches

hubspotId

Exact hubspotContactId

sellerId

Contacts belonging to one seller

source

campaign, hubspot, import, manual

lifecycleStage

ContactLifecycleStage

leadStatus

ContactLeadStatus

stopCalling

Boolean

hasEmail

Only contacts with an address

hasSupplierKey

Only contacts linked to a supplier record

GET /api/contacts/{id}

Single contact with its seller and registry links.

GET /api/contacts/{id}/stats

Aggregate counts for the contact detail header — calls, emails, activities, tasks.

GET /api/contacts/{id}/calls

Paginated calls for the contact (page, pageSize).

GET /api/contacts/{id}/activities

Paginated Activity rows (page, pageSize).

GET /api/contacts/{id}/emails / PATCH /api/contacts/{id}/emails/{emailId}

The contact’s messages, and per-message updates (read, archive, category).

GET /api/contacts/{id}/phones / PATCH /api/contacts/{id}/phones/{phoneId}

The contact’s TargetPhoneNumbers rows, and per-row updates — this is where an operator blocks a single number without blocking the contact.

POST /api/contacts/crm-queue

Pushes the contact onto the CRM SQS queue on demand. The manual escape hatch when an automatic sync did not fire.

Sellers

GET /api/sellers

page, pageSize.

Filters

search, platform (amazon, walmart, shopify), isSuspended, hubspotSyncStatus

Suppliers

GET /api/suppliers

page, pageSize. Response includes facets (distinct status values) for filter dropdowns. Each row includes contact_id when a workspace Contact shares the same supplier_key.

Parameter Filter

search

Name, company, email, phone, supplier key, store, merchant token

api_status

Exact apiStatus. none matches unset

access_status

Exact accessStatus. none matches unset

cancelation_status

Exact cancelationStatus. none matches unset

status

Exact status. none matches unset

payability_status

Exact payabilityStatus. none matches unset

GET /api/suppliers/{id}

Single supplier including extra JSON. 404 when missing in the active workspace.

Phone registry

GET /api/target-phone-numbers

Paginated TargetPhoneNumbers for the workspace. page (default 1), pageSize (default 25, max 200). Backs /targets/phone-numbers.

Parameter Filter

search

Phone number or carrier name, case-insensitive substring

is_blocked

true / false

risk_level

low, medium, high, critical

is_active

true / false

include_deleted

true to include soft-deleted rows (excluded by default)

{
  "data": [
    {
      "id": "uuid",
      "phone_number": "+1******890",
      "subscription_id": "uuid",
      "contact_id": "uuid",
      "contact_email": "user@example.com",
      "country_code": "1",
      "carrier_name": "Example Carrier",
      "mobile_country_code": null,
      "mobile_network_code": null,
      "line_type": "mobile",
      "risk_level": "low",
      "is_active": true,
      "is_deleted": false,
      "is_blocked": false,
      "sync_twilio": false,
      "sync_hubspot": false,
      "hubspot_synced_at": null,
      "created_at": "2026-01-01T00:00:00.000Z",
      "updated_at": "2026-01-01T00:00:00.000Z"
    }
  ],
  "total": 100,
  "page": 1,
  "pageSize": 25
}

Phone numbers are masked in the response (lib/utils/mask-phone.ts).

Only rows with riskLevel of low or null, not blocked and not deleted, are dialable — see Registries.

Email registry

GET /api/target-emails

Paginated TargetEmails for the workspace. page, pageSize.

Parameter Filter

search

Address substring

is_active

true / false

is_blocked

true / false

newsletter_opt_out

true / false

include_deleted

true to include soft-deleted rows

An address is suppressed when any of newsletterOptOut, marketingOptOut or isBlocked is set. See Suppression.

Cross-campaign targets

GET /api/targets

Paginated CampaignTarget rows across every campaign in the workspace.

Parameters

campaignId, state, search, page, pageSize

/targets in the dashboard redirects to /targets/phone-numbers; /targets/emails is a placeholder for a future email-targets view — email recipients remain under Email campaigns.