API docs / Verify

Death Verification API

Single endpoint for one-shot obituary lookups. Returns

found
,
possible_match
, or
not_found
with confidence and evidence.

Coverage / limitations
Results are based on searched obituary sources and web results. not_found is not proof of life or a death-registry result.
Endpoint

POST /api/v1/verify

Production base URL: https://api.obituarymonitor.com/api/v1/verify

Developer portal

API-primary customers sign in at /login and land on the developer portal:

  • Overview — quotas, monthly usage, quick links
  • Guide — integration walkthrough (getting started, search depth, results)
  • Test console — run live verify requests against your API key
  • Batch console — upload a CSV for batch verify (heirs / death-record workflows)
  • Usage — volume charts, result breakdown, recent request log
  • API Keys — create and revoke keys (shown once at creation)

Account limits (max_lookback_years, monthly/daily quotas, extended concurrency) are configured by your administrator in api_customer_settings.

Authentication

Send your API key in the Authorization header:

Authorization: Bearer om_live_xxxxxxxx

Keys are created in the developer portal under API Keys. Your account must have api_access enabled.

Request schema

Required: first_name and last_name, plus at least one disambiguator (otherwise 400 invalid_request):

  • address.state (2-letter US state), or
  • address.city and address.state together, or
  • address.county and address.state together (county name without "County" suffix is fine — e.g. Travis + TX), or
  • dob.year, or
  • dob.month and dob.year together

death_date is optional but strongly recommended when you already have a death record — it improves scoring and can confirm common names. It does not replace a disambiguator by itself.

FieldTypeNotes
first_namestringRequired
last_namestringRequired
middle_namestringOptional
dob.month1–12Optional; invalid values return 400
dob.year1800–2100Optional; invalid values return 400
address.citystringOptional disambiguator
address.statestringStrongly recommended; satisfies disambiguator when present (2-letter US state)
address.countystringOptional disambiguator with address.state. Use when your source data has county but not city (typical for death-record / heir lookups). County is resolved against our funeral-home directory — including Serper hits on known funeral-home domains.
death_datestring or objectKnown date of death: ISO YYYY-MM-DD, YYYY-MM, YYYY, or { year, month?, day? }. Strong match signal when obituary death date aligns.
address.line1stringOptional street line; trailing City, ST may be parsed when city and state are omitted
search_depthenumOptional. recent | standard | extended. If omitted, the API automatically chooses an appropriate depth based on stored obituary inventory, DOB compatibility, and account lookback limits. Customers can still force recent, standard, or extended.
client_refstringYour correlation id (echoed in response)
lookback_yearsinteger (1–20)Extended depth only. Calendar years back from today for web fan-out and stored inventory death-date window (each year ≈ 365 days on indexed obituaries and funeral-home listings). Defaults to your account max_lookback_years when omitted. Cannot exceed that maximum.
include_survivorsbooleanBETA. When true, attach structured survivors / heirs to match when an obituary is found. Uses stored text when available; otherwise fetches the obit page. Can add about 10 seconds to response time. Treat as a research aid — accuracy varies.
search_depth
Each verify request counts as one lookup against your monthly quota, regardless of depth.

auto (omit search_depth)

If search_depth is omitted, the API automatically chooses an appropriate depth based on stored obituary inventory, DOB compatibility, and account lookback limits. Customers can still force recent, standard, or extended.

Typical auto-escalation to extended: indexed same-name obituaries exist but none match the submitted birth year, or the subject is age 55+ with no DOB-compatible stored match. Response search_scope.search_depth shows what was applied; search_depth_auto_reason explains why.

recent

Stored obituaries and funeral-home listing inventory only. Fastest option; use when indexed coverage is sufficient.

standard

Stored inventory plus historical obituary coverage (~3-year window). Use when you want broader reach regardless of what is already indexed.

extended

