CEFR level by study hours
750 guided study hours are enough for C1 on the CEFR scale. Enter your hours, and the level you already hold if you have one, to see the highest band reached, its typical range and the hours still missing for the next. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- Hours
- 400
- From level
- A0
- Effective hours
- 400
- Reachable level
- B1
- Reachable label
- B1 Threshold (independent user)
How far can a stack of classroom, tutoring, and self-study hours realistically take a language learner on the CEFR ladder? Course brochures talk about becoming intermediate while exam boards publish guided-hour bands from A1 through C2, and those two stories rarely meet in one transparent number. This CEFR level by study hours calculator maps a total of guided study hours onto the standard Cambridge-style cumulative bands so you can see the highest level those hours can reasonably support, how many hours remain until the next band, and where the total sits relative to the published typical range. Use it when you are planning a school year, briefing a private tutor, comparing intensive versus extensive programmes, or converting a logged hour diary into a placement hypothesis before a diagnostic test.
Standard guided-hour bands from A1 through C2
The Common European Framework of Reference organises language ability into six official levels: A1 and A2 for the basic user, B1 and B2 for the independent user, and C1 and C2 for the proficient user. Those labels describe what a person can do with the language, not how long they studied, but course designers still need a planning proxy that turns calendar time into a reachable band.
Language testers and exam boards commonly publish cumulative guided-learning-hour ranges measured from a complete beginner: about ninety to one hundred hours to A1, one hundred eighty to two hundred hours to A2, three hundred fifty to four hundred hours to B1, five hundred to six hundred hours to B2, seven hundred to eight hundred hours to C1, and one thousand to twelve hundred hours to C2.
This capability treats the lower end of each published range as the threshold at which that level becomes a reasonable claim: ninety hours for A1, one hundred eighty for A2, three hundred fifty for B1, five hundred for B2, seven hundred for C1, and one thousand for C2. Hours below ninety stay at A0, also called pre-A1, because they have not yet met the first official band.
The classifier always returns the highest threshold that the effective hour total meets, so four hundred hours reach B1 and seven hundred fifty hours reach C1. Typical published highs (one hundred, two hundred, four hundred, six hundred, eight hundred, twelve hundred) are echoed as the planning range for the reached band, while the next official threshold remains the number that unlocks the following level.
These figures are pedagogical planning anchors, not exam pass scores: two learners with the same hour total can still differ in grammar control, vocabulary, and skills, so treat the result as a reachable-band estimate rather than a certificate.
Study plans, schools, and product integrations
Language schools use a CEFR level by study hours calculator to turn a term’s contact hours into a honest reachable-band claim before they print “B1 in one semester” on a brochure. Programme managers compare intensive and extensive calendars by feeding both totals through the same thresholds: six hundred hours still sit in B2, while seven hundred already support a C1 planning claim. Failed validation does not consume balance.
Keep the published thresholds fixed in your product copy so users understand they are planning estimates; combine them with a skills-based placement test when you need certification readiness, and use this tool when the question is specifically which CEFR band a given hour total can reasonably support.
FAQ
Which CEFR level do 400 guided study hours reach?
On these bands 400 hours from beginner reach B1 (threshold 350). The next official band is B2 at 500 hours, so about 100 hours remain.
What hour thresholds does each CEFR level use?
Typical published highs are 100, 200, 400, 600, 800, and 1200. Totals below 90 stay at A0 / pre-A1.
Are these official exam pass scores?
No. They are widely cited pedagogical planning bands for guided learning hours, not cut scores for a named certificate. Use a skills-based placement test when you need certification readiness.
How do my hours count if I already have a level?
Choose your starting level and the calculator adds that level's cumulative threshold to your hours. So 200 more hours after A2 become 380 effective hours, which is enough for B1.
What does A0 mean in the result?
It means your hours have not yet reached 90, the threshold of the first official level, A1. It is also called pre-A1, and it is the starting point when you do not enter an earlier level.
Related tools
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/cefr-by-hours \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"hours":400}'const res = await fetch("https://api.kit.forhosting.com/edu/cefr-by-hours", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"hours": 400
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/edu/cefr-by-hours",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"hours": 400
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/edu/cefr-by-hours", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"hours":400}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"hours":400}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/edu/cefr-by-hours", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"hours": 400
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "edu.cefr_by_hours",
"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.
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. |
Technical notes
Input contract, starting level, and response shape
When a start level is supplied, the engine adds that level’s cumulative threshold to the submitted hours and classifies the sum: two hundred extra hours after A2 become three hundred eighty effective hours and therefore B1. Optional fields are omitted rather than set to null, including the next-level group once C2 is already reached. Validation failures name the offending field. POST a JSON body with hours as the required finite non-negative number of additional guided study hours. Aliases study_hours, total_hours, and guided_hours map to the same field. Values may arrive as JSON numbers or as numeric strings that coerce to finite numbers. Negative totals, empty strings, and non-numeric values fail with invalid_input and are not billed. Optionally send from_level as the CEFR band already attained: A0 for a complete beginner, or A1, A2, B1, B2, C1, or C2 in any letter case. Aliases current_level, start_level, from, and current are accepted. When from_level is omitted it defaults to A0, so hours are interpreted as a lifetime total from zero. Successful responses echo hours and from_level, return effective_hours, reachable_level, reachable_label, the threshold hours_for_level, the typical_min and typical_max planning range, hours_into_band, percent_of_c2 toward the one-thousand-hour C2 threshold, at_ceiling, a bands table with every official threshold and a reached flag, a path of levels from the start through the reachable band, plus formula, message, and numbered steps. When the reachable level is not yet C2, the response also includes next_level, hours_for_next, hours_to_next, and progress_to_next as a percentage through the current band.
Study plans, schools, and product integrations
Independent learners convert an Anki-and-class diary into a single effective-hour figure, then read hours_to_next so they know whether another eighty hours still sits inside B1 or actually crosses B2. Tutors open intake sessions with a shared number instead of a vague “upper intermediate” label, and they can set from_level to the last certified band so only the hours after that certificate count. LMS plugins and mobile study apps call the same parse endpoint from edge workers because the algorithm is a lookup plus arithmetic, with no model tokens and no outbound network.
Integration use cases
Self-study hour diaries
Turn a logged total of guided hours into a reachable CEFR band and a concrete hours_to_next figure before you book a placement or certificate exam.
School and tutoring plans
Show families which band a term of contact hours can support, and set from_level to the last certified band so only new hours count.
LMS and language-app APIs
Call a deterministic parse endpoint to classify guided-hour totals during onboarding without hosting your own CEFR hour table.
Technical questions
How does from_level change the result?
from_level is the CEFR band already attained. Submitted hours are added to that band’s cumulative threshold, then classified. Two hundred hours after A2 become 380 effective hours and therefore B1.
What does the CEFR level by study hours calculator cost?
The browser tool is free. API requests use prepaid KIT balance at $0.002 per successful call; invalid input is not billed.