{
  "openapi": "3.0.3",
  "info": {
    "title": "Mover-Installieren.de KI-Dock",
    "version": "1.9.0",
    "description": "Per IP: one request per 1 seconds AND 1000 admitted requests per fixed clock hour. Reset at next full hour. On 429 honor FULL Retry-After; hourly_limit_exceeded means waiting until hourly reset. Configure mover installation and retrieve current website prices and product images. No orders or payments. PER-IP: only ONE API request every 1 seconds, shared by all actions from the same IP address across all actions. Wait at least 1 seconds after EVERY response. Never parallelize. On 429 also honor Retry-After; wait max(1, Retry-After) seconds. Do not bypass. After 3 retries stop and link to website. Reverse lookup explains equipment from the public anf configuration reference, not an actual customer order. For new configurations ask vehicle type, axle count and permitted gross weight before equipment preferences. Query-free path operations are available if URL readers discard query parameters. Both URL forms share the same per-IP 1-second limiter. For tools restricted to previously seen URLs, start at https://www.mover-installieren.de/ki-dock/v1/configure and follow its actual HTML hyperlinks to the final quote."
  },
  "servers": [
    {
      "url": "https://www.mover-installieren.de"
    }
  ],
  "externalDocs": {
    "url": "https://www.mover-installieren.de/ki-dock.txt"
  },
  "paths": {
    "/ajax/ki-dock.php": {
      "get": {
        "operationId": "getMoverCatalogQuoteOrConfiguration",
        "summary": "Catalog, current quote or reverse lookup; PER-IP one request per 1 seconds",
        "description": "PER-IP: only ONE API request every 1 seconds, shared by all actions from the same IP address across all actions. Wait at least 1 seconds after EVERY response. Never parallelize. On 429 also honor Retry-After; wait max(1, Retry-After) seconds. Do not bypass. After 3 retries stop and link to website. First request catalog; wait 1 seconds; then quote with exactly one ID per category. Present returned images with attribution and configurator_url. If a configuration reference is already available, call action=lookup&anf=VALUE first. Without action, anf defaults to lookup; otherwise catalog. Ask only missing vehicle type, axles and permitted gross weight. Existing references do not store gross weight. Lookup reports current prices, never historical prices or order status.",
        "parameters": [
          {
            "name": "action",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "catalog",
                "quote",
                "lookup"
              ]
            },
            "description": "catalog: current options/images; quote: all seven IDs required; lookup: anf required, no category IDs. Without action: lookup if anf exists, otherwise catalog. Per-IP limit shared by ALL three actions: wait at least 1 seconds after every response and honor Retry-After on 429."
          },
          {
            "name": "artfzg",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1
            },
            "description": "Fahrzeug: REQUIRED when action=quote. Use a current catalog ID of this category; omit for catalog and lookup."
          },
          {
            "name": "mover",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1
            },
            "description": "Mover: REQUIRED when action=quote. Use a current catalog ID of this category; omit for catalog and lookup."
          },
          {
            "name": "service",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1
            },
            "description": "Einbau: REQUIRED when action=quote. Use a current catalog ID of this category; omit for catalog and lookup."
          },
          {
            "name": "akkupack",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1
            },
            "description": "Akku: REQUIRED when action=quote. Use a current catalog ID of this category; omit for catalog and lookup."
          },
          {
            "name": "ladegerat",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1
            },
            "description": "LadegerÃƒÆ’Ã‚Â¤t: REQUIRED when action=quote. Use a current catalog ID of this category; omit for catalog and lookup."
          },
          {
            "name": "upgrades",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1
            },
            "description": "Extras: REQUIRED when action=quote. Use a current catalog ID of this category; omit for catalog and lookup."
          },
          {
            "name": "movergarantie",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1
            },
            "description": "Garantie: REQUIRED when action=quote. Use a current catalog ID of this category; omit for catalog and lookup."
          },
          {
            "name": "gross_weight_kg",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 10,
              "maximum": 50000
            },
            "description": "Optional for quote/lookup; permitted gross vehicle weight from customer vehicle documents. Never assume weight from mover capacity. Ask if unknown; without it weight_checked=false. Omit for catalog."
          },
          {
            "name": "anf",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9]{5}$",
              "example": "AMKNH"
            },
            "description": "Required for lookup. Public configuration reference (Bestellnummer) extracted from website ?anf= link; five letters/digits, case-insensitive. Not a full URL, order or invoice number. Omit for catalog/quote. Do not enumerate codes."
          }
        ],
        "responses": {
          "200": {
            "description": "Catalog, quote or stored configuration with current prices and images. Retired/incomplete configurations may return price=null and current_price_available=false; explain returned selections without replacing them. Wait 1 seconds before next API request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Response"
                }
              }
            }
          },
          "400": {
            "description": "Invalid or missing parameter.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Response"
                }
              }
            }
          },
          "405": {
            "description": "GET only.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Response"
                }
              }
            }
          },
          "422": {
            "description": "Invalid selection, incompatible axle or exceeded weight.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Response"
                }
              }
            }
          },
          "429": {
            "description": "Per-IP limit exceeded. Wait max(1, Retry-After) seconds.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Response"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "description": "Wait at least this many seconds AND at least 1 seconds before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "503": {
            "description": "Temporarily unavailable; wait at least 1 seconds.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Response"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "description": "Wait at least this many seconds AND at least 1 seconds before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "404": {
            "description": "Public configuration reference not found; ask customer to check it.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Response"
                }
              }
            }
          }
        }
      }
    },
    "/ki-dock/v1/catalog": {
      "get": {
        "operationId": "getMoverCatalogPath",
        "summary": "Current catalog and images.",
        "description": "Query-free compatibility endpoint. Same shared PER-IP limit: one request every 1 seconds across all routes for the same IP address. Wait at least 1 seconds after each response and honor Retry-After. Current catalog and images.",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Catalog, quote or stored configuration with current prices and images. Retired/incomplete configurations may return price=null and current_price_available=false; explain returned selections without replacing them. Wait 1 seconds before next API request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Response"
                }
              }
            }
          },
          "400": {
            "description": "Invalid or missing parameter.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Response"
                }
              }
            }
          },
          "405": {
            "description": "GET only.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Response"
                }
              }
            }
          },
          "422": {
            "description": "Invalid selection, incompatible axle or exceeded weight.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Response"
                }
              }
            }
          },
          "429": {
            "description": "Per-IP limit exceeded. Wait max(1, Retry-After) seconds.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Response"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "description": "Wait at least this many seconds AND at least 1 seconds before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "503": {
            "description": "Temporarily unavailable; wait at least 1 seconds.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Response"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "description": "Wait at least this many seconds AND at least 1 seconds before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "404": {
            "description": "Public configuration reference not found; ask customer to check it.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Response"
                }
              }
            }
          }
        }
      }
    },
    "/ki-dock/v1/quote/{artfzg}/{mover}/{service}/{akkupack}/{ladegerat}/{upgrades}/{movergarantie}": {
      "get": {
        "operationId": "getMoverQuotePath",
        "summary": "Current quote; weight unknown, not verified.",
        "description": "Query-free compatibility endpoint. Same shared PER-IP limit: one request every 1 seconds across all routes for the same IP address. Wait at least 1 seconds after each response and honor Retry-After. Current quote; weight unknown, not verified.",
        "parameters": [
          {
            "name": "artfzg",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            },
            "description": "Current catalog ID for artfzg"
          },
          {
            "name": "mover",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            },
            "description": "Current catalog ID for mover"
          },
          {
            "name": "service",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            },
            "description": "Current catalog ID for service"
          },
          {
            "name": "akkupack",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            },
            "description": "Current catalog ID for akkupack"
          },
          {
            "name": "ladegerat",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            },
            "description": "Current catalog ID for ladegerat"
          },
          {
            "name": "upgrades",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            },
            "description": "Current catalog ID for upgrades"
          },
          {
            "name": "movergarantie",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            },
            "description": "Current catalog ID for movergarantie"
          }
        ],
        "responses": {
          "200": {
            "description": "Catalog, quote or stored configuration with current prices and images. Retired/incomplete configurations may return price=null and current_price_available=false; explain returned selections without replacing them. Wait 1 seconds before next API request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Response"
                }
              }
            }
          },
          "400": {
            "description": "Invalid or missing parameter.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Response"
                }
              }
            }
          },
          "405": {
            "description": "GET only.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Response"
                }
              }
            }
          },
          "422": {
            "description": "Invalid selection, incompatible axle or exceeded weight.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Response"
                }
              }
            }
          },
          "429": {
            "description": "Per-IP limit exceeded. Wait max(1, Retry-After) seconds.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Response"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "description": "Wait at least this many seconds AND at least 1 seconds before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "503": {
            "description": "Temporarily unavailable; wait at least 1 seconds.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Response"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "description": "Wait at least this many seconds AND at least 1 seconds before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "404": {
            "description": "Public configuration reference not found; ask customer to check it.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Response"
                }
              }
            }
          }
        }
      }
    },
    "/ki-dock/v1/quote/{artfzg}/{mover}/{service}/{akkupack}/{ladegerat}/{upgrades}/{movergarantie}/{gross_weight_kg}": {
      "get": {
        "operationId": "getMoverQuoteWithWeightPath",
        "summary": "Current quote with supplied gross weight check.",
        "description": "Query-free compatibility endpoint. Same shared PER-IP limit: one request every 1 seconds across all routes for the same IP address. Wait at least 1 seconds after each response and honor Retry-After. Current quote with supplied gross weight check.",
        "parameters": [
          {
            "name": "artfzg",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            },
            "description": "Current catalog ID for artfzg"
          },
          {
            "name": "mover",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            },
            "description": "Current catalog ID for mover"
          },
          {
            "name": "service",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            },
            "description": "Current catalog ID for service"
          },
          {
            "name": "akkupack",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            },
            "description": "Current catalog ID for akkupack"
          },
          {
            "name": "ladegerat",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            },
            "description": "Current catalog ID for ladegerat"
          },
          {
            "name": "upgrades",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            },
            "description": "Current catalog ID for upgrades"
          },
          {
            "name": "movergarantie",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            },
            "description": "Current catalog ID for movergarantie"
          },
          {
            "name": "gross_weight_kg",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 10,
              "maximum": 50000
            },
            "description": "Customer permitted gross weight in kg."
          }
        ],
        "responses": {
          "200": {
            "description": "Catalog, quote or stored configuration with current prices and images. Retired/incomplete configurations may return price=null and current_price_available=false; explain returned selections without replacing them. Wait 1 seconds before next API request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Response"
                }
              }
            }
          },
          "400": {
            "description": "Invalid or missing parameter.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Response"
                }
              }
            }
          },
          "405": {
            "description": "GET only.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Response"
                }
              }
            }
          },
          "422": {
            "description": "Invalid selection, incompatible axle or exceeded weight.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Response"
                }
              }
            }
          },
          "429": {
            "description": "Per-IP limit exceeded. Wait max(1, Retry-After) seconds.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Response"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "description": "Wait at least this many seconds AND at least 1 seconds before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "503": {
            "description": "Temporarily unavailable; wait at least 1 seconds.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Response"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "description": "Wait at least this many seconds AND at least 1 seconds before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "404": {
            "description": "Public configuration reference not found; ask customer to check it.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Response"
                }
              }
            }
          }
        }
      }
    },
    "/ki-dock/v1/lookup/{anf}": {
      "get": {
        "operationId": "getMoverConfigurationPath",
        "summary": "Explain existing configuration, with current price when available.",
        "description": "Query-free compatibility endpoint. Same shared PER-IP limit: one request every 1 seconds across all routes for the same IP address. Wait at least 1 seconds after each response and honor Retry-After. Explain existing configuration, with current price when available.",
        "parameters": [
          {
            "name": "anf",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9]{5}$"
            },
            "description": "Public configuration reference from customer anf link."
          }
        ],
        "responses": {
          "200": {
            "description": "Catalog, quote or stored configuration with current prices and images. Retired/incomplete configurations may return price=null and current_price_available=false; explain returned selections without replacing them. Wait 1 seconds before next API request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Response"
                }
              }
            }
          },
          "400": {
            "description": "Invalid or missing parameter.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Response"
                }
              }
            }
          },
          "405": {
            "description": "GET only.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Response"
                }
              }
            }
          },
          "422": {
            "description": "Invalid selection, incompatible axle or exceeded weight.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Response"
                }
              }
            }
          },
          "429": {
            "description": "Per-IP limit exceeded. Wait max(1, Retry-After) seconds.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Response"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "description": "Wait at least this many seconds AND at least 1 seconds before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "503": {
            "description": "Temporarily unavailable; wait at least 1 seconds.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Response"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "description": "Wait at least this many seconds AND at least 1 seconds before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "404": {
            "description": "Public configuration reference not found; ask customer to check it.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Response"
                }
              }
            }
          }
        }
      }
    },
    "/ki-dock/v1/lookup/{anf}/{gross_weight_kg}": {
      "get": {
        "operationId": "getMoverConfigurationWithWeightPath",
        "summary": "Explain existing configuration and check supplied gross weight.",
        "description": "Query-free compatibility endpoint. Same shared PER-IP limit: one request every 1 seconds across all routes for the same IP address. Wait at least 1 seconds after each response and honor Retry-After. Explain existing configuration and check supplied gross weight.",
        "parameters": [
          {
            "name": "anf",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9]{5}$"
            },
            "description": "Public configuration reference from customer anf link."
          },
          {
            "name": "gross_weight_kg",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 10,
              "maximum": 50000
            },
            "description": "Customer permitted gross weight in kg."
          }
        ],
        "responses": {
          "200": {
            "description": "Catalog, quote or stored configuration with current prices and images. Retired/incomplete configurations may return price=null and current_price_available=false; explain returned selections without replacing them. Wait 1 seconds before next API request.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Response"
                }
              }
            }
          },
          "400": {
            "description": "Invalid or missing parameter.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Response"
                }
              }
            }
          },
          "405": {
            "description": "GET only.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Response"
                }
              }
            }
          },
          "422": {
            "description": "Invalid selection, incompatible axle or exceeded weight.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Response"
                }
              }
            }
          },
          "429": {
            "description": "Per-IP limit exceeded. Wait max(1, Retry-After) seconds.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Response"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "description": "Wait at least this many seconds AND at least 1 seconds before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "503": {
            "description": "Temporarily unavailable; wait at least 1 seconds.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Response"
                }
              }
            },
            "headers": {
              "Retry-After": {
                "description": "Wait at least this many seconds AND at least 1 seconds before retrying.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "404": {
            "description": "Public configuration reference not found; ask customer to check it.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Response"
                }
              }
            }
          }
        }
      }
    },
    "/ki-dock/v1/configure": {
      "get": {
        "operationId": "configureLinked0",
        "summary": "Fully linked HTML selection; per-IP one request every 1 seconds",
        "description": "Follow literal links from the previous page. Defaults are drafts. Final quote uses existing website calculation. Weight digit links support exact weights. Errors are JSON.",
        "parameters": [],
        "responses": {
          "200": {
            "description": "HTML with absolute next-step and final quote links",
            "content": {
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "429": {
            "description": "Wait at least 1 seconds and honor Retry-After."
          },
          "422": {
            "description": "Invalid selection."
          }
        }
      }
    },
    "/ki-dock/v1/configure/{artfzg}/{mover}/{service}/{akkupack}/{ladegerat}/{upgrades}/{movergarantie}": {
      "get": {
        "operationId": "configureLinked7",
        "summary": "Fully linked HTML selection; per-IP one request every 1 seconds",
        "description": "Follow literal links from the previous page. Defaults are drafts. Final quote uses existing website calculation. Weight digit links support exact weights. Errors are JSON.",
        "parameters": [
          {
            "name": "artfzg",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "mover",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "service",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "akkupack",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "ladegerat",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "upgrades",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "movergarantie",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ],
        "responses": {
          "200": {
            "description": "HTML with absolute next-step and final quote links",
            "content": {
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "429": {
            "description": "Wait at least 1 seconds and honor Retry-After."
          },
          "422": {
            "description": "Invalid selection."
          }
        }
      }
    },
    "/ki-dock/v1/configure/{artfzg}/{mover}/{service}/{akkupack}/{ladegerat}/{upgrades}/{movergarantie}/{gross_weight_kg}": {
      "get": {
        "operationId": "configureLinked8",
        "summary": "Fully linked HTML selection; per-IP one request every 1 seconds",
        "description": "Follow literal links from the previous page. Defaults are drafts. Final quote uses existing website calculation. Weight digit links support exact weights. Errors are JSON.",
        "parameters": [
          {
            "name": "artfzg",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "mover",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "service",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "akkupack",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "ladegerat",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "upgrades",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "movergarantie",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "gross_weight_kg",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ],
        "responses": {
          "200": {
            "description": "HTML with absolute next-step and final quote links",
            "content": {
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "429": {
            "description": "Wait at least 1 seconds and honor Retry-After."
          },
          "422": {
            "description": "Invalid selection."
          }
        }
      }
    },
    "/ki-dock/v1/weight/{artfzg}/{mover}/{service}/{akkupack}/{ladegerat}/{upgrades}/{movergarantie}": {
      "get": {
        "operationId": "weightLinked7",
        "summary": "Fully linked HTML selection; per-IP one request every 1 seconds",
        "description": "Follow literal links from the previous page. Defaults are drafts. Final quote uses existing website calculation. Weight digit links support exact weights. Errors are JSON.",
        "parameters": [
          {
            "name": "artfzg",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "mover",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "service",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "akkupack",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "ladegerat",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "upgrades",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "movergarantie",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ],
        "responses": {
          "200": {
            "description": "HTML with absolute next-step and final quote links",
            "content": {
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "429": {
            "description": "Wait at least 1 seconds and honor Retry-After."
          },
          "422": {
            "description": "Invalid selection."
          }
        }
      }
    },
    "/ki-dock/v1/weight/{artfzg}/{mover}/{service}/{akkupack}/{ladegerat}/{upgrades}/{movergarantie}/{weight_digits}": {
      "get": {
        "operationId": "weightLinked8",
        "summary": "Fully linked HTML selection; per-IP one request every 1 seconds",
        "description": "Follow literal links from the previous page. Defaults are drafts. Final quote uses existing website calculation. Weight digit links support exact weights. Errors are JSON.",
        "parameters": [
          {
            "name": "artfzg",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "mover",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "service",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "akkupack",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "ladegerat",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "upgrades",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "movergarantie",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "weight_digits",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ],
        "responses": {
          "200": {
            "description": "HTML with absolute next-step and final quote links",
            "content": {
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "429": {
            "description": "Wait at least 1 seconds and honor Retry-After."
          },
          "422": {
            "description": "Invalid selection."
          }
        }
      }
    },
    "/ki-dock/v1/reference": {
      "get": {
        "operationId": "linkedReferenceStart",
        "summary": "Follow character links for an existing configuration code; per-IP 1-second limit",
        "description": "HTML exposes literal next-step URLs and final lookup link. No JavaScript, query parameters or new configuration. Follow links instead of constructing URLs.",
        "parameters": [],
        "responses": {
          "200": {
            "description": "HTML containing literal links",
            "content": {
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "429": {
            "description": "Wait at least 1 seconds and honor Retry-After."
          }
        }
      }
    },
    "/ki-dock/v1/reference/{prefix}": {
      "get": {
        "operationId": "linkedReferencePrefix",
        "summary": "Follow character links for an existing configuration code; per-IP 1-second limit",
        "description": "HTML exposes literal next-step URLs and final lookup link. No JavaScript, query parameters or new configuration. Follow links instead of constructing URLs.",
        "parameters": [
          {
            "name": "prefix",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9]{1,5}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "HTML containing literal links",
            "content": {
              "text/html": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "429": {
            "description": "Wait at least 1 seconds and honor Retry-After."
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "Image": {
        "type": "object",
        "nullable": true,
        "properties": {
          "url": {
            "type": "string",
            "format": "uri"
          },
          "alt": {
            "type": "string"
          },
          "kind": {
            "type": "string"
          }
        }
      },
      "Product": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer"
          },
          "category": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "details": {
            "type": "string"
          },
          "description": {
            "type": "string"
          },
          "component_price_eur": {
            "type": "number",
            "description": "NOT a quote total. Request quote; do not sum components."
          },
          "image": {
            "$ref": "#/components/schemas/Image"
          },
          "max_weight_kg": {
            "type": "object",
            "properties": {
              "single_axle": {
                "type": "integer"
              },
              "tandem_axle": {
                "type": "integer"
              }
            },
            "description": "Mover only. Zero means unsupported."
          }
        }
      },
      "Response": {
        "type": "object",
        "required": [
          "api_version",
          "rate_limit"
        ],
        "properties": {
          "api_version": {
            "type": "string"
          },
          "type": {
            "type": "string",
            "enum": [
              "catalog",
              "quote",
              "configuration"
            ]
          },
          "generated_at": {
            "type": "string",
            "format": "date-time"
          },
          "rate_limit": {
            "type": "object",
            "required": [
              "scope",
              "interval_seconds",
              "instruction"
            ],
            "properties": {
              "scope": {
                "type": "string"
              },
              "requests": {
                "type": "integer",
                "enum": [
                  1
                ]
              },
              "interval_seconds": {
                "type": "integer",
                "minimum": 1
              },
              "wait_before_next_request_seconds": {
                "type": "integer"
              },
              "retry_after_seconds": {
                "type": "integer",
                "nullable": true
              },
              "instruction": {
                "type": "string"
              },
              "hourly_limit": {
                "type": "integer",
                "minimum": 1
              },
              "hourly_remaining": {
                "type": "integer",
                "nullable": true
              },
              "hourly_reset_at": {
                "type": "string",
                "format": "date-time",
                "nullable": true
              },
              "hourly_window": {
                "type": "string",
                "enum": [
                  "fixed_clock_hour"
                ]
              }
            }
          },
          "categories": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "key": {
                  "type": "string"
                },
                "label": {
                  "type": "string"
                },
                "options": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Product"
                  }
                }
              }
            }
          },
          "selections": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Product"
            }
          },
          "price": {
            "type": "object",
            "properties": {
              "currency": {
                "type": "string",
                "enum": [
                  "EUR"
                ]
              },
              "regular_total": {
                "type": "number"
              },
              "discount": {
                "type": "number"
              },
              "total": {
                "type": "number"
              },
              "vat_included": {
                "type": "boolean"
              },
              "installation_included": {
                "type": "boolean"
              },
              "promotion": {
                "type": "object",
                "nullable": true,
                "properties": {
                  "name": {
                    "type": "string"
                  },
                  "until_display": {
                    "type": "string"
                  }
                }
              }
            },
            "nullable": true
          },
          "configurator_url": {
            "type": "string",
            "format": "uri",
            "description": "Customer link: same-site redirect to the selected configuration, source KI-Dock. Present it to the customer; do not prefetch to simulate a customer visit. Link requests are not sales."
          },
          "configuration_reference": {
            "type": "string"
          },
          "compatibility": {
            "type": "object",
            "description": "Axle and optionally weight checked. Chassis fit requires professional inspection."
          },
          "presentation": {
            "type": "object",
            "properties": {
              "title": {
                "type": "string"
              },
              "summary": {
                "type": "string"
              },
              "primary_image": {
                "$ref": "#/components/schemas/Image"
              },
              "logo": {
                "$ref": "#/components/schemas/Image"
              },
              "service_illustration": {
                "$ref": "#/components/schemas/Image"
              },
              "instructions": {
                "type": "string"
              }
            }
          },
          "order_created": {
            "type": "boolean",
            "enum": [
              false
            ]
          },
          "error": {
            "type": "string"
          },
          "message": {
            "type": "string"
          },
          "documentation_url": {
            "type": "string",
            "format": "uri"
          },
          "current_price_available": {
            "type": "boolean"
          },
          "price_basis": {
            "type": "string",
            "description": "Current configurator price, not a historical purchase price."
          },
          "issues": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "customer_questions": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "key": {
                  "type": "string"
                },
                "question": {
                  "type": "string"
                },
                "choices": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                },
                "instruction": {
                  "type": "string"
                }
              }
            }
          },
          "consultation_instruction": {
            "type": "string"
          },
          "request_action": {
            "type": "string",
            "description": "Effective action. A quote must return quote, not catalog."
          },
          "query_free_access": {
            "type": "object",
            "description": "Concrete catalog URL and URI templates for quote and lookup without query parameters."
          }
        }
      }
    }
  }
}