{
 "openapi": "3.1.0",
 "info": {
  "title": "APP NAVI API",
  "version": "1.0.0",
  "description": "Read-only, static JSON API. null means unverified."
 },
 "servers": [
  {
   "url": "https://appnavi.dev"
  }
 ],
 "paths": {
  "/api/v1/apps.json": {
   "get": {
    "operationId": "listApps",
    "summary": "List all apps",
    "responses": {
     "200": {
      "description": "OK",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "meta": {
           "type": "object"
          },
          "apps": {
           "type": "array",
           "items": {
            "$ref": "#/components/schemas/App"
           }
          }
         }
        }
       }
      }
     }
    }
   }
  },
  "/api/v1/apps/{slug}.json": {
   "get": {
    "operationId": "getApp",
    "summary": "Get one app",
    "parameters": [
     {
      "name": "slug",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      }
     }
    ],
    "responses": {
     "200": {
      "description": "OK",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/App"
        }
       }
      }
     },
     "404": {
      "description": "Not found"
     }
    }
   }
  },
  "/api/v1/categories.json": {
   "get": {
    "operationId": "listCategories",
    "summary": "List categories",
    "responses": {
     "200": {
      "description": "OK"
     }
    }
   }
  },
  "/api/v1/developers.json": {
   "get": {
    "operationId": "listDevelopers",
    "summary": "List developers (contractWork is self-declared; null = unverified)",
    "responses": {
     "200": {
      "description": "OK"
     }
    }
   }
  },
  "/api/ranking": {
   "get": {
    "operationId": "getRanking",
    "summary": "Ranking by star ratings. Only apps with 3+ ratings are ranked (ranked); others appear in rising. Optional ?category=slug&limit=n. Rank depends on ratings only.",
    "parameters": [
     {
      "name": "category",
      "in": "query",
      "schema": {
       "type": "string"
      }
     },
     {
      "name": "limit",
      "in": "query",
      "schema": {
       "type": "integer"
      }
     }
    ],
    "responses": {
     "200": {
      "description": "OK"
     },
     "400": {
      "description": "Unknown category"
     }
    }
   }
  },
  "/api/ratings": {
   "get": {
    "operationId": "listRatings",
    "summary": "Anonymous star ratings per app (avg, count). Treat averages with count < min as unreliable.",
    "responses": {
     "200": {
      "description": "OK"
     }
    }
   }
  },
  "/api/v1/developers/{slug}.json": {
   "get": {
    "operationId": "getDeveloper",
    "summary": "Get one developer",
    "parameters": [
     {
      "name": "slug",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      }
     }
    ],
    "responses": {
     "200": {
      "description": "OK"
     },
     "404": {
      "description": "Not found"
     }
    }
   }
  }
 },
 "components": {
  "schemas": {
   "App": {
    "type": "object",
    "required": [
     "slug",
     "name"
    ],
    "properties": {
     "slug": {
      "type": "string"
     },
     "name": {
      "type": "string"
     },
     "officialUrl": {
      "type": [
       "string",
       "null"
      ]
     },
     "summary": {
      "type": "object",
      "properties": {
       "ja": {
        "type": [
         "string",
         "null"
        ]
       },
       "en": {
        "type": [
         "string",
         "null"
        ]
       }
      }
     },
     "features": {
      "type": "array",
      "items": {
       "type": "string"
      }
     },
     "platforms": {
      "type": "array",
      "items": {
       "type": "string"
      }
     },
     "japaneseSupport": {
      "type": [
       "boolean",
       "null"
      ]
     },
     "usesAi": {
      "type": [
       "boolean",
       "null"
      ]
     },
     "hasWeb": {
      "type": [
       "boolean",
       "null"
      ]
     },
     "isIndie": {
      "type": [
       "boolean",
       "null"
      ]
     },
     "pricing": {
      "type": "object",
      "properties": {
       "type": {
        "type": [
         "string",
         "null"
        ]
       },
       "freePlan": {
        "type": [
         "boolean",
         "null"
        ]
       },
       "note": {
        "type": [
         "string",
         "null"
        ]
       }
      }
     },
     "checkedAt": {
      "type": [
       "string",
       "null"
      ]
     },
     "sources": {
      "type": "array",
      "items": {
       "type": "string"
      }
     }
    }
   }
  }
 }
}