Skip to content

omnilab/col

Omnilab Catalogue of Life: a taxon or synonym of the Catalogue of Life by its COL id, by the GBIF key that names it (GBIF's taxonomy is the COL eXtended Release) or by its name - authority, rank, status, classification, vernacular names, distribution, scrutinizer, source record; its GBIF key and the iNaturalist, WoRMS or ITIS records COL names as cross-references; parent, accepted name and synonyms related - and a search of names, through ChecklistBank's API, no key needed.

Floor
Provider · Omnilab
Version
1.x
Conformance suite
not wired
Verified for real
Its README does not say
Licence
MIT
composer require omnilab/col:1.x-dev

The Catalogue of Life through ChecklistBank's API (https://api.checklistbank.org/) for omnisense/omnilab: a taxon or a synonym by its COL id, its GBIF key (the same id since June 2026) or its name - classification, vernacular names, distribution, scrutinizer, source record - with its GBIF, iNaturalist, WoRMS and ITIS ids as cross-references; a search of names. No key.

Installation

composer require omnilab/col
use Omnilab\Col\ColSourceFactory;

$col = (new ColSourceFactory($httpClient))->create([
    'mailto' => 'support@glitchr.io',  // optional, in the User-Agent
    'dataset' => '3LXR',               // optional
]);

With the Symfony bundle, the factory is registered as col (see the core's docs).

Credentials

None: ChecklistBank's API needs no key to read.

Options

The factory's options, with the defaults it applies (ColSourceFactory):

Option Type Default Required Effect
dataset string 3LXR no the ChecklistBank dataset read: 3LXR (the latest eXtended Release), 3LR (the latest Base Release), or a release's number (315557: the release GBIF runs)
language ?string eng no the vernacular names put first (and whose first is common_name), by ISO 639-3 code; null, empty or all: COL's order
mailto ?string null no a contact address, sent in the User-Agent
user_agent ?string null no the whole User-Agent, in place of the one made from mailto
throttle float 0 no seconds left between two calls: ChecklistBank publishes no rate
base_uri string https://api.checklistbank.org/ no the API the source calls

Capabilities

capabilities() answers entity, search, cross_references; an operation it does not answer throws NotSupportedException before any call.

Capability Supported
entity yes a COL id (4CGXP, col:, its pages), a GBIF key of the new form (gbif:4CGXP: the same id; a legacy number refused), or an exact scientific name (the accepted usage first); another scheme refused before any call; one call by id
search yes ChecklistBank's name search, its order, 1,000 a page at most, paged by offset, with a total; a domain other than taxonomy answers an empty page
series no
products no
occurrences no GBIF holds them (omnilab/gbif)
datasets no
jobs no
open no
structure no
cross_references yes its GBIF key, and the first id of each base COL names or links to as its source record (iNaturalist, WoRMS, ITIS...)
forecast no
historical no
area no
station no
cloud_cover no

Which API, which release

ChecklistBank's API, https://api.checklistbank.org/, on one dataset: 3LXR (the latest eXtended Release, ChecklistBank's alias: COL26.9 XR, dataset 316441, 8,479,599 usages on 2026-10-15) by default; 3LR for the latest Base Release (COL26.9, 316321: the expert-checked core the XR extends); any release's number (315557: COL26.6 XR, the release GBIF's taxonomy was built from). A COL id is stable from one release to the next.

  • dataset/{key}/taxon/{id}/info: a usage - accepted or synonym - with its classification, synonyms, vernacular names, distributions, references and place of publication, in one call; 404 when unknown;
  • dataset/{key}/nameusage/search?q=&type=EXACT: a name's usages;
  • dataset/{key}/nameusage/search?q=&limit=&offset=: a search, with its total.

Calls

Method Reads ChecklistBank
entity() a COL id: 4CGXP, col:4CGXP, https://www.catalogueoflife.org/data/taxon/4CGXP, https://www.checklistbank.org/dataset/3LXR/taxon/4CGXP taxon/4CGXP/info
a GBIF key of the new form: gbif:4CGXP (a legacy number is refused) taxon/4CGXP/info
an exact scientific name (Panthera leo; of several usages the accepted first) nameusage/search?type=EXACT, then taxon/{id}/info
search() Query::$text, ChecklistBank's order, page by offset (1,000 at most), its total; a domain other than taxonomy answers nothing nameusage/search?q=&limit=&offset=

A bare string of upper-case letters and digits is an id, anything else a name. A synonym is itself (synonym, its accepted taxon related). An identifier of another scheme is refused before any call.

What an entity holds

id (col:4CGXP), label (its scientific name), domain taxonomy, kind (its rank), synonyms (its vernacular names, language first, then its scientific synonyms), url (its page on catalogueoflife.org), and:

Key ChecklistBank Value
taxon_name, taxon_authority, scientific_name name.scientificName, name.authorship, both text
taxon_rank, taxonomic_status name.rank; status: accepted, provisionally accepted, synonym, ambiguous synonym, misapplied text
nomenclatural_code, nomenclatural_status name.code, name.nomStatus text
accepted_name accepted.label, for a synonym text
kingdom, phylum, class, order, family, genus the classification's text
lineage the classification, from the root text
group COL's informal group (chordates) text
extinct, environment extinct; environments (marine, terrestrial...) boolean, text
published_in publishedIn.citation text
scrutinizer, scrutinized the expert who checked it, the day text
source_record the link to the record COL took it from (an ITIS or WoRMS page...) text
common_name the first vernacular name in language text
distribution the distributions' areas text

