Geneanet APIgeneanet.org ↗
Search Geneanet individuals, retrieve family profiles with birth/death events and relationships, look up surname origins, and query cemetery records via a single API.
What is the Geneanet API?
The Geneanet API provides 4 endpoints for querying genealogical data from Geneanet.org, one of the largest family history databases in Europe. Use search_individuals to find people by surname across millions of contributed records, then drill into any result with get_individual_profile to retrieve life events, parents, spouses, siblings, and children. Surname geographic distribution and cemetery lookups are also available.
curl -X GET 'https://api.parse.bot/scraper/ed77ac7b-ac0a-4014-8489-10e20a9badfb/search_individuals?page=1&size=5&year=1800&place=Paris&lastname=Dupont&firstname=Jean&collection=archives' \ -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 geneanet-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: Geneanet SDK — genealogical search, profiles, and surname distribution."""
from parse_apis.geneanet_api import Geneanet, Collection, ProfileNotFound
client = Geneanet()
# Search for individuals by surname, bounded iteration
for person in client.individualsummaries.search(lastname="Dupont", firstname="Jean", limit=3):
print(person.full_name, person.profile_url)
# Drill into one result's detailed profile
summary = client.individualsummaries.search(lastname="Martin", limit=1).first()
if summary:
detail = summary.details()
print(detail.full_name, detail.life_summary)
for member in detail.family.spouses_and_children:
print(member.name, member.link)
# Look up surname geographic distribution
try:
surname = client.surnames.get(surname="Dupont")
print(surname.surname, surname.description)
for place_count in surname.distribution_by_place[:5]:
print(place_count.place, place_count.total)
except ProfileNotFound as exc:
print(f"Surname not found: {exc}")
# Search cemetery records
for record in client.individualsummaries.search_cemeteries(lastname="Dupont", limit=3):
print(record.full_name, record.description)
print("exercised: individualsummaries.search / details / surnames.get / search_cemeteries")
Full-text search for individuals across Geneanet collections by surname. Supports optional filtering by first name, year, place, and collection type. Returns paginated results; each item carries a profile_url for drill-down via get_individual_profile. Pagination is page-based with configurable page size.
| Param | Type | Description |
|---|---|---|
| page | integer | Page number for pagination. |
| size | integer | Number of results per page. |
| year | string | Year of birth, marriage, or death to filter by (4-digit year). |
| place | string | Location to filter results. |
| lastnamerequired | string | Last name to search for. |
| firstname | string | First name to filter results. |
| collection | string | Collection to search within. |
{
"type": "object",
"fields": {
"page": "integer current page number",
"results": "array of individual summary objects with full_name, profile_url, and description",
"total_count": "integer total number of matching records"
},
"sample": {
"data": {
"page": 1,
"results": [
{
"full_name": "DUPONT Guillaume",
"description": "DUPONT Guillaume | Spouse: LEMESRE Antoinette (1675) | Family tree of dewulf | Birth 1635 | Tourcoing, Nord, France",
"profile_url": "https://gw.geneanet.org/dewulf?n=dupont&oc=1&p=guillaume&type=fiche"
}
],
"total_count": 3246380
},
"status": "success"
}
}About the Geneanet API
Individual Search and Profile Retrieval
The search_individuals endpoint accepts a required lastname parameter plus optional filters including firstname, year, place, and collection. Results are paginated (page, size) and each item in the results array exposes a full_name, description, and a profile_url that serves as the key for the next call. The total_count field tells you how many records match before you page through them.
Passing a profile_url from search results to get_individual_profile returns a single record with a life_summary array (covering events like birth, death, and occupation) and a family object. The family object contains three arrays — parents, spouses_and_children, and siblings — where each element carries a name and a link for further look-up. One HTTP call is required per individual.
Surname Origin and Cemetery Records
get_last_name_origin takes a single lastname and returns a distribution_by_place array of objects, each with a place string and a total integer showing how frequently that surname appears in records from that location. A description field provides etymology text when the site has it for the queried name; it may be empty otherwise.
search_cemeteries mirrors the response shape of search_individuals — the same page, results, and total_count fields — but scopes results to grave and monument records in Geneanet's cemetery collection. Each result again includes a profile_url that can be passed to get_individual_profile for full relationship and event data.
The Geneanet API is a managed, monitored endpoint for geneanet.org — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when geneanet.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 geneanet.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?+
- Building a family tree tool that resolves ancestor records by surname and birth year using
search_individuals - Aggregating life event timelines (birth, death, occupation) from
get_individual_profilefor genealogical research apps - Mapping surname frequency across historical regions using
distribution_by_placefromget_last_name_origin - Locating grave records for a specific surname via
search_cemeteriesto support memorial or heritage projects - Cross-referencing sibling and parent links from
get_individual_profileto reconstruct multi-generation family graphs - Providing surname etymology and geographic spread to users of a surname-origin lookup tool
- Bulk-resolving a list of profile URLs to structured family data for offline genealogy databases
| 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 Geneanet have an official developer API?+
What does `get_individual_profile` return beyond basic name and dates?+
life_summary array of strings covering events such as birth, death, and occupation, plus a structured family object with three arrays: parents, spouses_and_children, and siblings. Each family member entry includes a name and a link that can be passed back to get_individual_profile for further traversal.Can I filter `search_individuals` results by a specific collection or location?+
collection parameter to scope the search and an optional place parameter to filter by location. You can also combine these with firstname and year (4-digit) to narrow results. Results are paginated via page and size parameters, and total_count is returned so you know how many pages exist.Does `search_cemeteries` support the same filtering options as `search_individuals`?+
search_cemeteries only accepts lastname as an input parameter. Filtering by firstname, year, or place is not exposed on that endpoint. You can fork this API on Parse and revise it to add those filter parameters to the cemetery search endpoint.