Speech length vs time limit checker
A speech can look concise on the page and still run long when delivered aloud. This checker counts the words in your draft, applies an expected speaking pace, and compares the estimated duration with the minutes you are allowed.
Run — free
The result shows whether the draft fits, how long it is likely to take, and the positive or negative gap from the limit. Use the default pace for a practical first check, or enter a rate based on a rehearsal for a more personal estimate before class presentations, ceremonies, pitches, or timed talks.
Start with the complete version you intend to say
Paste the whole spoken draft, including the introduction, transitions, quotations, and closing. Leaving out a section makes the estimate artificially short, even when that section feels informal or easy to remember. The checker identifies word-like tokens made from letters or numbers and keeps common internal apostrophes and hyphens together, so terms such as “don't” and “well-being” count as single words. Punctuation does not add time by itself, although the pauses it signals may affect real delivery. The allowed-minutes field should contain the actual ceiling set by the teacher, organizer, debate format, or event schedule. If the rule says five minutes, enter five rather than a preferred target such as four and a half; the returned gap will then show exactly how much estimated room remains. Drafts must contain meaningful word or number content and may be up to 100,000 characters, which is ample for ordinary speeches while keeping browser and API work predictably bounded. Run the complete text again after every substantial revision.
Choose a speaking pace that reflects the delivery
The default rate is 130 words per minute, a useful planning pace for clear public speaking, but it is not a claim about every speaker or setting. A deliberate ceremonial address, technical explanation, or speech delivered in a second language may be slower. A familiar sales pitch or energetic student presentation may be faster. The accepted range is 60 to 250 words per minute so the estimate remains within plausible spoken delivery rather than becoming a reading-speed calculation. For a personalized value, rehearse a representative passage aloud with a timer, divide its word count by the elapsed minutes, and enter that rate. Use a passage that includes the same kinds of pauses, emphasis, names, figures, and audience interaction as the full speech. Do not use silent reading speed, because silent reading is usually much faster than speaking. If several rehearsals vary, choose the slower realistic pace when exceeding the limit has consequences. The selected rate is returned with the result, making the assumption visible whenever you save or share the calculation.
Read the gap and revise with a safety margin
The result reports estimated minutes and seconds, then subtracts that estimate from the permitted duration. A positive gap means the speech is within the limit and represents estimated time remaining. A negative gap means the draft is over the limit; its magnitude is the estimated amount that must be removed or delivered faster. A zero gap means the mathematical estimate lands exactly on the ceiling. The status field expresses the same distinction as within limit, over limit, or exact limit, which is convenient for automated checks. Treat the number as a planning signal rather than a stopwatch guarantee. Applause, slide changes, demonstrations, laughter, questions, emphasis, and nervous pauses can extend a live presentation without changing its word count. When timing is strict, aim for a positive margin and confirm it with multiple spoken rehearsals. To revise an overlong draft, remove repetition or low-priority examples before compressing every sentence. Recheck after editing, then rehearse the final version under conditions that resemble the event, including any visual aids or required pauses.
What you can do with it
Prepare a class presentation
Check whether a student speech fits the teacher's assigned window before practicing the final delivery.
Trim a ceremony address
Measure a welcome, award, or wedding speech and identify how much estimated time needs to be removed.
Validate timed talk drafts
Apply the same pace and limit across conference proposals, team pitches, or recorded scripts in an automated workflow.
FAQ
How is the estimated speech time calculated?
The checker counts word-like tokens and divides that count by the selected words-per-minute rate. It then converts the duration to minutes and seconds.
What does a negative gap mean?
A negative gap means the estimated speech is longer than the allowed duration. For example, a negative thirty-second gap indicates an estimated overrun of thirty seconds.
Which speaking rate should I use?
Start with the default 130 words per minute, or measure your own rate by timing a representative rehearsal aloud. Use a slower realistic rate when the limit is strict.
Does the estimate include pauses or audience reactions?
No. Word count cannot predict applause, laughter, slide changes, demonstrations, or improvised pauses. Keep a positive margin and rehearse to account for them.
What does an API check cost?
Each API request costs $0.002. The same deterministic calculation can also run directly in the browser.
For developers — API access
Everything on this page is available programmatically. This section is for teams who want to wire it into their own systems; everyone else can just use the tool above.
API endpoint
Prefer to automate it? One authenticated POST creates the task; the result comes back by webhook or a signed link. The same capability also runs here on the web, by email and from Telegram — and soon from our app too.
Call it from your stack
curl -X POST https://api.kit.forhosting.com/edu/speech-length-check \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"text":"Good morning. Today I will explain how a small community garden can improve access to fresh food while giving neighbors a practical place to learn together.","allowed_minutes":1}'const res = await fetch("https://api.kit.forhosting.com/edu/speech-length-check", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"text": "Good morning. Today I will explain how a small community garden can improve access to fresh food while giving neighbors a practical place to learn together.",
"allowed_minutes": 1
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/edu/speech-length-check",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"text": "Good morning. Today I will explain how a small community garden can improve access to fresh food while giving neighbors a practical place to learn together.",
"allowed_minutes": 1
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/edu/speech-length-check", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"text":"Good morning. Today I will explain how a small community garden can improve access to fresh food while giving neighbors a practical place to learn together.","allowed_minutes":1}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"text":"Good morning. Today I will explain how a small community garden can improve access to fresh food while giving neighbors a practical place to learn together.","allowed_minutes":1}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/edu/speech-length-check", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"text": "Good morning. Today I will explain how a small community garden can improve access to fresh food while giving neighbors a practical place to learn together.",
"allowed_minutes": 1
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "edu.speech_length_check",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}The API is asynchronous: the call returns a task_id immediately and the result arrives by webhook. Polling is capped at 1 req/s per task.
Pricing
Published price — no tokens, no invented credits. A failed task is never charged.
Limits
max_chars | 100000 |
Errors
| HTTP | Code | Meaning |
|---|---|---|
401 | unauthorized | Missing or invalid API key. |
402 | insufficient_balance | Your balance doesn't cover the task price. |
404 | unknown_type | That task type doesn't exist. |
429 | rate_limited | Too many requests. Use the webhook instead of polling. |