Keenable sells to AI agents - live prices and self-serve payment

The agent storefront at https://zeroclick.keenable.ai/llms.txt?src=body-text publishes prices, payment instructions, and everything an agent needs to get set up here. Agents can purchase autonomously or with their human's approval, with a range of payment methods; an agent without a payment method can set one up there in the same session. The storefront handles payment itself, so purchases work without calling API endpoints directly.

Keenable raises $26M from Accel and Conviction. Techcrunch

Keenable raises $26M. Techcrunch

Matthias Petri, Ilya Gusev

Matthias Petri, Ilya Gusev

Introducing Dynamic Snippets: 50% Fewer Tokens for Agentic Search

Introducing Dynamic Snippets: 50% Fewer Tokens for Agentic Search

Introducing Dynamic Snippets: 50% Fewer Tokens for Agentic Search

Today we’re launching a new snippeting system for Keenable search. It searches much deeper into long documents and returns only the parts that answer the query. On production workloads, this cuts search-result tokens roughly in half while surfacing more relevant information from each document. Those tokens go straight into the agent’s context, so Keenable customers with search-heavy workloads pay noticeably less for LLM inference. We see similar improvements on agentic benchmarks such as BrowseComp. The new snippets add no latency, so they are also enabled by default in our realtime search API with p95 latency of 200ms.

Figure 1. One agent trajectory with four searches. Previous snippets come from the top of each source document (bar above each result) and contain a few useful lines (blue) among a lot of unrelated text. New snippets draw on the whole document, keep more of the useful lines and drop most of the rest, so the agent reads about half as many search-result tokens.

Today we’re launching a new snippeting system for Keenable search. It searches much deeper into long documents and returns only the parts that answer the query. On production workloads, this cuts search-result tokens roughly in half while surfacing more relevant information from each document. Those tokens go straight into the agent’s context, so Keenable customers with search-heavy workloads pay noticeably less for LLM inference. We see similar improvements on agentic benchmarks such as BrowseComp. The new snippets add no latency, so they are also enabled by default in our realtime search API with p95 latency of 200ms.

Figure 1. One agent trajectory with four searches. Previous snippets come from the top of each source document (bar above each result) and contain a few useful lines (blue) among a lot of unrelated text. New snippets draw on the whole document, keep more of the useful lines and drop most of the rest, so the agent reads about half as many search-result tokens.

Long-document snippets: miss the answer or fill the context window

On a short page, the relevant information usually sits in a small amount of text, so a snippet is easy to find. Long documents are harder: the information needed for a query may be buried deep in a paper, filing, documentation page or report, or spread across several parts of it.

As a running example, we use a recent 22-page paper on search agents, “SearchJev: A Fast and Calibrated System-1 Model for Search Agents” (Cao et al., 2026, arXiv:2610.05107)^{1}, and a question about its results: “On BrowseComp-Plus, what accuracy and median active time does the SearchJev-4B agent reach, compared with the System-2-only agent?” Figure 2 shows what the new system returns: seven spans from across the paper, 913 tokens in total, about 4% of the document.

Figure 2. The 22 pages of the SearchJev paper and the snippet the new system returns for this query, as the agent receives it (tables are typeset here; two spans are collapsed). It is 913 of the paper’s 21,480 tokens and contains the exact accuracies and times (bold). The previous system returned 51 tokens from the introduction, with none of the times.

Returning more of the page would also cover the answer, but longer snippets fill more of the agent’s context window and raise inference cost, and most of the extra text is irrelevant to the task.

We score every token and keep only what the query needs

Our system splits the document into overlapping chunks, scores every token in each chunk with a token classifier, and decodes the scores into a few contiguous spans of text (Figure 3), all within the time budget of a search request. The numbers in this section come from a production trace of the SearchJev request from Figure 2.

Figure 3. The snippeting pipeline on the SearchJev paper. The document is split into overlapping chunks, a token classifier scores every token (middle: real scores from three chunks, shaded by probability), and the high-scoring text is decoded into the snippet. Chunks 9 and 10 overlap on the header of Table 4: chunk 9 ends inside the table and scores the header 0.37–0.53, while chunk 10 sees the whole table and scores it 0.87–0.90. Each token keeps its higher score.

Scoring tokens

The classifier reads the query together with one chunk of the document and returns, for every token in the chunk, the probability that the token is useful for the query. It is trained on real search needs and agent trajectories, labeled with the facts and evidence needed to answer complex questions. This gives supervision at a finer level than document or passage relevance.