Deepest coverage: always searches stored obituaries and funeral-home listing inventory first, then adds multi-year historical web search. Set lookback_years to control how many calendar years back from today are searched on the web (up to your account's max_lookback_years). The same value expands the death-date lookback on stored obituaries and funeral-home listing inventory (lookback_years × 365 days). Subject to extended concurrency limits; may return 503 when capacity is saturated.

dob.year helps disambiguate matches but does not change which years are searched — use lookback_years to reach older deaths.

Result meanings
found

We matched a deceased person to your query with high identity confidence. Safe to treat as confirmed. Stored-index matches rank above web-only signals. Review match.evidence and scoring_reasons before automated action.

possible_match

We found a same-named decedent, but not enough matched identity signals to be sure it's the same person. A human should review before acting — never auto-confirm a death from possible_match. review_recommended is typically true. Treat as a lead, not confirmation.

not_found

No qualifying obituary was found in the sources we searched. This is not proof the person is alive — only that we did not find a death record. Response includes not_proof_of_life: true and an interpretation string.

Getting found instead of possible_match

Tip: name + state alone is deliberately cautious — a stranger can share a name in the same state. Add identity signals (exact birth date, city, or county) to promote a possible_match to found and rule out wrong people. When a result is downgraded for this reason, scoring_reasons includes stored_found_requires_disambiguator (or stored_common_name_requires_disambiguator for common names) — add a matching address.city, address.county, or full dob / death_date to promote it to found.

negative_result_strength

Returned on not_found only.

  • weak — minimal identifiers; search coverage was narrow.
  • moderate — reasonable identifiers; standard scope searched.
  • strong — strong disambiguators (e.g. city+state, county+state, DOB, or death date) and broader search; higher confidence no obituary appeared in scope.
search_scope (response)

Every response includes search_scope describing what was searched. Use it to audit auto-depth decisions and coverage scope. Top-level external_queries_count reflects supplemental search activity (0 for recent depth).

scoring_reasons (top-level and on match) are plain-language strings explaining the outcome — not fixed enum tokens.

FieldMeaning
stored_obituaries_checkedWhether parsed obituaries index was queried
listing_inventory_checkedWhether funeral-home crawler listing inventory was queried
historical_web_search_checkedWhether supplemental historical search ran (false for recent depth)
search_depthEffective depth applied for this request
search_depth_requestedClient value; null when auto-detected
search_depth_auto_reasonWhy auto chose this depth (e.g. subject_age_55_plus_no_compatible_stored_match)
years_searchedCalendar years used in web fan-out
lookback_years_requestedClient lookback_years value (extended only)
lookback_years_appliedExtended depth year count applied (stored + web window)
stored_name_match_countSame-name hits in stored inventory for this request
stored_newest_death_yearNewest death year among stored same-name inventory (when probed)
stored_oldest_death_yearOldest death year among stored same-name inventory (when probed)
has_dob_compatible_stored_matchWhether any stored hit matched submitted birth year
web_search_statusskipped, completed, or pending_phase2
web_search_skip_reasonWhen supplemental search did not run: depth_recent, missing_state, or external_search_unavailable
web_results_rawSupplemental source results before URL filtering (diagnostics)
web_results_after_url_filterResults after dropping non-obituary URLs
web_candidates_parsedSupplemental rows that passed name/obit parsing
County lookup (address.county)

When your source data includes county but not city — common for death-record and heir-identification workflows — send address.county with address.state. City is optional.

County matching uses our funeral-home directory as the authoritative geo source:

  • Stored obituaries and listing inventory carry funeral-home county directly
  • City names from obituary text map to county via funeral homes operating in that city
  • Serper hits on recognized funeral-home domains resolve county from the directory (even when the obit is not in our index)

Pure aggregators (Legacy.com, Echovita, etc.) rely on city/state parsed from the search result title or snippet. Pair county-only requests with death_date when names are common.

Survivors / heirs (include_survivors, beta)

Set include_survivors: true to request structured survivors parsed from the obituary text when a match is found. Response fields on match:

  • survivors — array of { name, relationship, location? }
  • survivors_status — ok | none_found | unavailable_realtime | error
  • survivors_source — obituary_full_text | snippet | scraped | null
  • survivors_beta — always true

When stored obituary text is missing or too short to list names, the API may fetch the obit page to parse survivors. That step can add about 10 seconds to response time. When text is unavailable or time runs out, survivors_status is unavailable_realtime. Accuracy varies; use for research leads, not sole proof of heirship.

Batch verification

Verify up to 50 people per call with POST /api/v1/verify/batch. Each item uses the same schema as single verify; results return in request order with an index field.

The batch console accepts CSV columns including county, death_date, and optional include_survivors (via the heirs workflow toggle). Use Heirs lookup workflow (Beta) when your file comes from death records and you need obituary survivors — defaults to extended depth with a 10-year lookback.

See also API overview for batch metering and rate-limit behavior.

Data sources

Each lookup searches up to three layers (see search_scope flags):

  • Parsed obituaries — full-text obits from our indexing pipeline (source_trust: stored when matched)
  • Funeral-home listing inventory — names and direct obituary URLs from our funeral-home crawl (~18k enrolled sources; growing with daily and historical backfill)
  • Supplemental historical sources — additional obituary coverage when depth allows (source_trust: extended)

Coverage is strongest on enrolled funeral-home sites and recent deaths. It is not complete national coverage — regional gaps remain. not_found reflects the searched scope only.

match object (response)

Present on found and possible_match. Key fields:

  • matched_name, death_date, location, obituary_url
  • source — publisher or funeral home name (nullable)
  • snippet — excerpt when available (nullable; common on web matches)
  • source_trust — stored | extended
  • evidence — name_match, location_match (includes county_state), dob_match
  • scoring_reasons — plain-language factors for this match
  • survivors, survivors_status, survivors_source, survivors_beta — when include_survivors was requested (beta)
Example request (auto — recommended)

Omit search_depth to let the API choose depth from stored inventory and DOB compatibility.

curl -X POST https://api.obituarymonitor.com/api/v1/verify \
  -H "Authorization: Bearer om_live_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "first_name": "Jackie",
    "last_name": "Simmons",
    "dob": { "month": 11, "year": 1945 },
    "address": { "state": "TX" },
    "client_ref": "case-44201"
  }'
