{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://eolwatch.dev/data/items.schema.json",
  "title": "Items",
  "description": "What the items address answers. With at least one of its query parameters: one page of the matching items. Without any of them: the export of every published item. A parameter it does not know is ignored, with three exceptions: state, service_slug and slug are fields of a row, not parameters, and are answered with an error that says what to use.",
  "anyOf": [
    {
      "type": "object",
      "properties": {
        "generated_at": {
          "type": "string",
          "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d+)?Z$",
          "format": "date-time",
          "description": "Moment this answer was built (ISO 8601, UTC)."
        },
        "as_of": {
          "type": "string",
          "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
          "format": "date",
          "description": "The UTC day (YYYY-MM-DD) every value that depends on the day was counted for."
        },
        "site": {
          "type": "object",
          "properties": {
            "name": {
              "type": "string",
              "description": "Name of the site."
            },
            "url": {
              "type": "string",
              "format": "uri",
              "description": "Address of the site."
            }
          },
          "required": [
            "name",
            "url"
          ],
          "additionalProperties": false,
          "description": "The site the data comes from."
        },
        "license": {
          "type": "object",
          "properties": {
            "name": {
              "type": "string",
              "description": "Name of the license, or the words that say none is chosen yet."
            },
            "url": {
              "anyOf": [
                {
                  "type": "string",
                  "format": "uri"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Address of the license text, or null when there is none."
            },
            "note": {
              "type": "string",
              "description": "What that means for reuse of the data."
            }
          },
          "required": [
            "name",
            "url",
            "note"
          ],
          "additionalProperties": false,
          "description": "The license of the data."
        },
        "query": {
          "type": "object",
          "properties": {
            "cloud": {
              "type": "array",
              "items": {
                "type": "string",
                "enum": [
                  "azure",
                  "aws",
                  "gcp",
                  "oci",
                  "multi"
                ]
              },
              "description": "Clouds asked for. Empty: every cloud."
            },
            "type": {
              "type": "array",
              "items": {
                "type": "string",
                "enum": [
                  "retirement",
                  "end_of_support",
                  "breaking_change"
                ]
              },
              "description": "Kinds of change asked for. Empty: every kind."
            },
            "category": {
              "anyOf": [
                {
                  "type": "string",
                  "enum": [
                    "services",
                    "features",
                    "kubernetes",
                    "runtimes",
                    "databases",
                    "compute-skus",
                    "os-images",
                    "apis-sdks",
                    "iac",
                    "other"
                  ]
                },
                {
                  "type": "null"
                }
              ],
              "description": "Category group asked for, or null."
            },
            "service": {
              "description": "Service slug asked for, or null.",
              "type": [
                "string",
                "null"
              ]
            },
            "q": {
              "description": "Search text as it was used, or null.",
              "type": [
                "string",
                "null"
              ]
            },
            "from": {
              "anyOf": [
                {
                  "type": "string",
                  "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
                  "format": "date"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Earliest effective_date asked for, or null."
            },
            "to": {
              "anyOf": [
                {
                  "type": "string",
                  "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
                  "format": "date"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Latest effective_date asked for, or null."
            },
            "within_days": {
              "anyOf": [
                {
                  "type": "integer",
                  "minimum": -9007199254740991,
                  "maximum": 9007199254740991
                },
                {
                  "type": "null"
                }
              ],
              "description": "Number of days from the as_of day asked for, or null."
            },
            "status": {
              "type": "string",
              "enum": [
                "upcoming",
                "ended",
                "in_effect",
                "all"
              ],
              "description": "Which items by state: upcoming, ended, in_effect or all."
            },
            "sort": {
              "type": "string",
              "enum": [
                "date",
                "added",
                "service"
              ],
              "description": "Order of the items."
            },
            "dir": {
              "type": "string",
              "enum": [
                "asc",
                "desc"
              ],
              "description": "Direction of the order."
            },
            "limit": {
              "type": "integer",
              "minimum": 1,
              "maximum": 9007199254740991,
              "description": "Most items in one answer."
            },
            "offset": {
              "type": "integer",
              "minimum": 0,
              "maximum": 9007199254740991,
              "description": "Number of matching items skipped."
            },
            "detail": {
              "type": "string",
              "enum": [
                "compact",
                "full"
              ],
              "description": "compact rows, or full records."
            }
          },
          "required": [
            "cloud",
            "type",
            "category",
            "service",
            "q",
            "from",
            "to",
            "within_days",
            "status",
            "sort",
            "dir",
            "limit",
            "offset",
            "detail"
          ],
          "additionalProperties": false,
          "description": "The query as it was understood: every parameter with the value that was used."
        },
        "total": {
          "type": "integer",
          "minimum": 0,
          "maximum": 9007199254740991,
          "description": "Number of items that match the query."
        },
        "status_counts": {
          "type": "object",
          "properties": {
            "upcoming": {
              "type": "integer",
              "minimum": 0,
              "maximum": 9007199254740991,
              "description": "Items it matches with status upcoming."
            },
            "ended": {
              "type": "integer",
              "minimum": 0,
              "maximum": 9007199254740991,
              "description": "Items it matches with status ended."
            },
            "in_effect": {
              "type": "integer",
              "minimum": 0,
              "maximum": 9007199254740991,
              "description": "Items it matches with status in_effect."
            }
          },
          "required": [
            "upcoming",
            "ended",
            "in_effect"
          ],
          "additionalProperties": false,
          "description": "Number of items the query matches in each status, with every other parameter as it was used. An empty list of upcoming items can stand next to items that have ended or are in effect: send status=all to list them."
        },
        "count": {
          "type": "integer",
          "minimum": 0,
          "maximum": 9007199254740991,
          "description": "Number of items in this answer."
        },
        "limit": {
          "type": "integer",
          "minimum": 1,
          "maximum": 9007199254740991,
          "description": "Most items one answer holds for this query."
        },
        "offset": {
          "type": "integer",
          "minimum": 0,
          "maximum": 9007199254740991,
          "description": "Number of matching items skipped before the first of this answer."
        },
        "next_offset": {
          "anyOf": [
            {
              "type": "integer",
              "minimum": 0,
              "maximum": 9007199254740991
            },
            {
              "type": "null"
            }
          ],
          "description": "The offset of the next page, or null when this answer holds the last match."
        },
        "next_url": {
          "anyOf": [
            {
              "type": "string",
              "format": "uri"
            },
            {
              "type": "null"
            }
          ],
          "description": "Address of the next page of this list, at the data address, or null when this answer holds the last match."
        },
        "windows": {
          "description": "Only in the JSON form of the home page, never in an answer of the items address: the counts of the countdown strip of the page, in its order.",
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "key": {
                "type": "string",
                "enum": [
                  "due30",
                  "due90",
                  "due180",
                  "ended90"
                ],
                "description": "Identifier of the count: due30, due90, due180 or ended90."
              },
              "label": {
                "type": "string",
                "description": "Label of the count on the page."
              },
              "count": {
                "type": "integer",
                "minimum": 0,
                "maximum": 9007199254740991,
                "description": "Number of items in the window on the as_of day. Each count of items due includes the items due sooner."
              },
              "url": {
                "type": "string",
                "format": "uri",
                "description": "The data address that lists the items of the count: its total is count."
              },
              "next": {
                "anyOf": [
                  {
                    "type": "object",
                    "properties": {
                      "label": {
                        "type": "string",
                        "description": "The words the page puts in front of the item, for example Next or Latest."
                      },
                      "slug": {
                        "type": "string",
                        "minLength": 1,
                        "description": "Stable identifier of the item. Never changes once published."
                      },
                      "title": {
                        "type": "string",
                        "description": "Short headline of the lifecycle change."
                      },
                      "effective_date": {
                        "anyOf": [
                          {
                            "type": "string",
                            "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
                            "format": "date"
                          },
                          {
                            "type": "null"
                          }
                        ],
                        "description": "Date the change takes effect (YYYY-MM-DD), or null when not announced. For month, quarter and year precision this is the first day of the period."
                      },
                      "effective_precision": {
                        "type": "string",
                        "enum": [
                          "day",
                          "month",
                          "quarter",
                          "year"
                        ],
                        "description": "How exact effective_date is: day, month, quarter or year."
                      },
                      "url": {
                        "type": "string",
                        "format": "uri",
                        "description": "Page for this item on the site."
                      },
                      "markdown_url": {
                        "type": "string",
                        "format": "uri",
                        "description": "The same item as Markdown."
                      },
                      "json_url": {
                        "type": "string",
                        "format": "uri",
                        "description": "The same item as JSON."
                      }
                    },
                    "required": [
                      "label",
                      "slug",
                      "title",
                      "effective_date",
                      "effective_precision",
                      "url",
                      "markdown_url",
                      "json_url"
                    ],
                    "additionalProperties": false
                  },
                  {
                    "type": "null"
                  }
                ],
                "description": "The item the page names with the count, or null when it names none."
              }
            },
            "required": [
              "key",
              "label",
              "count",
              "url",
              "next"
            ],
            "additionalProperties": false
          }
        },
        "items": {
          "anyOf": [
            {
              "type": "array",
              "items": {
                "type": "object",
                "properties": {
                  "slug": {
                    "type": "string",
                    "minLength": 1,
                    "description": "Stable identifier of the item. Never changes once published."
                  },
                  "title": {
                    "type": "string",
                    "description": "Short headline of the lifecycle change."
                  },
                  "cloud": {
                    "type": "string",
                    "enum": [
                      "azure",
                      "aws",
                      "gcp",
                      "oci",
                      "multi"
                    ],
                    "description": "Cloud the item belongs to: azure, aws, gcp, oci or multi."
                  },
                  "service": {
                    "type": "string",
                    "description": "Display name of the affected service."
                  },
                  "service_slug": {
                    "type": "string",
                    "minLength": 1,
                    "description": "URL-safe identifier of the service."
                  },
                  "category": {
                    "type": "string",
                    "enum": [
                      "service",
                      "feature",
                      "kubernetes",
                      "runtime",
                      "database",
                      "compute_sku",
                      "os_image",
                      "api_sdk",
                      "iac_provider",
                      "iac_module",
                      "iac_language",
                      "other"
                    ],
                    "description": "Kind of thing affected, for example service, runtime, kubernetes or database."
                  },
                  "type": {
                    "type": "string",
                    "enum": [
                      "retirement",
                      "end_of_support",
                      "breaking_change"
                    ],
                    "description": "Kind of change: retirement, end_of_support or breaking_change."
                  },
                  "announced_date": {
                    "anyOf": [
                      {
                        "type": "string",
                        "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
                        "format": "date"
                      },
                      {
                        "type": "null"
                      }
                    ],
                    "description": "Date the vendor announced the change (YYYY-MM-DD), or null when not stated."
                  },
                  "effective_date": {
                    "anyOf": [
                      {
                        "type": "string",
                        "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
                        "format": "date"
                      },
                      {
                        "type": "null"
                      }
                    ],
                    "description": "Date the change takes effect (YYYY-MM-DD), or null when not announced. For month, quarter and year precision this is the first day of the period."
                  },
                  "effective_precision": {
                    "type": "string",
                    "enum": [
                      "day",
                      "month",
                      "quarter",
                      "year"
                    ],
                    "description": "How exact effective_date is: day, month, quarter or year."
                  },
                  "state": {
                    "type": "string",
                    "enum": [
                      "upcoming",
                      "ended",
                      "in_effect",
                      "no_date"
                    ],
                    "description": "Where the item stands on the as_of day: upcoming (its effective period is not over), ended (a retirement or an end of support whose whole period is over), in_effect (a breaking change whose date has passed: it took effect, it does not end) or no_date (no date is announced)."
                  },
                  "days": {
                    "anyOf": [
                      {
                        "type": "integer",
                        "minimum": -9007199254740991,
                        "maximum": 9007199254740991
                      },
                      {
                        "type": "null"
                      }
                    ],
                    "description": "Calendar days from the as_of day to the first day of the effective period. Zero or negative once that day has come. Null when there is no date. A month, quarter or year is over only after its last day, so read state to know whether an item has ended or is in effect. For an item dated by month, quarter or year that has ended, this is not the number of days since it ended: the pages count those from the last day of the period."
                  },
                  "source_url": {
                    "type": "string",
                    "format": "uri",
                    "description": "Page the item was verified against: an official vendor page, or the endoflife.date page for the few products where it is the only source of the date."
                  },
                  "url": {
                    "type": "string",
                    "format": "uri",
                    "description": "Page for this item on the site."
                  },
                  "markdown_url": {
                    "type": "string",
                    "format": "uri",
                    "description": "The same item as Markdown."
                  },
                  "json_url": {
                    "type": "string",
                    "format": "uri",
                    "description": "The same item as JSON."
                  }
                },
                "required": [
                  "slug",
                  "title",
                  "cloud",
                  "service",
                  "service_slug",
                  "category",
                  "type",
                  "announced_date",
                  "effective_date",
                  "effective_precision",
                  "state",
                  "days",
                  "source_url",
                  "url",
                  "markdown_url",
                  "json_url"
                ],
                "additionalProperties": false
              }
            },
            {
              "type": "array",
              "items": {
                "type": "object",
                "properties": {
                  "slug": {
                    "type": "string",
                    "minLength": 1,
                    "description": "Stable identifier of the item. Never changes once published."
                  },
                  "title": {
                    "type": "string",
                    "description": "Short headline of the lifecycle change."
                  },
                  "summary": {
                    "type": "string",
                    "description": "One or two plain sentences describing the change."
                  },
                  "cloud": {
                    "type": "string",
                    "enum": [
                      "azure",
                      "aws",
                      "gcp",
                      "oci",
                      "multi"
                    ],
                    "description": "Cloud the item belongs to: azure, aws, gcp, oci or multi."
                  },
                  "service": {
                    "type": "string",
                    "description": "Display name of the affected service."
                  },
                  "service_slug": {
                    "type": "string",
                    "minLength": 1,
                    "description": "URL-safe identifier of the service."
                  },
                  "category": {
                    "type": "string",
                    "enum": [
                      "service",
                      "feature",
                      "kubernetes",
                      "runtime",
                      "database",
                      "compute_sku",
                      "os_image",
                      "api_sdk",
                      "iac_provider",
                      "iac_module",
                      "iac_language",
                      "other"
                    ],
                    "description": "Kind of thing affected, for example service, runtime, kubernetes or database."
                  },
                  "type": {
                    "type": "string",
                    "enum": [
                      "retirement",
                      "end_of_support",
                      "breaking_change"
                    ],
                    "description": "Kind of change: retirement, end_of_support or breaking_change."
                  },
                  "announced_date": {
                    "anyOf": [
                      {
                        "type": "string",
                        "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
                        "format": "date"
                      },
                      {
                        "type": "null"
                      }
                    ],
                    "description": "Date the vendor announced the change (YYYY-MM-DD), or null when not stated."
                  },
                  "effective_date": {
                    "anyOf": [
                      {
                        "type": "string",
                        "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
                        "format": "date"
                      },
                      {
                        "type": "null"
                      }
                    ],
                    "description": "Date the change takes effect (YYYY-MM-DD), or null when not announced. For month, quarter and year precision this is the first day of the period."
                  },
                  "effective_precision": {
                    "type": "string",
                    "enum": [
                      "day",
                      "month",
                      "quarter",
                      "year"
                    ],
                    "description": "How exact effective_date is: day, month, quarter or year."
                  },
                  "impact": {
                    "type": "string",
                    "description": "What stops working and who is affected."
                  },
                  "migration_path": {
                    "type": "string",
                    "description": "Steps to take before the effective date. May contain Markdown."
                  },
                  "replacement": {
                    "description": "Recommended replacement, or null when the vendor names none.",
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "affected_versions": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    },
                    "description": "Versions affected. Array in JSON, joined with \"; \" in CSV."
                  },
                  "source_url": {
                    "type": "string",
                    "format": "uri",
                    "description": "Page the item was verified against: an official vendor page, or the endoflife.date page for the few products where it is the only source of the date."
                  },
                  "extra_source_urls": {
                    "type": "array",
                    "items": {
                      "type": "string",
                      "format": "uri"
                    },
                    "description": "Additional sources: official pages, or an endoflife.date page. Array in JSON, joined with \"; \" in CSV."
                  },
                  "vendor_ref": {
                    "description": "Vendor reference for the announcement, or null.",
                    "type": [
                      "string",
                      "null"
                    ]
                  },
                  "last_checked_at": {
                    "type": "string",
                    "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d+)?Z$",
                    "format": "date-time",
                    "description": "Timestamp (ISO 8601, UTC) of the last successful recheck against the source."
                  },
                  "created_at": {
                    "type": "string",
                    "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d+)?Z$",
                    "format": "date-time",
                    "description": "Timestamp (ISO 8601, UTC) when the item was first published here."
                  },
                  "updated_at": {
                    "type": "string",
                    "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d+)?Z$",
                    "format": "date-time",
                    "description": "Timestamp (ISO 8601, UTC) of the last change to the item."
                  },
                  "url": {
                    "type": "string",
                    "format": "uri",
                    "description": "Page for this item on the site."
                  },
                  "short_url": {
                    "type": "string",
                    "format": "uri",
                    "description": "Short address of the item page. It redirects to url."
                  },
                  "markdown_url": {
                    "type": "string",
                    "format": "uri",
                    "description": "The same item as Markdown."
                  },
                  "json_url": {
                    "type": "string",
                    "format": "uri",
                    "description": "The same item as JSON."
                  },
                  "estate_check": {
                    "anyOf": [
                      {
                        "type": "object",
                        "properties": {
                          "resource_types": {
                            "type": "array",
                            "items": {
                              "type": "string"
                            },
                            "description": "The resource types the rules of the item name, in the order of the rules."
                          },
                          "fields": {
                            "type": "array",
                            "items": {
                              "type": "string"
                            },
                            "description": "The fields and Terraform paths the check reads, in the order of the rules."
                          },
                          "inputs": {
                            "type": "array",
                            "items": {
                              "type": "string"
                            },
                            "description": "The kinds of file the estate check can detect the item from."
                          }
                        },
                        "required": [
                          "resource_types",
                          "fields",
                          "inputs"
                        ],
                        "additionalProperties": false
                      },
                      {
                        "type": "null"
                      }
                    ],
                    "description": "What the estate check reads to detect resources this item affects, as the item page lists it. Null when the item has no estate check rules. The check runs in the browser of the reader: no address of this site takes a file, a resource ID or a subscription ID."
                  }
                },
                "required": [
                  "slug",
                  "title",
                  "summary",
                  "cloud",
                  "service",
                  "service_slug",
                  "category",
                  "type",
                  "announced_date",
                  "effective_date",
                  "effective_precision",
                  "impact",
                  "migration_path",
                  "replacement",
                  "affected_versions",
                  "source_url",
                  "extra_source_urls",
                  "vendor_ref",
                  "last_checked_at",
                  "created_at",
                  "updated_at",
                  "url",
                  "short_url",
                  "markdown_url",
                  "json_url",
                  "estate_check"
                ],
                "additionalProperties": false
              }
            }
          ],
          "description": "The items: compact rows, or whole records when detail is full."
        },
        "sections": {
          "description": "Only in the JSON form of the home page, a cloud page, a category page or a service page, never in an answer of the items address. For the home page, a cloud page and a category page: the other lists of items the page shows under its main list. For a service page: the lists the page sorts the items of the service into (upcoming, ended, in effect), so each row says where its item stands. Empty when the page shows no such list, with one exception: the three lists of the home page with no filter and the default window are always listed, also when the page shows none of them. A home view with a filter or another window has no other list.",
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string",
                "minLength": 1,
                "description": "Identifier of the list: the id of its heading on the page."
              },
              "heading": {
                "type": "string",
                "description": "Heading of the list on the page."
              },
              "total": {
                "type": "integer",
                "minimum": 0,
                "maximum": 9007199254740991,
                "description": "Number of items in the list. It is larger than the number of items here when the page shows only the first ones."
              },
              "url": {
                "anyOf": [
                  {
                    "type": "string",
                    "format": "uri"
                  },
                  {
                    "type": "null"
                  }
                ],
                "description": "A data address that answers the same items in the same order, or null when no data address does on the as_of day."
              },
              "items": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "slug": {
                      "type": "string",
                      "minLength": 1,
                      "description": "Stable identifier of the item. Never changes once published."
                    },
                    "title": {
                      "type": "string",
                      "description": "Short headline of the lifecycle change."
                    },
                    "cloud": {
                      "type": "string",
                      "enum": [
                        "azure",
                        "aws",
                        "gcp",
                        "oci",
                        "multi"
                      ],
                      "description": "Cloud the item belongs to: azure, aws, gcp, oci or multi."
                    },
                    "service": {
                      "type": "string",
                      "description": "Display name of the affected service."
                    },
                    "service_slug": {
                      "type": "string",
                      "minLength": 1,
                      "description": "URL-safe identifier of the service."
                    },
                    "category": {
                      "type": "string",
                      "enum": [
                        "service",
                        "feature",
                        "kubernetes",
                        "runtime",
                        "database",
                        "compute_sku",
                        "os_image",
                        "api_sdk",
                        "iac_provider",
                        "iac_module",
                        "iac_language",
                        "other"
                      ],
                      "description": "Kind of thing affected, for example service, runtime, kubernetes or database."
                    },
                    "type": {
                      "type": "string",
                      "enum": [
                        "retirement",
                        "end_of_support",
                        "breaking_change"
                      ],
                      "description": "Kind of change: retirement, end_of_support or breaking_change."
                    },
                    "announced_date": {
                      "anyOf": [
                        {
                          "type": "string",
                          "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
                          "format": "date"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "description": "Date the vendor announced the change (YYYY-MM-DD), or null when not stated."
                    },
                    "effective_date": {
                      "anyOf": [
                        {
                          "type": "string",
                          "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
                          "format": "date"
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "description": "Date the change takes effect (YYYY-MM-DD), or null when not announced. For month, quarter and year precision this is the first day of the period."
                    },
                    "effective_precision": {
                      "type": "string",
                      "enum": [
                        "day",
                        "month",
                        "quarter",
                        "year"
                      ],
                      "description": "How exact effective_date is: day, month, quarter or year."
                    },
                    "state": {
                      "type": "string",
                      "enum": [
                        "upcoming",
                        "ended",
                        "in_effect",
                        "no_date"
                      ],
                      "description": "Where the item stands on the as_of day: upcoming (its effective period is not over), ended (a retirement or an end of support whose whole period is over), in_effect (a breaking change whose date has passed: it took effect, it does not end) or no_date (no date is announced)."
                    },
                    "days": {
                      "anyOf": [
                        {
                          "type": "integer",
                          "minimum": -9007199254740991,
                          "maximum": 9007199254740991
                        },
                        {
                          "type": "null"
                        }
                      ],
                      "description": "Calendar days from the as_of day to the first day of the effective period. Zero or negative once that day has come. Null when there is no date. A month, quarter or year is over only after its last day, so read state to know whether an item has ended or is in effect. For an item dated by month, quarter or year that has ended, this is not the number of days since it ended: the pages count those from the last day of the period."
                    },
                    "source_url": {
                      "type": "string",
                      "format": "uri",
                      "description": "Page the item was verified against: an official vendor page, or the endoflife.date page for the few products where it is the only source of the date."
                    },
                    "url": {
                      "type": "string",
                      "format": "uri",
                      "description": "Page for this item on the site."
                    },
                    "markdown_url": {
                      "type": "string",
                      "format": "uri",
                      "description": "The same item as Markdown."
                    },
                    "json_url": {
                      "type": "string",
                      "format": "uri",
                      "description": "The same item as JSON."
                    }
                  },
                  "required": [
                    "slug",
                    "title",
                    "cloud",
                    "service",
                    "service_slug",
                    "category",
                    "type",
                    "announced_date",
                    "effective_date",
                    "effective_precision",
                    "state",
                    "days",
                    "source_url",
                    "url",
                    "markdown_url",
                    "json_url"
                  ],
                  "additionalProperties": false
                },
                "description": "The items the page shows under the heading, as compact rows, in its order."
              }
            },
            "required": [
              "id",
              "heading",
              "total",
              "url",
              "items"
            ],
            "additionalProperties": false
          }
        }
      },
      "required": [
        "generated_at",
        "as_of",
        "site",
        "license",
        "query",
        "total",
        "status_counts",
        "count",
        "limit",
        "offset",
        "next_offset",
        "next_url",
        "items"
      ],
      "additionalProperties": false
    },
    {
      "type": "object",
      "properties": {
        "generated_at": {
          "type": "string",
          "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d+)?Z$",
          "format": "date-time",
          "description": "Moment this answer was built (ISO 8601, UTC)."
        },
        "site": {
          "type": "object",
          "properties": {
            "name": {
              "type": "string",
              "description": "Name of the site."
            },
            "url": {
              "type": "string",
              "format": "uri",
              "description": "Address of the site."
            }
          },
          "required": [
            "name",
            "url"
          ],
          "additionalProperties": false,
          "description": "The site the data comes from."
        },
        "count": {
          "type": "integer",
          "minimum": 0,
          "maximum": 9007199254740991,
          "description": "Number of items in the export."
        },
        "license": {
          "type": "object",
          "properties": {
            "name": {
              "type": "string",
              "description": "Name of the license, or the words that say none is chosen yet."
            },
            "url": {
              "anyOf": [
                {
                  "type": "string",
                  "format": "uri"
                },
                {
                  "type": "null"
                }
              ],
              "description": "Address of the license text, or null when there is none."
            },
            "note": {
              "type": "string",
              "description": "What that means for reuse of the data."
            }
          },
          "required": [
            "name",
            "url",
            "note"
          ],
          "additionalProperties": false,
          "description": "The license of the data."
        },
        "schema": {
          "type": "object",
          "propertyNames": {
            "type": "string",
            "enum": [
              "slug",
              "title",
              "summary",
              "cloud",
              "service",
              "service_slug",
              "category",
              "type",
              "announced_date",
              "effective_date",
              "effective_precision",
              "impact",
              "migration_path",
              "replacement",
              "affected_versions",
              "source_url",
              "extra_source_urls",
              "vendor_ref",
              "last_checked_at",
              "created_at",
              "updated_at",
              "url"
            ]
          },
          "additionalProperties": {
            "type": "string"
          },
          "required": [
            "slug",
            "title",
            "summary",
            "cloud",
            "service",
            "service_slug",
            "category",
            "type",
            "announced_date",
            "effective_date",
            "effective_precision",
            "impact",
            "migration_path",
            "replacement",
            "affected_versions",
            "source_url",
            "extra_source_urls",
            "vendor_ref",
            "last_checked_at",
            "created_at",
            "updated_at",
            "url"
          ],
          "description": "Each field name of an item with a one line description."
        },
        "items": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "slug": {
                "type": "string",
                "minLength": 1,
                "description": "Stable identifier of the item. Never changes once published."
              },
              "title": {
                "type": "string",
                "description": "Short headline of the lifecycle change."
              },
              "summary": {
                "type": "string",
                "description": "One or two plain sentences describing the change."
              },
              "cloud": {
                "type": "string",
                "enum": [
                  "azure",
                  "aws",
                  "gcp",
                  "oci",
                  "multi"
                ],
                "description": "Cloud the item belongs to: azure, aws, gcp, oci or multi."
              },
              "service": {
                "type": "string",
                "description": "Display name of the affected service."
              },
              "service_slug": {
                "type": "string",
                "minLength": 1,
                "description": "URL-safe identifier of the service."
              },
              "category": {
                "type": "string",
                "enum": [
                  "service",
                  "feature",
                  "kubernetes",
                  "runtime",
                  "database",
                  "compute_sku",
                  "os_image",
                  "api_sdk",
                  "iac_provider",
                  "iac_module",
                  "iac_language",
                  "other"
                ],
                "description": "Kind of thing affected, for example service, runtime, kubernetes or database."
              },
              "type": {
                "type": "string",
                "enum": [
                  "retirement",
                  "end_of_support",
                  "breaking_change"
                ],
                "description": "Kind of change: retirement, end_of_support or breaking_change."
              },
              "announced_date": {
                "anyOf": [
                  {
                    "type": "string",
                    "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
                    "format": "date"
                  },
                  {
                    "type": "null"
                  }
                ],
                "description": "Date the vendor announced the change (YYYY-MM-DD), or null when not stated."
              },
              "effective_date": {
                "anyOf": [
                  {
                    "type": "string",
                    "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
                    "format": "date"
                  },
                  {
                    "type": "null"
                  }
                ],
                "description": "Date the change takes effect (YYYY-MM-DD), or null when not announced. For month, quarter and year precision this is the first day of the period."
              },
              "effective_precision": {
                "type": "string",
                "enum": [
                  "day",
                  "month",
                  "quarter",
                  "year"
                ],
                "description": "How exact effective_date is: day, month, quarter or year."
              },
              "impact": {
                "type": "string",
                "description": "What stops working and who is affected."
              },
              "migration_path": {
                "type": "string",
                "description": "Steps to take before the effective date. May contain Markdown."
              },
              "replacement": {
                "description": "Recommended replacement, or null when the vendor names none.",
                "type": [
                  "string",
                  "null"
                ]
              },
              "affected_versions": {
                "type": "array",
                "items": {
                  "type": "string"
                },
                "description": "Versions affected. Array in JSON, joined with \"; \" in CSV."
              },
              "source_url": {
                "type": "string",
                "format": "uri",
                "description": "Page the item was verified against: an official vendor page, or the endoflife.date page for the few products where it is the only source of the date."
              },
              "extra_source_urls": {
                "type": "array",
                "items": {
                  "type": "string",
                  "format": "uri"
                },
                "description": "Additional sources: official pages, or an endoflife.date page. Array in JSON, joined with \"; \" in CSV."
              },
              "vendor_ref": {
                "description": "Vendor reference for the announcement, or null.",
                "type": [
                  "string",
                  "null"
                ]
              },
              "last_checked_at": {
                "type": "string",
                "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d+)?Z$",
                "format": "date-time",
                "description": "Timestamp (ISO 8601, UTC) of the last successful recheck against the source."
              },
              "created_at": {
                "type": "string",
                "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d+)?Z$",
                "format": "date-time",
                "description": "Timestamp (ISO 8601, UTC) when the item was first published here."
              },
              "updated_at": {
                "type": "string",
                "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d+)?Z$",
                "format": "date-time",
                "description": "Timestamp (ISO 8601, UTC) of the last change to the item."
              },
              "url": {
                "type": "string",
                "format": "uri",
                "description": "Page for this item on the site."
              }
            },
            "required": [
              "slug",
              "title",
              "summary",
              "cloud",
              "service",
              "service_slug",
              "category",
              "type",
              "announced_date",
              "effective_date",
              "effective_precision",
              "impact",
              "migration_path",
              "replacement",
              "affected_versions",
              "source_url",
              "extra_source_urls",
              "vendor_ref",
              "last_checked_at",
              "created_at",
              "updated_at",
              "url"
            ],
            "additionalProperties": false
          },
          "description": "Every published item."
        }
      },
      "required": [
        "generated_at",
        "site",
        "count",
        "license",
        "schema",
        "items"
      ],
      "additionalProperties": false
    }
  ]
}
