# gwt-read hiski: Finnish parish registers

HisKi is the Finnish Genealogical Society's index of parish registers: baptisms, marriages, burials and moves, parish by parish, from the 1600s to about 1900 (each parish's own years are on its page). https://hiski.genealogia.fi/hiski?en

## Commands

```
gwt read hiski search --parish 0035 --book baptisms|marriages|burials|moves \
                      [--given G] [--surname S] [--patronymic P] [--village V] [--field NAME=VALUE ...] \
                      [--from 1750] [--to 1800] [--count 50] [--start N] --out DIR
gwt read hiski control
```

- `--parish` is the parish's four-digit code, as in its HisKi address: `https://hiski.genealogia.fi/hiski?en+0035` is `0035`. The parish list at https://hiski.genealogia.fi/hiski?en gives every code.
- Each parish keeps only some books: its book list, `https://hiski.genealogia.fi/hiski?en+<code>`, shows which.
- `--given`, `--surname`, `--patronymic` and `--village` fill the form's fields for the first person of the book (the man of a marriage, the father of a baptism).
- `--field NAME=VALUE` fills any other field of the form by its own name: `aetunimi` (the wife's or the mother's first name), `asukunimi`, `etunimi` (the child of a baptism), `ksukunimi`. Repeat it for more. A `--field` without `NAME=`, or a value with a letter outside ISO-8859-1, is refused (exit 64) before any request.
- `--count` is one of the site's own page sizes (15, 30, 50, 100, 250, 500, 1000). `--start` is the site's position to continue from (its `hakupos`).

## How it reads

HisKi is an old CGI program with no API. Its search form also answers a plain GET, so the reader sends the form's fields as a query string, in ISO-8859-1 (the encoding the program reads) and in English (`kieli=en`).

Cloudflare sits in front of the site and adds a small script to ordinary pages, whose path holds `challenge-platform`. gwt-read reads that script as what it is, not a wall. A real Cloudflare challenge loads `/cdn-cgi/challenge-platform/h/...`, and stays a wall.

## What a candidate is

An index entry, a lead: read the parish register before citing it. `id` is `<parish>-<book>-<n>`; `columns` keeps every cell with its header, in order; `name` and `role` are the first person column (`Man` for a marriage), and the other persons are `relatives`. `events` holds the first date of the row. `url` is the entry's own page, `https://hiski.genealogia.fi/hiski?en+<parish>+<book>+<n>`.

## When it stops

"None" is the site's own sentence, "No events found with this search criteria". Any other page with no row is a STOP (exit 3, the gate pauses every lane, nothing written or cached), and so is a page with an entry row the reader cannot read. That covers a block page and a new layout.

A book the parish does not keep, or a parish code the site does not have, gets the site's empty search page, titled "Search -  \- ". That is a mistake in the search, not a block: the reader names it, exits 64, writes nothing, and does not tell the gate. The answer stays in the cache like any search; `--refresh` asks again.

## Pace, cache and terms

- The gate (`~/.cache/gwt-gate-hiski`) waits 10 s between requests, never less than 5 s. robots.txt names no delay, and the site is a volunteer society's old program.
- The index grows slowly: a search is cached 30 days.
- robots.txt allows the search pages to every agent and says `search=yes, ai-train=no`. The entries are for reference: cite the register.

## Canary

`--parish 0035 --book marriages --given Johan`, at least 15 rows (the site gave about 595 in November 2026).
