Revised Geneva score
A 70-year-old with a heart rate of 80 and pain in one leg scores 7 points, an intermediate probability of pulmonary embolism. The rule uses only objective findings, with no gut-feeling item. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- Age
- 70
- Heart rate
- 80
- Age points
- 1
- Previous dvt or pe points
- 0
- Surgery or fracture points
- 0
- Active malignancy points
- 0
The revised Geneva score is a fully objective clinical prediction rule for the pretest probability of pulmonary embolism. Le Gal and colleagues published it so emergency teams could estimate PE likelihood from risk factors, heart rate, and symptoms without the one subjective Wells item that asks whether PE is the most likely diagnosis. Eight additive findings contribute integer points: age greater than sixty-five years, previous deep-vein thrombosis or pulmonary embolism, surgery or fracture within one month, active malignancy, unilateral lower-limb pain, hemoptysis, heart-rate bands of seventy-five to ninety-four or ninety-five or more beats per minute, and pain on lower-limb deep venous palpation together with unilateral edema. The integer total maps to low, intermediate, or high probability of pulmonary embolism. This capability implements that published rule as a pure function: you send a positive heart rate, an age, and the six yes-or-no findings, and you receive each component together with the summed score and the probability category. A heart rate that is not a positive number is rejected with invalid input rather than being folded into an absolute value.
How the revised Geneva score is defined
The revised Geneva score is a structured pretest-probability rule for pulmonary embolism that uses only objective findings. Le Gal and colleagues published it in 2006 so that emergency clinicians could estimate PE likelihood without the one subjective Wells item that asks whether PE is the most likely diagnosis. Eight criteria are added as integer points.
Age greater than sixty-five years contributes one point. A documented previous deep-vein thrombosis or pulmonary embolism contributes three points. Surgery or a lower-limb fracture within the previous month contributes two points.
An active malignant condition contributes two points. Unilateral lower-limb pain contributes three points. Hemoptysis contributes two points.
Heart rate is banded: seventy-five through ninety-four beats per minute contributes three points, and ninety-five or more contributes five points; a rate below seventy-five contributes nothing. Pain on lower-limb deep venous palpation together with unilateral edema contributes four points. The integer total occupies the closed range from zero through twenty-two.
Published three-level cutoffs map zero through three to low probability, four through ten to intermediate probability, and eleven or more to high probability. This capability implements those inclusive thresholds exactly. It does not compute the simplified revised Geneva score in which most items are worth one point, it does not compute the Wells PE score, and it does not replace D-dimer testing, CT pulmonary angiography, or a clinician.
A heart rate that is not a positive finite number cannot represent beats per minute and fails with invalid input rather than being silently inverted. Always frame outputs as educational scores from the published revised Geneva rule, not as a clinical diagnosis or a substitute for professional judgment, imaging, or local treatment protocols.
Where revised Geneva calculators show up in real work
Pulmonary-embolism education, emergency-medicine clerkships, and physician-assistant courses constantly assign revised Geneva drills from textbook vignettes, so a single trusted oracle that returns the integer beside each component speeds grading and demo setup. Simulation centres and electronic worksheet products want a documented age, heart-rate, and risk-factor path that clients can audit by hand rather than a black-box PE risk model that mixes Wells items, PERC criteria, and D-dimer without disclosure.
Research assistants preparing synthetic triage datasets need stable revised Geneva labels from known findings without network calls or model drift, and they need a hard reject when a heart rate arrives as zero or negative so dirty extracts cannot masquerade as scores. If you later need the Wells PE score, the simplified revised Geneva score, PERC, YEARS, or a D-dimer interpretation, treat those as separate search intents and landings rather than overloading this revised Geneva calculator page.
Always present results as educational estimates from the published eight-item rule; clinical decisions require qualified professionals, a suspected-PE context this tool does not collect, and protocols that may combine the score with D-dimer or imaging. Keep requests small, pin the integer score and the probability category in tests, and you get reproducible revised Geneva figures for homework, LMS plugins, and edge workers without standing up a clinical information system of your own.
What you can do with it
Classroom revised Geneva answer keys
Generate the 0–22 score, component points, and low, intermediate, or high PE probability from textbook age, heart rate, and risk-factor flags so instructors and auto-graders share one transparent ground truth.
Emergency-medicine PE teaching drills
Show the eight objective revised Geneva criteria in teaching labs without mixing Wells, PERC, or D-dimer interpretation on the same landing.
FAQ
What is the revised Geneva score?
The revised Geneva score is an eight-item objective rule for the pretest probability of pulmonary embolism. It adds points for age over 65, previous DVT or PE, recent surgery or fracture, active malignancy, unilateral lower-limb pain, hemoptysis, heart-rate bands, and palpation pain with unilateral edema. The total runs from 0 to 22.
What formula do you use?
revised Geneva = (age>65)×1 + (previous DVT/PE)×3 + (surgery/fracture <1 month)×2 + (active malignancy)×2 + (unilateral lower-limb pain)×3 + (hemoptysis)×2 + (heart rate 75–94)×3 or (≥95)×5 + (palpation pain and unilateral edema)×4. Scores 0–3 are low, 4–10 intermediate, and 11 or more high probability. This is the original revised rule, not the simplified 1-point variant and not Wells.
What happens if the heart rate is not a positive number?
Zero, negative, NaN, Infinity, and non-numeric heart-rate values are rejected rather than being converted to an absolute value or a silent NaN.
How do I format the input?
Booleans may be true/false, yes/no, or 1/0. Heart rate must be a positive number of beats per minute.
What does it cost?
The browser tool is free and runs locally.
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/revised-geneva-score \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"age":70,"heart_rate":80,"previous_dvt_or_pe":false,"surgery_or_fracture":false,"active_malignancy":false,"unilateral_lower_limb_pain":true,"hemoptysis":false,"pain_on_palpation_and_edema":false}'const res = await fetch("https://api.kit.forhosting.com/health/revised-geneva-score", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"age": 70,
"heart_rate": 80,
"previous_dvt_or_pe": false,
"surgery_or_fracture": false,
"active_malignancy": false,
"unilateral_lower_limb_pain": true,
"hemoptysis": false,
"pain_on_palpation_and_edema": false
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/health/revised-geneva-score",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"age": 70,
"heart_rate": 80,
"previous_dvt_or_pe": false,
"surgery_or_fracture": false,
"active_malignancy": false,
"unilateral_lower_limb_pain": true,
"hemoptysis": false,
"pain_on_palpation_and_edema": false
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/health/revised-geneva-score", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"age":70,"heart_rate":80,"previous_dvt_or_pe":false,"surgery_or_fracture":false,"active_malignancy":false,"unilateral_lower_limb_pain":true,"hemoptysis":false,"pain_on_palpation_and_edema":false}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"age":70,"heart_rate":80,"previous_dvt_or_pe":false,"surgery_or_fracture":false,"active_malignancy":false,"unilateral_lower_limb_pain":true,"hemoptysis":false,"pain_on_palpation_and_edema":false}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/health/revised-geneva-score", 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": 70,
"heart_rate": 80,
"previous_dvt_or_pe": false,
"surgery_or_fracture": false,
"active_malignancy": false,
"unilateral_lower_limb_pain": true,
"hemoptysis": false,
"pain_on_palpation_and_edema": false
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "health.revised_geneva_score",
"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
Successful API calls use the published $0.002 per item; invalid input is not billed.
How the revised Geneva score is defined
The computation is pure comparison and addition with no network calls, no random seeds, no wall-clock timestamps, and no model drift, so identical inputs always yield identical JSON.
What you send and what you get back
Send eight fields. The field hemoptysis is true when the person is coughing blood. Booleans accept true, false, yes, no, one, and zero. Inclusive bands matter at the edges: a heart rate of seventy-five scores three points, ninety-four scores three, and ninety-five scores five. Age of sixty-five scores zero because the rule is strictly greater than sixty-five. A worked intermediate example is age seventy, heart rate eighty, and unilateral lower-limb pain with every other finding false, which yields one plus three plus three equals seven points and intermediate probability. The field age is age in years and must be a finite non-negative number; aliases years and age_years are accepted. The field heart_rate is the pulse in beats per minute and must be a positive finite number; zero, negative values, NaN, Infinity, and non-numeric text fail with invalid_input naming that field. Aliases hr, pulse, bpm, and heart_rate_bpm are accepted. Six boolean findings follow. The field previous_dvt_or_pe is true when the person has a history of deep-vein thrombosis or pulmonary embolism. The field surgery_or_fracture is true when surgery or a lower-limb fracture occurred within one month. The field active_malignancy is true when an active malignant condition is present. The field unilateral_lower_limb_pain is true when pain is limited to one lower limb. The field pain_on_palpation_and_edema is true when pain on lower-limb deep venous palpation and unilateral edema are both present. Missing required fields, empty strings, and non-finite numbers fail with invalid_input and are not charged. On success the response echoes the cleaned inputs, reports each item's points, reports score as the integer sum from zero to twenty-two, sets probability to low, intermediate, or high using the published cutoffs, and includes unit_heart_rate as bpm, unit_age as years, plus formula and method strings for display and for pinning in tests. Pricing for successful API calls is the published $0.002 per item; validation failures do not consume prepaid balance.
Where revised Geneva calculators show up in real work
Because this capability is a pure parse engine, API pricing is the published base of $0.002 per successful item and failed validation does not consume balance.
Integration use cases
Deterministic PE-probability fixtures
Bulk-produce stable revised Geneva labels for synthetic triage datasets and regression tests, with hard invalid_input when heart rate is not a positive number.