Security
The path of one ballot.
From the moment you confirm your choice to the moment anyone can check the record, a ballot goes through six steps. Each one is described here with the limit that comes with it.
Six steps, in order
Each tag names the row in our claims register the sentence rests on. The limit under each step is part of the claim, not a footnote to it.
SealedC1C2
Your choice is encrypted with AES-256-GCM before it is stored, under a key held outside the database. If the system cannot encrypt a ballot, it refuses the ballot rather than storing it in the clear.
LimitBaalot holds the key, because it computes the tally. A refused ballot is not queued: you see an error and cast it again.
ChainedC3C4
Every accepted ballot adds one entry to the election's audit chain, in the same database transaction as the ballot. Each entry commits to the one before it with SHA-256, so altering a past entry breaks every entry after it.
LimitTamper-evident, not tamper-proof. Someone holding Baalot's server key could rewrite the chain and recompute every hash after it.
ReceiptC6
Each ballot produces a receipt that only your device holds. Check my vote uses it to confirm your ballot is in the record, and the check never shows anyone who you voted for.
LimitIt proves your ballot was recorded as cast, not that the tally counted it. Lose the device and the receipt goes with it; Baalot cannot reissue it.
TimestampedC15
While an election is open, and for a day after it closes, Baalot timestamps the chain's root and entry count through OpenTimestamps whenever they change. Within a few hours each one is committed to a Bitcoin block and cannot be back-dated. Anyone can check the proof with the free OpenTimestamps client.
LimitBaalot's server makes the checkpoints and they are periodic, so a change before the first one or between two is not exposed. Only a SHA-256 digest of one line of text goes to Bitcoin.
Root emailedC16
When an election closes, the institution's administrators are emailed the final chain root, the number of entries and a timestamp proof of both. Baalot cannot edit that email afterwards.
LimitIt is a check only if the institution keeps the email, and the root it records is Baalot's.
Anyone can replayC5
The verification endpoint is public and needs no account. Anyone can ask it to replay an election's chain and report whether it is intact.
Limit5,000 replays a day across everyone. Above about 20,000 entries one call checks the shard heads only, and the response says so.
Check an election yourself
The verification endpoint is public and needs no account. Ask it to replay an election's chain and it reports whether every entry still links to the one before it.C5
The response says whether it replayed every entry or, for a very large election, the shard heads only. A replay checks Baalot's data against itself, so keep the close email and its timestamp proof as the copy Baalot cannot change.C16
Replay one election
GET https://api.baalot.site/api/bbc-chain?action=verify&electionId=<id>Replace <id> with the election's id. Without one the endpoint answers 400, Missing electionId.
What this does not protect against
We would rather you read these here than find them during an election.
It does not hide your choice from Baalot. Baalot holds the ballot key, because it computes the tally.C1
Ballots cast before 9 August 2026 were stored before sealing existed and are not encrypted.C1
The replay checks Baalot's data against itself. What a rewrite cannot get past is a timestamp proof or the close email kept outside Baalot.C4
One ballot per member is only as good as the institution's roster. Where a membership has no matric number recorded, one person holding two accounts can vote twice.C7
When results are published, the ballot count is recorded next to the chain's entry count. A mismatch is shown; it does not stop the result.C8
NIN or BVN verification is optional and Pro-only. It is not a condition of voting; eligibility comes from the institution's roster.C10
Fingerprint and face unlock happen on your device. The server never receives a biometric and cannot tell whether one was used.C11
Traffic between the app and Baalot is encrypted with TLS. That is ordinary, and we do not count it as a feature.C9
See where this fits in an election
The six steps above happen inside one stage of an election. The platform walkthrough shows the rest, from bringing in the roster to publishing provisional results.

