{
  "components": {
    "schemas": {
      "ActivePromoItem": {
        "properties": {
          "country": {
            "title": "Country",
            "type": "string"
          },
          "depth_pct": {
            "title": "Depth Pct",
            "type": "number"
          },
          "ends_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Ends At"
          },
          "list_cents": {
            "title": "List Cents",
            "type": "integer"
          },
          "name": {
            "title": "Name",
            "type": "string"
          },
          "promo_cents": {
            "title": "Promo Cents",
            "type": "integer"
          },
          "sku": {
            "title": "Sku",
            "type": "string"
          },
          "sku_id": {
            "format": "uuid",
            "title": "Sku Id",
            "type": "string"
          }
        },
        "required": [
          "sku_id",
          "sku",
          "name",
          "country",
          "promo_cents",
          "list_cents",
          "depth_pct"
        ],
        "title": "ActivePromoItem",
        "type": "object"
      },
      "ActivePromosResponse": {
        "properties": {
          "items": {
            "items": {
              "$ref": "#/components/schemas/ActivePromoItem"
            },
            "title": "Items",
            "type": "array"
          }
        },
        "required": [
          "items"
        ],
        "title": "ActivePromosResponse",
        "type": "object"
      },
      "AlertItem": {
        "properties": {
          "alert_type": {
            "$ref": "#/components/schemas/AlertType"
          },
          "body": {
            "title": "Body",
            "type": "string"
          },
          "created_at": {
            "format": "date-time",
            "title": "Created At",
            "type": "string"
          },
          "event_status": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Event Status"
          },
          "first_detected_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "First Detected At"
          },
          "id": {
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "impact_score": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Impact Score"
          },
          "monitored_retailer_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Monitored Retailer Id"
          },
          "payload": {
            "title": "Payload",
            "type": "object"
          },
          "resolved_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Resolved At"
          },
          "severity": {
            "$ref": "#/components/schemas/AlertSeverity"
          },
          "sku_category": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/SkuCategoryTag"
              },
              {
                "type": "null"
              }
            ]
          },
          "sku_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Sku Id"
          },
          "snooze_until": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Snooze Until"
          },
          "status": {
            "$ref": "#/components/schemas/AlertStatus"
          },
          "title": {
            "title": "Title",
            "type": "string"
          },
          "updated_at": {
            "format": "date-time",
            "title": "Updated At",
            "type": "string"
          }
        },
        "required": [
          "id",
          "alert_type",
          "severity",
          "status",
          "title",
          "body",
          "payload",
          "sku_id",
          "monitored_retailer_id",
          "snooze_until",
          "resolved_at",
          "created_at",
          "updated_at"
        ],
        "title": "AlertItem",
        "type": "object"
      },
      "AlertListResponse": {
        "properties": {
          "items": {
            "items": {
              "$ref": "#/components/schemas/AlertItem"
            },
            "title": "Items",
            "type": "array"
          },
          "total": {
            "title": "Total",
            "type": "integer"
          },
          "unread_count": {
            "title": "Unread Count",
            "type": "integer"
          }
        },
        "required": [
          "items",
          "total",
          "unread_count"
        ],
        "title": "AlertListResponse",
        "type": "object"
      },
      "AlertSeverity": {
        "enum": [
          "info",
          "warning",
          "critical"
        ],
        "title": "AlertSeverity",
        "type": "string"
      },
      "AlertStatus": {
        "enum": [
          "unread",
          "read",
          "snoozed",
          "ignored",
          "muted",
          "resolved"
        ],
        "title": "AlertStatus",
        "type": "string"
      },
      "AlertSummary": {
        "description": "Dashboard KPI tile counts.",
        "properties": {
          "by_severity": {
            "additionalProperties": {
              "type": "integer"
            },
            "title": "By Severity",
            "type": "object"
          },
          "by_type": {
            "additionalProperties": {
              "type": "integer"
            },
            "title": "By Type",
            "type": "object"
          },
          "total_open": {
            "title": "Total Open",
            "type": "integer"
          }
        },
        "required": [
          "total_open",
          "by_type",
          "by_severity"
        ],
        "title": "AlertSummary",
        "type": "object"
      },
      "AlertType": {
        "enum": [
          "competitor_cheaper",
          "structurally_more_expensive",
          "sudden_price_move",
          "new_retailer",
          "retailer_dropped_product",
          "multi_retailer_oos",
          "own_price_inconsistent",
          "own_undercut",
          "own_oos_competitor_in"
        ],
        "title": "AlertType",
        "type": "string"
      },
      "ApiKeyCreated": {
        "description": "Carries the key itself. This shape exists once, in one response.",
        "properties": {
          "created_at": {
            "title": "Created At",
            "type": "string"
          },
          "expires_at": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Expires At"
          },
          "id": {
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "key": {
            "title": "Key",
            "type": "string"
          },
          "last_used_at": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Last Used At"
          },
          "name": {
            "title": "Name",
            "type": "string"
          },
          "prefix": {
            "title": "Prefix",
            "type": "string"
          },
          "revoked_at": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Revoked At"
          },
          "scope": {
            "default": "full",
            "enum": [
              "full",
              "ingest",
              "read"
            ],
            "title": "Scope",
            "type": "string"
          }
        },
        "required": [
          "id",
          "name",
          "prefix",
          "created_at",
          "last_used_at",
          "revoked_at",
          "key"
        ],
        "title": "ApiKeyCreated",
        "type": "object"
      },
      "ApiKeyIn": {
        "additionalProperties": false,
        "properties": {
          "expires_in_days": {
            "anyOf": [
              {
                "maximum": 365.0,
                "minimum": 1.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Expires In Days"
          },
          "name": {
            "maxLength": 80,
            "minLength": 1,
            "title": "Name",
            "type": "string"
          },
          "scope": {
            "default": "full",
            "enum": [
              "full",
              "ingest",
              "read"
            ],
            "title": "Scope",
            "type": "string"
          }
        },
        "required": [
          "name"
        ],
        "title": "ApiKeyIn",
        "type": "object"
      },
      "ApiKeyOut": {
        "properties": {
          "created_at": {
            "title": "Created At",
            "type": "string"
          },
          "expires_at": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Expires At"
          },
          "id": {
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "last_used_at": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Last Used At"
          },
          "name": {
            "title": "Name",
            "type": "string"
          },
          "prefix": {
            "title": "Prefix",
            "type": "string"
          },
          "revoked_at": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Revoked At"
          },
          "scope": {
            "default": "full",
            "enum": [
              "full",
              "ingest",
              "read"
            ],
            "title": "Scope",
            "type": "string"
          }
        },
        "required": [
          "id",
          "name",
          "prefix",
          "created_at",
          "last_used_at",
          "revoked_at"
        ],
        "title": "ApiKeyOut",
        "type": "object"
      },
      "BandPoint": {
        "description": "One time-bucket of the portfolio-versus-market line.\n\n`me_avg_cents` = mean own (is_self) price across the portfolio that bucket.\n`market_avg_cents` = mean competitor price. `market_min/max_avg_cents` =\nmean cheapest / dearest competitor per SKU \u2014 the spread band edges.\nAny field is null when that bucket has no contributing observation.\n\n`index_pct` is not `me_avg_cents / market_avg_cents`: those two averages\nrun over different baskets of SKUs. It is the mean of the per-SKU ratio,\nover the SKUs that carried both an own and a competitor price.",
        "properties": {
          "bucket_start": {
            "format": "date-time",
            "title": "Bucket Start",
            "type": "string"
          },
          "index_pct": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Index Pct"
          },
          "index_skus_n": {
            "default": 0,
            "title": "Index Skus N",
            "type": "integer"
          },
          "market_avg_cents": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Market Avg Cents"
          },
          "market_max_avg_cents": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Market Max Avg Cents"
          },
          "market_min_avg_cents": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Market Min Avg Cents"
          },
          "me_avg_cents": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Me Avg Cents"
          }
        },
        "required": [
          "bucket_start",
          "me_avg_cents",
          "market_avg_cents",
          "market_min_avg_cents",
          "market_max_avg_cents"
        ],
        "title": "BandPoint",
        "type": "object"
      },
      "Body_import_csv_api_v1_skus_import_post": {
        "properties": {
          "file": {
            "format": "binary",
            "title": "File",
            "type": "string"
          }
        },
        "required": [
          "file"
        ],
        "title": "Body_import_csv_api_v1_skus_import_post",
        "type": "object"
      },
      "Body_import_url_csv_api_v1_mappings_import_post": {
        "properties": {
          "file": {
            "format": "binary",
            "title": "File",
            "type": "string"
          }
        },
        "required": [
          "file"
        ],
        "title": "Body_import_url_csv_api_v1_mappings_import_post",
        "type": "object"
      },
      "Body_preview_import_api_v1_skus_import_preview_post": {
        "properties": {
          "file": {
            "format": "binary",
            "title": "File",
            "type": "string"
          }
        },
        "required": [
          "file"
        ],
        "title": "Body_preview_import_api_v1_skus_import_preview_post",
        "type": "object"
      },
      "BulkFloorRequest": {
        "description": "Bulk-set the guardrail band (floor and/or ceiling) for a SKU-id list.\n`*_value` is cents for `absolute`, a percentage otherwise.",
        "properties": {
          "ceiling_mode": {
            "anyOf": [
              {
                "enum": [
                  "absolute",
                  "pct_over_msrp"
                ],
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Ceiling Mode"
          },
          "ceiling_value": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Ceiling Value"
          },
          "country": {
            "default": "NL",
            "maxLength": 2,
            "minLength": 2,
            "title": "Country",
            "type": "string"
          },
          "floor_mode": {
            "anyOf": [
              {
                "enum": [
                  "absolute",
                  "cost_plus_pct",
                  "pct_under_msrp",
                  "pct_under_sell"
                ],
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Floor Mode"
          },
          "floor_value": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Floor Value"
          },
          "ids": {
            "items": {
              "format": "uuid",
              "type": "string"
            },
            "maxItems": 1000,
            "minItems": 1,
            "title": "Ids",
            "type": "array"
          }
        },
        "required": [
          "ids"
        ],
        "title": "BulkFloorRequest",
        "type": "object"
      },
      "BulkFloorResponse": {
        "properties": {
          "ceiling_updated": {
            "title": "Ceiling Updated",
            "type": "integer"
          },
          "floor_updated": {
            "title": "Floor Updated",
            "type": "integer"
          },
          "total": {
            "title": "Total",
            "type": "integer"
          }
        },
        "required": [
          "floor_updated",
          "ceiling_updated",
          "total"
        ],
        "title": "BulkFloorResponse",
        "type": "object"
      },
      "BulkProductsRequest": {
        "properties": {
          "currency": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Currency"
          },
          "products": {
            "items": {
              "additionalProperties": false,
              "description": "E\u00e9n product zoals het bronsysteem het kent.",
              "properties": {
                "brand": {
                  "anyOf": [
                    {
                      "maxLength": 255,
                      "type": "string"
                    },
                    {
                      "type": "null"
                    }
                  ],
                  "title": "Brand"
                },
                "category": {
                  "anyOf": [
                    {
                      "maxLength": 255,
                      "type": "string"
                    },
                    {
                      "type": "null"
                    }
                  ],
                  "title": "Category"
                },
                "cost_price": {
                  "anyOf": [
                    {
                      "minimum": 0.0,
                      "type": "integer"
                    },
                    {
                      "type": "null"
                    }
                  ],
                  "title": "Cost Price"
                },
                "ean": {
                  "anyOf": [
                    {
                      "maxLength": 64,
                      "type": "string"
                    },
                    {
                      "type": "null"
                    }
                  ],
                  "title": "Ean"
                },
                "id": {
                  "maxLength": 255,
                  "minLength": 1,
                  "title": "Id",
                  "type": "string"
                },
                "list_price": {
                  "anyOf": [
                    {
                      "minimum": 0.0,
                      "type": "integer"
                    },
                    {
                      "type": "null"
                    }
                  ],
                  "title": "List Price"
                },
                "mpn": {
                  "anyOf": [
                    {
                      "maxLength": 255,
                      "type": "string"
                    },
                    {
                      "type": "null"
                    }
                  ],
                  "title": "Mpn"
                },
                "name": {
                  "maxLength": 255,
                  "minLength": 1,
                  "title": "Name",
                  "type": "string"
                },
                "parent_id": {
                  "anyOf": [
                    {
                      "maxLength": 255,
                      "type": "string"
                    },
                    {
                      "type": "null"
                    }
                  ],
                  "title": "Parent Id"
                },
                "price": {
                  "anyOf": [
                    {
                      "minimum": 0.0,
                      "type": "integer"
                    },
                    {
                      "type": "null"
                    }
                  ],
                  "title": "Price"
                },
                "sku": {
                  "anyOf": [
                    {
                      "maxLength": 255,
                      "type": "string"
                    },
                    {
                      "type": "null"
                    }
                  ],
                  "title": "Sku"
                },
                "status": {
                  "default": "active",
                  "enum": [
                    "active",
                    "disabled"
                  ],
                  "title": "Status",
                  "type": "string"
                }
              },
              "required": [
                "id",
                "name"
              ],
              "title": "ProductIn",
              "type": "object"
            },
            "maxItems": 500,
            "minItems": 1,
            "title": "Products",
            "type": "array"
          }
        },
        "required": [
          "products"
        ],
        "title": "BulkProductsRequest",
        "type": "object"
      },
      "BulkProductsResponse": {
        "properties": {
          "results": {
            "items": {
              "$ref": "#/components/schemas/ItemResult"
            },
            "title": "Results",
            "type": "array"
          },
          "summary": {
            "$ref": "#/components/schemas/BulkSummary"
          },
          "sync_id": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Sync Id"
          }
        },
        "required": [
          "summary",
          "results"
        ],
        "title": "BulkProductsResponse",
        "type": "object"
      },
      "BulkSummary": {
        "properties": {
          "created": {
            "title": "Created",
            "type": "integer"
          },
          "failed": {
            "title": "Failed",
            "type": "integer"
          },
          "received": {
            "title": "Received",
            "type": "integer"
          },
          "skipped": {
            "title": "Skipped",
            "type": "integer"
          },
          "updated": {
            "title": "Updated",
            "type": "integer"
          },
          "warned": {
            "default": 0,
            "title": "Warned",
            "type": "integer"
          }
        },
        "required": [
          "received",
          "created",
          "updated",
          "failed",
          "skipped"
        ],
        "title": "BulkSummary",
        "type": "object"
      },
      "CategoryRollupResponse": {
        "properties": {
          "rows": {
            "items": {
              "$ref": "#/components/schemas/CategoryRollupRow"
            },
            "title": "Rows",
            "type": "array"
          },
          "window_days": {
            "title": "Window Days",
            "type": "integer"
          }
        },
        "required": [
          "window_days",
          "rows"
        ],
        "title": "CategoryRollupResponse",
        "type": "object"
      },
      "CategoryRollupRow": {
        "description": "Per-category market-trend roll-up \u2014 the scale answer (10k SKUs \u2192 ~6 rows).\n\n`margin_at_stake_cents` (pressure, \u22650) = \u03a3(own - cheapest competitor) over\nundercut SKUs. `headroom_cents` (room, \u22650) = \u03a3(cheapest competitor - own)\nover SKUs where I am strictly cheapest. The FE shows whichever is non-zero.",
        "properties": {
          "category_slug": {
            "title": "Category Slug",
            "type": "string"
          },
          "cheapest_n": {
            "title": "Cheapest N",
            "type": "integer"
          },
          "display_name": {
            "title": "Display Name",
            "type": "string"
          },
          "headroom_cents": {
            "title": "Headroom Cents",
            "type": "integer"
          },
          "margin_at_stake_cents": {
            "title": "Margin At Stake Cents",
            "type": "integer"
          },
          "net_down_n": {
            "title": "Net Down N",
            "type": "integer"
          },
          "net_up_n": {
            "title": "Net Up N",
            "type": "integer"
          },
          "position_denom_n": {
            "title": "Position Denom N",
            "type": "integer"
          },
          "skus_n": {
            "title": "Skus N",
            "type": "integer"
          },
          "spark_cents": {
            "items": {
              "type": "integer"
            },
            "title": "Spark Cents",
            "type": "array"
          },
          "tied_n": {
            "title": "Tied N",
            "type": "integer"
          },
          "undercut_n": {
            "title": "Undercut N",
            "type": "integer"
          }
        },
        "required": [
          "category_slug",
          "display_name",
          "skus_n",
          "spark_cents",
          "net_up_n",
          "net_down_n",
          "cheapest_n",
          "tied_n",
          "undercut_n",
          "position_denom_n",
          "margin_at_stake_cents",
          "headroom_cents"
        ],
        "title": "CategoryRollupRow",
        "type": "object"
      },
      "CsvColumnMapping": {
        "properties": {
          "confidence": {
            "title": "Confidence",
            "type": "number"
          },
          "csv_column": {
            "title": "Csv Column",
            "type": "string"
          },
          "reason": {
            "title": "Reason",
            "type": "string"
          },
          "schema_field": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Schema Field"
          }
        },
        "required": [
          "csv_column",
          "schema_field",
          "confidence",
          "reason"
        ],
        "title": "CsvColumnMapping",
        "type": "object"
      },
      "CsvSampleRow": {
        "properties": {
          "issues": {
            "items": {
              "type": "string"
            },
            "title": "Issues",
            "type": "array"
          },
          "normalized": {
            "additionalProperties": {
              "type": "string"
            },
            "title": "Normalized",
            "type": "object"
          },
          "raw": {
            "additionalProperties": {
              "type": "string"
            },
            "title": "Raw",
            "type": "object"
          },
          "row_number": {
            "title": "Row Number",
            "type": "integer"
          }
        },
        "required": [
          "row_number",
          "raw",
          "normalized",
          "issues"
        ],
        "title": "CsvSampleRow",
        "type": "object"
      },
      "DecisionRequest": {
        "properties": {
          "decision": {
            "enum": [
              "approved",
              "rejected"
            ],
            "title": "Decision",
            "type": "string"
          },
          "ids": {
            "items": {
              "format": "uuid",
              "type": "string"
            },
            "minItems": 1,
            "title": "Ids",
            "type": "array"
          }
        },
        "required": [
          "ids",
          "decision"
        ],
        "title": "DecisionRequest",
        "type": "object"
      },
      "DecisionResponse": {
        "properties": {
          "changed": {
            "title": "Changed",
            "type": "integer"
          }
        },
        "required": [
          "changed"
        ],
        "title": "DecisionResponse",
        "type": "object"
      },
      "GenerateAlertsResponse": {
        "properties": {
          "by_type": {
            "additionalProperties": {
              "type": "integer"
            },
            "title": "By Type",
            "type": "object"
          },
          "by_type_updated": {
            "additionalProperties": {
              "type": "integer"
            },
            "title": "By Type Updated",
            "type": "object"
          },
          "new_alerts": {
            "title": "New Alerts",
            "type": "integer"
          },
          "re_emitted_skipped": {
            "default": 0,
            "title": "Re Emitted Skipped",
            "type": "integer"
          },
          "scanned_listings": {
            "title": "Scanned Listings",
            "type": "integer"
          },
          "updated_alerts": {
            "default": 0,
            "title": "Updated Alerts",
            "type": "integer"
          }
        },
        "required": [
          "scanned_listings",
          "new_alerts",
          "by_type"
        ],
        "title": "GenerateAlertsResponse",
        "type": "object"
      },
      "GenerateRequest": {
        "properties": {
          "country": {
            "maxLength": 2,
            "minLength": 2,
            "title": "Country",
            "type": "string"
          }
        },
        "required": [
          "country"
        ],
        "title": "GenerateRequest",
        "type": "object"
      },
      "GenerateResponse": {
        "properties": {
          "blocked": {
            "title": "Blocked",
            "type": "integer"
          },
          "health_events": {
            "title": "Health Events",
            "type": "integer"
          },
          "skipped": {
            "title": "Skipped",
            "type": "integer"
          },
          "suggestions": {
            "title": "Suggestions",
            "type": "integer"
          },
          "unchanged": {
            "default": 0,
            "title": "Unchanged",
            "type": "integer"
          }
        },
        "required": [
          "suggestions",
          "blocked",
          "skipped",
          "health_events"
        ],
        "title": "GenerateResponse",
        "type": "object"
      },
      "HTTPValidationError": {
        "properties": {
          "detail": {
            "items": {
              "$ref": "#/components/schemas/ValidationError"
            },
            "title": "Detail",
            "type": "array"
          }
        },
        "title": "HTTPValidationError",
        "type": "object"
      },
      "HealthEventOut": {
        "properties": {
          "at": {
            "title": "At"
          },
          "detail": {
            "title": "Detail",
            "type": "object"
          },
          "id": {
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "kind": {
            "title": "Kind",
            "type": "string"
          },
          "sku_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Sku Id"
          },
          "source": {
            "title": "Source",
            "type": "string"
          }
        },
        "required": [
          "id",
          "source",
          "kind",
          "detail",
          "sku_id",
          "at"
        ],
        "title": "HealthEventOut",
        "type": "object"
      },
      "IgnoreRequest": {
        "properties": {
          "days": {
            "maximum": 30.0,
            "minimum": 1.0,
            "title": "Days",
            "type": "integer"
          }
        },
        "required": [
          "days"
        ],
        "title": "IgnoreRequest",
        "type": "object"
      },
      "ImportIssueReportResponse": {
        "properties": {
          "issue_count": {
            "title": "Issue Count",
            "type": "integer"
          },
          "sent_to": {
            "title": "Sent To",
            "type": "string"
          },
          "total_rows": {
            "title": "Total Rows",
            "type": "integer"
          }
        },
        "required": [
          "sent_to",
          "issue_count",
          "total_rows"
        ],
        "title": "ImportIssueReportResponse",
        "type": "object"
      },
      "InvalidValueRow": {
        "description": "A row whose value cannot be used, shown as it appears in the file.",
        "properties": {
          "row_number": {
            "title": "Row Number",
            "type": "integer"
          },
          "value": {
            "title": "Value",
            "type": "string"
          }
        },
        "required": [
          "row_number",
          "value"
        ],
        "title": "InvalidValueRow",
        "type": "object"
      },
      "ItemResult": {
        "description": "Uitkomst van \u00e9\u00e9n product, op dezelfde plek in de lijst als je het stuurde.\n\n`warnings` zijn dingen die WEL zijn doorgevoerd maar waar je naar wilt\nkijken: een EAN die ook op een ander product staat, een artikelcode die al\nbestond. Ze maken de status niet `failed` -- de klant is de baas over zijn\ncatalogus, wij melden alleen wat opvalt.",
        "properties": {
          "detail": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Detail"
          },
          "id": {
            "title": "Id",
            "type": "string"
          },
          "index": {
            "title": "Index",
            "type": "integer"
          },
          "status": {
            "enum": [
              "created",
              "updated",
              "failed",
              "skipped"
            ],
            "title": "Status",
            "type": "string"
          },
          "warnings": {
            "items": {
              "type": "string"
            },
            "title": "Warnings",
            "type": "array"
          }
        },
        "required": [
          "index",
          "id",
          "status"
        ],
        "title": "ItemResult",
        "type": "object"
      },
      "ManualMappingRequest": {
        "description": "Operator-pasted URL fallback when auto-mapping failed.\n\n`skip_ean_validation` lets operator force-map a URL whose PDP-EAN\ndoesn't match the SKU's EAN \u2014 useful for retailer-internal-SKU\ndiscrepancies. Audit-trail records the override.",
        "properties": {
          "listing_url": {
            "maxLength": 2048,
            "minLength": 4,
            "title": "Listing Url",
            "type": "string"
          },
          "monitored_retailer_id": {
            "format": "uuid",
            "title": "Monitored Retailer Id",
            "type": "string"
          },
          "skip_ean_validation": {
            "default": false,
            "title": "Skip Ean Validation",
            "type": "boolean"
          },
          "sku_id": {
            "format": "uuid",
            "title": "Sku Id",
            "type": "string"
          }
        },
        "required": [
          "sku_id",
          "monitored_retailer_id",
          "listing_url"
        ],
        "title": "ManualMappingRequest",
        "type": "object"
      },
      "MappingListResponse": {
        "properties": {
          "items": {
            "items": {
              "$ref": "#/components/schemas/MappingResponse"
            },
            "title": "Items",
            "type": "array"
          },
          "total": {
            "title": "Total",
            "type": "integer"
          }
        },
        "required": [
          "items",
          "total"
        ],
        "title": "MappingListResponse",
        "type": "object"
      },
      "MappingResponse": {
        "description": "One sku_url_mappings row (post-Phase-3 rebuild).\n\n`sku` + `retailer` are JOINed in by the repository so the Koppelingen-tab\ncan render product/brand/ean/retailer columns without a second fetch\n(contract.md gap A3). `last_observed_at` is the latest price_observation\ntimestamp for this URL (gap A7). All three are None for the single-row\nendpoints that don't JOIN.",
        "properties": {
          "bucket": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Bucket"
          },
          "confidence": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Confidence"
          },
          "created_at": {
            "format": "date-time",
            "title": "Created At",
            "type": "string"
          },
          "dismissed_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Dismissed At"
          },
          "flags": {
            "items": {
              "type": "string"
            },
            "title": "Flags",
            "type": "array"
          },
          "id": {
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "last_observed_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Last Observed At"
          },
          "listing_url": {
            "title": "Listing Url",
            "type": "string"
          },
          "monitored_retailer_id": {
            "format": "uuid",
            "title": "Monitored Retailer Id",
            "type": "string"
          },
          "normalized_url": {
            "title": "Normalized Url",
            "type": "string"
          },
          "retailer": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/MappingRetailerSummary"
              },
              {
                "type": "null"
              }
            ]
          },
          "sku": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/MappingSkuSummary"
              },
              {
                "type": "null"
              }
            ]
          },
          "sku_id": {
            "format": "uuid",
            "title": "Sku Id",
            "type": "string"
          },
          "state": {
            "title": "State",
            "type": "string"
          },
          "updated_at": {
            "format": "date-time",
            "title": "Updated At",
            "type": "string"
          }
        },
        "required": [
          "id",
          "sku_id",
          "monitored_retailer_id",
          "listing_url",
          "normalized_url",
          "state",
          "confidence",
          "bucket",
          "flags",
          "dismissed_at",
          "created_at",
          "updated_at"
        ],
        "title": "MappingResponse",
        "type": "object"
      },
      "MappingRetailerSummary": {
        "properties": {
          "country": {
            "title": "Country",
            "type": "string"
          },
          "display_name": {
            "title": "Display Name",
            "type": "string"
          },
          "id": {
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "slug": {
            "title": "Slug",
            "type": "string"
          }
        },
        "required": [
          "id",
          "slug",
          "display_name",
          "country"
        ],
        "title": "MappingRetailerSummary",
        "type": "object"
      },
      "MappingSkuSummary": {
        "properties": {
          "brand": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Brand"
          },
          "category": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Category"
          },
          "ean": {
            "title": "Ean",
            "type": "string"
          },
          "id": {
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "name": {
            "title": "Name",
            "type": "string"
          },
          "sku": {
            "title": "Sku",
            "type": "string"
          }
        },
        "required": [
          "id",
          "sku",
          "name",
          "brand",
          "ean"
        ],
        "title": "MappingSkuSummary",
        "type": "object"
      },
      "MappingStateUpdate": {
        "description": "Operator-driven state transition (ADR-0025 SKU-mapping FSM).\n\nPermitted operator actions:\n  - any \u2192 dismissed (operator marks \"not on this retailer\")\n  - dismissed \u2192 matched (operator un-dismisses)",
        "properties": {
          "state": {
            "pattern": "^(matched|dismissed)$",
            "title": "State",
            "type": "string"
          }
        },
        "required": [
          "state"
        ],
        "title": "MappingStateUpdate",
        "type": "object"
      },
      "MappingUrlUpdate": {
        "description": "Edit an existing mapping's URL in-place (Koppelingen \"URL bewerken\").\n\nRe-validates the EAN against the new PDP unless skip_ean_validation=True.",
        "properties": {
          "listing_url": {
            "maxLength": 2048,
            "minLength": 4,
            "title": "Listing Url",
            "type": "string"
          },
          "skip_ean_validation": {
            "default": false,
            "title": "Skip Ean Validation",
            "type": "boolean"
          }
        },
        "required": [
          "listing_url"
        ],
        "title": "MappingUrlUpdate",
        "type": "object"
      },
      "PriceLeader": {
        "properties": {
          "current_leader_name": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Current Leader Name"
          },
          "current_leader_slug": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Current Leader Slug"
          },
          "segments": {
            "items": {
              "$ref": "#/components/schemas/LeaderSegment"
            },
            "title": "Segments",
            "type": "array"
          },
          "weeks_total": {
            "default": 0,
            "title": "Weeks Total",
            "type": "integer"
          },
          "weeks_you_led": {
            "default": 0,
            "title": "Weeks You Led",
            "type": "integer"
          }
        },
        "required": [
          "segments"
        ],
        "title": "PriceLeader",
        "type": "object"
      },
      "PriceSetupUpdate": {
        "description": "Set price-setup fields for one SKU/country (Catalog price-setup drawer).\nFloor/ceiling (min/max) are always editable; cost/msrp are rejected while a\nwebshop is master. At least one field must be present.",
        "properties": {
          "cost_cents": {
            "anyOf": [
              {
                "minimum": 0.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Cost Cents"
          },
          "country": {
            "default": "NL",
            "maxLength": 2,
            "minLength": 2,
            "title": "Country",
            "type": "string"
          },
          "max_price_cents": {
            "anyOf": [
              {
                "minimum": 0.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Max Price Cents"
          },
          "min_price_cents": {
            "anyOf": [
              {
                "minimum": 0.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Min Price Cents"
          },
          "msrp_cents": {
            "anyOf": [
              {
                "minimum": 0.0,
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Msrp Cents"
          }
        },
        "title": "PriceSetupUpdate",
        "type": "object"
      },
      "PricingPolicyIn": {
        "additionalProperties": false,
        "properties": {
          "min_change_cents": {
            "default": 50,
            "maximum": 100000.0,
            "minimum": 0.0,
            "title": "Min Change Cents",
            "type": "integer"
          },
          "min_change_pct": {
            "default": 0.5,
            "maximum": 100.0,
            "minimum": 0.0,
            "title": "Min Change Pct",
            "type": "number"
          },
          "outlier_floor_pct": {
            "default": 50.0,
            "description": "Ignore a competitor price below this share of the median. 0 turns the gate off. Needs at least three observations to apply.",
            "maximum": 100.0,
            "minimum": 0.0,
            "title": "Outlier Floor Pct",
            "type": "number"
          },
          "price_ending": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Round every price to this ending (0, 50, 95, 99). Null = do not round.",
            "title": "Price Ending"
          }
        },
        "title": "PricingPolicyIn",
        "type": "object"
      },
      "PricingPolicyOut": {
        "description": "The three rules that apply to every suggestion, whatever rule made it.",
        "properties": {
          "min_change_cents": {
            "default": 50,
            "maximum": 100000.0,
            "minimum": 0.0,
            "title": "Min Change Cents",
            "type": "integer"
          },
          "min_change_pct": {
            "default": 0.5,
            "maximum": 100.0,
            "minimum": 0.0,
            "title": "Min Change Pct",
            "type": "number"
          },
          "outlier_floor_pct": {
            "default": 50.0,
            "description": "Ignore a competitor price below this share of the median. 0 turns the gate off. Needs at least three observations to apply.",
            "maximum": 100.0,
            "minimum": 0.0,
            "title": "Outlier Floor Pct",
            "type": "number"
          },
          "price_ending": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Round every price to this ending (0, 50, 95, 99). Null = do not round.",
            "title": "Price Ending"
          }
        },
        "title": "PricingPolicyOut",
        "type": "object"
      },
      "PushLogOut": {
        "properties": {
          "actor": {
            "title": "Actor",
            "type": "string"
          },
          "external_id": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "External Id"
          },
          "id": {
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "new_price_cents": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "New Price Cents"
          },
          "old_price_cents": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Old Price Cents"
          },
          "platform": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Platform"
          },
          "pushed_at": {
            "title": "Pushed At"
          },
          "result": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Result"
          },
          "sku_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Sku Id"
          },
          "verified_price_cents": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Verified Price Cents"
          }
        },
        "required": [
          "id",
          "sku_id",
          "external_id",
          "platform",
          "old_price_cents",
          "new_price_cents",
          "verified_price_cents",
          "actor",
          "result",
          "pushed_at"
        ],
        "title": "PushLogOut",
        "type": "object"
      },
      "PushRequest": {
        "properties": {
          "country": {
            "maxLength": 2,
            "minLength": 2,
            "title": "Country",
            "type": "string"
          },
          "credential_id": {
            "format": "uuid",
            "title": "Credential Id",
            "type": "string"
          }
        },
        "required": [
          "credential_id",
          "country"
        ],
        "title": "PushRequest",
        "type": "object"
      },
      "ReadinessOut": {
        "description": "One-call diagnostic for the Repricing readiness bar + status strip.",
        "properties": {
          "approved": {
            "title": "Approved",
            "type": "integer"
          },
          "blocked": {
            "title": "Blocked",
            "type": "integer"
          },
          "failed": {
            "title": "Failed",
            "type": "integer"
          },
          "generated_at": {
            "title": "Generated At"
          },
          "monitored_skus": {
            "title": "Monitored Skus",
            "type": "integer"
          },
          "pending": {
            "title": "Pending",
            "type": "integer"
          },
          "pushed": {
            "title": "Pushed",
            "type": "integer"
          },
          "rules_enabled": {
            "title": "Rules Enabled",
            "type": "integer"
          },
          "rules_total": {
            "title": "Rules Total",
            "type": "integer"
          },
          "skus_with_floor": {
            "title": "Skus With Floor",
            "type": "integer"
          },
          "skus_without_floor": {
            "title": "Skus Without Floor",
            "type": "integer"
          }
        },
        "required": [
          "rules_total",
          "rules_enabled",
          "monitored_skus",
          "skus_with_floor",
          "skus_without_floor",
          "pending",
          "approved",
          "blocked",
          "pushed",
          "failed"
        ],
        "title": "ReadinessOut",
        "type": "object"
      },
      "ReferencePrice": {
        "properties": {
          "country": {
            "title": "Country",
            "type": "string"
          },
          "msrp_cents": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Msrp Cents"
          },
          "sell_price_cents": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Sell Price Cents"
          }
        },
        "required": [
          "country",
          "sell_price_cents",
          "msrp_cents"
        ],
        "title": "ReferencePrice",
        "type": "object"
      },
      "RepeatedValueRow": {
        "description": "A value that appears on more than one row of the uploaded file.",
        "properties": {
          "row_numbers": {
            "items": {
              "type": "integer"
            },
            "title": "Row Numbers",
            "type": "array"
          },
          "value": {
            "title": "Value",
            "type": "string"
          }
        },
        "required": [
          "value",
          "row_numbers"
        ],
        "title": "RepeatedValueRow",
        "type": "object"
      },
      "ReportDetail": {
        "description": "De volledige momentopname; de app rendert hier rechtstreeks uit.",
        "properties": {
          "headline_index": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "description": "Prijsindex over de periode, voor de lijstweergave",
            "title": "Headline Index"
          },
          "id": {
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "kind": {
            "description": "weekly of monthly",
            "title": "Kind",
            "type": "string"
          },
          "payload": {
            "title": "Payload",
            "type": "object"
          },
          "period_end": {
            "format": "date",
            "title": "Period End",
            "type": "string"
          },
          "period_start": {
            "format": "date",
            "title": "Period Start",
            "type": "string"
          },
          "recipient_count": {
            "title": "Recipient Count",
            "type": "integer"
          },
          "sent_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Sent At"
          }
        },
        "required": [
          "id",
          "kind",
          "period_start",
          "period_end",
          "sent_at",
          "recipient_count",
          "payload"
        ],
        "title": "ReportDetail",
        "type": "object"
      },
      "ReportSummary": {
        "description": "E\u00e9n regel in de lijst \u2014 genoeg om te kiezen, niet meer.",
        "properties": {
          "headline_index": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "description": "Prijsindex over de periode, voor de lijstweergave",
            "title": "Headline Index"
          },
          "id": {
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "kind": {
            "description": "weekly of monthly",
            "title": "Kind",
            "type": "string"
          },
          "period_end": {
            "format": "date",
            "title": "Period End",
            "type": "string"
          },
          "period_start": {
            "format": "date",
            "title": "Period Start",
            "type": "string"
          },
          "recipient_count": {
            "title": "Recipient Count",
            "type": "integer"
          },
          "sent_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Sent At"
          }
        },
        "required": [
          "id",
          "kind",
          "period_start",
          "period_end",
          "sent_at",
          "recipient_count"
        ],
        "title": "ReportSummary",
        "type": "object"
      },
      "ResolveReviewRequest": {
        "description": "Operator action on a review-queue item.\n\n`action` \u2208 {accept_url, abandon}:\n  - accept_url: provide listing_url to map (validates EAN unless skip)\n  - abandon: mark this SKU as 'not on this retailer' permanently",
        "properties": {
          "action": {
            "pattern": "^(accept_url|abandon)$",
            "title": "Action",
            "type": "string"
          },
          "listing_url": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Listing Url"
          },
          "skip_ean_validation": {
            "default": false,
            "title": "Skip Ean Validation",
            "type": "boolean"
          }
        },
        "required": [
          "action"
        ],
        "title": "ResolveReviewRequest",
        "type": "object"
      },
      "RetailerSeries": {
        "properties": {
          "is_self": {
            "default": false,
            "title": "Is Self",
            "type": "boolean"
          },
          "monitored_retailer_id": {
            "format": "uuid",
            "title": "Monitored Retailer Id",
            "type": "string"
          },
          "points": {
            "items": {
              "$ref": "#/components/schemas/PricePoint"
            },
            "title": "Points",
            "type": "array"
          },
          "retailer_display_name": {
            "title": "Retailer Display Name",
            "type": "string"
          },
          "retailer_slug": {
            "title": "Retailer Slug",
            "type": "string"
          }
        },
        "required": [
          "monitored_retailer_id",
          "retailer_display_name",
          "retailer_slug",
          "points"
        ],
        "title": "RetailerSeries",
        "type": "object"
      },
      "RetryRequest": {
        "properties": {
          "ids": {
            "items": {
              "format": "uuid",
              "type": "string"
            },
            "minItems": 1,
            "title": "Ids",
            "type": "array"
          }
        },
        "required": [
          "ids"
        ],
        "title": "RetryRequest",
        "type": "object"
      },
      "ReviewItem": {
        "description": "One mapping_jobs row in 'needs_review' state.\n\n`sku` and `retailer` are JOINed in by the repository so the UI can\nshow human-readable labels (name + EAN + display_name) without\nhaving to fan out to /api/v1/skus/{id} per row.",
        "properties": {
          "candidates_examined": {
            "title": "Candidates Examined",
            "type": "integer"
          },
          "completed_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Completed At"
          },
          "created_at": {
            "format": "date-time",
            "title": "Created At",
            "type": "string"
          },
          "details": {
            "anyOf": [
              {
                "type": "object"
              },
              {
                "type": "null"
              }
            ],
            "title": "Details"
          },
          "error": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Error"
          },
          "id": {
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "monitored_retailer_id": {
            "format": "uuid",
            "title": "Monitored Retailer Id",
            "type": "string"
          },
          "retailer": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/ReviewRetailerSummary"
              },
              {
                "type": "null"
              }
            ]
          },
          "sku": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/ReviewSkuSummary"
              },
              {
                "type": "null"
              }
            ]
          },
          "sku_id": {
            "format": "uuid",
            "title": "Sku Id",
            "type": "string"
          },
          "started_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Started At"
          },
          "state": {
            "title": "State",
            "type": "string"
          }
        },
        "required": [
          "id",
          "sku_id",
          "monitored_retailer_id",
          "state",
          "candidates_examined",
          "details",
          "error",
          "started_at",
          "completed_at",
          "created_at"
        ],
        "title": "ReviewItem",
        "type": "object"
      },
      "ReviewQueueResponse": {
        "properties": {
          "items": {
            "items": {
              "$ref": "#/components/schemas/ReviewItem"
            },
            "title": "Items",
            "type": "array"
          },
          "total": {
            "title": "Total",
            "type": "integer"
          }
        },
        "required": [
          "items",
          "total"
        ],
        "title": "ReviewQueueResponse",
        "type": "object"
      },
      "ReviewRetailerSummary": {
        "properties": {
          "country": {
            "title": "Country",
            "type": "string"
          },
          "display_name": {
            "title": "Display Name",
            "type": "string"
          },
          "id": {
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "slug": {
            "title": "Slug",
            "type": "string"
          }
        },
        "required": [
          "id",
          "slug",
          "display_name",
          "country"
        ],
        "title": "ReviewRetailerSummary",
        "type": "object"
      },
      "ReviewSkuSummary": {
        "properties": {
          "brand": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Brand"
          },
          "category": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Category"
          },
          "ean": {
            "title": "Ean",
            "type": "string"
          },
          "id": {
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "name": {
            "title": "Name",
            "type": "string"
          },
          "sku": {
            "title": "Sku",
            "type": "string"
          }
        },
        "required": [
          "id",
          "sku",
          "name",
          "ean",
          "brand",
          "category"
        ],
        "title": "ReviewSkuSummary",
        "type": "object"
      },
      "RuleCreate": {
        "properties": {
          "enabled": {
            "default": true,
            "title": "Enabled",
            "type": "boolean"
          },
          "name": {
            "maxLength": 200,
            "minLength": 1,
            "title": "Name",
            "type": "string"
          },
          "params": {
            "title": "Params",
            "type": "object"
          },
          "priority": {
            "default": 100,
            "title": "Priority",
            "type": "integer"
          },
          "rule_type": {
            "title": "Rule Type",
            "type": "string"
          },
          "scope": {
            "title": "Scope",
            "type": "object"
          }
        },
        "required": [
          "name",
          "rule_type"
        ],
        "title": "RuleCreate",
        "type": "object"
      },
      "RuleOut": {
        "properties": {
          "auto_push": {
            "title": "Auto Push",
            "type": "boolean"
          },
          "enabled": {
            "title": "Enabled",
            "type": "boolean"
          },
          "id": {
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "name": {
            "title": "Name",
            "type": "string"
          },
          "params": {
            "title": "Params",
            "type": "object"
          },
          "priority": {
            "title": "Priority",
            "type": "integer"
          },
          "rule_type": {
            "title": "Rule Type",
            "type": "string"
          },
          "scope": {
            "title": "Scope",
            "type": "object"
          }
        },
        "required": [
          "id",
          "name",
          "rule_type",
          "params",
          "scope",
          "priority",
          "enabled",
          "auto_push"
        ],
        "title": "RuleOut",
        "type": "object"
      },
      "RulePreviewRequest": {
        "additionalProperties": false,
        "properties": {
          "country": {
            "default": "NL",
            "maxLength": 2,
            "minLength": 2,
            "title": "Country",
            "type": "string"
          },
          "params": {
            "title": "Params",
            "type": "object"
          },
          "rule_type": {
            "title": "Rule Type",
            "type": "string"
          },
          "scope": {
            "title": "Scope",
            "type": "object"
          }
        },
        "required": [
          "rule_type"
        ],
        "title": "RulePreviewRequest",
        "type": "object"
      },
      "RulePreviewResponse": {
        "properties": {
          "blocked": {
            "title": "Blocked",
            "type": "integer"
          },
          "down": {
            "title": "Down",
            "type": "integer"
          },
          "in_scope": {
            "title": "In Scope",
            "type": "integer"
          },
          "net_move_cents": {
            "title": "Net Move Cents",
            "type": "integer"
          },
          "no_signal": {
            "title": "No Signal",
            "type": "integer"
          },
          "unchanged": {
            "title": "Unchanged",
            "type": "integer"
          },
          "up": {
            "title": "Up",
            "type": "integer"
          },
          "would_change": {
            "title": "Would Change",
            "type": "integer"
          }
        },
        "required": [
          "in_scope",
          "would_change",
          "down",
          "up",
          "blocked",
          "unchanged",
          "no_signal",
          "net_move_cents"
        ],
        "title": "RulePreviewResponse",
        "type": "object"
      },
      "RuleUpdate": {
        "description": "Partial edit of a pricing rule. `rule_type`/`auto_push` are NOT editable \u2014\nauto-push stays a go-live item behind the repricing flag + MFA.",
        "properties": {
          "enabled": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Enabled"
          },
          "name": {
            "anyOf": [
              {
                "maxLength": 200,
                "minLength": 1,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Name"
          },
          "params": {
            "anyOf": [
              {
                "type": "object"
              },
              {
                "type": "null"
              }
            ],
            "title": "Params"
          },
          "priority": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Priority"
          },
          "scope": {
            "anyOf": [
              {
                "type": "object"
              },
              {
                "type": "null"
              }
            ],
            "title": "Scope"
          }
        },
        "title": "RuleUpdate",
        "type": "object"
      },
      "SkuBulkUpdate": {
        "description": "Update many SKUs in one request. At least one of `category_id` or\n`status` must be present.\n\n- `category_id` absent  \u2192 don't touch category\n- `category_id=null`    \u2192 move to Ongecategoriseerd\n- `category_id=<uuid>`  \u2192 set category (tenant-validated)\n- `status` absent       \u2192 don't touch status\n- `status=<value>`      \u2192 bulk archive / activate / soft-delete\n\nCombining both in one call is allowed (move + archive in one go).",
        "properties": {
          "category_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "null = Ongecategoriseerd. Field absent = leave unchanged.",
            "title": "Category Id"
          },
          "ids": {
            "items": {
              "format": "uuid",
              "type": "string"
            },
            "maxItems": 1000,
            "minItems": 1,
            "title": "Ids",
            "type": "array"
          },
          "status": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/SkuStatus"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": [
          "ids"
        ],
        "title": "SkuBulkUpdate",
        "type": "object"
      },
      "SkuBulkUpdateResponse": {
        "properties": {
          "updated_count": {
            "title": "Updated Count",
            "type": "integer"
          }
        },
        "required": [
          "updated_count"
        ],
        "title": "SkuBulkUpdateResponse",
        "type": "object"
      },
      "SkuCreate": {
        "properties": {
          "attributes": {
            "anyOf": [
              {
                "type": "object"
              },
              {
                "type": "null"
              }
            ],
            "title": "Attributes"
          },
          "brand": {
            "anyOf": [
              {
                "maxLength": 128,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Brand"
          },
          "category": {
            "maxLength": 128,
            "minLength": 1,
            "title": "Category",
            "type": "string"
          },
          "ean": {
            "pattern": "^\\d{8}$|^\\d{12}$|^\\d{13}$|^\\d{14}$",
            "title": "Ean",
            "type": "string"
          },
          "mpn": {
            "anyOf": [
              {
                "maxLength": 64,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Mpn"
          },
          "name": {
            "maxLength": 255,
            "minLength": 1,
            "title": "Name",
            "type": "string"
          },
          "sku": {
            "maxLength": 64,
            "minLength": 1,
            "title": "Sku",
            "type": "string"
          }
        },
        "required": [
          "sku",
          "ean",
          "name",
          "category"
        ],
        "title": "SkuCreate",
        "type": "object"
      },
      "SkuCsvImportResponse": {
        "properties": {
          "bulk_run_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Bulk Run Id"
          },
          "created_count": {
            "title": "Created Count",
            "type": "integer"
          },
          "failed_count": {
            "title": "Failed Count",
            "type": "integer"
          },
          "failures": {
            "items": {
              "type": "object"
            },
            "title": "Failures",
            "type": "array"
          },
          "updated_count": {
            "title": "Updated Count",
            "type": "integer"
          }
        },
        "required": [
          "created_count",
          "updated_count",
          "failed_count",
          "failures"
        ],
        "title": "SkuCsvImportResponse",
        "type": "object"
      },
      "SkuImportConfirmRequest": {
        "properties": {
          "mappings": {
            "items": {
              "$ref": "#/components/schemas/CsvColumnMapping"
            },
            "title": "Mappings",
            "type": "array"
          },
          "upload_token": {
            "title": "Upload Token",
            "type": "string"
          }
        },
        "required": [
          "upload_token",
          "mappings"
        ],
        "title": "SkuImportConfirmRequest",
        "type": "object"
      },
      "SkuImportPreviewResponse": {
        "properties": {
          "ai_used": {
            "title": "Ai Used",
            "type": "boolean"
          },
          "duplicate_ean_examples": {
            "items": {
              "$ref": "#/components/schemas/RepeatedValueRow"
            },
            "title": "Duplicate Ean Examples",
            "type": "array"
          },
          "duplicate_ean_rows": {
            "default": 0,
            "title": "Duplicate Ean Rows",
            "type": "integer"
          },
          "duplicate_ean_values": {
            "default": 0,
            "title": "Duplicate Ean Values",
            "type": "integer"
          },
          "duplicate_sku_examples": {
            "items": {
              "$ref": "#/components/schemas/RepeatedValueRow"
            },
            "title": "Duplicate Sku Examples",
            "type": "array"
          },
          "duplicate_sku_rows": {
            "default": 0,
            "title": "Duplicate Sku Rows",
            "type": "integer"
          },
          "duplicate_sku_values": {
            "default": 0,
            "title": "Duplicate Sku Values",
            "type": "integer"
          },
          "invalid_ean_examples": {
            "items": {
              "$ref": "#/components/schemas/InvalidValueRow"
            },
            "title": "Invalid Ean Examples",
            "type": "array"
          },
          "invalid_ean_rows": {
            "default": 0,
            "title": "Invalid Ean Rows",
            "type": "integer"
          },
          "mappings": {
            "items": {
              "$ref": "#/components/schemas/CsvColumnMapping"
            },
            "title": "Mappings",
            "type": "array"
          },
          "missing_required_fields": {
            "items": {
              "type": "string"
            },
            "title": "Missing Required Fields",
            "type": "array"
          },
          "samples": {
            "items": {
              "$ref": "#/components/schemas/CsvSampleRow"
            },
            "title": "Samples",
            "type": "array"
          },
          "total_rows": {
            "title": "Total Rows",
            "type": "integer"
          },
          "upload_token": {
            "title": "Upload Token",
            "type": "string"
          }
        },
        "required": [
          "upload_token",
          "mappings",
          "samples",
          "total_rows",
          "missing_required_fields",
          "ai_used"
        ],
        "title": "SkuImportPreviewResponse",
        "type": "object"
      },
      "SkuLinkedListing": {
        "description": "STUB during v2-rebuild \u2014 replaced by SkuRetailerUrlMapping in Fase 6.\n\nThe \"Linked listings\" drawer-section will read sku_retailer_url JOIN\nlatest price_observation via observation.service. Schema kept so the\nresponse_model annotation in skus/router.py compiles; rows always\nempty until Fase 6.",
        "properties": {
          "availability": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Availability"
          },
          "currency": {
            "title": "Currency",
            "type": "string"
          },
          "listing_id": {
            "format": "uuid",
            "title": "Listing Id",
            "type": "string"
          },
          "listing_url": {
            "title": "Listing Url",
            "type": "string"
          },
          "monitored_retailer_id": {
            "format": "uuid",
            "title": "Monitored Retailer Id",
            "type": "string"
          },
          "price_cents": {
            "title": "Price Cents",
            "type": "integer"
          },
          "retailer_display_name": {
            "title": "Retailer Display Name",
            "type": "string"
          },
          "retailer_slug": {
            "title": "Retailer Slug",
            "type": "string"
          },
          "scraped_at": {
            "format": "date-time",
            "title": "Scraped At",
            "type": "string"
          },
          "title": {
            "title": "Title",
            "type": "string"
          }
        },
        "required": [
          "listing_id",
          "monitored_retailer_id",
          "retailer_slug",
          "retailer_display_name",
          "listing_url",
          "title",
          "price_cents",
          "currency",
          "availability",
          "scraped_at"
        ],
        "title": "SkuLinkedListing",
        "type": "object"
      },
      "SkuListResponse": {
        "properties": {
          "items": {
            "items": {
              "$ref": "#/components/schemas/SkuResponse"
            },
            "title": "Items",
            "type": "array"
          },
          "total": {
            "title": "Total",
            "type": "integer"
          }
        },
        "required": [
          "items",
          "total"
        ],
        "title": "SkuListResponse",
        "type": "object"
      },
      "SkuMatchAuditEntry": {
        "description": "One match-audit-trail row for the SKU. Encrypted payloads are NOT\ndecrypted here \u2014 the drawer shows the metadata only (decided_by + confidence\n+ timestamp). For full payload inspection, use the audit-log admin view.",
        "properties": {
          "confidence": {
            "title": "Confidence",
            "type": "number"
          },
          "created_at": {
            "format": "date-time",
            "title": "Created At",
            "type": "string"
          },
          "decided_by": {
            "title": "Decided By",
            "type": "string"
          },
          "id": {
            "format": "uuid",
            "title": "Id",
            "type": "string"
          }
        },
        "required": [
          "id",
          "confidence",
          "decided_by",
          "created_at"
        ],
        "title": "SkuMatchAuditEntry",
        "type": "object"
      },
      "SkuPriceCoverage": {
        "description": "How many SKUs carry a reference price \u2014 i.e. can produce an alert.",
        "properties": {
          "missing": {
            "title": "Missing",
            "type": "integer"
          },
          "total": {
            "title": "Total",
            "type": "integer"
          },
          "with_reference_price": {
            "title": "With Reference Price",
            "type": "integer"
          }
        },
        "required": [
          "total",
          "with_reference_price",
          "missing"
        ],
        "title": "SkuPriceCoverage",
        "type": "object"
      },
      "SkuReferencePrice": {
        "description": "One per-country price row: MSRP + sell + cost + the Layer-3 guardrail band\n(min/max). Powers the Catalog price-setup drawer and the SKU-detail drawer.",
        "properties": {
          "cost_cents": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Cost Cents"
          },
          "country": {
            "title": "Country",
            "type": "string"
          },
          "currency": {
            "title": "Currency",
            "type": "string"
          },
          "max_price_cents": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Max Price Cents"
          },
          "min_price_cents": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Min Price Cents"
          },
          "msrp_cents": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Msrp Cents"
          },
          "sell_price_cents": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Sell Price Cents"
          },
          "updated_at": {
            "format": "date-time",
            "title": "Updated At",
            "type": "string"
          }
        },
        "required": [
          "country",
          "currency",
          "msrp_cents",
          "sell_price_cents",
          "updated_at"
        ],
        "title": "SkuReferencePrice",
        "type": "object"
      },
      "SkuResponse": {
        "properties": {
          "attributes": {
            "anyOf": [
              {
                "type": "object"
              },
              {
                "type": "null"
              }
            ],
            "title": "Attributes"
          },
          "brand": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Brand"
          },
          "category": {
            "title": "Category",
            "type": "string"
          },
          "created_at": {
            "format": "date-time",
            "title": "Created At",
            "type": "string"
          },
          "ean": {
            "title": "Ean",
            "type": "string"
          },
          "id": {
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "mpn": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Mpn"
          },
          "name": {
            "title": "Name",
            "type": "string"
          },
          "own_price_cents": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Own Price Cents"
          },
          "pinned": {
            "default": false,
            "title": "Pinned",
            "type": "boolean"
          },
          "sku": {
            "title": "Sku",
            "type": "string"
          },
          "source": {
            "default": "manual",
            "title": "Source",
            "type": "string"
          },
          "status": {
            "$ref": "#/components/schemas/SkuStatus"
          },
          "sync_status": {
            "default": "active",
            "title": "Sync Status",
            "type": "string"
          },
          "updated_at": {
            "format": "date-time",
            "title": "Updated At",
            "type": "string"
          }
        },
        "required": [
          "id",
          "sku",
          "ean",
          "name",
          "category",
          "brand",
          "mpn",
          "status",
          "attributes",
          "created_at",
          "updated_at"
        ],
        "title": "SkuResponse",
        "type": "object"
      },
      "SkuSearchHit": {
        "description": "Lightweight payload for autocomplete / picker UIs.\n\nTrimmed to the fields needed for a typeahead row: identity + display label.\nUse GET /skus/{id} when the consumer needs the full record.",
        "properties": {
          "brand": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Brand"
          },
          "ean": {
            "title": "Ean",
            "type": "string"
          },
          "id": {
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "name": {
            "title": "Name",
            "type": "string"
          },
          "sku": {
            "title": "Sku",
            "type": "string"
          }
        },
        "required": [
          "id",
          "sku",
          "ean",
          "name",
          "brand"
        ],
        "title": "SkuSearchHit",
        "type": "object"
      },
      "SkuStatus": {
        "enum": [
          "active",
          "archived",
          "deleted"
        ],
        "title": "SkuStatus",
        "type": "string"
      },
      "SkuTrendResponse": {
        "properties": {
          "reference_prices": {
            "items": {
              "$ref": "#/components/schemas/ReferencePrice"
            },
            "title": "Reference Prices",
            "type": "array"
          },
          "series": {
            "items": {
              "$ref": "#/components/schemas/RetailerSeries"
            },
            "title": "Series",
            "type": "array"
          },
          "sku_code": {
            "title": "Sku Code",
            "type": "string"
          },
          "sku_id": {
            "format": "uuid",
            "title": "Sku Id",
            "type": "string"
          },
          "sku_name": {
            "title": "Sku Name",
            "type": "string"
          },
          "window_days": {
            "title": "Window Days",
            "type": "integer"
          }
        },
        "required": [
          "sku_id",
          "sku_code",
          "sku_name",
          "window_days",
          "series",
          "reference_prices"
        ],
        "title": "SkuTrendResponse",
        "type": "object"
      },
      "SkuUpdate": {
        "description": "Patch \u2014 all fields optional. SKU and EAN are immutable once created.",
        "properties": {
          "attributes": {
            "anyOf": [
              {
                "type": "object"
              },
              {
                "type": "null"
              }
            ],
            "title": "Attributes"
          },
          "brand": {
            "anyOf": [
              {
                "maxLength": 128,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Brand"
          },
          "category": {
            "anyOf": [
              {
                "maxLength": 128,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Category"
          },
          "mpn": {
            "anyOf": [
              {
                "maxLength": 64,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Mpn"
          },
          "name": {
            "anyOf": [
              {
                "maxLength": 255,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Name"
          },
          "pinned": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Pinned"
          },
          "status": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/SkuStatus"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "title": "SkuUpdate",
        "type": "object"
      },
      "SnoozeRequest": {
        "properties": {
          "days": {
            "maximum": 30.0,
            "minimum": 1.0,
            "title": "Days",
            "type": "integer"
          }
        },
        "required": [
          "days"
        ],
        "title": "SnoozeRequest",
        "type": "object"
      },
      "StrategyCategory": {
        "properties": {
          "category_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Category Id"
          },
          "monitored": {
            "title": "Monitored",
            "type": "integer"
          },
          "moves_down": {
            "default": 0,
            "title": "Moves Down",
            "type": "integer"
          },
          "moves_up": {
            "default": 0,
            "title": "Moves Up",
            "type": "integer"
          },
          "name": {
            "title": "Name",
            "type": "string"
          },
          "rule": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/RuleOut"
              },
              {
                "type": "null"
              }
            ]
          },
          "slug": {
            "title": "Slug",
            "type": "string"
          },
          "with_cost": {
            "title": "With Cost",
            "type": "integer"
          },
          "with_floor": {
            "title": "With Floor",
            "type": "integer"
          }
        },
        "required": [
          "category_id",
          "slug",
          "name",
          "monitored",
          "with_cost",
          "with_floor",
          "rule"
        ],
        "title": "StrategyCategory",
        "type": "object"
      },
      "StrategyCoverage": {
        "properties": {
          "monitored": {
            "title": "Monitored",
            "type": "integer"
          },
          "moves_down": {
            "default": 0,
            "title": "Moves Down",
            "type": "integer"
          },
          "moves_up": {
            "default": 0,
            "title": "Moves Up",
            "type": "integer"
          },
          "with_cost": {
            "title": "With Cost",
            "type": "integer"
          },
          "with_floor": {
            "title": "With Floor",
            "type": "integer"
          }
        },
        "required": [
          "monitored",
          "with_cost",
          "with_floor"
        ],
        "title": "StrategyCoverage",
        "type": "object"
      },
      "StrategyException": {
        "properties": {
          "moves_down": {
            "default": 0,
            "title": "Moves Down",
            "type": "integer"
          },
          "moves_up": {
            "default": 0,
            "title": "Moves Up",
            "type": "integer"
          },
          "name": {
            "title": "Name",
            "type": "string"
          },
          "rule": {
            "$ref": "#/components/schemas/RuleOut"
          },
          "sku": {
            "title": "Sku",
            "type": "string"
          },
          "sku_id": {
            "format": "uuid",
            "title": "Sku Id",
            "type": "string"
          }
        },
        "required": [
          "sku_id",
          "sku",
          "name",
          "rule"
        ],
        "title": "StrategyException",
        "type": "object"
      },
      "StrategyGroup": {
        "description": "A facet-scoped rule: refines ONE category down to the SKUs matching a\nfilter selection (e.g. GPU \u00b7 fabrikant=MSI, ASUS). Sits between category and\nproduct in precedence (priority 250). `monitored` is the live count of the\ntenant's monitored SKUs the group governs; `label` is the human filter text\n(from `scope._filter_label`, else derived from the facets).",
        "properties": {
          "category_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Category Id"
          },
          "category_name": {
            "title": "Category Name",
            "type": "string"
          },
          "label": {
            "title": "Label",
            "type": "string"
          },
          "monitored": {
            "title": "Monitored",
            "type": "integer"
          },
          "rule": {
            "$ref": "#/components/schemas/RuleOut"
          },
          "slug": {
            "title": "Slug",
            "type": "string"
          }
        },
        "required": [
          "category_id",
          "slug",
          "category_name",
          "label",
          "monitored",
          "rule"
        ],
        "title": "StrategyGroup",
        "type": "object"
      },
      "StrategyOut": {
        "description": "The Strategie page hierarchy: shop default \u2192 categories \u2192 filtered groups\n\u2192 per-product exceptions, assembled from pricing_rules + monitored-SKU\ncoverage. Read-only; edits go through the existing rules + floors endpoints.",
        "properties": {
          "categories": {
            "items": {
              "$ref": "#/components/schemas/StrategyCategory"
            },
            "title": "Categories",
            "type": "array"
          },
          "coverage": {
            "$ref": "#/components/schemas/StrategyCoverage"
          },
          "default_rule": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/RuleOut"
              },
              {
                "type": "null"
              }
            ]
          },
          "exceptions": {
            "items": {
              "$ref": "#/components/schemas/StrategyException"
            },
            "title": "Exceptions",
            "type": "array"
          },
          "groups": {
            "items": {
              "$ref": "#/components/schemas/StrategyGroup"
            },
            "title": "Groups",
            "type": "array"
          }
        },
        "required": [
          "default_rule",
          "coverage",
          "categories",
          "exceptions"
        ],
        "title": "StrategyOut",
        "type": "object"
      },
      "SuggestionOut": {
        "properties": {
          "brand": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Brand"
          },
          "cost_cents": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Cost Cents"
          },
          "country": {
            "title": "Country",
            "type": "string"
          },
          "current_margin_pct": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Current Margin Pct"
          },
          "current_price_cents": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Current Price Cents"
          },
          "explanation_trace": {
            "items": {},
            "title": "Explanation Trace",
            "type": "array"
          },
          "id": {
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "is_own": {
            "default": false,
            "title": "Is Own",
            "type": "boolean"
          },
          "match_confidence": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Match Confidence"
          },
          "min_price_cents": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Min Price Cents"
          },
          "platform": {
            "title": "Platform",
            "type": "string"
          },
          "rule_name": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Rule Name"
          },
          "sku": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Sku"
          },
          "sku_id": {
            "format": "uuid",
            "title": "Sku Id",
            "type": "string"
          },
          "status": {
            "title": "Status",
            "type": "string"
          },
          "suggested_margin_pct": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "title": "Suggested Margin Pct"
          },
          "suggested_price_cents": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Suggested Price Cents"
          },
          "title": {
            "title": "Title",
            "type": "string"
          },
          "updated_at": {
            "title": "Updated At"
          }
        },
        "required": [
          "id",
          "sku_id",
          "sku",
          "title",
          "brand",
          "platform",
          "country",
          "current_price_cents",
          "suggested_price_cents",
          "match_confidence",
          "status",
          "rule_name",
          "explanation_trace",
          "updated_at"
        ],
        "title": "SuggestionOut",
        "type": "object"
      },
      "SyncSessionResponse": {
        "description": "De stand van een volledige-catalogus-synchronisatie.",
        "properties": {
          "completed_at": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Completed At"
          },
          "created": {
            "title": "Created",
            "type": "integer"
          },
          "detail": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Detail"
          },
          "failed": {
            "title": "Failed",
            "type": "integer"
          },
          "orphaned": {
            "title": "Orphaned",
            "type": "integer"
          },
          "received": {
            "title": "Received",
            "type": "integer"
          },
          "skipped": {
            "title": "Skipped",
            "type": "integer"
          },
          "started_at": {
            "title": "Started At",
            "type": "string"
          },
          "state": {
            "enum": [
              "open",
              "completed",
              "aborted"
            ],
            "title": "State",
            "type": "string"
          },
          "sync_id": {
            "title": "Sync Id",
            "type": "string"
          },
          "updated": {
            "title": "Updated",
            "type": "integer"
          }
        },
        "required": [
          "sync_id",
          "state",
          "started_at",
          "received",
          "created",
          "updated",
          "failed",
          "skipped",
          "orphaned"
        ],
        "title": "SyncSessionResponse",
        "type": "object"
      },
      "TrendMoverRow": {
        "description": "One competitor price-move over the window, ranked by \u20ac at stake.\n\n`meaning` is neutral-direction + meaning-for-you: a competitor drop is\n'pressure', a rise is 'room'. `relation` places the new competitor price\nagainst my current price so the FE can say \"onder jouw prijs\" etc.",
        "properties": {
          "brand": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Brand"
          },
          "delta_cents": {
            "title": "Delta Cents",
            "type": "integer"
          },
          "delta_pct": {
            "title": "Delta Pct",
            "type": "number"
          },
          "first_price_cents": {
            "title": "First Price Cents",
            "type": "integer"
          },
          "last_price_cents": {
            "title": "Last Price Cents",
            "type": "integer"
          },
          "meaning": {
            "title": "Meaning",
            "type": "string"
          },
          "my_price_cents": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "My Price Cents"
          },
          "name": {
            "title": "Name",
            "type": "string"
          },
          "relation": {
            "title": "Relation",
            "type": "string"
          },
          "retailer_display_name": {
            "title": "Retailer Display Name",
            "type": "string"
          },
          "retailer_slug": {
            "title": "Retailer Slug",
            "type": "string"
          },
          "sku": {
            "title": "Sku",
            "type": "string"
          },
          "sku_id": {
            "format": "uuid",
            "title": "Sku Id",
            "type": "string"
          },
          "sparkline": {
            "items": {
              "type": "integer"
            },
            "title": "Sparkline",
            "type": "array"
          }
        },
        "required": [
          "sku_id",
          "sku",
          "name",
          "brand",
          "retailer_slug",
          "retailer_display_name",
          "first_price_cents",
          "last_price_cents",
          "delta_cents",
          "delta_pct",
          "meaning",
          "relation",
          "my_price_cents",
          "sparkline"
        ],
        "title": "TrendMoverRow",
        "type": "object"
      },
      "TrendMoversResponse": {
        "properties": {
          "items": {
            "items": {
              "$ref": "#/components/schemas/TrendMoverRow"
            },
            "title": "Items",
            "type": "array"
          },
          "window_days": {
            "title": "Window Days",
            "type": "integer"
          }
        },
        "required": [
          "window_days",
          "items"
        ],
        "title": "TrendMoversResponse",
        "type": "object"
      },
      "TrendsKpis": {
        "description": "KPI-strip aggregates over the window.",
        "properties": {
          "index_pct": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "description": "Latest-bucket price index; 100 = level with the market.",
            "title": "Index Pct"
          },
          "index_skus_n": {
            "default": 0,
            "description": "# SKUs the latest-bucket index was averaged over.",
            "title": "Index Skus N",
            "type": "integer"
          },
          "market_avg_cents": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Latest-bucket portfolio market average.",
            "title": "Market Avg Cents"
          },
          "market_avg_delta_pct": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "description": "Market-average change first\u2192last bucket, in percent (signed).",
            "title": "Market Avg Delta Pct"
          },
          "own_products_n": {
            "default": 0,
            "description": "# SKUs with an own observation in the window.",
            "title": "Own Products N",
            "type": "integer"
          },
          "price_changes_n": {
            "default": 0,
            "description": "# observed price-change events across all listings.",
            "title": "Price Changes N",
            "type": "integer"
          },
          "retailers_with_changes_n": {
            "default": 0,
            "description": "# distinct retailers that changed a price.",
            "title": "Retailers With Changes N",
            "type": "integer"
          },
          "you_vs_market_cents": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "description": "Latest-bucket me_avg - market_avg (signed; + = above market).",
            "title": "You Vs Market Cents"
          }
        },
        "title": "TrendsKpis",
        "type": "object"
      },
      "TrendsPortfolioResponse": {
        "properties": {
          "band": {
            "items": {
              "$ref": "#/components/schemas/BandPoint"
            },
            "title": "Band",
            "type": "array"
          },
          "kpis": {
            "$ref": "#/components/schemas/TrendsKpis"
          },
          "leader": {
            "$ref": "#/components/schemas/PriceLeader"
          },
          "window_days": {
            "title": "Window Days",
            "type": "integer"
          }
        },
        "required": [
          "window_days",
          "kpis",
          "band",
          "leader"
        ],
        "title": "TrendsPortfolioResponse",
        "type": "object"
      },
      "TriggerMappingJobRequest": {
        "description": "POST /api/v1/mappings/jobs \u2014 bulk-enqueue mapping for SKUs.\n\n`sku_ids=None` means 'all active SKUs without an existing mapping\non the active retailers'. Use `monitored_retailer_ids=None` to\ntarget every active retailer.",
        "properties": {
          "monitored_retailer_ids": {
            "anyOf": [
              {
                "items": {
                  "format": "uuid",
                  "type": "string"
                },
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "title": "Monitored Retailer Ids"
          },
          "sku_ids": {
            "anyOf": [
              {
                "items": {
                  "format": "uuid",
                  "type": "string"
                },
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "title": "Sku Ids"
          }
        },
        "title": "TriggerMappingJobRequest",
        "type": "object"
      },
      "TriggerMappingJobResponse": {
        "properties": {
          "enqueued_jobs": {
            "title": "Enqueued Jobs",
            "type": "integer"
          },
          "skipped_existing": {
            "title": "Skipped Existing",
            "type": "integer"
          },
          "skipped_no_urls": {
            "default": 0,
            "title": "Skipped No Urls",
            "type": "integer"
          }
        },
        "required": [
          "enqueued_jobs",
          "skipped_existing"
        ],
        "title": "TriggerMappingJobResponse",
        "type": "object"
      },
      "UrlImportError": {
        "properties": {
          "reason": {
            "title": "Reason",
            "type": "string"
          },
          "row": {
            "title": "Row",
            "type": "integer"
          }
        },
        "required": [
          "row",
          "reason"
        ],
        "title": "UrlImportError",
        "type": "object"
      },
      "UrlImportResponse": {
        "description": "Resolve-phase result of POST /api/v1/mappings/import (returned 202).\n\nRow-level resolve errors (unknown sku/retailer, missing fields) are known\nsynchronously and returned here. The per-row EAN-vs-PDP validation runs\nasync under `bulk_run_id`; poll GET /api/v1/mapping/bulk-runs/{id}/status\nfor the matched/needs_review counts (by_state.mapped / by_state.needs_review).",
        "properties": {
          "accepted_rows": {
            "title": "Accepted Rows",
            "type": "integer"
          },
          "bulk_run_id": {
            "anyOf": [
              {
                "format": "uuid",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Bulk Run Id"
          },
          "duplicate_rows": {
            "default": 0,
            "title": "Duplicate Rows",
            "type": "integer"
          },
          "errors": {
            "items": {
              "$ref": "#/components/schemas/UrlImportError"
            },
            "title": "Errors",
            "type": "array"
          },
          "total_rows": {
            "title": "Total Rows",
            "type": "integer"
          }
        },
        "required": [
          "bulk_run_id",
          "total_rows",
          "accepted_rows",
          "errors"
        ],
        "title": "UrlImportResponse",
        "type": "object"
      },
      "ValidationError": {
        "properties": {
          "loc": {
            "items": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "integer"
                }
              ]
            },
            "title": "Location",
            "type": "array"
          },
          "msg": {
            "title": "Message",
            "type": "string"
          },
          "type": {
            "title": "Error Type",
            "type": "string"
          }
        },
        "required": [
          "loc",
          "msg",
          "type"
        ],
        "title": "ValidationError",
        "type": "object"
      },
      "WebhookDeliveryItem": {
        "properties": {
          "attempt_count": {
            "title": "Attempt Count",
            "type": "integer"
          },
          "created_at": {
            "format": "date-time",
            "title": "Created At",
            "type": "string"
          },
          "endpoint_id": {
            "format": "uuid",
            "title": "Endpoint Id",
            "type": "string"
          },
          "error_message": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Error Message"
          },
          "event_type": {
            "title": "Event Type",
            "type": "string"
          },
          "id": {
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "idempotency_key": {
            "title": "Idempotency Key",
            "type": "string"
          },
          "last_attempt_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Last Attempt At"
          },
          "next_attempt_at": {
            "anyOf": [
              {
                "format": "date-time",
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Next Attempt At"
          },
          "payload": {
            "title": "Payload",
            "type": "object"
          },
          "response_status": {
            "anyOf": [
              {
                "type": "integer"
              },
              {
                "type": "null"
              }
            ],
            "title": "Response Status"
          },
          "status": {
            "$ref": "#/components/schemas/WebhookDeliveryStatus"
          }
        },
        "required": [
          "id",
          "endpoint_id",
          "event_type",
          "status",
          "attempt_count",
          "idempotency_key",
          "created_at",
          "last_attempt_at",
          "next_attempt_at",
          "response_status",
          "error_message",
          "payload"
        ],
        "title": "WebhookDeliveryItem",
        "type": "object"
      },
      "WebhookDeliveryListResponse": {
        "properties": {
          "items": {
            "items": {
              "$ref": "#/components/schemas/WebhookDeliveryItem"
            },
            "title": "Items",
            "type": "array"
          },
          "total": {
            "title": "Total",
            "type": "integer"
          }
        },
        "required": [
          "items",
          "total"
        ],
        "title": "WebhookDeliveryListResponse",
        "type": "object"
      },
      "WebhookDeliveryStatus": {
        "enum": [
          "pending",
          "in_progress",
          "sent",
          "failed"
        ],
        "title": "WebhookDeliveryStatus",
        "type": "string"
      },
      "WebhookEndpointCreate": {
        "additionalProperties": false,
        "properties": {
          "active": {
            "default": true,
            "title": "Active",
            "type": "boolean"
          },
          "description": {
            "anyOf": [
              {
                "maxLength": 255,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Description"
          },
          "event_types": {
            "items": {
              "$ref": "#/components/schemas/WebhookEventType"
            },
            "maxItems": 32,
            "minItems": 1,
            "title": "Event Types",
            "type": "array"
          },
          "url": {
            "format": "uri",
            "maxLength": 2083,
            "minLength": 1,
            "title": "Url",
            "type": "string"
          }
        },
        "required": [
          "url",
          "event_types"
        ],
        "title": "WebhookEndpointCreate",
        "type": "object"
      },
      "WebhookEndpointCreateResponse": {
        "description": "Includes the generated secret \u2014 shown ONCE on create.",
        "properties": {
          "active": {
            "title": "Active",
            "type": "boolean"
          },
          "created_at": {
            "format": "date-time",
            "title": "Created At",
            "type": "string"
          },
          "description": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Description"
          },
          "disabled_reason": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Disabled Reason"
          },
          "event_types": {
            "items": {
              "type": "string"
            },
            "title": "Event Types",
            "type": "array"
          },
          "id": {
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "secret": {
            "title": "Secret",
            "type": "string"
          },
          "updated_at": {
            "format": "date-time",
            "title": "Updated At",
            "type": "string"
          },
          "url": {
            "title": "Url",
            "type": "string"
          }
        },
        "required": [
          "id",
          "url",
          "description",
          "event_types",
          "active",
          "created_at",
          "updated_at",
          "secret"
        ],
        "title": "WebhookEndpointCreateResponse",
        "type": "object"
      },
      "WebhookEndpointItem": {
        "properties": {
          "active": {
            "title": "Active",
            "type": "boolean"
          },
          "created_at": {
            "format": "date-time",
            "title": "Created At",
            "type": "string"
          },
          "description": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Description"
          },
          "disabled_reason": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Disabled Reason"
          },
          "event_types": {
            "items": {
              "type": "string"
            },
            "title": "Event Types",
            "type": "array"
          },
          "id": {
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "updated_at": {
            "format": "date-time",
            "title": "Updated At",
            "type": "string"
          },
          "url": {
            "title": "Url",
            "type": "string"
          }
        },
        "required": [
          "id",
          "url",
          "description",
          "event_types",
          "active",
          "created_at",
          "updated_at"
        ],
        "title": "WebhookEndpointItem",
        "type": "object"
      },
      "WebhookEndpointListResponse": {
        "properties": {
          "items": {
            "items": {
              "$ref": "#/components/schemas/WebhookEndpointItem"
            },
            "title": "Items",
            "type": "array"
          },
          "total": {
            "title": "Total",
            "type": "integer"
          }
        },
        "required": [
          "items",
          "total"
        ],
        "title": "WebhookEndpointListResponse",
        "type": "object"
      },
      "WebhookEndpointUpdate": {
        "additionalProperties": false,
        "properties": {
          "active": {
            "anyOf": [
              {
                "type": "boolean"
              },
              {
                "type": "null"
              }
            ],
            "title": "Active"
          },
          "description": {
            "anyOf": [
              {
                "maxLength": 255,
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "title": "Description"
          },
          "event_types": {
            "anyOf": [
              {
                "items": {
                  "$ref": "#/components/schemas/WebhookEventType"
                },
                "maxItems": 32,
                "type": "array"
              },
              {
                "type": "null"
              }
            ],
            "title": "Event Types"
          }
        },
        "title": "WebhookEndpointUpdate",
        "type": "object"
      },
      "WebhookEventType": {
        "description": "v1 event-types per REQUIREMENTS \u00a76 (Outbound webhooks).",
        "enum": [
          "alert.triggered",
          "sku.added",
          "sku.archived",
          "msrp.changed",
          "run.completed",
          "catalog.sync.completed"
        ],
        "title": "WebhookEventType",
        "type": "string"
      },
      "WebhookSecretRotated": {
        "description": "The new secret, shown once. The old one keeps signing deliveries until\n`previous_secret_valid_until`, so a verifier can be switched without a\ndelivery falling between the two.",
        "properties": {
          "id": {
            "format": "uuid",
            "title": "Id",
            "type": "string"
          },
          "previous_secret_valid_until": {
            "format": "date-time",
            "title": "Previous Secret Valid Until",
            "type": "string"
          },
          "secret": {
            "title": "Secret",
            "type": "string"
          }
        },
        "required": [
          "id",
          "secret",
          "previous_secret_valid_until"
        ],
        "title": "WebhookSecretRotated",
        "type": "object"
      }
    },
    "securitySchemes": {
      "apiKey": {
        "bearerFormat": "pq_<prefix>_<secret>",
        "scheme": "bearer",
        "type": "http"
      }
    }
  },
  "info": {
    "description": "Customer API. Send your key as `Authorization: Bearer pq_...`. Reference: docs/api.md.",
    "title": "priceq API",
    "version": "v1"
  },
  "openapi": "3.1.0",
  "paths": {
    "/api/v1/alerts": {
      "get": {
        "description": "Newest-first alert feed for the in-app inbox AND the dashboard\n\"Needs attention\" widget. For the dashboard top-N critical feed use:\n   GET /api/v1/alerts?status=unread&severity=critical&limit=5\n\n`category=<slug>` filters on the SKU's category (skus.category_id FK).\n`sort=impact` leads with the highest-impact alerts so the UI can make a\ntop-vs-routine-tail cut; `sort=recent` (default) keeps severity+recency.",
        "operationId": "list_alerts_api_v1_alerts_get",
        "parameters": [
          {
            "in": "query",
            "name": "status",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "items": {
                    "$ref": "#/components/schemas/AlertStatus"
                  },
                  "type": "array"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Status"
            }
          },
          {
            "in": "query",
            "name": "severity",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "items": {
                    "$ref": "#/components/schemas/AlertSeverity"
                  },
                  "type": "array"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Severity"
            }
          },
          {
            "in": "query",
            "name": "alert_type",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "$ref": "#/components/schemas/AlertType"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Alert Type"
            }
          },
          {
            "in": "query",
            "name": "category",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Category"
            }
          },
          {
            "in": "query",
            "name": "sort",
            "required": false,
            "schema": {
              "default": "recent",
              "enum": [
                "recent",
                "impact"
              ],
              "title": "Sort",
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "default": 50,
              "maximum": 200,
              "minimum": 1,
              "title": "Limit",
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "offset",
            "required": false,
            "schema": {
              "default": 0,
              "minimum": 0,
              "title": "Offset",
              "type": "integer"
            }
          },
          {
            "in": "header",
            "name": "Authorization",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Authorization"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-Tenant-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-Tenant-Id"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-User-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-User-Id"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AlertListResponse"
                }
              }
            },
            "description": "Successful Response"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            },
            "description": "Validation Error"
          }
        },
        "summary": "List Alerts",
        "tags": [
          "alerts"
        ]
      }
    },
    "/api/v1/alerts/active-promos": {
      "get": {
        "description": "The customer's own sales priceq currently sees \u2014 connector SKUs where the\nsell price is below the list price. Powers the \"acties die priceq van je\nziet\"-panel on Alerts. Purely derived (no storage).",
        "operationId": "active_promos_api_v1_alerts_active_promos_get",
        "parameters": [
          {
            "in": "header",
            "name": "Authorization",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Authorization"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-Tenant-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-Tenant-Id"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-User-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-User-Id"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ActivePromosResponse"
                }
              }
            },
            "description": "Successful Response"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            },
            "description": "Validation Error"
          }
        },
        "summary": "Active Promos",
        "tags": [
          "alerts"
        ]
      }
    },
    "/api/v1/alerts/scan": {
      "post": {
        "operationId": "scan_now_api_v1_alerts_scan_post",
        "parameters": [
          {
            "in": "query",
            "name": "monitored_retailer_id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "format": "uuid",
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Monitored Retailer Id"
            }
          },
          {
            "in": "header",
            "name": "Authorization",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Authorization"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-Tenant-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-Tenant-Id"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-User-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-User-Id"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GenerateAlertsResponse"
                }
              }
            },
            "description": "Successful Response"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            },
            "description": "Validation Error"
          }
        },
        "summary": "Scan Now",
        "tags": [
          "alerts"
        ]
      }
    },
    "/api/v1/alerts/summary": {
      "get": {
        "operationId": "get_summary_api_v1_alerts_summary_get",
        "parameters": [
          {
            "in": "header",
            "name": "Authorization",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Authorization"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-Tenant-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-Tenant-Id"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-User-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-User-Id"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AlertSummary"
                }
              }
            },
            "description": "Successful Response"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            },
            "description": "Validation Error"
          }
        },
        "summary": "Get Summary",
        "tags": [
          "alerts"
        ]
      }
    },
    "/api/v1/alerts/{alert_id}/ignore": {
      "post": {
        "operationId": "ignore_alert_api_v1_alerts__alert_id__ignore_post",
        "parameters": [
          {
            "in": "path",
            "name": "alert_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Alert Id",
              "type": "string"
            }
          },
          {
            "in": "header",
            "name": "Authorization",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Authorization"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-Tenant-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-Tenant-Id"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-User-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-User-Id"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/IgnoreRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "title": "Response Ignore Alert Api V1 Alerts  Alert Id  Ignore Post",
                  "type": "object"
                }
              }
            },
            "description": "Successful Response"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            },
            "description": "Validation Error"
          }
        },
        "summary": "Ignore Alert",
        "tags": [
          "alerts"
        ]
      }
    },
    "/api/v1/alerts/{alert_id}/mute": {
      "post": {
        "operationId": "mute_api_v1_alerts__alert_id__mute_post",
        "parameters": [
          {
            "in": "path",
            "name": "alert_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Alert Id",
              "type": "string"
            }
          },
          {
            "in": "header",
            "name": "Authorization",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Authorization"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-Tenant-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-Tenant-Id"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-User-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-User-Id"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "title": "Response Mute Api V1 Alerts  Alert Id  Mute Post",
                  "type": "object"
                }
              }
            },
            "description": "Successful Response"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            },
            "description": "Validation Error"
          }
        },
        "summary": "Mute",
        "tags": [
          "alerts"
        ]
      }
    },
    "/api/v1/alerts/{alert_id}/read": {
      "post": {
        "operationId": "mark_read_api_v1_alerts__alert_id__read_post",
        "parameters": [
          {
            "in": "path",
            "name": "alert_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Alert Id",
              "type": "string"
            }
          },
          {
            "in": "header",
            "name": "Authorization",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Authorization"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-Tenant-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-Tenant-Id"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-User-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-User-Id"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "title": "Response Mark Read Api V1 Alerts  Alert Id  Read Post",
                  "type": "object"
                }
              }
            },
            "description": "Successful Response"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            },
            "description": "Validation Error"
          }
        },
        "summary": "Mark Read",
        "tags": [
          "alerts"
        ]
      }
    },
    "/api/v1/alerts/{alert_id}/resolve": {
      "post": {
        "operationId": "resolve_api_v1_alerts__alert_id__resolve_post",
        "parameters": [
          {
            "in": "path",
            "name": "alert_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Alert Id",
              "type": "string"
            }
          },
          {
            "in": "header",
            "name": "Authorization",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Authorization"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-Tenant-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-Tenant-Id"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-User-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-User-Id"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "title": "Response Resolve Api V1 Alerts  Alert Id  Resolve Post",
                  "type": "object"
                }
              }
            },
            "description": "Successful Response"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            },
            "description": "Validation Error"
          }
        },
        "summary": "Resolve",
        "tags": [
          "alerts"
        ]
      }
    },
    "/api/v1/alerts/{alert_id}/snooze": {
      "post": {
        "operationId": "snooze_api_v1_alerts__alert_id__snooze_post",
        "parameters": [
          {
            "in": "path",
            "name": "alert_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Alert Id",
              "type": "string"
            }
          },
          {
            "in": "header",
            "name": "Authorization",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Authorization"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-Tenant-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-Tenant-Id"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-User-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-User-Id"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SnoozeRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "title": "Response Snooze Api V1 Alerts  Alert Id  Snooze Post",
                  "type": "object"
                }
              }
            },
            "description": "Successful Response"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            },
            "description": "Validation Error"
          }
        },
        "summary": "Snooze",
        "tags": [
          "alerts"
        ]
      }
    },
    "/api/v1/api-keys": {
      "get": {
        "operationId": "list_keys_api_v1_api_keys_get",
        "parameters": [
          {
            "in": "header",
            "name": "Authorization",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Authorization"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-Tenant-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-Tenant-Id"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-User-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-User-Id"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/ApiKeyOut"
                  },
                  "title": "Response List Keys Api V1 Api Keys Get",
                  "type": "array"
                }
              }
            },
            "description": "Successful Response"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            },
            "description": "Validation Error"
          }
        },
        "summary": "List Keys",
        "tags": [
          "api-keys"
        ]
      },
      "post": {
        "operationId": "create_key_api_v1_api_keys_post",
        "parameters": [
          {
            "in": "header",
            "name": "Authorization",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Authorization"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-Tenant-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-Tenant-Id"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-User-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-User-Id"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ApiKeyIn"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiKeyCreated"
                }
              }
            },
            "description": "Successful Response"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            },
            "description": "Validation Error"
          }
        },
        "summary": "Create Key",
        "tags": [
          "api-keys"
        ]
      }
    },
    "/api/v1/api-keys/{key_id}/revoke": {
      "post": {
        "description": "Revoke, do not delete: a key that disappears takes the answer to \"what\nwas this and who made it\" with it.",
        "operationId": "revoke_key_api_v1_api_keys__key_id__revoke_post",
        "parameters": [
          {
            "in": "path",
            "name": "key_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Key Id",
              "type": "string"
            }
          },
          {
            "in": "header",
            "name": "Authorization",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Authorization"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-Tenant-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-Tenant-Id"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-User-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-User-Id"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiKeyOut"
                }
              }
            },
            "description": "Successful Response"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            },
            "description": "Validation Error"
          }
        },
        "summary": "Revoke Key",
        "tags": [
          "api-keys"
        ]
      }
    },
    "/api/v1/catalog/products": {
      "post": {
        "description": "Producten aanleveren of bijwerken. Ruimt niets op.",
        "operationId": "push_products_api_v1_catalog_products_post",
        "parameters": [
          {
            "in": "header",
            "name": "Idempotency-Key",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Idempotency-Key"
            }
          },
          {
            "in": "header",
            "name": "accept-language",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Accept-Language"
            }
          },
          {
            "in": "header",
            "name": "Authorization",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Authorization"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-Tenant-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-Tenant-Id"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-User-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-User-Id"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/BulkProductsRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BulkProductsResponse"
                }
              }
            },
            "description": "Successful Response"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            },
            "description": "Validation Error"
          }
        },
        "summary": "Push Products",
        "tags": [
          "catalog-ingest"
        ]
      }
    },
    "/api/v1/catalog/sync": {
      "post": {
        "description": "Een volledige-catalogus-synchronisatie openen.\n\nLoopt er al een, dan krijg je die terug in plaats van een tweede. Twee open\nvensters naast elkaar zouden elkaars ijkpunt ondergraven: de een sluit af en\nzet weg wat de ander net staat aan te leveren.",
        "operationId": "start_sync_api_v1_catalog_sync_post",
        "parameters": [
          {
            "in": "header",
            "name": "accept-language",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Accept-Language"
            }
          },
          {
            "in": "header",
            "name": "Authorization",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Authorization"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-Tenant-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-Tenant-Id"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-User-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-User-Id"
            }
          }
        ],
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SyncSessionResponse"
                }
              }
            },
            "description": "Successful Response"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            },
            "description": "Validation Error"
          }
        },
        "summary": "Start Sync",
        "tags": [
          "catalog-ingest"
        ]
      }
    },
    "/api/v1/catalog/sync/{sync_id}": {
      "get": {
        "operationId": "get_sync_api_v1_catalog_sync__sync_id__get",
        "parameters": [
          {
            "in": "path",
            "name": "sync_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Sync Id",
              "type": "string"
            }
          },
          {
            "in": "header",
            "name": "accept-language",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Accept-Language"
            }
          },
          {
            "in": "header",
            "name": "Authorization",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Authorization"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-Tenant-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-Tenant-Id"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-User-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-User-Id"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SyncSessionResponse"
                }
              }
            },
            "description": "Successful Response"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            },
            "description": "Validation Error"
          }
        },
        "summary": "Get Sync",
        "tags": [
          "catalog-ingest"
        ]
      }
    },
    "/api/v1/catalog/sync/{sync_id}/complete": {
      "post": {
        "description": "Afsluiten: alles wat je deze synchronisatie niet aanleverde, geldt als\nverdwenen en gaat op `orphaned`. Zacht -- het product en zijn prijshistorie\nblijven staan.",
        "operationId": "complete_sync_api_v1_catalog_sync__sync_id__complete_post",
        "parameters": [
          {
            "in": "path",
            "name": "sync_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Sync Id",
              "type": "string"
            }
          },
          {
            "in": "header",
            "name": "accept-language",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Accept-Language"
            }
          },
          {
            "in": "header",
            "name": "Authorization",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Authorization"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-Tenant-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-Tenant-Id"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-User-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-User-Id"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SyncSessionResponse"
                }
              }
            },
            "description": "Successful Response"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            },
            "description": "Validation Error"
          }
        },
        "summary": "Complete Sync",
        "tags": [
          "catalog-ingest"
        ]
      }
    },
    "/api/v1/catalog/sync/{sync_id}/products": {
      "post": {
        "description": "E\u00e9n pagina van je volledige catalogus aanleveren.",
        "operationId": "push_sync_page_api_v1_catalog_sync__sync_id__products_post",
        "parameters": [
          {
            "in": "path",
            "name": "sync_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Sync Id",
              "type": "string"
            }
          },
          {
            "in": "header",
            "name": "Idempotency-Key",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Idempotency-Key"
            }
          },
          {
            "in": "header",
            "name": "accept-language",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Accept-Language"
            }
          },
          {
            "in": "header",
            "name": "Authorization",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Authorization"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-Tenant-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-Tenant-Id"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-User-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-User-Id"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/BulkProductsRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BulkProductsResponse"
                }
              }
            },
            "description": "Successful Response"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            },
            "description": "Validation Error"
          }
        },
        "summary": "Push Sync Page",
        "tags": [
          "catalog-ingest"
        ]
      }
    },
    "/api/v1/exports/report/{report_type}": {
      "get": {
        "description": "One report as an XLSX workbook, over a period the caller chooses.\n\nNo extra role gate beyond being logged in, deliberately: this is a view of\nnumbers every user already sees in the app, narrowed to a period. The full\nexport sits behind admin because it hands over *everything* at once; that\nreasoning does not carry over to a single report.",
        "operationId": "export_report_api_v1_exports_report__report_type__get",
        "parameters": [
          {
            "in": "path",
            "name": "report_type",
            "required": true,
            "schema": {
              "title": "Report Type",
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "from",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "format": "date-time",
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "From"
            }
          },
          {
            "in": "query",
            "name": "to",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "format": "date-time",
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "To"
            }
          },
          {
            "in": "header",
            "name": "accept-language",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Accept-Language"
            }
          },
          {
            "in": "header",
            "name": "Authorization",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Authorization"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-Tenant-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-Tenant-Id"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-User-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-User-Id"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {}
              }
            },
            "description": "Successful Response"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            },
            "description": "Validation Error"
          }
        },
        "summary": "Export Report",
        "tags": [
          "exports"
        ]
      }
    },
    "/api/v1/mappings": {
      "get": {
        "operationId": "list_mappings_api_v1_mappings_get",
        "parameters": [
          {
            "in": "query",
            "name": "sku_id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "format": "uuid",
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Sku Id"
            }
          },
          {
            "in": "query",
            "name": "monitored_retailer_id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "format": "uuid",
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Monitored Retailer Id"
            }
          },
          {
            "description": "Filter by retailer slug (resolved to monitored_retailer_id within the tenant). Unknown slug \u2192 empty result.",
            "in": "query",
            "name": "retailer",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Filter by retailer slug (resolved to monitored_retailer_id within the tenant). Unknown slug \u2192 empty result.",
              "title": "Retailer"
            }
          },
          {
            "in": "query",
            "name": "state",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "pattern": "^(unmatched|in_review|matched|never_listed|dismissed|active|degraded|needs_review|dead)$",
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "State"
            }
          },
          {
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "default": 200,
              "maximum": 500,
              "minimum": 1,
              "title": "Limit",
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "offset",
            "required": false,
            "schema": {
              "default": 0,
              "minimum": 0,
              "title": "Offset",
              "type": "integer"
            }
          },
          {
            "in": "header",
            "name": "Authorization",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Authorization"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-Tenant-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-Tenant-Id"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-User-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-User-Id"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MappingListResponse"
                }
              }
            },
            "description": "Successful Response"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            },
            "description": "Validation Error"
          }
        },
        "summary": "List Mappings",
        "tags": [
          "mapping"
        ]
      },
      "post": {
        "description": "Operator-paste fallback. Validates EAN against PDP unless skip flag set.\n\nReturns 422 with detail on EAN mismatch when skip_ean_validation=False.",
        "operationId": "create_manual_mapping_api_v1_mappings_post",
        "parameters": [
          {
            "in": "header",
            "name": "Authorization",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Authorization"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-Tenant-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-Tenant-Id"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-User-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-User-Id"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ManualMappingRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MappingResponse"
                }
              }
            },
            "description": "Successful Response"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            },
            "description": "Validation Error"
          }
        },
        "summary": "Create Manual Mapping",
        "tags": [
          "mapping"
        ]
      }
    },
    "/api/v1/mappings/import": {
      "post": {
        "description": "Bulk-import operator-supplied (sku-or-ean, retailer-slug, url) rows.\n\nResolve phase (sync): row-level errors for unknown sku/retailer are\nreturned immediately. Validation phase (async, under bulk_run_id): each\naccepted row's URL is EAN-validated against its PDP \u2014 match \u2192 'matched',\nmismatch/fetch-fail \u2192 'needs_review'. Poll\n/api/v1/mapping/bulk-runs/{bulk_run_id}/status for progress + counts.",
        "operationId": "import_url_csv_api_v1_mappings_import_post",
        "parameters": [
          {
            "in": "header",
            "name": "Authorization",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Authorization"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-Tenant-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-Tenant-Id"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-User-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-User-Id"
            }
          }
        ],
        "requestBody": {
          "content": {
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/Body_import_url_csv_api_v1_mappings_import_post"
              }
            }
          },
          "required": true
        },
        "responses": {
          "202": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UrlImportResponse"
                }
              }
            },
            "description": "Successful Response"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            },
            "description": "Validation Error"
          }
        },
        "summary": "Import Url Csv",
        "tags": [
          "mapping"
        ]
      }
    },
    "/api/v1/mappings/jobs": {
      "post": {
        "description": "Run mapping for (SKUs \u00d7 retailers) cross-product.\n\nSYNCHRONOUS in v1 \u2014 caller waits up to ~5 minutes per (SKU \u00d7 retailer)\npair. Defaults to all active SKUs \u00d7 all active retailers when both\nlists are None. Skips pairs that already have an active mapping.\n\nFuture: Arq job-queue (jobs/mapping_jobs.py) for >50 pairs.",
        "operationId": "trigger_bulk_mapping_api_v1_mappings_jobs_post",
        "parameters": [
          {
            "in": "header",
            "name": "Authorization",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Authorization"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-Tenant-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-Tenant-Id"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-User-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-User-Id"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TriggerMappingJobRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TriggerMappingJobResponse"
                }
              }
            },
            "description": "Successful Response"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            },
            "description": "Validation Error"
          }
        },
        "summary": "Trigger Bulk Mapping",
        "tags": [
          "mapping"
        ]
      }
    },
    "/api/v1/mappings/review/queue": {
      "get": {
        "description": "List sku_url_mapping_job rows in 'needs_review' state.",
        "operationId": "list_review_queue_api_v1_mappings_review_queue_get",
        "parameters": [
          {
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "default": 50,
              "maximum": 200,
              "minimum": 1,
              "title": "Limit",
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "offset",
            "required": false,
            "schema": {
              "default": 0,
              "minimum": 0,
              "title": "Offset",
              "type": "integer"
            }
          },
          {
            "in": "header",
            "name": "Authorization",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Authorization"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-Tenant-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-Tenant-Id"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-User-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-User-Id"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ReviewQueueResponse"
                }
              }
            },
            "description": "Successful Response"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            },
            "description": "Validation Error"
          }
        },
        "summary": "List Review Queue",
        "tags": [
          "mapping"
        ]
      }
    },
    "/api/v1/mappings/review/{job_id}": {
      "post": {
        "description": "Operator action on a review-queue item.\n\nactions:\n  - 'accept_url': provide listing_url \u2192 manual mapping created.\n  - 'abandon': mark SKU as not-on-this-retailer.",
        "operationId": "resolve_review_item_api_v1_mappings_review__job_id__post",
        "parameters": [
          {
            "in": "path",
            "name": "job_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Job Id",
              "type": "string"
            }
          },
          {
            "in": "header",
            "name": "Authorization",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Authorization"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-Tenant-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-Tenant-Id"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-User-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-User-Id"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ResolveReviewRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ReviewItem"
                }
              }
            },
            "description": "Successful Response"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            },
            "description": "Validation Error"
          }
        },
        "summary": "Resolve Review Item",
        "tags": [
          "mapping"
        ]
      }
    },
    "/api/v1/mappings/{mapping_id}": {
      "delete": {
        "description": "Hard-delete one mapping. Federation trigger fires AFTER DELETE\nso ean_federation_stats is recomputed.",
        "operationId": "delete_mapping_api_v1_mappings__mapping_id__delete",
        "parameters": [
          {
            "in": "path",
            "name": "mapping_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Mapping Id",
              "type": "string"
            }
          },
          {
            "in": "header",
            "name": "Authorization",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Authorization"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-Tenant-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-Tenant-Id"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-User-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-User-Id"
            }
          }
        ],
        "responses": {
          "204": {
            "description": "Successful Response"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            },
            "description": "Validation Error"
          }
        },
        "summary": "Delete Mapping",
        "tags": [
          "mapping"
        ]
      },
      "get": {
        "operationId": "get_mapping_api_v1_mappings__mapping_id__get",
        "parameters": [
          {
            "in": "path",
            "name": "mapping_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Mapping Id",
              "type": "string"
            }
          },
          {
            "in": "header",
            "name": "Authorization",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Authorization"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-Tenant-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-Tenant-Id"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-User-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-User-Id"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MappingResponse"
                }
              }
            },
            "description": "Successful Response"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            },
            "description": "Validation Error"
          }
        },
        "summary": "Get Mapping",
        "tags": [
          "mapping"
        ]
      },
      "patch": {
        "description": "Edit an existing mapping's URL in-place (Koppelingen \"URL bewerken\").\n\nRe-validates the EAN against the new PDP; 422 on mismatch unless\nskip_ean_validation=True. Distinct from PATCH /{id}/state (FSM transition).",
        "operationId": "update_mapping_url_api_v1_mappings__mapping_id__patch",
        "parameters": [
          {
            "in": "path",
            "name": "mapping_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Mapping Id",
              "type": "string"
            }
          },
          {
            "in": "header",
            "name": "Authorization",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Authorization"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-Tenant-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-Tenant-Id"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-User-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-User-Id"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MappingUrlUpdate"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MappingResponse"
                }
              }
            },
            "description": "Successful Response"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            },
            "description": "Validation Error"
          }
        },
        "summary": "Update Mapping Url",
        "tags": [
          "mapping"
        ]
      }
    },
    "/api/v1/mappings/{mapping_id}/state": {
      "patch": {
        "description": "Operator-driven state transition.\n\nAllowed transitions:\n  - any \u2192 'dead' (operator confirms URL is permanently bad)\n  - 'dead' \u2192 'active' (reactivate after operator-pasted fix)\n\nAuto-state-machine transitions (active \u2194 degraded \u2194 needs_review)\nare managed by the daily price-refresh job, not this endpoint.",
        "operationId": "update_mapping_state_api_v1_mappings__mapping_id__state_patch",
        "parameters": [
          {
            "in": "path",
            "name": "mapping_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Mapping Id",
              "type": "string"
            }
          },
          {
            "in": "header",
            "name": "Authorization",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Authorization"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-Tenant-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-Tenant-Id"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-User-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-User-Id"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MappingStateUpdate"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MappingResponse"
                }
              }
            },
            "description": "Successful Response"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            },
            "description": "Validation Error"
          }
        },
        "summary": "Update Mapping State",
        "tags": [
          "mapping"
        ]
      }
    },
    "/api/v1/pricing/health-events": {
      "get": {
        "operationId": "get_health_events_api_v1_pricing_health_events_get",
        "parameters": [
          {
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "default": 50,
              "maximum": 200,
              "minimum": 1,
              "title": "Limit",
              "type": "integer"
            }
          },
          {
            "in": "header",
            "name": "Authorization",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Authorization"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-Tenant-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-Tenant-Id"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-User-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-User-Id"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/HealthEventOut"
                  },
                  "title": "Response Get Health Events Api V1 Pricing Health Events Get",
                  "type": "array"
                }
              }
            },
            "description": "Successful Response"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            },
            "description": "Validation Error"
          }
        },
        "summary": "Get Health Events",
        "tags": [
          "pricing"
        ]
      }
    },
    "/api/v1/pricing/policy": {
      "get": {
        "operationId": "get_policy_api_v1_pricing_policy_get",
        "parameters": [
          {
            "in": "header",
            "name": "Authorization",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Authorization"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-Tenant-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-Tenant-Id"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-User-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-User-Id"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PricingPolicyOut"
                }
              }
            },
            "description": "Successful Response"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            },
            "description": "Validation Error"
          }
        },
        "summary": "Get Policy",
        "tags": [
          "pricing"
        ]
      },
      "put": {
        "operationId": "put_policy_api_v1_pricing_policy_put",
        "parameters": [
          {
            "in": "header",
            "name": "Authorization",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Authorization"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-Tenant-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-Tenant-Id"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-User-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-User-Id"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PricingPolicyIn"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PricingPolicyOut"
                }
              }
            },
            "description": "Successful Response"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            },
            "description": "Validation Error"
          }
        },
        "summary": "Put Policy",
        "tags": [
          "pricing"
        ]
      }
    },
    "/api/v1/pricing/push": {
      "post": {
        "operationId": "push_api_v1_pricing_push_post",
        "parameters": [
          {
            "in": "header",
            "name": "Authorization",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Authorization"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-Tenant-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-Tenant-Id"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-User-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-User-Id"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PushRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "202": {
            "content": {
              "application/json": {
                "schema": {
                  "title": "Response Push Api V1 Pricing Push Post",
                  "type": "object"
                }
              }
            },
            "description": "Successful Response"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            },
            "description": "Validation Error"
          }
        },
        "summary": "Push",
        "tags": [
          "pricing"
        ]
      }
    },
    "/api/v1/pricing/push-log": {
      "get": {
        "operationId": "get_push_log_api_v1_pricing_push_log_get",
        "parameters": [
          {
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "default": 100,
              "maximum": 500,
              "minimum": 1,
              "title": "Limit",
              "type": "integer"
            }
          },
          {
            "in": "header",
            "name": "Authorization",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Authorization"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-Tenant-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-Tenant-Id"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-User-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-User-Id"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/PushLogOut"
                  },
                  "title": "Response Get Push Log Api V1 Pricing Push Log Get",
                  "type": "array"
                }
              }
            },
            "description": "Successful Response"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            },
            "description": "Validation Error"
          }
        },
        "summary": "Get Push Log",
        "tags": [
          "pricing"
        ]
      }
    },
    "/api/v1/pricing/readiness": {
      "get": {
        "operationId": "readiness_api_v1_pricing_readiness_get",
        "parameters": [
          {
            "in": "query",
            "name": "country",
            "required": false,
            "schema": {
              "default": "NL",
              "maxLength": 2,
              "minLength": 2,
              "title": "Country",
              "type": "string"
            }
          },
          {
            "in": "header",
            "name": "Authorization",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Authorization"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-Tenant-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-Tenant-Id"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-User-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-User-Id"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ReadinessOut"
                }
              }
            },
            "description": "Successful Response"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            },
            "description": "Validation Error"
          }
        },
        "summary": "Readiness",
        "tags": [
          "pricing"
        ]
      }
    },
    "/api/v1/pricing/rules": {
      "get": {
        "operationId": "list_rules_api_v1_pricing_rules_get",
        "parameters": [
          {
            "in": "header",
            "name": "Authorization",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Authorization"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-Tenant-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-Tenant-Id"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-User-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-User-Id"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/RuleOut"
                  },
                  "title": "Response List Rules Api V1 Pricing Rules Get",
                  "type": "array"
                }
              }
            },
            "description": "Successful Response"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            },
            "description": "Validation Error"
          }
        },
        "summary": "List Rules",
        "tags": [
          "pricing"
        ]
      },
      "post": {
        "operationId": "create_rule_api_v1_pricing_rules_post",
        "parameters": [
          {
            "in": "header",
            "name": "Authorization",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Authorization"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-Tenant-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-Tenant-Id"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-User-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-User-Id"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RuleCreate"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RuleOut"
                }
              }
            },
            "description": "Successful Response"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            },
            "description": "Validation Error"
          }
        },
        "summary": "Create Rule",
        "tags": [
          "pricing"
        ]
      }
    },
    "/api/v1/pricing/rules/preview": {
      "post": {
        "description": "Wat deze regel met je prijzen zou doen -- zonder hem toe te passen.\n\nJe paste een regel toe, ging naar een ander scherm, drukte op Genereer\nadvies, en zag pas dan wat er gebeurd was. Elk vergelijkbaar pakket laat\ndit vooraf zien.",
        "operationId": "preview_rule_api_v1_pricing_rules_preview_post",
        "parameters": [
          {
            "in": "header",
            "name": "Authorization",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Authorization"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-Tenant-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-Tenant-Id"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-User-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-User-Id"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RulePreviewRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RulePreviewResponse"
                }
              }
            },
            "description": "Successful Response"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            },
            "description": "Validation Error"
          }
        },
        "summary": "Preview Rule",
        "tags": [
          "pricing"
        ]
      }
    },
    "/api/v1/pricing/rules/{rule_id}": {
      "delete": {
        "description": "Delete a rule. `price_suggestions.rule_id` is ON DELETE SET NULL, so\nexisting suggestions survive (they just lose the rule label).",
        "operationId": "delete_rule_api_v1_pricing_rules__rule_id__delete",
        "parameters": [
          {
            "in": "path",
            "name": "rule_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Rule Id",
              "type": "string"
            }
          },
          {
            "in": "header",
            "name": "Authorization",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Authorization"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-Tenant-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-Tenant-Id"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-User-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-User-Id"
            }
          }
        ],
        "responses": {
          "204": {
            "description": "Successful Response"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            },
            "description": "Validation Error"
          }
        },
        "summary": "Delete Rule",
        "tags": [
          "pricing"
        ]
      },
      "patch": {
        "operationId": "update_rule_api_v1_pricing_rules__rule_id__patch",
        "parameters": [
          {
            "in": "path",
            "name": "rule_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Rule Id",
              "type": "string"
            }
          },
          {
            "in": "header",
            "name": "Authorization",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Authorization"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-Tenant-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-Tenant-Id"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-User-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-User-Id"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RuleUpdate"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RuleOut"
                }
              }
            },
            "description": "Successful Response"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            },
            "description": "Validation Error"
          }
        },
        "summary": "Update Rule",
        "tags": [
          "pricing"
        ]
      }
    },
    "/api/v1/pricing/strategy": {
      "get": {
        "description": "Assemble the strategy hierarchy for one country: the shop-default rule,\neach category (own or inherited rule + monitored-SKU coverage), and the\nper-product exceptions. Read-only; edits go via /rules and /skus/floors.",
        "operationId": "strategy_api_v1_pricing_strategy_get",
        "parameters": [
          {
            "in": "query",
            "name": "country",
            "required": false,
            "schema": {
              "default": "NL",
              "maxLength": 2,
              "minLength": 2,
              "title": "Country",
              "type": "string"
            }
          },
          {
            "in": "header",
            "name": "Authorization",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Authorization"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-Tenant-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-Tenant-Id"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-User-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-User-Id"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/StrategyOut"
                }
              }
            },
            "description": "Successful Response"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            },
            "description": "Validation Error"
          }
        },
        "summary": "Strategy",
        "tags": [
          "pricing"
        ]
      }
    },
    "/api/v1/pricing/suggestions": {
      "get": {
        "operationId": "list_suggestions_api_v1_pricing_suggestions_get",
        "parameters": [
          {
            "in": "query",
            "name": "status",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Status"
            }
          },
          {
            "in": "query",
            "name": "country",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Country"
            }
          },
          {
            "in": "header",
            "name": "Authorization",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Authorization"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-Tenant-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-Tenant-Id"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-User-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-User-Id"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/SuggestionOut"
                  },
                  "title": "Response List Suggestions Api V1 Pricing Suggestions Get",
                  "type": "array"
                }
              }
            },
            "description": "Successful Response"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            },
            "description": "Validation Error"
          }
        },
        "summary": "List Suggestions",
        "tags": [
          "pricing"
        ]
      }
    },
    "/api/v1/pricing/suggestions/decide": {
      "post": {
        "operationId": "decide_api_v1_pricing_suggestions_decide_post",
        "parameters": [
          {
            "in": "header",
            "name": "Authorization",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Authorization"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-Tenant-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-Tenant-Id"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-User-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-User-Id"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DecisionRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DecisionResponse"
                }
              }
            },
            "description": "Successful Response"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            },
            "description": "Validation Error"
          }
        },
        "summary": "Decide",
        "tags": [
          "pricing"
        ]
      }
    },
    "/api/v1/pricing/suggestions/generate": {
      "post": {
        "operationId": "generate_api_v1_pricing_suggestions_generate_post",
        "parameters": [
          {
            "in": "header",
            "name": "Authorization",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Authorization"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-Tenant-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-Tenant-Id"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-User-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-User-Id"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/GenerateRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GenerateResponse"
                }
              }
            },
            "description": "Successful Response"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            },
            "description": "Validation Error"
          }
        },
        "summary": "Generate",
        "tags": [
          "pricing"
        ]
      }
    },
    "/api/v1/pricing/suggestions/retry": {
      "post": {
        "description": "Retry failed pushes: flip `failed` \u2192 `approved` so the next push picks\nthem up. Only `failed` rows transition.",
        "operationId": "retry_api_v1_pricing_suggestions_retry_post",
        "parameters": [
          {
            "in": "header",
            "name": "Authorization",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Authorization"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-Tenant-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-Tenant-Id"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-User-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-User-Id"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RetryRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DecisionResponse"
                }
              }
            },
            "description": "Successful Response"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            },
            "description": "Validation Error"
          }
        },
        "summary": "Retry",
        "tags": [
          "pricing"
        ]
      }
    },
    "/api/v1/reports": {
      "get": {
        "description": "The customer's own sent reports, newest period first.",
        "operationId": "list_reports_api_v1_reports_get",
        "parameters": [
          {
            "in": "header",
            "name": "Authorization",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Authorization"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-Tenant-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-Tenant-Id"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-User-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-User-Id"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/ReportSummary"
                  },
                  "title": "Response List Reports Api V1 Reports Get",
                  "type": "array"
                }
              }
            },
            "description": "Successful Response"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            },
            "description": "Validation Error"
          }
        },
        "summary": "List Reports",
        "tags": [
          "reports"
        ]
      }
    },
    "/api/v1/reports/rebuild": {
      "post": {
        "description": "Recompute the snapshot for the most recently completed period.\n\nReports were produced by a Monday-morning cron and nothing else, so a\nreport could only ever be as new as the last cron run \u2014 and a reader\nlooking at Thursday's page saw Monday's figures with no way to refresh\nthem. Worse, a report stored before a metric shipped simply lacks that\nmetric forever: the worklist added on 17 Aug is absent from the 17 Aug\nreport, and the page renders a dash where the answer should be.\n\nRebuilds only. The mail is deliberately NOT resent \u2014 re-mailing every\nrecipient because someone pressed a button in the app is not a thing this\nshould be able to do by accident. `upsert_run` overwrites the same row, so\npressing it twice is the same as pressing it once.\n\nRate-limited per tenant: the payload is a couple of dozen aggregate\nqueries over the whole catalogue.",
        "operationId": "rebuild_report_api_v1_reports_rebuild_post",
        "parameters": [
          {
            "in": "query",
            "name": "kind",
            "required": false,
            "schema": {
              "default": "weekly",
              "pattern": "^(weekly|monthly)$",
              "title": "Kind",
              "type": "string"
            }
          },
          {
            "in": "header",
            "name": "Authorization",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Authorization"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-Tenant-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-Tenant-Id"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-User-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-User-Id"
            }
          }
        ],
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ReportSummary"
                }
              }
            },
            "description": "Successful Response"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            },
            "description": "Validation Error"
          }
        },
        "summary": "Rebuild Report",
        "tags": [
          "reports"
        ]
      }
    },
    "/api/v1/reports/{run_id}": {
      "get": {
        "description": "One report's full snapshot -- the app renders straight from this.",
        "operationId": "get_report_api_v1_reports__run_id__get",
        "parameters": [
          {
            "in": "path",
            "name": "run_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Run Id",
              "type": "string"
            }
          },
          {
            "in": "header",
            "name": "Authorization",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Authorization"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-Tenant-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-Tenant-Id"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-User-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-User-Id"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ReportDetail"
                }
              }
            },
            "description": "Successful Response"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            },
            "description": "Validation Error"
          }
        },
        "summary": "Get Report",
        "tags": [
          "reports"
        ]
      }
    },
    "/api/v1/reports/{run_id}.pdf": {
      "get": {
        "description": "The report as a PDF -- same snapshot as the app view, a different shape.",
        "operationId": "get_report_pdf_api_v1_reports__run_id__pdf_get",
        "parameters": [
          {
            "in": "path",
            "name": "run_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Run Id",
              "type": "string"
            }
          },
          {
            "in": "header",
            "name": "accept-language",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Accept-Language"
            }
          },
          {
            "in": "header",
            "name": "Authorization",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Authorization"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-Tenant-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-Tenant-Id"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-User-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-User-Id"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {}
              }
            },
            "description": "Successful Response"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            },
            "description": "Validation Error"
          }
        },
        "summary": "Get Report Pdf",
        "tags": [
          "reports"
        ]
      }
    },
    "/api/v1/reports/{run_id}.xlsx": {
      "get": {
        "description": "The report as a workbook -- same snapshot, one tab per section.",
        "operationId": "get_report_xlsx_api_v1_reports__run_id__xlsx_get",
        "parameters": [
          {
            "in": "path",
            "name": "run_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Run Id",
              "type": "string"
            }
          },
          {
            "in": "header",
            "name": "accept-language",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Accept-Language"
            }
          },
          {
            "in": "header",
            "name": "Authorization",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Authorization"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-Tenant-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-Tenant-Id"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-User-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-User-Id"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {}
              }
            },
            "description": "Successful Response"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            },
            "description": "Validation Error"
          }
        },
        "summary": "Get Report Xlsx",
        "tags": [
          "reports"
        ]
      }
    },
    "/api/v1/skus": {
      "get": {
        "operationId": "list_skus_api_v1_skus_get",
        "parameters": [
          {
            "in": "query",
            "name": "status",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "$ref": "#/components/schemas/SkuStatus"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Status"
            }
          },
          {
            "description": "Category-filter \u2014 accepts a slug, a comma-separated list (gpu,psu), the sentinel '__none__' for Ongecategoriseerd, or a mix (gpu,__none__). Unknown slugs are silently dropped.",
            "in": "query",
            "name": "category",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Category-filter \u2014 accepts a slug, a comma-separated list (gpu,psu), the sentinel '__none__' for Ongecategoriseerd, or a mix (gpu,__none__). Unknown slugs are silently dropped.",
              "title": "Category"
            }
          },
          {
            "description": "Case-insensitive exact brand match. Unknown brand returns empty.",
            "in": "query",
            "name": "brand",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Case-insensitive exact brand match. Unknown brand returns empty.",
              "title": "Brand"
            }
          },
          {
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "default": 100,
              "maximum": 1000,
              "minimum": 1,
              "title": "Limit",
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "offset",
            "required": false,
            "schema": {
              "default": 0,
              "minimum": 0,
              "title": "Offset",
              "type": "integer"
            }
          },
          {
            "in": "header",
            "name": "Authorization",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Authorization"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-Tenant-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-Tenant-Id"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-User-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-User-Id"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SkuListResponse"
                }
              }
            },
            "description": "Successful Response"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            },
            "description": "Validation Error"
          }
        },
        "summary": "List Skus",
        "tags": [
          "skus"
        ]
      },
      "post": {
        "operationId": "create_sku_api_v1_skus_post",
        "parameters": [
          {
            "in": "header",
            "name": "Authorization",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Authorization"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-Tenant-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-Tenant-Id"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-User-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-User-Id"
            }
          },
          {
            "in": "header",
            "name": "accept-language",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Accept-Language"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SkuCreate"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SkuResponse"
                }
              }
            },
            "description": "Successful Response"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            },
            "description": "Validation Error"
          }
        },
        "summary": "Create Sku",
        "tags": [
          "skus"
        ]
      }
    },
    "/api/v1/skus/bulk": {
      "patch": {
        "description": "Bulk-update many SKUs in one transaction. Replaces per-SKU\nPromise.all in the frontend. Both category and status are settable;\nat least one of them must be present in the body.\n\nReturns updated_count (excludes ids not in this tenant \u2014 silently\nskipped by the tenant-scoped UPDATE).",
        "operationId": "bulk_update_skus_api_v1_skus_bulk_patch",
        "parameters": [
          {
            "in": "header",
            "name": "Authorization",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Authorization"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-Tenant-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-Tenant-Id"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-User-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-User-Id"
            }
          },
          {
            "in": "header",
            "name": "accept-language",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Accept-Language"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SkuBulkUpdate"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SkuBulkUpdateResponse"
                }
              }
            },
            "description": "Successful Response"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            },
            "description": "Validation Error"
          }
        },
        "summary": "Bulk Update Skus",
        "tags": [
          "skus"
        ]
      }
    },
    "/api/v1/skus/floors": {
      "post": {
        "description": "Bulk-set the guardrail band (floor and/or ceiling) for a SKU-id list.\nGuardrail data \u2192 always allowed (not gated by a webshop being master).",
        "operationId": "bulk_set_floors_api_v1_skus_floors_post",
        "parameters": [
          {
            "in": "header",
            "name": "Authorization",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Authorization"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-Tenant-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-Tenant-Id"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-User-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-User-Id"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/BulkFloorRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BulkFloorResponse"
                }
              }
            },
            "description": "Successful Response"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            },
            "description": "Validation Error"
          }
        },
        "summary": "Bulk Set Floors",
        "tags": [
          "skus"
        ]
      }
    },
    "/api/v1/skus/import": {
      "post": {
        "description": "One-shot bulk-import (no preview step). Required headers: sku, ean,\nname, category. Accepts .csv (UTF-8) or .xlsx. For interactive AI-assisted\nmapping use the /import/preview + /import/confirm pair instead.",
        "operationId": "import_csv_api_v1_skus_import_post",
        "parameters": [
          {
            "in": "header",
            "name": "Authorization",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Authorization"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-Tenant-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-Tenant-Id"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-User-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-User-Id"
            }
          },
          {
            "in": "header",
            "name": "accept-language",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Accept-Language"
            }
          }
        ],
        "requestBody": {
          "content": {
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/Body_import_csv_api_v1_skus_import_post"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SkuCsvImportResponse"
                }
              }
            },
            "description": "Successful Response"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            },
            "description": "Validation Error"
          }
        },
        "summary": "Import Csv",
        "tags": [
          "skus"
        ]
      }
    },
    "/api/v1/skus/import/confirm": {
      "post": {
        "description": "Step 2 \u2014 user has reviewed/edited the mapping; run the actual\nupsert. Token is single-use, expires in 30 min.",
        "operationId": "confirm_import_api_v1_skus_import_confirm_post",
        "parameters": [
          {
            "in": "header",
            "name": "Authorization",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Authorization"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-Tenant-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-Tenant-Id"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-User-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-User-Id"
            }
          },
          {
            "in": "header",
            "name": "accept-language",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Accept-Language"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SkuImportConfirmRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SkuCsvImportResponse"
                }
              }
            },
            "description": "Successful Response"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            },
            "description": "Validation Error"
          }
        },
        "summary": "Confirm Import",
        "tags": [
          "skus"
        ]
      }
    },
    "/api/v1/skus/import/issues-report": {
      "post": {
        "description": "Mail the full list of problem rows for a previewed upload.\n\nSame body as confirm \u2014 the customer asks for this while looking at the\npreview, with the mapping he is about to use. Nothing is imported and the\nupload token stays valid, so he can repair the file or go ahead anyway.",
        "operationId": "email_import_issue_report_api_v1_skus_import_issues_report_post",
        "parameters": [
          {
            "in": "header",
            "name": "Authorization",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Authorization"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-Tenant-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-Tenant-Id"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-User-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-User-Id"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SkuImportConfirmRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ImportIssueReportResponse"
                }
              }
            },
            "description": "Successful Response"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            },
            "description": "Validation Error"
          }
        },
        "summary": "Email Import Issue Report",
        "tags": [
          "skus"
        ]
      }
    },
    "/api/v1/skus/import/preview": {
      "post": {
        "description": "Step 1 of the AI-assisted import flow. Detects column mapping\n(heuristics + AI fallback) and returns a 5-row sample showing how the\nrows will look after normalisation. Accepts .csv (UTF-8) or .xlsx \u2014\nextension drives the parser. The bytes are cached server-side under the\nreturned token; user confirms in step 2 with the (possibly edited)\nmapping.",
        "operationId": "preview_import_api_v1_skus_import_preview_post",
        "parameters": [
          {
            "in": "header",
            "name": "Authorization",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Authorization"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-Tenant-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-Tenant-Id"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-User-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-User-Id"
            }
          }
        ],
        "requestBody": {
          "content": {
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/Body_preview_import_api_v1_skus_import_preview_post"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SkuImportPreviewResponse"
                }
              }
            },
            "description": "Successful Response"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            },
            "description": "Validation Error"
          }
        },
        "summary": "Preview Import",
        "tags": [
          "skus"
        ]
      }
    },
    "/api/v1/skus/price-coverage": {
      "get": {
        "description": "How much of the catalogue can produce an alert at all.\n\nEvery alert detector gates on COALESCE(sell_price_cents, msrp_cents) IS NOT\nNULL, so a SKU without a reference price is invisible to all of them \u2014 not\nan error anywhere, just silence. This endpoint is what makes that silence\nvisible. Declared above /{sku_id} on purpose: the other order makes this\npath match the id route and 422.",
        "operationId": "get_price_coverage_api_v1_skus_price_coverage_get",
        "parameters": [
          {
            "in": "header",
            "name": "Authorization",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Authorization"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-Tenant-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-Tenant-Id"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-User-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-User-Id"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SkuPriceCoverage"
                }
              }
            },
            "description": "Successful Response"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            },
            "description": "Validation Error"
          }
        },
        "summary": "Get Price Coverage",
        "tags": [
          "skus"
        ]
      }
    },
    "/api/v1/skus/search": {
      "get": {
        "description": "Autocomplete typeahead \u2014 used by SKU pickers in Match Queue, Alerts,\nTrends. Returns only ACTIVE SKUs.",
        "operationId": "search_skus_api_v1_skus_search_get",
        "parameters": [
          {
            "description": "Substring across sku/ean/name",
            "in": "query",
            "name": "q",
            "required": true,
            "schema": {
              "description": "Substring across sku/ean/name",
              "maxLength": 64,
              "minLength": 2,
              "title": "Q",
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "default": 10,
              "maximum": 25,
              "minimum": 1,
              "title": "Limit",
              "type": "integer"
            }
          },
          {
            "in": "header",
            "name": "Authorization",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Authorization"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-Tenant-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-Tenant-Id"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-User-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-User-Id"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/SkuSearchHit"
                  },
                  "title": "Response Search Skus Api V1 Skus Search Get",
                  "type": "array"
                }
              }
            },
            "description": "Successful Response"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            },
            "description": "Validation Error"
          }
        },
        "summary": "Search Skus",
        "tags": [
          "skus"
        ]
      }
    },
    "/api/v1/skus/{sku_id}": {
      "delete": {
        "operationId": "delete_sku_api_v1_skus__sku_id__delete",
        "parameters": [
          {
            "in": "path",
            "name": "sku_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Sku Id",
              "type": "string"
            }
          },
          {
            "in": "header",
            "name": "Authorization",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Authorization"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-Tenant-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-Tenant-Id"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-User-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-User-Id"
            }
          },
          {
            "in": "header",
            "name": "accept-language",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Accept-Language"
            }
          }
        ],
        "responses": {
          "204": {
            "description": "Successful Response"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            },
            "description": "Validation Error"
          }
        },
        "summary": "Delete Sku",
        "tags": [
          "skus"
        ]
      },
      "get": {
        "operationId": "get_sku_api_v1_skus__sku_id__get",
        "parameters": [
          {
            "in": "path",
            "name": "sku_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Sku Id",
              "type": "string"
            }
          },
          {
            "in": "header",
            "name": "Authorization",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Authorization"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-Tenant-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-Tenant-Id"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-User-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-User-Id"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SkuResponse"
                }
              }
            },
            "description": "Successful Response"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            },
            "description": "Validation Error"
          }
        },
        "summary": "Get Sku",
        "tags": [
          "skus"
        ]
      },
      "patch": {
        "operationId": "update_sku_api_v1_skus__sku_id__patch",
        "parameters": [
          {
            "in": "path",
            "name": "sku_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Sku Id",
              "type": "string"
            }
          },
          {
            "in": "header",
            "name": "Authorization",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Authorization"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-Tenant-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-Tenant-Id"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-User-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-User-Id"
            }
          },
          {
            "in": "header",
            "name": "accept-language",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Accept-Language"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SkuUpdate"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SkuResponse"
                }
              }
            },
            "description": "Successful Response"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            },
            "description": "Validation Error"
          }
        },
        "summary": "Update Sku",
        "tags": [
          "skus"
        ]
      }
    },
    "/api/v1/skus/{sku_id}/listings": {
      "get": {
        "description": "Recent competitor listings matched to this SKU. Powers the SKU\ndetail drawer's 'Linked listings' section.",
        "operationId": "get_sku_linked_listings_api_v1_skus__sku_id__listings_get",
        "parameters": [
          {
            "in": "path",
            "name": "sku_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Sku Id",
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "default": 50,
              "maximum": 200,
              "minimum": 1,
              "title": "Limit",
              "type": "integer"
            }
          },
          {
            "in": "header",
            "name": "Authorization",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Authorization"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-Tenant-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-Tenant-Id"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-User-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-User-Id"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/SkuLinkedListing"
                  },
                  "title": "Response Get Sku Linked Listings Api V1 Skus  Sku Id  Listings Get",
                  "type": "array"
                }
              }
            },
            "description": "Successful Response"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            },
            "description": "Validation Error"
          }
        },
        "summary": "Get Sku Linked Listings",
        "tags": [
          "skus"
        ]
      }
    },
    "/api/v1/skus/{sku_id}/match-audit": {
      "get": {
        "description": "Recent match-audit-trail entries that decided this SKU as the match.",
        "operationId": "get_sku_match_audit_api_v1_skus__sku_id__match_audit_get",
        "parameters": [
          {
            "in": "path",
            "name": "sku_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Sku Id",
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "default": 10,
              "maximum": 50,
              "minimum": 1,
              "title": "Limit",
              "type": "integer"
            }
          },
          {
            "in": "header",
            "name": "Authorization",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Authorization"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-Tenant-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-Tenant-Id"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-User-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-User-Id"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/SkuMatchAuditEntry"
                  },
                  "title": "Response Get Sku Match Audit Api V1 Skus  Sku Id  Match Audit Get",
                  "type": "array"
                }
              }
            },
            "description": "Successful Response"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            },
            "description": "Validation Error"
          }
        },
        "summary": "Get Sku Match Audit",
        "tags": [
          "skus"
        ]
      }
    },
    "/api/v1/skus/{sku_id}/price": {
      "patch": {
        "description": "Set price-setup fields for one SKU/country. Floor/ceiling are always\neditable (customer-owned guardrail); cost/msrp are 409'd while a webshop is\nmaster. No `block_if_webshop_active` dependency \u2014 the gate is selective.",
        "operationId": "set_sku_price_api_v1_skus__sku_id__price_patch",
        "parameters": [
          {
            "in": "path",
            "name": "sku_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Sku Id",
              "type": "string"
            }
          },
          {
            "in": "header",
            "name": "Authorization",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Authorization"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-Tenant-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-Tenant-Id"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-User-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-User-Id"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PriceSetupUpdate"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SkuReferencePrice"
                }
              }
            },
            "description": "Successful Response"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            },
            "description": "Validation Error"
          }
        },
        "summary": "Set Sku Price",
        "tags": [
          "skus"
        ]
      }
    },
    "/api/v1/skus/{sku_id}/reference-prices": {
      "get": {
        "description": "Per-country price rows (MSRP / sell / cost / guardrail band) for a SKU.",
        "operationId": "get_sku_reference_prices_api_v1_skus__sku_id__reference_prices_get",
        "parameters": [
          {
            "in": "path",
            "name": "sku_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Sku Id",
              "type": "string"
            }
          },
          {
            "in": "header",
            "name": "Authorization",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Authorization"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-Tenant-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-Tenant-Id"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-User-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-User-Id"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/SkuReferencePrice"
                  },
                  "title": "Response Get Sku Reference Prices Api V1 Skus  Sku Id  Reference Prices Get",
                  "type": "array"
                }
              }
            },
            "description": "Successful Response"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            },
            "description": "Validation Error"
          }
        },
        "summary": "Get Sku Reference Prices",
        "tags": [
          "skus"
        ]
      }
    },
    "/api/v1/trends/category-rollup": {
      "get": {
        "description": "Per-category market-trend roll-up: sparkline \u00b7 net \u25b2\u25bc \u00b7 your position \u00b7\n\u20ac under pressure. The scale answer \u2014 10k SKUs collapse to ~6 rows.\n\n`category`/`facets` narrow the SKU set aggregated (facet-filter sidebar);\nboth absent \u2192 identical to the pre-facet-filter behaviour.",
        "operationId": "get_category_rollup_api_v1_trends_category_rollup_get",
        "parameters": [
          {
            "in": "query",
            "name": "days",
            "required": false,
            "schema": {
              "default": 30,
              "maximum": 365,
              "minimum": 1,
              "title": "Days",
              "type": "integer"
            }
          },
          {
            "description": "Window start (inclusive, YYYY-MM-DD). With `end`, overrides `days`.",
            "in": "query",
            "name": "start",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "format": "date",
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Window start (inclusive, YYYY-MM-DD). With `end`, overrides `days`.",
              "title": "Start"
            }
          },
          {
            "description": "Window end (inclusive, YYYY-MM-DD). With `start`, overrides `days`.",
            "in": "query",
            "name": "end",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "format": "date",
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Window end (inclusive, YYYY-MM-DD). With `start`, overrides `days`.",
              "title": "End"
            }
          },
          {
            "description": "Category slug",
            "in": "query",
            "name": "category",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Category slug",
              "title": "Category"
            }
          },
          {
            "description": "JSON object of facet key -> selected values, e.g. {\"fabrikant\":[\"Fjordlund\"]}. OR within a key, AND across keys \u2014 mirrors the frontend's matchFacets.",
            "in": "query",
            "name": "facets",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "JSON object of facet key -> selected values, e.g. {\"fabrikant\":[\"Fjordlund\"]}. OR within a key, AND across keys \u2014 mirrors the frontend's matchFacets.",
              "title": "Facets"
            }
          },
          {
            "in": "header",
            "name": "Authorization",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Authorization"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-Tenant-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-Tenant-Id"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-User-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-User-Id"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CategoryRollupResponse"
                }
              }
            },
            "description": "Successful Response"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            },
            "description": "Validation Error"
          }
        },
        "summary": "Get Category Rollup",
        "tags": [
          "trends"
        ]
      }
    },
    "/api/v1/trends/portfolio": {
      "get": {
        "description": "Portfolio-versus-market band (with cheapest\u2194dearest spread), KPI-strip\naggregates, and the weekly price-leader \u2014 all over price_observation.\n\n`category`/`facets` narrow the SKU set aggregated (facet-filter sidebar);\nboth absent \u2192 identical to the pre-facet-filter behaviour.",
        "operationId": "get_portfolio_trends_api_v1_trends_portfolio_get",
        "parameters": [
          {
            "in": "query",
            "name": "days",
            "required": false,
            "schema": {
              "default": 30,
              "maximum": 365,
              "minimum": 1,
              "title": "Days",
              "type": "integer"
            }
          },
          {
            "description": "Window start (inclusive, YYYY-MM-DD). With `end`, overrides `days`.",
            "in": "query",
            "name": "start",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "format": "date",
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Window start (inclusive, YYYY-MM-DD). With `end`, overrides `days`.",
              "title": "Start"
            }
          },
          {
            "description": "Window end (inclusive, YYYY-MM-DD). With `start`, overrides `days`.",
            "in": "query",
            "name": "end",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "format": "date",
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Window end (inclusive, YYYY-MM-DD). With `start`, overrides `days`.",
              "title": "End"
            }
          },
          {
            "description": "Category slug",
            "in": "query",
            "name": "category",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Category slug",
              "title": "Category"
            }
          },
          {
            "description": "JSON object of facet key -> selected values, e.g. {\"fabrikant\":[\"Fjordlund\"]}. OR within a key, AND across keys \u2014 mirrors the frontend's matchFacets.",
            "in": "query",
            "name": "facets",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "JSON object of facet key -> selected values, e.g. {\"fabrikant\":[\"Fjordlund\"]}. OR within a key, AND across keys \u2014 mirrors the frontend's matchFacets.",
              "title": "Facets"
            }
          },
          {
            "in": "header",
            "name": "Authorization",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Authorization"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-Tenant-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-Tenant-Id"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-User-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-User-Id"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TrendsPortfolioResponse"
                }
              }
            },
            "description": "Successful Response"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            },
            "description": "Validation Error"
          }
        },
        "summary": "Get Portfolio Trends",
        "tags": [
          "trends"
        ]
      }
    },
    "/api/v1/trends/sku/{sku_id}": {
      "get": {
        "operationId": "get_sku_trend_api_v1_trends_sku__sku_id__get",
        "parameters": [
          {
            "in": "path",
            "name": "sku_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Sku Id",
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "days",
            "required": false,
            "schema": {
              "default": 90,
              "maximum": 365,
              "minimum": 1,
              "title": "Days",
              "type": "integer"
            }
          },
          {
            "description": "Window start (inclusive, YYYY-MM-DD). With `end`, overrides `days`.",
            "in": "query",
            "name": "start",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "format": "date",
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Window start (inclusive, YYYY-MM-DD). With `end`, overrides `days`.",
              "title": "Start"
            }
          },
          {
            "description": "Window end (inclusive, YYYY-MM-DD). With `start`, overrides `days`.",
            "in": "query",
            "name": "end",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "format": "date",
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Window end (inclusive, YYYY-MM-DD). With `start`, overrides `days`.",
              "title": "End"
            }
          },
          {
            "in": "header",
            "name": "Authorization",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Authorization"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-Tenant-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-Tenant-Id"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-User-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-User-Id"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SkuTrendResponse"
                }
              }
            },
            "description": "Successful Response"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            },
            "description": "Validation Error"
          }
        },
        "summary": "Get Sku Trend",
        "tags": [
          "trends"
        ]
      }
    },
    "/api/v1/trends/top-movers": {
      "get": {
        "description": "Biggest competitor price-moves ranked by \u20ac at stake (not %). Each move\nis neutral-direction with a meaning-for-you (drop = pressure, rise = room).\n\n`category`/`facets` narrow the SKU set aggregated (facet-filter sidebar);\nboth absent \u2192 identical to the pre-facet-filter behaviour.",
        "operationId": "get_top_movers_api_v1_trends_top_movers_get",
        "parameters": [
          {
            "in": "query",
            "name": "days",
            "required": false,
            "schema": {
              "default": 30,
              "maximum": 365,
              "minimum": 1,
              "title": "Days",
              "type": "integer"
            }
          },
          {
            "description": "Window start (inclusive, YYYY-MM-DD). With `end`, overrides `days`.",
            "in": "query",
            "name": "start",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "format": "date",
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Window start (inclusive, YYYY-MM-DD). With `end`, overrides `days`.",
              "title": "Start"
            }
          },
          {
            "description": "Window end (inclusive, YYYY-MM-DD). With `start`, overrides `days`.",
            "in": "query",
            "name": "end",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "format": "date",
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Window end (inclusive, YYYY-MM-DD). With `start`, overrides `days`.",
              "title": "End"
            }
          },
          {
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "default": 5,
              "maximum": 20,
              "minimum": 1,
              "title": "Limit",
              "type": "integer"
            }
          },
          {
            "description": "Category slug",
            "in": "query",
            "name": "category",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Category slug",
              "title": "Category"
            }
          },
          {
            "description": "JSON object of facet key -> selected values, e.g. {\"fabrikant\":[\"Fjordlund\"]}. OR within a key, AND across keys \u2014 mirrors the frontend's matchFacets.",
            "in": "query",
            "name": "facets",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "description": "JSON object of facet key -> selected values, e.g. {\"fabrikant\":[\"Fjordlund\"]}. OR within a key, AND across keys \u2014 mirrors the frontend's matchFacets.",
              "title": "Facets"
            }
          },
          {
            "in": "header",
            "name": "Authorization",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Authorization"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-Tenant-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-Tenant-Id"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-User-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-User-Id"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TrendMoversResponse"
                }
              }
            },
            "description": "Successful Response"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            },
            "description": "Validation Error"
          }
        },
        "summary": "Get Top Movers",
        "tags": [
          "trends"
        ]
      }
    },
    "/api/v1/webhooks": {
      "get": {
        "operationId": "list_endpoints_api_v1_webhooks_get",
        "parameters": [
          {
            "in": "header",
            "name": "Authorization",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Authorization"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-Tenant-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-Tenant-Id"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-User-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-User-Id"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WebhookEndpointListResponse"
                }
              }
            },
            "description": "Successful Response"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            },
            "description": "Validation Error"
          }
        },
        "summary": "List Endpoints",
        "tags": [
          "webhooks"
        ]
      },
      "post": {
        "operationId": "create_endpoint_api_v1_webhooks_post",
        "parameters": [
          {
            "in": "header",
            "name": "Authorization",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Authorization"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-Tenant-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-Tenant-Id"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-User-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-User-Id"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/WebhookEndpointCreate"
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WebhookEndpointCreateResponse"
                }
              }
            },
            "description": "Successful Response"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            },
            "description": "Validation Error"
          }
        },
        "summary": "Create Endpoint",
        "tags": [
          "webhooks"
        ]
      }
    },
    "/api/v1/webhooks/deliveries": {
      "get": {
        "operationId": "list_deliveries_api_v1_webhooks_deliveries_get",
        "parameters": [
          {
            "in": "query",
            "name": "endpoint_id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "format": "uuid",
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Endpoint Id"
            }
          },
          {
            "in": "query",
            "name": "status",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "$ref": "#/components/schemas/WebhookDeliveryStatus"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Status"
            }
          },
          {
            "in": "query",
            "name": "limit",
            "required": false,
            "schema": {
              "default": 50,
              "maximum": 200,
              "minimum": 1,
              "title": "Limit",
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "offset",
            "required": false,
            "schema": {
              "default": 0,
              "minimum": 0,
              "title": "Offset",
              "type": "integer"
            }
          },
          {
            "in": "header",
            "name": "Authorization",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Authorization"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-Tenant-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-Tenant-Id"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-User-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-User-Id"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WebhookDeliveryListResponse"
                }
              }
            },
            "description": "Successful Response"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            },
            "description": "Validation Error"
          }
        },
        "summary": "List Deliveries",
        "tags": [
          "webhooks"
        ]
      }
    },
    "/api/v1/webhooks/{endpoint_id}": {
      "delete": {
        "operationId": "delete_endpoint_api_v1_webhooks__endpoint_id__delete",
        "parameters": [
          {
            "in": "path",
            "name": "endpoint_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Endpoint Id",
              "type": "string"
            }
          },
          {
            "in": "header",
            "name": "Authorization",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Authorization"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-Tenant-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-Tenant-Id"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-User-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-User-Id"
            }
          }
        ],
        "responses": {
          "204": {
            "description": "Successful Response"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            },
            "description": "Validation Error"
          }
        },
        "summary": "Delete Endpoint",
        "tags": [
          "webhooks"
        ]
      },
      "patch": {
        "operationId": "update_endpoint_api_v1_webhooks__endpoint_id__patch",
        "parameters": [
          {
            "in": "path",
            "name": "endpoint_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Endpoint Id",
              "type": "string"
            }
          },
          {
            "in": "header",
            "name": "Authorization",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Authorization"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-Tenant-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-Tenant-Id"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-User-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-User-Id"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/WebhookEndpointUpdate"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WebhookEndpointItem"
                }
              }
            },
            "description": "Successful Response"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            },
            "description": "Validation Error"
          }
        },
        "summary": "Update Endpoint",
        "tags": [
          "webhooks"
        ]
      }
    },
    "/api/v1/webhooks/{endpoint_id}/rotate-secret": {
      "post": {
        "description": "A new secret, shown once. Deliveries carry a signature for both the new\nand the old secret for 24 hours, so the receiver can be switched over\nwithout missing one.",
        "operationId": "rotate_secret_api_v1_webhooks__endpoint_id__rotate_secret_post",
        "parameters": [
          {
            "in": "path",
            "name": "endpoint_id",
            "required": true,
            "schema": {
              "format": "uuid",
              "title": "Endpoint Id",
              "type": "string"
            }
          },
          {
            "in": "header",
            "name": "Authorization",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "Authorization"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-Tenant-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-Tenant-Id"
            }
          },
          {
            "in": "header",
            "name": "X-Mock-User-Id",
            "required": false,
            "schema": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ],
              "title": "X-Mock-User-Id"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WebhookSecretRotated"
                }
              }
            },
            "description": "Successful Response"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HTTPValidationError"
                }
              }
            },
            "description": "Validation Error"
          }
        },
        "summary": "Rotate Secret",
        "tags": [
          "webhooks"
        ]
      }
    }
  },
  "security": [
    {
      "apiKey": []
    }
  ],
  "servers": [
    {
      "url": "https://priceq.outflanq.com"
    }
  ]
}
