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
- Landing page:
https://ogcapi.laji.fi/
(Use this as the base URL in QGIS, ArcGIS Pro, or any software that supports OGC API Features.)
- List all datasets (collections):
- Dataset description (example: Pohjois-Savo occurrences as points):
- All occurrences in a dataset:
- A single occurrence:
- The same occurrence in GeoJSON format:
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
andILIKE
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 | Description | Type | Allowed values/range/examples |
Havainnon_tunniste | Id | string | 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 text | string | e.g. ‘parus major’ OR ‘Linnut’ |
Paikan_tarkkuus_metreina_max | Accuracy in meters | integer | e.g. ‘100’ |
Havainnon_luotettavuus | enumeration | Use names or Finnish labels: https://laji.fi/api/warehouse/filters/recordQuality | |
Yksilomaara_tulkittu | Minimum number of occurrences. Default 1. If 0, include negative observations. | integer | e.g. ‘10’ |
Eliomaakunta | string | e.g. Uusimaa (U) OR Uusimaa. | |
Aineiston_tunniste | string | e.g. HR.95 OR http://tun.fi/HR.95 | |
Pesintapaikka | Boolean | True OR False | |
Maarittaja | string | Alpo Turunen | |
Elinvaihe | enumeration | Use names or Finnish labels: https://laji.fi/api/warehouse/filters/lifeStage | |
Taksonin_tunniste | string | e.g. http://tun.fi/MX.38910 OR MX.38910 | |
Havaintotapa | enumeration | Use names or Finnish labels: https://laji.fi/api/warehouse/filters/recordBasis | |
sukupuoli | enumeration | Use names or Finnish labels: https://laji.fi/api/warehouse/filters/sex | |
Havaintoeran_tunniste | string | http://tun.fi/JX.337716 OR JX.37716 | |
Karkeistuksen_syy | Use names or Finnish labels: https://laji.fi/api/warehouse/filters/secureReason | ||
Aika | Filter 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. | string | e.g. 2020-01-01/2020-12-31 OR 2023-05-10 |
Kunta | string | e.g. Helsinki | |
Havainnoijat | string | e.g. Alpo Turunen | |
avainsanat | string | e.g. 2 n | |
Aineiston_laatu | enumeration | Use names or Finnish labels: https://laji.fi/api/warehouse/filters/collectionQuality | |
Uhanalaisuusluokka | enumeration | Use ids or values: https://laji.fi/api/metadata/ranges/MX.iucnStatuses?lang=fi | |
Sensitiivinen_laji | boolean | True OR False | |
Valtion_maalla | boolean | True OR False | |
Ensisijainen_biotooppi | enumeration | Use ids or values: https://laji.fi/api/metadata/ranges/MY.habitatEnum?lang=fi | |
Hallinnollinen_asema | enumeration | Use ids or values: https://laji.fi/api/metadata/ranges/MX.adminStatusEnum?lang=fi | |
Atlasluokka | enumeration | Use ids or values: https://laji.fi/api/metadata/ranges/MY.atlasClassEnum?lang=fi | |
Atlaskoodi | enumeration | Use ids or values: https://laji.fi/api/metadata/ranges/MY.atlasCodeEnum?lang=fi | |
Lataus_pvm | Filter 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. | string | 2025-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
- Practical examples with QGIS, Python, and R: OGC API in QGIS, Python or R
- Column descriptions and dataset field names: Column names in OGC API