GBIF Species Occurrence Scraper — Biodiversity Records
Pricing
Pay per event
GBIF Species Occurrence Scraper — Biodiversity Records
Search GBIF's 3B+ record global biodiversity index by species name, country, year, or dataset and export clean rows — full taxonomy, event date, coordinates, basis of record, and dataset provenance — as JSON, CSV, or Excel.
Pricing
Pay per event
Rating
0.0
(0)
Developer
DevilScrapes
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
9 hours ago
Last modified
Categories
Share
🎯 What this scrapes
GBIF (the Global Biodiversity Information Facility) aggregates species occurrence records from museums, herbaria, citizen-science apps and government surveys into one searchable index of over three billion records. Its raw API is generous and keyless, but it forces callers to look up an internal taxonKey before they can filter by species, and most occurrence records are sparse — a huge share of optional fields are simply absent on any given row. This Actor resolves a plain species name to that taxon key for you, then returns fully flattened, typed rows so a distribution map, an ESG nature-risk screen, or a species checklist lands straight in a spreadsheet.
🔥 What we handle for you
resolves a species name to GBIF's internal taxon key automatically pages past sparse, deeply nested records into one clean flat row each stops cleanly at GBIF's ~100 000-record offset ceiling instead of erroring into it retries transient 429/5xx responses with backoff instead of failing the whole run
💡 Use cases
- Build a species distribution map from georeferenced occurrence records.
- Screen a project site or supply chain footprint for nearby protected or at-risk species (ESG / nature-risk analysis).
- Assemble a country or region species checklist for an environmental impact assessment.
- Track how observation records for a species change year over year across citizen-science and museum datasets.
⚙️ How to use it
- Click Try for free at the top of the page.
- Type a species name (or leave the default) — most other fields have sensible defaults.
- Click Start. Output streams into the run's dataset.
- Export from Storage → Dataset as JSON, CSV, or Excel — or fetch via the API.
📥 Input
| Field | Type | Required | Default | Notes |
|---|---|---|---|---|
scientificName | string | no | 'Puma concolor' | Species name to resolve to a GBIF taxon key. Takes priority over taxonKey. |
taxonKey | integer | no | — | Raw GBIF taxon key, used only when scientificName is empty. |
query | string | no | — | Free-text search across occurrence records. |
countryCode | string | no | — | Restrict to one ISO-3166-1 alpha-2 country code, e.g. US. |
yearFrom / yearTo | integer | no | — | Only occurrences recorded within this year range. |
hasCoordinate | boolean | no | True | Restrict to georeferenced records. |
basisOfRecord | string | no | — | Restrict to one basis-of-record type, e.g. HUMAN_OBSERVATION. |
datasetKey | string | no | — | Restrict to one GBIF publisher dataset (UUID). |
maxResults | integer | no | 100 | Stop after this many occurrences. Each row is one billed result. |
proxyConfiguration | object | no | {"useApifyProxy": false} | GBIF is a public API and does not need a proxy. |
Example input
{"scientificName": "Puma concolor","hasCoordinate": true,"maxResults": 3,"proxyConfiguration": {"useApifyProxy": false}}
📤 Output
Every row is one dataset item.
| Field | Type | Notes |
|---|---|---|
occurrence_key | integer | GBIF occurrence identifier. |
scientific_name | string | Scientific name as recorded. |
accepted_scientific_name | string | GBIF's accepted taxon name. |
taxon_rank | string | Taxonomic rank, e.g. SPECIES. |
kingdom / phylum / class_ / order / family / genus / species | string | Full classification. |
event_date / year / month / day | string / integer | When the occurrence was recorded. |
country / country_code | string | Where the occurrence was recorded. |
locality / state_province | string | Finer-grained location detail. |
decimal_latitude / decimal_longitude | number | Coordinates in decimal degrees. |
coordinate_uncertainty_m | number | Coordinate uncertainty, in metres. |
elevation_m / depth_m | number | Elevation / depth, in metres. |
basis_of_record | string | How the occurrence was recorded. |
dataset_name / dataset_key | string | Publishing dataset. |
publishing_org_key | string | GBIF publishing organization UUID. |
institution_code / collection_code / catalog_number | string | Specimen/record provenance. |
recorded_by / identified_by | string | Who recorded/identified the occurrence. |
license | string | Data license, e.g. CC_BY_4_0. |
issues | array | GBIF data-quality issue flags. |
Example output
{"occurrence_key": 5938145577,"scientific_name": "Puma concolor (Linnaeus, 1771)","taxon_rank": "SPECIES","kingdom": "Animalia","class_": "Mammalia","family": "Felidae","genus": "Puma","species": "Puma concolor","year": 2026,"month": 1,"day": 2,"country": "United States of America","country_code": "US","state_province": "Oregon","decimal_latitude": 44.59237,"decimal_longitude": -121.27005,"basis_of_record": "HUMAN_OBSERVATION","dataset_name": "iNaturalist research-grade observations","license": "http://creativecommons.org/licenses/by-nc/4.0/legalcode","issues": ["CONTINENT_DERIVED_FROM_COORDINATES", "TAXON_ID_NOT_FOUND"]}
💰 Pricing
Pay-Per-Event — you pay only when these events fire:
| Event | USD | What it is |
|---|---|---|
actor-start | $0.05 | One-off warm-up charge per run |
result | $0.002 | Per dataset item |
Example: 1 000 results at the rates above ≈ $2.05. No subscription, no minimum, no card to start — Apify gives every new account $5 of free credit.
🚧 Limitations
- Live search results only — this Actor does not use GBIF's asynchronous bulk Darwin Core Archive download.
- No media/image download — occurrence records may reference photos, but files are not fetched or mirrored.
- GBIF's search API caps how deep any single search can page (~100 000 records); narrow by country, year, or basis of record to reach records beyond that.
❓ FAQ
Do I need an API key?
No. GBIF is free and keyless — no account, no auth header, no signup.
What if my species name doesn't match?
The Actor logs the resolved taxon and rank so you can verify the match. If GBIF can't resolve a name at all, the Actor falls back to an unfiltered-by-taxon search rather than silently returning nothing.
Why are so many fields empty?
GBIF occurrence records are contributed by thousands of independent institutions with wildly varying completeness — a museum specimen from 1950 rarely has GPS coordinates, for example. Every field is nullable by design; this Actor never fabricates a value GBIF didn't report.
💬 Your feedback
Spotted a bug, hit a weird edge case, or need a new field? Open an issue on the Actor's Issues tab on Apify Console — we ship fixes weekly and we read every report.