{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://artifacts.apis.io/infranode-dev/json-schema/infranode-dev-meta-schema.json",
  "title": "Meta",
  "x-generated": "2026-10-31",
  "x-method": "derived",
  "x-generator": "derive-json-schema.py",
  "x-source": "openapi/infranode-dev-openapi.yaml#/components/schemas/Meta",
  "type": "object",
  "properties": {
    "correlation_id": {
      "type": [
        "string",
        "null"
      ]
    },
    "source_status": {
      "type": "string",
      "description": "Ehrlicher Quellen-Status der Antwort. \"ok\" (Daten vorhanden), \"no_data\" (Quelle erreichbar/abgedeckt, aber gerade keine Daten), \"disabled\" (Quelle per Toggle aus), \"not_ingested\" (kein Snapshot), \"not_covered\" (Stadt ist für diesen teilabgedeckten Endpunkt strukturell nicht abgedeckt; data=null, siehe covered_cities). Klar unterscheidbar vom 404 (Stadt unbekannt).",
      "enum": [
        "ok",
        "no_data",
        "disabled",
        "not_ingested",
        "not_covered"
      ]
    },
    "cache_status": {
      "type": [
        "string",
        "null"
      ],
      "description": "Cache-Herkunft (hit/miss/stale), sofern die Route cacht."
    },
    "covered_cities": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Nur bei source_status=\"not_covered\": die Stadt-Slugs, die dieser teilabgedeckte Endpunkt tatsächlich bedient (z. B. flood, traffic, road-events)."
    },
    "pagination": {
      "type": "object",
      "description": "Bei paginierbaren Datenart-Listen (charging, energy, events, transit, OSM-Feature-Endpunkte): der EHRLICH ausgewiesene Ausschnitt (keine stille Kappung). KANAL-ABHÄNGIGER Default für gleiche URL: direktes REST liefert die volle Liste (limit=null, returned==total, truncated=false); GPT-Actions (erkannt am OpenAI-Header) bekommen ein serverseitig gebundenes Default-Limit; MCP-Aufrufe sind gebunden, weil der MCP-Client selbst ein Default-Limit setzt. Kanalunabhängige Overrides: limit=all (oder ?all=1) erzwingt die volle Liste, limit + offset blättern gezielt. meta.pagination ist bei ALLEN Kanälen gesetzt.",
      "x-description-en": "For paginable data-type lists (charging, energy, events, transit, OSM feature endpoints): the honestly reported slice (no silent capping). CHANNEL-DEPENDENT default for the same URL: direct REST returns the full list (limit=null, returned==total, truncated=false); GPT Actions (detected via the OpenAI header) get a server-side bound default limit; MCP calls are bound because the MCP client sets a default limit itself. Channel-independent overrides: limit=all (or ?all=1) forces the full list, limit + offset page explicitly. meta.pagination is set on ALL channels.",
      "properties": {
        "total": {
          "type": "integer",
          "description": "Gesamtzahl der Einträge (voller Bestand)."
        },
        "returned": {
          "type": "integer",
          "description": "Zahl der auf dieser Seite ausgelieferten Einträge."
        },
        "limit": {
          "type": [
            "integer",
            "null"
          ],
          "description": "Angewandtes Seiten-Limit; null bei Vollausgabe (REST-Default oder limit=all)."
        },
        "offset": {
          "type": "integer",
          "description": "Start-Offset der Seite."
        },
        "truncated": {
          "type": "boolean",
          "description": "true, wenn hinter dieser Seite noch Einträge liegen (offset + returned < total); bei Vollausgabe false."
        }
      }
    }
  }
}