Contacts

Read or run Dex Research on a contact

Dex Research: a cited web research note about one contact (who they are, current focus, background, interests) plus structured findings (LinkedIn, website, email, phone) with per-finding confidence an

POST /v2/contacts/{contactId}/research

Parameters

Path parameters

contactId
string (uuid) required

Header parameters

Idempotency-Key
string
Optional. Accepted to dedupe retries on this endpoint. See apps/rest-api/src/shared/idempotency.ts.

Request body

Content-Type: application/json

run
boolean
force
boolean

Example

{
  "run": false,
  "force": false
}

Responses

200 — Successful response

Content-Type: application/json

data
object required
data.research
object | null required
data.research.run_id
string | null required
data.research.status
string enum required
Possible values: "success", "no_data_found"
data.research.reason
string enum required
Possible values: "missing_name", "fetch_failed", "insufficient_info", "wrong_person_suspected"
data.research.researched_at
string required
data.research.one_line_summary
string required
data.research.sections
array<object> required
data.research.sections[].key
string enum required
Possible values: "current_focus", "background", "interests"
data.research.sections[].title
string required
data.research.sections[].bullets
array<string> required
data.research.sources
object required
data.research.identity_confidence
string enum required
Possible values: "high", "medium", "low"
data.research.fields
array<object> required
data.research.fields[].field
string enum required
Possible values: "linkedin", "website", "email", "phone"
data.research.fields[].value
string required
data.research.fields[].display
string required
data.research.fields[].citations
array<number> required
data.research.fields[].confidence
string enum required
Possible values: "high", "medium", "low"
data.research.fields[].evidence
string required
data.research.fields[].status
string enum required
Possible values: "pending", "auto_applied", "applied", "already_present"
data.applied
object | null required
data.applied.linkedin
boolean required
data.applied.website
boolean required
data.in_progress
boolean required

Example

{
  "data": {
    "research": {
      "run_id": "string",
      "status": "success",
      "reason": "missing_name",
      "researched_at": "string",
      "one_line_summary": "string",
      "sections": [
        {
          "key": "current_focus",
          "title": "string",
          "bullets": [
            "string"
          ]
        }
      ],
      "sources": {},
      "identity_confidence": "high",
      "fields": [
        {
          "field": "linkedin",
          "value": "string",
          "display": "string",
          "citations": [
            0
          ],
          "confidence": "high",
          "evidence": "string",
          "status": "pending"
        }
      ]
    },
    "applied": {
      "linkedin": false,
      "website": false
    },
    "in_progress": false
  }
}

400 — Request body failed validation.

Content-Type: application/json

(body)
any

401 — Missing or invalid API key.

Content-Type: application/json

(body)
any

403 — Valid key, insufficient permission.

Content-Type: application/json

(body)
any

404 — Resource does not exist.

Content-Type: application/json

(body)
any

409 — Request conflicts with the current state of the resource.

Content-Type: application/json

(body)
any

429 — Rate limit exceeded.

Content-Type: application/json

(body)
any

500 — Unexpected server error.

Content-Type: application/json

(body)
any

Code samples

curl https://api.prod.getdex.com/v2/contacts/00000000-0000-0000-0000-000000000000/research \
  --request POST \
  --header 'Authorization: Bearer YOUR_API_KEY' \
  --header 'Content-Type: application/json' \
  --data '{
  "run": false,
  "force": false
}'
Copyright © 2026