# Funnel Leak Finder: agent guide

Search journey leak finder. It samples real search paths that start from category entry keywords with path_finder, classifies every node as a brand, generic, compare, exit or channel query, and shows where journeys switch to competitor brands and where your brand captures or loses them. Brand marketers and search / content teams use it to pick points to defend or attack. Data comes from the ListeningMind Data API (path_finder, keyword_info, intent_finder, SERP / AI Overview). Markets: Korea, Japan, US.

## Connect
- MCP: `https://daas-funnel.listeningmind.ai/mcp` (Streamable HTTP). Start with `app_guide`.
- Browser agents: tools are registered on every page through WebMCP (`document.modelContext`).
- REST: `https://daas-funnel.listeningmind.ai/.well-known/openapi.json`

## Approval
- read and action tools run at once.
- run and delete tools need a person's approval. Over MCP the tool returns `confirm_url`; show it to the person, then call `confirmation_status` with the token until state is done.
- In the browser the page shows the person a confirm box.

## Workflow
1. `get_config` (read): Get examples, comparison points, sample sizes and their cost.
2. `suggest_competitors` (run): Get competitor candidates when the person has none.
3. `check_inputs` (read): Catch a seed that is a brand or a competitor that is a channel.
4. `estimate_credits` (read): Check expected credits and tell the person.
5. `start_run` (run): Start the run.
6. `get_run` (read): Poll until done and read the result.
7. `prune_brands` (run): If retailers or platforms were taken as competitors, clean them up.
8. `reclassify_node` (action): Fix misclassified nodes.
9. `get_watch_lines` (read): Read the lines worth acting on, with numbers.
10. `explain_watch_lines` (run): Write the strategy narrative for those lines.
11. `explain_node` (run): Drill into an important node.
12. `check_ai_overview` (run): Check AI Overview presence for nodes of interest.
13. `get_node_brief_markdown` (read): Get the brief for an explained node.
14. `get_report_markdown` (read): Get the full report as text.
15. `download_leaks_csv` (read): Export the leak table.

## Inputs
Entry seed keywords (up to 3, e.g. running shoes), your brand (name, aliases, domain; optional), competitor list (e.g. Nike;nike, Adidas;adidas), comparison point (3m/6m/12m or none), sample size (100/200/300/500), deep, number of nodes for the automatic AI Overview read, market (kr/jp/us), credit cap.

## Outputs
KPIs and share, hub nodes, leak edges to competitors, funnel stages, inbound and transition, journey tree, metrics and class per node, SERP / AI Overview presence, watch lines (conquest, uncaptured, defend, poach, strengthen) with narrative. Node and path explanations, node brief (Markdown, HTML, PDF). Report as HTML, PDF or Markdown, leaks CSV, raw JSON.

## Cost and time
With defaults (1 seed, sample 200, 6-month comparison) about 6,000-15,000 Data API credits and 2-7 minutes. One path_finder call costs about 2,850 / 5,650 / 8,450 / 14,050 credits at sample 100 / 200 / 300 / 500, and a comparison point doubles the calls. Server cap 30,000. Competitor suggestion about 330 per seed; AI Overview check 30 per node. Explanations use LLM calls only.

## Limits
Seeds must be category terms, not brands, and at most 3 are used. Markets kr/jp/us, languages ko/ja/en. A node brief needs explain_node in the same language first. reclassify_node, demote_brand and prune_brands overwrite the stored result. Dictionary changes affect all later runs.

## Method (how the analysis works)
1. Sample real search paths that start from the category entry seeds with path_finder (also at the comparison point, if set).
2. Measure every node with keyword_info.
3. Classify nodes as brand, generic, compare, exit or channel queries with rules and an LLM.
4. Read SERP and AI Overview for top nodes to see which brands appear.
5. Compute shares, hub nodes, leak edges to competitors and funnel stages, then select watch lines with a narrative.

## Reading the result
- kpi.my_share_paths and kpi.comp_share_paths (and the _demand values) are the share of journeys and demand held by your brand and by competitors; none_share_paths is the share with no brand.
- leak_edges are the points where journeys switch to competitor brands; hubs are nodes many journeys pass through.
- Watch lines (conquest, uncaptured, defend, poach, strengthen) are the rule-selected lines to act on, with numbers.
- Check share.brands for retailers or platforms counted as competitors; prune_brands or reclassify_node fixes them and recomputes the result.
- SERP and AI Overview presence per node shows which brands appear on the result page of that query.

