
Gives Claude research capabilities with built-in fact-checking and source verification. Every answer comes with citations, confidence scores, and evidence tracking. The verification pipeline decomposes claims, runs semantic matching against source text, checks cross-source consensus, and detects contradictions. You get three depth modes: fast for quick lookups, thorough for iterative confidence-gated retrieval with counter-query verification, and deep for multi-step agentic research with gap analysis. Streaming API sends progress events as it searches, extracts, and verifies. Reach for this when you need Claude to research questions where accuracy matters and you want programmatic trust signals, not just LLM-generated text with links appended.
Research infrastructure for AI agents with Grounded Intelligence — real-time web search, evidence extraction, verification, and structured citations. Every claim is backed by a URL. Every answer has a confidence score.
Agent → LastSearch → Internet → Verified answers + sources
Website · Playground · API Docs · Alternatives · Discord
Package names: npm:
lastsearch· PyPI:lastsearch· LangChain:langchain-lastsearch— Previouslylastsearchandlastsearch. Old names still work and redirect automatically.
search → fetch pages → neural rerank → extract claims → verify → cited answer (streamed)
Every answer goes through a multi-step verification pipeline. No hallucination. Every claim is backed by a real source.
Confidence scores are evidence-based — not LLM self-assessed. After the LLM extracts claims and sources, a post-extraction verification engine checks every claim against the actual source page text:
.gov/.edu → major news → tech journalism → community → low-quality). Dynamic scoring that improves from real verification data.live (resolves now), stale (link rot — archived once), or dead (no DNS, no archive — likely fabricated). Deep-research agents hallucinate a meaningful share of citation URLs; this makes "every citation resolves" a checkable guarantee.Claims include verified, verificationScore, consensusCount, and consensusLevel fields. Sources include verified, authority, and urlHealth. Detected contradictions and a citationHealth summary are returned at the top level. Agents can use these fields to make trust decisions programmatically.
Graceful fallback: When premium keys are not set, the system runs keyword-only verification. Semantic retrieval and reranking are transparent premium enhancements — no degradation, no errors.
Three depth levels control research thoroughness:
| Depth | Behavior | Use case |
|---|---|---|
fast (default) | Single search → extract → verify pass | Quick lookups, real-time agents |
thorough | Iterative confidence-gated loop (up to 3 passes), per-claim evidence retrieval, counter-query verification, multi-pass consistency checking | Important research, fact-checking |
deep | Premium multi-step agentic research: iterative think-search-extract-evaluate cycles (up to 4 total steps). Gap analysis identifies missing info, generates follow-up queries. Claims/sources merged across steps with final re-verification. Target confidence: 0.85. Requires LastSearch key + sign-in. Falls back to thorough when quota exhausted. | Complex research questions, comprehensive analysis |
# Thorough mode
curl -X POST https://lastsearch.ai/api/browse/answer \
-H "Content-Type: application/json" \
-H "Authorization: Bearer ls_xxx" \
-d '{"query": "What is quantum computing?", "depth": "thorough"}'
# Deep mode (uses premium features)
curl -X POST https://lastsearch.ai/api/browse/answer \
-H "Content-Type: application/json" \
-H "Authorization: Bearer ls_xxx" \
-d '{"query": "Compare CRISPR approaches for sickle cell disease", "depth": "deep"}'
Deep mode runs iterative think-search-extract-evaluate cycles: each step performs gap analysis to identify what's missing, generates targeted follow-up queries, and merges claims/sources across steps with a final re-verification pass. It targets a confidence threshold of 0.85 (DEEP_CONFIDENCE_THRESHOLD) and runs up to 3 follow-up steps (MAX_FOLLOW_UP_STEPS, 4 total including the initial pass). Uses semantic reranking, multi-provider search, and multi-pass consistency. Each deep query costs 3x quota (100 deep queries/day). When quota is exhausted, deep mode gracefully falls back to thorough. Without a LastSearch key, deep mode also falls back to thorough.
Deep mode responses include reasoningSteps showing the multi-step research process (step number, query, gap analysis, claim count, confidence per step).
Get real-time progress with per-token answer streaming. The streaming endpoint sends Server-Sent Events (SSE) as each pipeline step completes. Deep mode steps are grouped by research pass for clean progress display:
curl -N -X POST https://lastsearch.ai/api/browse/answer/stream \
-H "Content-Type: application/json" \
-H "Authorization: Bearer ls_xxx" \
-d '{"query": "What is quantum computing?"}'
Events: trace (progress), sources (discovered early), token (streamed answer text), result (final answer), done.
All external API calls (search providers, LLM, page fetching) automatically retry on transient failures (429 rate limits, 5xx server errors) with exponential backoff and jitter. Auth errors (401/403) fail immediately — no wasted retries.
Persistent research sessions that accumulate knowledge across multiple queries. Later queries automatically recall prior verified claims, building deeper understanding over time.
Sessions require a LastSearch API key (
ls_xxx) for identity and ownership. Get a free key at lastsearch.ai/dashboard. For MCP, setLASTSEARCH_API_KEYenv var. For Python SDK, passapi_key="ls_xxx". For REST API, useAuthorization: Bearer ls_xxx.
# Python SDK
session = client.session("quantum-research")
r1 = session.ask("What is quantum entanglement?") # 13 claims stored
r2 = session.ask("How is entanglement used in computing?") # 12 claims recalled!
knowledge = session.knowledge() # Export all accumulated claims
# Share with other agents or humans
share = session.share() # Returns shareId + URL
# Another agent forks and continues the research
forked = client.fork_session(share.share_id)
# REST API
curl -X POST https://lastsearch.ai/api/session \
-H "Authorization: Bearer ls_xxx" \
-d '{"name": "my-research"}'
# Returns session ID, then:
curl -X POST https://lastsearch.ai/api/session/{id}/ask \
-H "Authorization: Bearer ls_xxx" \
-d '{"query": "What is quantum entanglement?"}'
# Share a session publicly
curl -X POST https://lastsearch.ai/api/session/{id}/share \
-H "Authorization: Bearer ls_xxx"
# Fork a shared session (copies all knowledge)
curl -X POST https://lastsearch.ai/api/session/share/{shareId}/fork \
-H "Authorization: Bearer ls_xxx"
Each session response includes recalledClaims and newClaimsStored. Sessions can be shared publicly and forked by other agents — enabling collaborative, multi-agent research workflows.
Complex queries are automatically decomposed into focused sub-queries with intent labels (definition, evidence, comparison, counterargument, technical, historical). Each sub-query targets a different aspect of the question, maximizing source diversity. Simple factual queries skip planning entirely — no added latency.
The entire verification pipeline improves automatically with usage:
Submit feedback on results to accelerate learning. Agents and users can rate results as good, bad, or wrong — this feeds directly into the adaptive threshold engine.
curl -X POST https://lastsearch.ai/api/browse/feedback \
-H "Content-Type: application/json" \
-d '{"resultId": "abc123", "rating": "good"}'
client.feedback(result_id="abc123", rating="good")
# Or flag a specific wrong claim:
client.feedback(result_id="abc123", rating="wrong", claim_index=2)
pip install lastsearch
from lastsearch import LastSearch
client = LastSearch(api_key="ls_xxx")
# Research with citations
result = client.ask("What is quantum computing?")
print(result.answer)
print(f"Confidence: {result.confidence:.0%}")
for source in result.sources:
print(f" - {source.title}: {source.url}")
# Thorough mode — auto-retries if confidence < 60%
thorough = client.ask("What is quantum computing?", depth="thorough")
# Deep mode — multi-step reasoning with gap analysis (requires LastSearch key)
deep = client.ask("Compare CRISPR approaches for sickle cell disease", depth="deep")
for step in deep.reasoning_steps or []:
print(f" Step {step.step}: {step.query} ({step.confidence:.0%})")
LangChain integration: (PyPI)
pip install langchain-lastsearch
from langchain_lastsearch import LastSearchAnswerTool, LastSearchSearchTool
# Use with any LangChain agent
tools = [
LastSearchAnswerTool(api_key="ls_xxx"), # Verified search with citations
LastSearchSearchTool(api_key="ls_xxx"), # Basic web search
]
# Standalone usage
tool = LastSearchAnswerTool(api_key="ls_xxx")
result = tool.invoke({"query": "What is quantum computing?", "depth": "thorough"})
5 tools available: LastSearchSearchTool, LastSearchAnswerTool (verified), LastSearchExtractTool, LastSearchCompareTool, LastSearchClarityTool (anti-hallucination).
npx lastsearch setup
Or manually add to your MCP config:
{
"mcpServers": {
"lastsearch": {
"command": "npx",
"args": ["-y", "lastsearch"],
"env": {
"LASTSEARCH_API_KEY": "ls_xxx"
}
}
}
}
Get a free API key at lastsearch.ai/dashboard.
# Basic query
curl -X POST https://lastsearch.ai/api/browse/answer \
-H "Content-Type: application/json" \
-H "Authorization: Bearer ls_xxx" \
-d '{"query": "What is quantum computing?"}'
# Thorough mode (auto-retries if confidence < 60%)
curl -X POST https://lastsearch.ai/api/browse/answer \
-H "Content-Type: application/json" \
-H "Authorization: Bearer ls_xxx" \
-d '{"query": "What is quantum computing?", "depth": "thorough"}'
# Deep mode (multi-step reasoning)
curl -X POST https://lastsearch.ai/api/browse/answer \
-H "Content-Type: application/json" \
-H "Authorization: Bearer ls_xxx" \
-d '{"query": "Compare CRISPR approaches", "depth": "deep"}'
The MCP server and frontend are open-source and can be run locally. The verification engine is a hosted service — all API requests are processed by the LastSearch cloud infrastructure.
git clone https://github.com/lastsearch-hq/lastsearch.git
cd lastsearch
pnpm install
pnpm dev:web # Run the frontend locally (API calls go to lastsearch.ai)
All API access requires a LastSearch API key (ls_xxx). Sign up for free at lastsearch.ai/dashboard.
| Method | How | Verification | Limits |
|---|---|---|---|
| LastSearch API Key (Free) | Authorization: Bearer ls_xxx | Full premium — semantic verification, multi-provider, multi-pass consistency | Generous quota with graceful fallback |
| LastSearch API Key (Pro) | Authorization: Bearer ls_xxx | Full premium — unlimited, no fallback | Unlimited + priority queue, managed keys, team seats |
| Demo (website) | No auth needed | Keyword verification | 1 query/hour per IP |
The free tier includes 100 premium queries/day (or ~33 deep queries/day at 3x cost each). When the quota is reached, queries gracefully fall back to keyword verification (or deep falls back to thorough) — still works, just basic matching. Quota resets every 24 hours. Pro removes all limits.
API responses include quota info when using a LastSearch key:
{
"success": true,
"result": { ... },
"quota": { "used": 12, "limit": 100, "premiumActive": true }
}
/apps/mcp MCP server (stdio transport, npm: lastsearch)
/packages/shared Shared types, Zod schemas, constants
/packages/python-sdk Python SDK (PyPI: lastsearch)
/src React frontend (Vite, port 8080)
/supabase Database migrations
The verification engine (API server) is in a separate private repository (lastsearch-hq/lastsearch-engine) and runs as a hosted service.
| Endpoint | Description |
|---|---|
POST /browse/search | Search the web |
POST /browse/open | Fetch and parse a page |
POST /browse/extract | Extract structured claims from a page |
POST /browse/answer | Full pipeline: search + extract + cite. depth: "fast", "thorough", or "deep" |
POST /browse/answer/stream | Streaming answer via SSE — real-time token streaming + progress events |
POST /browse/compare | Compare raw LLM vs evidence-backed answer |
POST /browse/clarity | Clarity — anti-hallucination answer engine. Three modes: mode: "prompt" (enhanced prompts only), mode: "answer" (LLM answer, default), mode: "verified" (LLM + web fusion). Legacy verify: true = mode: "verified" |
GET /browse/share/:id | Get a shared result |
GET /browse/stats | Total queries answered |
GET /browse/sources/top | Top cited source domains |
GET /browse/analytics/summary | Usage analytics (authenticated) |
POST /session | Create a research session |
POST /session/:id/ask | Research with session memory (recalls + stores claims) |
POST /session/:id/recall | Query session knowledge without new search |
GET /session/:id/knowledge | Export all session claims |
POST /session/:id/share | Share a session publicly (returns shareId) |
GET /session/share/:shareId | View a shared session (public, no auth) |
POST /session/share/:shareId/fork | Fork a shared session into your account |
GET /session/:id | Get session details |
GET /sessions | List your sessions (authenticated) |
DELETE /session/:id | Delete a session (authenticated) |
POST /browse/feedback | Submit feedback on a result (good/bad/wrong) |
GET /browse/learning/stats | Self-learning engine stats |
GET /user/stats | Your query stats (authenticated) |
GET /user/history | Your query history (authenticated) |
DELETE /user/data | Delete all your data (GDPR right to erasure) |
| Tool | Description |
|---|---|
search | Search the web for information on any topic |
open | Fetch and parse a web page into clean text |
extract | Extract structured claims from a page |
answer | Full pipeline: search + extract + cite. depth: "fast", "thorough", or "deep" |
compare | Compare raw LLM vs evidence-backed answer |
clarity | Anti-hallucination answer engine — three modes: prompt (prompts only), answer (LLM), verified (LLM + web fusion) |
session_create | Create a research session (persistent memory) |
session_ask | Research within a session (recalls prior knowledge) |
session_recall | Query session knowledge without new web search |
session_share | Share a session publicly (returns share URL) |
session_knowledge | Export all claims from a session |
session_fork | Fork a shared session to continue the research |
feedback | Submit feedback on a result to improve accuracy |
| Method | Description |
|---|---|
client.search(query) | Search the web |
client.open(url) | Fetch and parse a page |
client.extract(url, query=) | Extract claims from a page |
client.ask(query, depth=) | Full pipeline with citations. depth: "fast", "thorough", or "deep" |
client.compare(query) | Raw LLM vs evidence-backed |
client.session(name) | Create a research session |
session.ask(query, depth=) | Research with memory recall |
session.recall(query) | Query session knowledge |
session.knowledge() | Export all session claims |
session.share() | Share session publicly (returns shareId + URL) |
client.get_session(id) | Resume an existing session by ID |
client.list_sessions() | List all your sessions |
client.fork_session(share_id) | Fork a shared session into your account |
session.delete() | Delete a session |
client.feedback(result_id, rating) | Submit feedback (good/bad/wrong) to improve accuracy |
Async support: AsyncLastSearch with the same API.
Use LastSearch with your own data sources instead of — or alongside — public web search. Supports Elasticsearch, Confluence, and custom endpoints with optional zero data retention for compliance.
# Elasticsearch
result = client.ask("What is our refund policy?", search_provider={
"type": "elasticsearch",
"endpoint": "https://es.internal.company.com/kb/_search",
"authHeader": "Bearer es-token-xxx",
"index": "docs",
})
# Confluence
result = client.ask("PCI compliance process?", search_provider={
"type": "confluence",
"endpoint": "https://company.atlassian.net/wiki/rest/api",
"authHeader": "Basic base64-creds",
"spaceKey": "ENG",
})
# Zero data retention (nothing stored, cached, or logged)
result = client.ask("Patient protocols", search_provider={
"type": "elasticsearch",
"endpoint": "https://es.hipaa.company.com/medical/_search",
"authHeader": "Bearer token",
"dataRetention": "none",
})
# REST API — enterprise search
curl -X POST https://lastsearch.ai/api/browse/answer \
-H "Content-Type: application/json" \
-H "Authorization: Bearer ls_xxx" \
-d '{
"query": "What is our refund policy?",
"searchProvider": {
"type": "elasticsearch",
"endpoint": "https://es.internal.company.com/kb/_search",
"authHeader": "Bearer es-token-xxx",
"index": "docs"
}
}'
Every answer includes structured fields for programmatic trust decisions:
{
"answer": "Quantum computing uses qubits...",
"confidence": 0.82,
"shareId": "abc123def456",
"effectiveDepth": "thorough",
"claims": [
{
"claim": "Qubits can exist in superposition",
"sources": ["https://en.wikipedia.org/wiki/Qubit"],
"verified": true,
"verificationScore": 0.87,
"consensusCount": 3,
"consensusLevel": "strong"
}
],
"sources": [
{
"url": "https://en.wikipedia.org/wiki/Qubit",
"title": "Qubit - Wikipedia",
"domain": "en.wikipedia.org",
"quote": "A qubit is the basic unit of quantum information...",
"verified": true,
"authority": 0.70
}
],
"contradictions": [
{
"claimA": "Quantum computers are faster for all tasks",
"claimB": "Quantum advantage only applies to specific problems",
"topic": "quantum computing performance",
"nliConfidence": 0.89
}
],
"reasoningSteps": [
{ "step": 1, "query": "quantum computing basics", "gapAnalysis": "Initial research pass", "claimCount": 8, "confidence": 0.65 },
{ "step": 2, "query": "quantum computing vs classical comparison", "gapAnalysis": "Missing classical vs quantum comparison", "claimCount": 14, "confidence": 0.82 }
],
"trace": [
{ "step": "Search Web", "duration_ms": 423, "detail": "5 results" },
{ "step": "Fetch Pages", "duration_ms": 1205, "detail": "4 pages" }
],
"quota": { "used": 12, "limit": 50, "premiumActive": true }
}
Key fields:
confidence — evidence-based score (0-1), not LLM self-assessedshareId — unique ID for sharing this result (use with /browse/share/:id)effectiveDepth — actual depth used ("fast", "thorough", or "deep") — may differ from requested depth due to fallbackclaims[].verified — whether the claim was verified against source textclaims[].consensusLevel — "strong" (3+ sources), "moderate", or "weak"contradictions — detected conflicts between claims (with confidence score)reasoningSteps — deep mode only: multi-step research iterations with gap analysistrace — execution timeline for debugging and monitoringquota — premium quota usage (LastSearch key users only): used, limit, premiumActiveSee the examples/ directory for ready-to-run agent recipes:
| Example | Description |
|---|---|
| research-agent.py | Simple research agent with citations |
| deep-research-agent.py | Multi-step deep reasoning with gap analysis |
| streaming-agent.py | Real-time SSE streaming with progress events |
| contradiction-detector.py | Surface contradictions across sources |
| enterprise-search.py | Custom data sources + zero retention mode |
| code-research-agent.py | Research libraries/docs before writing code |
| hallucination-detector.py | Compare raw LLM vs evidence-backed answers |
| langchain-agent.py | LastSearch as a LangChain tool |
| crewai-research-team.py | Multi-agent research team with CrewAI |
| research-session.py | Research sessions with persistent memory |
| Tutorial | What You'll Build |
|---|---|
| coding-agent/ | Agent that researches before writing code — never recommends deprecated libraries |
| support-agent/ | Agent that verifies answers before responding — escalates when confidence is low |
| content-agent/ | Agent that writes blog posts where every stat has a citation |
| fact-checker-bot/ | Discord bot that verifies any claim with !verify and !compare |
| is-this-true/ | Web app — paste any sentence, get a confidence score and sources |
| debate-settler/ | CLI tool — two claims battle it out, evidence decides the winner |
| docs-verifier/ | Verify every factual claim in your README or docs |
| podcast-prep/ | Research brief builder for podcast interviews |
These are for running the MCP server or frontend locally. The verification engine runs as a hosted service and does not require local configuration.
| Variable | Required | Description |
|---|---|---|
LASTSEARCH_API_KEY | Yes (MCP) | LastSearch API key (ls_xxx) — get one at lastsearch.ai/dashboard |
Pre-built skills that teach AI coding agents (Claude Code, Codex, Cursor, etc.) when and how to use LastSearch:
npx skills add lastsearch-hq/lastsearch-skills
| Skill | What it does |
|---|---|
| research | Evidence-backed answers with citations and confidence |
| fact-check | Compare raw LLM vs evidence-backed, verify claims |
| extract | Structured claim extraction from URLs |
| sessions | Multi-query research with persistent knowledge |
| deep-dive | Multi-step agentic research with reasoning chains and gap analysis |
| compare-claims | Settle factual disputes — evidence-backed vs raw LLM side-by-side |
| monitor | Track evolving topics over time, diff against prior knowledge |
| cite | Generate formatted citations (APA/MLA) with authority scores |
| clarity | Clarity — anti-hallucination answer engine with optional web verification |
See CONTRIBUTING.md for setup instructions, coding conventions, and PR process.
This project uses an open-core model:
| Component | License | What it means |
|---|---|---|
| SDKs, MCP server, integrations, frontend (this repo) | Apache 2.0 | Use freely, modify, redistribute |
| Verification engine (separate private repo) | BSL 1.1 | Hosted service — free to use via API, but source is not public. Converts to Apache 2.0 on 2030-03-25 |
See the LICENSE file for details on this repository.
BROWSE_API_KEY*secretBrowseAI Dev API key (get one at https://browseai.dev/dashboard). Required for all API access.