{
  "openapi": "3.1.0",
  "info": {
    "title": "Which Language App public API",
    "version": "1.0.0",
    "summary": "Which language app should you use? 28 apps scored on the same eight criteria, with a pick for each kind of learner: a trip, an exam, a daily habit, a tutor, or no budget at all.",
    "termsOfService": "https://whichlanguageapp.com/data",
    "contact": {
      "name": "Which Language App",
      "email": "hello@whichlanguageapp.com"
    }
  },
  "servers": [
    {
      "url": "https://whichlanguageapp.com/"
    }
  ],
  "paths": {
    "/api/v1/latest.json": {
      "get": {
        "summary": "The full language-app dataset: apps with features and languages, plus every published plan with price, source URL and check date.",
        "parameters": [
          {
            "name": "client",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Optional polite client identifier. Static hosting may record it in edge access logs."
          }
        ],
        "responses": {
          "200": {
            "description": "The full language-app dataset: apps with features and languages, plus every published plan with price, source URL and check date.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          }
        }
      }
    },
    "/api/latest.json": {
      "get": {
        "summary": "The full language-app dataset: apps with features and languages, plus every published plan with price, source URL and check date.",
        "parameters": [
          {
            "name": "client",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Optional polite client identifier. Static hosting may record it in edge access logs."
          }
        ],
        "responses": {
          "200": {
            "description": "The full language-app dataset: apps with features and languages, plus every published plan with price, source URL and check date.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "additionalProperties": true
                }
              }
            }
          }
        }
      },
      "x-permanent-alias-for": "/api/v1/latest.json"
    },
    "/api/v1/health.json": {
      "get": {
        "summary": "Dataset freshness and availability",
        "parameters": [
          {
            "name": "client",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Optional polite client identifier. Static hosting may record it in edge access logs."
          }
        ],
        "responses": {
          "200": {
            "description": "Dataset freshness and availability",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "status",
                    "generated_at",
                    "datasets"
                  ],
                  "properties": {
                    "status": {
                      "type": "string",
                      "enum": [
                        "ok",
                        "stale",
                        "unavailable"
                      ]
                    },
                    "generated_at": {
                      "type": "string",
                      "format": "date-time"
                    },
                    "datasets": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "additionalProperties": true
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/health.json": {
      "get": {
        "summary": "Dataset freshness and availability",
        "parameters": [
          {
            "name": "client",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Optional polite client identifier. Static hosting may record it in edge access logs."
          }
        ],
        "responses": {
          "200": {
            "description": "Dataset freshness and availability",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "status",
                    "generated_at",
                    "datasets"
                  ],
                  "properties": {
                    "status": {
                      "type": "string",
                      "enum": [
                        "ok",
                        "stale",
                        "unavailable"
                      ]
                    },
                    "generated_at": {
                      "type": "string",
                      "format": "date-time"
                    },
                    "datasets": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "additionalProperties": true
                      }
                    }
                  }
                }
              }
            }
          }
        }
      },
      "x-permanent-alias-for": "/api/v1/health.json"
    },
    "/language-app-prices.csv": {
      "get": {
        "summary": "One row per app per plan with price, billing period, per-month equivalent, source URL and the date the price was observed on the vendor page (observed_at).",
        "parameters": [
          {
            "name": "client",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Optional polite client identifier. Static hosting may record it in edge access logs."
          }
        ],
        "responses": {
          "200": {
            "description": "One row per app per plan with price, billing period, per-month equivalent, source URL and the date the price was observed on the vendor page (observed_at).",
            "content": {
              "text/csv": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    }
  }
}