{
    "additionalProperties": {
        "image_gallery": {
            "items": {
                "$ref": "#/definitions/image"
            },
            "type": "array"
        }
    },
    "definitions": {
        "available_qty": {
            "default": 0,
            "description": "The quantity of the product available for purchasing",
            "example": 10,
            "type": "number"
        },
        "currency": {
            "description": "The currency of the price",
            "enum": [
                "USD"
            ]
        },
        "description": {
            "description": "Product's description",
            "maxLength": 2000,
            "type": "string"
        },
        "identifier": {
            "description": "Product SKU",
            "example": "ABC-123",
            "type": "string"
        },
        "image": {
            "description": "URL for the product image",
            "example": "http://static.example.com/images/product.jpg",
            "type": "string"
        },
        "in_stock": {
            "default": false,
            "description": "Whether the product is in stock or not",
            "example": true,
            "type": "boolean"
        },
        "name": {
            "description": "Product's name",
            "maxLength": 100,
            "type": "string"
        },
        "price": {
            "description": "The price of the product",
            "example": 49.99,
            "type": "number"
        }
    },
    "description": "A product available for sale in a store",
    "links": [
        {
            "description": "Get all available product for the store",
            "href": "/products",
            "method": "GET",
            "rel": "instances",
            "schema": {
                "properties": {
                    "order": {
                        "description": "Attribute to order the results by",
                        "enum": [
                            "name",
                            "price",
                            "available_qty"
                        ],
                        "example": "price"
                    },
                    "page": {
                        "default": 1,
                        "description": "Current page of products",
                        "example": 1,
                        "type": "integer"
                    },
                    "per_page": {
                        "default": 20,
                        "description": "How many products to retrieve at once",
                        "max": 200,
                        "min": 1,
                        "type": "integer"
                    }
                },
                "type": "object"
            },
            "targetSchema": {
                "items": {
                    "rel": "self"
                },
                "type": "array"
            },
            "title": "Available products"
        },
        {
            "description": "Get a single product",
            "href": "/products/{#/definitions/identifier}",
            "method": "GET",
            "rel": "self",
            "targetSchema": {
                "rel": "self"
            },
            "title": "Product info"
        }
    ],
    "properties": {
        "ID": {
            "$ref": "#/definitions/identifier"
        },
        "available_qty": {
            "$ref": "#/definitions/available_qty"
        },
        "currency": {
            "$ref": "#/definitions/currency"
        },
        "description": {
            "$ref": "#/definitions/description"
        },
        "image": {
            "$ref": "#/definitions/image"
        },
        "in_stock": {
            "$ref": "#/definitions/in_stock"
        },
        "name": {
            "$ref": "#/definitions/name"
        },
        "price": {
            "$ref": "#/definitions/price"
        }
    },
    "required": [
        "ID",
        "name",
        "description",
        "price",
        "currency",
        "in_stock",
        "available_qty"
    ],
    "title": "Product",
    "type": "object"
}