georeference.it API
v1 Public · No auth required 60 req/minOpen REST API returning Darwin Core occurrence data with community georeferences. No API key needed.
https://georeference.it/api/v1
Try it → /occurrences
Interactive docs (Swagger UI) ↗
OpenAPI spec (YAML) ↓
Endpoints
Paginated list of occurrences. All filters are optional and combinable.
| Parameter | Type | Description |
|---|---|---|
| country | ISO 3166-1 alpha-2 | Filter by country code — PT, ES, … |
| datasetKey | UUID | Filter by GBIF dataset key |
| institutionCode | string | Filter by institution code, e.g. MHNC |
| status | string | One or more of validated · has_suggestion · ungeoreferenced · gbif_georeferenced · gbif_reviewed · conflicted · not_georeferenceable, pipe-separated, e.g. ?status=validated|has_suggestion |
| scientificName | string | Partial match on scientific name |
| georeferencedAfter | date | Only occurrences last georeferenced/status-changed on or after this date (inclusive), e.g. 2026-01-01 |
| georeferencedBefore | date | Only occurrences last georeferenced/status-changed on or before this date (inclusive) |
| perPage | integer | Records per page — default 100, max 500 |
| page | integer | Page number — default 1 |
| format | string | Set to csv to download all matching records as a UTF-8 CSV file (ignores perPage/page), or jsonld for JSON-LD output |
Returns a single occurrence by its GBIF numeric key. Accepts Accept: application/ld+json or ?format=jsonld.
Response format
Coordinates reflect the best available georeference: community-validated → pending suggestion → original GBIF coordinates.
JSON (default)
{
"meta": {
"total": 48213,
"perPage": 100,
"currentPage": 1,
"lastPage": 483
},
"data": [
{
"occurrenceID": "3014169604",
"scientificName": "Quercus robur L.",
"verbatimLocality": "Redinha",
"countryCode": "PT",
"decimalLatitude": 39.8812,
"decimalLongitude": -8.5234,
"coordinateUncertaintyInMeters": 500,
"georeferenceVerificationStatus":
"verified by contributor",
"georef_status": "validated",
...
}
]
}
JSON-LD
Send Accept: application/ld+json or add ?format=jsonld
{
"@context": {
"@vocab":
"http://rs.tdwg.org/dwc/terms/",
...
},
"@type": "owl:Ontology",
"totalRecords": 48213,
"@graph": [
{
"@type": "dwc:Occurrence",
"@id": "https://www.gbif.org/
occurrence/3014169604",
"scientificName": "Quercus robur L.",
"georeferenceVerificationStatus":
"verified by contributor",
...
}
]
}
CSV
Add ?format=csv — downloads all matching records as a file (no pagination). UTF-8 with BOM (Excel-compatible).
occurrenceID,datasetKey,institutionCode,collectionCode,catalogNumber,scientificName,countryCode,decimalLatitude,decimalLongitude,coordinateUncertaintyInMeters,georeferencedBy,georeferenceVerificationStatus,...
3014169604,8a863029-...,MHNC,COL,12345,Quercus robur L.,PT,39.8812,-8.5234,500,Jane Smith (https://orcid.org/...),verified by contributor,...
4729103821,8a863029-...,MHNC,COL,67890,Pinus pinaster Aiton,PT,37.1523,-8.9014,1000,,requires verification,...
Fields reference
| Field | Description | |
|---|---|---|
| occurrenceID | GBIF numeric occurrence key | DwC |
| datasetKey | GBIF dataset UUID | DwC |
| institutionCode | Institution that holds the specimen | DwC |
| collectionCode | Collection within the institution | DwC |
| catalogNumber | Catalog number in the collection | DwC |
| basisOfRecord | Nature of the record (PRESERVED_SPECIMEN, etc.) | DwC |
| scientificName | Full scientific name with authorship | DwC |
| taxonRank | Rank of the taxon (SPECIES, GENUS, etc.) | DwC |
| kingdom / family | Higher taxonomy | DwC |
| eventDate | Date of collection — ISO 8601 | DwC |
| recordedBy | Collector name(s) | DwC |
| country / countryCode | Country name and ISO 3166-1 alpha-2 code | DwC |
| stateProvince | State or province | DwC |
| county | County or second-level administrative area | DwC |
| municipality | Municipality | DwC |
| island / islandGroup | Island and island group when applicable | DwC |
| waterBody | Water body name when applicable | DwC |
| verbatimLocality | Original locality text from the specimen label | DwC |
| decimalLatitude / decimalLongitude | Best available coordinates | DwC |
| geodeticDatum | Coordinate reference system — WGS84 | DwC |
| coordinateUncertaintyInMeters | Radius of positional uncertainty in metres | DwC |
| georeferencedBy | Who georeferenced (contributor or system) | DwC |
| georeferencedDate | Date of georeference — ISO 8601 | DwC |
| georeferenceProtocol | Protocol used — Zermoglio et al. 2020 | DwC |
| georeferenceSources | Tools used (georeference.it, OpenStreetMap, etc.) | DwC |
| georeferenceRemarks | Free-text notes added by the georeferencer | DwC |
| georeferenceVerificationStatus | DwC verification status (see below) | DwC |
| georef_status | Platform internal status — omitted from JSON-LD | |
| localityGroupID | Locality group identifier — omitted from JSON-LD |
georeferenceVerificationStatus
verified by contributor
Coordinates submitted and approved by community members.
validatedrequires verification
Coordinates exist but not yet community-validated. Applies to records with pending suggestions, conflicting georeferences, or existing GBIF coordinates awaiting confirmation.
has_suggestion conflicted gbif_georeferencedrequires georeference
No coordinates available — specimen needs georeferencing.
ungeoreferencedCode examples
curl
# Validated occurrences from Portugal
curl "https://georeference.it/api/v1/occurrences?country=PT&status=validated"
# As JSON-LD
curl -H "Accept: application/ld+json" \
"https://georeference.it/api/v1/occurrences?country=PT&status=validated"
# Single occurrence
curl "https://georeference.it/api/v1/occurrences/3014169604"
JavaScript
const res = await fetch(
'https://georeference.it/api/v1/occurrences?country=PT&status=validated&perPage=500'
);
const { meta, data } = await res.json();
data.forEach(o =>
console.log(o.scientificName, o.decimalLatitude, o.decimalLongitude)
);
Python — fetch all pages
import requests
url = "https://georeference.it/api/v1/occurrences"
params = {"country": "PT", "status": "validated", "perPage": 500}
records, page = [], 1
while True:
r = requests.get(url, params={**params, "page": page}).json()
records.extend(r["data"])
if page >= r["meta"]["lastPage"]:
break
page += 1
print(f"{len(records)} records")