{"openapi":"3.1.0","info":{"title":"Readingspeed API","version":"0.1.0","description":"A fully local reading-speed and comprehension self-test toolkit: real words-per-minute from a passage and timing, documented benchmark ranges by purpose, a Flesch-Kincaid-style readability score, and comprehension questions mechanically derived from the caller's own passage.\n\nEvery operation is read-only or compute-only. The same tools are available over MCP (streamable HTTP) at https://readingspeed.connectorbay.com/mcp.","contact":{"name":"Unify Dynamics LLC","email":"hr@unifydynamics.com","url":"https://connectorbay.com/readingspeed/docs"},"termsOfService":"https://connectorbay.com/readingspeed/terms"},"servers":[{"url":"https://readingspeed.connectorbay.com"}],"externalDocs":{"url":"https://connectorbay.com/readingspeed/docs"},"security":[{},{"bearer":[]}],"components":{"securitySchemes":{"bearer":{"type":"http","scheme":"bearer","description":"Optional. A Pro API key raises rate limits; no credentials are required."}},"schemas":{"Error":{"type":"object","properties":{"ok":{"const":false},"error":{"type":"object"}}}}},"paths":{"/v1/tools/wpm_calculator":{"post":{"operationId":"wpm_calculator","summary":"Computes real words-per-minute from a passage and how long it took to read, optionally compared against","description":"Computes real words-per-minute from a passage and how long it took to read, optionally compared against\n    a documented benchmark range for a reading purpose. Use for \"how many words per minute did I just read\",\n    \"is 250 wpm fast for studying\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"text":{"description":"The passage that was read.","minLength":1,"title":"Text","type":"string"},"seconds":{"description":"How many seconds it took to read the passage.","exclusiveMinimum":0,"title":"Seconds","type":"number"},"purpose":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"skimming | leisure | studying — compares the result against that benchmark. Omit to compare against all three.","title":"Purpose"}},"required":["text","seconds"],"title":"wpm_calculatorArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/reading_benchmarks":{"post":{"operationId":"reading_benchmarks","summary":"Documented reading-speed benchmark ranges by purpose (skimming, leisure, studying) and their source. Use","description":"Documented reading-speed benchmark ranges by purpose (skimming, leisure, studying) and their source. Use\n    for \"what's a normal reading speed\", \"how fast should I read while studying\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{},"title":"reading_benchmarksArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/readability_score":{"post":{"operationId":"readability_score","summary":"Flesch-Kincaid grade level and Flesch reading ease for a piece of text — the same formulas Brightwise's","description":"Flesch-Kincaid grade level and Flesch reading ease for a piece of text — the same formulas Brightwise's\n    reading_level tool uses. Use for \"what reading level is this paragraph written at\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"text":{"description":"The text to score.","minLength":1,"title":"Text","type":"string"}},"required":["text"],"title":"readability_scoreArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/comprehension_check":{"post":{"operationId":"comprehension_check","summary":"Mechanically generates fill-in-the-blank and true/false comprehension questions derived directly from","description":"Mechanically generates fill-in-the-blank and true/false comprehension questions derived directly from\n    the sentences of the supplied passage. Use for \"quiz me on this passage I just read\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"text":{"description":"The passage to generate questions from.","minLength":1,"title":"Text","type":"string"},"question_count":{"default":3,"maximum":10,"minimum":1,"title":"Question Count","type":"integer"}},"required":["text"],"title":"comprehension_checkArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/reading_test":{"post":{"operationId":"reading_test","summary":"A full reading self-test in one call: words-per-minute (with benchmark comparison), a readability score,","description":"A full reading self-test in one call: words-per-minute (with benchmark comparison), a readability score,\n    and comprehension questions derived from the passage. Use for \"give me a full reading self-test for this\n    article and how long it took me\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"text":{"description":"The passage that was read.","minLength":1,"title":"Text","type":"string"},"seconds":{"description":"How many seconds it took to read the passage.","exclusiveMinimum":0,"title":"Seconds","type":"number"},"purpose":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"skimming | leisure | studying","title":"Purpose"},"question_count":{"default":3,"maximum":10,"minimum":1,"title":"Question Count","type":"integer"}},"required":["text","seconds"],"title":"reading_testArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}}}}