MAGDA Mobiliteit

Inleiding

Voertuiggegevens ophalen. Deze info kunnen gemeentes gebruiken voor het aanrekenen van parkeerretributies of GAS-boetes. Daarnaast zijn er ook use cases met betrekking tot lage emissie zones of voertuigkeuringen.

Use cases

  • Automatisch de titularis van een nummerplaat achterhalen voor het aanrekenen van parkeerretributies of GAS-boetes (bijvoorbeeld na vaststelling door een sanctionerend ambtenaar, een scanwagen of een ANPR-camera).

  • Nagaan of een voertuig toegang heeft tot een lage-emissiezone op basis van de voertuigkenmerken (brandstoftype, vermogen, euronorm), rekening houdend met het proportionaliteitsbeginsel binnen de GDPR.

  • Bepalen van de ouderdom van een voertuig ter voorbereiding van een uitnodiging tot keuring (convocatie).

  • Opzoeken van de titularis van een buitenlands voertuig, bijvoorbeeld bij een vastgestelde overtreding met een niet-Belgische nummerplaat.

  • Actuele adresgegevens van de titularis ophalen (indien de instelling hiervoor een aparte machtiging heeft) voor correcte facturatie of aanmaning.

Setup

Idem als bij alle MAGDA-connectoren. Zie MAGDA algemene setup.

Specifieke applicatie eigenschappen

Specifieke applicatie eigenschappen, los van de eigenschappen die de toegang regelen.

Car

Enkel voor giveCar.

De aangesproken service wordt uitgefaseerd langs de kant van MAGDA. Gebruik bij voorkeur de overige functies binnen de mobiliteitsconnector.

Mobility

Voor de overige functies.

De MAGDA Mobiliteit-connector is de enige MAGDA-connectorvariant die communiceert via een REST API. De andere MAGDA-connectoren hanteren SOAP als communicatiemodus.

Eigenschap

Default

Beschrijving

skryv.connectors.magda.mobility.url

-

Base-URL voor de Mobility REST API

skryv.connectors.magda.mobility.tokenUrl

-

OAuth2 token-endpoint URL

skryv.connectors.magda.mobility.scope

-

OAuth2 scopes (spatie-gescheiden)

skryv.connectors.magda.mobility.clientId

-

OAuth2 client ID (UUID-formaat)

skryv.connectors.magda.mobility.keyPath

-

Lokaal bestandspad naar de JWK-key (JSON-formaat)

skryv.connectors.magda.mobility.is-aws-seed-enabled

false

Indien true, laad de JWK-key uit AWS Secrets Manager i.p.v. lokaal bestand.

skryv.connectors.magda.mobility.aws-key-path

-

AWS Secrets Manager-pad voor de JWK-key.

Services en functies

Overzicht

Functie

Retourtype

Info

giveCar

GeefVoertuigResponse

Voertuiggegevens op basis van nummerplaat (uitgefaseerde SOAP-dienst)

giveCrossbordertitularsByPlate

CrossborderTitularsResponse

Titularisgegevens van een buitenlands voertuig op basis van nummerplaat en landcode (REST API)

giveRegistrationsTitularByPlate

RegistrationsTitularResponse

Titularis- en voertuiggegevens van een Belgisch voertuig op basis van nummerplaat (REST API)

Elke functie hieronder is, naast de workflow expressie, ook rechtstreeks aanroepbaar vanuit Java-code door MagdaCamundaConnector (bean magda) te injecteren in je klasse. Zie MAGDA gebruik voor een volledig voorbeeld met dependency injection. De "Java-code"-snippets per functie tonen enkel de effectieve aanroep zelf.

giveCar

Vraag voertuiggegevens op op basis van nummerplaat.

De aangesproken SOAP-service wordt uitgefaseerd langs de kant van MAGDA. Gebruik bij voorkeur de overige functies binnen de mobiliteitsconnector.

Workflow expressie

${magda.giveCar(String licensePlate, String date, String dossierId)}

Java-code

GeefVoertuigResponse response = magda.giveCar(licensePlate, date, dossierId);

Input

Inputparameters

Data type

Voorbeeld

Uitleg

licensePlate

String

‘ABC 123’

Nummerplaat voertuig

date