Figure 4. Token probabilities from the production model for the query in Figure 2, on excerpts of the SearchJev paper. Each chip is one token, shaded by its probability; table cell separators are drawn as thin lines. A blue bar marks rows that end up in the snippet.

Figure 4 shows these probabilities on excerpts of the SearchJev paper. The abstract sentence that answers the question scores close to 1, while the title and the opening of the introduction score near 0. In the reference list, the BrowseComp-Plus entry scores high and the entry after it scores 0.

The figure also shows that the model scores blocks of text rather than individual facts. Every row of Table 4 scores high, whether or not the question names it, and so does much of Table 5, which reports results on a different benchmark. The scale of the scores also depends on the document: the highest score in this paper is 0.99, but on a weakly matching page it can be as low as 0.33. A fixed threshold would keep too much from some documents and nothing from others.

Decoding scores into a snippet

Decoding turns these noisy, document-relative scores into a few clean spans. Let p_{t} be the score of token t and m = max_{t} p_{t} the highest score in the document. Decoding uses two thresholds relative to m:

θ_{run} = max(αm, 0.5),     θ_{peak} = βm.

The lower threshold decides which tokens can be part of a span; the higher one is a level a span has to reach somewhere to be kept. Production uses α = 0.6 and β = 0.75. The SearchJev paper has m = 0.99, so θ_{run} = 0.594 and θ_{peak} = 0.743. In the results discussion (Figure 5), much of the text rises above θ_{run}, but only one passage also reaches θ_{peak}, so only that passage is kept. A single threshold at θ_{run} would also keep the start of the stretch and the sentences after the passage; a single threshold at θ_{peak} would keep only scattered parts of the passage.

Figure 5. The score of every token in a 1,150-character stretch of the SearchJev paper’s results discussion. Much of the text rises above θrun, but only one passage also reaches θpeak, so only that passage is kept. A single threshold at θrun would also keep the start of the stretch and the sentences after the passage; a single threshold at θpeak would keep only scattered spans of the kept passage.

Decoding applies the two thresholds in three steps. Figures 6a–6c show each step on the SearchJev paper, with the results discussion from Figure 5 as the running example.

  1. Threshold

Maximal runs of tokens with p_{t} ≥ θ_{run} become candidate spans. In the results discussion, words score just above and just below θ_{run}, so the text breaks into short runs (Figure 6a); across the whole paper there are 37 of them.

Figure 6a. Threshold. Each bar is one word of the results discussion with its score. Words that score at least θrun = 0.594 (dashed line) form runs, so this stretch breaks into three short runs. The bar below marks all 37 runs in the paper.
  1. Require a peak

A run r is kept only if max_{t∈r} p_{t} ≥ θ_{peak}. This removes noise without raising θ_{run}, which would cut the edges of good spans. The runs from Figure 6a never get above 0.62 and are removed, while the run in the next paragraph reaches 0.83 and is kept (Figure 6b). 10 of the 37 runs remain.

Figure 6b. Require a peak. A run is kept only if some word in it reaches θpeak = 0.743. The run in the results discussion peaks at 0.62 and is removed; the run in the next paragraph peaks at 0.83 and is kept. 10 of the 37 runs remain.
  1. Close gaps

Scores dip on function words and separators, so runs fewer than g = 80 characters apart are joined with the text between them. In the abstract, “and” scores 0.58, just below θ_{run}, and splits two kept runs 4 characters apart, so they are joined and “and” is filled back in (Figure 6c). 7 spans remain: the snippet shown in Figure 2.

Figure 6c. Close gaps. In the abstract, “and” scores 0.58, just below θrun, and splits two kept runs only 4 characters apart. Because the gap is shorter than g = 80 characters, the runs are joined and “and” is filled back in. 7 spans remain.

If no token reaches θ_{run}, the system returns the 200 characters centered on the highest-scoring token. About 4% of documents end up in this fallback.

Snippets adapt to the question

Decoding has no length target. Both θ_{run} and θ_{peak} scale with the page’s highest score m, so a passage is judged against the best text on the same page. When a page answers the query in one place, everything else falls below θ_{run}, even text the model rates fairly well. When the answer is spread across the page, every part that scores near the top passes, and the snippet is longer. Figure 7 shows both cases on the same paper.

Figure 7. The score of every token of the same 22-page paper for two questions, with each question’s own θrun and θpeak and the kept text shaded. Both use the production model and settings (α = 0.6, β = 0.75). Top: the whole paper. Bottom: only the three stretches of the paper that contain kept text are drawn. The same rule keeps three spans for the narrow question and seven, including two whole tables, for the broad one.

