Ga naar hoofdinhoud
Versie: 0.1.0

Specificatie

De OKAPI specificatie (momenteel geïmplementeerd / gespecificeerd in gRPC) bestaat uit drie onderdelen, de onboarding, configuratie en het op de hoogte gehouden worden van uitgevoerd werk. De onboarding methodes wordt gebruikt om een veilig verbinding op te zetten tussen het zorginformatiesysteem en dienstverlener en de configuratie methodes worden vervolgens gebruikt door het zorginformatiesysteem om de door de dienstverlener aangeboden diensten te configureren en patiënten aan en af te melden.

info

OKAPI vereist dat een applicatie die de OKAPI specificatie implementeert zijn GRPC interface alleen over een TLS verbinding aanbiedt.

Onboarding methodes

GetMetadata

De GetMetadata methode wordt gebruikt om metadata van de dienstverlener op te halen.

Request

Het GetMetadataRequest object heeft geen velden, als de koppeling niet is gelukt wordt dat gecommuniceerd door een foutmelding terug gegeven. Zie foutmeldingen voor meer details.

message GetMetadataRequest {}

Response

message GetMetadataResponse {
// Formele naam van de leverancier van de dienstverlener zoals ingeschreven bij de KvK.
string supplierFormalName = 1;
// Naam om te tonen in het zorginformatiesysteem voor identificatie doeleinden voor de zorgverlener.
string supplierDisplayName = 2;
// Naam van het product (overkoepelend systeem).
string productName = 3;
// Huidig versie van dit product.
string version = 4;
}

Register

De Register methode wordt gebruikt om een koppelverzoek in te schieten bij de dienstverlener.

Request

message RegisterRequest {
// Formele naam van de te koppelen organisatie (verantwoordelijk voor het zorginformatiesysteem)
// zoals ingeschreven bij de KvK.
string organisationFormalName = 1;
// Naam om te tonen in het product van de dienstverlener ter identificatie
// van de te koppelen organisatie.
string organisationDisplayName = 2;
// Identifier voor deze organisatie.
string organisationIdentifier = 3;
// Type van identifier gebruikt bij *organisationIdentifier*, bijvoorbeeld:
// AGB-code, BIG registratie of KvK-nummer.
string organisationIdentifierType = 4;
// Datatype voor het configureren van het authenticatie middel dat het zorginformatiesysteem gaat
// gebruiken richting de dienstverlener.
XISAuthConfiguration auth = 5;
}

Response

message RegisterResponse {
// Reeks tekens die deze registratie identificeert. Deze moet later bij het
// completeren van de koppelingen meegegeven worden.
string reference = 1;
}

Gebruikte datatypen

message XISAuthConfiguration {
// Geeft aan welke methode wordt gebruikt, mTLS of BearerToken
XISAuthMethod method = 1;
// Methode afhankelijke configuratie
oneof configuration {
MTLSConfigurationParams mtlsConfiguration = 2;
}
}

enum XISAuthMethod {
mTLS = 0;
}

message MTLSConfigurationParams {
// JWK (RFC 7517) presentatie van publieke sleutel van het
// client certificaat dat gebruikt gaat worden voor het opzetten
// van de verbinding.
// Voorbeeld: "{\"crv\":\"P-256\",\"kty\":\"EC\",\"x\":\"PZlyqX3X...\", \"y\":\"AawwPSKBt...\"}"
string publicKey = 1;
}

Errors

// Invalide configuratie voor de gekozen methode
InvalidXISAuthConfiguration;

Zie foutmeldingen voor meer informatie.

CompleteRegistration

De methode wordt gebruikt om, indien het koppelverzoek is gevalideerd en het registratie token is ontvangen, de koppeling te completeren.

Request

message CompleteRegistrationRequest {
// Reeks karakters dat is verkregen met de Register methode.
string reference = 1;
// Reeks karakters dat via een out-of-band kanaal is verkregen van
// de dienstverlener.
string authorisationToken = 2;
}

Response

Het response object heeft geen velden, als de koppeling niet is gelukt wordt dat gecommuniceerd door een foutmelding terug gegeven, een succesvol ontvangen response betekent dus een werkende koppeling. Zie foutmeldingen voor meer details.

message CompleteRegistrationResponse {
}

Errors

// Onbekende reference meegegeven
UnkownReference;
// Invalide autorisatiecode voor deze reference
InvalidAuthorisationToken;

