Road Model Schema

Request access

Feedback schema definition

The Map Feedback API has its own schema. This schema includes a set of fields that apply to all feedback types. This part can be called an envelope. One of these fields, data, contains feedback-type-specific information. Because this field can follow multiple schemas, it effectively serves as an extension point. More details about the Map Feedback API schema can be found in Create feedback.

Road model feedback is modelled as a change request against the map data. The schema supports reporting a missing feature (add), a feature that exists in the data but not in reality (remove), and a change to an existing feature including its geometry (modify). Each feature type has its own set of mandatory and optional attributes per change type (see the Feature type definitions section below).

Envelope

The Map Feedback API envelope is reused as-is. Only the kind value is specific to this schema.

ParameterRequiredTypeDescription
geometryYesstringGeometry of the feedback in well-known text (WKT) format. Coordinates must be in longitude-latitude (lon lat) order, e.g. POINT(-3.693252 40.399412). This marks the location of the feedback (where the issue is).
kindYesstringThe schema name used in the data field. For this schema the value must be set to road_model_feedback.
dataYesstringFeedback body, a base64 JSON-encoded string following the schema of type kind.
severityYesintegerSeverity of the feedback. Must be greater than 0. A lower value means higher severity. Max value is 4.
labelsNolist of stringsLabels attached to the feedback. A maximum of 20 labels is allowed.
referenceIdNostringReference ID of the feedback provided by the customer. The value is unique in the context of the customer.

Two geometries
The envelope geometry marks where the problem is (mandated by the API). The data.geometry field below carries the proposed / corrected geometry of the feature itself. For an add they typically coincide; for a geometry modify the envelope points at the current location while data.geometry holds the correction.

Schema of the data

The data field is a JSON object with a set of common fields plus a feature-specific attributes object. The attributes allowed (and mandatory) for each feature type are defined in the Feature type definitions section below.

Common fields

FieldRequiredTypeDescription
changeTypeYesenum: add, remove, modifyNature of the requested change.
featureYesenum, see Feature type definitionsRoad model feature type the feedback applies to. Use other for feature types not (yet) defined in this schema.
detailsYesstringFree-text description of the feedback being reported.
attributesDepends on feature × changeTypeobject (key:value)Proposed attribute values = desired end state. For add: the new feature’s attributes. For modify: only the attributes to change. Omit for remove (unless the feature type definition marks attributes as mandatory to identify the feature). Allowed keys and values per feature are listed in the Feature type definitions.
geometryRequired for addstring (WKT)Proposed geometry of the feature, lon-lat WKT. Required for add; for modify include only when the geometry changes or when relocating a point feature (e.g. POI); omit for remove. Providing accurate geometry helps resolve the feedback more efficiently and accurately.
featureIdNostringIdentifier of the existing feature in the map data. Applies to remove and modify (omit for add). Optional because the reporter may not have access to map feature IDs — when absent, the feature is located via the envelope geometry, feature, and details. Provide it whenever available, as it makes the target unambiguous. For turn_restriction and speed_limit feedback, providing both the from and to featureIds helps resolve the feedback more efficiently and accurately.
mapVersionNostringVersion of the map where the issue was identified, e.g. 57595/1.
sourceNostringSource identification, e.g. rule id from quality framework, manual feedback.
sourceDetailsNostringOptional source details, e.g. rule name, or the source used to identify the issue (e.g. URL of a web source).

Value conventions

These conventions apply to attribute values across all feature types:

  • Geometry — WKT with coordinates in longitude-latitude order (POINT(lon lat), LINESTRING(lon lat, lon lat, …)), consistent with the envelope.
  • Time domains (opening_hours, conditional_hours, conditions) — yes or no followed by @ and a day/time span in the form <days> <from>-<to>, e.g. no @ Mo-Fr 10:00-17:00 (no access Monday–Friday 10:00–17:00), yes @ Mo-Fr 07:00-17:00 (applies Monday–Friday 07:00–17:00).
  • Localized values — to give an attribute value in a specific language, use LC-SC = <value>, where LC is the language code, SC the script code, e.g. nl-Latn = Amsterdamsestraatweg.
  • Multi-valued attributes (e.g. conditional, vehicle_access) — multiple values in one string, delimited by ;.
  • Units — metric is the default (weights in kg, dimensions in metres, speed per unit attribute where applicable). If specifying imperial, state it explicitly in the value, e.g. 9000 lbs, 6' 7''.
  • Direction — forward, backward (relative to the digitization direction of the way) or both_ways.

