API Docs
API Reference
Base URL: https://api.officialobituary.com. Responses are JSON unless noted,
and dates use YYYY-MM-DD.
Authentication and limits
- Public obituary publish/search endpoints: no API key required.
- Publish rate limit: 3 requests/hour per IP.
- Partner ingest endpoints under
/api/submit: Bearer API key required. - Some moderation/admin routes require admin authorization.
Data Access Boundary
Browse routes are intentionally separated from live/admin workflows. Classified API
responses include X-OfficialObituary-Data-Boundary and
X-OfficialObituary-Data-Contract.
public-browse: browse pages and browse metadata, such as /api/obituaries, /api/obituaries/stats/states, /api/funeral-homes, /api/funeral-homes/stats, /api/funeral-homes/:state, and /api/funeral-homes/:state/:city. live-dynamic: canonical detail and write flows, such as obituary publish/edit, funeral-home profile detail, pricing helpers, reviews, and claim workflows. admin-live: internal operator routes, including outreach pipeline and memorial funnel health endpoints.
POST /api/obituaries/publish
Create and publish a public obituary page.
| Field | Required | Type | Notes |
full_name | Yes | string | Person's name. |
birth_date | Yes | string | YYYY-MM-DD. |
death_date | Yes | string | YYYY-MM-DD. |
life_story | Yes* | string | Primary narrative, min 50 chars. |
death_city | No | string | City of passing. |
death_state | No | string | State code/name. |
service_date | No | string | YYYY-MM-DD. |
service_location | No | string | Service location text. |
photo_url | No | string | Absolute URL. |
survivors | No | string[] or string | Optional survivors list. |
tone | No | string | professional, warm, religious. |
obituary_text | Legacy | string | Legacy fallback if life_story is absent. |
* life_story or legacy obituary_text must be provided.
{
"success": true,
"id": "sN3q5Jt8k1",
"obituary_id": "sN3q5Jt8k1",
"slug": "jordan-lee-1948-2026",
"url": "https://officialobituary.com/obituaries/jordan-lee-1948-2026"
}
GET /api/obituaries
List/search published obituaries with pagination.
| Query | Type | Description |
q | string | Free-text query. |
city | string | City filter. |
state | string | State filter. |
last_name | string | Name filter helper. |
limit | number | Default 20, max 100. |
offset | number | Default 0. |
sort | string | death_date or created_at. |
order | string | asc or desc. |
{
"data": [{ "id": "...", "slug": "...", "full_name": "..." }],
"meta": {
"total": 125,
"limit": 20,
"offset": 0,
"has_more": true
}
}
GET /api/search
Full-text search endpoint with richer snippets and totals.
| Query | Type | Description |
q | string | Required search string. |
city | string | Optional city filter. |
state | string | Optional state filter. |
funeral_home | string | Optional funeral home ID. |
date_from | string | Start death date. |
date_to | string | End death date. |
limit | number | Default 20, max 100. |
offset | number | Default 0. |
{
"results": [{ "id": "...", "slug": "...", "fullName": "...", "snippet": "..." }],
"total": 42,
"query": "smith",
"took": 11,
"meta": {
"limit": 20,
"offset": 0,
"hasMore": true
}
}
GET /api/search/autocomplete
Fast name suggestions.
GET /api/search/autocomplete?q=smi&limit=5
{
"results": [{ "id": "...", "slug": "...", "fullName": "..." }]
}
Other obituary discovery endpoints
| Method | Path | Auth | Response shape |
| GET | /api/obituaries/:id | None | Single obituary object or 404/410 error. |
| GET | /api/obituaries/recent | None | { data: Obituary[] }. |
| GET | /api/obituaries/stats/states | None | { total, states: [{ state, count, cities[] }] }. |
Platform metadata and specs
| Method | Path | Auth | Response shape |
| GET | /health | None | { status, timestamp, uptime }. |
| GET | /openapi.json | None | OpenAPI JSON document. |
| GET | /.well-known/openapi.yaml | None | OpenAPI YAML document. |
| GET | /.well-known/ai-plugin.json | None | AI plugin manifest JSON. |
| GET | /sitemap.xml | None | XML sitemap index. |
| GET | /sitemap-pages.xml | None | XML static-page sitemap. |
| GET | /sitemap-obits-:page.xml | None | XML obituary sitemap page. |
Additional public API groups
AI writer
| Method | Path | Auth | Response shape |
| POST | /api/ai/generate | None | { obituary, wordCount, cost, generatedAt } or 429/5xx error. |
Guestbook
| Method | Path | Auth | Response shape |
| GET | /api/guestbook/:obituary_id | None | { data: GuestbookEntry[] } (approved entries). |
| POST | /api/guestbook | None | { data: GuestbookEntry }, possible 429 for rate limiting. |
Memories
| Method | Path | Auth | Response shape |
| GET | /api/memories/obituary/:id | None | { data: Memory[] } (approved only). |
| POST | /api/memories | None | { data: Memory, status } or validation/rate-limit errors. |
| POST | /api/memories/upload-photo | None | { uploadUrl, key }. |
Funeral homes
| Method | Path | Auth | Response shape |
| GET | /api/funeral-homes | None | { data, meta } list/search. |
| GET | /api/funeral-homes/stats | None | { snapshotType, snapshotVersion, generatedAt, total, stateCount, topCitiesPerStateLimit, states[] }. |
| GET | /api/funeral-homes/:state | None | { state, data, cities, meta }. |
| GET | /api/funeral-homes/:state/:city | None | { state, city, data, meta }. |
| GET | /api/funeral-homes/:state/:city/:slug | None | Profile object with reviews, photos, priceItems. |
| POST | /api/funeral-homes/:id/reviews | None | { success, id } or 429/404. |
Trees and memorial certificates
| Method | Path | Auth | Response shape |
| GET | /api/trees/config | None | { publishableKey }. |
| GET | /api/trees/pricing | None | { tiers[] }. |
| GET | /api/trees/projects | None | { projects[] }. |
| POST | /api/trees/payment-intent | None | { clientSecret, purchaseId, amount, treeCount }. |
| POST | /api/trees/webhook | Stripe | { received: true } or signature error. |
| GET | /api/trees/purchase/:id | None | { purchase } (sensitive fields removed). |
| GET | /api/trees/certificate/:id | None | PNG download by default; ?format=svg or ?format=dataurl also supported. |
| GET | /api/trees/obituary/:obituaryId | None | { purchases, total }. |
Flowers and affiliates
| Method | Path | Auth | Response shape |
| GET | /api/flowers/products | None | { success, products[], count }. |
| GET | /api/flowers/clicks/:obituaryId | None | { success, clicks[], count }. |
| GET | /api/flowers/stats | None | { success, stats }. |
| GET | /api/affiliates/products | None | { products[] }. |
| GET | /api/affiliates/click | None | HTTP 302 redirect to affiliate URL. |
| POST | /api/affiliates/webhook/conversion | Webhook secret | { success: true } or 401. |
Tracking, monitoring, and ingest
| Method | Path | Auth | Response shape |
| POST | /api/track | None | { ok: true }. |
| POST | /api/track/batch | None | { ok: true, logged }. |
| GET | /api/track/stats | Admin bearer token | Analytics object with events/funnel/pages. |
| GET | /api/monitoring/status | None | Health object with memory and sentry flags. |
| GET | /api/monitoring/test-error | None (dev-only behavior) | Throws test error outside production restrictions. |
| POST | /api/submit | Bearer API key | { success, id, slug, url }. |
| POST | /api/submit/batch | Bearer API key | { total, succeeded, failed, results[] }. |
| GET | /api/submit/status/:id | Bearer API key | { id, slug, status, url, views }. |
Back to docs index