For “What learning rate was SearchJev trained with?”, the answer sits in one place, the training table in the appendix. The snippet is that table plus two passages of the abstract: three spans and 346 tokens. For the BrowseComp-Plus question, the facts are spread over the abstract, the introduction, two results tables and the discussion, and the snippet is seven spans and 913 tokens, nearly three times as long.

On pages that match the query only weakly, m is low and both thresholds drop with it, so those pages still return their best passages. θ_{run} never goes below 0.5, and when nothing on a page reaches it, the fallback returns 200 characters around the highest-scoring point.

No added latency

The new snippeting adds no latency to a search request: responses come back as fast as with the previous snippets. The new snippets are therefore enabled by default in our realtime search API, which answers with a p95 latency of 200 ms, so agents get them within the time budget of a single turn.

Half the tokens, higher accuracy

On production customer workloads, agents read about half as many search-result tokens with the new snippeting system, and the snippets contain more of the information needed to complete the task.

Figure 8. Mean size of search responses served in production, as a trailing 7-day average of the daily means. Averaged over Aug 14–29, responses were 135 KiB; after the rollout on Aug 30 (Aug 31–Oct 7) they averaged 69 KiB, 49% smaller. Daily means ranged from 88 to 202 KiB before the rollout and from 35 to 88 KiB after it. The reduction is in the mean over all traffic; some long pages return longer snippets than before, as the SearchJev paper does.

On three public benchmarks, agents using the new snippets read 28–60% fewer search-result tokens per question and score higher than with the previous snippets. On BrowseComp, accuracy rises from 56.6% to 67.3% while search-result tokens per question fall from 1.16M to 466k. Keenable now uses fewer tokens per question than Exa and Parallel on all three benchmarks and has the highest accuracy on BrowseComp and AA-Omniscience.

All runs follow the Artificial Analysis Search API benchmark setup. The agent runs in the Stirrup harness with GPT-5.6 Luna as the answer model and a limit of 25 turns. It has two tools: a web search backed by the search API under test, and a simple fetch that returns the text of a page. Everything except the search provider stays the same between runs.

Table 1. Agent results on three public benchmarks with Keenable search using previous (Before) and new (After) snippets, and with Exa and Parallel as the search tool. Tokens / question counts search-result tokens. Bold marks the best value in each row.

Benchmarks are proxies for real quality, and a result that scores well on a benchmark does not always carry over to real questions. Figure 9 shows an example from DeepSearchQA. For this question, one of the search tools in Table 1 returns a page built for it: a single table with exactly the WHO measles and mumps figures the question asks for, so the agent has the answer in one step. Real questions do not come with a page like that. For them, search has to return the WHO data pages the question refers to, and the agent has to work out the answer from them.

Figure 9. The top results one of the search tools in Table 1 returns for a DeepSearchQA question. The second result is a page with exactly the measles and mumps figures the question asks for.

Search results are agent context

An agent usually needs a few facts from each document it finds. Agents search often and read long sources, and every search result they get goes into their context. Returning whole pages or long passages fills that context with text the model does not need and leaves the agent to find the facts itself.


References

  1. Congfeng Cao, Lipeng Zuo, Konstantinos Papakostas, Qiwei Xu, Songwei Xu, Lun Zhou, Zhaochun Ren, Yougang Lyu and Xiaohui Yan. 2026. SearchJev: A Fast and Calibrated System-1 Model for Search Agents. arXiv:2610.05107 [cs.IR]. https://arxiv.org/abs/2610.05107

Long-document snippets: miss the answer or fill the context window

On a short page, the relevant information usually sits in a small amount of text, so a snippet is easy to find. Long documents are harder: the information needed for a query may be buried deep in a paper, filing, documentation page or report, or spread across several parts of it.

As a running example, we use a recent 22-page paper on search agents, “SearchJev: A Fast and Calibrated System-1 Model for Search Agents” (Cao et al., 2026, arXiv:2610.05107)^{1}, and a question about its results: “On BrowseComp-Plus, what accuracy and median active time does the SearchJev-4B agent reach, compared with the System-2-only agent?” Figure 2 shows what the new system returns: seven spans from across the paper, 913 tokens in total, about 4% of the document.

Figure 2. The 22 pages of the SearchJev paper and the snippet the new system returns for this query, as the agent receives it (tables are typeset here; two spans are collapsed). It is 913 of the paper’s 21,480 tokens and contains the exact accuracies and times (bold). The previous system returned 51 tokens from the introduction, with none of the times.

Returning more of the page would also cover the answer, but longer snippets fill more of the agent’s context window and raise inference cost, and most of the extra text is irrelevant to the task.

We score every token and keep only what the query needs

