Understanding Verify API Documentation

Programmatic death verification via a single REST endpoint. Submit a name and location; receive

found
,
possible_match
, or
not_found
with confidence scoring and source attribution.

What this documents

Public API documentation covers the Death Verification API (POST /api/v1/verify). For county-based daily obituary notice feeds, see County Feed API (GET /api/v1/county-feed/notices) or the product overview.

Professional monitoring integrations (ongoing obituary watches, match alerts, case management) are handled separately from the Verify API. Contact us for professional monitoring workflows.

Endpoint

POST /api/v1/verify

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

See the full reference for request fields, search_depth, and response schema.

Authentication

Include your API key in the Authorization header:

Authorization: Bearer om_live_xxxxxxxx

Keys are issued after API access is provisioned. API-primary customers use the developer portal to create keys and run test requests.

  • Live vs test keys. om_live_ keys hit real data and count against quota. om_test_ (sandbox) keys return deterministic fixtures with no quota, rate limit, or logging — ideal for CI. Sandbox responses include "sandbox": true and an X-Sandbox header; the outcome is keyed off the last-name initial (a–h → found, i–p → possible_match, q–z → not_found).
  • Expiry. Keys can be created with an expiry; expired keys return 401 key_expired.
  • Rotation. Rotating a key issues a replacement and keeps the old key valid for a 24h overlap so you can cut over without downtime.
  • IP allowlist. Optionally restrict a key to specific IPs / CIDR ranges; off-list requests return 403 ip_not_allowed.
Request fields (summary)
FieldRequiredNotes
first_name, last_nameYesSubject name
dob.month, dob.year, dob.dayNoDisambiguation; invalid values return 400. dob.day (requires month+year) enables exact-date matching.
death_dateNoKnown/expected date of death — ISO YYYY-MM-DD/YYYY-MM/YYYY or {year, month?, day?}. A matching death date is a strong disambiguator and can confirm an otherwise-ambiguous common name.
address.city, address.stateNoLocation disambiguator; 2-letter US state recommended. A free-form address.line1 ending in "City, ST" fills a missing city/state.
search_depthNorecent | standard | extended; omit for auto
client_refNoYour correlation id (echoed in response)
freshNotrue bypasses the short web-search cache and forces a live fetch. (Single requests can also send a Cache-Control: no-cache header.) not_found results are never cached, so a newly published obituary is always picked up.
Response: result & confidence
found

Qualifying obituary match with sufficient confidence. Review match.evidence and scoring_reasons before automated action.

possible_match

Partial or ambiguous signal. Treat as a lead — review_recommended is typically true.

not_found

No qualifying obituary in searched scope. Includes not_proof_of_life: true. Absence of an obituary is not evidence the person is alive and is not a government death-registry result.

confidence is a 0–1 score reflecting match strength. negative_result_strength (weak / moderate / strong) applies to not_found only.

confidence_band is a calibrated label over confidence so you can route on a stable value instead of hard-coding thresholds:

  • high — confirmed match; safe for automated action
  • moderate — strong lead; brief human review recommended
  • low — weak/ambiguous; verify before acting
  • nonenot_found (not proof of life)
Accuracy & benchmarks

Internal benchmark, last run June 2026, against a 550-subject set: 500 known decedents drawn at random from our stored index plus 50 synthetic living controls, queried end-to-end through the live production API.

Metricrecent (DB only)standard (DB + web)
Recall (found)89.6%89.8%
Found + possible_match95.6%96.2%
False positives (50 living controls)00

Methodology: recall is measured on subjects with a known obituary in scope; the false-positive rate is measured on living controls that must return not_found. Numbers describe this sample and depth config and are not a contractual guarantee — calibrate confidence_band thresholds to your own risk tolerance. A not_found is never proof of life.

Compliance & acceptable use
  • Not a consumer report. ObitWatch is not a consumer reporting agency and API output is not a consumer report under the FCRA. Do not use it for credit, insurance, employment, or housing eligibility.
  • DPPA / GLBA. Results come from published obituaries and public web sources — no motor-vehicle (DPPA) or nonpublic financial (GLBA) data. You are responsible for lawful use in your jurisdiction.
  • Not proof of life. A not_found is not a government death-registry result and not evidence the person is alive.
  • Retention. Per-request logs (normalized inputs + result, no full payload) power usage/billing; idempotency keys last 24h; the web-search cache is short-lived.

API customers attest to permissible use in the developer portal → Compliance.

Sample curl
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" },
    "client_ref": "case-88421"
  }'
