{
 "openapi": "3.1.0",
 "info": {
  "title": "Tensorust API",
  "version": "1.0.0",
  "summary": "Receipts-first data and free tools: real crates.io downloads, LLM API prices, The Manual, reports.",
  "description": "Free, no key. 60 requests a minute per IP (HTTP 429 with Retry-After beyond that). Every record has a `url` to cite and, for prices and numbers, a source and check date. Bulk JSON without limits: https://tensorust.com/data/v1/index.json. MCP server: https://mcp.tensorust.com/mcp. Data license: CC BY 4.0, credit Tensorust with a link.",
  "contact": {
   "name": "Tensorust",
   "email": "matt@tensorust.com",
   "url": "https://tensorust.com/developers/"
  },
  "license": {
   "name": "CC BY 4.0 (data)",
   "url": "https://creativecommons.org/licenses/by/4.0/"
  }
 },
 "servers": [
  {
   "url": "https://api.tensorust.com/v1"
  }
 ],
 "externalDocs": {
  "url": "https://tensorust.com/developers/",
  "description": "Docs with curl, Python and JavaScript examples"
 },
 "tags": [
  {
   "name": "search"
  },
  {
   "name": "crates"
  },
  {
   "name": "llm"
  },
  {
   "name": "manual"
  },
  {
   "name": "reports"
  },
  {
   "name": "tools"
  }
 ],
 "paths": {
  "/search": {
   "get": {
    "tags": [
     "search"
    ],
    "operationId": "search",
    "summary": "Search everything we publish",
    "parameters": [
     {
      "name": "q",
      "in": "query",
      "required": true,
      "description": "Search text",
      "schema": {
       "type": "string"
      }
     },
     {
      "name": "type",
      "in": "query",
      "required": false,
      "description": "Comma list: crate, model, explainer, guide, article, report, tool, money",
      "schema": {
       "type": "string"
      }
     },
     {
      "name": "limit",
      "in": "query",
      "required": false,
      "description": "1-50, default 10",
      "schema": {
       "type": "integer"
      }
     }
    ],
    "responses": {
     "200": {
      "description": "Ranked results",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/SearchResults"
        }
       }
      }
     },
     "400": {
      "$ref": "#/components/responses/Error"
     },
     "404": {
      "$ref": "#/components/responses/Error"
     },
     "429": {
      "$ref": "#/components/responses/RateLimited"
     }
    }
   }
  },
  "/crates": {
   "get": {
    "tags": [
     "crates"
    ],
    "operationId": "listCrates",
    "summary": "List tracked Rust crates",
    "parameters": [
     {
      "name": "q",
      "in": "query",
      "required": false,
      "description": "Filter by words in name/description/keywords",
      "schema": {
       "type": "string"
      }
     },
     {
      "name": "category",
      "in": "query",
      "required": false,
      "description": "crates.io category slug",
      "schema": {
       "type": "string"
      }
     },
     {
      "name": "sort",
      "in": "query",
      "required": false,
      "description": "real | all_time | recent | release_share | trend | name",
      "schema": {
       "type": "string"
      }
     },
     {
      "name": "limit",
      "in": "query",
      "required": false,
      "description": "1-300",
      "schema": {
       "type": "integer"
      }
     },
     {
      "name": "offset",
      "in": "query",
      "required": false,
      "description": "Paging offset",
      "schema": {
       "type": "integer"
      }
     }
    ],
    "responses": {
     "200": {
      "description": "Crates",
      "content": {
       "application/json": {
        "schema": {
         "type": "object"
        }
       }
      }
     },
     "400": {
      "$ref": "#/components/responses/Error"
     },
     "404": {
      "$ref": "#/components/responses/Error"
     },
     "429": {
      "$ref": "#/components/responses/RateLimited"
     }
    }
   }
  },
  "/crates/compare": {
   "get": {
    "tags": [
     "crates"
    ],
    "operationId": "compareCrates",
    "summary": "Compare 2-10 crates with a verdict",
    "parameters": [
     {
      "name": "names",
      "in": "query",
      "required": true,
      "description": "Comma list of crate names",
      "schema": {
       "type": "string"
      }
     }
    ],
    "responses": {
     "200": {
      "description": "Comparison",
      "content": {
       "application/json": {
        "schema": {
         "type": "object"
        }
       }
      }
     },
     "400": {
      "$ref": "#/components/responses/Error"
     },
     "404": {
      "$ref": "#/components/responses/Error"
     },
     "429": {
      "$ref": "#/components/responses/RateLimited"
     }
    }
   }
  },
  "/crates/{name}": {
   "get": {
    "tags": [
     "crates"
    ],
    "operationId": "getCrate",
    "summary": "One crate: real downloads, release share, daily numbers",
    "parameters": [
     {
      "name": "name",
      "in": "path",
      "required": true,
      "description": "Crate name",
      "schema": {
       "type": "string"
      }
     },
     {
      "name": "days",
      "in": "query",
      "required": false,
      "description": "Daily numbers to include, 0-120 (default 90)",
      "schema": {
       "type": "integer"
      }
     }
    ],
    "responses": {
     "200": {
      "description": "Crate",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Crate"
        }
       }
      }
     },
     "400": {
      "$ref": "#/components/responses/Error"
     },
     "404": {
      "$ref": "#/components/responses/Error"
     },
     "429": {
      "$ref": "#/components/responses/RateLimited"
     }
    }
   }
  },
  "/llm/models": {
   "get": {
    "tags": [
     "llm"
    ],
    "operationId": "listModels",
    "summary": "List priced LLM API models",
    "parameters": [
     {
      "name": "provider",
      "in": "query",
      "required": false,
      "description": "openai | anthropic | google | deepseek",
      "schema": {
       "type": "string"
      }
     },
     {
      "name": "q",
      "in": "query",
      "required": false,
      "description": "Filter by id/name words",
      "schema": {
       "type": "string"
      }
     },
     {
      "name": "status",
      "in": "query",
      "required": false,
      "description": "e.g. listed",
      "schema": {
       "type": "string"
      }
     }
    ],
    "responses": {
     "200": {
      "description": "Models",
      "content": {
       "application/json": {
        "schema": {
         "type": "object"
        }
       }
      }
     },
     "400": {
      "$ref": "#/components/responses/Error"
     },
     "404": {
      "$ref": "#/components/responses/Error"
     },
     "429": {
      "$ref": "#/components/responses/RateLimited"
     }
    }
   }
  },
  "/llm/models/{model}": {
   "get": {
    "tags": [
     "llm"
    ],
    "operationId": "getModel",
    "summary": "One model: every price tier, workloads, history; optional cost for your tokens",
    "parameters": [
     {
      "name": "model",
      "in": "path",
      "required": true,
      "description": "Model id, slug or name",
      "schema": {
       "type": "string"
      }
     },
     {
      "name": "input_tokens",
      "in": "query",
      "required": false,
      "description": "Per request",
      "schema": {
       "type": "integer"
      }
     },
     {
      "name": "output_tokens",
      "in": "query",
      "required": false,
      "description": "Per request",
      "schema": {
       "type": "integer"
      }
     },
     {
      "name": "cached_tokens",
      "in": "query",
      "required": false,
      "description": "Input tokens read from prompt cache",
      "schema": {
       "type": "integer"
      }
     },
     {
      "name": "requests",
      "in": "query",
      "required": false,
      "description": "How many requests",
      "schema": {
       "type": "integer"
      }
     }
    ],
    "responses": {
     "200": {
      "description": "Model",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/Model"
        }
       }
      }
     },
     "400": {
      "$ref": "#/components/responses/Error"
     },
     "404": {
      "$ref": "#/components/responses/Error"
     },
     "429": {
      "$ref": "#/components/responses/RateLimited"
     }
    }
   }
  },
  "/llm/cheapest": {
   "get": {
    "tags": [
     "llm"
    ],
    "operationId": "cheapestModels",
    "summary": "Cheapest models for a job or token counts",
    "parameters": [
     {
      "name": "job",
      "in": "query",
      "required": false,
      "description": "chat | rag | sum | agent | batch | long",
      "schema": {
       "type": "string"
      }
     },
     {
      "name": "input_tokens",
      "in": "query",
      "required": false,
      "description": "",
      "schema": {
       "type": "integer"
      }
     },
     {
      "name": "output_tokens",
      "in": "query",
      "required": false,
      "description": "",
      "schema": {
       "type": "integer"
      }
     },
     {
      "name": "cached_tokens",
      "in": "query",
      "required": false,
      "description": "",
      "schema": {
       "type": "integer"
      }
     },
     {
      "name": "requests_per_month",
      "in": "query",
      "required": false,
      "description": "default 1000",
      "schema": {
       "type": "integer"
      }
     },
     {
      "name": "providers",
      "in": "query",
      "required": false,
      "description": "Comma list",
      "schema": {
       "type": "string"
      }
     },
     {
      "name": "use_cache",
      "in": "query",
      "required": false,
      "description": "true to use cache-read prices",
      "schema": {
       "type": "boolean"
      }
     },
     {
      "name": "use_batch",
      "in": "query",
      "required": false,
      "description": "true to use batch prices",
      "schema": {
       "type": "boolean"
      }
     },
     {
      "name": "limit",
      "in": "query",
      "required": false,
      "description": "1-50",
      "schema": {
       "type": "integer"
      }
     }
    ],
    "responses": {
     "200": {
      "description": "Ranked models",
      "content": {
       "application/json": {
        "schema": {
         "type": "object"
        }
       }
      }
     },
     "400": {
      "$ref": "#/components/responses/Error"
     },
     "404": {
      "$ref": "#/components/responses/Error"
     },
     "429": {
      "$ref": "#/components/responses/RateLimited"
     }
    }
   }
  },
  "/llm/changes": {
   "get": {
    "tags": [
     "llm"
    ],
    "operationId": "priceChanges",
    "summary": "Dated price changes and announced ones",
    "parameters": [
     {
      "name": "model",
      "in": "query",
      "required": false,
      "description": "Only this model",
      "schema": {
       "type": "string"
      }
     },
     {
      "name": "limit",
      "in": "query",
      "required": false,
      "description": "",
      "schema": {
       "type": "integer"
      }
     }
    ],
    "responses": {
     "200": {
      "description": "Changes",
      "content": {
       "application/json": {
        "schema": {
         "type": "object"
        }
       }
      }
     },
     "400": {
      "$ref": "#/components/responses/Error"
     },
     "404": {
      "$ref": "#/components/responses/Error"
     },
     "429": {
      "$ref": "#/components/responses/RateLimited"
     }
    }
   }
  },
  "/manual": {
   "get": {
    "tags": [
     "manual"
    ],
    "operationId": "manualIndex",
    "summary": "The Manual: explainers and guides",
    "parameters": [
     {
      "name": "q",
      "in": "query",
      "required": false,
      "description": "Filter words",
      "schema": {
       "type": "string"
      }
     },
     {
      "name": "kind",
      "in": "query",
      "required": false,
      "description": "explainer | guide",
      "schema": {
       "type": "string"
      }
     },
     {
      "name": "topic",
      "in": "query",
      "required": false,
      "description": "Topic slug",
      "schema": {
       "type": "string"
      }
     },
     {
      "name": "limit",
      "in": "query",
      "required": false,
      "description": "",
      "schema": {
       "type": "integer"
      }
     }
    ],
    "responses": {
     "200": {
      "description": "Pages",
      "content": {
       "application/json": {
        "schema": {
         "type": "object"
        }
       }
      }
     },
     "400": {
      "$ref": "#/components/responses/Error"
     },
     "404": {
      "$ref": "#/components/responses/Error"
     },
     "429": {
      "$ref": "#/components/responses/RateLimited"
     }
    }
   }
  },
  "/manual/{slug}": {
   "get": {
    "tags": [
     "manual"
    ],
    "operationId": "getManualPage",
    "summary": "One page: short answer, key facts with sources, FAQ (articles too)",
    "parameters": [
     {
      "name": "slug",
      "in": "path",
      "required": true,
      "description": "Page slug",
      "schema": {
       "type": "string"
      }
     }
    ],
    "responses": {
     "200": {
      "description": "Page",
      "content": {
       "application/json": {
        "schema": {
         "$ref": "#/components/schemas/ManualPage"
        }
       }
      }
     },
     "400": {
      "$ref": "#/components/responses/Error"
     },
     "404": {
      "$ref": "#/components/responses/Error"
     },
     "429": {
      "$ref": "#/components/responses/RateLimited"
     }
    }
   }
  },
  "/articles": {
   "get": {
    "tags": [
     "manual"
    ],
    "operationId": "listArticles",
    "summary": "Every article",
    "parameters": [
     {
      "name": "q",
      "in": "query",
      "required": false,
      "description": "Filter words",
      "schema": {
       "type": "string"
      }
     },
     {
      "name": "topic",
      "in": "query",
      "required": false,
      "description": "Topic slug",
      "schema": {
       "type": "string"
      }
     },
     {
      "name": "limit",
      "in": "query",
      "required": false,
      "description": "",
      "schema": {
       "type": "integer"
      }
     }
    ],
    "responses": {
     "200": {
      "description": "Articles",
      "content": {
       "application/json": {
        "schema": {
         "type": "object"
        }
       }
      }
     },
     "400": {
      "$ref": "#/components/responses/Error"
     },
     "404": {
      "$ref": "#/components/responses/Error"
     },
     "429": {
      "$ref": "#/components/responses/RateLimited"
     }
    }
   }
  },
  "/articles/{slug}": {
   "get": {
    "tags": [
     "manual"
    ],
    "operationId": "getArticle",
    "summary": "One article: summary, sources, text",
    "parameters": [
     {
      "name": "slug",
      "in": "path",
      "required": true,
      "description": "Article slug",
      "schema": {
       "type": "string"
      }
     }
    ],
    "responses": {
     "200": {
      "description": "Article",
      "content": {
       "application/json": {
        "schema": {
         "type": "object"
        }
       }
      }
     },
     "400": {
      "$ref": "#/components/responses/Error"
     },
     "404": {
      "$ref": "#/components/responses/Error"
     },
     "429": {
      "$ref": "#/components/responses/RateLimited"
     }
    }
   }
  },
  "/reports": {
   "get": {
    "tags": [
     "reports"
    ],
    "operationId": "listReports",
    "summary": "Report series and issues with CSV links",
    "responses": {
     "200": {
      "description": "Reports",
      "content": {
       "application/json": {
        "schema": {
         "type": "object"
        }
       }
      }
     },
     "400": {
      "$ref": "#/components/responses/Error"
     },
     "404": {
      "$ref": "#/components/responses/Error"
     },
     "429": {
      "$ref": "#/components/responses/RateLimited"
     }
    }
   }
  },
  "/money": {
   "get": {
    "tags": [
     "tools"
    ],
    "operationId": "moneySize",
    "summary": "Any dollar amount as physical cash",
    "parameters": [
     {
      "name": "amount",
      "in": "query",
      "required": true,
      "description": "USD",
      "schema": {
       "type": "number"
      }
     },
     {
      "name": "denomination",
      "in": "query",
      "required": false,
      "description": "1, 2, 5, 10, 20, 50 or 100",
      "schema": {
       "type": "integer"
      }
     }
    ],
    "responses": {
     "200": {
      "description": "Facts",
      "content": {
       "application/json": {
        "schema": {
         "type": "object"
        }
       }
      }
     },
     "400": {
      "$ref": "#/components/responses/Error"
     },
     "404": {
      "$ref": "#/components/responses/Error"
     },
     "429": {
      "$ref": "#/components/responses/RateLimited"
     }
    }
   }
  },
  "/tools": {
   "get": {
    "tags": [
     "tools"
    ],
    "operationId": "listTools",
    "summary": "Free tools and which ones run here",
    "responses": {
     "200": {
      "description": "Tools",
      "content": {
       "application/json": {
        "schema": {
         "type": "object"
        }
       }
      }
     },
     "400": {
      "$ref": "#/components/responses/Error"
     },
     "404": {
      "$ref": "#/components/responses/Error"
     },
     "429": {
      "$ref": "#/components/responses/RateLimited"
     }
    }
   }
  },
  "/tools/{tool}": {
   "get": {
    "tags": [
     "tools"
    ],
    "operationId": "runToolGet",
    "summary": "Run a tool with query parameters (lists as comma strings)",
    "parameters": [
     {
      "name": "tool",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string",
       "enum": [
        "llm_cost",
        "count_tokens",
        "cron_explain",
        "semver_check",
        "uuid_decode",
        "uuid_v7_generate",
        "snowflake_decode",
        "unix_timestamp",
        "jwt_decode",
        "json_repair",
        "llm_vram",
        "app_store_fee",
        "steam_revenue",
        "money_size"
       ]
      }
     }
    ],
    "responses": {
     "200": {
      "description": "Tool result",
      "content": {
       "application/json": {
        "schema": {
         "type": "object"
        }
       }
      }
     },
     "400": {
      "$ref": "#/components/responses/Error"
     },
     "404": {
      "$ref": "#/components/responses/Error"
     },
     "429": {
      "$ref": "#/components/responses/RateLimited"
     }
    }
   },
   "post": {
    "tags": [
     "tools"
    ],
    "operationId": "runTool",
    "summary": "Run a tool with a JSON body",
    "parameters": [
     {
      "name": "tool",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string",
       "enum": [
        "llm_cost",
        "count_tokens",
        "cron_explain",
        "semver_check",
        "uuid_decode",
        "uuid_v7_generate",
        "snowflake_decode",
        "unix_timestamp",
        "jwt_decode",
        "json_repair",
        "llm_vram",
        "app_store_fee",
        "steam_revenue",
        "money_size"
       ]
      }
     }
    ],
    "requestBody": {
     "required": true,
     "content": {
      "application/json": {
       "schema": {
        "type": "object",
        "additionalProperties": true
       },
       "examples": {
        "cron_explain": {
         "value": {
          "expression": "*/15 9-17 * * 1-5",
          "timezone": "America/New_York"
         }
        },
        "semver_check": {
         "value": {
          "requirement": "^1.2",
          "versions": [
           "1.1.9",
           "1.4.0",
           "2.0.0"
          ]
         }
        },
        "semver_check_registry": {
         "value": {
          "requirement": "1.0",
          "package": "serde",
          "ecosystem": "cargo"
         }
        },
        "count_tokens": {
         "value": {
          "text": "Hello, world"
         }
        },
        "uuid_decode": {
         "value": {
          "uuid": "01a16b35-0800-7a3f-9c2e-4d8b1f6a0e57"
         }
        },
        "snowflake_decode": {
         "value": {
          "id": "1300000000000000000",
          "platform": "discord"
         }
        },
        "unix_timestamp": {
         "value": {
          "timestamp": 1761300000,
          "timezone": "Europe/London"
         }
        },
        "json_repair": {
         "value": {
          "text": "Sure! ```json\n{name: 'a', ok: True,}\n```"
         }
        },
        "llm_vram": {
         "value": {
          "model": "llama-3.1-8b",
          "quant": "q4_k_m",
          "context": 8192
         }
        },
        "llm_cost": {
         "value": {
          "model": "gpt-5-mini",
          "input_tokens": 2000,
          "output_tokens": 500,
          "requests": 100000
         }
        },
        "app_store_fee": {
         "value": {
          "price": 4.99,
          "type": "sub1",
          "small_business": true
         }
        },
        "steam_revenue": {
         "value": {
          "price": 14.99,
          "reviews": 2000
         }
        },
        "money_size": {
         "value": {
          "amount": 1000000
         }
        }
       }
      }
     }
    },
    "responses": {
     "200": {
      "description": "Tool result",
      "content": {
       "application/json": {
        "schema": {
         "type": "object"
        }
       }
      }
     },
     "400": {
      "$ref": "#/components/responses/Error"
     },
     "404": {
      "$ref": "#/components/responses/Error"
     },
     "429": {
      "$ref": "#/components/responses/RateLimited"
     }
    }
   }
  },
  "/openapi.json": {
   "get": {
    "operationId": "openapi",
    "summary": "This spec",
    "responses": {
     "200": {
      "description": "OpenAPI 3.1"
     }
    }
   }
  }
 },
 "components": {
  "responses": {
   "Error": {
    "description": "Error",
    "content": {
     "application/json": {
      "schema": {
       "type": "object",
       "properties": {
        "error": {
         "type": "string",
         "description": "What went wrong and how to fix the call"
        }
       }
      }
     }
    }
   },
   "RateLimited": {
    "description": "Over 60 requests a minute; see Retry-After",
    "headers": {
     "Retry-After": {
      "schema": {
       "type": "integer"
      }
     }
    },
    "content": {
     "application/json": {
      "schema": {
       "type": "object",
       "properties": {
        "error": {
         "type": "string"
        }
       }
      }
     }
    }
   }
  },
  "schemas": {
   "SearchResults": {
    "type": "object",
    "properties": {
     "query": {
      "type": "string"
     },
     "total": {
      "type": "integer"
     },
     "results": {
      "type": "array",
      "items": {
       "type": "object",
       "properties": {
        "type": {
         "type": "string"
        },
        "id": {
         "type": "string"
        },
        "title": {
         "type": "string"
        },
        "url": {
         "type": "string",
         "format": "uri"
        },
        "api": {
         "type": [
          "string",
          "null"
         ]
        },
        "summary": {
         "type": "string"
        },
        "score": {
         "type": "number"
        }
       }
      }
     }
    }
   },
   "Crate": {
    "type": "object",
    "properties": {
     "name": {
      "type": "string"
     },
     "url": {
      "type": "string"
     },
     "real_downloads_per_day": {
      "type": "number",
      "description": "Median downloads on quiet days (no release that day or the day before)"
     },
     "release_window_share_pct": {
      "type": "number",
      "description": "Share of window downloads on release days and the day after"
     },
     "all_time_downloads": {
      "type": "integer"
     },
     "quiet_trend_pct": {
      "type": [
       "number",
       "null"
      ]
     },
     "latest_version": {
      "type": "string"
     },
     "daily": {
      "type": "array",
      "description": "[date, downloads, release_window]"
     }
    }
   },
   "Model": {
    "type": "object",
    "properties": {
     "id": {
      "type": "string"
     },
     "name": {
      "type": "string"
     },
     "provider": {
      "type": "string"
     },
     "input": {
      "type": "number",
      "description": "USD per 1M input tokens"
     },
     "output": {
      "type": "number",
      "description": "USD per 1M output tokens"
     },
     "cache_read": {
      "type": [
       "number",
       "null"
      ]
     },
     "batch_input": {
      "type": [
       "number",
       "null"
      ]
     },
     "batch_output": {
      "type": [
       "number",
       "null"
      ]
     },
     "source_url": {
      "type": "string"
     },
     "checked": {
      "type": "string"
     },
     "workloads": {
      "type": "object"
     },
     "your_cost": {
      "type": "object"
     }
    }
   },
   "ManualPage": {
    "type": "object",
    "properties": {
     "type": {
      "type": "string"
     },
     "slug": {
      "type": "string"
     },
     "url": {
      "type": "string"
     },
     "title": {
      "type": "string"
     },
     "short_answer": {
      "type": "string"
     },
     "key_facts": {
      "type": "array",
      "items": {
       "type": "object"
      }
     },
     "sources": {
      "type": "array",
      "items": {
       "type": "object"
      }
     },
     "faq": {
      "type": "array",
      "items": {
       "type": "object"
      }
     }
    }
   }
  }
 }
}