{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://quadruper.invalid/contracts/geoapi-matrix-response.v1.schema.json",
  "title": "MatrixResponse",
  "description": "POST /v2/matrix 200 body. Rows follow sources, columns follow destinations; null = no route or unsnapped point.",
  "type": "object",
  "properties": {
    "sources": { "type": "array", "minItems": 1, "maxItems": 25, "items": { "$ref": "geoapi-common.v1.schema.json#/$defs/matrixPoint" } },
    "destinations": { "type": "array", "minItems": 1, "maxItems": 25, "items": { "$ref": "geoapi-common.v1.schema.json#/$defs/matrixPoint" } },
    "durations_s": { "type": "array", "minItems": 1, "maxItems": 25, "items": { "$ref": "geoapi-common.v1.schema.json#/$defs/matrixRow" } },
    "distances_m": { "type": "array", "minItems": 1, "maxItems": 25, "items": { "$ref": "geoapi-common.v1.schema.json#/$defs/matrixRow" } },
    "conditions": { "$ref": "geoapi-common.v1.schema.json#/$defs/conditions" },
    "attribution": { "$ref": "geoapi-common.v1.schema.json#/$defs/attribution" }
  },
  "required": ["sources", "destinations", "durations_s", "distances_m", "conditions", "attribution"],
  "additionalProperties": false
}