String (date format: YYYY-MM-DD)

‘2025-05-30’

Refertedatum

dossierId

String (GUID)

'550e8400-e29b-41d4-a716-446655440000'

Unieke id van het dossier binnen de Skryv applicatie (met oog op logging van de call)

MAGDA-documentatie

Technische documentatie rond geefVoertuig

Output

Je krijgt een getypeerd GeefVoertuigResponse-object terug met de gegevens van het voertuig: nummerplaat, chassisnummer, eigenaar (INSZ of ondernemingsnummer, nooit beide), commerciële naam, kleur, categorie, euronorm en datum van eerste inschrijving. Daarnaast bevat het object ook uitgebreidere technische gegevens (afmetingen, massa, vermogen, brandstof, ...) en gegevens over de status en levenscyclus van de inschrijving.

Gepseudonimiseerd voorbeeld:

<Inhoud>
    <Voertuig>
        <Nummerplaat>1AAA123</Nummerplaat>
        <Chassisnummer>2FTJW35GXRCA04699</Chassisnummer>
        <Eigenaar>
            <INSZ>850102XXX45</INSZ>
        </Eigenaar>
        <CommercieleNaam>OPEL CORSA</CommercieleNaam>
        <Kleur>
            <Code>J</Code>
            <Omschrijving>Oranje</Omschrijving>
        </Kleur>
        <Categorie>
            <Code>M1</Code>
            <Omschrijving>VOERTUIGEN BESTEMD VOOR PERSONENVERVOER - TEN HOOGSTE 8 ZITPLAATSEN, BESTUURDER NIET MEEGEREKEND</Omschrijving>
        </Categorie>
        <Euronorm>
            <Code>6</Code>
            <Omschrijving>Euro 6</Omschrijving>
        </Euronorm>
        <DatumEersteInschrijving>2015-05-06</DatumEersteInschrijving>
    </Voertuig>
</Inhoud>

(Opmerking: Eigenaar bevat óf een INSZ-element óf een Ondernemingsnummer-element, nooit beide — afhankelijk van of de eigenaar een natuurlijke persoon of een onderneming is.)

Error-handling

Aan deze functie gerelateerde foutcodes:

Code

Type

Toelichting

30001

FOUT

Geen gegevens gevonden voor de vraag

40131

FOUT

Het chassisnummer is onbekend — de nummerplaat is niet (meer) gekoppeld aan een voertuig (uitgeschreven nummerplaat)

40005

FOUT

De toegang tot de gegevens is geweigerd

60009

FOUT

Er heeft zich een technisch probleem voorgedaan

Voor een compleet overzicht, kan je terecht op de MAGDA-foutcodepagina.

Bij sommige errors wil je het proces niet laten vastlopen. In dat geval vorm je de technische error (foutcode) om naar een BPMN-error en vang je deze op via een error boundary event.

// Voorbeeld: uitzondering opvangen en gooien als BpmnError
GeefVoertuigResponse response = magda.giveCar(licensePlate, date, dossierId);

List<UitzonderingType> uitzonderingen = response.getRepliek()
    .getAntwoorden().getAntwoord().getUitzonderingen().getUitzondering();

for (UitzonderingType uitzondering : uitzonderingen) {
    String code = uitzondering.getIdentificatie();
    if ("30001".equals(code)) {
        throw new BpmnError("MAGDA_VOERTUIG_NIET_GEVONDEN", uitzondering.getDiagnose());
    }
    if ("40131".equals(code)) {
        throw new BpmnError("MAGDA_NUMMERPLAAT_ONBEKEND", uitzondering.getDiagnose());
    }
    if ("40005".equals(code)) {
        throw new BpmnError("MAGDA_TOEGANG_GEWEIGERD", uitzondering.getDiagnose());
    }
    if ("60009".equals(code)) {
        throw new BpmnError("MAGDA_TECHNISCHE_FOUT", uitzondering.getDiagnose());
    }
}

giveCrossbordertitularsByPlate

Vraag gegevens buitenlandse voertuigen op op basis van nummerplaat.

Workflow expressie 1

${magda.giveCrossbordertitularsByPlate(String plateNr1, String countryCode)}

Workflow expressie 2

${magda.giveCrossbordertitularsByPlate(String plateNr1, String countryCode, String dateTime)}

