OTM krijgt een officiële .NET-library op NuGet

Crowds of fun-seekers exploring a city on foot, "

Arjan Franzen

1 juli 2025

Diagram: de drie NuGet-packages OpenTripModel.Model, .Profile en .Serializer met hun taak, en de installatieregel dotnet add package OpenTripModel.Model

Op 1 juli 2025 werd OpenTripModel.Model gepubliceerd op NuGet. Kort daarna, op 7 juli, volgden OpenTripModel.Serializer en OpenTripModel.Profile.

Dat klinkt als een gewone package-release. Het is er geen, want het is de eerste keer dat je OTM in .NET kunt gebruiken zonder de specificatie eerst met de hand na te typen.

Waar hebben we het over — wat is OTM? Het Open Trip Model is een open standaard voor het uitwisselen van logistieke ritgegevens over het internet: ritten, zendingen, transportorders, voertuigen, locaties, goederen en de events die daarbij horen, als lichtgewicht JSON over een REST-API.

Het punt van OTM is dat verladers, vervoerders, softwareleveranciers en wegbeheerders dezelfde rit op dezelfde manier beschrijven. Zonder die afspraak bouwt elke partij een vertaallaag naar elke andere partij, en betaalt de hele sector voor hetzelfde probleem. De standaard wordt sinds 2018 beheerd door de Stichting Uniforme Transport Code, samen met TLN, evofenedex en DALTI.

Waarom een library uitmaakt

Een standaard is pas een standaard als hij daadwerkelijk hetzelfde geïmplementeerd wordt. En daar zat het gat.

OTM bestond uit een OpenAPI-specificatie en een documentatiesite — sinds mei 2025 op versie 5.7. Wilde je koppelen, dan schreef je zelf de types, zelf de serialisatie, zelf de validatie. Iedereen deed dat, iedereen deed dat nét anders, en de verschillen kwamen pas boven tafel bij de eerste integratietest met een tegenpartij.

Een gedeelde library haalt precies dat weg. Niet omdat je zelf geen types kunt schrijven, maar omdat jouw types en die van je tegenpartij dan uit dezelfde bron komen.

Drie packages, drie taken

De .NET-toolkit is opgesplitst in drie onafhankelijke packages, en die splitsing is verstandig gekozen:

  • OpenTripModel.Model — C#-typedefinities voor de OTM v5-entiteiten. Trip, Vehicle, Location, StopAction, associaties, enums. Kant-en-klare datastructuren die één-op-één de entiteiten van de specificatie volgen.
  • OpenTripModel.Profile — validatie van een bericht tegen een gekozen profiel: verplichte velden, waardebeperkingen zoals lengtes, patronen en enums, en het signaleren van onbekende velden waar die niet toegestaan zijn. Levert een pass/fail mét reden.
  • OpenTripModel.Serializer — JSON-serialisatie volgens de OTM-conventies: camelCase, enums als string, voorspelbare omgang met null.

Die middelste is de interessantste. Profielen zijn in OTM de manier waarop een specifieke use case invult wat er verplicht is — het transportorder-profiel, het CBS-profiel voor wegvervoerstatistiek, het carbon footprint-profiel, het eFTI-profiel. De kernspecificatie laat veel open; het profiel maakt het concreet.

Dat betekent dat 'valide OTM' zonder profiel een halve vraag is. Een library die validatie tegen een profiel meelevert, valideert dus tegen de afspraak die er werkelijk toe doet, in plaats van tegen het schema in het algemeen.

Hoe het eruitziet

De opzet is bewust saai, in de goede zin. Je bouwt een Trip, hangt er een Vehicle en een lijst acties aan via de associatie-types die OTM ook in JSON gebruikt, valideert tegen je profiel en serialiseert.

dotnet add package OpenTripModel.Model

En dan gewoon C#-objecten, met InlineAssociationType<T> voor de inline-associaties die OTM kent. Geen eigen transportlaag, geen eigen client: publiceren doe je via de HTTP-, bestand- of messaging-stack die je al hebt. De library gaat over het model, niet over hoe je berichten verstuurt.

Dat is een goede grens. Een library die ook je transport wil regelen, is een library die je over drie jaar niet meer kwijtraakt.

De aanloop

Voor de volledigheid, want de datums lopen door elkaar: de repository begon op 24 april 2025, en op 27 mei 2025 stond er al een eerste package op NuGet onder de werknaam otm.model. Die is later vervangen door de OpenTripModel.*-serie die op 1 en 7 juli verscheen.

Wie het pakket zoekt: uitgever is FiLogic B.V., en de packages heten voluit OpenTripModel.Model, OpenTripModel.Profile en OpenTripModel.Serializer.

Wat wij ervan vinden

Het bestaan van een officiële library verandert de businesscase van een OTM-koppeling. Niet dramatisch — je bespaart een paar dagen typewerk — maar wel structureel, want je bespaart die dagen bij élke release van de standaard opnieuw, en je bespaart de discussie met je tegenpartij over wiens interpretatie klopt.

De vraag die je jezelf wel moet stellen: hoe snel volgt zo'n library de standaard? Een library die achterloopt is erger dan geen library, want dan denk je dat je bij bent. Daar komen we in een volgend artikel op terug — de versienummers van deze packages hebben later een veelzeggende sprong gemaakt.

Voor Keana, onze planningssoftware voor groene stadslogistiek, is dit soort standaardisatie het verschil tussen aansluiten en aanbouwen. Hoe minder van een koppeling maatwerk is, hoe meer tijd er overblijft voor het probleem dat er werkelijk toe doet: minder ritten door de binnenstad. Bekijk de Keana-case.

Kort samengevat

Op 1 juli 2025 verscheen OpenTripModel.Model op NuGet, gevolgd door OpenTripModel.Serializer en OpenTripModel.Profile op 7 juli 2025.

Drie packages: modeltypes voor de OTM v5-entiteiten, validatie tegen een OTM-profiel met pass/fail en reden, en serialisatie volgens de OTM-JSON-conventies. Geen transportlaag — die houd je zelf.

Daarmee is OTM voor .NET-teams voor het eerst iets dat je installeert in plaats van iets dat je naschrijft.

no image placeholder

Softwareontwikkeling ontmoeilijken