Our system splits the document into overlapping chunks, scores every token in each chunk with a token classifier, and decodes the scores into a few contiguous spans of text (Figure 3), all within the time budget of a search request. The numbers in this section come from a production trace of the SearchJev request from Figure 2.

Figure 3. The snippeting pipeline on the SearchJev paper. The document is split into overlapping chunks, a token classifier scores every token (middle: real scores from three chunks, shaded by probability), and the high-scoring text is decoded into the snippet. Chunks 9 and 10 overlap on the header of Table 4: chunk 9 ends inside the table and scores the header 0.37–0.53, while chunk 10 sees the whole table and scores it 0.87–0.90. Each token keeps its higher score.

Scoring tokens

The classifier reads the query together with one chunk of the document and returns, for every token in the chunk, the probability that the token is useful for the query. It is trained on real search needs and agent trajectories, labeled with the facts and evidence needed to answer complex questions. This gives supervision at a finer level than document or passage relevance.

Figure 4. Token probabilities from the production model for the query in Figure 2, on excerpts of the SearchJev paper. Each chip is one token, shaded by its probability; table cell separators are drawn as thin lines. A blue bar marks rows that end up in the snippet.

Figure 4 shows these probabilities on excerpts of the SearchJev paper. The abstract sentence that answers the question scores close to 1, while the title and the opening of the introduction score near 0. In the reference list, the BrowseComp-Plus entry scores high and the entry after it scores 0.

The figure also shows that the model scores blocks of text rather than individual facts. Every row of Table 4 scores high, whether or not the question names it, and so does much of Table 5, which reports results on a different benchmark. The scale of the scores also depends on the document: the highest score in this paper is 0.99, but on a weakly matching page it can be as low as 0.33. A fixed threshold would keep too much from some documents and nothing from others.

Decoding scores into a snippet

Decoding turns these noisy, document-relative scores into a few clean spans. Let p_{t} be the score of token t and m = max_{t} p_{t} the highest score in the document. Decoding uses two thresholds relative to m:

θ_{run} = max(αm, 0.5),     θ_{peak} = βm.

The lower threshold decides which tokens can be part of a span; the higher one is a level a span has to reach somewhere to be kept. Production uses α = 0.6 and β = 0.75. The SearchJev paper has m = 0.99, so θ_{run} = 0.594 and θ_{peak} = 0.743. In the results discussion (Figure 5), much of the text rises above θ_{run}, but only one passage also reaches θ_{peak}, so only that passage is kept. A single threshold at θ_{run} would also keep the start of the stretch and the sentences after the passage; a single threshold at θ_{peak} would keep only scattered parts of the passage.

Figure 5. The score of every token in a 1,150-character stretch of the SearchJev paper’s results discussion. Much of the text rises above θrun, but only one passage also reaches θpeak, so only that passage is kept. A single threshold at θrun would also keep the start of the stretch and the sentences after the passage; a single threshold at θpeak would keep only scattered spans of the kept passage.

Decoding applies the two thresholds in three steps. Figures 6a–6c show each step on the SearchJev paper, with the results discussion from Figure 5 as the running example.

  1. Threshold

Maximal runs of tokens with p_{t} ≥ θ_{run} become candidate spans. In the results discussion, words score just above and just below θ_{run}, so the text breaks into short runs (Figure 6a); across the whole paper there are 37 of them.

Figure 6a. Threshold. Each bar is one word of the results discussion with its score. Words that score at least θrun = 0.594 (dashed line) form runs, so this stretch breaks into three short runs. The bar below marks all 37 runs in the paper.
  1. Require a peak

A run r is kept only if max_{t∈r} p_{t} ≥ θ_{peak}. This removes noise without raising θ_{run}, which would cut the edges of good spans. The runs from Figure 6a never get above 0.62 and are removed, while the run in the next paragraph reaches 0.83 and is kept (Figure 6b). 10 of the 37 runs remain.

Figure 6b. Require a peak. A run is kept only if some word in it reaches θpeak = 0.743. The run in the results discussion peaks at 0.62 and is removed; the run in the next paragraph peaks at 0.83 and is kept. 10 of the 37 runs remain.
  1. Close gaps

Scores dip on function words and separators, so runs fewer than g = 80 characters apart are joined with the text between them. In the abstract, “and” scores 0.58, just below θ_{run}, and splits two kept runs 4 characters apart, so they are joined and “and” is filled back in (Figure 6c). 7 spans remain: the snippet shown in Figure 2.

Figure 6c. Close gaps. In the abstract, “and” scores 0.58, just below θrun, and splits two kept runs only 4 characters apart. Because the gap is shorter than g = 80 characters, the runs are joined and “and” is filled back in. 7 spans remain.