Java-code 1

CrossborderTitularsResponse response = magda.giveCrossbordertitularsByPlate(plateNr1, countryCode);

Java-code 2

CrossborderTitularsResponse response = magda.giveCrossbordertitularsByPlate(plateNr1, countryCode, dateTime);

Input

Inputparameters

Data type

Voorbeeld

Uitleg

plateNr1

String

‘ABC 123’

Nummerplaat voertuig

countryCode

String (hoofdletters volgens ISO 3166-1 alpha-2 landcode)

‘SE’

Landcode

dateTime

String (formaat volgens ISO-8601 date-time)

' 2024-09-15T11:30:00Z'

Refertedatum

MAGDA-documentatie

Technische documentatie rond mobility/crossborderTitulars-v1

Output

Je krijgt een getypeerd CrossborderTitularsResponse-object terug (JSON-LD) met de titularisgegevens van het buitenlandse voertuig. Het antwoord bevat een items-lijst met licentie-objecten; elk licentie-object bevat de gegevens van de titularis — ofwel als natuurlijke persoon (person), ofwel als organisatie (organisation), nooit beide — samen met diens contactinformatie (adres) en de landcode van de registratiedocumenten.

Gepseudonimiseerd voorbeeld (JSON-LD, gebaseerd op de officiële elementbeschrijving):

{
  "@context": "https://vlaamseoverheid.be/oslo/mobility/context",
  "self": "https://api.magda.vlaanderen.be/mobility/crossborderTitulars/SE/ABC123",
  "items": [
    {
      "license": {
        "@id": "_:100",
        "@type": "License",
        "person": {
          "firstName": "Anna",
          "lastName": "Peeters"
        },
        "contactInfo": {
          "address": {
            "streetName": "Kerkstraat",
            "houseNumber": "12",
            "postalCode": "9000",
            "municipality": "Gent",
            "country": "BE"
          }
        },
        "registrationLanguageCode": "SE",
        "type": "person"
      }
    }
  ]
}

Error-handling

Deze functie spreekt een REST-dienst aan. Foutafhandeling verloopt hier niet via een Uitzonderingen-lijst in het antwoord (zoals bij de SOAP-diensten), maar via de HTTP-statuscode van de aanroep. Bij een fout gooit de onderliggende RestTemplate een HttpStatusCodeException.

HTTP-status

Betekenis

Zinvol om te herproberen?

400

Bad Request — de vraag is foutief

Nee, eerst de vraag aanpassen

401

Unauthorized — geen toegangsrecht

Nee, eerst de aansluiting/machtiging controleren

500

Internal Server Error — onverwachte fout bij MAGDA

Nee, contacteer de MAGDA Service Desk

502 / 503 / 504

Tijdelijk probleem bij MAGDA of de bron

Ja — wordt trouwens al deels automatisch herprobeerd door de connector zelf (resilience4j @Retry)

// Voorbeeld: HTTP-fout opvangen en omzetten naar een BpmnError
try {
    CrossborderTitularsResponse response = magda.giveCrossbordertitularsByPlate(plateNr1, countryCode);
    // verwerk response
} catch (HttpClientErrorException.BadRequest e) {
    throw new BpmnError("MAGDA_ONGELDIGE_VRAAG", e.getMessage());
} catch (HttpClientErrorException.Unauthorized e) {
    throw new BpmnError("MAGDA_TOEGANG_GEWEIGERD", e.getMessage());
} catch (HttpServerErrorException e) {
    throw new BpmnError("MAGDA_TECHNISCHE_FOUT", e.getMessage());
}


giveRegistrationsTitularByPlate

Vraag voertuiggegevens op op basis van nummerplaat.

Workflow expressie

${magda.giveRegistrationsTitularByPlate(String plateNr, String date, String addressEnrichmentPerson, String addressEnrichmentOrganisation)}

Java-code

RegistrationsTitularResponse response = magda.giveRegistrationsTitularByPlate(plateNr, date, addressEnrichmentPerson, addressEnrichmentOrganisation);

Input

Alle parameters behalve plateNr zijn optioneel — geef null of een lege waarde mee indien niet van toepassing.

Inputparameters

Data type

Voorbeeld

