{
  "openapi": "3.1.0",
  "info": {
    "title": "FQPS Academy public API",
    "version": "1.0.0",
    "summary": "Read-only feeds published on fqps.co.uk.",
    "description": "Public, read-only endpoints of fqps.co.uk, the website of FQPS Academy, an SQE (Solicitors Qualifying Examination) preparation provider in England and Wales. No key, sign-in or cookie is needed. Please honour each response's Cache-Control header.",
    "termsOfService": "https://fqps.co.uk/terms-and-conditions",
    "contact": {
      "name": "FQPS Academy",
      "email": "support@fqps.co.uk",
      "url": "https://fqps.co.uk/contact"
    }
  },
  "externalDocs": {
    "description": "Developer documentation",
    "url": "https://fqps.co.uk/developers"
  },
  "servers": [
    {
      "url": "https://fqps.co.uk"
    }
  ],
  "paths": {
    "/feeds/chatgpt-products.tsv": {
      "get": {
        "operationId": "getProductFeedTsv",
        "summary": "Product feed (TSV)",
        "description": "FQPS Academy SQE preparation plans and services, one row per product after a header row, each with the price shown on its landing page on fqps.co.uk. Changes only when the catalogue does. Cache for up to an hour.",
        "externalDocs": {
          "description": "OpenAI product feed format",
          "url": "https://developers.openai.com/commerce/specs/file-upload/products"
        },
        "responses": {
          "200": {
            "description": "Product feed (TSV)",
            "content": {
              "text/tab-separated-values": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/feeds/chatgpt-products.csv": {
      "get": {
        "operationId": "getProductFeedCsv",
        "summary": "Product feed (CSV)",
        "description": "The same rows as the TSV product feed, as RFC 4180 CSV. Changes only when the catalogue does. Cache for up to an hour.",
        "externalDocs": {
          "description": "OpenAI product feed format",
          "url": "https://developers.openai.com/commerce/specs/file-upload/products"
        },
        "responses": {
          "200": {
            "description": "Product feed (CSV)",
            "content": {
              "text/csv": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/api/search": {
      "get": {
        "operationId": "searchArticles",
        "summary": "Article search",
        "description": "Searches the FQPS Academy blog: articles whose title, summary or author contain every word of q, newest first, each with its title, summary, date, author and URL. The same results as the search page. Cache for up to five minutes.",
        "parameters": [
          {
            "in": "query",
            "name": "q",
            "description": "The words to search for.",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 100
            }
          },
          {
            "in": "query",
            "name": "limit",
            "description": "How many articles to return.",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 20,
              "default": 5
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Article search",
            "content": {
              "application/json": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/blog/rss.xml": {
      "get": {
        "operationId": "getBlogRss",
        "summary": "Blog feed (RSS 2.0)",
        "description": "The 50 most recent posts on the FQPS Academy blog, newest first, with title, link, date and summary. Rebuilt at most once an hour.",
        "responses": {
          "200": {
            "description": "Blog feed (RSS 2.0)",
            "content": {
              "application/rss+xml": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    },
    "/api/health": {
      "get": {
        "operationId": "getHealth",
        "summary": "Health check",
        "description": "Answers 200 with the text \"ok\" while the site is serving requests. Live. Never cached.",
        "responses": {
          "200": {
            "description": "Health check",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    }
  }
}