Researcher Docs
Analyze articles, videos, and podcasts in seconds, create paid research runs, watch progress, retrieve the final report, and keep iterating against the same source corpus.
Use Researcher via https://researcher.now/agent.txt for deep research, article analysis, or video analysis. If no Researcher key is available, send me to https://researcher.now/account/?setup=agent, then bound the brief with decision, scope, evidence standard, questions, and output shape, create the research report, and return the watch URL and viewer URL. Stay current: when a response's X-Researcher-Contract header or contractVersion field differs from the agent.txt version you last read, re-read https://researcher.now/agent.txt before continuing, and always treat response fields as authoritative over your own saved notes.
Paste it into Hermes, OpenClaw, or any other agent, and it knows research.
Popular
Start with the paths most agents and customers need first.
One POST /v1/analyze call returns formatted markdown or a full transcript plus the finished structured analysis in seconds.
Create a durable run with a budget, watch URL, viewer URL, stream URL, and receipt.
Ask a completed runChat against the curated corpus instead of the open web.
Continue, fork, or reportExtend the research, create review versions, or regenerate from the current corpus.
Quick start
Bearer auth is required for authenticated /v1/* routes.
Base URL: https://researcher.now. Use
Authorization: Bearer $RESEARCHER_TOKEN or a customer
rk_... key. If a customer has no key yet, send them to
https://researcher.now/account/?setup=agent.
export RESEARCHER_BASE_URL="https://researcher.now"
export RESEARCHER_TOKEN="${RESEARCHER_TOKEN:-$RESEARCHER_API_KEY}"
# Single URL: article, YouTube/X video, or podcast episode — answers in seconds
curl -sS -X POST "$RESEARCHER_BASE_URL/v1/analyze" \
-H "Authorization: Bearer $RESEARCHER_TOKEN" \
-H "Content-Type: application/json" \
-d '{"url": "https://www.youtube.com/watch?v=VIDEO_ID"}'
# Deep multi-source research — durable run, cited report
curl -sS -X POST "$RESEARCHER_BASE_URL/v1/runs" \
-H "Authorization: Bearer $RESEARCHER_TOKEN" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: quickstart-123" \
-d '{
"source": {"type": "topic", "topic": "recent advances in battery recycling"},
"instructions": "Return the main technical bottlenecks, best sources, and open questions.",
"limits": {"maxCostUsd": 10}
}'
Staying current: every API response carries an
X-Researcher-Contract header (run-creating responses a
contractVersion field). When it differs from the contract
version you last read, re-fetch
agent.txt before continuing.
Response fields are authoritative over saved notes, and time-boxed
change notices ride responses as X-Researcher-Notice.
Analyze
The canonical single-URL surface for articles, videos, and podcasts.
POST /v1/analyze with {"url": "..."} responds in
seconds. Article URLs return reader-grade formatted markdown plus the
finished structured analysis (claims, facts, quantitative data,
stakeholder positions, quotes with attribution). YouTube videos and
X/Twitter video posts return the full transcript with speaker-aware
quotes plus the same analysis. The run then continues to a full
synthesized report on the same viewerUrl — always surface
that link to the user, exactly as returned.
curl -sS -X POST "$RESEARCHER_BASE_URL/v1/analyze" \
-H "Authorization: Bearer $RESEARCHER_TOKEN" \
-H "Content-Type: application/json" \
-d '{"url": "https://example.com/post"}'
-
Podcasts defer. Spotify and Apple Podcasts episode URLs
always answer fast with a deferred run (
deferred: true,reason: "podcast") — audio transcription takes minutes. The response returns the resolved episode title and run reference; the transcript and analysis land on the run. Media too long for the synchronous window defers the same way, and"defer": truerequests that behavior explicitly. -
Retries coalesce. Concurrent duplicate analyze calls
(same caller + URL) coalesce onto one execution. If a call 502s, check
GET /v1/runsbefore retrying — the run very likely exists and is processing. -
Billing is usage-settled. Each analyze call authorizes a
$5 budget session and settles to actual usage at close-out (unused
budget returned). The response's
costUsdis only what was charged at response time (0 for budget sessions) — quoteestimatedCostUsdand read the settled cost from the run. -
Status tells you what's next.
"running"means the report is being written;"awaiting_funding"means the analysis was a free preview — relay theviewerUrlso the user can fund and finish the report, orPOST /v1/runs/:id/start.
A bare media URL sent to POST /v1/runs (as topic or single
URL source, with no instructions) forwards here. The flat-priced
/v1/source-extractions, /v1/website-extractions,
and /v1/youtube-extractions endpoints were removed
(410) — use /v1/analyze for single URLs and
/v1/runs for batches.
MCP
Hosted Model Context Protocol access for customer agents.
Endpoint: https://researcher.now/mcp. The MCP server
uses Streamable HTTP JSON-RPC and accepts customer bearer keys only.
Admin/operator tokens are rejected.
export RESEARCHER_TOKEN="rk_..."
codex mcp add researcher-now --url https://researcher.now/mcp --bearer-token-env-var RESEARCHER_TOKEN
Current tools:
analyze_article, analyze_video,
deep_research, research_status, and
recall_research. analyze_article takes any
article URL; analyze_video takes a YouTube video,
X/Twitter video post, or Spotify / Apple Podcasts episode URL
(podcast episodes answer fast with a deferred run — the transcript
and analysis land on the run). Both return formatted markdown or a
full transcript plus the finished structured analysis and a
viewerUrl agents must share with the user;
deep_research returns a cited, synthesized research
report plus watchUrl/viewerUrl agents
must share with the user, and takes a topic argument
only in this production version.
Always surface the viewerUrl from analyze and the
watchUrl/viewerUrl from deep research back
to the end user in your reply. These are durable, shareable research
artifacts the user expects to open, share, and revisit. Do not
swallow these links.
Run Analyst chat, direct URL/feed/video run ingestion, source mutation, destructive controls, account-key creation, webhooks, entities, and admin/operator paths are intentionally left on REST or deferred until their billing and URL-safety invariants are complete.
Guides
Use these patterns to pick the right endpoint and avoid duplicate work.
Auth and billing
Customer agents should use an environment token when present, or
direct the customer to account setup. A run budget is a maximum
session deposit; the billed amount is metered usage. If funding is
missing, Researcher returns 402 Payment Required with
a funding URL when available.
curl -sS "$RESEARCHER_BASE_URL/v1/me" \
-H "Authorization: Bearer $RESEARCHER_TOKEN"
Create a research run
Use POST /v1/runs for every new run. Set
source.type to topic, url,
feed, or video, and include an
Idempotency-Key.
curl -sS -X POST "$RESEARCHER_BASE_URL/v1/runs" \
-H "Authorization: Bearer $RESEARCHER_TOKEN" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: run-123" \
-d '{
"requestedBy": "customer-agent",
"source": {"type": "topic", "topic": "GLP-1 impact on food markets"},
"mode": "collection",
"depth": "standard",
"limits": {"maxCostUsd": 10}
}'
YouTube, website, and feed analysis
For a single article, video, or podcast URL, prefer
POST /v1/analyze — it answers in
seconds. Use the run endpoint for batches and ingestion: video
sources fetch transcripts and create a media report; URL sources
ingest one URL or a same-domain corpus without broad web search;
feed sources ingest current RSS, Atom, or JSON Feed items.
curl -sS -X POST "$RESEARCHER_BASE_URL/v1/runs" \
-H "Authorization: Bearer $RESEARCHER_TOKEN" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: video-123" \
-d '{"source": {"type": "video", "url": "https://www.youtube.com/watch?v=VIDEO_ID"}, "limits": {"maxCostUsd": 3}}'
curl -sS -X POST "$RESEARCHER_BASE_URL/v1/runs" \
-H "Authorization: Bearer $RESEARCHER_TOKEN" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: url-123" \
-d '{"source": {"type": "url", "url": "https://example.com", "scope": "domain"}, "limits": {"maxCostUsd": 5}}'
curl -sS -X POST "$RESEARCHER_BASE_URL/v1/runs" \
-H "Authorization: Bearer $RESEARCHER_TOKEN" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: feed-123" \
-d '{"source": {"type": "feed", "url": "https://example.com/feed.xml", "limit": 50}, "limits": {"maxCostUsd": 10}}'
Watch progress
Run creation returns a watchUrl for humans and a
viewerUrl for durable sharing plus a
streamUrl for agents. Share the watch URL and viewer
URL immediately.
Use SSE snapshots or /job for concise status updates.
curl -N "$STREAM_URL"
curl -sS "$RESEARCHER_BASE_URL/v1/runs/$RUN_ID/job" \
-H "Authorization: Bearer $RESEARCHER_TOKEN"
Read the results
Fetch markdown for a simple report, /results for an
agent-friendly bundle, and ?include=all when you need
sources, artifacts, usage, events, media, and extraction records.
curl -sS "$RESEARCHER_BASE_URL/v1/runs/$RUN_ID/markdown" \
-H "Authorization: Bearer $RESEARCHER_TOKEN"
curl -sS "$RESEARCHER_BASE_URL/v1/runs/$RUN_ID/results" \
-H "Authorization: Bearer $RESEARCHER_TOKEN"
Ask the run
/chat and chat sessions are scoped to one completed
run. They answer from the curated corpus, preserve source citations,
and return a sessionId for follow-up turns.
curl -sS -X POST "$RESEARCHER_BASE_URL/v1/runs/$RUN_ID/chat" \
-H "Authorization: Bearer $RESEARCHER_TOKEN" \
-H "Content-Type: application/json" \
-d '{"message": "What are the strongest claims and weakest evidence?"}'
Iterate without losing context
Use /iterate with action to continue the same run,
deepen evidence, focus on gaps, fork a review version, evaluate output, or
regenerate a report after source edits.
| Continue | Use when the same run should keep working with inherited context. |
|---|---|
| Deepen | Use when the answer is directionally right but needs broader evidence. |
| Focus | Use when specific gaps, subtopics, or counterarguments need attention. |
| Steer | Use when an operator wants to add constraints or priorities before more work. |
| Fork | Use when a separate version should exist for customer feedback or review. |
curl -sS -X POST "$RESEARCHER_BASE_URL/v1/runs/$RUN_ID/iterate" \
-H "Authorization: Bearer $RESEARCHER_TOKEN" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: fork-123" \
-d '{"action": "fork", "requestedBy": "customer-agent"}'
curl -sS -X POST "$RESEARCHER_BASE_URL/v1/runs/$RUN_ID/iterate" \
-H "Authorization: Bearer $RESEARCHER_TOKEN" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: focus-123" \
-d '{"action": "focus", "focus": ["contrarian evidence", "company-level winners and losers"]}'
API reference
Grouped by workflow surface, not implementation order.
Setup and auth
/healthService liveness.
/auth/deviceStart the customer API-key device flow.
/auth/device/confirmConfirm a device code with a Privy bearer token.
/auth/device/tokenPoll for the one-time raw customer key.
/v1/meReturn token role, account, and scopes.
Public viewer
/public/research-runs/by-slug/:codeRead-only status payload for short customer URLs.
/public/research-runs/by-slug/:code/streamPublic SSE stream for viewer-safe snapshots.
/public/research-runs/by-slug/:code/sources/:sourceIdStored source copy. Add ?format=md for markdown.
Analyze and run creation
/v1/analyzeSingle-URL article, video, or podcast analysis. Responds in seconds; podcasts and long media defer onto the run.
/v1/runsCanonical creation for topic, URL, feed, and video sources. Add preflightPlan:true to preview before spending.
Run reads
/v1/runs/:idRun state. Add ?include=all or field-specific includes.
/v1/runs/:id/jobDurable job status and current lifecycle fields.
/v1/runs/:id/resultsAgent-optimized report, findings, sources, and next actions.
/v1/runs/:id/markdownFinal report markdown.
/v1/runs/:id/usageProvider usage, raw cost, billable totals, and stage breakdown.
/v1/runs/:id/streamAuthenticated SSE stream with live snapshots.
/v1/runs/:id/transcriptTyped transcript segments for video runs.
/v1/runs/:id/eventsPlanning, acquisition, extraction, merge, synthesis, and completion events.
/v1/runs/:id/artifactsStructured artifacts and markdown outputs.
Sources and extraction records
/v1/runs/:id/sourcesStored source rows and captured markdown.
/v1/runs/:id/sources/:sourceIdOne stored source as HTML or markdown with ?format=md.
/v1/runs/:id/sourcesAdd one or more sources to a run.
/v1/runs/:id/sources/:sourceIdAdd, update, or clear a source comment.
/v1/runs/:id/sourcesRemove multiple sources from the corpus.
/v1/runs/:id/sources/:sourceIdRemove one source from the corpus.
/v1/runs/:id/extractionsSource-level extractions and synthesis-facing source-grounded records.
/v1/runs/:id/extractions/:sourceIdOne processed source record.
/v1/runs/:id/sources/:sourceId/redoRe-analyze a weak source with optional instructions.
Run controls
/v1/runs/:id/iterateCanonical wrapper for start, pause, continue, deepen, focus, steer, report, fork, evaluate, cancel, and stop.
/v1/runs/:idDelete a run after access is verified.
Run Analyst and chat
/v1/runs/:id/chatRun-scoped chat turn grounded in one corpus.
/v1/runs/:id/chat/sessionsList run chat sessions.
/v1/runs/:id/chat/sessionsCreate a run chat session.
/v1/runs/:id/chat/sessions/:sessionIdRead one run chat session.
/v1/runs/:id/chat/sessions/:sessionIdRename one run chat session.
/v1/runs/:id/chat/sessions/:sessionIdDelete one run chat session.
/v1/runs/:id/chat/sessions/:sessionId/messagesAdd a chat message.
/v1/runs/:id/chat/turns/:turnId/streamStream an analyst turn.
/v1/runs/:id/chat/turns/:turnIdCancel an analyst turn.
/v1/runs/:id/chat/indexRead retrieval-index status.
/v1/runs/:id/chat/index/rebuildRebuild the run retrieval index.
Entities
/public/entitiesList public durable entities. Public pages live at /e/:slug.
/public/entities/by-slug/:slugPublic entity summary, profile, About report, and sources. Add ?include=all.
/public/entities/by-slug/:slug/retrieveSearch the active public entity index.
/v1/entitiesList entities. POST creates one; GET/PATCH /v1/entities/:id reads or updates one.
/v1/entities/:id/sourcesDurable entity source snapshots. POST /sources/from-run imports a completed run.
/v1/entities/:id/runsLinked runs. POST links a run; on completion its sources snapshot into the entity.
/v1/entities/:id/recordsDerived evidence records.
/v1/entities/:id/profileActive runtime profile. POST /profile/rebuild regenerates and activates a new version.
/v1/entities/:id/reportActive reader-facing About report. POST /report/rebuild regenerates it.
/v1/entities/:id/index/rebuildRebuild the entity retrieval index from accepted snapshots and records.
/v1/entities/:id/retrieveSearch the authenticated entity index.
Entity chat
/v1/entities/:id/chatEntity-scoped chat turn grounded in the active entity index.
/v1/entities/:id/chat/sessionsList durable entity chat sessions.
/v1/entities/:id/chat/sessionsCreate an entity chat session.
/v1/entities/:id/chat/sessions/:sessionIdRead one entity chat session.
/v1/entities/:id/chat/sessions/:sessionIdRename one entity chat session.
/v1/entities/:id/chat/sessions/:sessionIdDelete one entity chat session.
/v1/entities/:id/chat/sessions/:sessionId/messagesAdd an entity chat message.
/v1/entities/:id/chat/turns/:turnId/eventsRead persisted entity chat turn events.
Library, organization, and exports
/v1/libraryArchived completed runs with search and filters.
/v1/library/sourcesReusable source rows across completed runs.
/v1/library/evidenceExtracted evidence across completed runs.
/v1/library/searchSemantic claim/library search.
/v1/library/recallRelated runs, sources, and evidence for a topic.
/v1/library/claimsClaim records across completed runs.
/v1/library/contradictionsContradiction records. PATCH /:id updates one; POST /:id/verify verifies it.
/v1/runs/:id/diffCompare parent and child run outputs.
/v1/runs/:id/tagsList run tags.
/v1/runs/:id/tagsAdd tags to a run.
/v1/runs/:id/tagsRemove multiple tags or clear all tags.
/v1/runs/:id/exportBuild a one-off export payload.
/v1/collectionsList run collections.
/v1/collectionsCreate a collection.
/v1/collections/:id/runsAdd a run to a collection.
/v1/collections/:id/runs/:runIdRemove a run from a collection.
/v1/webhooksList terminal-run webhook subscriptions.
/v1/webhooksCreate an account-scoped terminal webhook. Use event:"run.complete" for succeeded, failed, and cancelled runs.
/v1/webhooks/:idDisable a webhook subscription.
/v1/exports/pendingAgent inbox: terminal runs no agent on the account has seen yet, regardless of which surface started them.
/v1/exports/ackAcknowledge inbox entries by id so they stop appearing as pending.
Account and billing
/v1/account/balanceAuthenticated account, customer, and wallet status.
/v1/runsRecent customer runs with budget, billed, cost, and watch URL.
/v1/account/chatsGlobal run/start chat session listing.
/v1/account/keysList active customer API keys.
/v1/account/keysCreate a raw rk_... key once.
/v1/account/keys/:idRename a customer API key.
/v1/account/keys/:idRevoke a customer API key.
/v1/account/deposit-addressesList wallet deposit addresses.
/v1/account/deposit-addressesCreate a deposit address.
Run lifecycle
What to show customers while work is active.
- Formulating plan. The worker turns the prompt into a structured plan and contract.
- Acquiring sources. Search, direct URLs, YouTube transcripts, and library recall populate candidates.
- Extracting evidence. Source-level LLM records capture claims, caveats, metrics, and diagnostics.
- Analyzing corpus. Records are merged into claims, comparisons, gaps, and source coverage.
- Writing report. The report follows the customer output contract and stores artifacts.
- Completing or continuing. If budget is reached after usable evidence exists, Researcher writes the best budget-limited report and leaves continuation as the next paid action.
Outputs and artifacts
Fetch markdown for reading; fetch artifacts when agents need structure.
research_report_markdown_v1Customer-facing report.
agent_brief_markdown_v1Agent reasoning handoff.
corpus_analysis_v1Claims, clusters, comparisons, gaps, and best sources.
trade_ideas_v1Evidence-linked explicit positions and inferred market ideas, with read-only resolver matches for local equity/ETF references, Polymarket, Hyperliquid, Robinhood Crypto, and 0x/Matcha-style token identities when confidence is high enough.
research_quality_review_v1Coverage gate and remaining issues.
source_extraction_v1Per-source claims, facts, caveats, and diagnostics.
source_analysis_record_v1Durable synthesis-facing evidence records.
claim_evidence_map_v1Grounded claims with confidence and source IDs.
record_index_v1Compact source-to-claim pointers.
For downstream saving, fetch the report, sources, and extraction records.
Strip raw YouTube transcript blobs before sending data into another LLM;
use /transcript for typed transcript segments instead.