Feature type definitions

This section defines each value the feature field can take. For every feature type: the Add / Modify / Remove columns list the attributes that are mandatory for that change type; Optional attributes lists what else may be supplied, with constrained values where applicable. details is always mandatory (see common fields) and is not repeated below.

poi

AddModifyRemove
Mandatoryname, categoryname or featureId, plus the attribute(s) being modifiedname or featureId
Optional attributesValues / notes
categoryType of POI, e.g. restaurant, swimming_pool, fuel_station
addressFull address string with comma delimiter between address components, or one value per address attribute (see address feature)
opening_hoursTime domain syntax, e.g. no @ Mo-Fr 10:00-17:00
phone, fax, website, email, brand, takeaway

road

AddModifyRemove
Mandatorytypeattribute(s) being modifiedtype
Optional attributesValues / notes
typeroad, intersection, roundabout
road_classmotorway, primary, secondary, tertiary, minor, residential, service, path, living_street, construction
street_name
surfacepaved, unpaved
conditionalprivate, permissive, residents, permit, destination, delivery, no_through — multiple values allowed, delimited
vehicle_accesscar, bus, hgv, taxi, rideshare, motorcycle — multiple values allowed, delimited
conditional_hoursTime domain syntax, e.g. no @ Mo-Fr 10:00-17:00
onewayyes, no, -1
hazmatyes, no
maximum_dimensionFor values see truck_restriction
lanesforward, backward or both_ways — direction is required when each direction of travel is not separately digitized
bridge, tunnel, route_number, dual_carriageway, featureId

speed_limit

AddModifyRemove
Mandatorymaxspeedattribute(s) being modifiedmaxspeed or featureId
Optional attributesValues / notes
unitkph, mph
vehicle_typebus, hgv, motorcar, taxi, rideshare
directionforward, backward, both_ways
conditional_hoursTime domain syntax

address

AddModifyRemove
Mandatoryhousenumber (if single address)attribute(s) being modifiedhousenumber (if single address)
Optional attributesValues / notes
addressFull address string with comma delimiter between address components
housenumber, housename, street, postcode, suburb, city, state, county, country
housing_estateName of a housing estate or residential development. Use for estate-level reports where no single house number applies. Geometry should be a POINT, the reporter is not expected to know the estate boundary.

Localized values follow the LC-SC = <value> convention.

street_name

AddModifyRemove
Mandatorystreetstreetstreet
Optional attributesValues / notes
street (alternatives)The name of the street; alternative names as additional values

Localized values follow the LC-SC = <value> convention.

barrier

AddModifyRemove
Mandatorybarrierbarrierbarrier
Optional attributesValues / notes
barriergate, lift_gate, bollard, swing_gate, sliding_gate, block, chain, cycle_barrier
permanentyes, no

oneway

AddModifyRemove
Mandatoryonewayonewayoneway
Optional attributesValues / notes
onewayyes, no
directionSet to -1 to set the oneway direction against the digitization direction of the way
vehicle_typecar, bus, hgv, taxi, rideshare, motorcycle
conditionsTime domain syntax

truck_restriction

AddModifyRemove
Mandatoryrestriction attribute(s) with value(s)restriction attribute(s) being modifiedrestriction attribute(s) being removed
Optional attributesValues / notes
restriction keyshazmat, maxaxleload, maxheight, maxlength, maxtandemweight, maxtridemweight, maxweight, maxwidth, truck_route — each restriction type is an attribute key with its own value, e.g. maxweight: 9000 (kg). Metric is the default; state imperial explicitly, e.g. 9000 lbs, 6' 7''. Multiple restrictions may be reported in one feedback.
vehicle_typecar, bus, hgv, taxi, rideshare, motorcycle
directionforward, backward, both_ways
conditions / conditional_hoursTime domain syntax, e.g. yes @ Mo-Fr 07:00-17:00