Zie foutmeldingen voor meer informatie.

Configuratie methodes

EnableService

Deze methode wordt gebruikt om een service te activeren en de bijbehorende callbacks (de manier waarop de dienstverlener patientgegevens kan opvragen of opsturen bij / naar het zorginformatiesysteem) te configureren.

Request

message EnableServiceRequest {
// De identifier van van de service waarvan de callback wordt geconfigureerd
string serviceId 1;
// Datatype voor het configureren van het opsturen van gegevens naar het zorginformatiesysteem
CallbackConfiguration fetch = 3;
// Datatype voor het configureren van het ophalen van gegevens bij het zorginformatiesysteem
CallbackConfiguration push = 4;
}

Response

De EnableServiceResponse is een weerspiegeling van de EnableServiceRequest waarin staat wat de instellingen zijn voor deze service na het afhandelen van dit request.

message EnableServiceResponse {
// De identifier van van de service waarvan de callback wordt geconfigureerd
string serviceId 1;
// Datatype voor het configureren van het opsturen van gegevens naar het zorginformatiesysteem
CallbackConfiguration fetch = 3;
// Datatype voor het configureren van het ophalen van gegevens bij het zorginformatiesysteem
CallbackConfiguration push = 4;
}

In sommige gevallen is de response aangevuld met extra informatie die het zorginformatiesysteem niet zelf kan of wil aangeven. Een voorbeeld hiervan is het inregelen van een mTLS verbinding voor een fetch of push protocol. De dienstverlener is in dit geval degene die aangeeft met welk certificaat (publieke sleutel) deze zal gaan verbinden met het zorginformatiesysteem.

Hier een voolbeed hiervan in pseudocode

// Request
EnableServiceRequest {
service: "service-1",
fetch: CallbackConfiguration{
protocol: "example-proto",
config: google.protobuf.Struct{
"endpoint": "https://api.xis.nl"
},
auth: ProtocolAuthConfiguration{
method: "http://decozo.org/proto/auth/mtls"
}
},
...
}

// Response
EnableServiceResponse {
service: "service-1",
enabled: true,
fetch: CallbackConfiguration{
protocol: "example-proto",
config: google.protobuf.Struct{
"endpoint": "https://api.xis.nl"
},
auth: ProtocolAuthConfiguration{
method: "http://decozo.org/proto/auth/mtls"
configuration: google.protobuf.Struct{
"publicKey": "{\"crv\":\"P-256\",\"kty\":\"EC\",\"x\":\"PZlyqX3X...\", \"y\":\"AawwPSKBt...\"}",
}
}
},
...
}

Gebruikte datatypen

message CallbackConfiguration {
// String die het gebruikte protocol identificeerd.
string protocol = 1;
// Protocol afhankelijke configuratie.
google.protobuf.Struct configuration = 2;
// Datatype voor het configureren van het authenticatie middel dat de dienstverlener
// gaat gebruiken richting het zorginformatiesysteem.
ProtocolAuthConfiguration auth = 3;
}

message ProtocolAuthConfiguration {
// String die het gebruikte authenticatie protocol / methode identificeerd.
string method = 1;
// Map voor het configureren van het authenticatie middel dat de dienstverlener
// gaat gebruiken richting het zorginformatiesysteem voor deze callback.
google.protobuf.Struct configuration = 2;
}

Errors

// Onbekende dienst
UnknownService
// Onbekende protocol
UnknownProtocol
// Invalide procotol configuratie voor het aangegeven protocol
InvalidProcotolConfig
// Authenticatie methode onbekend
UnknownAuthMethod
// Invalide authorizatie configuratie voor het aangegeven protocol
InvalidProcotolAuthConfig
// Service is al geactiveerd
ServiceAlreadyActivated

Zie foutmeldingen voor meer informatie.

DisableService

Deze methode wordt gebruikt om een service te deactiveren en alle bijbehorende configuratie en bijbehorende patient registraties te verwijderen.

Request

message DisableServiceRequest {
string serviceId = 1;
}

Response

message DisableServiceResponse {}

Errors

// Onbekende dienst
UnknownService
// Service is momenteel niet actief
ServiceNotActivate

Zie foutmeldingen voor meer informatie.

ListServices

Deze methode wordt door het zorginformatiesysteem gebruikt om een lijst op de te vragen van beschikbare diensten die de dienstverlener aanbiedt aan dit zorginformatiesysteem en de huidige configuratie voor deze diensten.

