FamilySearch APIfamilysearch.org ↗
Search over a billion ancestor profiles on FamilySearch. Query records by surname, birth year, and place. List all genealogy collections with metadata.
What is the FamilySearch API?
The FamilySearch API exposes 2 endpoints for querying genealogy records and collections from one of the largest publicly available ancestry databases, which contains over a billion submitted family tree profiles. The search_records endpoint accepts surname, given name, birth year, and birth place filters, returning person records with family relationships, dates, and source collection. The list_collections endpoint returns metadata for every available collection including data quality ratings.
curl -X GET 'https://api.parse.bot/scraper/f0d068b6-38a8-488f-aca6-e8e0565f351e/search_records?count=5&offset=0&surname=Smith&birth_year=1850&given_name=John&birth_place=England' \ -H 'X-API-Key: $PARSE_API_KEY'
Typed, relational, agent-ready
A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.
- Fully typed · autocompletes
- Objects link to objects
- Typed errors & pagination
Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:
uv add parse-sdk uv run parse init uv run parse add --marketplace familysearch-org-api
uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.
"""Walkthrough: FamilySearch Genealogies SDK — search ancestors, browse collections."""
from parse_apis.familysearch_org_api import FamilySearch, NotFoundError
client = FamilySearch()
# Search genealogy records by surname and given name
for record in client.records.search(surname="Smith", given_name="John", limit=3):
print(record.name, record.birth_date, record.birth_place)
# Narrow search with birth place filter
record = client.records.search(
surname="Johnson", given_name="Mary", birth_place="England", birth_year="1850", limit=1
).first()
if record:
print(record.name, record.gender, record.birth_date, record.birth_place)
print("Spouses:", record.spouses)
print("Children:", record.children)
# List all available genealogy collections
for coll in client.collections.list(limit=5):
print(coll.title, coll.data_quality, coll.modified)
# Handle typed errors
try:
results = client.records.search(surname="Xyzzyplugh99", limit=1).first()
print("Found:", results.name if results else "No results")
except NotFoundError as exc:
print(f"Search failed: {exc}")
print("exercised: records.search / collections.list")
Search genealogy records by surname and optional filters. Returns paginated person records from FamilySearch's shared genealogies database, which includes submitted family trees from multiple collections (Pedigree Resource File, Ancestral File, IGI, Oral Genealogies, etc.). Each result includes the person's name, gender, birth/death dates and places, and related family members (spouses, parents, children). Results are ordered by relevance.
| Param | Type | Description |
|---|---|---|
| count | integer | Number of results per page (max 100). |
| offset | integer | Offset for pagination (0-based). |
| surnamerequired | string | Last name / surname to search for. |
| birth_year | string | Birth year to filter by (4-digit year, e.g. 1850). |
| given_name | string | First name / given name to search for. |
| birth_place | string | Place of birth to filter by (city, county, state, province, or country). |
{
"type": "object",
"fields": {
"count": "integer",
"offset": "integer",
"records": "array of person records with id, name, gender, birth_date, birth_place, death_date, death_place, collection, spouses, parents, children",
"total_results": "integer"
},
"sample": {
"data": {
"count": 2,
"offset": 0,
"records": [
{
"id": "ark:/61903/2:4:62LH-DWMZ",
"name": "John Smith",
"gender": "Male",
"parents": [],
"spouses": [
"Esther Smith"
],
"children": [
"Nakonu Smith",
"James Smith",
"Betty Smith"
],
"birth_date": "about 1877",
"collection": "Entry for John Smith, \"Africa, Oral Genealogy, 1500-2022\"",
"death_date": "",
"birth_place": "Taye Town, District #2, Grand Bassa, Liberia",
"death_place": ""
},
{
"id": "M94T-YLG",
"name": "Mary Maria Johnson",
"gender": "Female",
"parents": [],
"spouses": [],
"children": [],
"birth_date": "about 1848",
"collection": "Partner Trees",
"death_date": "",
"birth_place": "Audley, Staffordshire, England, United Kingdom",
"death_place": ""
}
],
"total_results": 1088160
},
"status": "success"
}
}About the FamilySearch API
Searching Genealogy Records
The search_records endpoint takes a required surname parameter and accepts optional filters for given_name, birth_year, and birth_place. Results are paginated via offset and count (up to 100 per page), and the response includes total_results so you can iterate through large result sets. Each person record carries id, name, gender, birth_date, birth_place, death_date, death_place, collection, plus arrays for spouses, parents, and children — giving you enough relational context to reconstruct family units without additional lookups.
Collections and Data Quality
The list_collections endpoint requires no parameters and returns all available genealogy collections with fields including id, title, description, persistent_id, data_quality, created, and modified. Named collections include the Pedigree Resource File, Ancestral File, International Genealogical Index (IGI), and Oral Genealogies. The data_quality field is particularly useful when you need to assess the reliability of records before relying on them in downstream applications.
Coverage and Scope
Records span multiple contributed collections, so coverage varies by region, time period, and contributor. The birth_place parameter accepts city, county, state, province, or country — giving you geographic granularity when searching. Since data originates from submitted family trees across different collections, the same individual may appear in multiple records with varying levels of detail.
The FamilySearch API is a managed, monitored endpoint for familysearch.org — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when familysearch.org changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.
This isn't an official familysearch.org API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Build a surname distribution tool using
birth_placefield data across paginatedsearch_recordsresults - Cross-reference submitted family trees by querying
spousesandparentsarrays to map multi-generational lineages - Filter records by
birth_yearandbirth_placeto study migration patterns for a specific ethnic or regional group - Enumerate all collections via
list_collectionsand surfacedata_qualityratings to guide users toward higher-confidence sources - Aggregate
death_dateanddeath_placefields to build historical mortality datasets by geography - Index ancestor profiles by
collectionfield to compare data coverage across Pedigree Resource File vs. IGI records - Build a family reunion tool that reconstructs family units using
children,parents, andspousesrelationship arrays
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 100 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
One credit = one API call regardless of which marketplace API you call. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does FamilySearch have an official developer API?+
What does the `search_records` endpoint return for each person?+
id, name, gender, birth_date, birth_place, death_date, death_place, and collection. It also includes arrays for spouses, parents, and children, allowing you to trace family relationships directly from a single search result.Can I retrieve a specific person's full record by their FamilySearch ID?+
list_collections. You can fork it on Parse and revise to add an endpoint that fetches a person record by a specific id.How does pagination work in `search_records`?+
offset (0-based) and count (max 100). The response always includes total_results, so you can calculate how many pages exist and walk through results programmatically using repeated calls with incremented offset values.