Skip to content

Courts ​

File: data/courts.json. Every court of the judiciary that the courts' own portal, tribunaux-rechtbanken.be, lists: 347 records that apply today. The numbers on this page are computed from the data when the site is built.

KindCourtsDivisions or seatsArea
Justice of the peace1622A canton; Philippeville sits in two places
Police court1533An arrondissement (Brussels split by language, Halle, Vilvoorde)
Court of first instance1323An arrondissement (Brussels split by language)
Enterprise court924An arrondissement, or the area of a court of appeal
Labour court929An arrondissement, or the area of a court of appeal
Court of appeal50A judicial area
Labour court of appeal57A judicial area
Court of assize110A province, or Brussels-Capital

Not on the portal, so not here yet: the Court of Cassation, the Constitutional Court and the Council of State, and the disciplinary courts.

Why it's useful ​

  • Addressing documents. Writs of summons, petitions and conclusions name the court as it names itself; letters and filings go to the registry (griffie, greffe) at its address.
  • Contacting the right registry. Larger courts have a registry per matter (civil, criminal, family, the register of legal entities…), each with its own phone number, e-mail and sometimes bank account. The data keeps them apart, labelled as the court labels them.
  • Paying fees. Registries that publish a bank account for court fees and deposits have it in the data, checksum verified.
  • Building forms. Court pickers need a complete list with stable ids, linked to cantons, arrondissements and judicial areas, and to the court a division belongs to.
  • Linking to case law. ecli gives the code the court's decisions carry in their European Case Law Identifier (ECLI:BE:HBGNT:…).

Source and updates ​

Sourcetribunaux-rechtbanken.be, the portal of the College of Courts and Tribunals; the courts' areas from the annex to the Judicial Code, art. 3–5
Built byscripts/parse from weekly snapshots of every court's page and contact page
Changes whenA court moves, changes its contacts or hours, or the portal adds or renames a court
Covers1 January 2025 onwards: lookups for an earlier day throw a RangeError (time)
CheckedEvery week, by the sources workflow; changes arrive as a pull request
LicenceCC BY 4.0

Every record lists the pages it was read from and the day each page's content was first seen (sources). Contact details change more often than anything else in this package: when it matters, check the court's page (website).

347 of 347 courts, divisions and seats