Uitleg

plateNr

String

'1ABC123'

Nummerplaat voertuig (verplicht)

date

String (date format: YYYY-MM-DD)

'2025-05-30'

Refertedatum van de gevraagde situatie (optioneel). Wordt intern omgezet naar YYYY-MM-DDT00:00:00Z (middernacht UTC). Indien niet opgegeven, wordt de huidige datum/tijd gebruikt.

addressEnrichmentPerson

String

'RR' of 'KSZ'

Optioneel: geeft aan via welke bron het actuele adres van de titularis (indien een natuurlijke persoon) verrijkt moet worden. Vereist een aparte machtiging voor het opvragen van adresgegevens.

addressEnrichmentOrganisation

Boolean

true of false

Optioneel: geeft aan of het adres van de titularis (indien een onderneming) verrijkt moet worden via de Kruispuntbank van Ondernemingen.

Magda-documentatie

Technische documentatie rond mobility/registrationsTitular-v1

Output

Je krijgt een getypeerd RegistrationsTitularResponse-object terug (JSON-LD) met een items-lijst van "registration"-objecten. Elk registration-object bevat vier deelobjecten: driver (de gewone bestuurder van het voertuig), license (gegevens rond de nummerplaat), titular (de titularis — een natuurlijke persoon of een onderneming, nooit beide) en vehicle (technische gegevens van het voertuig). Doorgaans komt er 0 of 1 registration terug; meerdere zijn ook toegestaan.

Gepseudonimiseerd voorbeeld:

{
  "@context": "https://vlaamseoverheid.be/oslo/mobility/context",
  "self": "https://api.magda.vlaanderen.be/mobility/registrationsTitular?plateNr=1ABC123",
  "items": [
    {
      "registration": {
        "driver": {
          "firstName": "Anna",
          "lastName": "Peeters"
        },
        "license": {
          "plateNumber": "1ABC123",
          "firstRegistrationDate": "2015-05-06"
        },
        "titular": {
          "person": {
            "nationalNr": "850102XXX45",
            "firstName": "Anna",
            "lastName": "Peeters"
          },
          "contactInfo": {
            "address": {
              "streetName": "Kerkstraat",
              "houseNumber": "12",
              "postalCode": "9000",
              "municipality": "Gent",
              "country": "BE"
            }
          }
        },
        "vehicle": {
          "chassisNumber": "2FTJW35GXRCA04699",
          "commercialName": "OPEL CORSA",
          "colour": "Oranje"
        }
      }
    }
  ]
}

Error-handling

Deze functie spreekt een REST-dienst aan. Foutafhandeling verloopt hier niet via een Uitzonderingen-lijst in het antwoord (zoals bij de SOAP-diensten), maar via de HTTP-statuscode van de aanroep. Bij een fout gooit de onderliggende RestTemplate een HttpStatusCodeException.

HTTP-status

Betekenis

Zinvol om te herproberen?

400

Bad Request — de vraag is foutief

Nee, eerst de vraag aanpassen

401

Unauthorized — geen toegangsrecht

Nee, eerst de aansluiting/machtiging controleren

500

Internal Server Error — onverwachte fout bij MAGDA

Nee, contacteer de MAGDA Service Desk

502 / 503 / 504

Tijdelijk probleem bij MAGDA of de bron

Ja — wordt trouwens al deels automatisch herprobeerd door de connector zelf (resilience4j @Retry)

Bij sommige fouten wil je het proces niet laten vastlopen. In dat geval vorm je de HTTP-fout om naar een BPMN-error en vang je deze vervolgens op via een error boundary event.

try {
    RegistrationsTitularResponse response = magda.giveRegistrationsTitularByPlate(plateNr, date, addressEnrichmentPerson, addressEnrichmentOrganisation);
    // verwerk response
} catch (HttpClientErrorException.BadRequest e) {
    throw new BpmnError("MAGDA_ONGELDIGE_VRAAG", e.getMessage());
} catch (HttpClientErrorException.Unauthorized e) {
    throw new BpmnError("MAGDA_TOEGANG_GEWEIGERD", e.getMessage());
} catch (HttpServerErrorException e) {
    throw new BpmnError("MAGDA_TECHNISCHE_FOUT", e.getMessage());
}