{
  "openapi": "3.1.0",
  "info": {
    "title": "Freeze-Dried.co Product Catalog API",
    "version": "1.0.0",
    "description": "Read-only public catalog of freeze-dried fruits, vegetables, and dairy products supplied by Freeze-Dried.co. Includes category groupings, available forms (whole/sliced/diced/powder), nutritional data, shelf-life, packaging, and B2B sourcing metadata. Pricing is contact-for-quote and intentionally excluded from this API.",
    "termsOfService": "https://freeze-dried.co/en/terms-of-service",
    "contact": {
      "name": "Freeze-Dried.co Sales",
      "url": "https://freeze-dried.co/en/contact",
      "email": "hello@freeze-dried.co"
    },
    "license": {
      "name": "Public catalog (attribution required)",
      "url": "https://freeze-dried.co/en/privacy-policy"
    }
  },
  "servers": [
    {
      "url": "https://freeze-dried.co",
      "description": "Production"
    }
  ],
  "externalDocs": {
    "description": "Human-readable interactive API reference",
    "url": "https://freeze-dried.co/api-docs"
  },
  "tags": [
    {
      "name": "Catalog",
      "description": "Public catalog of freeze-dried products grouped by category."
    }
  ],
  "paths": {
    "/api/products": {
      "get": {
        "tags": [
          "Catalog"
        ],
        "summary": "Get the full product catalog",
        "description": "Returns the complete Freeze-Dried.co product catalog grouped by category (Berries, Citrus, Stone Fruits, Exotic, Vegetables, Dairy). Each product includes available forms, nutritional values per 100g of the fresh source fruit, moisture content, shelf life, packaging options, and minimum order quantity. Static data, refreshed when the catalog is updated. No authentication required.",
        "operationId": "getProducts",
        "responses": {
          "200": {
            "description": "Catalog payload",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Catalog"
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "Catalog": {
        "type": "object",
        "required": [
          "site",
          "brand",
          "license",
          "specVersion",
          "categoryCount",
          "productCount",
          "categories",
          "allProducts"
        ],
        "properties": {
          "site": {
            "type": "string",
            "format": "uri",
            "example": "https://freeze-dried.co"
          },
          "brand": {
            "type": "string",
            "example": "Freeze-Dried.co"
          },
          "license": {
            "type": "string"
          },
          "notice": {
            "type": "string",
            "description": "Operational notice. Pricing is excluded by design."
          },
          "specVersion": {
            "type": "string",
            "description": "Catalog payload schema version. Bumps on response-shape changes.",
            "example": "1.0.0"
          },
          "generatedAt": {
            "type": "string",
            "description": "Marker indicating the catalog is baked at build time.",
            "example": "build-time"
          },
          "countryOfOrigin": {
            "type": "string",
            "example": "Turkey"
          },
          "certifications": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Certification"
            }
          },
          "categoryCount": {
            "type": "integer",
            "minimum": 0
          },
          "productCount": {
            "type": "integer",
            "minimum": 0
          },
          "categories": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Category"
            }
          },
          "allProducts": {
            "type": "array",
            "description": "Flat list of every product in the catalog. Convenience field for clients that do not need the category grouping.",
            "items": {
              "$ref": "#/components/schemas/Product"
            }
          }
        }
      },
      "Certification": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "example": "iso22000"
          },
          "name": {
            "type": "string",
            "example": "ISO 22000"
          },
          "fullName": {
            "type": "string",
            "example": "Food Safety Management System"
          }
        }
      },
      "Category": {
        "type": "object",
        "required": [
          "slug",
          "name",
          "productCount",
          "products"
        ],
        "properties": {
          "slug": {
            "type": "string",
            "example": "berries"
          },
          "name": {
            "type": "string",
            "example": "Berries"
          },
          "url": {
            "type": "string",
            "format": "uri"
          },
          "productCount": {
            "type": "integer",
            "minimum": 0
          },
          "products": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Product"
            }
          }
        }
      },
      "Product": {
        "type": "object",
        "required": [
          "id",
          "name",
          "slug",
          "url",
          "categories",
          "forms"
        ],
        "properties": {
          "id": {
            "type": "string",
            "example": "strawberry"
          },
          "name": {
            "type": "string",
            "example": "Strawberry"
          },
          "slug": {
            "type": "string",
            "example": "strawberry"
          },
          "url": {
            "type": "string",
            "format": "uri"
          },
          "categories": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "All category labels this product belongs to."
          },
          "tags": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Free-form tags (e.g. 'popular')."
          },
          "forms": {
            "type": "array",
            "items": {
              "type": "string",
              "enum": [
                "Whole",
                "Halves",
                "Sliced",
                "Diced",
                "Crumble",
                "Powder",
                "Chips"
              ]
            },
            "description": "Available freeze-dried formats for this product."
          },
          "color": {
            "type": "string",
            "description": "Brand-anchor hex color for this product.",
            "example": "#e53935"
          },
          "image": {
            "type": "string",
            "format": "uri"
          },
          "intro": {
            "type": [
              "string",
              "null"
            ]
          },
          "useCases": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Typical B2B applications (cereal toppings, smoothies, etc.)."
          },
          "keywords": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Search keywords associated with this product."
          },
          "nutritionPer100gFresh": {
            "anyOf": [
              {
                "type": "null"
              },
              {
                "$ref": "#/components/schemas/Nutrition"
              }
            ],
            "description": "Macronutrients per 100g of the FRESH source ingredient (USDA-style). Freeze-dried values concentrate roughly by the rehydration ratio."
          },
          "moistureContent": {
            "type": [
              "string",
              "null"
            ],
            "example": "< 3%"
          },
          "shelfLife": {
            "type": [
              "string",
              "null"
            ],
            "example": "25 years (sealed), 12 months (open)"
          },
          "packaging": {
            "type": [
              "string",
              "null"
            ]
          },
          "minimumOrderQuantity": {
            "type": [
              "string",
              "null"
            ],
            "example": "From 200 kg"
          }
        }
      },
      "Nutrition": {
        "type": "object",
        "properties": {
          "calories": {
            "type": "number"
          },
          "proteinG": {
            "type": "number"
          },
          "fatG": {
            "type": "number"
          },
          "carbsG": {
            "type": "number"
          },
          "fiberG": {
            "type": "number"
          },
          "sugarG": {
            "type": "number"
          }
        }
      }
    }
  }
}