Example request (standard)
curl -X POST https://api.obituarymonitor.com/api/v1/verify \
  -H "Authorization: Bearer om_live_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "first_name": "Margaret",
    "last_name": "Henderson",
    "dob": { "month": 3, "year": 1942 },
    "address": { "city": "Austin", "state": "TX" },
    "search_depth": "standard",
    "client_ref": "case-88421"
  }'
Example request (county + heirs, extended)

Typical death-record / heir lookup: county + state (no city), known death date, extended lookback, and survivors extraction.

curl -X POST https://api.obituarymonitor.com/api/v1/verify \
  -H "Authorization: Bearer om_live_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "first_name": "Robert",
    "last_name": "Martinez",
    "address": { "state": "TX", "county": "Travis" },
    "death_date": "2014-08-22",
    "search_depth": "extended",
    "lookback_years": 10,
    "include_survivors": true,
    "client_ref": "tx-heir-001"
  }'
Example request (extended + lookback_years)

Use lookback_years to reach older deaths in stored inventory and web search. With lookback_years: 6 in 2026, web fan-out covers calendar years 2026 through 2021, and stored sources use a ~6-year death-date window.

curl -X POST https://api.obituarymonitor.com/api/v1/verify \
  -H "Authorization: Bearer om_live_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "first_name": "Thomas",
    "last_name": "Plaskett",
    "dob": { "year": 1945 },
    "address": { "state": "PA" },
    "search_depth": "extended",
    "lookback_years": 6,
    "client_ref": "case-99102"
  }'
