BYTETOOLS

Paleobiology Database API

Free fossil record API with no key: georeferenced occurrences with taxonomic identification, geological age bounds and collection provenance. Tested example included.

No API key requiredCORS enabledHTTPSFree tier

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
curl 'https://paleobiodb.org/data1.2/occs/list.json?base_name=Tyrannosaurus&show=coords&limit=2'
JavaScript (fetch)
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);
Python (requests)
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())
Response — HTTP 200
{
  "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

ParameterTypeRequiredDescription
base_namequeryOptionalTaxon name including all subtaxa beneath it. Tyrannosaurus
showqueryOptionalComma-separated extra field blocks such as `coords`, `class`, `strat` or `loc`. coords
limitqueryOptionalMaximum records. Broad taxa return tens of thousands without it. 2
intervalqueryOptionalGeological interval name to constrain the age range. Cretaceous
vocabqueryOptionalSet 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

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.