identifiers: gbif (the same id, when not digits alone), and one of each of the bases COL names (inat: → inaturalist, worms: → worms, and the others the core has a scheme for) or links to as the source record (an ITIS or WoRMS page): itis:183803 for the lion, taken from ITIS. COL names the ids of the names it merged too - the dolphin's worms:220224 is WoRMS's misspelling Delphinus delphus -: only the first of each base is kept. related: parent (the classification's last rank above, for an accepted taxon), accepted, synonym.

A search's result holds the usage and its classification: no vernacular names, distribution or synonyms.

What COL does not give here

  • Not read: the references one by one, the name relations (basionyms), the type material, the sectors' and source datasets' records, the estimates, the tree browser; the ids of bases the core has no scheme for (TAXREF, Dyntaxa, TaiCOL).
  • No occurrence: GBIF holds them (omnilab/gbif).

The Collector

Walked on 2026-10-15:

  • collect('col', '4CGXP', 1, ['gbif', 'inaturalist', 'itis']): the lion in COL, then GBIF by the same key, iNaturalist by 41964 and ITIS by its TSN 183803 (taken from ITIS's record).
  • collect('col', 'Delphinus delphis', 1, ['worms', 'itis']): COL's dolphin into WoRMS 137094 and ITIS 180438.
  • From GBIF or OBIS: an entity carrying gbif:4CGXP reaches COL by the same key.

Example

<?php

require __DIR__.'/vendor/autoload.php';

use Omnilab\Col\ColSourceFactory;
use Omnilab\Model\Scheme;
use Omnilab\Source\Query;
use Symfony\Component\HttpClient\HttpClient;

$col = (new ColSourceFactory(HttpClient::create()))->create(['mailto' => 'you@example.org']);

$lion = $col->entity('gbif:4CGXP');   // GBIF's key is COL's id
echo $lion->label, ' ', $lion->value('taxon_authority'), ' (', $lion->id, '): ', $lion->value('taxonomic_status'), ', ', $lion->value('common_name'), ', scrutinized by ', $lion->value('scrutinizer'), "\n";
echo '  GBIF ', $lion->identifier(Scheme::GBIF), ', iNaturalist ', $lion->identifier(Scheme::INATURALIST), ', ITIS ', $lion->identifier(Scheme::ITIS), ', parent ', $lion->related('parent')->value(Scheme::COL), "\n";

$page = $col->search(new Query('Panthera leo', limit: 3));
printf("%d names for \"Panthera leo\"; the first %d:\n", $page->total, count($page));
foreach ($page as $usage) {
    echo '  ', $usage->id, '  ', $usage->label, '  ', $usage->value('taxonomic_status'), "\n";
}
Panthera leo (Linnaeus, 1758) (col:4CGXP): accepted, African Lion, scrutinized by W. Christopher Wozencraft,Alfred L. Gardner
  GBIF 4CGXP, iNaturalist 41964, ITIS 183803, parent 6DBT
359 names for "Panthera leo"; the first 3:
  col:4CGXP  Panthera leo  accepted
  col:5K5L8  Panthera leo leo  accepted
  col:7KGW9  Panthera leo melanochaita  accepted

(as answered on 2026-10-27 by the latest XR: two calls)

# config/packages/omnilab.yaml
omnilab:
    sources:
        col: { factory: col, options: { mailto: '%env(OMNILAB_MAILTO)%', dataset: 3LXR, language: eng } }

Errors

Every call goes through HttpSource: a 404 or a 410 (and a 204) is null - an empty page for a list -; a 429 is a RateLimitedException (retryAfter from Retry-After); a 5xx, a time-out or a host that does not answer an UnavailableException; any other 4xx a ProviderException with its status and what the service said; an answer that is not JSON a ProviderException, a web page answered for JSON an UnavailableException.

Before any call: an identifier of another scheme, or a legacy GBIF number (digits alone) (NotSupportedException). An unknown id is ChecklistBank's 404, null; an unknown name an empty search, null.

Verified, and not

Against the real service on 2026-10-15, without a key: the lion by its id, its GBIF key, its name and its two pages (one call each; its GBIF, iNaturalist and ITIS ids, Panthera its parent, Felis leo among its synonyms; the scrutinizers, its distribution); Felis leo (CFSCR) a synonym, the lion accepted; the common dolphin by its name (WoRMS 137094, ITIS 180438, iNaturalist 41526); an unknown id (404) and name; a search for "Panthera leo" (356 names) in two pages; the lion in the release GBIF runs (315557). GBIF answered usageKey=34JWM with Delphinus delphis: COL's id is GBIF's key. The fixtures in Tests/Fixtures/ are its answers (index.json names each one's address).

Again on 2026-10-27: the lion by its GBIF key (its iNaturalist and ITIS ids, its parent), the search for "Panthera leo" (359 names; the example above).

Not verified: a 429 or an outage (none met); a taxon added after COL26.6 XR, absent from GBIF.

Responsibility

This package is an independent, unofficial client: it is not affiliated with, endorsed by or sponsored by the Catalogue of Life or ChecklistBank. The Catalogue of Life is under CC BY 4.0; each release is cited with its DOI and its source datasets credited (source_record), as the README's Terms of use says. Whoever runs the package is responsible for complying with them and for any use made of what it returns: see the README's Responsibility section.

Propose a change docs/index.md