turn_restriction

AddModifyRemove
Mandatorytypeattribute(s) being modifiedtype or featureId
Optional attributesValues / notes
typeno_left_turn, no_right_turn, no_straight_turn, no_u_turn
vehicle_typecar, bus, hgv, taxi, rideshare, motorcycle
fromfeatureId of the way the restriction starts from
viafeatureId of the way/node the restriction manoeuvres through
tofeatureId of the way the restriction ends at
conditionsTime domain syntax
directionforward, backward, both_ways

Providing from and to featureIds is strongly recommended — it helps resolve the feedback more efficiently and accurately.

land_use

AddModifyRemove
Mandatorytypeattribute(s) being modifiedtype
Optional attributesValues / notes
name

bridge_or_tunnel

AddModifyRemove
Mandatorytypeattribute(s) being modifiedtype
Optional attributesValues / notes
typebridge, tunnel
name
restrictionSee truck_restriction for values
restriction_vehicle_typebus, hgv, military

administrative_area

AddModifyRemove
Mandatorytype, nameattribute(s) being modifiedtype, name
Optional attributesValues / notes
typeregion, state, province, county, district, borough, city, town, village
name

other

Escape hatch for feature types not (yet) defined in this schema. attributes is free-form key: value; details must describe the feature and the requested change unambiguously.

Examples

1. Missing POI (add)

{
"changeType": "add",
"feature": "poi",
"geometry": "POINT(-3.693252 40.399412)",
"attributes": {
"name": "Shell",
"category": "fuel_station",
"email": "shellbookham@shell.com"
},
"details": "Fuel station present on-site but missing from the map.",
"mapVersion": "57595/1",
"source": "manual-feedback",
"sourceDetails": "Field survey 2026-06"
}

2. Missing truck restrictions (add)

{
"changeType": "add",
"feature": "truck_restriction",
"geometry": "LINESTRING(-0.4335233 51.3566726, -0.4342779 51.3535401)",
"attributes": {
"maxlength": "15",
"maxheight": "4",
"maxweight": "15000",
"conditional_hours": "yes @ Mo-Fr 07:00-17:00"
},
"details": "Missing truck restrictions along this stretch of road.",
"mapVersion": "57666/1",
"source": "manual-feedback",
"sourceDetails": "Weybridge town web site: https://www.discoverweybridge.co.uk/"
}

3. Superfluous POI (remove)

{
"changeType": "remove",
"feature": "poi",
"featureId": "POI:1234567",
"details": "POI no longer exists in reality; business closed.",
"mapVersion": "57595/1",
"source": "1234",
"sourceDetails": "Superfluous POI check"
}

4. Incorrect house number (modify)

{
"changeType": "modify",
"feature": "address",
"geometry": "POINT(-0.4404627 51.3459953)",
"attributes": {
"housenumber": "37"
},
"details": "Address information incorrect at this location. Should be number 37 not 15.",
"sourceDetails": "Local knowledge"
}

5. Add housing estate (missing)

{
"changeType": "add",
"feature": "address",
"geometry": "POINT(4.899431 52.379189)",
"attributes": {
"housing_estate": "Riverside Gardens",
"street": "Parklaan",
"city": "Utrecht"
},
"details": "Housing estate 'Riverside Gardens' is missing from the map.",
"mapVersion": "57595/1",
"source": "manual-feedback"
}

Complete feedback (envelope + base64 data)

The data JSON is base64-encoded into the envelope, e.g. for example 1:

{
"geometry": "POINT(-3.693252 40.399412)",
"kind": "road_model_feedback",
"data": "<base64 of the data JSON>",
"severity": 1,
"labels": ["example"],
"referenceId": "12345"
}