Caching
Results are cached, and we tell you when. Every fact carries the timestamp it was actually established, so a cached answer is never presented as a fresh one.
You can always tell
Two fields do this. servedFromCache on the response says whether any result was reused, and checkedAt on each individual result is the real moment that platform was checked, not the moment you asked. In the example below one platform was checked yesterday and the other minutes ago, and you can see which is which.
{
"servedFromCache": true,
"results": [
{ "platform": "github", "registered": true, "checkedAt": "2026-08-25T09:14:02.118Z" },
{ "platform": "reddit", "registered": false, "checkedAt": "2026-08-26T11:40:55.902Z" }
]
}How long each answer is trusted
Different facts go stale at different speeds, so they get different lifetimes. A confirmed registration is trusted longer than a “not found”, because someone can sign up tomorrow but rarely deletes an account.
| Result | Reused for | Why |
|---|---|---|
| registered: true | 48 hours | People rarely delete accounts |
| registered: false | 12 hours | A negative can flip any day |
| breaches | 14 days | Historical, does not change |
| phoneDetails | 7 days | Carrier and validity move slowly |
| webMentions | 24 hours | Search results shift, but not by the minute |
Repeating the same query
An identical query within five minutes returns the previous response as-is. Beyond that, each platform is re-checked only if its own answer has gone stale by the table above, so a repeat query is usually part fresh and part reused, which is exactly what the per-result checkedAt lets you see.
Cached lookups still count
A cached result counts against your quota the same as a fresh one. Caching exists to make responses fast and to avoid hammering the platforms we check, not as a billing loophole. And pricing it any other way would give us a reason to serve you staler data.