How it will work: 3 steps
- Follow us on ApifyThe tool is built and waits in the queue for the Apify Store. Apify is the cloud platform where our tools run.
- Paste your input and press StartNo code needed: you fill in a form (the input). It already has a working example. For example:
[]in Record licenses. Each start is one run. - Download the resultsWhen the run ends, the results are in a table (the dataset). Open Output, press Export and pick Excel or CSV. JSON and the API are there too.
This tool is an Apify Actor: a small program that runs on Apify. You can also run it on a schedule, for example every Monday. New to it? Read how it works, step by step and the 8 words you need first.
What it does
Search biodiversity observations from GBIF by species, country, area, year and record license. Get up to 1,000 records with published coordinates, taxonomy, dataset titles and publisher attribution. No GBIF account or API key is needed.
Who uses it
Ecologists and students
Explore where a species was recorded.
GIS users
Prepare points for a map.
Data teams
Check reuse licenses before you use records.
Price
Prices will be shown after release.
Questions
Do I need a GBIF account?
No. The tool uses public search endpoints.
Does a species search include subspecies?
Yes. A taxon includes its child taxa.
Is this a full GBIF download?
No. It is a limited live search of up to 1,000 records.
Why are some points missing?
Publishers may hide or blur sensitive places.
Can I use every record commercially?
No. The default allows CC BY-NC too. Use commercialUseOnly:true for CC0 and CC BY, and follow attribution and source terms.
Why are coordinates missing or less precise?
Publishers may omit or generalize sensitive locations. Check coordinateUncertaintyInMeters, informationWithheld and dataGeneralizations.
Is this a full download or a live monitor?
It is a limited live search. It has no download DOI, baseline or only-new mode. Dataset DOI and citation are included when available.
Details
Step by step on Apify
- Open Input.
- Keep the form example:
Panthera leo, years 2020–2025, coordinates enabled, 50 records. - Set a maximum run cost in Apify if you want a money limit.
- Click Start.
- Open Dataset → Occurrences. Use Attribution to check the dataset, publisher and license.
- Open Key-value store → RUN_SUMMARY to check the status and counts.
Use cases
| Task | Input | Fields to use |
|---|---|---|
| Explore species records | taxonName or taxonKey | gbifID, taxonomy, eventDate |
| Prepare a map input | country, bbox, hasCoordinate:true | WGS84 coordinates and uncertainty |
| Check reuse licenses | commercialUseOnly or licenses | license, publisher, dataset citation |
Tips for better results
- Use an exact scientific name or a taxon key.
- Turn on the commercial use setting to keep only CC0 and CC BY records.
- Check the uncertainty column before you trust a point.
Limits and good to know
- Maximum 1000 records and 8 search pages per run. GBIF search allows an offset plus result limit up to 100000
- Each new dataset and publisher in the results needs metadata requests. A broad search whose records come from many dozens of datasets can reach the 100-request limit before 1000 records; the run then stops with
REQUEST_LIMITand keeps the records already saved. Narrow the taxon, area or years, or continue withnextOffset - The source can change between pages or runs. An offset continuation is not a frozen snapshot
- At most 100 source requests including metadata and retries, 8 MiB per response, 24 MiB of downloaded responses, and 2 MiB of normalized output per run
- Source work stops after 120 seconds, or 15 seconds before the platform deadline, whichever comes first. A larger Apify timeout does not increase this source-work budget
- Requests are sequential, about one per second, with limited retries and
Retry-Aftersupport. GBIF has no guaranteed search query rate - Invalid metadata, schema changes, rate-limit exhaustion and source outages fail honestly. Records saved before a later error remain available
- Country and bounding box use published, interpreted locations. Null or generalized coordinates can limit map use. The Actor does not recover hidden coordinates
Troubleshooting
| Problem | Likely reason | What to do |
|---|---|---|
AMBIGUOUS_TAXON | One name has several exact matches | Read taxonMatch.candidates, clear taxonName, and set the right taxonKey. |
TAXON_NOT_EXACT | Match is fuzzy or at a higher rank | Use a precise scientific name or numeric key. |
TAXON_NOT_FOUND or NO_MATCHES | Name not found, or valid filters have no records | Check the name, year, country and license filters. |
CHARGE_LIMIT | The next record does not fit your budget | Read saved rows, then raise the cost limit or request fewer records. |
OFFSET_LIMIT / invalid range | Offset plus requested limit exceeds 100000 | Reduce offset or narrow your search. |
DEADLINE, PAGE_LIMIT, REQUEST_LIMIT, byte limits | Work exceeds the run's fixed safety budget | Narrow the search or request fewer records. |
SOURCE_* | Provider failure or unexpected response | Keep saved rows. Retry later with a small request. |
| Null coordinates | Coordinates are absent in the public record | Set hasCoordinate:true; check uncertainty and withheld notices. |
For developers
Sample result
One result from a real test run, in JSON. Real values change from run to run. In Excel or CSV each field is a column.
{
"gbifID": "5006926565",
"scientificName": "Panthera leo melanochaita (C.E.H.Smith, 1858)",
"taxonKey": 5219411,
"rank": "SUBSPECIES",
"decimalLatitude": -2.637562,
"decimalLongitude": 34.715044,
"coordinateUncertaintyInMeters": 31434,
"eventDate": "2025-01-02T13:53:58",
"country": "Tanzania, United Republic of",
"countryCode": "TZ",
"basisOfRecord": "HUMAN_OBSERVATION",
"datasetTitle": "iNaturalist Research-grade Observations",
"publisher": "iNaturalist.org",
"license": "http://creativecommons.org/licenses/by-nc/4.0/legalcode",
"informationWithheld": "Coordinate uncertainty increased to 31434m to protect threatened taxon",
"occurrenceUrl": "https://www.gbif.org/occurrence/5006926565"
}Data fields (40)
| Field | Type | Meaning |
|---|---|---|
gbifID | string | Stable GBIF occurrence ID as text. |
provider | string | Data provider: GBIF. |
sourceUrl | string | GBIF occurrence API record URL. |
occurrenceUrl | string | GBIF occurrence page URL. |
fetchedAt | string | UTC time when this row was normalized. |
key | number | Stable GBIF occurrence ID as a safe integer. |
scientificName | string | Interpreted scientific name including authorship. |
rank | string | Interpreted taxon rank. |
eventDate | string | Observation date as supplied by GBIF; may include time or a date interval. |
country | string | Country name of the observation. |
countryCode | string | ISO alpha-2 country code. |
basisOfRecord | string | Record type, for example HUMAN_OBSERVATION or PRESERVED_SPECIMEN. |
occurrenceStatus | string | PRESENT or ABSENT if the source supplies it; neither is inferred. |
datasetKey | string | UUID of the source dataset. |
datasetTitle | string | Current title from the GBIF dataset registry. |
datasetUrl | string | GBIF dataset page for attribution. |
datasetDoi | string | Dataset DOI where available; not a DOI for this search. |
datasetCitation | string | Citation provided by the dataset registry. |
publisher | string | Publishing organization title from the GBIF registry. |
publishingOrgKey | string | UUID of the publishing organization. |
license | string | License URL of this record, which can differ from the dataset license. |
recordedBy | string | Observer/collector exactly as published; no personal enrichment. |
sourceUpdatedAt | string | GBIF lastInterpreted timestamp; not the date of the observation. |
informationWithheld | string | Source notice about hidden sensitive information. |
dataGeneralizations | string | Source notice about generalization of sensitive data. |
kingdom | string | Interpreted kingdom name; null when missing. |
phylum | string | Interpreted phylum name; null when missing. |
class | string | Interpreted class name; null when missing. |
order | string | Interpreted order name; null when missing. |
family | string | Interpreted family name; null when missing. |
genus | string | Interpreted genus name; null when missing. |
species | string | Interpreted species name; null when missing. |
taxonKey | number | GBIF backbone taxon key assigned to this record. |
decimalLatitude | number | Published WGS84 latitude in degrees; null when unavailable. |
decimalLongitude | number | Published WGS84 longitude in degrees; null when unavailable. |
coordinateUncertaintyInMeters | number | Published horizontal uncertainty in metres; zero is preserved. |
year | number | Observation year as an integer when supplied. |
issues | array | GBIF quality/interpretation flags. |
latitude | number | Same published WGS84 latitude as decimalLatitude; compatibility alias. |
longitude | number | Same published WGS84 longitude as decimalLongitude; compatibility alias. |
Input settings (11)
The main fields of the input form. With the API you send them as JSON.
| Setting | Name in the API | Type | Example value |
|---|---|---|---|
| Scientific name | taxonName | string | "Panthera leo" |
| GBIF taxon key | taxonKey | integer | |
| Country code | country | string | |
| Bounding box | bbox | array | |
| First year | yearFrom | integer | 2020 |
| Last year | yearTo | integer | 2025 |
| Coordinate filter | hasCoordinate | boolean | true |
| Record licenses | licenses | array | [] |
| Commercial-use licenses only | commercialUseOnly | boolean | false |
| Maximum results | maxResults | integer | 50 |
| Start offset | offset | integer | 0 |