Name, as publishedAddressContacts
Hof van Beroep Antwerpen
court-of-appeal-antwerpen
Antwerpen (judicial area)
Britselei 55
2000 Antwerpen
02 682 00 08 (Griffie - burgerlijk)
02 682 00 06 (Griffie - correctioneel)
02 682 00 07 (Griffie - Kamer van Inbeschuldigingstelling)
Hof van Beroep Brussel
Cour d'appel de Bruxelles
court-of-appeal-brussel
Brussel (judicial area)
Poelaertplein 1
1000 Brussel
02 508 68 74 (Jeugd- en familiegriffie - Onthaal)
fax 02 508 65 90 (Jeugd- en familiegriffie - Onthaal)
BE14 6792 0092 4483 (Jeugd- en familiegriffie - Onthaal)
BE43 6792 0087 7401 (Burgerlijke griffie)
02 508 66 36 (Burgerlijke griffie - Onthaal)
02 508 66 67 (Burgerlijke griffie - UNIT A (kamers 1N – 1F – 5N -5F): NL)
and 14 more
Hof van Beroep Gent
court-of-appeal-gent
Gent (judicial area)
Koophandelsplein 23
9000 Gent
Mo-Fr 08:30-12:30,13:30-16:00
09 234 54 85 (Burgerlijke griffie - unit A (kamers 1, 1ter, 5, 14, 14bis))
09 234 54 86 (Burgerlijke griffie - unit B (bouwzaken - kamers 9, 9bis, 16))
09 234 54 81 (Correctionele griffie)
09 234 42 18 (burgerlijke - dienst verzoekschriften)
and 5 more
Cour d'appel de Liège
court-of-appeal-liege
Luik (judicial area)
Place Saint Lambert 16
4000 Liège
04 232 56 16 (Greffe civil)
04 232 56 23 (Greffe pénal)
04 232 56 16 (Service des expertises civiles)
liege.ca.greffecivil@just.fgov.be (Service des expertises civiles)
and 3 more
Cour d'appel de Mons
court-of-appeal-mons
Henegouwen
Rue des Droits de l'Homme 1
7000 Mons
02 682 07 01 (Accueil)
02 682 07 01 (Greffe civil: tapez 2)
02 682 07 01 (Greffe correctionnel: tapez 1)
065 37 93 05 (Sécrétariat de la première présidence)
and 2 more
Hof van assisen Antwerpen
court-of-assize-antwerpen
Antwerpen
Britselei 55
2000 Antwerpen
Cour d'assises du Brabant wallon
court-of-assize-brabant-wallon
Waals-Brabant
Rue Clarisse 115
1400 Nivelles
067 28 38 60 (Le greffe)
Hof van assisen van het administratief arrondissement Brussel-Hoofdstad
Cour d'assises de l'arrondissement administratif de Bruxelles-Capitale
court-of-assize-brussel-hoofdstad
Brussel
Poelaertplein 1
1000 Brussel
02 508 66 91 (Griffie op het justitiepaleis)
assisen.brussel@just.fgov.be (Griffie op het justitiepaleis)
02 208 08 00 (Griffie op de Justitia site (specifiek voor het proces van de aanslagen))
assises.bruxelles.justitia@just.fgov.be (Griffie op de Justitia site (specifiek voor het proces van de aanslagen))
assises.bruxelles@just.fgov.be (Greffe de la cour d'assises)
02 508 66 74 (Greffe de la cour d'assises)
Cour d'assises du Hainaut
court-of-assize-hainaut
Henegouwen
Rue des Droits de l'Homme 1
7000 Hainaut
Cour d'assises de Liège
court-of-assize-liege
Luik (judicial area)
Place Saint-Lambert 16
4000 Liège
Hof van assisen Limburg
court-of-assize-limburg
Limburg
Vrijthof 2
3700 Tongeren
Cour d'assises du Luxembourg
court-of-assize-luxembourg
Luxemburg
Place Schalbert, bâtiment 8
6700 Arlon
Cour d'assises de Namur
court-of-assize-namur
Namen
Place du Palais de Justice 4
5000 Namur
081 25 17 11 (Greffe correctionnel)
Hof van assisen Oost-Vlaanderen
court-of-assize-oost-vlaanderen
Oost-Vlaanderen
Opgeëistenlaan 401
9000 Gent
Hof van assisen Vlaams-Brabant
court-of-assize-vlaams-brabant
Brussel (judicial area)
Smoldersplein 5
3000 Leuven
Hof van assisen West-Vlaanderen
court-of-assize-west-vlaanderen
West-Vlaanderen
Kazernevest 3
8000 Brugge
Rechtbank eerste aanleg Antwerpen
court-of-first-instance-antwerpen
Antwerpen
Bolivarplaats 20 bus 1
2000 Antwerpen
Rechtbank eerste aanleg Antwerpen - afdeling Antwerpen
court-of-first-instance-antwerpen-antwerpen
Antwerpen
Bolivarplaats 20 bus 1
2000 Antwerpen
02 682 06 20 (secretariaat (afdelings)voorzitter)
Rechtbank eerste aanleg Antwerpen - afdeling Mechelen
court-of-first-instance-antwerpen-mechelen
Antwerpen
Keizerstraat 20
2800 Mechelen
Rechtbank eerste aanleg Antwerpen - afdeling Turnhout
court-of-first-instance-antwerpen-turnhout
Antwerpen
Kasteelplein 1
2300 Turnhout
Mo-Fr 08:30-12:30,13:30-16:00
BE93 6792 0090 3467
Tribunal de première instance du Brabant Wallon
court-of-first-instance-brabant-wallon
Waals-Brabant
No single address
067 28 23 07 (Greffe de la section pénale / correctionnelle)
nivelles.greffe.correctionnel@just.fgov.be (Greffe de la section pénale / correctionnelle)
fax 067 28 23 80 (Greffe de la section pénale / correctionnelle)
067 88 71 31 (Greffe de la section jeunesse / protectionnelle)
jeunesseprotect.bw@just.fgov.be (Greffe de la section jeunesse / protectionnelle)
067 87 51 51 (Greffe de la section civile)
and 3 more
Tribunal de première instance francophone de Bruxelles
court-of-first-instance-brussel-fr
Brussel
No single address
and 4 more
Nederlandstalige rechtbank van eerste aanleg Brussel
court-of-first-instance-brussel-nl
Brussel
Quatre Brasstraat 13
1000 Brussel
02 682 09 07 (Secretariaat van de hoofdgriffier)
fax 02 519 86 45 (Secretariaat van de hoofdgriffier)
brussel.rea.secr.hoofdgriffier@just.fgov.be (Secretariaat van de hoofdgriffier)
02 682 09 07 (Secretariaat van de voorzitter)
fax 02 519 86 45 (Secretariaat van de voorzitter)
brussel.rea.secr.voorzitter@just.fgov.be (Secretariaat van de voorzitter)
and 1 more
Gericht Erster Instanz Eupen
Tribunal de première instance d'Eupen
court-of-first-instance-eupen
Eupen
Rathausplatz 4
4700 Eupen
02 682 08 39 (Jugendkanzlei)
zivilkanzlei.eupen@just.fgov.be (Zivil- und Familienkanzlei)
02 682 08 39 (Zivil- und Familienkanzlei)
02 682 08 39 (Strafkanzlei)
and 7 more
Tribunal de première instance du Hainaut
court-of-first-instance-hainaut
Henegouwen
No single address
Mo-Fr 08:30-12:30,13:30-16:00
Tribunal de première instance du Hainaut - division Charleroi
court-of-first-instance-hainaut-charleroi
Henegouwen
Avenue Général Michel 2 Boîte 1
6000 Charleroi
Mo-Fr 08:30-12:30,13:30-16:00
02 682 19 45 (Accueil)
071 23 66 01 (Secrétariat de la Présidence)
065 35 65 73 (Secrétariat Greffier en Chef)
Tribunal de première instance du Hainaut - division Mons
court-of-first-instance-hainaut-mons
Henegouwen
Rue de Nimy 35
7000 Mons
Mo-Fr 08:30-12:30,13:30-16:00
065 35 66 59 (Secrétariat de la Présidence)
065 35 65 73 (Secrétariat du Greffier en chef)
Tribunal de première instance du Hainaut - division Tournai
court-of-first-instance-hainaut-tournai
Henegouwen
Place du Palais de Justice 5
7500 Tournai
Mo-Fr 08:30-12:30,13:30-16:00
Rechtbank eerste aanleg Leuven
court-of-first-instance-leuven
Leuven
Ferdinand Smoldersplein 5
3000 Leuven
02 682 15 41 (Griffie burgerlijke rechtbank)
realeuven.burgerlijk@just.fgov.be (Griffie burgerlijke rechtbank)
02 682 15 37 (Griffie correctionele rechtbank: dienst zittingen)
02 682 15 39 (Griffie correctionele rechtbank: dienst overtuigingsstukken)
corr.leuven@just.fgov.be (Griffie correctionele rechtbank)
02 682 15 43 (Griffie jeugdrechtbank)
and 14 more
Tribunal de première instance de Liège
court-of-first-instance-liege
Luik
Rue de Bruxelles 2 - 3
4000 Liège
stephane.cloes@just.fgov.be (Secrétariat du Président)
secretariatgchef.tpi.liege@just.fgov.be (Secrétariat du Greffier en chef)
Tribunal de première instance de Liège - division Huy
court-of-first-instance-liege-huy
Luik
Palais de Justice de Huy, Quai d'Arona
4500 Huy
085 24 45 67 (Greffe de l'instruction)
chcinstruction.tpi.huy@just.fgov.be (Greffe de l'instruction)
085 24 45 75 (Greffe correctionnel)
correctionnel.tpi.huy@just.fgov.be (Greffe correctionnel)
085 24 45 79 (Greffe civil)
and 8 more
Tribunal de première instance de Liège - division Liège
court-of-first-instance-liege-liege
Luik
Rue de Bruxelles 2 - 3
4000 Liège
02 682 07 70 (Numéro unique général de contact division de Liège)
instruction.tpi.liege@just.fgov.be (Greffe de l'instruction)
penal.tpi.liege@just.fgov.be (Greffe correctionnel)
liege.tpi.famille@just.fgov.be (Greffe de la famille)
protectionnel.tpi.liege@just.fgov.be (Greffe protectionnel (jeunesse))
and 12 more
Tribunal de première instance de Liège - division Verviers
court-of-first-instance-liege-verviers
Luik
Rue du Tribunal 4
4800 Verviers
02 682 03 23 (Greffe de l'instruction)
correctionnel.tpi.verviers@just.fgov.be (Greffe de l'instruction)
02 682 03 23 (Greffe correctionnel)
02 682 03 23 (Greffe civil)
and 7 more
Rechtbank eerste aanleg Limburg
court-of-first-instance-limburg
Limburg
No single address
Rechtbank eerste aanleg Limburg - afdeling Hasselt
court-of-first-instance-limburg-hasselt
Limburg
Parklaan 25/2
3500 Hasselt
Mo-Fr 08:30-12:30,13:30-16:00
Rechtbank eerste aanleg Limburg - afdeling Tongeren-Borgloon
court-of-first-instance-limburg-tongeren-borgloon
Limburg
Piepelpoel 10
3700 Tongeren-Borgloon
Tribunal de première instance du Luxembourg
court-of-first-instance-luxembourg
Luxemburg
No single address
Tribunal de première instance du Luxembourg - division Arlon
court-of-first-instance-luxembourg-arlon
Luxemburg
Place Schalbert, Bâtiment A
6700 Arlon
Mo-Fr 08:30-12:30,13:30-16:00
063 21 52 33 (Section correctionnelle)
correctionnel.arlon@just.fgov.be (Section correctionnelle)
063 21 52 33 (Section civile)
arlon.civil@just.fgov.be (Section civile)
063 21 52 33 (Section instruction)
and 3 more
Tribunal de première instance du Luxembourg - division Marche-en-Famenne
court-of-first-instance-luxembourg-marche-en-famenne
Luxemburg
Rue Victor Libert 9
6900 Marche-en-Famenne
Mo-Fr 08:30-12:30,13:30-16:00
084 31 07 00 (Section famille/jeunesse)
marche.famille@just.fgov.be (Section famille/jeunesse)
084 31 07 00 (Section correctionnelle)
correctionnel.marche@just.fgov.be (Section correctionnelle)
084 31 07 25 (Section instruction)
and 4 more
Tribunal de première instance du Luxembourg - division Neufchâteau
court-of-first-instance-luxembourg-neufchateau
Luxemburg
Place Charles Bergh 1 et 7/1
6840 Neufchâteau
Mo-Fr 08:30-12:30,13:30-16:00
02 682 08 25 (Section civile/saisies)
neufchateau.civil@just.fgov.be (Section civile/saisies)
02 682 08 25 (Section famille/jeunesse)
neufchateau.famille@just.fgov.be (Section famille/jeunesse)
02 682 08 25 (Section correctionnelle)
correctionnel.neufchateau@just.fgov.be (Section correctionnelle)
and 1 more
Tribunal de première instance de Namur
court-of-first-instance-namur
Namen
rue Général Michel 10
5000 Namur
Mo-Fr 08:30-12:30,13:30-16:00
greffecorrectionnel.dinant@just.fgov.be (Greffe correctionnel - DINANT)
greffecorrectionnel.namur@just.fgov.be (Greffe correctionnel - NAMUR)
pac.dinant@just.fgov.be (Greffe correctionnel (pièces à conviction) - DINANT)
pac.namur@just.fgov.be (Greffe correctionnel (pièces à conviction) - NAMUR)
famille.dinant@just.fgov.be (Greffe de la Famille - DINANT)
famille.namur@just.fgov.be (Greffe de la Famille - NAMUR)
and 9 more
Tribunal de première instance de Namur - division Dinant
court-of-first-instance-namur-dinant
Namen
Place du Palais de Justice 6
5500 Dinant
Mo-Fr 08:30-12:30,13:30-16:00
02 682 04 62 (Greffe correctionnel)
02 682 04 62 (Greffe correctionnel (Pièces à conviction))
pac.namur@just.fgov.be (Greffe correctionnel (Pièces à conviction))
02 682 04 62 (Greffe de la Famille)
famille.dinant@just.fgov.be (Greffe de la Famille)
and 7 more
Tribunal de première instance de Namur - division Namur
court-of-first-instance-namur-namur
Namen
rue Général Michel 10
5000 Namur
Mo-Fr 08:30-12:30,13:30-16:00
pac.namur@just.fgov.be (Greffe correctionnel (pièces à conviction))
famille.namur@just.fgov.be (Greffe de la Famille)
jeunesse.namur@just.fgov.be (Greffe de la Jeunesse et Chambre de règlement amiable)
tpinamur.compta@just.fgov.be (Service comptabilité (BE79 6792 0087 0933))
and 2 more
Rechtbank eerste aanleg Oost-Vlaanderen
court-of-first-instance-oost-vlaanderen
Oost-Vlaanderen
No single address
Mo-Fr 08:30-12:30,13:30-16:00
Rechtbank eerste aanleg Oost-Vlaanderen - afdeling Dendermonde
court-of-first-instance-oost-vlaanderen-dendermonde
Oost-Vlaanderen
Justitieplein 1
9200 Dendermonde
Mo-Fr 08:30-12:30,13:30-16:00
02 682 19 03 (Griffie burgerlijke en familierechtbank: keuzemenu 3-2)
ovl.rea.de.burgerlijk.griffie@just.fgov.be (Griffie burgerlijke en familierechtbank)
02 682 19 03 (Afschriften/expedities burgerlijke en familierechtbank: keuzemenu 3-1)
ovl.rea.de.bur.expeditie@just.fgov.be (Afschriften/expedities burgerlijke en familierechtbank)
02 682 19 03 (Griffie jeugdrechtbank: keuzemenu 2)
ovl.rea.de.jeugd@just.fgov.be (Griffie jeugdrechtbank)
and 9 more
Rechtbank eerste aanleg Oost-Vlaanderen - afdeling Gent
court-of-first-instance-oost-vlaanderen-gent
Oost-Vlaanderen
Opgeëistenlaan 401A
9000 Gent
02 682 01 70 (Secretariaat afdelingsvoorzitter)
ovl.rea.secrvoorzittergent@just.fgov.be (Secretariaat afdelingsvoorzitter)
02 682 01 70 (Secretariaat afdelingsgriffier)
Rechtbank eerste aanleg Oost-Vlaanderen - afdeling Oudenaarde
court-of-first-instance-oost-vlaanderen-oudenaarde
Oost-Vlaanderen
Bourgondiëstraat 5
9700 Oudenaarde
Mo-Fr 08:30-12:30,13:30-16:00
02 682 06 84 (correctionele griffie: NIEUW keuze 1 (CORR) / keuze 6 (expedities/afschriften))
ovl.rea.ou.cor.griffie@just.fgov.be (correctionele griffie)
02 682 06 84 (burgerlijke griffie en griffie familierechtbank: NIEUW keuze 2 (BUR/FAM) / keuze 5 (boekhouding/deskundigen/rollen))
ovl.rea.ou.fam.bur@just.fgov.be (burgerlijke griffie en griffie familierechtbank)
02 682 06 84 (griffie raadkamer en onderzoek: NIEUW keuze 4)
ovl.rea.ou.onderzoek@just.fgov.be (griffie raadkamer en onderzoek)
and 2 more
Rechtbank eerste aanleg West-Vlaanderen
court-of-first-instance-west-vlaanderen
West-Vlaanderen
Kazernevest 3
8000 Brugge
Mo-Fr 08:30-12:30,13:30-16:00
Rechtbank eerste aanleg West-Vlaanderen - afdeling Brugge
court-of-first-instance-west-vlaanderen-brugge
West-Vlaanderen
Kazernevest 3
8000 Brugge
Mo-Fr 08:30-12:30,13:30-16:00
050 47 32 20 (Griffie beslagrechter)
050 47 32 00 (Griffie burgerlijk (Inschrijvingen/Afschriften))
wvl.rea.bru.burgerlijk@just.fgov.be (Griffie burgerlijk (Inschrijvingen/Afschriften))
050 47 31 00 (Griffie correctioneel)
050 47 32 20 (Griffie familierechtbank)
and 12 more
Rechtbank eerste aanleg West-Vlaanderen - afdeling Ieper
court-of-first-instance-west-vlaanderen-ieper
West-Vlaanderen
Grote Markt 1
8900 Ieper
Mo-Fr 08:30-12:30,13:30-16:00
02 682 05 04 (Griffie burgerlijke en familierechtbank)
wvl.rea.iep.burgerlijk.familie@just.fgov.be (Griffie burgerlijke en familierechtbank)
02 682 05 04 (Griffie correctioneel)
02 682 05 04 (Griffie jeugd)
and 5 more

Fields ​

FieldTypeDescription
idCourtIdStable id: the type, then the place in the court's own language: justice-of-the-peace-gent-1, police-court-brussel-fr, enterprise-court-gent-brugge. See identifiers
validFromstring?First day the record applies, YYYY-MM-DD: the day the portal first listed it. None: since the coverage starts
validTostring?Last day the record applies: the day before the weekly check found it gone from the portal. None: still applies
typeCourtTypejustice-of-the-peace, police-court, court-of-first-instance, enterprise-court, labour-court, court-of-appeal, labour-court-of-appeal, court-of-assize
kind'court' | 'division' | 'seat'The court itself, one of its divisions (afdeling, division, Abteilung), or one of the places a justice of the peace sits
courtCourtId?For a division or seat: the court it belongs to
name{ nl?, fr?, de? }The name as the court publishes it, in each language it has a page in: Vredegerecht Gent 1, Tribunal de l'entreprise du Hainaut - division Mons
label{ nl, fr, de }?For a justice of the peace (not its seats): a display label built from its canton, Vredegerecht 1e kanton Gent, as formatCourtName(court, locale, { style: 'canton' }) gives it. Generated, not the official name
judicialAreaJudicialAreaIdThe judicial area
arrondissementArrondissementId?The arrondissement, for a court or division whose area is one arrondissement or lies within one
cantonCantonId?For a justice of the peace: the canton it serves
cantonsCantonId[]?For every other court (not its divisions): the cantons it covers, as the annex to the Judicial Code (art. 3–5) and art. 114 of the Code set them
eclistring[]?The court's ECLI codes, one per language it judges in; only codes seen in published decisions
addressAddress?Where the registry is, with the municipality its postal code belongs to (municipality, by REFNIS code). Missing when the court publishes no single address (a court whose divisions each have their own)
contactsContact[]Phone, fax, e-mail and bank account, each with the registry it belongs to (label) and the text published with it (note)
openingHoursstring?Registry hours in OpenStreetMap opening_hours syntax: Mo-Fr 08:30-12:30,13:30-16:00, only when the published text says exactly that
openingHoursText{ nl?, fr?, de? }?The opening hours as published, per language
website{ nl?, fr?, de? }The court's page on the portal, per language
sources{ url, retrieved }[]The pages the record was read from, and when their content was first seen

New court types

type may gain values (the Court of Cassation, for one). If you switch on it, keep a default branch so a new type doesn't break your code.

Shape ​

ts
interface Court {
    id: CourtId
    validFrom?: string
    validTo?: string
    type: CourtType
    kind: 'court' | 'division' | 'seat'
    court?: CourtId
    name: Partial<Translated>
    label?: Translated
    judicialArea: JudicialAreaId
    arrondissement?: ArrondissementId
    canton?: CantonId
    cantons?: CantonId[]
    ecli?: string[]
    address?: Address
    contacts: Contact[]
    openingHours?: string
    openingHoursText?: Partial<Translated>
    website: Partial<Record<Locale, string>>
    sources: SourceRef[]
}

interface Address {
    building?: string
    street: string // as published, with number, box or floor: 'Beverstraat 7B (eerste verdieping)'
    postalCode: string
    city: string
    municipality?: MunicipalityId // through the postal code; see the postal codes page
}

interface Contact {
    type: 'phone' | 'fax' | 'email' | 'bank-account'
    value: string // canonical: E.164, lowercase e-mail, electronic IBAN
    label?: string // the registry or service: 'Burgerlijke griffie', 'Greffe pénal'
    note?: string // text published with the value: 'druk 1', 'tapez 2'
}

Locations ​

File: data/court-locations.json, entry point belgica/court-locations. A point on the map for each justice of the peace, from the National Geographic Institute's peace court layer in the file the canton boundaries come from.

ts
import { getCourtLocation } from 'belgica/court-locations'

getCourtLocation('justice-of-the-peace-aalst-1')?.geometry
// { type: 'Point', coordinates: [4.0409722, 50.941518] }: longitude, latitude (WGS 84)
FieldTypeDescription
id, courtCourtIdThe court, or seat of one, the point is the location of
validFrom, validTostring?The days the record applies. See time
ngiIdstringThe NGI's identifier of the point (its tgid), a GUID
addressstringThe address the NGI gives with the point, as published: Place de la Résistance 3
geometryPointGeoJSON, WGS 84, longitude first, rounded to 7 decimals
sources{ url, retrieved }[]The NGI file the record was read from

Not every justice of the peace has one

The NGI moves a point when it hears of a move, and doesn't always: in its July 2026 file, about one point in seven still sits at a building the court has left. A point is only kept when the NGI's address has the house number of the court's address on the portal (comparing numbers, not streets, keeps the Brussels courts whose address the NGI gives in French and the portal in Dutch). The others are left out, and listed by the build. So getCourtLocation returns undefined for those courts, and for every other kind of court, which the NGI has no layer for.

Helpers ​

Each is described, with its results and errors, in the API reference.

ts
getCourt('justice-of-the-peace-gent-1')
getJusticeOfThePeace('gent-1') // the same court, by canton id
getDivisions('enterprise-court-gent') // its eight divisions
getCourtsForCanton('gent-1') // its justice of the peace, and one court of each other type
findCourtsWithJurisdiction('23088', 'police-court') // [police-court-vilvoorde], by REFNIS code
findCourts({ type: 'police-court', kind: 'court', judicialArea: 'gent' })
getContact(court, 'email', 'Greffe pénal') // the first matching contact's value
formatPhoneNumber('+3253820701') // '053 82 07 01'
formatIban('BE73679200844560') // 'BE73 6792 0084 4560'

Only the courts you need ​

data/courts.json is the complete file, about 580 KB. An app that needs some courts, in a browser above all, can load smaller files generated from it. Every path below is public API, like the ids.

FileContents
data/courts/<type>.jsonEvery court, division and seat of a type, in all of Belgium
data/courts/<type>/<arrondissement>.jsonThose of one type in one arrondissement
data/courts/<type>/judicial-area/<area>.jsonThose of one type without an arrondissement, by judicial area
data/courts/details/<id>.jsonOne court's contacts, openingHours, openingHoursText, website, sources and ecli, one entry per version
data/courts/index.jsonEach court id → its file under data/courts/, without .json

The list files hold summaries (CourtSummary): id, validFrom, validTo, type, kind, court, name, label, canton, cantons, arrondissement, judicialArea and address. A summary and its details together are the full record. Every court is in exactly one <type>/… file; a court whose area covers several arrondissements (a court of appeal, the labour courts of Antwerpen and Liège, …) has no arrondissement and is in the file of its judicial area. Like data/courts.json, the files hold every version of a record.

Import a file statically when you know which one you need. The 38 justices of the peace of East and West Flanders are 15 KB minified (2 KB gzip), against 410 KB for belgica/courts:

ts
import east from 'belgica/data/courts/justice-of-the-peace/oost-vlaanderen.json' with { type: 'json' }
import west from 'belgica/data/courts/justice-of-the-peace/west-vlaanderen.json' with { type: 'json' }
import { formatCourtName, type CourtSummary } from 'belgica/courts/format'

// A JSON import types `type` and `kind` as string: cast to the summary type
const courts = [...east, ...west] as CourtSummary[]
courts.map((court) => formatCourtName(court, 'nl', { style: 'canton' }))

Or load them when they're needed, with belgica/courts/load. Each file is its own import(), so a bundler makes a chunk of it and a browser downloads only what you ask for:

ts
import { loadCourts, loadCourt, loadCourtDetails } from 'belgica/courts/load'

await loadCourts({ type: 'justice-of-the-peace', arrondissement: 'oost-vlaanderen' })
await loadCourt('justice-of-the-peace-gent-1') // an id from a saved file: index.json, then its file
await loadCourtDetails('justice-of-the-peace-gent-1') // its contacts, for the one court you show

The loader is 8 KB minified (2 KB gzip). Every file needs an entry in it, so the map of the 347 details files is a chunk of its own, 31 KB (5 KB gzip), that the first loadCourtDetails loads.

belgica/courts/format has formatCourtName, getContact, formatPhoneNumber and formatIban, and loads no data: they work on a court you already hold.

How the data is read ​

The portal has a page per court and per division, in the court's language; bilingual courts in Brussels have a page in Dutch and one in French, and the courts in Eupen one in French and one in German. The parser:

  1. reads the court's type and place from its name (Politierechtbank Limburg - afdeling Genk), and the canton of a justice of the peace from its name and number;
  2. merges the language versions of one court into one record: names, pages and opening hours per language; address and contacts from the first language (Dutch in Brussels, German in Eupen), with any value only the other page has;
  3. reads the registries' contact blocks, keeping each value with its registry;
  4. turns the published opening hours into opening_hours syntax only when every word is understood and every language says the same. Text with a note or a temporary arrangement ("OPGELET: tot 31 december…") keeps only the published text;
  5. gives each court the cantons the law assigns it (cantons), from a table of the annex to the Judicial Code in scripts/parse/jurisdictions.ts, and derives its arrondissement from them. The table and the portal check each other: a court on the portal that the law table lacks, or the reverse, stops the build.

It refuses to write anything when a page can't be placed (an unknown kind of court, a justice of the peace without a canton), a canton has no court, or the law table and the portal disagree on which courts exist. What it can't read (a phone number without an area code, an address written as a sentence) is reported with the weekly pull request, and left out of the data rather than guessed.

Canonical values ​

ValueStored asWhy
Phone numberE.164: +3253820701One form per number, dialable from anywhere, tel: links work as is
IBANElectronic format: BE73679200844560The form payment systems take; the checksum is verified when read and in the tests
E-mailLowercaseComparisons and deduplication work
Opening hoursopening_hours: Mo-Fr 08:30-12:30,13:30-16:00The OpenStreetMap standard, with parsers in many languages (e.g. opening_hours.js) and no language of its own
StreetAs publishedNumbers, boxes and floors are written too many ways (Canadaplein ZN, Rue de Bruxelles 2 - 3) to split them without guessing

Code under MIT, data under CC BY 4.0. Reference data, not legal advice: check the official sources.