{ "$schema": "https://json-schema.org/draft/2020-12/schema", "$id": "https://raw.githubusercontent.com/api-evangelist/entur/main/json-schema/entur-post-skoleskyss-request-schema.json", "title": "PostSkoleskyssRequest", "x-generated": "2026-10-09", "x-method": "derived", "x-generator": "derive-json-schema.py", "x-source": "openapi/entur-skoleskyss-openapi.yml#/components/schemas/PostSkoleskyssRequest", "type": "object", "properties": { "organisationId": { "type": "number" }, "studentId": { "$ref": "#/$defs/NumberOrString" }, "applicationId": { "$ref": "#/$defs/NumberOrString" }, "name": { "type": "string", "description": "Navnet på skyssretten. For eksempel 'Skoleskort 2025-2026'." }, "schoolName": { "type": "string", "description": "Navnet på skolen" }, "validity": { "$ref": "#/$defs/ValidityRequest" }, "studentDetails": { "$ref": "#/$defs/StudentDetailsRequest" } }, "required": [ "applicationId", "studentId", "validity" ], "$defs": { "FareZoneIds": { "type": "object", "properties": { "fromZoneId": { "type": "string", "pattern": "^[A-Z]{3}:FareZone:\\d+$" }, "toZoneId": { "type": "string", "pattern": "^[A-Z]{3}:FareZone:\\d+$" } }, "required": [ "fromZoneId", "toZoneId" ] }, "GroupOfTariffZone": { "type": "object", "properties": { "groupOfTariffZoneId": { "type": "string", "pattern": "^[A-Z]{3}:GroupOfTariffZones:\\d+$" } }, "required": [ "groupOfTariffZoneId" ] }, "IdAndName": { "type": "object", "properties": { "id": { "$ref": "#/$defs/NumberOrString" }, "name": { "type": "string" } }, "required": [ "id", "name" ] }, "NumberOrString": { "anyOf": [ { "type": "string", "minLength": 1 }, { "type": "number" } ] }, "PrivateCodeZone": { "type": "object", "properties": { "fromPrivateCode": { "$ref": "#/$defs/NumberOrString" }, "toPrivateCode": { "$ref": "#/$defs/NumberOrString" } }, "required": [ "fromPrivateCode", "toPrivateCode" ] }, "StudentDetailsRequest": { "type": "object", "properties": { "firstName": { "type": "string" }, "surname": { "type": "string" }, "school": { "$ref": "#/$defs/IdAndName" }, "class": { "$ref": "#/$defs/IdAndName" }, "email": { "type": "string", "format": "email", "pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$" }, "phone": { "type": "object", "description": "Ved landskode +47 må number starte med 4 eller 9 og bestå av 8 siffer.", "properties": { "number": { "type": "string", "pattern": "\\d+" }, "countryCode": { "type": "string", "default": "+47", "pattern": "^\\+?\\d{1,3}$" } }, "required": [ "number" ] } } }, "ValidityRequest": { "type": "object", "description": "endDate må være samme dag som eller etter startDate, og kan ikke ha passert.", "properties": { "name": { "type": "string", "description": "Navn på gyldigheten. Brukes i billettvisningen." }, "startDate": { "type": "string", "format": "date", "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$" }, "endDate": { "type": "string", "format": "date", "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$" }, "calendar": { "description": "Må inneholde enten id eller validDates, ikke begge.", "oneOf": [ { "type": "object", "properties": { "id": { "type": "string", "description": "Overstyrer standard-kalenderen fra config. Kan ikke kombineres med validDates.", "pattern": "^[A-Z]{3}:FareDayType:\\w+$" } }, "required": [ "id" ] }, { "type": "object", "properties": { "validDates": { "type": "array", "description": "Liste over gyldige datoer for skyssretten (YYYY-MM-DD). Kan ikke kombineres med id.", "items": { "type": "string", "format": "date", "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$" }, "minItems": 1 } }, "required": [ "validDates" ] } ] }, "tripDurationMinutes": { "type": "integer", "description": "Antall minutter et enkelt klipp er gyldig etter aktivering. Standard er 180 minutter.", "exclusiveMinimum": 0, "maximum": 9007199254740991 }, "maxAvailableTrips": { "type": "integer", "description": "Maks antall turer totalt skyssretten gir rett til. Hvis utelatt er det ingen begrensning.", "maximum": 9007199254740991, "minimum": 0 }, "maxTripsPerDay": { "type": "integer", "description": "Maks antall turer per dag skyssretten gir rett til. Standard er 2.", "maximum": 10, "minimum": 1 }, "travelWindow": { "type": "object", "description": "Tidsvindu for når eleven kan gjennomføre turer. Overstyrer eventuell standard fra config. fromHour må være mindre enn eller lik toHour.", "properties": { "fromHour": { "type": "integer", "description": "Tidligste klokketime eleven kan starte en tur.", "maximum": 23, "minimum": 0 }, "toHour": { "type": "integer", "description": "Seneste klokketime eleven kan starte en tur.", "maximum": 23, "minimum": 0 } }, "required": [ "fromHour", "toHour" ] }, "zones": { "type": "array", "items": { "$ref": "#/$defs/Zone" } } }, "required": [ "endDate", "startDate", "zones" ] }, "Zone": { "anyOf": [ { "$ref": "#/$defs/PrivateCodeZone" }, { "$ref": "#/$defs/FareZoneIds" }, { "$ref": "#/$defs/GroupOfTariffZone" } ] } } }