England vaccine queue
An 82-year-old with no priority job or condition sits in JCVI group 2 in England, at place 2,679,757 in the queue, with an estimated invitation on 21 December 2020. Enter age, occupation and conditions to replay that order. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- Age
- 82
- Occupation
- None
- Conditions
- None
- Priority band
- 2
- Priority rank
- 2
- Qualifying group
- age_80_plus
- Qualifying group label
- Persons aged 80 years and older
England's first COVID-19 doses were not offered all at once. The Joint Committee on Vaccination and Immunisation ranked older-adult care home residents, their carers, frontline health and social care workers, clinically extremely vulnerable people, and then the rest of the adult population by descending age so scarce supply reached the highest-risk groups first. This England vaccine queue tool applies that JCVI priority order to age, occupation, and conditions, then estimates a 1-based queue position, whole days of wait after a fixed 8 December 2020 campaign start, and an ISO invitation date from a closed England cohort table and a constant daily first-dose throughput. Occupation and conditions have documented defaults so a lone age still yields a band and a date.
How JCVI priority groups become a queue position and an estimated date
The Joint Committee on Vaccination and Immunisation published a nine-group Phase 1 order for the United Kingdom in December 2020 so nations could invite people when first doses were scarce. Group 1 covers residents in a care home for older adults and their carers. Group 2 covers everyone aged eighty and over together with frontline health and social care workers.
Groups 3, 5, 7, 8, and 9 are pure descending age bands (seventy-five, sixty-five, sixty, fifty-five, and fifty). Group 4 mixes people aged seventy to seventy-four with clinically extremely vulnerable individuals on the shielding list. Group 6 covers people aged sixteen to sixty-four with underlying health conditions that raise the risk of serious disease.
The engine collects every matching slice, then keeps the highest-priority band: an eighty-year-old care home carer is therefore group 1 from occupation, not group 2 from age. Queue position is not a random rank. Higher bands are fully ahead.
Inside a band, published slices run in invitation order (residents before carers; people aged eighty and over before remaining health and social care workers under eighty; people aged seventy to seventy-four before remaining clinically extremely vulnerable people under seventy). Inside a slice, older ages are invited first, using the midpoint of the one-year age bucket against a closed England planning headcount. Wait days are floor of (queue position minus one) divided by two hundred thousand first doses per day, counted from the fixed campaign morning of 8 December 2020.
The estimated date is that civil day, computed with Howard Hinnant's integer Gregorian serial, never the host clock. The ranking is an educational replay of that historical JCVI table plus a documented planning throughput, not a clinic appointment, not the National Booking Service, and not a substitute for the current Green Book schedule.
Who this queue replay helps, and where it stops
Public-health classrooms and tabletop exercises use a JCVI vaccine queue calculator so students can see why a care home resident, a seventy-six-year-old, a clinically extremely vulnerable forty-year-old, and a healthy thirty-year-old were not interchangeable when first doses were scarce, and so they can read a concrete position and date instead of a vague 'early 2021'. Occupational-health and emergency-preparedness teams run the same contract during scarce-dose drills without standing up a live immunization registry or scraping the National Booking Service.
Journalists and policy explainers need a deterministic oracle that returns group 4 and a winter 2020–21 date for a forty-year-old on the shielding list, group 2 for a nurse aged forty, and group 10 for a healthy adult of the same age with no essential occupation, instead of a prose summary that drifts between articles. Keep expectations educational: this is not a medical-device diagnosis, not an NHS booking tool, and not the current seasonal COVID-19 or influenza schedule, which UKHSA and the Green Book update separately.
The cohort sizes and the two-hundred-thousand daily throughput are a closed planning model chosen so every caller gets the same date, not a live census of who had already been vaccinated on a given morning. People seeking a real appointment should follow NHS England, their GP, or their clinician, not any single automated label from a historical allocation table.
What you can do with it
Classroom JCVI allocation drills
Let students submit age, occupation, and conditions and see which JCVI band the December 2020 England table assigns, how many people stand ahead, and which estimated date the closed first-dose model returns.
Occupational-health scarce-dose exercises
Rank a workforce roster into JCVI groups 1–11 during preparedness drills without connecting to a live immunization registry or inventing a custom spreadsheet of care-home, NHS, CEV, and age rules.
FAQ
What happens if age is not a nonnegative integer?
Age must be a whole number of years from 0 through 120. Missing, negative, fractional, or non-numeric age is not billed.
How is the estimated date computed?
Queue position counts everyone in higher JCVI bands plus an older-first place inside the assigned slice. The estimated date is that civil day. The path never reads the host clock.
Does a clinically extremely vulnerable flag always assign group 4?
Only when no higher band applies. Care home residents and care home staff remain group 1. People aged 80 and over, and frontline health and social care workers, remain group 2. People aged 75–79 remain group 3. Underlying conditions without CEV assign group 6 only for ages 16–64.
When would an 82-year-old in England have been offered a first COVID dose?
Around 21 December 2020 in this replay. Group 2 puts them at place 2,679,757, and at two hundred thousand first doses a day from the 8 December start that means a wait of 13 days.
Why is an 80-year-old care home carer in group 1 and not group 2?
Because every group a person matches is collected and the highest-priority one is kept. Caring for older care home residents is group 1, so it beats the age-based group 2.
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/health/vaccine-queue-england \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"age":82}'const res = await fetch("https://api.kit.forhosting.com/health/vaccine-queue-england", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"age": 82
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/health/vaccine-queue-england",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"age": 82
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/health/vaccine-queue-england", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"age":82}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"age":82}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/health/vaccine-queue-england", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"age": 82
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "health.vaccine_queue_england",
"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
Age must be a nonnegative integer; a missing, negative, fractional, or non-numeric age fails with invalid_input and is not billed.
How JCVI priority groups become a queue position and an estimated date
This endpoint then adds two closing bands so every valid age receives a result instead of a silent gap: remaining adults aged sixteen to forty-nine as group 10 (the Phase 2 remainder) and remaining people under sixteen as group 11.
Input contract, priority-band response, and age validation
Unknown occupation strings and unknown conditions strings fail the same way. Failed validation does not consume balance. POST a JSON body with required age as a nonnegative integer from zero through one hundred twenty completed years. Occupation is the closed set none, care_home_staff, or health_social_care; omitted occupation defaults to none. conditions is the closed set none, care_home_resident, clinically_extremely_vulnerable, or underlying; omitted conditions default to none. Pick the highest-priority matching condition when several apply: a shielding-list resident of an older-adult care home should send care_home_resident, not underlying. Aliases exist for each canonical name so older forms can map without renaming columns. Age that is missing, negative, fractional, boolean, infinite, or otherwise not a nonnegative integer fails with invalid_input naming age and is not charged. On success the body echoes age, occupation, and conditions, then returns priority_band as the machine key 1 through 11; priority_band_label for display; priority_rank as 1 for the highest priority through 11 for remaining children; qualifying_group and qualifying_group_label for the slice that won the rank; reasons as every matching slice key; queue_position as the 1-based place in the England first-dose line; people_ahead as everyone invited before that place; wait_days as whole days after 8 December 2020; estimated_date as YYYY-MM-DD; cohort_size for the assigned band; campaign_start; daily_throughput; framework naming the JCVI table; and method jcvi_england_queue_v1. Identical inputs always yield identical JSON because the path never touches a network, a model, a clock, or a random generator.
Integration use cases
Explainers and deterministic fixtures
Pin the priority band, queue position, and estimated date in journalism notebooks and continuous-integration tests so a healthy adult, a shielding-list adult, and a care home worker never silently swap labels or dates.
Technical questions
How does the England vaccine queue tool assign a JCVI priority band?
It ranks age, occupation (none, care_home_staff, or health_social_care), and conditions (none, care_home_resident, clinically_extremely_vulnerable, or underlying) against the JCVI December 2020 COVID-19 order for England and returns the highest matching band (1 through 11), plus a queue position and estimated date from a closed first-dose model.
What does the England vaccine queue calculator cost?
The browser tool is free. API requests use prepaid balance at $0.002 per successful call; invalid input is not billed.