{"openapi":"3.0.3","info":{"title":"Zederkof Stock — Read-only API","version":"1.0.0","description":"Read-only access to the Zederkof Stock system: products, stock levels, alert rules, stockout history, demand forecasts and sales aggregates. All endpoints are GET only."},"servers":[{"url":"https://stock.zederkof.dk/api/v1"}],"security":[{"bearerAuth":[]},{"apiKeyHeader":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","description":"Read-only access token."},"apiKeyHeader":{"type":"apiKey","in":"header","name":"X-API-Key","description":"Read-only access token."}},"schemas":{"Pagination":{"type":"object","properties":{"page":{"type":"integer"},"limit":{"type":"integer"},"total":{"type":"integer"},"totalPages":{"type":"integer"},"hasMore":{"type":"boolean"}}},"Meta":{"type":"object","properties":{"resource":{"type":"string"},"version":{"type":"string"},"generatedAt":{"type":"string","format":"date-time"}}},"Error":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"}}}}},"Product":{"type":"object","properties":{"id":{"type":"string"},"sku":{"type":"string"},"variantCode":{"type":"string","nullable":true},"description":{"type":"string"},"availableForSale":{"type":"integer"},"category":{"type":"string","nullable":true},"productStatus":{"type":"string","enum":["BESTILLING","LAGERVARER","SÆSON","UDGÅR","UKENDT"]},"productStatusOverridden":{"type":"boolean"},"lastUpdated":{"type":"string","format":"date-time","nullable":true},"lastStockActivity":{"type":"string","format":"date","nullable":true},"isFavorite":{"type":"boolean"},"alertCount":{"type":"integer"},"forecastMonths":{"type":"integer"}}},"Alert":{"type":"object","properties":{"alertId":{"type":"integer"},"productId":{"type":"string"},"sku":{"type":"string"},"description":{"type":"string"},"availableForSale":{"type":"integer"},"threshold":{"type":"integer"},"season":{"type":"object","properties":{"startMonth":{"type":"integer","nullable":true},"startDay":{"type":"integer","nullable":true},"endMonth":{"type":"integer","nullable":true},"endDay":{"type":"integer","nullable":true}}},"alertSentSinceRestock":{"type":"boolean"}}},"Forecast":{"type":"object","properties":{"sku":{"type":"string"},"variantCode":{"type":"string"},"month":{"type":"integer"},"avgDailyDemand":{"type":"number"},"stddevDailyDemand":{"type":"number"},"seasonalIndex":{"type":"number"},"reorderPoint":{"type":"number"},"safetyStock":{"type":"number"},"leadTimeDays":{"type":"integer"},"serviceLevel":{"type":"number"},"yearsOfData":{"type":"integer"},"trendPct":{"type":"number","nullable":true},"trendDirection":{"type":"string","nullable":true},"confidence":{"type":"string","nullable":true},"avgRevenuePerUnit":{"type":"number","nullable":true},"lastComputed":{"type":"string","format":"date-time"}}}}},"paths":{"/summary":{"get":{"summary":"Aggregate dashboard counts for the whole system.","responses":{"200":{"description":"OK"}}}},"/products":{"get":{"summary":"List products with stock levels.","parameters":[{"name":"page","in":"query","schema":{"type":"integer","default":1,"minimum":1},"description":"Page number."},{"name":"limit","in":"query","schema":{"type":"integer","default":100,"maximum":500},"description":"Items per page (max 500)."},{"name":"sku","in":"query","schema":{"type":"string"},"description":"Filter by SKU."},{"name":"search","in":"query","schema":{"type":"string"},"description":"Free-text match on id, description, sku, variantCode."},{"name":"stockStatus","in":"query","schema":{"type":"string","enum":["in-stock","no-stock","all"],"default":"all"}},{"name":"productStatuses","in":"query","schema":{"type":"string"},"description":"Comma-separated lifecycle statuses."},{"name":"category","in":"query","schema":{"type":"string"}},{"name":"favorites","in":"query","schema":{"type":"boolean"}},{"name":"hasForecast","in":"query","schema":{"type":"boolean"}},{"name":"sort","in":"query","schema":{"type":"string","enum":["sku","description","availableForSale","lastUpdated","lastStockActivity","category","productStatus","id"],"default":"sku"}},{"name":"order","in":"query","schema":{"type":"string","enum":["asc","desc"],"default":"asc"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Product"}},"pagination":{"$ref":"#/components/schemas/Pagination"},"meta":{"$ref":"#/components/schemas/Meta"}}}}}}}}},"/products/{idOrSku}":{"get":{"summary":"A single product by BC systemId or SKU.","parameters":[{"name":"idOrSku","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/categories":{"get":{"summary":"Distinct product categories with counts.","responses":{"200":{"description":"OK"}}}},"/alerts":{"get":{"summary":"Stock-level alert rules.","parameters":[{"name":"productId","in":"query","schema":{"type":"string"}},{"name":"sku","in":"query","schema":{"type":"string"},"description":"Filter by SKU."},{"name":"page","in":"query","schema":{"type":"integer","default":1,"minimum":1},"description":"Page number."},{"name":"limit","in":"query","schema":{"type":"integer","default":100,"maximum":500},"description":"Items per page (max 500)."}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Alert"}},"pagination":{"$ref":"#/components/schemas/Pagination"},"meta":{"$ref":"#/components/schemas/Meta"}}}}}}}}},"/stockouts/daily":{"get":{"summary":"Day-by-day lost sales / quantity during stockouts.","parameters":[{"name":"sku","in":"query","schema":{"type":"string"},"description":"Filter by SKU."},{"name":"startDate","in":"query","schema":{"type":"string","format":"date"}},{"name":"endDate","in":"query","schema":{"type":"string","format":"date"}},{"name":"page","in":"query","schema":{"type":"integer","default":1,"minimum":1},"description":"Page number."},{"name":"limit","in":"query","schema":{"type":"integer","default":100,"maximum":500},"description":"Items per page (max 500)."}],"responses":{"200":{"description":"OK"}}}},"/stockouts/events":{"get":{"summary":"Zero / restock events with causes.","parameters":[{"name":"sku","in":"query","schema":{"type":"string"},"description":"Filter by SKU."},{"name":"eventType","in":"query","schema":{"type":"string","enum":["zero","restock"]}},{"name":"startDate","in":"query","schema":{"type":"string","format":"date"}},{"name":"endDate","in":"query","schema":{"type":"string","format":"date"}},{"name":"page","in":"query","schema":{"type":"integer","default":1,"minimum":1},"description":"Page number."},{"name":"limit","in":"query","schema":{"type":"integer","default":100,"maximum":500},"description":"Items per page (max 500)."}],"responses":{"200":{"description":"OK"}}}},"/stockouts/periods":{"get":{"summary":"Ledger-derived stockout periods.","parameters":[{"name":"sku","in":"query","schema":{"type":"string"},"description":"Filter by SKU."},{"name":"ongoing","in":"query","schema":{"type":"boolean"}},{"name":"page","in":"query","schema":{"type":"integer","default":1,"minimum":1},"description":"Page number."},{"name":"limit","in":"query","schema":{"type":"integer","default":100,"maximum":500},"description":"Items per page (max 500)."}],"responses":{"200":{"description":"OK"}}}},"/forecasts":{"get":{"summary":"Seasonal demand forecasts & reorder points.","parameters":[{"name":"sku","in":"query","schema":{"type":"string"},"description":"Filter by SKU."},{"name":"variantCode","in":"query","schema":{"type":"string"}},{"name":"month","in":"query","schema":{"type":"integer","minimum":1,"maximum":12}},{"name":"page","in":"query","schema":{"type":"integer","default":1,"minimum":1},"description":"Page number."},{"name":"limit","in":"query","schema":{"type":"integer","default":100,"maximum":500},"description":"Items per page (max 500)."}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Forecast"}},"pagination":{"$ref":"#/components/schemas/Pagination"},"meta":{"$ref":"#/components/schemas/Meta"}}}}}}}}},"/sales-cache":{"get":{"summary":"Cached sales aggregates.","parameters":[{"name":"sku","in":"query","schema":{"type":"string"},"description":"Filter by SKU."},{"name":"includeRaw","in":"query","schema":{"type":"boolean"}},{"name":"page","in":"query","schema":{"type":"integer","default":1,"minimum":1},"description":"Page number."},{"name":"limit","in":"query","schema":{"type":"integer","default":100,"maximum":500},"description":"Items per page (max 500)."}],"responses":{"200":{"description":"OK"}}}},"/calendar-events":{"get":{"summary":"Calendar events for chart highlights.","parameters":[{"name":"page","in":"query","schema":{"type":"integer","default":1,"minimum":1},"description":"Page number."},{"name":"limit","in":"query","schema":{"type":"integer","default":100,"maximum":500},"description":"Items per page (max 500)."}],"responses":{"200":{"description":"OK"}}}},"/sku-merge-groups":{"get":{"summary":"SKU merge groups with members.","responses":{"200":{"description":"OK"}}}},"/favorites":{"get":{"summary":"Favorited products.","responses":{"200":{"description":"OK"}}}},"/assembly-components":{"get":{"summary":"BOM relations (parent -> component).","parameters":[{"name":"parentSku","in":"query","schema":{"type":"string"}},{"name":"componentSku","in":"query","schema":{"type":"string"}},{"name":"page","in":"query","schema":{"type":"integer","default":1,"minimum":1},"description":"Page number."},{"name":"limit","in":"query","schema":{"type":"integer","default":100,"maximum":500},"description":"Items per page (max 500)."}],"responses":{"200":{"description":"OK"}}}}}}