Skip to main content
POST
/
v1
/
patients
/
match-suggestion
Match Suggestion (no-write)
curl --request POST \
  --url https://api.example.com/v1/patients/match-suggestion \
  --header 'Content-Type: application/json' \
  --header 'X-API-Key: <api-key>' \
  --data '
{
  "external_id": {
    "type_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
    "value": "<string>"
  },
  "first_name": "<string>",
  "last_name": "<string>",
  "date_of_birth": "<string>",
  "phone_number": "<string>",
  "email": "<string>"
}
'
{
  "patient": {
    "id": "<string>",
    "first_name": "<string>",
    "last_name": "<string>",
    "phone_number": "<string>",
    "email": "<string>",
    "day_of_birth": "2023-12-25",
    "workflow_stage": {
      "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
      "title": "<string>",
      "actions": [],
      "order": 123,
      "description": "<string>"
    },
    "active": true
  }
}

Authorizations

X-API-Key
string
header
required

Body

application/json

Identifiers the matcher will resolve to a patient.

Forgiving on the wire — same parse_*_safe normalizers the upsert endpoint runs, so a partly-formatted phone or a free-text DOB still matches. Pass raw values from extracted document data, form fields, or eligibility payloads — the service normalizes before calling the matcher. Empty/missing fields are skipped (matcher tiers gate on presence, so unsupplied identifiers just narrow the tier set).

external_id
ExternalIdInput · object

External-id pair. Tier 1 of the matcher when supplied.

first_name
string | null
last_name
string | null
date_of_birth
string | null

DOB in any of: YYYY-MM-DD, YYYYMMDD, MM/DD/YYYY, MM-DD-YYYY, MM/DD/YY. Unparseable values are ignored.

phone_number
string | null
email
string | null

Response

Successful Response

Matcher verdict + optional slim patient. Never includes side-effect data.

kind
enum<string>
required

How the caller should render the picker: hard = lock to the matched patient (DB-enforced uniqueness leaves exactly one valid choice); soft = pre-fill with override; none = free.

Available options:
hard,
soft,
none
reason
enum<string> | null

Which matcher tier resolved the patient (external_id, demographics, phone_fuzzy_name, email_fuzzy_name). Null when kind is none.

Available options:
external_id,
demographics,
phone_fuzzy_name,
email_fuzzy_name
patient
MatchSuggestionPatient · object

The matched patient when kind is hard or soft; null otherwise.