{"openapi": "3.1.0", "info": {"title": "Pulse Finder API", "version": "1.0.0", "description": "ListeningMind Audience Pulse. It harvests candidate keywords from seed keywords or categories, measures gender and age share, 48-month search volume and SERP / AI Overview presence, and ranks the things that are surging, new or over-indexing in the chosen segment. Marketers, merchandisers and content planners use it to find next-quarter openings and risks. Data comes from the ListeningMind Data API (trend_finder, intent_finder, keyword_info, SERP, path_finder, cluster_finder). Markets: Korea, Japan, US; the gender and age split exists only for Korea. Workflow: get_config → interpret_brief → suggest_seeds → estimate_credits → start_run → get_run → get_run_evidence → explain_keyword → get_keyword_brief_markdown → get_report_markdown → download_trends_csv", "contact": {"email": "m-support@listeningmind.com"}}, "servers": [{"url": "https://daas-pulse.listeningmind.ai"}], "paths": {"/api/config": {"get": {"operationId": "get_config", "summary": "Settings and options", "description": "Returns the option lists the input form uses: markets, categories per market, genders, ages, periods, purposes, credit cap, drill-down cost, and the current account credit balance. Free. Read only, free.", "tags": ["read"], "x-lm-kind": "read", "x-lm-cost": "free", "responses": {"200": {"description": "Success"}, "default": {"description": "Error (application/problem+json or JSON with detail)"}}, "parameters": [{"name": "lang", "in": "query", "required": false, "description": "Language of generated text: ko, ja or en.", "schema": {"type": "string", "enum": ["ko", "ja", "en"], "default": "ko"}}, {"name": "gl", "in": "query", "required": false, "description": "Search market: kr (Korea), jp (Japan) or us (United States).", "schema": {"type": "string", "enum": ["kr", "jp", "us"], "default": "kr"}}]}}, "/api/interpret": {"post": {"operationId": "interpret_brief", "summary": "Read a brief", "description": "Turns a plain-language request into run parameters (gender, age, category, seeds, period, purpose) and returns each field with the phrase it came from and the fields it could not read. One paid LLM call, no Data API credits, a few seconds. Fields not supported by the text stay null. 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. Usually followed by: suggest_seeds, estimate_credits.", "tags": ["run"], "x-lm-kind": "run", "x-lm-cost": "1 LLM call, no Data API credits", "responses": {"200": {"description": "Success"}, "default": {"description": "Error (application/problem+json or JSON with detail)"}}, "requestBody": {"required": true, "content": {"application/json": {"schema": {"type": "object", "properties": {"brief": {"type": "string", "description": "The request in plain language, e.g. '20대 여성 대상 다음 분기 뷰티 신제품 기회'."}, "lang": {"type": "string", "description": "Language of generated text: ko, ja or en.", "enum": ["ko", "ja", "en"], "default": "ko"}, "gl": {"type": "string", "description": "Search market: kr (Korea), jp (Japan) or us (United States).", "enum": ["kr", "jp", "us"], "default": "kr"}}, "required": ["brief"]}}}}}}, "/api/suggest_seeds": {"post": {"operationId": "suggest_seeds", "summary": "Suggest more seeds", "description": "Proposes extra seed keywords that open different demand clusters than the given one, for the chosen segment. Uses intent_finder and keyword_info plus one LLM call. About 260 Data API credits (cap 780); the fetched data is cached and reused by the run. Takes 10-40 seconds. 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 260 Data API credits (cap 780) and 1 LLM call. Time: 10-40 seconds. Usually followed by: estimate_credits.", "tags": ["run"], "x-lm-kind": "run", "x-lm-cost": "about 260 Data API credits (cap 780) and 1 LLM call", "responses": {"200": {"description": "Success"}, "default": {"description": "Error (application/problem+json or JSON with detail)"}}, "requestBody": {"required": true, "content": {"application/json": {"schema": {"type": "object", "properties": {"keyword": {"type": "string", "description": "Base seed keyword (the UI sends the first free_text entry)."}, "gl": {"type": "string", "description": "Search market: kr (Korea), jp (Japan) or us (United States).", "enum": ["kr", "jp", "us"], "default": "kr"}, "gender": {"type": "array", "description": "Gender ids, as in start_run.", "items": {"type": "string", "enum": ["all", "f", "m"]}}, "age": {"type": "array", "description": "Age ids, as in start_run.", "items": {"type": "string", "enum": ["all", "a13", "a20s", "a20_24", "a25_29", "a30", "a40", "a50", "a0"]}}, "lang": {"type": "string", "description": "Language of generated text: ko, ja or en.", "enum": ["ko", "ja", "en"], "default": "ko"}}, "required": ["keyword"]}}}}}}, "/api/estimate": {"post": {"operationId": "estimate_credits", "summary": "Estimate credits", "description": "Returns a rough Data API credit estimate for the given run parameters ({credits}). Computed locally, no API calls. Cached calls in the real run cost nothing, so the actual spend is often lower. Read only, free. Usually followed by: start_run.", "tags": ["read"], "x-lm-kind": "read", "x-lm-cost": "free", "responses": {"200": {"description": "Success"}, "default": {"description": "Error (application/problem+json or JSON with detail)"}}, "requestBody": {"required": false, "content": {"application/json": {"schema": {"type": "object", "properties": {"gender": {"type": "array", "description": "Gender segment ids, multi-select: all, f (female), m (male). Changes which audience the segment share, over-index and floor are computed for. Used only for gl=kr; jp and us have no demographic split. A single string is also accepted. The web form starts with ['f'].", "items": {"type": "string", "enum": ["all", "f", "m"]}, "default": ["all"], "minItems": 1}, "age": {"type": "array", "description": "Age segment ids, multi-select: all, a13 (13-19), a20s, a20_24, a25_29, a30, a40, a50 (50+), a0 (under 12). Changes the audience the segment share is computed for. Used only for gl=kr. A single string is also accepted. The web form starts with ['a20s'].", "items": {"type": "string", "enum": ["all", "a13", "a20s", "a20_24", "a25_29", "a30", "a40", "a50", "a0"]}, "default": ["all"], "minItems": 1}, "category": {"type": "array", "description": "Category ids whose built-in topics become seed keywords when free_text is empty. Ids: beauty, food, fashion, travel, finance, automobile, health, living, digital, content, pet, kids, hobby, career, or all. get_config lists them with labels per market. Changes the seed topics and therefore the whole candidate pool. A single string is also accepted. The web form starts with ['health'].", "items": {"type": "string", "enum": ["all", "beauty", "food", "fashion", "travel", "finance", "automobile", "health", "living", "digital", "content", "pet", "kids", "hobby", "career"]}, "default": ["all"]}, "free_text": {"type": "string", "description": "Comma-separated seed keywords. When given, these replace the category topics (up to max_seeds are used). Example: '선크림, 쿠션'.", "default": ""}, "max_seeds": {"type": "integer", "description": "Maximum number of seed keywords taken from free_text or the categories. More seeds widen the candidate pool and cost more credits. Not in the web form (API only).", "default": 6, "minimum": 1}, "period": {"type": "string", "description": "Recent window compared against the prior 12 months: 1m, 3m, 6m or 12m. A purpose may override it unless period_explicit is true.", "enum": ["1m", "3m", "6m", "12m"], "default": "3m"}, "gl": {"type": "string", "description": "Search market: kr (Korea), jp (Japan) or us (United States).", "enum": ["kr", "jp", "us"], "default": "kr"}, "lang": {"type": "string", "description": "Language of generated text: ko, ja or en.", "enum": ["ko", "ja", "en"], "default": "ko"}, "credit_cap": {"type": "integer", "description": "Hard Data API credit cap for this run; the run stops with an error when it is reached. Default is the server cap (15,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. Not in the web form (API only).", "minimum": 1}, "pool_cap": {"type": "integer", "description": "Maximum candidate keywords measured with keyword_info (10 credits each). Larger pools find more long-tail items and cost more. Not in the web form (API only).", "default": 400, "minimum": 1}, "purpose": {"type": "string", "description": "What the person wants to decide. Sets the default period, vocabulary-age probe and preferred result types. discover (product or business opening), sourcing (what to stock), compete (track competitors), audience (understand the segment), campaign (promotion angles), content (content and search traffic), talent (a face or influencer), watch (early warning), risk (what already blew up).", "enum": ["discover", "sourcing", "compete", "audience", "campaign", "content", "talent", "watch", "risk"]}, "brief": {"type": "string", "description": "The person's request in plain language. Passed to the classifier as context.", "default": ""}, "exclude": {"type": "string", "description": "Plain text naming things to leave out of the result (passed to the classifier).", "default": ""}, "formation": {"type": "boolean", "description": "Run the vocabulary-age probe (Query Finder calls on up to 48 entities, about 5,280 extra credits). Default follows the purpose, otherwise on."}, "period_explicit": {"type": "boolean", "description": "true keeps the given period even when a purpose is set.", "default": false}, "harvest": {"type": "string", "description": "Set to v3 for the novelty-first candidate harvest (extra hop calls, more credits). Omit for the standard harvest. The web UI does not set it.", "enum": ["v3"]}}, "required": []}}}}}}, "/api/runs": {"post": {"operationId": "start_run", "summary": "Start a trend run", "description": "Starts a background run that harvests candidate keywords from the seeds, measures segment share and 48-month volume, classifies them with an LLM and ranks surging, emerging, newcomer and over-indexing things for the segment. Returns {run_id, url}. Poll get_run until status is done or error. Typically 2-3 minutes and roughly 1,000-15,000 Data API credits (capped by credit_cap). 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: Data API credits per run: median about 9,400 (roughly 1,000-15,000, server cap 15,000; 중앙값 약 9,400) plus LLM classification calls. The start answer may carry estimate_credits for this run, which the hub reserves instead of the median; cached calls this member paid for earlier are free. Time: 2-3 minutes. Usually followed by: get_run.", "tags": ["run"], "x-lm-kind": "run", "x-lm-cost": "Data API credits per run: median about 9,400 (roughly 1,000-15,000, server cap 15,000; 중앙값 약 9,400) plus LLM classification calls. The start answer may carry estimate_credits for this run, which the hub reserves instead of the median; cached calls this member paid for earlier are free", "responses": {"200": {"description": "Success"}, "default": {"description": "Error (application/problem+json or JSON with detail)"}}, "requestBody": {"required": false, "content": {"application/json": {"schema": {"type": "object", "properties": {"gender": {"type": "array", "description": "Gender segment ids, multi-select: all, f (female), m (male). Changes which audience the segment share, over-index and floor are computed for. Used only for gl=kr; jp and us have no demographic split. A single string is also accepted. The web form starts with ['f'].", "items": {"type": "string", "enum": ["all", "f", "m"]}, "default": ["all"], "minItems": 1}, "age": {"type": "array", "description": "Age segment ids, multi-select: all, a13 (13-19), a20s, a20_24, a25_29, a30, a40, a50 (50+), a0 (under 12). Changes the audience the segment share is computed for. Used only for gl=kr. A single string is also accepted. The web form starts with ['a20s'].", "items": {"type": "string", "enum": ["all", "a13", "a20s", "a20_24", "a25_29", "a30", "a40", "a50", "a0"]}, "default": ["all"], "minItems": 1}, "category": {"type": "array", "description": "Category ids whose built-in topics become seed keywords when free_text is empty. Ids: beauty, food, fashion, travel, finance, automobile, health, living, digital, content, pet, kids, hobby, career, or all. get_config lists them with labels per market. Changes the seed topics and therefore the whole candidate pool. A single string is also accepted. The web form starts with ['health'].", "items": {"type": "string", "enum": ["all", "beauty", "food", "fashion", "travel", "finance", "automobile", "health", "living", "digital", "content", "pet", "kids", "hobby", "career"]}, "default": ["all"]}, "free_text": {"type": "string", "description": "Comma-separated seed keywords. When given, these replace the category topics (up to max_seeds are used). Example: '선크림, 쿠션'.", "default": ""}, "max_seeds": {"type": "integer", "description": "Maximum number of seed keywords taken from free_text or the categories. More seeds widen the candidate pool and cost more credits. Not in the web form (API only).", "default": 6, "minimum": 1}, "period": {"type": "string", "description": "Recent window compared against the prior 12 months: 1m, 3m, 6m or 12m. A purpose may override it unless period_explicit is true.", "enum": ["1m", "3m", "6m", "12m"], "default": "3m"}, "gl": {"type": "string", "description": "Search market: kr (Korea), jp (Japan) or us (United States).", "enum": ["kr", "jp", "us"], "default": "kr"}, "lang": {"type": "string", "description": "Language of generated text: ko, ja or en.", "enum": ["ko", "ja", "en"], "default": "ko"}, "credit_cap": {"type": "integer", "description": "Hard Data API credit cap for this run; the run stops with an error when it is reached. Default is the server cap (15,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. Not in the web form (API only).", "minimum": 1}, "pool_cap": {"type": "integer", "description": "Maximum candidate keywords measured with keyword_info (10 credits each). Larger pools find more long-tail items and cost more. Not in the web form (API only).", "default": 400, "minimum": 1}, "purpose": {"type": "string", "description": "What the person wants to decide. Sets the default period, vocabulary-age probe and preferred result types. discover (product or business opening), sourcing (what to stock), compete (track competitors), audience (understand the segment), campaign (promotion angles), content (content and search traffic), talent (a face or influencer), watch (early warning), risk (what already blew up).", "enum": ["discover", "sourcing", "compete", "audience", "campaign", "content", "talent", "watch", "risk"]}, "brief": {"type": "string", "description": "The person's request in plain language. Passed to the classifier as context.", "default": ""}, "exclude": {"type": "string", "description": "Plain text naming things to leave out of the result (passed to the classifier).", "default": ""}, "formation": {"type": "boolean", "description": "Run the vocabulary-age probe (Query Finder calls on up to 48 entities, about 5,280 extra credits). Default follows the purpose, otherwise on."}, "period_explicit": {"type": "boolean", "description": "true keeps the given period even when a purpose is set.", "default": false}, "harvest": {"type": "string", "description": "Set to v3 for the novelty-first candidate harvest (extra hop calls, more credits). Omit for the standard harvest. The web UI does not set it.", "enum": ["v3"]}}, "required": []}}}}}, "get": {"operationId": "list_runs", "summary": "Run history", "description": "Lists recent runs with run_id, status, credits, created_at, url, segment label, category, free_text, period and market. Read only, free.", "tags": ["read"], "x-lm-kind": "read", "x-lm-cost": "free", "responses": {"200": {"description": "Success"}, "default": {"description": "Error (application/problem+json or JSON with detail)"}}, "parameters": [{"name": "limit", "in": "query", "required": false, "description": "Maximum runs to return.", "schema": {"type": "integer", "default": 40}}, {"name": "lang", "in": "query", "required": false, "description": "Language of the segment labels.", "schema": {"type": "string", "enum": ["ko", "ja", "en"]}}]}}, "/api/runs/{run_id}": {"get": {"operationId": "get_run", "summary": "Run status and result", "description": "Returns one run: status (running, done, error), progress {stage, pct, steps}, credits spent, params and, when done, the full result (entities, trending, emerging, newcomers, overindex, harvest, coverage). 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_run_evidence, explain_keyword, get_report_markdown.", "tags": ["read"], "x-lm-kind": "read", "x-lm-cost": "free", "responses": {"200": {"description": "Success"}, "default": {"description": "Error (application/problem+json or JSON with detail)"}}, "parameters": [{"name": "run_id", "in": "path", "required": true, "description": "Run id returned by start_run or list_runs (shown in the result URL /r/{run_id}).", "schema": {"type": "string"}}]}, "delete": {"operationId": "delete_run", "summary": "Delete run", "description": "Deletes a run and its stored drill-downs. Cannot be undone. Deletes data. A person approves it first.", "tags": ["delete"], "x-lm-kind": "delete", "x-lm-cost": "free", "responses": {"200": {"description": "Success"}, "default": {"description": "Error (application/problem+json or JSON with detail)"}}, "parameters": [{"name": "run_id", "in": "path", "required": true, "description": "Run id returned by start_run or list_runs (shown in the result URL /r/{run_id}).", "schema": {"type": "string"}}]}}, "/api/runs/{run_id}/evidence": {"get": {"operationId": "get_run_evidence", "summary": "Evidence and credit log", "description": "For a finished run, returns Data API calls per endpoint (calls, credits, cache hits), harvest and coverage details, skipped items, baseline share, score weights and seeds. Free. Read only, free.", "tags": ["read"], "x-lm-kind": "read", "x-lm-cost": "free", "responses": {"200": {"description": "Success"}, "default": {"description": "Error (application/problem+json or JSON with detail)"}}, "parameters": [{"name": "run_id", "in": "path", "required": true, "description": "Run id returned by start_run or list_runs (shown in the result URL /r/{run_id}).", "schema": {"type": "string"}}]}}, "/api/runs/{run_id}/explain": {"post": {"operationId": "explain_keyword", "summary": "Drill into a keyword", "description": "Explains why one keyword or entity from a finished run is rising: search paths, co-search clusters and SERP, summarised by an LLM with numbers checked against the data. standard costs about 3,830 Data API credits, deep (adds a 6-month path comparison) about 5,480. The result is stored, so asking again is free. 20-90 seconds. 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 3,830 Data API credits (standard) or 5,480 (deep) plus 1 LLM call; free when already stored. Time: 20-90 seconds. Usually followed by: get_keyword_brief_markdown, download_keyword_brief_pdf.", "tags": ["run"], "x-lm-kind": "run", "x-lm-cost": "about 3,830 Data API credits (standard) or 5,480 (deep) plus 1 LLM call; free when already stored", "responses": {"200": {"description": "Success"}, "default": {"description": "Error (application/problem+json or JSON with detail)"}}, "parameters": [{"name": "run_id", "in": "path", "required": true, "description": "Run id returned by start_run or list_runs (shown in the result URL /r/{run_id}).", "schema": {"type": "string"}}], "requestBody": {"required": true, "content": {"application/json": {"schema": {"type": "object", "properties": {"keyword": {"type": "string", "description": "Keyword exactly as it appears in the run result (row keyword)."}, "depth": {"type": "string", "description": "standard or deep. The web UI uses standard.", "enum": ["standard", "deep"], "default": "standard"}, "lang": {"type": "string", "description": "Language of generated text: ko, ja or en.", "enum": ["ko", "ja", "en"], "default": "ko"}, "credit_cap": {"type": "integer", "description": "Credit cap for this drill-down. Default is twice the estimate."}}, "required": ["keyword"]}}}}}}, "/api/runs/{run_id}/brief.md": {"get": {"operationId": "get_keyword_brief_markdown", "summary": "Keyword brief (Markdown)", "description": "Returns {keyword, markdown}: a one-page brief for a keyword that was already drilled into with explain_keyword. Renders stored data only, no credits. 404 if the drill-down was not run. Read only, free.", "tags": ["read"], "x-lm-kind": "read", "x-lm-cost": "free", "responses": {"200": {"description": "Success"}, "default": {"description": "Error (application/problem+json or JSON with detail)"}}, "parameters": [{"name": "run_id", "in": "path", "required": true, "description": "Run id returned by start_run or list_runs (shown in the result URL /r/{run_id}).", "schema": {"type": "string"}}, {"name": "keyword", "in": "query", "required": true, "description": "Keyword or entity that was drilled into with explain_keyword.", "schema": {"type": "string"}}, {"name": "depth", "in": "query", "required": false, "description": "Depth used in explain_keyword.", "schema": {"type": "string", "enum": ["standard", "deep"], "default": "standard"}}, {"name": "lang", "in": "query", "required": false, "description": "Language of the export (ko, ja or en). Omit to use the run's own language.", "schema": {"type": "string", "enum": ["ko", "ja", "en"]}}]}}, "/runs/{run_id}/brief.html": {"get": {"operationId": "get_keyword_brief_html", "summary": "Keyword brief (print HTML)", "description": "Returns the printable HTML page of a keyword brief (needs explain_keyword first). download=1 adds an attachment header. Free. Read only, free.", "tags": ["read"], "x-lm-kind": "read", "x-lm-cost": "free", "responses": {"200": {"description": "Success"}, "default": {"description": "Error (application/problem+json or JSON with detail)"}}, "parameters": [{"name": "run_id", "in": "path", "required": true, "description": "Run id returned by start_run or list_runs (shown in the result URL /r/{run_id}).", "schema": {"type": "string"}}, {"name": "keyword", "in": "query", "required": true, "description": "Keyword or entity that was drilled into with explain_keyword.", "schema": {"type": "string"}}, {"name": "depth", "in": "query", "required": false, "description": "Depth used in explain_keyword.", "schema": {"type": "string", "enum": ["standard", "deep"], "default": "standard"}}, {"name": "lang", "in": "query", "required": false, "description": "Language of the export (ko, ja or en). Omit to use the run's own language.", "schema": {"type": "string", "enum": ["ko", "ja", "en"]}}, {"name": "download", "in": "query", "required": false, "description": "1 to send as a file download, 0 to view inline.", "schema": {"type": "integer", "enum": [0, 1], "default": 0}}]}}, "/runs/{run_id}/brief.pdf": {"get": {"operationId": "download_keyword_brief_pdf", "summary": "Keyword brief PDF", "description": "Downloads the keyword brief as a PDF (needs explain_keyword first). Returns 503 when the server has no headless Chrome; then use get_keyword_brief_html. Free. Read only, free.", "tags": ["read"], "x-lm-kind": "read", "x-lm-cost": "free", "responses": {"200": {"description": "Success"}, "default": {"description": "Error (application/problem+json or JSON with detail)"}}, "parameters": [{"name": "run_id", "in": "path", "required": true, "description": "Run id returned by start_run or list_runs (shown in the result URL /r/{run_id}).", "schema": {"type": "string"}}, {"name": "keyword", "in": "query", "required": true, "description": "Keyword or entity that was drilled into with explain_keyword.", "schema": {"type": "string"}}, {"name": "depth", "in": "query", "required": false, "description": "Depth used in explain_keyword.", "schema": {"type": "string", "enum": ["standard", "deep"], "default": "standard"}}, {"name": "lang", "in": "query", "required": false, "description": "Language of the export (ko, ja or en). Omit to use the run's own language.", "schema": {"type": "string", "enum": ["ko", "ja", "en"]}}]}}, "/runs/{run_id}/report.md": {"get": {"operationId": "get_report_markdown", "summary": "Report (Markdown)", "description": "Returns the full run report as Markdown text. Free. 404 until the run is done. Read only, free.", "tags": ["read"], "x-lm-kind": "read", "x-lm-cost": "free", "responses": {"200": {"description": "Success"}, "default": {"description": "Error (application/problem+json or JSON with detail)"}}, "parameters": [{"name": "run_id", "in": "path", "required": true, "description": "Run id returned by start_run or list_runs (shown in the result URL /r/{run_id}).", "schema": {"type": "string"}}, {"name": "lang", "in": "query", "required": false, "description": "Language of the export (ko, ja or en). Omit to use the run's own language.", "schema": {"type": "string", "enum": ["ko", "ja", "en"]}}]}}, "/runs/{run_id}/preview.html": {"get": {"operationId": "get_report_preview", "summary": "Report preview", "description": "Returns the full run report as an HTML page for viewing. Free. Read only, free.", "tags": ["read"], "x-lm-kind": "read", "x-lm-cost": "free", "responses": {"200": {"description": "Success"}, "default": {"description": "Error (application/problem+json or JSON with detail)"}}, "parameters": [{"name": "run_id", "in": "path", "required": true, "description": "Run id returned by start_run or list_runs (shown in the result URL /r/{run_id}).", "schema": {"type": "string"}}, {"name": "lang", "in": "query", "required": false, "description": "Language of the export (ko, ja or en). Omit to use the run's own language.", "schema": {"type": "string", "enum": ["ko", "ja", "en"]}}]}}, "/runs/{run_id}/report.html": {"get": {"operationId": "download_report_html", "summary": "Download report HTML", "description": "Downloads the full run report as a self-contained HTML file. Free. Read only, free.", "tags": ["read"], "x-lm-kind": "read", "x-lm-cost": "free", "responses": {"200": {"description": "Success"}, "default": {"description": "Error (application/problem+json or JSON with detail)"}}, "parameters": [{"name": "run_id", "in": "path", "required": true, "description": "Run id returned by start_run or list_runs (shown in the result URL /r/{run_id}).", "schema": {"type": "string"}}, {"name": "lang", "in": "query", "required": false, "description": "Language of the export (ko, ja or en). Omit to use the run's own language.", "schema": {"type": "string", "enum": ["ko", "ja", "en"]}}]}}, "/runs/{run_id}/trends.csv": {"get": {"operationId": "download_trends_csv", "summary": "Trends CSV", "description": "Downloads the ranked trend rows as CSV (UTF-8 with BOM). Free. Read only, free.", "tags": ["read"], "x-lm-kind": "read", "x-lm-cost": "free", "responses": {"200": {"description": "Success"}, "default": {"description": "Error (application/problem+json or JSON with detail)"}}, "parameters": [{"name": "run_id", "in": "path", "required": true, "description": "Run id returned by start_run or list_runs (shown in the result URL /r/{run_id}).", "schema": {"type": "string"}}, {"name": "lang", "in": "query", "required": false, "description": "Language of the export (ko, ja or en). Omit to use the run's own language.", "schema": {"type": "string", "enum": ["ko", "ja", "en"]}}]}}, "/runs/{run_id}/run.json": {"get": {"operationId": "download_run_json", "summary": "Result JSON", "description": "Returns the raw result object of a finished run as JSON. Free. Read only, free.", "tags": ["read"], "x-lm-kind": "read", "x-lm-cost": "free", "responses": {"200": {"description": "Success"}, "default": {"description": "Error (application/problem+json or JSON with detail)"}}, "parameters": [{"name": "run_id", "in": "path", "required": true, "description": "Run id returned by start_run or list_runs (shown in the result URL /r/{run_id}).", "schema": {"type": "string"}}]}}, "/api/runs/{run_id}/rerun": {"post": {"operationId": "rerun_run", "summary": "Re-run with same inputs", "description": "Starts a new run with the same parameters as an earlier run. Returns {run_id, url, from}. Same cost and duration 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-3 minutes. Usually followed by: get_run.", "tags": ["run"], "x-lm-kind": "run", "x-lm-cost": "same as start_run (cached calls are free)", "responses": {"200": {"description": "Success"}, "default": {"description": "Error (application/problem+json or JSON with detail)"}}, "parameters": [{"name": "run_id", "in": "path", "required": true, "description": "Run id returned by start_run or list_runs (shown in the result URL /r/{run_id}).", "schema": {"type": "string"}}]}}, "/_lm/report-robots/{run_id}": {"get": {"operationId": "get_report_robots", "summary": "Report search visibility", "description": "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.", "tags": ["read"], "x-lm-kind": "read", "x-lm-cost": "free", "responses": {"200": {"description": "Success"}, "default": {"description": "Error (application/problem+json or JSON with detail)"}}, "parameters": [{"name": "run_id", "in": "path", "required": true, "description": "The report's run id: the id in the report address (for ACO the project id, or project~step).", "schema": {"type": "string"}}]}}}, "externalDocs": {"url": "https://daas-pulse.listeningmind.ai/agents.md", "description": "Agent guide"}}