Request

message ListServicesRequest {
}

Response

message ListServicesResponse {
// services is een lijst van beschikbare diensten en dienst huidige configuratie
repeated Service services = 1;
}

Gebruikte datatypen

message Service {
// Identifier voor deze dienst
string id = 1;
// Naam van deze dienst bedoelt voor weergave aan menselijke gebruikers
string name = 2;
// Omschrijving van deze dienst bedoelt voor weergave aan menselijke gebruikers
string description = 3;
// De aanmeld policy voor deze dienst
SubscriptionPolicy subscriptionPolicy = 4;
// De toestemmings policy voor deze dienst, alleen
// te gebruiken indien de SubscriptionPolicy de
// waarde 'optin' (1) bevat.
ConsentPolicy consentPolicy = 5;
// Lijst van beschikbare ophaal protocollen waar
// deze service mee bekend is
repeated ProtocolDefinition fetchProtocols = 6;
// Lijst van beschikbare terugstuur protocollen waar
// deze service mee bekend is
repeated ProtocolDefinition pushProtocols = 7;
// Configuratie voor het ophalen van patiëntgegevens door deze
// dienst bij het zorginformatiesysteem
CallbackConfiguration fetch = 8;
// Configuratie voor het terugsturen van patiëntgegevens door deze
// dienst bij het zorginformatiesysteem
CallbackConfiguration push = 9;
// enabled geeft aan of de dienst momentel geactiveerd is
bool enabled = 10;
}

enum SubscriptionPolicy {
// Default waarde, niet gebruiken. Sommige programeertalen
// geven een default waarde van 0 op het moment dat deze
// niet expliciet gezet wordt.
subnone = 0;
// Geeft een optin policy aan, d.w.z. de dienstverlener
// gaat ervan uit dat het zorginformatiesysteem een patient actief
// aanmeldt.
optin = 1;
// Geeft een optout policy aan, d.w.z. de dienstverlener
// gaat ervan uit dat het zorginformatiesysteem alle patienten aanmeldt
// tenzij een patient expliciet heeft aangegeven dat deze
// dat niet wil.
optout = 2;
}

// Consentpolicy is alleen van toepassing op het moment dat
// de SubscriptionPolicy de waarde optin (1) bevat.
enum ConsentPolicy {
consentnone = 0;
// Geeft aan dat een patient expliciet toestemming moet
// geven voordat deze voor deze dienst aangemeld kan worden.
explicit = 1;
// Geeft aan dat de aanmelding kan plaatsvinden onder
// veronderstelde toestemming. M.a.w. een patiënt hoeft niet
// expliciet toestemming te geven.
presumed = 2;
}

message ProtocolDefinition {
// Identifier voor een ophaal / terugstuur protocol
// dat ondersteund wordt door de bovenliggende service
string protocol = 1;
// Lijst van beschikbare authenticatie protocollen
// dit ophaal / terugstuur protocol
repeated string authMethods = 2;
}

message CallbackConfiguration {
// Identifier van het protocol dat gebruikt moet / gaat
// worden door de dienstverlener voor het
// ophalen / terugsturen van patiëntgegevens
string protocol = 1;
// Map waarin protocol afhankelijke instellingen
// worden vastgelegd
google.protobuf.Struct configuration = 2;
// Datatype waarin staat hoe de authenticatie voor dit
// ophaal / terugstuur protocol is ingeregeld
ProtocolAuthConfiguration auth = 3;
}

message ProtocolAuthConfiguration {
// Identifier voor de authentie protocol
string method = 1;
// Map waarin authenticatie protocol
// afhankelijke instellingen worden vastgelegd
google.protobuf.Struct configuration = 2;
}

CreateOrUpdatePatientRegistrations

Deze methode wordt gebruikt om patienten aan te melden voor een specifieke dienst of om de metdata van reeds aangemelde patiënten bij te werken.

Request

message CreateOrUpdatePatientRegistrationsRequest {
// De identifier van de dienst waarvoor wordt aangemeld / geupdate.
string serviceId = 1;
// Lijst van patiëntregistraties die de dienstverlener moet
// aanmaken / updaten.
repeated PatientRegistrationCreateOrUpdateData registrations = 2;
}

Response

