How 'BackSearch' Becomes a Search Engine That Lets AI See the Web as It Existed in the Past, Without Future Knowledge

People who build forecasting systems keep running into the same awkward fact. A model can look clever on a question whose answer is already known, and still be cheating. The cheat is rarely explicit. It is usually the web itself. 

Search engines rank pages that have been rewritten after the event. News sites update headlines. Wikipedia absorbs the outcome. A live query asked in 2026 about January 2026 does not reconstruct what a reader could have known in January. 

It reconstructs what the internet looks like now, with hindsight folded into the ranking and the text.

That gap matters more as large language models (LLMs) are asked to price assets, score prediction-market questions, and act inside simulated worlds. 

A backtest that mixes past questions with present pages is not a backtest. It is a leakage test. 

Researchers have been saying this for a while. Some freeze search snippets at the moment a question is written. Some train models only on text that existed before a cutoff. Some wrap the Wayback Machine so an agent can pull an old copy of a URL it already knows. 

The shared instinct is simple. If the evidence window is not pinned, the score is not trustworthy.

This time, General Reasoning released a narrow tool aimed at that pinning problem. 

Calling it the ''BackSearch,' the tool is literally a search engine and fetch API, but only for a frozen archive. 

Every request carries an as of date. Search returns documents crawled on or before that date. Fetch returns the article text as it was stored then, not the live rewrite. 

The corpus does not move, so the same query on the same date is meant to return the same results later. 

The first slice is small: news from December 2025 through early August 2026, plus SEC filings from 2023 into mid-2026. The company frames it for forecasting, quantitative research, reinforcement-learning environments, and benchmarks that need a web that does not keep changing under the experiment.

It's worth noting though, none of that BackSearch invents time travel on the web. 

import json, os, requests
from openai import OpenAI
AS_OF = "2026-01-15"
KEY = os.environ["OPENREWARD_API_KEY"]
def call(path, **body):
   body["as_of"] = AS_OF
   return requests.post(f"https://search.openreward.ai/{path}",
                        headers={"x-api-key": KEY},
                        json={k: v for k, v in body.items() if v}).json()
def web_search(query, allowed_domains=None, blocked_domains=None):
   return call("search", query=query, k=5, allowed_domains=allowed_domains,
               blocked_domains=blocked_domains)["hits"]
def web_fetch(url, prompt=None):
   page = call("fetch", url=url, prompt=prompt, summarize=bool(prompt))
   # No capture on or before AS_OF: hand the model a soft error it can recover from
   return page.get("text", "This page could not be retrieved.")[:4000]
TOOLS = [
   {"type": "function", "name": "web_search",
    "description":
        "- Searches the web and returns a list of results to cite\n"
        "- Pass allowed_domains to restrict the search, or blocked_domains to "
        "exclude sites, never both\n"
        "- Cite every URL you rely on as a markdown link",
    "parameters": {"type": "object", "required": ["query"], "properties": {
        "query": {"type": "string"},
        "allowed_domains": {"type": "array", "items": {"type": "string"}},
        "blocked_domains": {"type": "array", "items": {"type": "string"}}}}},
   {"type": "function", "name": "web_fetch",
    "description":
        "- Fetches the content of a web page\n"
        "- Takes a URL and a prompt describing what to extract from it\n"
        "- Use it to read a page returned by web_search",
    "parameters": {"type": "object", "required": ["url"], "properties": {
        "url": {"type": "string"},
        "prompt": {"type": "string"}}}},
]
TOOLBOX = {"web_search": web_search, "web_fetch": web_fetch}
client = OpenAI()
inputs = [{"role": "user", "content":
          "Today is 15 January 2026. Where does the Bank of Japan's policy rate "
          "stand? Research it and cite your source."}]
while True:
   resp = client.responses.create(model="gpt-5.6-sol", input=inputs, tools=TOOLS)
   inputs += resp.output
   calls = [o for o in resp.output if o.type == "function_call"]
   if not calls:
       print(resp.output_text)
       break
   for c in calls:
       inputs.append({"type": "function_call_output", "call_id": c.call_id,
                      "output": json.dumps(TOOLBOX[c.name](**json.loads(c.arguments)))[:6000]})

The Internet Archive has been storing page snapshots since 1996. Its CDX and availability APIs have let developers list and retrieve captures for years. The Memento protocol, proposed in 2009 and later standardized, added a datetime dimension to HTTP so a client could ask for a resource as it existed at a chosen moment. 

Aggregators collected those captures across archives. Academic systems went further toward search. Chronica, in 2006, tried to index archive crawls so a user could query a time range instead of a single URL. Tempas, around 2016, ranked past pages using bookmark tags and later temporal link graphs. 

Information-retrieval work on time-travel inverted indexes studied how to search versioned collections without scanning everything.

Commercial news stacks covered part of the same ground in a different way. 

Terminals and databases such as Factiva, LexisNexis, and Bloomberg have long let analysts restrict coverage by publication date. Newer news APIs do the same with from and to filters. Live search APIs used by agents, including Brave and Perplexity, accept freshness windows or before and after dates. 

While those filters are useful and widely used in forecasting papers, they are also not the same as a frozen crawl. 

A publish-date filter on a live index can still surface a page that was edited after the event, or a ranking that knows how the story ended.

What BackSearch is selling, then, is not the first historical web, and not the first date filter. It is a particular packaging: ranked retrieval over a static, crawl-gated news slice, paired with a fetch of the archived body, exposed as two agent-shaped endpoints. 

As of 15 January 2026, the Bank of Japan's policy rate is 0.75% - technically
a target of "around 0.75%" for the uncollateralized overnight call rate.

The BOJ raised it by 25 basis points from 0.50% in December 2025, bringing the
rate to its highest level in roughly 30 years. A Reuters report dated January 15
describes 0.75% as the current rate and notes that economists expect it to
remain unchanged at the BOJ's January meeting.
(https://www.channelnewsasia.com/business/boj-raise-rates-again-1-or-higher-...)

Long story short, BackSearch sits in a narrow band between those older systems. 

It is smaller than the Wayback Machine and less general than Memento. It is easier to call than a homemade Common Crawl index, and more stable than a live search engine that may or may not respect a date filter. 

A forecast that lived in mainstream news in early 2026 can be tested here. A question that turned on blogs, forums, or a page that was never crawled cannot.

The older tools still hold the wider record. Known URLs belong in archives. Long histories of filings and wire copy still belong in incumbent news databases. 

A simple request for articles dated before Friday can already be sent to several search APIs, leakage and all. What is newer is the demand that an agent search the public web as a fixed object at a given date and receive the same object when the run is repeated. 

Research stated that requirement first. The product is an attempt to make it ordinary.

Published