Example: found
{
  "result": "found",
  "confidence": 0.92,
  "review_recommended": false,
  "scoring_reasons": [
    "Stored index candidate",
    "Last name match",
    "Exact first name match",
    "State match (TX)",
    "City match: Austin",
    "stored_candidate_meets_found_threshold"
  ],
  "client_ref": "case-88421",
  "search_scope": {
    "stored_obituaries_checked": true,
    "listing_inventory_checked": true,
    "historical_web_search_checked": true,
    "search_depth": "standard",
    "search_depth_requested": "standard",
    "search_depth_auto_reason": null,
    "years_searched": [2025, 2026],
    "lookback_years_requested": null,
    "lookback_years_applied": null,
    "web_search_status": "completed"
  },
  "external_queries_count": 2,
  "checked_at": "2026-06-08T14:22:11.000Z",
  "match": {
    "matched_name": "Margaret Ann Henderson",
    "death_date": "2026-05-12",
    "location": "Austin, TX",
    "obituary_url": "https://example.com/obit/margaret-henderson",
    "source": "Example Funeral Home",
    "snippet": "Margaret Ann Henderson, 84, of Austin, passed away peacefully on May 12, 2026…",
    "source_trust": "stored",
    "evidence": {
      "name_match": "exact",
      "location_match": "city_state",
      "dob_match": "year_only"
    },
    "survivors": [
      { "name": "James Henderson", "relationship": "son", "location": "Austin, TX" },
      { "name": "Sarah Henderson", "relationship": "daughter" }
    ],
    "survivors_status": "ok",
    "survivors_source": "stored_full_text",
    "survivors_beta": true,
    "scoring_reasons": [
      "Stored index candidate",
      "Last name match",
      "Exact first name match",
      "State match (TX)"
    ]
  },
  "candidates": []
}
Example: possible_match
{
  "result": "possible_match",
  "confidence": 0.68,
  "review_recommended": true,
  "scoring_reasons": [
    "External search candidate (lower trust)",
    "Last name match",
    "Exact first name match",
    "State match (TX)",
    "External trust penalty (-12)",
    "web_candidate_downgraded_to_possible_match"
  ],
  "client_ref": "case-88421",
  "search_scope": {
    "stored_obituaries_checked": true,
    "listing_inventory_checked": true,
    "historical_web_search_checked": true,
    "search_depth": "extended",
    "search_depth_requested": null,
    "search_depth_auto_reason": "subject_age_55_plus_no_compatible_stored_match;auto_lookback_years:3",
    "years_searched": [2026, 2025, 2024],
    "lookback_years_requested": null,
    "lookback_years_applied": 3,
    "stored_name_match_count": 0,
    "has_dob_compatible_stored_match": false,
    "web_search_status": "completed"
  },
  "external_queries_count": 5,
  "checked_at": "2026-06-08T14:22:11.000Z",
  "match": {
    "matched_name": "John Smith",
    "death_date": null,
    "location": "Dallas, TX",
    "obituary_url": "https://example.com/obit/john-smith-dallas",
    "source": "example.com",
    "snippet": "John Smith of Dallas, Texas…",
    "source_trust": "extended",
    "evidence": {
      "name_match": "exact",
      "location_match": "state_only",
      "dob_match": "unknown"
    },
    "scoring_reasons": [
      "External search candidate (lower trust)",
      "Last name match",
      "Exact first name match",
      "State match (TX)"
    ]
  },
  "candidates": [
    {
      "matched_name": "John Smith",
      "location": "Dallas, TX",
      "obituary_url": "https://example.com/obit/john-smith-dallas",
      "confidence": 0.68,
      "source_trust": "extended"
    }
  ]
}
Example: not_found
{
  "result": "not_found",
  "confidence": 0,
  "review_recommended": false,
  "not_proof_of_life": true,
  "interpretation": "No matching obituary was found in the searched sources for the provided identifiers. This is not proof the person is alive.",
  "negative_result_strength": "moderate",
  "scoring_reasons": ["no_qualifying_candidates"],
  "client_ref": "case-88421",
  "search_scope": {
    "stored_obituaries_checked": true,
    "listing_inventory_checked": true,
    "historical_web_search_checked": true,
    "search_depth": "standard",
    "search_depth_requested": null,
    "search_depth_auto_reason": "stored_coverage_sufficient",
    "years_searched": [2025, 2026],
    "lookback_years_requested": null,
    "lookback_years_applied": null,
    "web_search_status": "completed"
  },
  "external_queries_count": 2,
  "checked_at": "2026-06-08T14:22:11.000Z",
  "match": null,
  "candidates": []
}
Rate limits

Limits are configured per account: per-minute, daily, and monthly quotas. Extended-depth requests also respect a concurrent extended cap and a daily extended quota.

  • 429rate_limited or quota_exceeded
  • 503extended_capacity (retry later)

The verify endpoint returns limit errors in the JSON body. It does not currently emit X-RateLimit-* response headers — track usage in the developer Usage page or your account quotas on Overview.

Error responses

Errors use:

{ "error": { "code": "invalid_request", "message": "…" } }
HTTPcodeWhen
400invalid_requestValidation failure (missing name, missing disambiguator, bad DOB, lookback_years without extended, etc.)
400lookback_exceeds_quotalookback_years exceeds account max_lookback_years
401unauthorizedMissing or invalid API key
403api_access_requiredKey valid but API access not enabled on account
403trial_expiredAPI trial period ended — contact support to continue
429rate_limited / quota_exceededAccount or key quota exceeded
503extended_capacityExtended search concurrency saturated
500internal_errorUnexpected server error

Signed-in developers can test live requests in the test console and review volume charts in Usage.