message CreateOrUpdatePatientRegistrationsResponse {
// Lijst van resultaten, (error en / of servce output) terug te herleiden naar
// een specifieke patient via de meegegeven registratie id
repeated PatientRegistrationResult results = 1;
}

Gebruikte datatypen

message PatientRegistrationsCreateOrUpdateData {
// Id voor deze patientregistratie, gebruikt om deze aanmelding
// binnen deze dienst uniek te identificeren. Aan te leveren door het informatiesysteem
string id = 1;
// Patientmetadata van de patient die wordt
// aangemeld / geupdate
PatientMeta subject = 2;
// Protocol metadata die nodig is voor het
// ophalen / terugsturen van gegevens voor specifiek deze patient.
google.protobuf.Struct callbackProtocolData = 3;
// Waardes die worden doorgegeven aan de dienst
// bij een aanmelding / afmelding / update.
google.protobuf.Struct serviceInput = 4;
}

message OKAPIError {
// Code uit de OKAPI error codes die aangeeft wat de fout inhoudt
// bedoeld voor afhandeling door machines.
OKAPIErrorCode code = 1;
// Omschrijving van de fout bedoeld voor afhandeling door mensen.
string message = 2;
}

message PatientRegistrationResult {
// Id van de afmelding waar dit resultaat op van toepassing is
string id = 1;
// Eventuele output van de service in reactie op de aanmelding
google.protobuf.Struct serviceOutput = 2;
// Geeft aan of er problemen waren bij het
// aanmelden / afmelden / updaten van deze patiënt
OKAPIError error = 3;
}

message Identifier {
// Type identifier
string type = 1;
// De daadwerkelijke identifier
string value = 2;
}

message Name {
// Naam can de patiënt bedoeld voor het tonen aan gebruikers
string display = 1;
// Lijst van voornamen, middelnamen
repeated string given = 2;
// Eigen achternaam
string ownName = 3;
// Voorvoegsel van eigen achternaam
string ownNamePrefix = 4;
// Voorvoegsel van eigen achternaam
string partnerName = 5;
// Achternaam van partner, in het geval van deze is aangenomen
string partnerNamePrefix = 6;
// Voorvoegsel van de achternaam van partner
}

message Address {
// Straatnaam
string street = 1;
// Huisnummer
string streetNumber = 2;
// Postcode
string postalCode = 3;
// Woonplaats
string city = 4;
// Landcode van patiënt (ISO 3166-1 alpha-2)
string country = 5;
}

message PatientMeta {
// Identifier voor deze patient, gebruikt om deze patient
// buiten deze dienst uniek te identificeren.
Identifier identifier = 1;
// Naam van de patiënt
Name name = 2;
// Adres van de patiënt
Address address = 3;
//Geboortedatum van de patient, string in het formaat yyyy-mm-dd
string birthdate = 4;
// Map voor extra, niet door OKAPI
// gespecificeerde, metadata van de patiënt.
google.protobuf.Struct extra = 5;
}

Errors

// Onbekende dienst
UnknownService
// Dienst is niet actief
ServiceNotActive

Zie foutmeldingen voor meer informatie.

RemovePatientRegistrations

Deze methode wordt gebruikt om patienten aan te melden voor een specifieke dienst of om de metdata van reeds aangemelde patiënten bij te werken.

Request

message UpdatePatientRegistrationRequest {
// De identifier van de dienst waarvoor wordt aangemeld / geupdate.
string serviceId = 1;
// Lijst van id's van patiëntregistraties die de dienstverlener moet afmelden
repeated string registrations = 2;
}

Response

message RemovePatientRegistrationsResponse {
// Lijst van resultaten, (error en / of servce output) terug te herleiden naar
// een specifieke patient via de meegegeven registratie id
repeated PatientRegistrationResult results = 1;
}

Gebruikte datatypen

message OKAPIError {
// Code uit de OKAPI error codes die aangeeft wat de fout inhoudt
// bedoeld voor afhandeling door machines.
OKAPIErrorCode code = 1;
// Omschrijving van de fout bedoeld voor afhandeling door mensen.
string message = 2;
}

message PatientRegistrationResult {
// Id van de registratie waar dit resultaat op van toepassing is
string id = 1;
// Eventuele output van de service in reactie op de aanmelding
google.protobuf.Struct serviceOutput = 2;
// Geeft aan of er problemen waren bij het
// aanmelden / afmelden / updaten van deze patiënt
OKAPIError error = 3;
}

Errors

