{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "schema:UnitPriceSpecification",
  "title": "UnitPriceSpecification",
  "description": "The price asked for a given offer by the respective organization or person.",
  "type": "object",
  "allOf": [
    {
      "description": "A structured value representing a price or price range. Typically, only the subclasses of this type are used for markup. It is recommended to use [[MonetaryAmount]] to describe independent amounts of money such as a salary, credit card limits, etc.",
      "$ref": "schema:PriceSpecification"
    }
  ],
  "properties": {
    "billingDuration": {
      "description": "Specifies for how long this price (or price component) will be billed. Can be used, for example, to model the contractual duration of a subscription or payment plan. Type can be either a Duration or a Number (in which case the unit of measurement, for example month, is specified by the unitCode property).",
      "oneOf": [
        {
          "anyOf": [
            { "type": "number" },
            { "type": "string", "$comment": "https://schema.org/Duration" },
            { "$ref": "schema:QuantitativeValue" }
          ]
        },
        {
          "type": "array",
          "items": {
            "anyOf": [
              { "type": "number" },
              { "type": "string", "$comment": "https://schema.org/Duration" },
              { "$ref": "schema:QuantitativeValue" }
            ]
          }
        }
      ]
    },
    "billingIncrement": {
      "description": "This property specifies the minimal quantity and rounding increment that will be the basis for the billing. The unit of measurement is specified by the unitCode property.",
      "type": "number"
    },
    "billingStart": {
      "description": "Specifies after how much time this price (or price component) becomes valid and billing starts. Can be used, for example, to model a price increase after the first year of a subscription. The unit of measurement is specified by the unitCode property.",
      "oneOf": [
        { "type": "number" },
        { "type": "array", "items": { "type": "number" } }
      ]
    },
    "priceComponentType": {
      "description": "Identifies a price component (for example, a line item on an invoice), part of the total price for an offer.",
      "oneOf": [
        { "$ref": "schema:PriceComponentTypeEnumeration" },
        {
          "type": "array",
          "items": { "$ref": "schema:PriceComponentTypeEnumeration" }
        }
      ]
    },
    "priceType": {
      "description": "Defines the type of a price specified for an offered product, for example a list price, a (temporary) sale price or a manufacturer suggested retail price. If multiple prices are specified for an offer the [[priceType]] property can be used to identify the type of each such specified price. The value of priceType can be specified as a value from enumeration PriceTypeEnumeration or as a free form text string for price types that are not already predefined in PriceTypeEnumeration.",
      "oneOf": [
        {
          "anyOf": [
            { "type": "string" },
            { "$ref": "schema:PriceTypeEnumeration" }
          ]
        },
        {
          "type": "array",
          "items": {
            "anyOf": [
              { "type": "string" },
              { "$ref": "schema:PriceTypeEnumeration" }
            ]
          }
        }
      ]
    },
    "referenceQuantity": {
      "description": "The reference quantity for which a certain price applies, e.g. 1 EUR per 4 kWh of electricity. This property is a replacement for unitOfMeasurement for the advanced cases where the price does not relate to a standard unit.",
      "$ref": "schema:QuantitativeValue"
    },
    "unitCode": {
      "description": "The unit of measurement given using the UN/CEFACT Common Code (3 characters) or a URL. Other codes than the UN/CEFACT Common Code may be used with a prefix followed by a colon.",
      "anyOf": [{ "type": "string", "format": "uri" }, { "type": "string" }]
    },
    "unitText": {
      "description": "A string or text indicating the unit of measurement. Useful if you cannot provide a standard unit code for\nunitCode.",
      "oneOf": [
        { "type": "string" },
        { "type": "array", "items": { "type": "string" } }
      ]
    }
  }
}
