Keenable Time Machine
Web pages change after they’re published, and search engines only ever serve the current version. That makes it hard to reconstruct what a query would have returned before a given event, or on a past date.
Keenable Time Machine reproduces the search results Keenable would have returned at a past moment. Add query_time to any Search API request to exclude pages acquired later and recompute freshness and ranking relative to that timestamp.
{
"query": "who will win the 2026 UEFA Champions League final?",
"query_time": "2026-05-30T09:00:00Z"
}- 12026 UEFA Champions League final
- 22026 UEFA Champions League final - Wikiwand
- 32025–26 UEFA Champions League
- 4Who Won the Champions League Final 2026?
- 5Champions League 2025-26: PSG Crowned in Budapest | Squawka
- 1PSG chases second title, Arsenal targets first in Champions League final tonight
- 22026 UEFA Champions League final
- 3PSG vs Arsenal: UEFA Champions League final – 10 things to know | Football News - News Beep
- 4When is Champions League final 2026? Date, kick-off time, TV channel and live stream as Arsenal play PSG in Budapest
- 5Arsenal Reach Champions League Final: North London News 2026
The only thing that changes is query_time. Rows acquired after the match are marked orange, those from before it blue. Every response on this page is real, from api.keenable.ai/v1/search.
The web keeps changing
one query · 37 days · 50 query timesThe web changes every minute. Pages are published, edited, and re-crawled, and search engines re-index and re-rank on top of that, so the results for a fixed query keep shifting, and around an event they can turn over completely. Below is one query run at 50 query times across 37 days, from the semifinals to just after the final. Each dot is a top-10 result at its acquired time, coloured by finalist; the line is query_time advancing. Watch Arsenal appear first as they reach the final, then PSG, then the whole set flip to the result the moment the line crosses kick-off.
- Apr 14PSG beat Liverpool 2-0 at Anfield (4-0 agg)
- Apr 15Atletico Madrid beat Barcelona 3-2 agg to reach semis
- Apr 15Bayern Munich beat Real Madrid 6-4 agg to reach semis
- Apr 16Arsenal beat Sporting 1-0 agg to reach semis
- Apr 28PSG beat Bayern 5-4 in semi-final first leg
- Apr 29Arsenal vs Atletico Madrid semi-final first leg (1-1)
- May 5Arsenal beat Atletico Madrid 1-0 (2-1 agg) to reach final
- May 6PSG draw 1-1 with Bayern (6-5 agg) to reach final
- May 302026 UEFA Champions League Final: PSG vs Arsenal
- May 30Kai Havertz scores to give Arsenal 1-0 lead
- May 30Ousmane Dembele penalty equalizes 1-1 for PSG
- May 30PSG win 4-3 on penalties after 1-1 draw (AET)
Over these 50 query times the top result changed 21 times, and 129 different pages passed through the top 10. That is a single query across 37 days.
Only the acquired date is always there
acquired_at · published_at · query_timeIn search, “when” is ambiguous. Every result carries an acquired date, the moment Keenable crawled that version of the page. Many also carry a published date, but that one is declared by the publisher, so it is often missing and, when present, can disagree with the crawl by months. A query can name a third date: the moment you want to search as of.
Where the dates come from
- Acquired time (
acquired_at): stamped by Keenable’s crawler when it fetched that version of the page. Always present, and it reflects when the content entered the index. - Published time (
published_at): pulled from the page’s own metadata (og:article:published_time, JSON-LDdatePublished, meta date tags) when it exists. It is whatever the publisher declared: unverified, often absent, and easily left stale on a page that keeps changing. - Query time (
query_time): the moment you search as of. It excludes pages acquired later and anchors every ranking signal to that instant.
Here is a real result for this query, and it is a full match report. Its published_at is stamped 15:09 UTC on May 30, before the 18:00 CEST kick-off, so a published_before filter set to the match keeps it. But Keenable crawled the page at 19:56, once the final was over, and the copy it stored already names the winner and the score. The declared time is before the match; the snapshot behind it is not.
{
"url": "fox8live.com/2026/05/30/paris-saint-germain-tops-arsenal-shootout-...",
"published_at": "2026-05-30T15:09:34Z", // stamped before the 18:00 CEST kick-off
"acquired_at": "2026-05-30T19:56:24Z", // but crawled after the final, once the result was out
"snippet": "Paris Saint-Germain defeated Arsenal in a dramatic penalty
shootout ... winning the shootout 4-3 ... for the second
year in a row."
// The published time is before the match; the stored copy is the match report.
// published_before trusts published_at and cannot tell the two apart.
}The published date is whatever the source declared, so a page can carry a timestamp from before the match while the copy behind it was crawled after. The result above does exactly that: stamped 15:09, before kick-off, but crawled at 19:56 with “PSG won the shootout 4-3” in the body. A page first published before the match and updated once it was over, a live blog or a fixtures table, passes a published_before filter the same way while holding the score.
In a forecasting eval this breaks the result. The model is meant to predict the final; if the pages it retrieves already report the score, you are grading reading comprehension and calling it prediction. RL environments have the same gap. A tool call that returns pages crawled after the episode’s cutoff leaks the future the agent was supposed to work out, and because a live index keeps moving, the same task can return different documents from one run to the next, so the policy learns behaviour that only pays off because the environment keeps shifting under it.
query_time gates on acquired time instead, so a page is in scope only if Keenable had stored it by the query time, and the ranking is recomputed as of that moment. The declared publication date never enters the decision.
The three filters
The same query at the same moment, filtered three ways. Each column is a real response; published_before and acquired_before scope the documents, but only query_time also rewinds the ranking, so the order matches what the index would have produced then.
published_beforeGates on the publisher’s declared date, which is unverified. Several results were crawled after the final (flagged), so the copy can postdate the anchor.
Inspect response
It will be played at the Puskás Aréna in Budapest, Hungary, on 30 May 2026 between French club Paris Saint-Germain, the defending champions, and English club Arsenal. This will be the first…
The 2026 UEFA Champions League Final between PSG vs Arsenal will be scheduled on Saturday, May 30, 2026, at 18:00 CEST at the Puskás Aréna in Budapest, Hungary. Arsenal has secured the firs…
Paris Saint-Germain will take on Arsenal in the 2026 Champions League final. PSG eliminated Bayern Munich in the semifinals following a 1-1 draw on Wednesday to book its place in the showpi…
Arsenal have reached their second Champions League final and a first for 20 years. Bukayo Saka’s goal was enough to seal a 1-0 win on the night and a 2-1 aggregate victory over Atletico Mad…
This year’s final will be contested by English Premier League club Arsenal, who overcame Atletico Madrid in the semifinals, and French giants Paris Saint-Germain, who defeated Bayern Munich…
On 7 May 2026 GMT+7, Harry Kane, striker for Bayern Munich, German Bundesliga champions, gave an interview after the 2025-26 UEFA Champions League semifinal second leg, which ended in a 1-1…
Paris Saint-Germain will take on Arsenal in the 2026 Champions League final. PSG eliminated Bayern Munich in the semifinals following a 1-1 draw on Wednesday to book its place in the showpi…
Paris Saint-Germain will take on Arsenal in the 2026 Champions League final. PSG eliminated Bayern Munich in the semifinals following a 1-1 draw on Wednesday to book its place in the showpi…
Paris Saint-Germain will face Arsenal in the 2026 Champions League final. Holders Paris are bidding to become only the second club in the Champions League era to successfully defend their t…
Champions League final **Paris Saint-Germain vs Arsenal **Saturday 30 May, 18:00 CET Arsenal (ENG) League phase: W8 D0 L0 F23 A4 (1st place) Round of 16: 3-1agg vs Leverkusen Paris (FRA) Le…
acquired_beforeRestricts the corpus to what was indexed by the anchor, but ranks it with today’s freshness signals.
Inspect response
It will be played at the Puskás Aréna in Budapest, Hungary, on 30 May 2026 between French club Paris Saint-Germain, the defending champions, and English club Arsenal. This will be the first…
The 2026 UEFA Champions League Final between PSG vs Arsenal will be scheduled on Saturday, May 30, 2026, at 18:00 CEST at the Puskás Aréna in Budapest, Hungary. Arsenal has secured the firs…
Paris Saint-Germain will take on Arsenal in the 2026 Champions League final. PSG eliminated Bayern Munich in the semifinals following a 1-1 draw on Wednesday to book its place in the showpi…
This year’s final will be contested by English Premier League club Arsenal, who overcame Atletico Madrid in the semifinals, and French giants Paris Saint-Germain, who defeated Bayern Munich…
On 7 May 2026 GMT+7, Harry Kane, striker for Bayern Munich, German Bundesliga champions, gave an interview after the 2025-26 UEFA Champions League semifinal second leg, which ended in a 1-1…
Champions League final **Paris Saint-Germain vs Arsenal **Saturday 30 May, 18:00 CET Arsenal (ENG) League phase: W8 D0 L0 F23 A4 (1st place) Round of 16: 3-1agg vs Leverkusen Paris (FRA) Le…
Paris Saint-Germain will take on Arsenal in the 2026 Champions League final. PSG eliminated Bayern Munich in the semifinals following a 1-1 draw on Wednesday to book its place in the showpi…
Paris Saint-Germain will face Arsenal in the 2026 Champions League final. Holders Paris are bidding to become only the second club in the Champions League era to successfully defend their t…
The Opta supercomputer has predicted the winner of the 2025/26 UEFA Champions League following the completion of the quarter-final fixtures on Wednesday, April 15. Four clubs, Atletico Madr…
It will be played at the Puskás Aréna in Budapest, Hungary, on 30 May 2026 between Paris Saint-Germain and English club Arsenal. Play-offs Bye Chelsea 8–2 5–2 (H) 3–0 (A) Round of 16 Bayer…
query_timeRestricts the corpus and ranks it as of the query time, so both the set and the order match.
Inspect response
The UEFA Champions League title will be decided on Saturday night at the Puskas Arena, where reigning champions Paris Saint-Germain faces Premier League winners Arsenal in a final that brin…
It will be played at the Puskás Aréna in Budapest, Hungary, on 30 May 2026 between French club Paris Saint-Germain, the defending champions, and English club Arsenal. This will be the first…
This year’s final will be contested by English Premier League club Arsenal, who overcame Atletico Madrid in the semifinals, and French giants Paris Saint-Germain, who defeated Bayern Munich…
Arsenal are looking to win the Champions League for the first time in the club’s history after knocking out Spanish giants Atletico Madrid in the semi-finals. The Champions League final wil…
Arsenal secured their place in the UEFA Champions League final for the first time in 20 years with a 1-0 victory over Atletico Madrid. Bukayo Saka scored the decisive goal in the 44th minut…
Champions League final: How PSG and Arsenal got there BUDAPEST, Hungary (AP) — How Paris Saint-Germain and Arsenal reached the Champions League final: PSG League stage: 11th place Playoffs:…
The two 2026 Champions League finalists have been confirmed with defending champions PSG, reaching their second consecutive final, coming up against an Arsenal side who haven’t reached the…
Arsenal reached the Champions League final for the first time in 20 years as Bukayo Saka sealed a 1-0 win against Atletico Madrid on Tuesday. n second-placed Manchester City drew at Everton…
Arsenal reached the Champions League final for the first time in 20 years as Bukayo Saka sealed a 1-0 win against Atletico Madrid on Tuesday. will be crowned champions if they win their las…
Champions League final **Paris Saint-Germain vs Arsenal **Saturday 30 May, 18:00 CET Arsenal (ENG) League phase: W8 D0 L0 F23 A4 (1st place) Round of 16: 3-1agg vs Leverkusen Paris (FRA) Le…
How often results leak the future
measured · 400 forecasting questionsWe took a real forecasting benchmark, 400 questions, and searched each one at its historical date through Exa, a web-search API that supports published_at filtering, set to return only pages published before that date. Then a detector read every result and flagged any page whose content reports something from after the question. 5,555 of 14,541 returned pages did.
A published_before filter can’t catch this. 78% of the leaking pages have no publication date at all, and the filter returned them anyway; of the ones that do carry a date, it is often years stale, a page stamped 2019 serving live 2026 market data, while the content behind the URL keeps refreshing. The leaks spread across 4,339 different pages and nearly every question in the set, and they cluster on sources that are live by design.
Gating on acquired time removes the whole class of failure: a page counts only if Keenable had already crawled it at the question’s moment, so an always-current page with no date, or one refreshed after the fact, is simply out of scope.
Search API
endpoint · auth · parametersRequest
curl -s https://api.keenable.ai/v1/search \
-H "X-API-Key: $KEENABLE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"query": "who will win the 2026 UEFA Champions League final?",
"mode": "realtime",
"query_time": "2026-05-30T09:00:00Z"
}'POST https://api.keenable.ai/v1/search. Authenticate with your key in the X-API-Key header; quota is tracked per key.
Parameters
| Parameter | Type | Description |
|---|---|---|
query | string, required | The search query. Natural language or keyword. |
mode | "realtime" | Retrieval mode. "realtime" returns fresh, low-latency results. |
published_after | ISO 8601 | YYYY-MM-DD | relative | Exclude results published before this value. Gates on published time. |
published_before | ISO 8601 | YYYY-MM-DD | relative | Exclude results published after this value. Gates on published time. |
acquired_after | ISO 8601 | YYYY-MM-DD | relative | Exclude results acquired before this value. Supports relative values like "7d" or "24h". |
acquired_before | ISO 8601 | YYYY-MM-DD | relative | Exclude results acquired after this value. |
query_time | ISO 8601 datetime | Snapshot the index: only pages acquired on or before this moment are eligible, and every ranking signal is computed relative to it. |
Examples
Each temporal filter is a field you add to the request body, alongside query and mode. Combine the published_* or acquired_* pair to bound a window from both sides.
| Add to the request body | Result |
|---|---|
"published_after": "2026-05-10" | Only pages published on or after this date. |
"published_before": "2026-05-30T09:00:00Z" | Only pages published on or before this moment. |
"acquired_after": "7d" | Only pages acquired in the last seven days (relative value). |
"acquired_before": "2026-05-30T09:00:00Z" | Only pages acquired on or before this moment. |
"query_time": "2026-05-30T09:00:00Z" | Snapshot the index and rewind the ranking to this moment. |
Date fields accept ISO 8601 (2026-01-01T00:00:00Z), plain YYYY-MM-DD, or a relative value like 7d. Relative values are not supported for query_time. Full reference: interactive docs · OpenAPI spec.