// Onbekende dienst
UnknownService
// Dienst is niet actief
ServiceNotActive

Zie foutmeldingen voor meer informatie.

ListPatientRegistration

Request

message ListPatientRegistrationRequest {
// De identifier van de dienst waarvan registraties
// worden opgevraagd.
string serviceId = 1; // VERPLICHT
// Gebruikt om registraties binnen een dienst
// te filteren.
// Alle velden worden combineerd met een OR
// operator
ListPatientRegistrationQuery query = 2; // OPTIONEEL
}

Response

message ListPatientRegistrationResponse {
// Lijst met gevonden registraties voor deze dienst.
repeated PatientRegistrationData PatientRegistrationData = 1;
}

Gebruikte datatypen

message ListPatientRegistrationQuery {
// Lijst met id's van op te vragen registraties
repeated string id = 1;
// Lijst met identifiers van op te vragen registraties
repeated Identifier identifier = 2;
}

message PatientRegistrationData {
// Id voor deze patient, gebruikt om deze aanmelding
// binnen deze dienst uniek te identificeren.
string id = 1;
// Patientmetadata van de patient die wordt
// aangemeld / afgemeld / geupdate
PatientMeta subject = 2;
// Protocol metadata die nodig is voor het
// ophalen / terugsturen van gegevens voor specifiek deze patient.
google.protobuf.Struct callbackProtocolData = 3;
// Waardes die zijn meegegeven bij de aanmelding als
// input voor de dienst
google.protobuf.Struct serviceInput = 4;
// Waardes die zijn teruggegeven door de dienst
// in reactie op een aanmelding / afmelding / update
google.protobuf.Struct serviceOutput = 5;
}

message Identifier {
// Type identifier
string type = 1;
// De daadwerkelijke identifier
string value = 2;
}

message Name {
// Naam can de patiënt bedoeld voor het tonen aan gebruikers
string display = 1;
// Lijst van voornamen, middelnamen
repeated string given = 2;
// Eigen achternaam
string ownName = 3;
// Voorvoegsel van eigen achternaam
string ownNamePrefix = 4;
// Voorvoegsel van eigen achternaam
string partnerName = 5;
// Achternaam van partner, in het geval van deze is aangenomen
string partnerNamePrefix = 6;
// Voorvoegsel van de achternaam van partner
}

message Address {
// Straatnaam
string street = 1;
// Huisnummer
string streetNumber = 2;
// Postcode
string postalCode = 3;
// Woonplaats
string city = 4;
// Landcode van patiënt (ISO 3166-1 alpha-2)
string country = 5;
}

message PatientMeta {
// Identifier voor deze patient, gebruikt om deze patient
// buiten deze dienst uniek te identificeren.
Identifier identifier = 1;
// Naam van de patiënt
Name name = 2;
// Adres van de patiënt
Address address = 3;
//Geboortedatum van de patient, string in het formaat yyyy-mm-dd
string birthdate = 4;
// Map voor extra, niet door OKAPI
// gespecificeerde, metadata van de patiënt.
google.protobuf.Struct extra = 5;
}

Errors

// Onbekende dienst
UnknownService

Zie foutmeldingen voor meer informatie.

Event methodes (logging)

Er is binnen OKAPI rekening gehouden met het feit dat het zorginformatiesysteem op de hoogte wil blijven van uitgevoerd werk door de dienstverlener. Als een dienst een actie uitvoert kan deze dat vastleggen in een Event en deze opvraagbaar maken zodat het zorginformatiesysteem inzicht krijgt in het uitgevoerde werk. Dit kan ingezet worden voor logging / audit doeleinden, maar wellicht ook om deze informatie te tonen aan een arts in de UI van het zorginformatiesysteem. Er is binnen OKAPI dan ook niet gespecificeerd wat er vastgelegd moet worden, dit is aan de dienstverlener om te bepalen.

GetEvents

De eerste methode is voor het gepagineerd opvragen van events van een bepaald type, eventueel binnen een bepaalde service en voor een bepaalde patient.

GetEventsRequest

message GetEventsRequest {
// De verzochte pagina
int32 page = 2;
// Hoeveel events per pagina worden meegegeven
int32 perPage = 3;
// De query die bepaald welke events
// worden teruggegeven
repeated Query query = 4;
}

GetEventsResponse

message GetEventsResponse {
// De verzochte pagina
int32 page = 2;
// Hoeveel events per pagina worden meegegeven
int32 perPage = 3;
// De events die zijn gevonden
repeated Event events = 4;
}

