MAXGEN schema · v1.13
MaxRecognition
Who read this page, how, and how sure they were about every word.
Download MaxRecognition v1.13
All versions
https://opengenealogyai.org/schemas/maxgen/v1/recognition.schema.json
The handwriting problem
German Kurrent script was the everyday handwriting of German-speaking Europe from the 1500s to the mid-1900s. Its "e" looks nothing like an e; its "n" looks like a "u"; the word for mother looks like "Mnttev". The church registers that matter most for German-American research are written in it, by the million. Kurrent is one of many: Secretary Hand, Court Hand, Hebrew and Greek scribal hands, Arabic nastaliq, Cyrillic ustav.
MaxRecognition records what happens when a machine or a trained human reads such a page, so that the reading is citable, checkable and improvable.
One schema for print and handwriting
OCR (reading printed text) and HTR (reading handwriting) share more than 90% of their fields, so there is one schema with a recognition_type switch. Handwriting records add script_type and approx_century for routing to the right specialist; print records add font_type and scan_dpi.
Who did the reading
contributor{} has a contributor_type of human or ai, and fields that follow from it.
- Humans carry credentials, specialty scripts, languages and regions,
records_transcribed(a reputation signal that accumulates), and training notes. A Kurrent reading by someone with fifteen thousand records and a Kurrent certification carries more weight than the same reading by a newcomer. - AI models carry model name, version, provider and type, the exact prompt used (a prompt that says "transcribe exactly, do not correct" is a different method from "extract the key facts"), and fine-tuning details. Storing the prompt makes the transcription reproducible.
Word-level confidence and labelled guesses
word_confidences[] gives each word a score, a position, alternatives, and a reading_type:
reading_type |
Meaning |
|---|---|
observed |
Read directly from the image. |
inferred_context |
Filled in from surrounding entries. |
inferred_pattern |
Filled in from a known naming convention. |
partial_read |
Some characters legible, the rest inferred. |
Traditional practice says "leave it blank if you cannot read it". MaxRecognition says: if you can make a reasonable inference, make it, label it, explain it in inference_notes, and give it a lower score. "Five other entries on this page read Maxwell; only 'Ma' is legible here; letterform height at position 3 fits 'xw' not 'rk'; inference Maxwell, 0.78." That is how a trained genealogist reasons, captured in a form a reviewer or a future model can audit.
Consensus and searchability
consensus_group_idlinks independent readings of the same image.is_independentsays whether each run was blind to the others. Agreement raises confidence; disagreement flags the word for human review. The schema stores the evidence; the matching engine does the arithmetic.searchable_variants[]lists every spelling under which this record should be findable when a word is uncertain between, say, "Maxwell" and "Maxweil". MaxName handles the general fact that names vary across history; this field handles one hard reading in one document.character_error_rateandword_error_raterecord quality against ground truth when it exists, so over time the system learns which models and which people read which scripts best.
Fields
| Field | Type | Meaning |
|---|---|---|
recognition_id required | string | Unique identifier for this transcription run. |
schema_version required | const "1.13" | MAXGEN lockstep version. |
recognition_type required | enum | ocr = printed or typed text; htr = handwritten text. |
image_url required | string | URL of the document image that was transcribed. |
raw_record_id | string | Optional: links back to the MaxRecord this transcription belongs to. |
output_text required | string | Full transcribed text produced by this run. |
processing_date required | string | ISO 8601 UTC timestamp of when this transcription was produced. |
language | string | ISO 639-1 code of the document language (e.g. |
contributor required | object | Who or what produced this transcription. |
confidence | number | Overall transcription confidence 0.0–1.0, self-reported by the contributor. |
word_confidences | array of object | Per-word confidence breakdown. |
character_error_rate | number | CER measured against a ground-truth reference, if available. |
word_error_rate | number | WER measured against a ground-truth reference, if available. |
consensus_group_id | string | Groups multiple independent transcriptions of the same image. |
is_independent | boolean | True if this run was performed blind to other transcriptions in the same consensus_group. |
is_human_reviewed | boolean | True if a human has reviewed and approved the output. |
review_status | enum | |
redistribution_license | enum | License for this transcription output. |
font_type | enum | OCR only: dominant font type in the document. |
scan_dpi | integer | OCR only: scan resolution in dots per inch. |
script_type | enum | HTR only: handwriting script family of the document. |
approx_century | integer | HTR only: approximate century of the handwriting expressed as the century's start year (e.g. |
searchable_variants | array of string | All possible full-text spellings this record should be findable under — including uncertain readings, alternative spellings, and normalized forms. |
extensions | object | Product/implementation-specific fields. |
Example
A human Kurrent specialist's reading of a Bavarian baptism, with one uncertain word and its alternative.
{
"recognition_id": "c1900000-0002-4000-8000-000000000001",
"schema_version": "1.13",
"recognition_type": "htr",
"image_url": "https://www.archion.de/de/browse/?no_cache=1&type=churchRegister&pid=12345",
"raw_record_id": "a1600000-0001-4000-8000-000000000001",
"output_text": "Johann Maier, geb. 14 März 1842, Sohn des Georg Maier und der Maria Huber.",
"processing_date": "2026-06-20T14:00:00Z",
"language": "de",
"contributor": {
"contributor_type": "human",
"contributor_name": "Helga Brandt",
"contributor_id": "ogai-user-00042",
"profile_url": "https://opengenealogyai.org/users/helga-brandt",
"credentials": [
"AG",
"Kurrent specialist",
"German parish records"
],
"specialty_scripts": [
"kurrent",
"gothic_fraktur"
],
"specialty_languages": [
"de",
"la"
],
"specialty_regions": [
"Bavaria",
"Baden-Württemberg",
"Württemberg"
],
"records_transcribed": 14720,
"training_notes": "German Genealogical Society Kurrent certification 2019. Specializes in Württemberg Lutheran Kirchenbücher 1650-1875. Completed the entire Maulbronn parish register collection (3,200 entries)."
},
"confidence": 0.94,
"word_confidences": [
{
"word": "Maier",
"char_offset": 7,
"confidence": 0.82,
"reading_type": "observed",
"alternatives": [
{
"text": "Mäier",
"confidence": 0.18
}
]
}
],
"searchable_variants": [
"Johann Maier geb 14 März 1842 Sohn Georg Maier Maria Huber",
"Johann Mäier geb 14 März 1842 Sohn Georg Mäier Maria Huber"
],
"consensus_group_id": "d1900000-0001-4000-8000-000000000099",
"is_independent": true,
"is_human_reviewed": true,
"review_status": "approved",
"redistribution_license": "CC-BY",
"script_type": "kurrent",
"approx_century": 1800
}
Listen
MaxRecognition — Teaching machines to read
25:21OCR and handwriting provenance, word-level confidence, labelled inference, and consensus.