South Africa vaccine queue
A 42-year-old frontline healthcare worker lands in Phase 1 of South Africa's 2021 NDoH rollout, the group that received the first doses from mid-February 2021. Enter age, occupation and comorbidities to see the phase and the reason. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- Age
- 42
- Occupation
- Healthcare
- Phase
- 1
- Phase label
- Phase 1
- Phase rank
- 1
- Qualifying group
- healthcare_workers
South Africa did not offer first COVID-19 doses to everyone at once. The National Department of Health ranked frontline healthcare workers first, then essential workers, people in congregate settings, adults aged sixty and over, and adults with comorbidities, and only afterwards the remaining adult population, so scarce supply reached the highest-risk groups first. This South Africa vaccine queue tool applies that 2021 NDoH phased rollout to age, occupation, and comorbidities and returns the assigned phase. Occupation and comorbidities have documented defaults so a lone age still yields a phase.
How the NDoH 2021 table ranks South African vaccination phases
The National Department of Health of South Africa published a three-phase COVID-19 vaccine rollout in early 2021 so provinces could invite people when first doses were scarce. Phase 1 covers frontline healthcare workers who faced daily clinical exposure in hospitals, clinics, emergency services, and similar settings, and who received the first South African doses through the Sisonke Johnson and Johnson trial from mid-February 2021.
Phase 2 covers four overlapping groups that the national strategy treated together: essential workers such as teachers, police, municipal staff, and mining workers; persons living in congregate settings including old-age homes, shelters, prisons, and detention centres; every person aged sixty years and older; and adults aged eighteen and over with comorbidities that raise the risk of severe COVID-19, such as diabetes, hypertension, HIV, tuberculosis, obesity, cardiovascular disease, chronic respiratory disease, chronic kidney disease, or cancer.
Phase 3 covers remaining persons aged eighteen and over who did not already match a higher group. The engine collects every matching group, then assigns the highest-priority phase: 1 beats 2, which beats 3, which beats 4. A sixty-five-year-old nurse is therefore Phase 1 from occupation, not Phase 2 from age.
A forty-year-old teacher is Phase 2 from essential work even without comorbidities. A healthy thirty-year-old with no listed occupation is Phase 3. The ranking is an educational replay of that historical NDoH table, not an Electronic Vaccination Data System appointment, not a provincial booking portal, and not a substitute for the current Expanded Programme on Immunisation.
Who uses this South African queue, and its limits
Public-health classrooms and tabletop exercises use a South Africa vaccine queue calculator so students can see why a clinic nurse, a sixty-seven-year-old living at home, a forty-year-old with diabetes, a teacher, a prison resident, and a healthy twenty-five-year-old were not interchangeable when first doses were scarce, and so they can read a concrete phase instead of a vague early-2021 label. Occupational-health and emergency-preparedness teams run the same contract during scarce-dose drills without standing up a live immunization registry or scraping the Electronic Vaccination Data System.
Journalists and policy explainers need a deterministic oracle that returns Phase 2 for a forty-year-old with comorbidities, Phase 1 for a healthcare worker of the same age, and Phase 3 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 EVDS booking tool, and not the current seasonal COVID-19 or influenza schedule, which the National Department of Health and the Expanded Programme on Immunisation update separately.
People seeking a real appointment should follow NDoH, their province, their clinic, or their clinician, not any single automated label from a historical allocation table.
What you can do with it
Classroom NDoH allocation drills
Let students submit age, occupation, and comorbidities and see which South African phase the 2021 NDoH table assigns, including why a higher group wins when two groups match.
Occupational-health scarce-dose exercises
Rank a workforce roster into Phase 1 through 4 during preparedness drills without connecting to EVDS or inventing a custom spreadsheet of healthcare, essential-worker, congregate, age, and comorbidity rules.
FAQ
How does the South Africa vaccine queue tool assign an NDoH phase?
It ranks age, occupation (healthcare, essential, congregate, or none), and comorbidities against the National Department of Health 2021 COVID-19 rollout table and returns the highest matching phase (1, 2, 3, or 4).
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.
Which occupations map to which South African phases?
healthcare is Phase 1 (frontline healthcare workers). essential is Phase 2 (teachers, police, municipal, mining, and similar). congregate is Phase 2 (old-age homes, shelters, prisons, detention centres). none does not add an occupation group; age and comorbidities still can. When several groups match, the highest-priority phase is returned.
Does a comorbidity always assign Phase 2?
Only for ages 18 and over, and only when no higher phase applies. Healthcare workers remain Phase 1 even with comorbidities. People aged 60 and over are already Phase 2 from age. Under 18, comorbidities do not move the original adult table; those ages map to Phase 4 unless an occupation group already applies.
Which phase is a healthy adult with no priority job in South Africa?
Phase 3, which covers people aged 18 and over who did not match a higher group, such as a healthy thirty-year-old. People under 18 are shown as Phase 4, matching the later adolescent and child expansions.
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-sa \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"age":42}'const res = await fetch("https://api.kit.forhosting.com/health/vaccine-queue-sa", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"age": 42
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/health/vaccine-queue-sa",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"age": 42
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/health/vaccine-queue-sa", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"age":42}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"age":42}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/health/vaccine-queue-sa", 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": 42
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "health.vaccine_queue_sa",
"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 the NDoH 2021 table ranks South African vaccination phases
This endpoint maps remaining persons under eighteen to Phase 4 so every nonnegative age receives a phase instead of a silent gap, matching the later adolescent and pediatric expansions that opened after the adult campaign.
Input contract, assigned-phase response, and age validation
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 healthcare, essential, congregate, or none; omitted occupation defaults to none so a lone age still yields a phase. comorbidities is a boolean that is true when an NDoH-listed adult comorbidity from the 2021 campaign is present; omitted values default to false. Aliases exist for each canonical name so older forms can map without renaming columns: age also accepts age_years and years; occupation also accepts job, work, occupation_class, and worker_group; comorbidities also accepts comorbidity, comorbid, conditions, and medical_conditions. Age that is missing, negative, fractional, boolean, infinite, or otherwise not a nonnegative integer fails with invalid_input naming age and is not charged. Unknown occupation strings and non-boolean comorbidity flags fail the same way. On success the body echoes age, occupation, and comorbidities, then returns phase as the machine key 1, 2, 3, or 4; phase_label for display; phase_rank as 1 for the highest priority through 4 for remaining people under eighteen; qualifying_group and qualifying_group_label for the group that won the rank; reasons as every matching group key; framework naming the NDoH 2021 table; and method sa_ndoh_covid19_rollout. Identical inputs always yield identical JSON because the path never touches a network, a model, a clock, or a random generator.
Where a South Africa vaccine-queue API earns its keep, and honest limits
The browser tool is free; prepaid API calls cost $0.002 per successful item and invalid input is never billed.
Integration use cases
Explainers and deterministic fixtures
Pin the assigned phase in journalism notebooks and continuous-integration tests so a healthy adult, an adult with comorbidities, and a healthcare worker never silently swap labels.
Technical questions
What does the South Africa vaccine phase calculator cost?
The browser tool is free. API requests use prepaid balance at $0.002 per successful call; invalid input is not billed.