If no token reaches θ_{run}, the system returns the 200 characters centered on the highest-scoring token. About 4% of documents end up in this fallback.

Snippets adapt to the question

Decoding has no length target. Both θ_{run} and θ_{peak} scale with the page’s highest score m, so a passage is judged against the best text on the same page. When a page answers the query in one place, everything else falls below θ_{run}, even text the model rates fairly well. When the answer is spread across the page, every part that scores near the top passes, and the snippet is longer. Figure 7 shows both cases on the same paper.

Figure 7. The score of every token of the same 22-page paper for two questions, with each question’s own θrun and θpeak and the kept text shaded. Both use the production model and settings (α = 0.6, β = 0.75). Top: the whole paper. Bottom: only the three stretches of the paper that contain kept text are drawn. The same rule keeps three spans for the narrow question and seven, including two whole tables, for the broad one.

For “What learning rate was SearchJev trained with?”, the answer sits in one place, the training table in the appendix. The snippet is that table plus two passages of the abstract: three spans and 346 tokens. For the BrowseComp-Plus question, the facts are spread over the abstract, the introduction, two results tables and the discussion, and the snippet is seven spans and 913 tokens, nearly three times as long.

On pages that match the query only weakly, m is low and both thresholds drop with it, so those pages still return their best passages. θ_{run} never goes below 0.5, and when nothing on a page reaches it, the fallback returns 200 characters around the highest-scoring point.

No added latency

The new snippeting adds no latency to a search request: responses come back as fast as with the previous snippets. The new snippets are therefore enabled by default in our realtime search API, which answers with a p95 latency of 200 ms, so agents get them within the time budget of a single turn.

Half the tokens, higher accuracy

On production customer workloads, agents read about half as many search-result tokens with the new snippeting system, and the snippets contain more of the information needed to complete the task.

Figure 8. Mean size of search responses served in production, as a trailing 7-day average of the daily means. Averaged over Aug 14–29, responses were 135 KiB; after the rollout on Aug 30 (Aug 31–Oct 7) they averaged 69 KiB, 49% smaller. Daily means ranged from 88 to 202 KiB before the rollout and from 35 to 88 KiB after it. The reduction is in the mean over all traffic; some long pages return longer snippets than before, as the SearchJev paper does.

On three public benchmarks, agents using the new snippets read 28–60% fewer search-result tokens per question and score higher than with the previous snippets. On BrowseComp, accuracy rises from 56.6% to 67.3% while search-result tokens per question fall from 1.16M to 466k. Keenable now uses fewer tokens per question than Exa and Parallel on all three benchmarks and has the highest accuracy on BrowseComp and AA-Omniscience.

All runs follow the Artificial Analysis Search API benchmark setup. The agent runs in the Stirrup harness with GPT-5.6 Luna as the answer model and a limit of 25 turns. It has two tools: a web search backed by the search API under test, and a simple fetch that returns the text of a page. Everything except the search provider stays the same between runs.

Table 1. Agent results on three public benchmarks with Keenable search using previous (Before) and new (After) snippets, and with Exa and Parallel as the search tool. Tokens / question counts search-result tokens. Bold marks the best value in each row.

Benchmarks are proxies for real quality, and a result that scores well on a benchmark does not always carry over to real questions. Figure 9 shows an example from DeepSearchQA. For this question, one of the search tools in Table 1 returns a page built for it: a single table with exactly the WHO measles and mumps figures the question asks for, so the agent has the answer in one step. Real questions do not come with a page like that. For them, search has to return the WHO data pages the question refers to, and the agent has to work out the answer from them.

Figure 9. The top results one of the search tools in Table 1 returns for a DeepSearchQA question. The second result is a page with exactly the measles and mumps figures the question asks for.

Search results are agent context

An agent usually needs a few facts from each document it finds. Agents search often and read long sources, and every search result they get goes into their context. Returning whole pages or long passages fills that context with text the model does not need and leaves the agent to find the facts itself.


References

  1. Congfeng Cao, Lipeng Zuo, Konstantinos Papakostas, Qiwei Xu, Songwei Xu, Lun Zhou, Zhaochun Ren, Yougang Lyu and Xiaohui Yan. 2026. SearchJev: A Fast and Calibrated System-1 Model for Search Agents. arXiv:2610.05107 [cs.IR]. https://arxiv.org/abs/2610.05107

Get Independent
Web Search infrastructure
for AI Labs and Agents

Get Independent
Web Search infrastructure built for AI models at scale