info.laji.fi

Knowledge base of the FinBIF

OGC API Features Overview

Open: https://ogcapi.laji.fi/

For public authorities: https://ogcapi.laji.fi/virva

OGC API Features in a Nutshell

The service ogcapi.laji.fi is based on the OGC API – Features standard, which can be considered the successor to the older OGC Web Feature Service (WFS).

Originally, the standard was called WFS 3.0, but due to its new design principles, OGC decided to rename it. Compared to WFS, OGC APIs are more modern, interoperable, and easier to use.

Before using the API, it helps to understand a few basic principles:

  • The API is REST-based. You interact with it using simple URLs.
  • You can fetch whole datasets (collections) or filter them with parameters.
  • Responses can be formatted as GeoJSON, CSV, or HTML.
  • The API uses pagination to handle large datasets.

Note: In QGIS, queries are formatted slightly differently. Below are examples for direct use in a browser or programmatically.

Note: The “All Data as Center Points” collection is a special case, since it works differently than other datasets. See the last section of this guide for details.

Basic API Endpoints

Query Parameters

You can refine queries with various parameters:

  • f – output format (e.g. json, csv, html)
  • bbox – spatial filter (bounding box) in ETRS-TM35FIN or WGS84.
  • datetime – temporal filter (ISO 8601 time)
  • limit, offset– pagination controls (limit specifies the number of observations in a single page, offset skips the x number of observations (e.g., limit=10 & offset=10 shows the items 11-20).
  • sortby – sort results by a field
  • crs – choose coordinate reference system (ETRS-TM35FIN or WGS84)
  • attribute filters – filter by dataset fields (note: “All data as center points” collection is a bit different for these)

Usually, the fastest way to check a query is to write it directly to a web browser. That allows inspecting data in GeoJSON, CSV or HTML format. For other purposes, you can link the API directly to some GIS application (see instructions here) or use it through the command line or programming languages.

Examples:

List all collections:

http://ogcapi.laji.fi/collections

Display queryables (= attributes that can be used to filter data):

http://ogcapi.laji.fi/collections/pohjois_savo_points/queryables

Explore occurrences in a browser:

http://ogcapi.laji.fi/collections/pohjois_savo_points/items

Pagination. Skip the first 40 occurrences and fetch only 20 occurrences:

http://ogcapi.laji.fi/collections/pohjois_savo_points/items?offset=40&limit=20

Download results in Comma Separated Value (CSV) format. This tabular format can be opened, for example, in Excel.

http://ogcapi.laji.fi/collections/pohjois_savo_points/items?f=csv

Limit occurrences geographically using bbox parameter. As a default, coordinates are in WGS84 coordinate reference system.

https://ogcapi.laji.fi/collections/pohjois_savo_points/items?bbox=25.357839,61.06715,27.58347,62.81241&limit=10000

Filter occurrences geographically using ETRS-TM35FIN coordinates (which EPSG code is 3067).

https://ogcapi.laji.fi/collections/pohjois_savo_points/items?bbox=382509.7534,6669242.4856,389113.5653,6674052.2373&bbox-crs=https://www.opengis.net/def/crs/EPSG/0/3067

Query only occurrences where the value of column ‘Alkuperainen_nimi’ is ‘kuikka’.

https://ogcapi.laji.fi/collections/pohjois_savo_points/items?Alkuperainen_nimi=kuikka

Filter occurrences based on timestamp.

https://ogcapi.laji.fi/collections/pohjois_savo_points/items?datetime=2024-04-10

Get the first 100 occurrences and sort them by the column ‘Alkuperainen_nimi’. Use the minus (-) character to sort them in descending order and (+) character by ascending order.

https://ogcapi.laji.fi/collections/pohjois_savo_points/items?limit=100&sortby=Suomenkielinen_nimi

Get the occurrences in ETRS-TM35FIN coordinate system.

https://ogcapi.laji.fi/collections/pohjois_savo_points/items?crs=https://www.opengis.net/def/crs/EPSG/0/3067

Get specific occurrences based on the collection id.

https://ogcapi.laji.fi/collections/pohjois_savo_points/items?Aineiston_tunniste=http://tun.fi/HR.3211

CQL (Common Query Language) queries:

For advanced filtering, use the filter and filter-lang=cql-text parameters.

Names containing the word ‘haukka’. The notation ‘%20’ represents a space and ‘%27’ represents an apostrophe. A single percent sign ‘%’ on both sides of the word ‘haukka’ indicates any characters that the given string can be combined with. Thus, the name could be, for example, ‘nuolihaukka’.

https://ogcapi.laji.fi/collections/pohjois_savo_points/items?filter-lang=cql-text&filter=Alkuperainen_nimi%20ILIKE%20%27%haukka%%27

Names not containing the word ‘haukka’.

https://ogcapi.laji.fi/collections/pohjois_savo_points/items?f=html&filter-lang=cql-text&filter=Alkuperainen_nimi%20NOT%20ILIKE%20%27%haukka%%27

Retrieve first 200 occurrences whose name is either “merikotka” or “kuikka”.

https://ogcapi.laji.fi/collections/pohjois_savo_points/items?f=html&limit=200&filter-lang=cql-text&filter=Alkuperainen_nimi%20IN%20(%27merikotka%27,%27kuikka%27)

Find more CQL filtering examples from the pyogcapi documentation.

Special case: “All Data as Center Points” -collection

Since datasets available through Virva filters contain only about 6 million occurrences, the All Data as Center Points” collection provides access to all observations visible in laji.fi (over 50 million).

  • This dataset is slightly slower because it performs a live query against the REST API (api.laji.fi) and reformats the response according to the OGC API Features standard.
  • For performance reasons, queries are limited to 1,000,000 records at a time. Causes errors when exceeding.
  • To use it effectively, you must add filters (species, location, time, or other variables).

Limitations:

  • Only simple attribute filters are supported: =, !=, <, <=, >, >=, bbox, limit, offset.
  • LIKE and ILIKE filters are not supported.
  • You can provide multiple values in a filter separated by commas.
  • Bounding box filters (bbox) can be in EUREF-TM35FIN or WGS84 coordinates.
  • You may also use exact same filters as in the REST API; non-Finnish filters are passed through directly.

Unsupported filters (currently):

Keruu_aloitus_pvm, Keruu_lopetus_pvm, Havainnon_lisatiedot, ETRS_TM35FIN_WKT, Sijainti, Keruutapahtuman_lisatiedot, Taksonominen_jarjestys, Maaran_yksikko, Lajiturva, geometry, Esiintyman_tila, Aineisto, Seurantapaikan_tila, Seurantapaikan_tyyppi, Vastuualue, Paikallinen_tunniste, Yhdistetty, Maara, Maarittaja, Aineiston_tunniste

Supported filters:

Property name DescriptionTypeAllowed values/range/examples
Havainnon_tunniste           Idstring  e.g. ’http://tun.fi/JX.337955#5’ or ‘JX.337955#5’
Tieteellinen_nimi      Suomenkielinen_nimi Ruotsinkielinen_nimi Englanninkielinen_nimi Alkuperainen_nimi  Elioryhma                         Name as textstringe.g. ‘parus major’ OR ‘Linnut’
Paikan_tarkkuus_metreina_max Accuracy in metersintegere.g. ‘100’
Havainnon_luotettavuus enumerationUse names or Finnish labels:  https://laji.fi/api/warehouse/filters/recordQuality
Yksilomaara_tulkittuMinimum number of occurrences. Default 1. If 0, include negative observations.integere.g. ‘10’
Eliomaakunta stringe.g. Uusimaa (U) OR Uusimaa.
Aineiston_tunniste stringe.g. HR.95 OR http://tun.fi/HR.95
Pesintapaikka BooleanTrue OR False
Maarittaja stringAlpo Turunen
Elinvaihe enumerationUse names or Finnish labels: https://laji.fi/api/warehouse/filters/lifeStage
Taksonin_tunniste stringe.g. http://tun.fi/MX.38910 OR MX.38910
Havaintotapa enumerationUse names or Finnish labels:  https://laji.fi/api/warehouse/filters/recordBasis
sukupuoli enumerationUse names or Finnish labels:  https://laji.fi/api/warehouse/filters/sex
Havaintoeran_tunniste stringhttp://tun.fi/JX.337716 OR JX.37716
Karkeistuksen_syy              Use names or Finnish labels: https://laji.fi/api/warehouse/filters/secureReason
AikaFilter using event date. Date can be a full date or part of a date, for example 2000, 2000-06 or 2000-06-25. Time can be a range, for example 2000/2005 or 2000-01-01/2005-12-31. Relative days “last N days” can be used: 0 is today, -1 is yesterday and so on; for example -7/0 is a range between 7 days ago and today. Multiple values are seperated by ‘,’. When multiple values are given, this is an OR search.stringe.g. 2020-01-01/2020-12-31 OR 2023-05-10
Kunta stringe.g. Helsinki
Havainnoijat stringe.g. Alpo Turunen
avainsanat stringe.g. 2 n
Aineiston_laatu enumerationUse names or Finnish labels:  https://laji.fi/api/warehouse/filters/collectionQuality
Uhanalaisuusluokka enumerationUse ids or values: https://laji.fi/api/metadata/ranges/MX.iucnStatuses?lang=fi  
Sensitiivinen_laji booleanTrue OR False
Valtion_maalla booleanTrue OR False
Ensisijainen_biotooppi enumerationUse ids or values: https://laji.fi/api/metadata/ranges/MY.habitatEnum?lang=fi
Hallinnollinen_asema          enumerationUse ids or values: https://laji.fi/api/metadata/ranges/MX.adminStatusEnum?lang=fi
Atlasluokka enumerationUse ids or values: https://laji.fi/api/metadata/ranges/MY.atlasClassEnum?lang=fi
Atlaskoodi enumerationUse ids or values: https://laji.fi/api/metadata/ranges/MY.atlasCodeEnum?lang=fi
Lataus_pvmFilter using the date data was loaded to Data Warehouse. Format is yyyy-MM-dd or UNIX EPOCH timestamp in seconds. Returns entries loaded later or on the same date/timestamp.string2025-08-28 00:00:00 OR 2025-08-28

Troubles?

  • If you get an error in QGIS, try running the same query directly in a web browser. Browsers display error messages more clearly.
  • Use ID values in filters instead of free text, since IDs do not contain special characters.
  • For support, contact: helpdesk (at) laji.fi

Further resources

Scroll to top