# GBIF Plant Occurrence Records - CC0 Georeferenced (`nexgensignal/gbif-plant-occurrence-records`) Actor

GBIF georeferenced plant-kingdom occurrences released under CC0 1.0 as clean per-record data - taxonomy, decimal coordinates, locality and dates. Collector/identifier names excluded. 100k accessible slice of ~76M. $0.05 per record.

- **URL**: https://apify.com/nexgensignal/gbif-plant-occurrence-records.md
- **Developed by:** [NexGen Signal](https://apify.com/nexgensignal) (community)
- **Categories:** Business, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $33.50 / 1,000 plant occurrence records

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## GBIF Plant Occurrence Records - CC0 Georeferenced

GBIF-mediated georeferenced plant occurrences as clean, per-record biodiversity data. Every record is a GBIF occurrence the publisher released under **CC0 1.0** (public-domain
dedication) - taxonomy, institution codes, locality and dates - with **collector and identifier person
names structurally excluded**.

### What one record represents

The source is **GBIF** (the Global Biodiversity Information Facility) occurrence search API. This cell is filtered to the plant kingdom (kingdomKey=6) with coordinates (hasCoordinate=true), released under CC0.
Each record is **one occurrence**: its GBIF id, publishing dataset key, basis of record, catalogue/occurrence
identifiers and institution/collection codes; the full taxonomy (kingdom through species, plus the accepted
scientific name, taxon rank and keys); locality (country, country code, state/province) and, where present,
decimal latitude/longitude with coordinate uncertainty, elevation and depth; the event date (year, month,
day and verbatim date); and type status, establishment means and individual count where recorded.

### Sample output

![Sample output — GBIF Plant Occurrence Records - CC0 Georeferenced](https://api.apify.com/v2/key-value-stores/IXCaMKjxSmUTLHhmq/records/gbif-plant-occurrence-records.png)

*Real rows from a live run of this actor (first 5 rows, selected columns).*

One full record from the same run, exactly as delivered:

```json
{
  "gbif_id": "5936525124",
  "dataset_key": "38b4c89f-584c-41bb-bd8f-cd1def33e92f",
  "basis_of_record": "HUMAN_OBSERVATION",
  "occurrence_id": "urn:lsid:artportalen.se:sighting:130357738",
  "catalog_number": "130357738",
  "institution_code": "SLU Artdatabanken",
  "collection_code": "Artportalen",
  "publishing_org_key": "b8323864-602a-4a7d-9127-bb903054e97d",
  "kingdom": "Plantae",
  "phylum": "Tracheophyta",
  "class_name": "Pinopsida",
  "order_name": "Pinales",
  "family": "Pinaceae",
  "genus": "Picea",
  "species": "Picea abies",
  "scientific_name": "Picea abies (L.) H.Karst.",
  "accepted_scientific_name": "Picea abies (L.) H.Karst.",
  "taxon_rank": "SPECIES",
  "taxon_key": 5284884,
  "kingdom_key": 6,
  "type_status": null,
  "establishment_means": null,
  "individual_count": null,
  "country": "Sweden",
  "country_code": "SE",
  "state_province": "Ångermanland",
  "decimal_latitude": 62.65729,
  "decimal_longitude": 17.62639,
  "coordinate_uncertainty_m": 25,
  "elevation": null,
  "depth": null,
  "year": 2026,
  "month": 1,
  "day": 1,
  "event_date": "2026-01-01",
  "license": "CC0 1.0",
  "record_id": "5936525124",
  "source": "GBIF (Global Biodiversity Information Facility)",
  "source_dataset": "occurrence/search?kingdomKey=6&hasCoordinate=true&license=CC0_1_0",
  "licence": "GBIF-mediated occurrence data. This cell delivers ONLY records the publisher released under CC0 1.0 (public-domain dedication; license=CC0_1_0); no rights are reserved on the data values. Use is governed by the GBIF Terms of Use (https://www.gbif.org/terms). GBIF asks that GBIF.org and the publishing datasets be cited; dataset_key identifies the publisher.",
  "attribution": "GBIF.org and the publishing institutions (per dataset_key)",
  "caveat": "Georeferenced plant-kingdom (kingdomKey=6) occurrence records released under CC0 1.0 (about 75.98 million match the filter live), each carrying decimal latitude/longitude. GBIF caps offset paging at 100,000, so this cell delivers the first 100,000-record accessible slice; narrow downstream by year, country or dataset to reach records past the cap. Collector and identifier person names (recordedBy, identifiedBy and every *By field) are structurally excluded.",
  "observed_at": "2026-09-25T17:23:16Z"
}
```

### Coverage and volume

About 75.98 million georeferenced CC0 plant occurrences match the filter live (measured at build time from the API's match count); every record carries decimal latitude and longitude.

**Sol's Wave-3 index put this door at about 75,910,825 plant occurrences; measured live at build time 75,981,392 match under CC0 with coordinates - the live figure is what this listing quotes, delivered as a 100,000-record accessible slice.**

GBIF caps offset paging at **100,000** (a request past that returns HTTP 400), so this Actor delivers the
first **100,000-record accessible slice** of the match set. To reach records beyond the cap, narrow the query
downstream by a facet the API partitions on - `year`, `country` or `datasetKey` - each of which yields its
own sub-100,000 window; the Actor's baked filters (basis of record / kingdom / coordinates, plus the CC0
licence) always apply. The Actor pages 300 occurrences at a time and stops as soon as your **Maximum records**
cap or the 100,000 accessible-slice ceiling is met.

### Licence and attribution

This Actor delivers **only** occurrences the publisher released under **CC0 1.0** - a public-domain
dedication with no rights reserved on the data values. The licence filter (`license=CC0_1_0`) is **baked into
every query**, not a buyer option, and a per-record assertion **rejects any occurrence whose licence is not
CC0** (verified with a planted-row test). The full notice travels on every record:

> GBIF-mediated occurrence data. This cell delivers ONLY records the publisher released under CC0 1.0 (public-domain dedication; license=CC0\_1\_0); no rights are reserved on the data values. Use is governed by the GBIF Terms of Use (https://www.gbif.org/terms). GBIF asks that GBIF.org and the publishing datasets be cited; dataset\_key identifies the publisher.

GBIF asks that GBIF.org and the contributing datasets be cited; `dataset_key` on every record identifies the
publisher so you can attribute or trace provenance per row.

### Person-data policy

GBIF occurrences carry collector and identifier person names (`recordedBy`, `identifiedBy`, and every `*By`
/ `*ByIDs` field). This Actor **structurally excludes** all of them: they are never copied into a record.
Only institution and collection **codes**, taxonomy, locality, coordinates and dates are emitted, and a
per-record assertion rejects any collector/observer/person field (verified with a planted-field test). No
natural-person data is processed.

### Interpretation caveat

Georeferenced plant-kingdom occurrence records released under CC0, each carrying decimal latitude/longitude. Taxonomy, institution codes, locality, coordinates and dates; a mix of observations and specimens.

Values are reproduced verbatim from the API; the Actor never rewrites a field. Coordinates are the
publisher's decimal degrees where present; a record without coordinates leaves those fields null (except in
the georeferenced cell, whose baked `hasCoordinate=true` filter guarantees every row has them).

### Data quality and freshness

Numeric fields (coordinates, uncertainty, elevation, depth, year/month/day, taxon keys, individual count)
are delivered as real numbers; the licence label is normalised to `CC0 1.0`. Delivery is keyed on the stable
GBIF id, so the dataset is safe to diff, deduplicate or upsert. Every run re-reads the live API, so the data
is as fresh as GBIF's index, and each record's `observed_at` stamp dates the snapshot. The run's
`RUN_RECEIPT` records the live match count alongside how many records were delivered and charged, and the
100,000 hard cap.

### Provenance and compliance

Every run reads `api.gbif.org/robots.txt` at runtime; the gate result (URL, status, byte length, SHA-256 of
the policy) is written to the run's `RUN_RECEIPT`, and the occurrence-search path is confirmed crawlable
before any data request. The API is keyless. The Actor never bypasses a block or fetches through a mirror.

### Inputs

- **Maximum records** (`maxRecords`) - hard cap on occurrence records delivered and billed (also ceilinged
  at the 100,000 accessible slice). You are billed only for records actually delivered.

### Output

Records land in the Actor's default dataset and export as JSON, CSV, Excel or via the Apify API. A tabular
**overview view** surfaces the GBIF id, scientific name, basis of record, country code, coordinates, year and
institution code.

### Fields in detail

The record leads with `gbif_id` and `dataset_key`, then the basis of record and identifiers
(`occurrence_id`, `catalog_number`, `institution_code`, `collection_code`, `publishing_org_key`); the
taxonomy block (`kingdom`, `phylum`, `class_name`, `order_name`, `family`, `genus`, `species`,
`scientific_name`, `accepted_scientific_name`, `taxon_rank`, `taxon_key`, `kingdom_key`); type/ecology
(`type_status`, `establishment_means`, `individual_count`); geography and time (`country`, `country_code`,
`state_province`, `decimal_latitude`, `decimal_longitude`, `coordinate_uncertainty_m`, `elevation`, `depth`,
`year`, `month`, `day`, `event_date`); and the normalised `license`. The provenance block closes every
record.

### Scaling and limits

Set **Maximum records** low to sample cheaply or high to pull toward the 100,000 accessible slice. The Actor
pages the API 300 records at a time and delivers incrementally, so memory stays flat, and you are billed only
for what is delivered. Because the source holds far more than 100,000 matches, treat this cell as a windowed
feed: to assemble a larger panel, run it once per `year`, `country` or `datasetKey` window and concatenate -
the baked filters keep every window CC0 and on-grain. Re-running picks up GBIF's newly indexed occurrences,
and each record's `observed_at` stamp dates the snapshot.

### A new door in the fleet

This is the fleet's first GBIF cell, and it establishes the door for its companion. GBIF aggregates hundreds
of millions of biodiversity occurrences from museums, herbaria, survey programmes and citizen-science
platforms, each published under the contributing dataset's own licence. This Actor commits to the cleanest
slice of that: only CC0-dedicated records, only the structured occurrence fields, and never the collector
or identifier person names. The 100,000-record accessible-slice cap is a property of the GBIF search API,
not of this Actor - the API returns HTTP 400 once offset plus limit exceeds 100,000 - and the Actor treats
that boundary as a clean terminal rather than an error, recording it in the run receipt.

### Typical uses

Biodiversity, conservation and ecology teams use this cell to pull a windowed, licence-clean occurrence feed
without touching GBIF's Darwin Core archives or its download API. Because the taxonomy is fully expanded
(kingdom through species plus the accepted name) and coordinates are real numbers, the records feed straight
into species-distribution models, range maps and collection audits. To assemble a national or multi-year
panel that exceeds 100,000 records, run the cell once per `year`, `country` or `datasetKey` window and
concatenate - every window inherits the baked CC0 and occurrence filters, so the panel stays on-grain and
licence-clean. A scheduled run keeps a downstream biodiversity table current with GBIF's index, and the
stable GBIF id makes the dataset safe to upsert.

### Sibling Actors

It sits beside its companion GBIF preserved-specimen cell (same door, specimen filter) and the fleet's protected-site species inventory. It shares its engineering - the runtime robots gate, offset paging with the licence
filter baked in, push-then-charge billing and verbatim-value discipline - with the fleet's other public-data
records Actors, and with its companion GBIF cell it shares the door while differing only in the baked
occurrence filter.

# Actor input Schema

## `maxRecords` (type: `integer`):

Maximum occurrence records delivered and billed. You are billed only for records delivered. GBIF caps the accessible slice at 100,000; about 75.98M georeferenced CC0 plant records match.

## Actor input object example

```json
{
  "maxRecords": 500
}
```

# Actor output Schema

## `results` (type: `string`):

The delivered GBIF plant occurrence record.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "maxRecords": 500
};

// Run the Actor and wait for it to finish
const run = await client.actor("nexgensignal/gbif-plant-occurrence-records").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "maxRecords": 500 }

# Run the Actor and wait for it to finish
run = client.actor("nexgensignal/gbif-plant-occurrence-records").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "maxRecords": 500
}' |
apify call nexgensignal/gbif-plant-occurrence-records --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,nexgensignal/gbif-plant-occurrence-records"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/3AbrKWzmWX9wqOVYJ/builds/ZvMvBg9x8Vhou6IBv/openapi.json
