{
	"openapi": "3.1.0",
	"info": {
		"title": "Autovig public vignette price dataset",
		"version": "v1",
		"summary": "Static JSON files generated at build from the same sources as Autovig country pages.",
		"description": "Machine-readable European motorway vignette prices and regime changes. Files are static build output under /data/v1/ — there is no dynamic API, authentication, or write surface. schemaVersion evolves only compatibly within v1; an incompatible change would introduce /data/v2/ with at least 90 days of v1 overlap. Time zones on regime changes are IANA identifiers used when comparing validFrom to “today”. Dates are ISO-8601 calendar dates (YYYY-MM-DD) unless noted as generatedAt (instant).",
		"license": {
			"name": "Creative Commons Attribution 4.0 International",
			"identifier": "CC-BY-4.0",
			"url": "https://creativecommons.org/licenses/by/4.0/"
		},
		"contact": {
			"name": "Autovig",
			"url": "https://autovig.eu"
		},
		"x-generatedAt": "2026-10-14T09:28:28.422Z",
		"x-attribution": "Autovig (https://autovig.eu/). Official tariff facts remain those of the cited national operators (see each row sourceUrl). The licence covers the Autovig compilation only."
	},
	"servers": [
		{
			"url": "https://autovig.eu",
			"description": "Public static origin (autovig.eu only)"
		}
	],
	"tags": [
		{
			"name": "catalog",
			"description": "Dataset index and OpenAPI self-description"
		},
		{
			"name": "countries",
			"description": "Per-country tariff files"
		},
		{
			"name": "changes",
			"description": "Regime / tariff-wave changes"
		}
	],
	"paths": {
		"/data/v1/index.json": {
			"get": {
				"tags": [
					"catalog"
				],
				"summary": "Dataset index",
				"description": "Lists countries, file paths, license, and edition status.",
				"operationId": "getPublicDataIndex",
				"responses": {
					"200": {
						"description": "Index document",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/PublicDataIndex"
								}
							}
						}
					}
				}
			}
		},
		"/data/v1/changes.json": {
			"get": {
				"tags": [
					"changes"
				],
				"summary": "Regime changes",
				"description": "Closed status set: effective | scheduled | proposed | postponed | withdrawn. scheduled/effective require confirmed validFrom; overdue scheduled rows fail the build gate (no automatic flip to effective).",
				"operationId": "getPublicDataChanges",
				"responses": {
					"200": {
						"description": "Changes document",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/PublicDataChanges"
								}
							}
						}
					}
				}
			}
		},
		"/data/v1/countries/{countryCode}.json": {
			"get": {
				"tags": [
					"countries"
				],
				"summary": "Country tariff file",
				"description": "Official amounts with provenance. When nationalCurrency is set, amount is in that currency and eurConversion carries the stored EUR companion plus FX reference metadata.",
				"operationId": "getPublicDataCountry",
				"parameters": [
					{
						"name": "countryCode",
						"in": "path",
						"required": true,
						"description": "ISO 3166-1 alpha-2 in lowercase",
						"schema": {
							"type": "string",
							"enum": [
								"at",
								"bg",
								"ch",
								"cz",
								"hu",
								"md",
								"ro",
								"si",
								"sk"
							]
						}
					}
				],
				"responses": {
					"200": {
						"description": "Country document",
						"content": {
							"application/json": {
								"schema": {
									"$ref": "#/components/schemas/PublicDataCountry"
								}
							}
						}
					}
				}
			}
		},
		"/data/v1/openapi.json": {
			"get": {
				"tags": [
					"catalog"
				],
				"summary": "This OpenAPI description",
				"operationId": "getPublicDataOpenApi",
				"responses": {
					"200": {
						"description": "OpenAPI 3.1 document",
						"content": {
							"application/json": {
								"schema": {
									"type": "object",
									"additionalProperties": true
								}
							}
						}
					}
				}
			}
		}
	},
	"components": {
		"schemas": {
			"License": {
				"type": "object",
				"required": [
					"id",
					"name",
					"url",
					"attribution"
				],
				"properties": {
					"id": {
						"type": "string",
						"const": "CC-BY-4.0"
					},
					"name": {
						"type": "string"
					},
					"url": {
						"type": "string",
						"format": "uri"
					},
					"attribution": {
						"type": "string"
					}
				}
			},
			"EurConversion": {
				"type": "object",
				"required": [
					"amountEur",
					"rate",
					"rateDate",
					"rateSource",
					"rateSourceUrl",
					"rounding"
				],
				"properties": {
					"amountEur": {
						"type": "number"
					},
					"rate": {
						"type": "number"
					},
					"rateDate": {
						"type": "string",
						"format": "date"
					},
					"rateSource": {
						"type": "string"
					},
					"rateSourceUrl": {
						"type": "string",
						"format": "uri"
					},
					"rounding": {
						"type": "string"
					}
				}
			},
			"PriceRow": {
				"type": "object",
				"required": [
					"duration",
					"vehicleClass",
					"amount",
					"currency",
					"validFrom",
					"validTo",
					"sourceUrl",
					"verifiedAt"
				],
				"properties": {
					"duration": {
						"type": "string"
					},
					"vehicleClass": {
						"type": "string"
					},
					"emissionClass": {
						"type": "string"
					},
					"amount": {
						"type": "number"
					},
					"currency": {
						"type": "string"
					},
					"validFrom": {
						"type": "string",
						"format": "date"
					},
					"validTo": {
						"type": [
							"string",
							"null"
						],
						"format": "date"
					},
					"sourceUrl": {
						"type": "string",
						"format": "uri"
					},
					"verifiedAt": {
						"type": "string",
						"format": "date"
					},
					"eurConversion": {
						"$ref": "#/components/schemas/EurConversion"
					}
				}
			},
			"PublicDataCountry": {
				"type": "object",
				"required": [
					"schemaVersion",
					"generatedAt",
					"license",
					"countryCode",
					"countryName",
					"operator",
					"officialBuyUrl",
					"nationalCurrency",
					"reviewedAt",
					"canonicalPages",
					"officialSources",
					"pricing"
				],
				"properties": {
					"schemaVersion": {
						"type": "integer",
						"const": 1
					},
					"generatedAt": {
						"type": "string",
						"format": "date-time"
					},
					"license": {
						"$ref": "#/components/schemas/License"
					},
					"countryCode": {
						"type": "string",
						"enum": [
							"at",
							"bg",
							"ch",
							"cz",
							"hu",
							"md",
							"ro",
							"si",
							"sk"
						]
					},
					"countryName": {
						"type": "object",
						"additionalProperties": {
							"type": "string"
						}
					},
					"operator": {
						"type": "object",
						"required": [
							"name",
							"url"
						],
						"properties": {
							"name": {
								"type": "string"
							},
							"url": {
								"type": "string",
								"format": "uri"
							}
						}
					},
					"officialBuyUrl": {
						"type": [
							"string",
							"null"
						],
						"format": "uri"
					},
					"nationalCurrency": {
						"type": [
							"string",
							"null"
						]
					},
					"reviewedAt": {
						"type": "string",
						"format": "date"
					},
					"canonicalPages": {
						"type": "object",
						"additionalProperties": {
							"type": "string",
							"format": "uri"
						}
					},
					"officialSources": {
						"type": "array",
						"items": {
							"type": "object",
							"required": [
								"url",
								"roles"
							],
							"properties": {
								"url": {
									"type": "string",
									"format": "uri"
								},
								"roles": {
									"type": "array",
									"items": {
										"type": "string"
									}
								},
								"verifiedAt": {
									"type": "string",
									"format": "date"
								}
							}
						}
					},
					"pricing": {
						"type": "array",
						"items": {
							"$ref": "#/components/schemas/PriceRow"
						}
					}
				}
			},
			"RegimeChange": {
				"type": "object",
				"required": [
					"id",
					"countryCode",
					"status",
					"validFrom",
					"timeZone",
					"verifiedAt",
					"description",
					"sourceUrl"
				],
				"properties": {
					"id": {
						"type": "string"
					},
					"countryCode": {
						"type": "string"
					},
					"status": {
						"type": "string",
						"enum": [
							"effective",
							"scheduled",
							"proposed",
							"postponed",
							"withdrawn"
						]
					},
					"validFrom": {
						"type": [
							"string",
							"null"
						],
						"format": "date"
					},
					"timeZone": {
						"type": "string",
						"description": "IANA time zone"
					},
					"verifiedAt": {
						"type": "string",
						"format": "date"
					},
					"description": {
						"type": "string"
					},
					"sourceUrl": {
						"type": "string",
						"format": "uri"
					},
					"statusReason": {
						"type": "string"
					}
				}
			},
			"PublicDataChanges": {
				"type": "object",
				"required": [
					"schemaVersion",
					"generatedAt",
					"license",
					"changes"
				],
				"properties": {
					"schemaVersion": {
						"type": "integer",
						"const": 1
					},
					"generatedAt": {
						"type": "string",
						"format": "date-time"
					},
					"license": {
						"$ref": "#/components/schemas/License"
					},
					"changes": {
						"type": "array",
						"items": {
							"$ref": "#/components/schemas/RegimeChange"
						}
					}
				}
			},
			"PublicDataIndex": {
				"type": "object",
				"required": [
					"schemaVersion",
					"generatedAt",
					"license",
					"attribution",
					"site",
					"origin",
					"countries",
					"files",
					"editionsNote"
				],
				"properties": {
					"schemaVersion": {
						"type": "integer",
						"const": 1
					},
					"generatedAt": {
						"type": "string",
						"format": "date-time"
					},
					"license": {
						"$ref": "#/components/schemas/License"
					},
					"attribution": {
						"type": "string"
					},
					"site": {
						"type": "string",
						"const": "autovig.eu"
					},
					"origin": {
						"type": "string",
						"format": "uri"
					},
					"countries": {
						"type": "array",
						"items": {
							"type": "object",
							"required": [
								"countryCode",
								"path",
								"canonicalPages"
							],
							"properties": {
								"countryCode": {
									"type": "string"
								},
								"path": {
									"type": "string"
								},
								"canonicalPages": {
									"type": "object",
									"additionalProperties": {
										"type": "string",
										"format": "uri"
									}
								}
							}
						}
					},
					"files": {
						"type": "object",
						"required": [
							"index",
							"changes",
							"countries",
							"editions",
							"openapi"
						],
						"properties": {
							"index": {
								"type": "string"
							},
							"changes": {
								"type": "string"
							},
							"countries": {
								"type": "array",
								"items": {
									"type": "string"
								}
							},
							"editions": {
								"type": "array",
								"items": {
									"type": "string"
								}
							},
							"openapi": {
								"type": [
									"string",
									"null"
								]
							}
						}
					},
					"editionsNote": {
						"type": "string"
					}
				}
			}
		}
	},
	"x-compatibility": "v1 adds optional fields only. Breaking changes require /data/v2/ while v1 remains published at least 90 days after the deprecation notice in index.json."
}