Gebruikte datatypes

message Event {
// Tijdstip waarop het event heeft plaatsgevonden
// Unix timestmp in milliseconden
uint64 timestamp = 1;
// Type van het event
string type = 2;
// Id van de dienst die het event
// heeft geregistreerd
string serviceId = 3;
// Id van de patient waarom dit event
// betrekking heeft
string patientId = 4;
// Event type afhankelijke data
google.protobuf.Struct payload = 5;
}

message Query {
// Filtert events die hebben plaatgevonden
// na of op de waarde in het veld
// (Event.timestamp >= Query.start), formaat
// is een Unix timestamp in milliseconden
uint64 start = 1;
// Filtert events die hebben plaatgevonden
// voor de waarde in het veld
// (Event.timestamp < Query.end), formaat
// is een Unix timestamp in milliseconden
uint64 end = 2;
// Type van het event
string type = 3;
// Id van de service (ServiceDefinition.id)
string serviceId = 4;
// Id van de patient (PatientRegistrationData.id)
string patientId = 5;
}

Errors

// Er zijn niet genoeg events om deze pagina te bereiken.
// Wordt teruggegeven als de pagina niet bestaat
InvalidPage

Zie foutmeldingen voor meer informatie.

GetEventsStream

De GetEventStream methode heeft dezelfde functie als de GetEvents methode alleen geeft deze methode de gevonden events terug in een stream van Events. Deze methode kan dus gebruikt worden om realtime Events te ontvangen.

GetEventsStreamRequest

message GetEventsStreamRequest {
// De query die bepaald welke events
// worden teruggegeven
repeated Query query = 2;
}

Response

message Event {
// Tijdstip waarop het event heeft plaatsgevonden
// Unix timestmp in milliseconden
uint64 timestamp = 1;
// Type van het event
string type = 2;
// Id van de dienst die het event
// heeft geregistreerd
string serviceId = 3;
// Id van de patient waarom dit event
// betrekking heeft
string patientId = 4;
// Event type afhankelijke data
google.protobuf.Struct payload = 5;
}

Gebruikte datatypes

message Query {
// Filtert events die hebben plaatgevonden
// na of op de waarde in het veld
// (Event.timestamp >= Query.start), formaat
// is een Unix timestamp in milliseconden
uint64 start = 1;
// Filtert events die hebben plaatgevonden
// voor de waarde in het veld
// (Event.timestamp < Query.end), formaat
// is een Unix timestamp in milliseconden
uint64 end = 2;
// Type van het event
string type = 3;
// Id van de service (ServiceDefinition.id)
string serviceId = 4;
// Id van de patient (PatientRegistrationData.id)
string patientId = 5;
}

Foutmeldingen

OKAPI maakt gebruik van door OKAPI gedefinieerde foutcodes en zal deze in in het google.rpc.Status 'details' veld plaatsen. De gRPC errors zullen de gRPC foutcode INVALID_ARGUMENT bevatten.

enum OKAPIErrorCode {
None = 0;
// Invalide configuratie voor de gekozen methode
InvalidXISAuthConfiguration = 1;
// Onbekende reference meegegeven
UnkownReference = 2;
// Invalide autorisatietoken voor deze reference
InvalidAuthorizationToken = 3;
// Onbekende service
UnknownService = 4;
// Onbekende protocol
UnknownProtocol = 5;
// Invalide procotol configuratie voor het aangegeven protocol
InvalidProcotolConfig = 6;
// Authenticatie methode onbekend
UnknownAuthMethod = 7;
// Invalide authorisatie configuratie voor het aangegeven protocol
InvalidProcotolAuthConfig = 8;
// Er zijn niet genoeg events om deze pagina te bereiken
InvalidPage = 9;
// Er wordt geprobeerd een patient af te melden die niet is ingeschreven
AlreadyUnsubscribed = 10;
// De service is al actief
ServiceAlreadyActivated = 11;
// De service is niet actief
ServiceNotActive = 12;
// Een generieke error code die terug wordt gegeven met en omschrijving die
// meer informatie geeft over wat er fout is gegaan
GenericException = 999;
}

message OKAPIError {
// Code bedoeld voor afhandeling door machines
OKAPIErrorCode code = 1;
// Bericht bedoeld voor afhandeling door mensen
string message = 2;
}