OBISClient.jl

A Julia client for OBIS, the Ocean Biodiversity Information System, a programme of the Intergovernmental Oceanographic Commission of UNESCO. Results come back as typed tables with a fixed schema, carrying the licence and citation of the dataset each row came from.

Not an official OBIS product

OBISClient.jl is an independent, community-maintained client. It is not affiliated with, endorsed by, or maintained by OBIS, the Intergovernmental Oceanographic Commission, or UNESCO. The name identifies the service the package connects to; the data, the API and the quality control pipeline are the work of OBIS and its nodes.

Installation

using Pkg
Pkg.add("OBISClient")

Quick start

using OBISClient

recs = OBISClient.occurrence("Abra alba"; limit = 500)

recs.scientificName        # a column
recs.decimalLatitude       # Float64, always
recs.flags                 # a Set{String} per record

OBISClient.licenses(recs)        # may these data be redistributed?
OBISClient.citations(recs)       # how to credit them, access date included

Results implement the Tables.jl interface, so DataFrame(recs), CSV.write("out.csv", recs), Arrow and Parquet all work without the package depending on any of them.

Functions

FunctionWhat it returnsPage
occurrenceOccurrence records, as a typed tableGetting started
occurrence_pagesLazy, resumable pages of the sameLarge queries
occurrence_by_idOne record, by OBIS record UUIDGetting started
checklistWhich taxa occur in a selectionGetting started
taxonA WoRMS taxon, by AphiaID or exact nameGetting started
datasetDataset metadata, including the rights statementLicensing and citation
node, institute, area, countryThe identifiers the filters acceptGetting started
statisticsCounts for a query, without retrieving recordsInterpreting OBIS data
statistics_yearsRecords per yearInterpreting OBIS data
statistics_qcMissing and invalid fields, on-land, non-marineInterpreting OBIS data
facetCounts grouped by a fieldInterpreting OBIS data
licensesWhat a result may be used forLicensing and citation
citationsThe credit a result requires, as a table, text or BibTeXLicensing and citation
estimate_sizeHow many records a query would returnLarge queries
download_exportsThe bulk GeoParquet routeLarge queries
QueryCacheReproducible re-runs against cached responsesReproducibility
configure!Page size, pacing, retries, cachingGetting started

Worked example: killer whales works through a full session: retrieve, map, group, pivot, and test a relationship.

Full docstrings are in the Public API reference. Functions the package uses internally, and that the schema is built from, are in Internals.

What the package guarantees

The schema does not move. OBIS returns only the fields a record has a value for, so the field set differs from query to query. A result here always has the same columns in the same order, with concrete types and missing for absent values. Darwin Core fields outside the core schema are preserved per row in an extra column.

Every row carries its rights. The licence and citation of the dataset a record came from travel with the record, and the result records the date it was retrieved. The OBIS citation format requires that date, and nothing in the data supplies it.

You can reach what the default view omits. Absence records and records dropped by the quality pipeline are excluded unless asked for. The tri-state absence, dropped and event keywords ask for them.

The choice of access route stays yours. A query too large for the API raises an error listing the alternatives instead of switching routes on its own, because the API and the bulk export do not cover the same records.

Read this before analysing anything

Record counts measure sampling effort as much as biology, and the default view of OBIS is filtered in two directions. Interpreting OBIS data covers what turns a correct query into a wrong conclusion.

Records of Abra alba per year worldwide

How this manual was checked

The numbers, field names and error messages here come from the live OBIS API rather than from its documentation. Where a statement rests on observation rather than on something OBIS publishes, the text says so.

Output in the examples was pasted back from actual runs. Docstring examples marked jldoctest run on every documentation build. An integration suite and a link check run weekly against the live API and over every URL in the manual and the docstrings.

The figures come from examples/figures.jl and examples/orcas.jl, which query the API when they run. Counts in the figures move as OBIS ingests data.

Sources

This manual describes the package. For the service and the data behind it:

SourceWhat it covers
api.obis.orgThe API specification (obis_v3.yml)
manual.obis.org/access.htmlHow OBIS data can be accessed, and what each route includes
manual.obis.org/policy.htmlThe data policy: licences, conditions of use, the disclaimer
manual.obis.org/citing.htmlCitation formats
manual.obis.org/dataquality.htmlQuality flags and the QC pipeline
github.com/iobis/obis-qcEach quality check and the flag it raises
github.com/iobis/obis-open-dataThe bulk GeoParquet export on AWS
dwc.tdwg.org/termsThe Darwin Core standard

The repository also carries NOTES.md, the research notes the package was built from: the endpoint and parameter inventory, the response shapes, the pagination and error semantics, and which statements are documented versus observed.

Scope

The package is a client. It does not model, plot, or ship data. Analysis belongs in packages built for it, and OBIS records carry a DOI and an access date that a frozen copy inside a package would misreport.

How to cite

Cite the datasets you used. OBISClient.citations(result) builds those, with the access date filled in; see Licensing and citation. Citing the package does not replace citing the data.

For the package itself, the repository ships a CITATION.cff, which GitHub's "Cite this repository" button reads, and a CITATION.bib:

@software{bertuzzi_obis_jl_2026,
  author  = {Bertuzzi, Dante},
  title   = {{OBISClient.jl}: a {Julia} client for the {Ocean} {Biodiversity}
             {Information} {System}},
  year    = {2026},
  version = {0.1.0},
  url     = {https://github.com/dantebertuzzi/OBISClient.jl},
  note    = {Julia package}
}

Cite the version you actually ran. What you get back depends on the release and on the state of OBIS the day you queried it; the access date on your data citations covers the second half of that.