Daily County Intelligence
Daily County Intelligence remembers where you left off. Each pull returns only new notices for counties you enroll in the developer portal. This is a feed of recent deaths — not a person lookup or death-registry API. An empty result means nothing new has arrived.
GET /api/v1/county-feed/notices
Production URL: https://api.obituarymonitor.com/api/v1/county-feed/notices
Authenticate with Authorization: Bearer om_live_YOUR_KEY. Counties and delivery options are configured in the developer dashboard.
Call GET /api/v1/county-feed/notices with your API key. Daily County Intelligence remembers your position automatically. Poll once or twice daily; if data is empty, your feed is up to date.
Sign up for Daily County Intelligence and create your own API keys in the developer portal. Optional limit: Daily County Intelligence allows 1–1000 per pull (default 500). Daily National Intelligence clamps the pull to 1–500 (default 50). Date-range and position parameters are under Advanced below.
curl -sS \ -H "Authorization: Bearer om_live_YOUR_KEY" \ "https://api.obituarymonitor.com/api/v1/county-feed/notices"
GET https://api.obituarymonitor.com/api/v1/county-feed/notices Authorization: Bearer om_live_YOUR_KEY
{
"data": [
{
"id": "fh-88421",
"full_name": "Margaret Ann Henderson",
"first_name": "Margaret",
"middle_name": "Ann",
"last_name": "Henderson",
"date_of_death": "2026-05-12",
"county": "Jefferson",
"state": "AL",
"city": "Birmingham",
"obituary_url": "https://example.com/obit/margaret-henderson",
"funeral_home_name": "Example Funeral Home",
"source_type": "funeral_home",
"indexed_at": "2026-05-13T08:22:00.000Z",
"text_snippet": "Margaret Ann Henderson, 84, of Birmingham, passed away on May 12, 2026. She is survived by her son James Henderson and daughter Sarah Henderson.",
"survivors_text": "her son James Henderson and daughter Sarah Henderson",
"survivors": [
{ "name": "James Henderson", "relationship": "son", "degree_of_kinship": "1st", "location": null },
{ "name": "Sarah Henderson", "relationship": "daughter", "degree_of_kinship": "1st", "location": null }
],
"survivors_status": "ok",
"survivors_source": "snippet",
"property_intelligence": {
"product": "estate_property_intelligence",
"property": {
"address": "100 Example Ave, Birmingham, AL 35203",
"parcel_id": "01-23-45-678"
}
},
"property_match": true,
"property_address": "100 Example Ave, Birmingham, AL 35203",
"property_parcel_id": "01-23-45-678"
},
{
"id": "fh-88422",
"full_name": "Stephen M. Czajka",
"date_of_death": "2026-08-24",
"county": "Palm Beach",
"state": "FL",
"obituary_url": "https://example.com/obit/stephen-czajka",
"source_type": "funeral_home",
"indexed_at": "2026-08-25T02:22:00.000Z",
"property_lead": {
"candidateId": "pc-example",
"decedentName": "Stephen M. Czajka",
"situsAddress": "1768 CALICO RD",
"situsCity": "WEST PALM BEACH",
"situsState": "FL",
"score": 75,
"confidenceLabel": "Moderate",
"status": "pending_verification",
"sourceName": "FL DOH EHWATER Parcels — Palm Beach County"
}
}
],
"pagination": {
"limit": 500,
"has_more": false,
"next_since": "2026-05-13T08:22:00.000Z",
"next_cursor": "v1.eyJrIjoibGl2ZSIsInQiOiIyMDI2LTA1LTEzVDA4OjIyOjAwLjAwMFoiLCJpZCI6ImZoLTg4NDIxIn0"
},
"counties": [
{ "state": "AL", "county_slug": "jefferson-county-al", "county_name": "Jefferson" }
]
}After each successful pull, open the developer Daily County Intelligence dashboard. Under Recent pulls (24h), re-download the JSON or click Family Extraction (when enabled). Progress and CSV download appear on the same row. Pulls larger than 100 notices extract the first 100 only.
For automations only. Requires the feature to be enabled on your account. Pass include_survivors=true (limit ≤ 100). Notices return immediately; poll the job or download the enriched CSV when complete. Prefer the portal Family Extraction flow for interactive use.
GET https://api.obituarymonitor.com/api/v1/county-feed/notices?limit=25 Authorization: Bearer om_live_YOUR_KEY
{
"data": [
{
"id": "fh-88421",
"full_name": "Margaret Ann Henderson",
"survivors": [
{ "name": "James Henderson", "relationship": "son", "degree_of_kinship": "1st", "location": null }
],
"survivors_status": "ok",
"survivors_source": "snippet"
}
],
"pagination": {
"limit": 25,
"has_more": false,
"next_since": "2026-05-13T08:22:00.000Z",
"next_cursor": "v1.eyJrIjoibGl2ZSIsInQiOiIyMDI2LTA1LTEzVDA4OjIyOjAwLjAwMFoiLCJpZCI6ImZoLTg4NDIxIn0"
},
"counties": [
{ "state": "AL", "county_slug": "jefferson-county-al", "county_name": "Jefferson" }
]
}Each notice carries biographical_profile: captured work, military service, education and places from the obituary. Pass include_profile=false to omit it. Notice detail and CSV exports include it too. CSV occupation and military columns include a value only when that field's own evidence is supported. Family columns, such as profile_children_count, are filled only for notices whose family text you can see. A CSV lookup failure shows profile_status as error. Included in your plan at no additional cost, within its coverage.
profile_statusisready,pending,unavailableorskipped(no biographical details in the text). Whenpending, request the notice again later; there is no webhook.- An occupation's
evidencecites that occupation. A supported occupation quote does not verify education, places,business_owner, or family counts. Military service has its own evidence. A veteran, branch, or era stored without a checked quote — including every current row, which is onlyveteran,branches, anderas— isuncertain(citation_not_gradedorno_quote). That is captured, not verified.supportedrequires a checked quote that attributes the service to the deceased. A non-empty quote is not enough when it describes a relative, a memorial line, or no service at all. The portal shows ungraded service as "Captured, not verified" and does not present it as confirmed. CSV veteran, branch, and era columns stay blank unless the value is supported. Education and places are captured fields and have no evidence status. - Where evidence is present,
statusissupported(a quoted sentence states that field),uncertain,explicit_negative, ornot_mentioned. familyappears only whenfamily_accessisincluded, which follows your existing family-access rules. Otherwise quotes that name relatives are withheld.- If the profile lookup fails, the notice is still delivered with
{"profile_status": null, "profile_error": "profile_lookup_failed"}.
"biographical_profile": {
"profile_status": "ready",
"profile_version": 4,
"last_refresh_error": null,
"family_access": "omitted",
"occupations": [{
"title": "teacher",
"employer": "Austin ISD",
"retired": true,
"profession_ids": ["teacher"],
"profession_labels": ["Teacher"],
"evidence": { "status": "supported", "quote": "She taught at Austin ISD for 31 years.", "flags": [] }
}],
"military": {
"veteran": { "status": "supported", "quote": "He served in the U.S. Army during Vietnam.", "flags": [] },
"branches": [{ "value": "Army", "status": "supported", "quote": "...", "flags": [] }],
"eras": [{ "value": "Vietnam War", "status": "supported", "quote": "...", "flags": [] }]
},
"education": [{ "school": "University of Texas", "level": "bachelor", "year": 1971 }],
"places": { "birthplace": { "city": "Waco", "state": "TX" }, "residence": { "city": "Austin", "state": "TX" } }
}Optional from and to (ISO-8601), or lookback=24h, return notices in a past window. This does not change where your normal feed left off.
Responses may include pagination.next_cursor and pagination.next_since. You do not need these for the default bare GET. Pass cursor= only if you manage position yourself (does not move the server-managed feed position). Legacy since= remains supported for existing integrations. When has_more is true, continue with cursor=next_cursor (or legacy since=next_since) until the page is drained.
| Field | Description |
|---|---|
| id | Stable notice identifier |
| full_name | Display name from the source |
| first_name | Parsed first name when available |
| middle_name | Parsed middle name or initial when available |
| last_name | Parsed last name when available |
| date_of_death | YYYY-MM-DD when available |
| county | County name |
| state | Two-letter state code |
| city | City when available |
| obituary_url | Link to the obituary listing |
| funeral_home_name | Funeral home or newspaper publisher |
| source_type | funeral_home or newspaper |
| indexed_at | ISO timestamp when we first captured the notice |
| text_snippet | Short obituary excerpt when available |
| survivors_text | Best-effort survivors/family excerpt when available |
| survivors_job | Present only when include_survivors=true (advanced automation) — async enrichment job metadata |
| property_intelligence | Confirmed estate property match when a deliverable snapshot exists (entitled accounts) |
| property_lead | Plausible unconfirmed situs already on file — never implies ownership (entitled accounts) |
Notices must pass recency filters:
- Date of death within the last 30 days
- Date of death within 14 days of first capture (excludes historical backfill)
Absence from the feed is not proof of life. Sources include funeral homes and newspapers we monitor daily in enrolled counties.
Regional
Enroll geography → pull notices → optional survivor jobs / CSV.
National
Search/pull notices → Family Extraction (batch or single notice) → pending → poll survivors/updates → names when ready. See the full contract below.
- Pull or filter with
GET https://api.obituarymonitor.com/api/v1/county-feed/notices(optionalstate,county_slug,q). Never debits tokens. - Fetch one notice with
GET …/notices/{id}. May enqueue preparation; never debits. - Request Family Extraction with
POST …/family-extractions/batch(up to 50) or the single-notice pathPOST …/notices/{id}/family-extraction— the only token-authorization actions (same service as Family Explorer). - Poll
GET …/survivors/updates(or batch / request status) until terminal readiness, then unlock again (idempotent) or GET detail for names.
GET https://api.obituarymonitor.com/api/v1/county-feed/notices?state=NY&limit=50 Authorization: Bearer om_live_YOUR_KEY
{
"data": [
{
"id": "aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaa1",
"full_name": "Jane Example",
"state": "NY",
"county": "Albany",
"obituary_url": "https://example.com/obit/jane",
"survivors": [],
"survivors_status": "pending_text",
"survivors_count": 0,
"survivors_access": "request_required"
}
],
"pagination": { "limit": 50, "has_more": false, "next_since": null, "next_cursor": null },
"counties": [],
"meta": { "family_extraction_tokens": { "balance": 500, "debited_this_request": 0 } }
}meta.family_extraction_tokens.debited_this_request is always 0 on GET. Locked notices report survivors_access: request_required with empty survivors.
GET https://api.obituarymonitor.com/api/v1/county-feed/notices/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaa1 Authorization: Bearer om_live_YOUR_KEY
{
"data": {
"id": "aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaa1",
"full_name": "Jane Example",
"state": "NY",
"county": "Albany",
"obituary_url": "https://example.com/obit/jane",
"first_seen": "2026-09-20T12:00:00.000Z",
"survivors": [],
"survivors_status": "pending_extract",
"survivors_count": 2,
"survivors_access": "request_required",
"survivors_updated_at": null
},
"meta": { "family_extraction_tokens": { "balance": 500, "debited_this_request": 0 } }
}Unsettled national interest may enqueue demand. Still no token debit on GET.
https://api.obituarymonitor.com/api/v1/county-feed. Prefer the batch endpoint below for multiple notices.POST https://api.obituarymonitor.com/api/v1/county-feed/notices/aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaa1/family-extraction Authorization: Bearer om_live_YOUR_KEY
Pending (no debit yet)
{
"result": "pending",
"customer_status": "pending_extract",
"survivors": [],
"enqueued": true,
"pending_created": true
}Ready + charged once
{
"result": "ready",
"customer_status": "ready",
"already_requested": false,
"newly_debited": true,
"balance_after": 499,
"survivors": [
{ "name": "John Example", "relationship": "son" }
]
}Repeat unlock (idempotent — no second charge)
{
"result": "ready",
"customer_status": "ready",
"already_requested": true,
"newly_debited": false,
"balance_after": 499,
"survivors": [
{ "name": "John Example", "relationship": "son" }
]
}Source that cannot be extracted
{
"result": "unsupported_source",
"customer_status": "unavailable",
"survivors": [],
"reason": "newspaper_source_unsupported"
}POST …/family-extractions/batch registers up to 50 single-notice Family Extraction requests in one call. Same service as POST …/notices/{id}/family-extraction — not a separate product.- Max 50 unique
notice_idvalues per request (empty_batch/batch_too_large/duplicate_notice_id→ 400). - Idempotency-Key required — same key + same items replays; same key + different payload → 409
idempotency_key_reused. - Partial 200 — HTTP 200 on successful registration even when some items are rejected; inspect
items[].error. - Item-weighted writes — each item costs one write unit; 429 responses include
X-RateLimit-Policy: write. - No sync extract — the batch only registers requests; poll
GET …/family-extractions/batches/{batch_id}or per-itemrequest_idfor status (read-only, no names).
curl -sS -X POST "https://api.obituarymonitor.com/api/v1/county-feed/family-extractions/batch" \
-H "Authorization: Bearer om_live_YOUR_KEY" \
-H "Idempotency-Key: batch-2026-09-25-001" \
-H "Content-Type: application/json" \
-d '{
"items": [
{ "notice_id": "aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaa1" },
{ "notice_id": "bbbbbbbb-bbbb-4bbb-8bbb-bbbbbbbbbbb2" }
]
}'POST https://api.obituarymonitor.com/api/v1/county-feed/family-extractions/batch
Authorization: Bearer om_live_YOUR_KEY
Idempotency-Key: batch-2026-09-25-001
Content-Type: application/json
{
"items": [
{ "notice_id": "aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaa1" },
{ "notice_id": "bbbbbbbb-bbbb-4bbb-8bbb-bbbbbbbbbbb2" }
]
}Partial success (HTTP 200)
{
"batch_id": "batch_cccccccc-cccc-4ccc-8ccc-cccccccccccc",
"submission_status": "completed",
"submitted": 2,
"accepted": 1,
"rejected": 1,
"created_at": "2026-09-25T12:00:00.000Z",
"updated_at": "2026-09-25T12:00:01.000Z",
"completed_at": "2026-09-25T12:00:01.000Z",
"items": [
{
"position": 0,
"notice_id": "aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaa1",
"request_id": "req_dddddddd-dddd-4ddd-8ddd-dddddddddddd",
"status": "pending_extract",
"token_status": "not_charged",
"error": null
},
{
"position": 1,
"notice_id": "bbbbbbbb-bbbb-4bbb-8bbb-bbbbbbbbbbb2",
"request_id": null,
"status": null,
"token_status": "not_charged",
"error": {
"code": "unsupported_source",
"message": "Family Extraction is unavailable for this source."
}
}
]
}Poll batch status (read-only)
GET https://api.obituarymonitor.com/api/v1/county-feed/family-extractions/batches/batch_cccccccc-cccc-4ccc-8ccc-cccccccccccc Authorization: Bearer om_live_YOUR_KEY
const BASE = "https://api.obituarymonitor.com/api/v1/county-feed";
const headers = {
Authorization: `Bearer ${API_KEY}`,
"Idempotency-Key": "batch-2026-09-25-001",
"Content-Type": "application/json",
};
// Max 50 unique notice_ids. HTTP 200 includes partial success — check items[].error.
const batch = await fetch(`${BASE}/family-extractions/batch`, {
method: "POST",
headers,
body: JSON.stringify({
items: noticeIds.map((notice_id) => ({ notice_id })),
}),
}).then(async (r) => {
if (r.status === 429) throw new Error("write rate limit — check X-RateLimit-Policy: write");
if (r.status === 409) throw new Error("idempotency_key_reused with a different payload");
if (!r.ok) throw new Error(`batch failed: ${r.status}`);
return r.json(); // 200 even when some items were rejected
});
// Read-only poll — no side effects, no names
const status = await fetch(
`${BASE}/family-extractions/batches/${batch.batch_id}`,
{ headers: { Authorization: headers.Authorization } }
).then((r) => r.json());source_type: "funeral_home"— full lifecycle: unlock, pending, settle, names.source_type: "newspaper"— reported assurvivors_status: "unavailable"withsurvivors_unsupported_reason. An unlock returnsunsupported_source: nothing is queued, no pending request is created, and no token is authorized.
A newspaper notice that already carries a settled result keeps serving it — support is withheld for new extraction work, not for data that already exists.
An explicit Family Extraction request is a billable action and is queued ahead of background warming, including trial warm-ahead. Browsing and watch-list traffic stay below it, so paging through search results never displaces someone else's readiness work.
- Explicit Family Extraction request — highest priority. A published completion target will follow once real queue execution has been measured; we are not quoting a time from queue position alone.
- Watch-list and detail interest — best effort, deliberately no SLA.
- Daily caps — each account has a daily ceiling on unlocks and on background interest. Exceeding it returns no queued work rather than degrading extraction for everyone.
| Value | Meaning |
|---|---|
pending_text | Waiting for usable obituary text. No debit. |
pending_extract | Text present; extraction in progress. No debit. |
available | Settled outcome exists; names withheld until unlock (Explorer / customer_status). API pipeline may show ok / none_found with request_required. |
ready | Names released (or paid none_found). Debit already applied if metered. |
unavailable | Terminal failure. No permanent debit (credits reverse any charge). |
Public list/detail use pipeline statuses: pending_text, pending_extract, ok, none_found, unavailable. Unlock responses use customer statuses including available / ready.
- Not charged: GET pull, GET detail, GET survivors/updates; pending unlock interest; unavailable; unmetered accounts.
- Debited once: first successful unlock when settlement is billable (
okwith named family members, ornone_found). - Not charged again: idempotent unlock when already entitled (
already: true,newly_debited: false). - Credited: terminal failure after a debit — compensating reversal; no permanent charge.
- Never charged: a source that does not support extraction (
unsupported_source) — no queue entry and no authorization. - There is no wallet reservation while pending — interest is recorded, debit happens only at settle.
GET https://api.obituarymonitor.com/api/v1/county-feed/survivors/updates?survivors_updated_since=2026-09-20T00:00:00.000Z&limit=100 Authorization: Bearer om_live_YOUR_KEY
{
"data": [
{
"notice_id": "aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaa1",
"survivors_status": "ok",
"settlement_revision": 1,
"survivors_updated_at": "2026-09-20T14:02:00.000Z"
}
],
"meta": {
"next_since": "2026-09-20T14:02:00.000Z",
"after_notice_id": "aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaa1",
"has_more": false,
"family_extraction_tokens": { "balance": 499 }
}
}- Start ~5 seconds after unlock; exponential backoff up to ~60 seconds.
- Terminal:
ok,none_found, orunavailable*— then stop polling that notice. - Pause when your process is idle; do not full-scan US inventory.
const BASE = "https://api.obituarymonitor.com/api/v1/county-feed";
const headers = { Authorization: `Bearer ${API_KEY}` };
// 1) Pull / filter — never debits tokens
const list = await fetch(`${BASE}/notices?state=NY&limit=50`, { headers }).then((r) => r.json());
// 2) Request Family Extraction — may return pending_* without charging
const extraction = await fetch(`${BASE}/notices/${noticeId}/family-extraction`, {
method: "POST",
headers,
}).then((r) => r.json());
// 3) Poll readiness — never debits; start ~5s, backoff to ~60s, stop on terminal
let since = new Date().toISOString();
for (let attempt = 0; attempt < 40; attempt++) {
const delay = Math.min(5000 * 1.5 ** attempt, 60_000);
await new Promise((r) => setTimeout(r, delay));
const updates = await fetch(
`${BASE}/survivors/updates?survivors_updated_since=${encodeURIComponent(since)}&limit=100`,
{ headers }
).then((r) => r.json());
const hit = updates.data?.find((u) => u.notice_id === noticeId);
if (hit && (hit.survivors_status === "ok" || hit.survivors_status === "none_found"
|| String(hit.survivors_status).startsWith("unavailable"))) {
// 4) Re-request (idempotent) or GET detail to receive names if entitled
const done = await fetch(`${BASE}/notices/${noticeId}/family-extraction`, {
method: "POST",
headers,
}).then((r) => r.json());
break;
}
if (updates.meta?.next_since) since = updates.meta.next_since;
}Accounts with coverage_mode=national authorize US geography without county enrollment. A watch list only sets digests and portal defaults. Trial warm SLA does not apply. Machine-readable paths: /api/v1/county-feed/openapi.json.
API pull — poll on your schedule (this endpoint).
Email digest — daily or weekly summary to configured recipients.
CSV archive — daily file of the previous calendar day (America/Chicago), downloadable from the dashboard for 30 days. Estate Property Match accounts also get property address and related listing/map URL columns.
| Code | HTTP | Meaning |
|---|---|---|
| unauthorized | 401 | Missing, invalid, or revoked API key. |
| key_expired | 401 | The API key has passed its expiration date. |
| county_feed_access_required | 403 | Daily County Intelligence is not enabled on this account. |
| delivery_mode_email_only | 403 | API pull is disabled — account is configured for email digest delivery only. |
| survivors_not_enabled | 403 | Structured survivors enrichment is not enabled for this account. |
| survivors_limit_exceeded | 400 | include_survivors=true requires limit <= 100. |
| internal_error | 500 | Unexpected server error. |
Errors return { "error": { "code", "message" } }. An empty data array with HTTP 200 is not an error.
To match existing names or case records to obituaries with confidence scoring, use the Death Verification API (POST /api/v1/verify) — a separate product.
Product overview and use cases: Daily County Intelligence