Paleobiology Database API
Free fossil record API with no key: georeferenced occurrences with taxonomic identification, geological age bounds and collection provenance. Tested example included.
Endpoint tested and returned HTTP 200 on 2026-08-21
What is the Paleobiology Database API?
The Paleobiology Database publishes fossil occurrence records through an open API with no key. Each occurrence returns its taxonomic identification, the geological interval it comes from with early and late age bounds in millions of years, coordinates and a literature reference.
This is the primary research database for the fossil record, compiled by palaeontologists from the published literature since the 1990s and underpinning a large share of quantitative palaeobiology. It is fully open — no key, no registration — and the API is designed for programmatic use rather than being a scraped website.
The field naming is the barrier, and it is worth learning rather than fighting. Everything is compressed: `oid` is the occurrence, `tna` the taxonomic name, `eag` and `lag` the early and late age bounds in millions of years, `cid` the collection, `rid` the literature reference. Adding `vocab=pbdb` to any request swaps these for readable names at the cost of a larger payload. Two things to note: coordinates come back as strings and need parsing, and `idn` appears when the original identification was qualified — `cf. Tyrannosaurus rex` means the palaeontologist was not certain, which matters for any analysis of occurrence counts.
Quick facts
- Base URL
https://paleobiodb.org/data1.2- Authentication
- No API key and no registration. The database asks that publications citing it acknowledge the project.
- Rate limit
- No published limit. Broad queries are expensive — constrain them with `limit` and taxonomic or temporal filters.
- Pricing
- Free. An academic project supported by research funding.
- CORS
- Enabled — callable directly from browser JavaScript
- Official docs
- Read the docs
How to use the Paleobiology Database API
Every request below was executed against the live API on 2026-08-21, and the response shown is the real body it returned — not an illustration.
1. Fetch fossil occurrences for a taxon
GET https://paleobiodb.org/data1.2/occs/list.json?base_name=Tyrannosaurus&show=coords&limit=2
curl 'https://paleobiodb.org/data1.2/occs/list.json?base_name=Tyrannosaurus&show=coords&limit=2'const res = await fetch("https://paleobiodb.org/data1.2/occs/list.json?base_name=Tyrannosaurus&show=coords&limit=2");
if (!res.ok) throw new Error(`Request failed: ${res.status}`);
const data = await res.json();
console.log(data);import requests
res = requests.get("https://paleobiodb.org/data1.2/occs/list.json?base_name=Tyrannosaurus&show=coords&limit=2", timeout=20)
res.raise_for_status()
print(res.json()){
"elapsed_time": 0.00162,
"records": [
{
"oid": "occ:139292",
"eid": "rei:22878",
"cid": "col:11917",
"tna": "Tyrannosaurus rex",
"rnk": 3,
"tid": "txn:54833",
"oei": "Late Maastrichtian",
"eag": 72.2,
"lag": 66,
"rid": "ref:4218",
"lng": "-113.028900",
"lat": "51.906399"
},
{
"oid": "occ:139293",
"cid": "col:11918",
"idn": "cf. Tyrannosaurus rex",
"tna": "Tyrannosaurus rex",
"rnk": 3,
"tid": "txn:54833",
"oei": "Late Maastrichtian",
"eag": 72.2,
"lag": 66,
"rid": "ref:4205",
"lng": "-113.233330",
"lat": "51.933334"
}
]
}Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
base_name | query | Optional | Taxon name including all subtaxa beneath it. Tyrannosaurus |
show | query | Optional | Comma-separated extra field blocks such as `coords`, `class`, `strat` or `loc`. coords |
limit | query | Optional | Maximum records. Broad taxa return tens of thousands without it. 2 |
interval | query | Optional | Geological interval name to constrain the age range. Cretaceous |
vocab | query | Optional | Set to `pbdb` for readable field names instead of the compressed three-letter codes. pbdb |
Response fields
recordsarray- Matching fossil occurrences.
records[].oidstring- Occurrence identifier, prefixed `occ:`.
records[].tnastring- Accepted taxonomic name for the occurrence.
records[].idnstring- Identification as originally published, present only when qualified — `cf. Tyrannosaurus rex` signals uncertainty.
records[].tid / rnkstring / integer- Taxon identifier and its rank as a numeric code, where 3 is species.
records[].eag / lagfloat- Early and late age bounds in millions of years. A fossil is dated to a range, never a point.
records[].oeistring- Named geological interval, such as `Late Maastrichtian`.
records[].lng / latstring- Coordinates as strings — parse before mapping. These are present-day positions, not palaeocoordinates.
records[].cidstring- Collection identifier, prefixed `col:`. Occurrences from one dig share a collection.
records[].ridstring- Literature reference identifier, prefixed `ref:`, resolvable to the publication.
records[].eidstring- Reidentification record, present when a specimen has been formally reassigned.
elapsed_timefloat- Server-side query time in seconds.
What you can build with the Paleobiology Database API
- Map fossil localities for a genus or family
- Analyse taxonomic diversity through a geological interval
- Trace a specimen back to its original publication via the reference id
- Build teaching material from real palaeontological records
Common errors and how to fix them
Unreadable field names
The default vocabulary uses compressed three-letter codes.
Fix: Add `vocab=pbdb` for readable names, accepting a larger payload in exchange.
Coordinates will not plot
`lng` and `lat` are strings.
Fix: Parse to float first. They are also modern positions, not palaeocoordinates for the fossil's own era.
Occurrence counts overstated
`idn` entries with `cf.` or `aff.` are uncertain identifications.
Fix: Decide explicitly whether to include qualified identifications, and say which you did in any published analysis.
Query times out
A broad `base_name` can match tens of thousands of records.
Fix: Set `limit`, narrow the taxon, or constrain with `interval`.
Paleobiology Database API — frequently asked questions
Is the Paleobiology Database API free?
Yes, free with no key or registration. It is an academic project, and it asks that publications using the data acknowledge it.
What do eag and lag mean?
Early and late age bounds in millions of years. Fossils are dated to a stratigraphic range rather than a point, so every occurrence has two bounds rather than one age.
Why are the field names so cryptic?
The default vocabulary is compressed to keep large responses small. Adding `vocab=pbdb` to any request returns readable field names instead.
What does `cf.` in front of a name mean?
It marks a qualified identification — the palaeontologist thought it was probably that species but was not certain. It appears in the `idn` field, and whether to count such records is a real methodological choice.
Tools that pair with this API
Coordinate Converter
Convert GPS coordinates between decimal degrees, degrees-minutes-seconds and decimal minutes instantly. Paste any format like 40°26'46"N and copy the result.
CSV Column Statistics Calculator
Profile a CSV column by column: type, blanks, distinct values, min, max, mean, median, standard deviation and percentiles, plus top values — all in-browser.
GeoJSON Validator
Validate GeoJSON against RFC 7946 and get the exact JSON path of every problem: unclosed rings, swapped coordinates, missing properties and more.
Paleobiology Database is an independent third-party service and is not affiliated with ByteTools or ByteVancer. Details on this page were verified on 2026-08-21; always check the official documentation before relying on this API in production, as terms and limits can change.