· 12 min read
BillionGraves Scraper: 47 Data Fields, Up to 1,000 Free Results/Month
BillionGraves Scraper returns grave records with full name, birth and death dates, and GPS coordinates from over 71 million crowd-sourced entries. You can target 10 different collections, including the Social Security Death Index and US Veteran Burial Records, to retrieve military branch, rank, and unit data. Every record includes the sourceUrl and frequently a thumbnailUrl of the headstone. This tool provides data for projects requiring burial locations and military service history. It is not for anyone who needs contact details for living family members, as the records do not include them.
Try it: open BillionGraves Scraper on Apify, sign in on the free plan and run the prefilled example.
Can you try BillionGraves Scraper before paying?
Yes. Apify's free plan includes $5.00 of prepaid usage every month and asks for no credit card. At $0.005 per result, that covers up to 1,000 results of BillionGraves Scraper a month, before run-start charges and platform usage.
The example request further down caps maxItems at 30, so a first run returns at most 30 results and costs at most $0.15 in result charges. That is enough to see the real shape of the data before deciding anything.
BillionGraves Scraper was last updated on 2026-08-10. It is one of 1,724 Actors CrawlerBros publishes on Apify, which together have 700,263 lifetime public runs and an average rating of 4.63 out of 5 across 416 reviews.
What does it cost to run BillionGraves Scraper?
Each result costs $0.005 on Apify's free plan, which is $5.00 per 1,000 results. Starting a run is charged separately at $0.005 per GB of Actor memory. Apify also bills the platform usage each run consumes, at the rates of your Apify plan, on top of these charges.
| Apify plan | Per result | Per 1,000 results |
|---|---|---|
| FREE | $0.005 | $5.00 |
| BRONZE | $0.00433 | $4.33 |
| SILVER | $0.00367 | $3.67 |
| GOLD | $0.003 | $3.00 |
| PLATINUM | $0.003 | $3.00 |
| DIAMOND | $0.003 | $3.00 |
The maxItems control has the largest effect on the bill because result charges are applied per dataset item. To see whether a specific search yields the correct data before running a larger query, use the example input cap of 30 items, which costs at most $0.15 in result charges.
How do you run BillionGraves Scraper from the API?
The schema marks 1 of its 15 controls as required: mode. Every value in the payload below comes from the published schema's own prefills, which means you can paste it, swap the token, and get a real result.
Call the synchronous endpoint to start a run and receive dataset items in one request:
curl -X POST "https://api.apify.com/v2/acts/crawlerbros~billiongraves-scraper/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"mode":"search","familyNames":"Smith","collectionId":"1","maxItems":30}'
The same run from Python, using the official client:
from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run_input = {
"mode": "search",
"familyNames": "Smith",
"collectionId": "1",
"maxItems": 30
}
run = client.actor("crawlerbros~billiongraves-scraper").call(run_input=run_input)
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item)
And from Node.js:
import { ApifyClient } from 'apify-client'
const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' })
const input = {
"mode": "search",
"familyNames": "Smith",
"collectionId": "1",
"maxItems": 30
}
const run = await client.actor('crawlerbros~billiongraves-scraper').call(input)
const { items } = await client.dataset(run.defaultDatasetId).listItems()
console.log(items)
That endpoint blocks until the run completes. Fine while you are testing a handful of records, risky once a run takes minutes: a dropped connection loses the response even though the run itself finished. Switch to an asynchronous start with polling or a webhook before you schedule anything.
Which BillionGraves Scraper inputs matter, and which can you skip?
The mode control is the most important setting, determining whether the Actor searches by name, finds cemetery IDs, or browses a full cemetery roster. Most users should start with mode set to "search" and only use "searchCemeteries" to resolve a name to the numeric cemeteryId required for the "byCemetery" mode.
mode(string): What to fetch. Default:"search".familyNames(string): Surname to search for, e.g.Smith. Default:"Smith".collectionId(string): Which BillionGraves-hosted collection to search. Default:"1".maxItems(integer): Hard cap on emitted records. Note: very large cemeteries (100,000+ photographed graves) can take longer per page inbyCemeterymode. Default:30.givenNames(string): First/given name to search for, e.g.John.maidenNames(string): Maiden name to search for.birthYearMin(integer): Drop records with a known birth year before this.birthYearMax(integer): Drop records with a known birth year after this.deathYearMin(integer): Drop records with a known death year before this.deathYearMax(integer): Drop records with a known death year after this.state(string): Restrict to graves (or cemeteries) in this state/province/region, e.g.Texas,Ontario,Scotland.country(string): Restrict to graves (or cemeteries) in this country, e.g.United States,United Kingdom,Canada.
The other 3 controls, with their defaults, are listed in the input schema on BillionGraves Scraper on Apify.
Fixed-choice controls: mode accepts search (Search by name), byCemetery (Browse a cemetery by ID), searchCemeteries (Search cemeteries by name); collectionId accepts 10 values (default 1), including 1 (BillionGraves GPS Headstones (photographed graves with GPS coordinates)), 2 (United States Veteran Burial Records), 3 (Social Security Death Index (SSDI)), 4 (BillionGraves Burial Records).
What does BillionGraves Scraper return?
The records provide metadata for historical research and family mapping, including maidenNames and cemeteryRadiusMeters. GPS coordinates are only populated for the GPS Headstones collection, so records from the SSDI or obituary sources will lack latitude and longitude.
recordId,sourceUrl,thumbnailUrlfullName,givenNames,familyNames,maidenNamesbirthDate,deathDate,marriageDatecity,county,state,countrycemeteryId,cemeteryName,cemeteryUrllatitude,longitude(GPS Headstones collection)militaryBranch,militaryRank,militaryConflict,militaryUnit(Veteran records)collectionId,collectionTitlecreatedAtrecordType,scrapedAtcemeteryId,cemeteryName,cemeteryUrlrecordCount,mediaCount,curatorCountlatitude,longitude,cemeteryRadiusMetersaddress,city,county,state,country,postalCodewebsite,descriptionrecordType,scrapedAt
These are the documented fields. Optional ones can be empty on a given record, so measure how often each field your deliverable depends on is populated across a real sample before automating the handoff.
How do you build the workflow end to end?
Open BillionGraves Scraper and work through these in order. Each step ends with something to check, so a bad configuration surfaces on a small run rather than a scheduled one.
- Set the mode control to "search" to begin a broad investigation by individual name, then confirm that the output contains the
recordIdandfullNamefields. - Provide a surname in the
familyNamesfield and optionalgivenNamesto narrow the scope of the search. - Select a specific record collection by setting
collectionIdto "1" for GPS Headstones or "2" for United States Veteran Burial Records. - Apply
birthYearMinanddeathYearMaxto filter out records that fall outside your historical window of interest. - Run the Actor with
maxItemsset to 30 to confirm that thestateandcountryfields in the output match your target region. - Switch
modeto "searchCemeteries" and enter acemeteryNameQueryif you need to find the numericcemeteryIdfor a specific site. - Use
mode"byCemetery" with a validcemeteryIdto pull the complete photographed roster for that specific location. - Download the dataset and verify the presence of
latitudeandlongitudefor any records in the GPS Headstones collection.
How do you apply it? Three worked playbooks
These are BillionGraves Scraper's own documented use cases, each worked through as an operating pattern rather than a description.
Use case 1: Genealogy research
Outcome: Find ancestors' burial locations, dates, and GPS coordinates
Configure: Set mode to "search", familyNames to the target surname, and birthYearMin to 1800.
Working method: Start with a broad surname lookup and use the birthYearMin and deathYearMax filters to isolate specific individuals. Look for matching cemeteryId values across different records to identify family burial plots.
Deliverable: A dataset containing full name, birth/death dates, and precise GPS coordinates for headstone photo records.
Stop condition: The search results stop matching the familyNames and year range filters.
Use case 2: Military history
Outcome: Trace a veteran's service branch, rank, and conflict from their grave record
Configure: Set mode to "search" and collectionId to "2".
Working method: Restrict the search to the United States Veteran Burial Records collection and filter by a specific state to narrow regional results. Extract the military-specific fields from the resulting dataset.
Deliverable: A file containing militaryBranch, militaryRank, and militaryConflict data for the identified veterans.
Stop condition: The collectionId in the output no longer matches the requested military collection.
Use case 3: Cemetery documentation
Outcome: Export a full photographed cemetery's roster
Configure: Set mode to "byCemetery" and enter a numeric cemeteryId.
Working method: Retrieve the target numeric ID using the "searchCemeteries" mode first, then input that ID to fetch every photographed record in a single run. Adjust the maxItems limit based on the known recordCount.
Deliverable: A complete roster of every indexed headstone within the specified cemetery boundary including cemeteryUrl.
Stop condition: The run times out repeatedly on a cemetery larger than 100,000 records.
What breaks, and how do you design around it?
When targeting cemeteries with over 100,000 records, the "byCemetery" mode can experience timeouts because the source takes 30-60 seconds to paginate. If you encounter these errors, try using narrower search filters like specific familyNames to retrieve data in smaller segments.
When should you not use BillionGraves Scraper?
Do not use this Actor if you require official government records for documentation, as the database is crowd-sourced and depends on volunteer uploads. If your project involves researching real estate or vacant land properties instead of cemetery records, the Land Century Scraper provides property-specific details like acreage and zoning. For mapping electric vehicle charging infrastructure rather than burial sites, use the PlugShare EV Charging Station Scraper. If you need to monitor modern social media activity where individuals are tagged in photos, the Instagram Tagged Posts Scraper is the appropriate choice. This scraper is also not suitable for projects requiring full verification from vital record offices.
What should you check before trusting the output?
- Verify that
latitudeis non-null for records wherecollectionIdis "1", as other collections do not include GPS data. - Check the
collectionTitlefield to ensure the results align with the specific record collection selected in the inputs. - Monitor the ratio of records with missing
sourceUrlvalues, noting that roughly 1 in 5 older, crowd-sourced records may have been removed. - Ensure the
birthDateanddeathDatefields are within the bounds specified by thebirthYearMinanddeathYearMaxinput filters. - Alert if the
byCemeterymode returns a504status code, which can occur when BillionGraves servers aggregate rosters for cemeteries with over 100,000 records.
None of this proves a record is correct. It gives a scheduled BillionGraves Scraper run defined points where it should stop instead of quietly passing bad data downstream.
Frequently asked questions
What is the cost for 5,000 results on the free plan?
On Apify's free plan, up to 1,000 results are covered by the included $5.00 of monthly usage. Beyond that, results cost $0.005 each. Therefore, 5,000 results would incur $20.00 in additional result charges after the initial 1,000 results, plus run-start and platform usage fees. Apify's free plan includes $5.00 of monthly usage with no credit card.
Are GPS coordinates included for every grave record?
No, latitude and longitude are only available for the BillionGraves GPS Headstones collection where volunteers used a mobile app to take photos. Records from the Social Security Death Index, obituary collections, or other indexed documents typically lack GPS data. The collectionId field identifies the source for each record.
Why does the Actor stop before reaching my maxItems limit?
BillionGraves' own search ranks by relevance rather than filtering strictly. The Actor re-checks your familyNames and year filters for every item to ensure the data is accurate. If the source API begins returning results that do not match your surname or year filters, the Actor stops early rather than writing irrelevant records to your dataset.
Do I need an account or special credentials to use this?
No. This Actor accesses the public BillionGraves search API which does not require a login, account, or cookies. It allows you to search across 10 collections and browse cemeteries without any authentication steps from the user side.
How do I handle timeouts for very large national cemeteries?
Cemeteries with over 100,000 records sometimes cause the source servers to time out. The Actor includes automatic retries, but if it continues to fail, use the "search" mode with specific surnames or years instead of trying to export the entire cemetery roster in one run.
Where to go next
When you are ready to run it, open BillionGraves Scraper on Apify; the free plan covers up to 1,000 results a month.
Other Actors we maintain for related data:
- PlugShare EV Charging Station Scraper: Scrape PlugShare's crowd-sourced EV charging station map - user check-ins, reviews, ratings, live outlet-availability status, PlugScore, and user photos, alongside station address, connectors, network, and pricing.
- Land Century Scraper: Scrape LandCentury.com vacant land and cheap house listings across the USA.
- Instagram Tagged Posts Scraper: Extracts posts where a specific Instagram user is tagged by others.
Resources
Actor documentation, input schema, and pricing: verified against the published Actor on 2026-09-29.
Actor last updated by its maintainers on 2026-08-10.
Run outcome figures cover the 30 day public window ending 2026-09-29.
Featured actors
BillionGraves Scraper
Scrape BillionGraves.com - 71M+ crowd-sourced GPS-tagged grave photos plus Veteran, SSDI, and other genealogy record collections. Search by name across 10 record collections, or browse every record photographed in a specific cemetery.
Run on Apify ↗