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.

Endpoint

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.

How it works

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.

Example request
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
Example response
{
  "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" }
  ]
}
Family Extraction (portal)

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.

Advanced: include_survivors

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" }
  ]
}
Biographical profile

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_status is ready, pending, unavailable or skipped (no biographical details in the text). When pending, request the notice again later; there is no webhook.
  • An occupation's evidence cites 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 only veteran, branches, and eras — is uncertain (citation_not_graded or no_quote). That is captured, not verified. supported requires 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, status is supported (a quoted sentence states that field), uncertain, explicit_negative, or not_mentioned.
  • family appears only when family_access is included, 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" } }
}
Retrieve notices by date

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.

Advanced: feed position

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.

Response fields
FieldDescription
idStable notice identifier
full_nameDisplay name from the source
first_nameParsed first name when available
middle_nameParsed middle name or initial when available
last_nameParsed last name when available
date_of_deathYYYY-MM-DD when available
countyCounty name
stateTwo-letter state code
cityCity when available
obituary_urlLink to the obituary listing
funeral_home_nameFuneral home or newspaper publisher
source_typefuneral_home or newspaper
indexed_atISO timestamp when we first captured the notice
text_snippetShort obituary excerpt when available
survivors_textBest-effort survivors/family excerpt when available
survivors_jobPresent only when include_survivors=true (advanced automation) — async enrichment job metadata
property_intelligenceConfirmed estate property match when a deliverable snapshot exists (entitled accounts)
property_leadPlausible unconfirmed situs already on file — never implies ownership (entitled accounts)
Coverage rules

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 vs National

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.

National coverage lifecycle
coverage_mode = national
Search/pull notices → POST Family Extraction (batch or single notice) → observe pending → poll updates → receive names when ready. Watch lists only set digests and workbench defaults — they never limit API entitlement.
  1. Pull or filter with GET https://api.obituarymonitor.com/api/v1/county-feed/notices (optional state, county_slug, q). Never debits tokens.
  2. Fetch one notice with GET …/notices/{id}. May enqueue preparation; never debits.
  3. Request Family Extraction with POST …/family-extractions/batch (up to 50) or the single-notice path POST …/notices/{id}/family-extraction — the only token-authorization actions (same service as Family Explorer).
  4. Poll GET …/survivors/updates (or batch / request status) until terminal readiness, then unlock again (idempotent) or GET detail for names.
1. Pull / filter national notices
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.

2. GET notice detail
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.

3. Single-notice Family Extraction
POST …/notices/{id}/family-extraction for one notice. Base URL: 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"
}
3b. Family Extraction batch
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_id values 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-item request_id for 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());
Which sources support Family Extraction
Funeral-home notices only. Newspaper notices appear in the feed but cannot be queued for extraction.
  • source_type: "funeral_home" — full lifecycle: unlock, pending, settle, names.
  • source_type: "newspaper" — reported as survivors_status: "unavailable" with survivors_unsupported_reason. An unlock returns unsupported_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.

Prioritization and limits

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.
Statuses you will see
ValueMeaning
pending_textWaiting for usable obituary text. No debit.
pending_extractText present; extraction in progress. No debit.
availableSettled outcome exists; names withheld until unlock (Explorer / customer_status). API pipeline may show ok / none_found with request_required.
readyNames released (or paid none_found). Debit already applied if metered.
unavailableTerminal 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.

When tokens are charged
  • Not charged: GET pull, GET detail, GET survivors/updates; pending unlock interest; unavailable; unmetered accounts.
  • Debited once: first successful unlock when settlement is billable (ok with named family members, or none_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.
4. Poll survivors/updates
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, or unavailable* — 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;
}
National coverage notes

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.

Delivery alternatives

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.

Error codes
CodeHTTPMeaning
unauthorized401Missing, invalid, or revoked API key.
key_expired401The API key has passed its expiration date.
county_feed_access_required403Daily County Intelligence is not enabled on this account.
delivery_mode_email_only403API pull is disabled — account is configured for email digest delivery only.
survivors_not_enabled403Structured survivors enrichment is not enabled for this account.
survivors_limit_exceeded400include_survivors=true requires limit <= 100.
internal_error500Unexpected server error.

Errors return { "error": { "code", "message" } }. An empty data array with HTTP 200 is not an error.

Related products

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