Trivia night round scoring calculator with wagers and leaderboard
This trivia night round scoring calculator turns adjudicated team answers into a complete score history.
Run — free
Runs in your browser. Free, unlimited — your data never leaves this page.
Define each standard round and its point value, mark every team answer as correct or incorrect, then supply each team's final wager and whether that wager answer was correct. The result shows points gained in each round, cumulative totals, shared ranks, the final leaderboard, and every winner. It also protects the game from an invalid wager by rejecting any amount above the team's score immediately before the wager round.
Set up rounds and team answers in matching order
Start by listing the standard rounds in the order they are played. Every round needs a unique name and a non-negative point value. Then add each team with one boolean answer for every listed round: true means the answer was accepted as correct, while false means it was incorrect. The answer positions must match the round positions exactly. If the third round is the music round, the third answer for every team must describe that music-round result. This explicit alignment keeps the scoring rule simple and auditable, and it prevents a missing answer from silently shifting every later score. Team names must also be unique, because the name identifies that team in every leaderboard snapshot. The calculator intentionally does not judge free-text answers or decide whether spelling is close enough. Resolve disputes first, enter the final ruling as a boolean, and use this tool for consistent arithmetic. You can use decimal point values and decimal wagers when the event rules allow them, provided every number is finite and non-negative.
Follow the cumulative leaderboard after every round
For each standard round, a correct answer adds that round's point value and an incorrect answer adds zero. After applying those points, the calculator sorts all teams by cumulative total and records a complete leaderboard snapshot. Each row contains the points earned in that particular round as well as the new total, so a host can explain both what changed and where every team now stands. Teams with equal totals receive the same competition rank. For example, if two teams tie for first place, both are ranked first and the next team is ranked third. Within a tie, names are ordered alphabetically only to make the JSON and on-screen table stable; alphabetical order is not treated as a sporting tiebreaker. Because every snapshot is retained, the output is useful for live display, post-event review, and troubleshooting a disputed total. A host can trace a final score backward round by round instead of reconstructing it from a single final table or a handwritten sheet.
Apply the final wager safely and identify winners
The wager round happens after every standard round has been scored. Each team supplies a non-negative wager amount and a boolean indicating whether its wager answer was correct. A correct wager adds the amount; an incorrect wager subtracts it. Before applying any wager, the calculator checks that every team has wagered no more than its current score. If even one amount is too large, the request fails with an input error that names the team, the wager, and the available score. This all-or-nothing validation avoids returning a leaderboard built from an illegal game state. A wager equal to the current score is valid, so an incorrect all-in wager can reduce a team to zero. The final wager appears as its own leaderboard snapshot, with positive or negative round points and updated cumulative totals. The response also repeats the final leaderboard for convenient access and returns a winners list. If the best score is tied, every team sharing that score appears in the winners list rather than forcing an invented tiebreaker. API requests use the displayed $0.002 base price.
What you can do with it
Run a pub trivia final
Track changing positions through themed rounds, validate the final wagers, and announce one winner or a genuine tie.
Power a live leaderboard
Use each cumulative snapshot to refresh a screen after the host confirms the answers for a round.
Audit a disputed score
Review round points and cumulative totals to find exactly where a team's reported score changed.
FAQ
How are standard rounds scored?
A correct answer earns the round's configured point value. An incorrect answer earns zero points.
What happens on an incorrect wager answer?
The wager amount is subtracted from the team's score. A correct wager adds the same amount.
Can a team wager all of its points?
Yes. A wager may equal the team's current score, but it cannot exceed that score.
How are ties ranked?
Teams with equal totals share a competition rank. Their names are ordered alphabetically only for deterministic display, and all top-scoring teams are returned as winners.
Do answer arrays have to match the rounds?
Yes. Every team must provide exactly one boolean answer per standard round in the same order as the rounds list.
What does an API request cost?
Each API request uses the displayed base price of $0.002. The browser version is free to run on this page.
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/game/trivia-night-round-scoring \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"rounds":[{"name":"General Knowledge","point_value":10},{"name":"Picture Round","point_value":20}],"teams":[{"name":"The Quizzards","answers":[true,false],"wager_amount":5,"wager_correct":true},{"name":"Fact Hunters","answers":[true,true],"wager_amount":10,"wager_correct":false}]}'const res = await fetch("https://api.kit.forhosting.com/game/trivia-night-round-scoring", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"rounds": [
{
"name": "General Knowledge",
"point_value": 10
},
{
"name": "Picture Round",
"point_value": 20
}
],
"teams": [
{
"name": "The Quizzards",
"answers": [
true,
false
],
"wager_amount": 5,
"wager_correct": true
},
{
"name": "Fact Hunters",
"answers": [
true,
true
],
"wager_amount": 10,
"wager_correct": false
}
]
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/game/trivia-night-round-scoring",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"rounds": [
{
"name": "General Knowledge",
"point_value": 10
},
{
"name": "Picture Round",
"point_value": 20
}
],
"teams": [
{
"name": "The Quizzards",
"answers": [
true,
false
],
"wager_amount": 5,
"wager_correct": true
},
{
"name": "Fact Hunters",
"answers": [
true,
true
],
"wager_amount": 10,
"wager_correct": false
}
]
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/game/trivia-night-round-scoring", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"rounds":[{"name":"General Knowledge","point_value":10},{"name":"Picture Round","point_value":20}],"teams":[{"name":"The Quizzards","answers":[true,false],"wager_amount":5,"wager_correct":true},{"name":"Fact Hunters","answers":[true,true],"wager_amount":10,"wager_correct":false}]}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"rounds":[{"name":"General Knowledge","point_value":10},{"name":"Picture Round","point_value":20}],"teams":[{"name":"The Quizzards","answers":[true,false],"wager_amount":5,"wager_correct":true},{"name":"Fact Hunters","answers":[true,true],"wager_amount":10,"wager_correct":false}]}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/game/trivia-night-round-scoring", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"rounds": [
{
"name": "General Knowledge",
"point_value": 10
},
{
"name": "Picture Round",
"point_value": 20
}
],
"teams": [
{
"name": "The Quizzards",
"answers": [
true,
false
],
"wager_amount": 5,
"wager_correct": true
},
{
"name": "Fact Hunters",
"answers": [
true,
true
],
"wager_amount": 10,
"wager_correct": false
}
]
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "game.trivia_night_round_scoring",
"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_teams | 50 |
max_rounds | 20 |
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. |