{
  "openapi": "3.1.0",
  "info": {
    "title": "Rad Bikes public shop data",
    "version": "1.0.0",
    "description": "Read-only bike, service, contact and hours information from the published shop CMS. New bikes are manufacturer models, not local stock. Used prices and availability require confirmation. No authentication, checkout, reservations, booking or messaging operations."
  },
  "servers": [
    {
      "url": "/"
    }
  ],
  "security": [],
  "paths": {
    "/catalog.json": {
      "get": {
        "operationId": "getPublicShopCatalog",
        "summary": "Read bikes, services and shop details",
        "description": "Returns published manufacturer models, available used listings with asking prices, service labor prices, brands, contact information and weekly shop hours.",
        "responses": {
          "200": {
            "description": "Public shop catalog",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Catalog"
                }
              }
            }
          }
        }
      }
    },
    "/llms.txt": {
      "get": {
        "operationId": "getAgentGuide",
        "summary": "Read the site guide for agents",
        "description": "Explains when to use Rad Bikes, public resource URLs and the limits of its inquiry-only catalog.",
        "responses": {
          "200": {
            "description": "Agent site guide",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "Contact": {
        "type": "object",
        "properties": {
          "businessName": {
            "type": "string",
            "description": "businessName"
          },
          "phone": {
            "type": "string",
            "description": "phone"
          },
          "email": {
            "type": "string",
            "description": "email"
          },
          "street": {
            "type": "string",
            "description": "street"
          },
          "city": {
            "type": "string",
            "description": "city"
          },
          "state": {
            "type": "string",
            "description": "state"
          },
          "zip": {
            "type": "string",
            "description": "zip"
          }
        },
        "required": [],
        "additionalProperties": false
      },
      "DayHours": {
        "type": "object",
        "properties": {
          "closed": {
            "type": "boolean"
          },
          "open": {
            "type": "string",
            "description": "Local opening time, e.g. 11:00 AM"
          },
          "close": {
            "type": "string",
            "description": "Local closing time, e.g. 6:00 PM"
          }
        },
        "required": [],
        "additionalProperties": false
      },
      "Brand": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "Brand name"
          },
          "category": {
            "type": "string",
            "description": "Bikes, components, or gear"
          },
          "website": {
            "type": "string",
            "format": "uri"
          }
        },
        "required": [
          "name"
        ],
        "additionalProperties": false
      },
      "Service": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "Service name"
          },
          "type": {
            "type": "string",
            "enum": [
              "package",
              "a-la-carte"
            ]
          },
          "description": {
            "type": "string",
            "description": "Service description"
          },
          "price": {
            "type": "number",
            "minimum": 0,
            "description": "Labor price in USD; parts additional"
          },
          "priceUnit": {
            "type": "string",
            "description": "Price unit where applicable"
          },
          "includedWork": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "url": {
            "type": "string",
            "format": "uri"
          }
        },
        "required": [
          "name",
          "type",
          "price",
          "url"
        ],
        "additionalProperties": false
      },
      "NewBike": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "Brand and model name"
          },
          "brand": {
            "type": "string",
            "description": "Bike manufacturer"
          },
          "category": {
            "type": "string",
            "description": "Ride style"
          },
          "summary": {
            "type": "string",
            "description": "Manufacturer model description"
          },
          "rearTravel": {
            "type": "string",
            "description": "Rear travel"
          },
          "forkTravel": {
            "type": "string",
            "description": "Fork travel"
          },
          "wheelSize": {
            "type": "string",
            "description": "Wheel setup"
          },
          "image": {
            "type": "string",
            "format": "uri"
          },
          "url": {
            "type": "string",
            "format": "uri"
          }
        },
        "required": [
          "name",
          "brand",
          "category",
          "summary",
          "url"
        ],
        "additionalProperties": false
      },
      "UsedBike": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "description": "Listing name"
          },
          "brand": {
            "type": "string",
            "description": "Manufacturer"
          },
          "description": {
            "type": "string",
            "description": "Listing description"
          },
          "price": {
            "type": "number",
            "minimum": 0,
            "description": "Current asking price, subject to confirmation"
          },
          "currency": {
            "type": "string",
            "enum": [
              "USD"
            ]
          },
          "frameSize": {
            "type": "string",
            "description": "Frame size"
          },
          "condition": {
            "type": "string",
            "description": "Used-bike condition"
          },
          "image": {
            "type": "string",
            "format": "uri"
          },
          "url": {
            "type": "string",
            "format": "uri"
          }
        },
        "required": [
          "name",
          "price",
          "currency",
          "url"
        ],
        "additionalProperties": false
      },
      "Catalog": {
        "type": "object",
        "properties": {
          "version": {
            "type": "string",
            "const": "1.0"
          },
          "website": {
            "type": "string",
            "format": "uri"
          },
          "name": {
            "type": "string",
            "description": "Shop name"
          },
          "description": {
            "type": "string",
            "description": "Shop description"
          },
          "notice": {
            "type": "string",
            "description": "Availability and inquiry limitations"
          },
          "contact": {
            "$ref": "#/components/schemas/Contact"
          },
          "hours": {
            "type": "object",
            "properties": {
              "timeZone": {
                "type": "string",
                "const": "America/Denver"
              },
              "schedule": {
                "type": "object",
                "properties": {
                  "monday": {
                    "$ref": "#/components/schemas/DayHours"
                  },
                  "tuesday": {
                    "$ref": "#/components/schemas/DayHours"
                  },
                  "wednesday": {
                    "$ref": "#/components/schemas/DayHours"
                  },
                  "thursday": {
                    "$ref": "#/components/schemas/DayHours"
                  },
                  "friday": {
                    "$ref": "#/components/schemas/DayHours"
                  },
                  "saturday": {
                    "$ref": "#/components/schemas/DayHours"
                  },
                  "sunday": {
                    "$ref": "#/components/schemas/DayHours"
                  }
                },
                "required": [
                  "monday",
                  "tuesday",
                  "wednesday",
                  "thursday",
                  "friday",
                  "saturday",
                  "sunday"
                ],
                "additionalProperties": false
              }
            },
            "required": [
              "timeZone",
              "schedule"
            ],
            "additionalProperties": false
          },
          "brands": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Brand"
            }
          },
          "services": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Service"
            }
          },
          "newBikes": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/NewBike"
            }
          },
          "usedBikes": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/UsedBike"
            }
          }
        },
        "required": [
          "version",
          "website",
          "name",
          "notice",
          "hours",
          "brands",
          "services",
          "newBikes",
          "usedBikes"
        ],
        "additionalProperties": false
      }
    }
  }
}