Sample JSON: found
{
  "result": "found",
  "confidence": 0.92,
  "confidence_band": "high",
  "review_recommended": false,
  "client_ref": "case-88421",
  "match": {
    "matched_name": "Margaret Ann Henderson",
    "death_date": "2026-05-12",
    "location": "Austin, TX",
    "obituary_url": "https://example.com/obit/margaret-henderson"
  }
}
Sample JSON: not_found
{
  "result": "not_found",
  "confidence": 0.0,
  "confidence_band": "none",
  "not_proof_of_life": true,
  "interpretation": "No qualifying obituary was found in the searched scope.",
  "negative_result_strength": "moderate",
  "client_ref": "case-88421"
}
Rate limits & headers

Per-account limits: per-minute, daily, and monthly quotas. Extended-depth requests also respect a concurrent extended cap.

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

Every response includes throttle headers so you can pace requests without guessing:

  • X-RateLimit-Limit / X-RateLimit-Remaining / X-RateLimit-Reset — per-minute ceiling, headroom, and reset (unix seconds)
  • X-Quota-Limit / X-Quota-Remaining — monthly allotment (omitted when unlimited)
  • Retry-After — seconds to wait, sent on 429 / 503
Idempotency

Send an Idempotency-Key header (any unique string ≤255 chars) to make retries safe. If a network error leaves you unsure whether a request was charged, retry with the same key:

  • Same key + identical body → the original response is replayed with Idempotent-Replayed: true and no additional quota usage.
  • Same key + different body → 422 idempotency_key_reuse.
  • Keys are retained for 24 hours.
Batch verification

Verify up to 50 people in a single call with POST /api/v1/verify/batch. Send { "items": [ ... ] } where each item is a normal verify request body (including address.county, death_date, and include_survivors — survivors parsing can add about 10 seconds per matched item).

  • Results return in request order, each with its index.
  • Each item is metered individually against your quota.
  • Per-item failures appear as { index, error } instead of failing the whole batch.
  • If a rate/quota limit is hit mid-batch, remaining items return rate_limited and Retry-After is set.

Prefer a UI? The developer portal batch runner uploads a CSV and exports results. Enable Heirs lookup workflow (Beta) for death-record CSVs (county, death date, extended lookback, survivors).

Request log API

Pull your account's verification history with GET /api/v1/requests for reconciliation, auditing, or your own dashboards.

  • Filter by result, search_depth, client_ref, and from/to timestamps.
  • Paginate with limit (max 200) and offset; the response includes pagination.total and has_more.
  • Add format=csv to download the page as CSV.
curl -H "Authorization: Bearer om_live_..." \
  "https://obituarymonitor.com/api/v1/requests?result=found&limit=100"
Monitoring webhooks (watches)

Couldn't confirm a death yet? Register a watch and we'll keep re-verifying on a schedule, then POST a signed webhook the moment an obituary appears — no polling required.

curl -X POST https://obituarymonitor.com/api/v1/watches \
  -H "Authorization: Bearer om_live_..." \
  -H "Content-Type: application/json" \
  -d '{
    "first_name": "Margaret",
    "last_name": "Henderson",
    "address": { "state": "TX" },
    "client_ref": "case-88421",
    "webhook_url": "https://yourapp.com/hooks/obit"
  }'
  • The response includes a one-time secret — store it. Each delivery is signed with X-OM-Signature: t=<ts>,v1=<hmac-sha256> over "<ts>.<body>".
  • On a match we POST { event: "verify.watch.matched", watch_id, client_ref, data } and retry non-2xx responses with backoff.
  • Manage watches with GET/POST /api/v1/watches and GET/DELETE /api/v1/watches/{id}, or from the portal Watches page.
OpenAPI spec

A machine-readable OpenAPI 3.1 description is available for import into Postman, Insomnia, or SDK generators (e.g. openapi-generator).

curl https://obituarymonitor.com/api/v1/openapi.json
Error codes
HTTPcodeWhen
400invalid_requestValidation failure (missing disambiguator, bad DOB, etc.)
400lookback_exceeds_quotalookback_years exceeds account max_lookback_years
401unauthorizedMissing or invalid API key
403api_access_requiredAPI access disabled on account
403trial_expiredAPI trial expired
429rate_limited / quota_exceededQuota exceeded
503extended_capacityExtended search concurrency saturated
500internal_errorUnexpected server error

Full error table and examples in the API reference.

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

Need API access?

Request a Sandbox trial. We review volume and use case, then provision keys and developer portal access.