## Requests this app answers well
- Show where people searching for running shoes switch to competitor brands
- Compare where our brand captures and loses search journeys now versus 6 months ago
- List the journey lines to defend and to attack for cordless vacuums in Japan
- Make a PDF node brief for the query that leaks most to competitors

## Continue in another app
- [Prompt Builder](https://daas-prompt.listeningmind.ai/llms.txt) (MCP `https://daas-prompt.listeningmind.ai/mcp`): When you want to see whether AI answers for the category recommend your brand or the same competitors. Carry: The category seed keyword, your brand and the competitor list cleaned with prune_brands.
- [GEO Audit](https://daas-geo.listeningmind.ai/llms.txt) (MCP `https://daas-geo.listeningmind.ai/mcp`): When a watch line points to a query you must defend or win with your own page. Carry: That node keyword as the topic and the URL of your page meant to answer it.

## Using the screens (browser agents)
- `describe_screen`: menus, tabs, fields and buttons of the current screen, and what the page is for
- `go_to`: open a menu or page of this app by its label or path
- `fill_field`: type a value into a field by its label (never presses run; runs go through the run tools, which ask the person)
- `read_this_page`: the text and ids of what the person is looking at

## The ListeningMind apps (same account, same tools, call any of them)
Each app has `/mcp`, `/llms.txt`, `/agents.md` and WebMCP on its pages. `family_apps` and `recommend_app` return this list with addresses.
- [ACO](https://daas-aco.listeningmind.ai/llms.txt): Diagnoses whether a product detail page can be cited by AI answers and used by shopping agents (MCP `https://daas-aco.listeningmind.ai/mcp`)
- [AOO](https://daas-aoo.listeningmind.ai/llms.txt): Measures whether AI agents can get real tasks done on a website (MCP `https://daas-aoo.listeningmind.ai/mcp`)
- [Brand Finder](https://daas-brand.listeningmind.ai/llms.txt): Which brands lead search by generation or field, and what their brand assets are (MCP `https://daas-brand.listeningmind.ai/mcp`)
- [Brand Naming Agent](https://daas-naming.listeningmind.ai/llms.txt): Creates and checks brand name candidates grounded in search data (MCP `https://daas-naming.listeningmind.ai/mcp`)
- [Brand Wiki](https://daas-wiki.listeningmind.ai/llms.txt): Turns a brand website into the entities, wiki pages and evidence AI assistants read (MCP `https://daas-wiki.listeningmind.ai/mcp`)
- [CEP Finder](https://daas-cep.listeningmind.ai/llms.txt): In which situations do people start looking for this category (category entry point map) (MCP `https://daas-cep.listeningmind.ai/mcp`)
- [Creative Finder](https://daas-creative.listeningmind.ai/llms.txt): Finds purchase situations (CEP) in search data and drafts a creative, an image and a video for each (MCP `https://daas-creative.listeningmind.ai/mcp`)
- [Demand Forecast](https://daas-forecast.listeningmind.ai/llms.txt): What category demand looks like in the next 3-6 months and when to launch or campaign (MCP `https://daas-forecast.listeningmind.ai/mcp`)
- [GEO Audit](https://daas-geo.listeningmind.ai/llms.txt): Checks whether a web page is ready to be read and cited by search engines and AI answer engines (MCP `https://daas-geo.listeningmind.ai/mcp`)
- [ICSS](https://daas-icss.listeningmind.ai/llms.txt): Synthetic consumer panel conditioned on search intent, for surveys and FGDs (MCP `https://daas-icss.listeningmind.ai/mcp`)
- [Intent KG](https://daas-intent.listeningmind.ai/llms.txt): What people look for about a topic, why, and how they choose (Intent Knowledge Graph) (MCP `https://daas-intent.listeningmind.ai/mcp`)
- [Prompt Builder](https://daas-prompt.listeningmind.ai/llms.txt): Finds what consumers ask AI and builds managed brand prompts with AI visibility (MCP `https://daas-prompt.listeningmind.ai/mcp`)
- [Pulse Finder](https://daas-pulse.listeningmind.ai/llms.txt): What is rising in search for a gender and age segment right now (MCP `https://daas-pulse.listeningmind.ai/mcp`)
- [Smart Store Suite](https://daas-store.listeningmind.ai/llms.txt): Which Smart Store products to grow, and how to rewrite their titles and detail pages in searchers' words (MCP `https://daas-store.listeningmind.ai/mcp`)
- [Taste Finder](https://daas-taste.listeningmind.ai/llms.txt): In what sensory and emotional words do people choose this (consumer taste report from search data) (MCP `https://daas-taste.listeningmind.ai/mcp`)
- [ListeningMind Data API](https://daas.listeningmind.ai/llms.txt): the search data behind every app (MCP `https://daas.listeningmind.ai/mcp`) · [glossary](https://daas.listeningmind.ai/en/glossary) · [all apps](https://daas.listeningmind.ai/en/apps)

## Run stages
- `paths`: Sampling search paths (path_finder)
- `info`: Measuring nodes with keyword_info
- `classify`: Classifying nodes (rules and LLM)
- `deep`: Extra path_finder calls (deep)
- `serp`: SERP and AI Overview check
- `narrative`: Writing summary narrative
- `done`: Done

## All tools
### get_config
Returns markets, example inputs per market, comparison points, path_finder sample sizes with their credit cost, score weights, credit cap and the current account credit balance. Free. Read only, free.
`GET /api/config`
- `lang`: Language of generated text: ko, ja or en.
- `gl`: Search market: kr (Korea), jp (Japan) or us (United States).

### suggest_competitors
Proposes category-qualified competitor brands grounded on the queries around the seeds, returning {competitors: [...]} with names and aliases. Uses intent_finder plus one LLM call; about 330 Data API credits per seed (cap twice that). Fetched data is cached and reused by the run. Spends ListeningMind Data API credits or paid model calls. Over MCP a person approves it first (you get a confirm link); in the browser the page asks the person. Cost: about 330 Data API credits per seed plus 1 LLM call. Time: 10-40 seconds. Usually followed by: check_inputs, estimate_credits.
`POST /api/suggest_competitors`
- `seeds` (required): Entry keywords where the journey starts, comma separated (a list of strings is also accepted). Up to 3 are used; extra ones are dropped. Each seed is a starting point of the sampled journeys, so seeds define the whole result. Should be a category term, not a brand. Example: 런닝화.
- `my_brand`: Your brand. With it the result is in brand mode (my share, where my brand wins or loses); omit or null for a landscape view (mode landscape) without an own brand. The web form fields are brand name, aliases and domain.
- `competitors`: Competitors already typed, same format as in start_run, so the suggestion adds to them.
- `gl`: Search market: kr (Korea), jp (Japan) or us (United States).
- `lang`: Language of generated text: ko, ja or en.

### check_inputs
Checks the run inputs against the brand / channel dictionary and returns {warnings: [{field, text}]}, e.g. a seed that is a brand, or a competitor that is really a retailer or platform. No credits, no LLM. Read only, free. Usually followed by: estimate_credits.
`POST /api/check_inputs`
- `seeds`: Entry keywords where the journey starts, comma separated (a list of strings is also accepted). Up to 3 are used; extra ones are dropped. Each seed is a starting point of the sampled journeys, so seeds define the whole result. Should be a category term, not a brand. Example: 런닝화.
- `my_brand`: Your brand. With it the result is in brand mode (my share, where my brand wins or loses); omit or null for a landscape view (mode landscape) without an own brand. The web form fields are brand name, aliases and domain.
- `competitors`: Competitor brands, comma separated; each may carry aliases after ';' and a trailing '*' for strict matching. Example: '나이키;nike, 아디다스;adidas, 호카*'. A list of {name, aliases, strict} objects is also accepted. Changes which nodes count as competitor brands and therefore every leak and share figure. Brands found by the classifier are added even when not listed.
- `cmp_point`: Compare the current journey with this earlier point: 3m, 6m or 12m. null for no comparison (halves path_finder calls).
- `limit`: path_finder sample size per call (paths sampled). Other values are snapped to the nearest of 100, 200, 300, 500. Bigger samples find rarer branches and cost more (about 2,850 / 5,650 / 8,450 / 14,050 credits per path_finder call).
- `deep`: Extra path_finder calls starting from your brand (if given) and the top 2 hubs, filling result.deep with where those journeys go next. Adds one path_finder call per origin.
- `aio_auto`: Read SERP and AI Overview for the top nodes during the run, so the result shows which brands AI Overview mentions there. false skips it.
- `aio_nodes`: How many top nodes get the automatic SERP / AI Overview read (30 credits each). Clamped to 0-60. Ignored when aio_auto is false.
- `gl`: Search market: kr (Korea), jp (Japan) or us (United States).
- `lang`: Language of generated text: ko, ja or en.
- `credit_cap`: Hard Data API credit cap for this run; the run stops with an error when it is reached. Default is the server cap (30,000 at the time of writing; get_config.credit_cap). The server does not clamp a higher value, so do not raise it without the person's consent.

### estimate_credits
Returns the expected Data API credits for the inputs: {credits, path_finder_calls, per_call, nodes_est, deep, aio, aio_nodes, cap, note}. Computed locally, no API calls. Read only, free. Usually followed by: start_run.
`POST /api/estimate`
- `seeds`: Entry keywords where the journey starts, comma separated (a list of strings is also accepted). Up to 3 are used; extra ones are dropped. Each seed is a starting point of the sampled journeys, so seeds define the whole result. Should be a category term, not a brand. Example: 런닝화.
- `my_brand`: Your brand. With it the result is in brand mode (my share, where my brand wins or loses); omit or null for a landscape view (mode landscape) without an own brand. The web form fields are brand name, aliases and domain.
- `competitors`: Competitor brands, comma separated; each may carry aliases after ';' and a trailing '*' for strict matching. Example: '나이키;nike, 아디다스;adidas, 호카*'. A list of {name, aliases, strict} objects is also accepted. Changes which nodes count as competitor brands and therefore every leak and share figure. Brands found by the classifier are added even when not listed.
- `cmp_point`: Compare the current journey with this earlier point: 3m, 6m or 12m. null for no comparison (halves path_finder calls).
- `limit`: path_finder sample size per call (paths sampled). Other values are snapped to the nearest of 100, 200, 300, 500. Bigger samples find rarer branches and cost more (about 2,850 / 5,650 / 8,450 / 14,050 credits per path_finder call).
- `deep`: Extra path_finder calls starting from your brand (if given) and the top 2 hubs, filling result.deep with where those journeys go next. Adds one path_finder call per origin.
- `aio_auto`: Read SERP and AI Overview for the top nodes during the run, so the result shows which brands AI Overview mentions there. false skips it.
- `aio_nodes`: How many top nodes get the automatic SERP / AI Overview read (30 credits each). Clamped to 0-60. Ignored when aio_auto is false.
- `gl`: Search market: kr (Korea), jp (Japan) or us (United States).
- `lang`: Language of generated text: ko, ja or en.
- `credit_cap`: Hard Data API credit cap for this run; the run stops with an error when it is reached. Default is the server cap (30,000 at the time of writing; get_config.credit_cap). The server does not clamp a higher value, so do not raise it without the person's consent.

### start_run
Starts a background run: samples search journeys from the seeds with path_finder (now and at cmp_point), measures every node with keyword_info, classifies nodes into brand, generic, compare, exit and channel queries (rules plus LLM), reads SERP / AI Overview for top nodes and computes where journeys leak to competitors. Returns {run_id, url}. Poll get_run. Typically 2-7 minutes and about 6,000-15,000 credits with defaults. Spends ListeningMind Data API credits or paid model calls. Over MCP a person approves it first (you get a confirm link); in the browser the page asks the person. Cost: about 6,000-15,000 Data API credits with defaults; deep or larger samples can reach the server cap of 30,000; plus LLM calls. Time: 2-7 minutes. Usually followed by: get_run.
`POST /api/runs`
- `seeds` (required): Entry keywords where the journey starts, comma separated (a list of strings is also accepted). Up to 3 are used; extra ones are dropped. Each seed is a starting point of the sampled journeys, so seeds define the whole result. Should be a category term, not a brand. Example: 런닝화.
- `my_brand`: Your brand. With it the result is in brand mode (my share, where my brand wins or loses); omit or null for a landscape view (mode landscape) without an own brand. The web form fields are brand name, aliases and domain.
- `competitors`: Competitor brands, comma separated; each may carry aliases after ';' and a trailing '*' for strict matching. Example: '나이키;nike, 아디다스;adidas, 호카*'. A list of {name, aliases, strict} objects is also accepted. Changes which nodes count as competitor brands and therefore every leak and share figure. Brands found by the classifier are added even when not listed.
- `cmp_point`: Compare the current journey with this earlier point: 3m, 6m or 12m. null for no comparison (halves path_finder calls).
- `limit`: path_finder sample size per call (paths sampled). Other values are snapped to the nearest of 100, 200, 300, 500. Bigger samples find rarer branches and cost more (about 2,850 / 5,650 / 8,450 / 14,050 credits per path_finder call).
- `deep`: Extra path_finder calls starting from your brand (if given) and the top 2 hubs, filling result.deep with where those journeys go next. Adds one path_finder call per origin.
- `aio_auto`: Read SERP and AI Overview for the top nodes during the run, so the result shows which brands AI Overview mentions there. false skips it.
- `aio_nodes`: How many top nodes get the automatic SERP / AI Overview read (30 credits each). Clamped to 0-60. Ignored when aio_auto is false.
- `gl`: Search market: kr (Korea), jp (Japan) or us (United States).
- `lang`: Language of generated text: ko, ja or en.
- `credit_cap`: Hard Data API credit cap for this run; the run stops with an error when it is reached. Default is the server cap (30,000 at the time of writing; get_config.credit_cap). The server does not clamp a higher value, so do not raise it without the person's consent.

### get_run
Returns one run: status (running, done, error), progress {stage, pct, steps}, credits, params, error and, when done, the result (kpi, share, hubs, leak_edges, funnel, inbound, transition, tree, metrics, classes, serp, overview). Repeat until status is done or error. Read only, free. Waits up to about 45 s for 'status' to reach done, error; call again if not done. Usually followed by: get_watch_lines, explain_node, get_report_markdown.
`GET /api/runs/{run_id}`
- `run_id` (required): Run id returned by start_run or list_runs (shown in the result URL /r/{run_id}).

### list_runs
Lists recent runs with run_id, status, credits, created_at, url, seeds, my_brand, cmp_point, gl and deep. Read only, free.
`GET /api/runs`
- `limit`: Maximum runs to return.

### get_run_evidence
For a finished run, returns the Data API calls per endpoint with calls, credits and cache hits. Free. Read only, free.
`GET /api/runs/{run_id}/evidence`
- `run_id` (required): Run id returned by start_run or list_runs (shown in the result URL /r/{run_id}).

### get_watch_lines
Marketer view of a finished run: rule-selected journey lines (conquest, uncaptured, defend, poach, strengthen) with numbers, plus the LLM wording if it was generated before for this language. Free. Read only, free. Usually followed by: explain_watch_lines.
`GET /api/runs/{run_id}/watch`
- `run_id` (required): Run id returned by start_run or list_runs (shown in the result URL /r/{run_id}).
- `lang`: Language of generated text: ko, ja or en.

### explain_watch_lines
Generates and stores the LLM wording (strategy narrative) for the rule-selected watch lines. Returns {items, narrative}. Paid LLM call, no Data API credits. The stored wording also appears in report exports. Spends ListeningMind Data API credits or paid model calls. Over MCP a person approves it first (you get a confirm link); in the browser the page asks the person. Cost: 1 LLM call, no Data API credits. Time: 10-40 seconds.
`POST /api/runs/{run_id}/watch_explain`
- `run_id` (required): Run id returned by start_run or list_runs (shown in the result URL /r/{run_id}).
- `lang`: Language of generated text: ko, ja or en.

### explain_node
Explains one journey node of a finished run (who arrives, where they go next, which brands win) with an LLM narrative. With fetch_serp=true and no stored SERP it first reads the SERP (about 30 credits, cap 200). Stored per keyword and language, so repeating is free. Spends ListeningMind Data API credits or paid model calls. Over MCP a person approves it first (you get a confirm link); in the browser the page asks the person. Cost: 1 LLM call; about 30 Data API credits more with fetch_serp; free when stored. Time: 10-40 seconds. Usually followed by: get_node_brief_markdown, download_node_brief_pdf.
`POST /api/runs/{run_id}/explain`
- `run_id` (required): Run id returned by start_run or list_runs (shown in the result URL /r/{run_id}).
- `keyword` (required): Node keyword exactly as in result.metrics.
- `lang`: Language of generated text: ko, ja or en.
- `fetch_serp`: Read the SERP for this node first when the run has none stored.

### explain_path
LLM narrative for one line of the journey tree, from the root to a node. The path must exist in result.tree. Stored, so repeating is free. No Data API credits. Spends ListeningMind Data API credits or paid model calls. Over MCP a person approves it first (you get a confirm link); in the browser the page asks the person. Cost: 1 LLM call, no Data API credits; free when stored. Time: 10-40 seconds.
`POST /api/runs/{run_id}/explain_path`
- `run_id` (required): Run id returned by start_run or list_runs (shown in the result URL /r/{run_id}).
- `path` (required): Node keywords from the root to the selected node, in order.
- `lang`: Language of generated text: ko, ja or en.

### check_ai_overview
Reads SERP and AI Overview for the given nodes of a finished run and stores which brands appear. Up to 30 keywords per call; 30 Data API credits per node not yet fetched (cap 900 per call). Returns the stored SERP digests. Spends ListeningMind Data API credits or paid model calls. Over MCP a person approves it first (you get a confirm link); in the browser the page asks the person. Cost: 30 Data API credits per new node, cap 900 per call. Time: 10-60 seconds.
`POST /api/runs/{run_id}/aio_check`
- `run_id` (required): Run id returned by start_run or list_runs (shown in the result URL /r/{run_id}).
- `keywords` (required): Node keywords to check (max 30).
- `lang`: Language of generated text: ko, ja or en.

### reclassify_node
Changes the role of one node and recomputes the whole result without credits. Roles: my (own brand), comp (a competitor brand, give brand), generic, compare, exit, channel. Returns the new result. Changes saved data in the app; no credits.
`POST /api/runs/{run_id}/reclassify`
- `run_id` (required): Run id returned by start_run or list_runs (shown in the result URL /r/{run_id}).
- `keyword` (required): Node keyword.
- `role` (required): New role.
- `brand`: Competitor brand name, required when role is comp.
- `lang`: Language of generated text: ko, ja or en.

### demote_brand
Turns a name wrongly treated as a competitor (a platform or OS such as Android) into a category term: all its nodes become channel queries, it leaves the competitor list, and the result is recomputed. Your own brand cannot be demoted. No credits. Returns the new result. Changes saved data in the app; no credits.
`POST /api/runs/{run_id}/demote_brand`
- `run_id` (required): Run id returned by start_run or list_runs (shown in the result URL /r/{run_id}).
- `brand` (required): Brand name as shown in the result.
- `lang`: Language of generated text: ko, ja or en.

### prune_brands
One LLM pass over the run's brand names: retailers, carriers, marketplaces and platforms stop being competitors and their nodes become channel queries; the result is recomputed. No Data API credits. Returns the new result. Spends ListeningMind Data API credits or paid model calls. Over MCP a person approves it first (you get a confirm link); in the browser the page asks the person. Cost: 1 LLM call, no Data API credits. Time: 10-40 seconds.
`POST /api/runs/{run_id}/prune_brands`
- `run_id` (required): Run id returned by start_run or list_runs (shown in the result URL /r/{run_id}).
- `lang`: Language of generated text: ko, ja or en.

### get_node_brief_markdown
Returns {keyword, markdown}: a one-page brief for a node already explained with explain_node in the same language. Free. 404 if not explained yet. Read only, free.
`GET /api/runs/{run_id}/brief.md`
- `run_id` (required): Run id returned by start_run or list_runs (shown in the result URL /r/{run_id}).
- `keyword` (required): Journey node (keyword) that was explained with explain_node.
- `lang`: Language the node explanation was generated in.

### get_node_brief_html
Returns the printable HTML brief for an explained node. download=1 adds an attachment header. Free. Read only, free.
`GET /runs/{run_id}/brief.html`
- `run_id` (required): Run id returned by start_run or list_runs (shown in the result URL /r/{run_id}).
- `keyword` (required): Journey node (keyword) that was explained with explain_node.
- `lang`: Language the node explanation was generated in.
- `download`: 1 to send as a file download, 0 to view inline.

### download_node_brief_pdf
Downloads the node brief as a PDF. Returns 503 when the server has no headless Chrome; then use get_node_brief_html. Free. Read only, free.
`GET /runs/{run_id}/brief.pdf`
- `run_id` (required): Run id returned by start_run or list_runs (shown in the result URL /r/{run_id}).
- `keyword` (required): Journey node (keyword) that was explained with explain_node.
- `lang`: Language the node explanation was generated in.

### get_report_markdown
Returns the full run report as Markdown, including the watch lines and their stored wording. Free. Read only, free.
`GET /runs/{run_id}/report.md`
- `run_id` (required): Run id returned by start_run or list_runs (shown in the result URL /r/{run_id}).

### get_report_preview
Returns the full run report as an HTML page for viewing. Free. Read only, free.
`GET /runs/{run_id}/preview.html`
- `run_id` (required): Run id returned by start_run or list_runs (shown in the result URL /r/{run_id}).

### download_report_html
Downloads the full report as a self-contained HTML file. Free. Read only, free.
`GET /runs/{run_id}/report.html`
- `run_id` (required): Run id returned by start_run or list_runs (shown in the result URL /r/{run_id}).

### download_report_pdf
Downloads the full report as PDF. Returns 503 when the server has no headless Chrome; then use get_report_preview. Free. Read only, free.
`GET /runs/{run_id}/report.pdf`
- `run_id` (required): Run id returned by start_run or list_runs (shown in the result URL /r/{run_id}).

### download_leaks_csv
Downloads the leak table as CSV (UTF-8 with BOM). Free. Read only, free.
`GET /runs/{run_id}/leaks.csv`
- `run_id` (required): Run id returned by start_run or list_runs (shown in the result URL /r/{run_id}).

### download_run_json
Returns {result, raw, classes} for a finished run: the computed result, the raw sampled paths and node data, and the node classes. Free. Read only, free.
`GET /runs/{run_id}/run.json`
- `run_id` (required): Run id returned by start_run or list_runs (shown in the result URL /r/{run_id}).

### rerun_run
Starts a new run with the same parameters as an earlier run. Returns {run_id, url, from}. Same cost as start_run minus cached calls. Spends ListeningMind Data API credits or paid model calls. Over MCP a person approves it first (you get a confirm link); in the browser the page asks the person. Cost: same as start_run (cached calls are free). Time: 2-7 minutes. Usually followed by: get_run.
`POST /api/runs/{run_id}/rerun`
- `run_id` (required): Run id returned by start_run or list_runs (shown in the result URL /r/{run_id}).

### delete_run
Deletes a run and its stored data. Cannot be undone. Deletes data. A person approves it first.
`DELETE /api/runs/{run_id}`
- `run_id` (required): Run id returned by start_run or list_runs (shown in the result URL /r/{run_id}).

### list_entities
Lists the learned name dictionary used to classify nodes: {items: [{name, gl, scope, type, source, updated_at}], types}. Types: brand, channel, platform, other. Free. Read only, free.
`GET /api/entities`
- `gl`: Filter by market. Omit for all.

### add_entity
Adds or updates a name in the classification dictionary so future runs treat it as the given type. scope limits it to one seed keyword's category; empty scope means global. No credits. Changes saved data in the app; no credits.
`POST /api/entities`
- `name` (required): Name, e.g. 쿠팡.
- `gl` (required): Market.
- `type` (required): Entry type.
- `scope`: Seed keyword whose category this entry applies to. Empty or omitted for global.

### delete_entity
Removes a name from the classification dictionary for a market and scope ('*' = all scopes). Deletes data. A person approves it first.
`DELETE /api/entities`
- `name` (required): Name to remove.
- `gl` (required): Market.
- `scope`: Scope to remove ('*' for every scope).

### list_recent
The three most recent finished runs shown on the start screen (run_id, seeds, my_brand, shares). Signed-in members only. Read only, free.
`GET /api/recent`

### get_report_robots
Returns whether search engines may index this report page (index or noindex), and why: a company member's run or one set by hand is index; a customer's run, and any run that is still going, failed or came back empty, is noindex. Read only; no credits. Read only, free.
`GET /_lm/report-robots/{run_id}`
- `run_id` (required): The report's run id: the id in the report address (for ACO the project id, or project~step).

