{"openapi": "3.1.0", "info": {"title": "Brand Naming Agent API", "version": "1.0.0", "description": "From a one-line description, AI fills in the kind of name, category, home or global use, customer and values, then makes 10 names from ListeningMind search data (volume, journeys, related searches, Google AI Overviews, community posts) and a 9-language root library. It drops names already in use, look-alikes of existing brands in any field and names with bad meanings in other languages, runs a Gemini/ChatGPT first-impression test and domain checks, and gives each name a promise, story, purpose statement and manifesto. Used by brand managers and founders. Markets: Korea, Japan, US. Workflow: ask_llm → check_intel_cache → get_market_intel → ask_llm → ask_llm → check_name_usage → ask_llm → ask_llm → check_domains → ask_llm", "contact": {"email": "m-support@listeningmind.com"}}, "servers": [{"url": "https://daas-naming.listeningmind.ai"}], "paths": {"/api/intel-status": {"post": {"operationId": "check_intel_cache", "summary": "Check data cache", "description": "Tells whether the expensive search data (path_finder and cluster_finder) for the first keyword is already cached on the server, so get_market_intel would cost 0 credits. Returns {cached, primary, gl}. Also returns estimate:[low, high] data credits for this run. Read only, free. Usually followed by: get_market_intel.", "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": true, "content": {"application/json": {"schema": {"type": "object", "properties": {"keywords": {"type": "array", "description": "Category search keywords; the first one is checked.", "items": {"type": "string"}}, "market": {"type": "string", "description": "Target market.", "enum": ["kr", "jp", "us"], "default": "kr"}, "lang": {"type": "string", "description": "UI language code of the app (kr = Korean, jp = Japanese, en = English); sets the language of summaries.", "enum": ["kr", "jp", "en"], "default": "kr"}, "deep": {"type": "boolean", "default": false}}, "required": ["keywords"]}}}}}}, "/api/intel": {"post": {"operationId": "get_market_intel", "summary": "Collect market search data", "description": "Collects the ListeningMind evidence used for naming, for up to 3 category keywords: keyword_info (volume, trend, competition, CPC, intents, demography), path_finder search journeys, cluster_finder communities (first keyword), intent_finder related searches with their volumes, and stored Google SERPs (AI Overview, People Also Ask, top sites) for up to 2 keywords. Every piece is cached on disk for 24 hours. Returns {keyword_info, paths, clusters, related, related_volumes, summaries, serp, source, errors, hasData}. 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: ListeningMind Data API credits: keyword_info for up to 23 keywords, 1-2 path_finder, 1 cluster_finder (the costly one), 1 intent_finder, up to 6 SERP lookups; 0 when cached. Time: about 20-90 seconds. Usually followed by: ask_llm.", "tags": ["run"], "x-lm-kind": "run", "x-lm-cost": "ListeningMind Data API credits: keyword_info for up to 23 keywords, 1-2 path_finder, 1 cluster_finder (the costly one), 1 intent_finder, up to 6 SERP lookups; 0 when cached", "responses": {"200": {"description": "Success"}, "default": {"description": "Error (application/problem+json or JSON with detail)"}}, "requestBody": {"required": true, "content": {"application/json": {"schema": {"type": "object", "properties": {"keywords": {"type": "array", "description": "1 to 3 category search keywords (not brand names), most representative first.", "items": {"type": "string"}, "maxItems": 3}, "market": {"type": "string", "description": "Target market.", "enum": ["kr", "jp", "us"], "default": "kr"}, "lang": {"type": "string", "description": "UI language code of the app (kr = Korean, jp = Japanese, en = English); sets the language of summaries.", "enum": ["kr", "jp", "en"], "default": "kr"}, "deep": {"type": "boolean", "default": false, "description": "Deep analysis: adds cluster_finder (about 10,000 more credits) and 50 journeys instead of 15."}, "avoid": {"type": "string", "description": "Comma-separated words to avoid; consumer-voice queries containing them are skipped."}}, "required": ["keywords"]}}}}}}, "/api/llm": {"post": {"operationId": "ask_llm", "summary": "Call the LLM", "description": "Sends one system+user prompt to the server LLM chain (Gemini first, OpenAI as fallback). The browser builds every naming prompt with the shared NamingCore library (/naming-core.js): keyword extraction, foreign-root translation, strategy brief, candidate pool, critic, detail and deep investigation. With json=true an answer that is not valid JSON counts as failure and the next provider is tried. Returns {text, provider, model, fallback, truncated?, invalid_json?}. 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: one paid LLM call. Time: 5-120 seconds.", "tags": ["run"], "x-lm-kind": "run", "x-lm-cost": "one paid 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": {"system": {"type": "string", "description": "System prompt."}, "message": {"type": "string", "description": "User prompt."}, "max_tokens": {"type": "integer", "description": "Max output tokens (UI uses 1500-9000 by step).", "default": 8000}, "temperature": {"type": "number", "description": "Sampling temperature.", "default": 0.9}, "json": {"type": "boolean", "description": "Require a JSON answer (UI always sends true).", "default": false}, "prefer": {"type": "string", "description": "Provider to try first, e.g. 'openai' for the critic so it runs on a different model than the generator.", "enum": ["", "gemini", "openai"], "default": ""}}, "required": ["message"]}}}}}}, "/api/name-check": {"post": {"operationId": "check_name_usage", "summary": "Check if names are already used", "description": "For up to 40 candidate names: monthly search volume of the romanized spelling, of the native spelling (if non-ASCII) and of '<name> <category word>' for real-word names, plus whether <romanized>.com is registered. High volume means the name is already in use. Returns {checks:{<romanized key>:{volume, native_volume, combo_query, combo_volume, com_available}}}. 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: ListeningMind keyword_info, about 10 credits per uncached keyword (cached 24 h). Time: 5-30 seconds.", "tags": ["run"], "x-lm-kind": "run", "x-lm-cost": "ListeningMind keyword_info, about 10 credits per uncached keyword (cached 24 h)", "responses": {"200": {"description": "Success"}, "default": {"description": "Error (application/problem+json or JSON with detail)"}}, "requestBody": {"required": true, "content": {"application/json": {"schema": {"type": "object", "properties": {"items": {"type": "array", "description": "Candidates: [{name (native spelling), romanized (ASCII spelling), combo (category word, only for real-word routes)}].", "items": {"type": "object", "properties": {"name": {"type": "string"}, "romanized": {"type": "string"}, "combo": {"type": "string"}}}, "maxItems": 40}, "market": {"type": "string", "description": "Target market.", "enum": ["kr", "jp", "us"], "default": "kr"}}, "required": ["items"]}}}}}}, "/api/check-domains-batch": {"post": {"operationId": "check_domains", "summary": "Check domains in bulk", "description": "Checks up to 120 domains: registered if NS records exist, confirmed available by RDAP, A-record fallback. The UI checks each name against the market TLD list (kr: .ai .co .co.kr .kr .com .net .io; jp: .ai .co .jp .co.jp .com .net .io; us: .ai .co .com .net .io .me). Returns [{domain, available: true|false|null}]. Read only, free. Time: 2-20 seconds.", "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": true, "content": {"application/json": {"schema": {"type": "object", "properties": {"domains": {"type": "array", "description": "Domain names like vitaru.com (letters, digits, dots, hyphens).", "items": {"type": "string"}, "maxItems": 120}}, "required": ["domains"]}}}}}}, "/api/check-domain": {"post": {"operationId": "check_domain", "summary": "Check one domain", "description": "Checks one domain the same way as check_domains. Returns {domain, available: true|false|null}. 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)"}}, "requestBody": {"required": true, "content": {"application/json": {"schema": {"type": "object", "properties": {"domain": {"type": "string", "description": "Domain name, e.g. vitaru.ai."}}, "required": ["domain"]}}}}}}, "/api/runs": {"post": {"operationId": "save_run", "summary": "Save run", "description": "Saves a finished result set (brands with scores, domain and deep-check data, brief, evidence) for the signed-in member; the page does this itself when generation and investigation finish. Pass id to update a run you saved earlier. Returns {id, path} where path is /r/<id>. Changes saved data in the app; no credits.", "tags": ["action"], "x-lm-kind": "action", "x-lm-cost": "free", "responses": {"200": {"description": "Success"}, "default": {"description": "Error (application/problem+json or JSON with detail)"}}, "requestBody": {"required": true, "content": {"application/json": {"schema": {"type": "object", "properties": {"id": {"type": "string", "description": "Existing run id to update (omit to create)"}, "input": {"type": "string"}, "keywords": {"type": "array", "items": {"type": "string"}}, "market": {"type": "string"}, "lang": {"type": "string"}, "brands": {"type": "array", "items": {"type": "object"}}, "dm": {"type": "object"}, "cm": {"type": "object"}, "invData": {"type": "object"}, "brief": {"type": "object"}, "intel": {"type": "object"}, "evidence": {"type": "array"}}, "required": ["brands"]}}}}}, "get": {"operationId": "list_runs", "summary": "List my runs", "description": "The signed-in member's saved result sets, newest first: id, created_at, input, market, keywords, brands (count), top (first names). Open one at /r/<id> or read it with get_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)"}}}}, "/api/runs/{id}": {"get": {"operationId": "get_run", "summary": "Read a saved run", "description": "One saved result set in full (brands, dm domain checks, cm, invData deep checks, brief, intel, evidence). Only its owner can read it. 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": "id", "in": "path", "required": true, "description": "", "schema": {"type": "string"}}]}}, "/api/name-serp": {"post": {"operationId": "check_name_serp", "summary": "Check a name against Google results", "description": "For up to 5 candidate names: stored Google results for the bare name (ListeningMind store, so a never-searched name returns no hits). Returns {results:{<romanized key>:{query, hits:[{title,site,url}], exact (results carrying the name in title or domain), exact_hits, aio}}}. 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: ListeningMind serp, 30 credits per name (cached 24 h). Time: 2-10 seconds.", "tags": ["run"], "x-lm-kind": "run", "x-lm-cost": "ListeningMind serp, 30 credits per name (cached 24 h)", "responses": {"200": {"description": "Success"}, "default": {"description": "Error (application/problem+json or JSON with detail)"}}, "requestBody": {"required": true, "content": {"application/json": {"schema": {"type": "object", "properties": {"names": {"type": "array", "maxItems": 5, "items": {"type": "object", "properties": {"name": {"type": "string"}, "romanized": {"type": "string"}}}, "description": "Candidates: [{name (native spelling), romanized (ASCII key)}], up to 5."}, "market": {"type": "string", "enum": ["kr", "jp", "us"], "default": "kr", "description": "Target market."}}, "required": ["names"]}}}}}}, "/api/anchor/get": {"post": {"operationId": "get_anchor", "summary": "Get the previous names for a request", "description": "The last names this member got for the same request (key = NamingCore.anchorKey(params)); the app keeps about 65% of them on a re-run. Returns {anchor:{at, brands, brief}|null}. Read only, free. Time: under 1 second.", "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": true, "content": {"application/json": {"schema": {"type": "object", "properties": {"key": {"type": "string", "description": "NamingCore.anchorKey(params): normalized input, market, script, length, styles, required/avoided words, brand type, UI language."}}, "required": ["key"]}}}}}}, "/api/anchor": {"post": {"operationId": "save_anchor", "summary": "Remember this request's names", "description": "Store the top 10 names (with _verdict) and the brief for the request key so the next run keeps about 65% of them. 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. Time: under 1 second.", "tags": ["run"], "x-lm-kind": "run", "x-lm-cost": "free", "responses": {"200": {"description": "Success"}, "default": {"description": "Error (application/problem+json or JSON with detail)"}}, "requestBody": {"required": true, "content": {"application/json": {"schema": {"type": "object", "properties": {"key": {"type": "string", "description": "Same key as get_anchor."}, "brands": {"type": "array", "maxItems": 12, "items": {"type": "object"}, "description": "Final ranked names, top 10, each with _verdict (strong|caution|risky|null)."}, "brief": {"type": "object", "description": "The naming brief from this run (reused so kept names stay consistent)."}}, "required": ["key", "brands"]}}}}}}, "/api/trademark": {"post": {"operationId": "check_trademark", "summary": "Search the trademark register", "description": "Same or similar word marks in the Korean register (KIPRIS Plus, when the server has a key) plus prefilled links to KIPRIS, J-PlatPat, USPTO and WIPO. Returns {configured, results:[{title, applicant, status, classes, appNo, appDate, regNo, regDate}], links, errors}. Screening only, not legal advice. Read only, free. Cost: free (KIPRIS quota on the server key). Time: 1-20 seconds.", "tags": ["read"], "x-lm-kind": "read", "x-lm-cost": "free (KIPRIS quota on the server key)", "responses": {"200": {"description": "Success"}, "default": {"description": "Error (application/problem+json or JSON with detail)"}}, "requestBody": {"required": true, "content": {"application/json": {"schema": {"type": "object", "properties": {"name": {"type": "string", "description": "Name in its native spelling."}, "romanized": {"type": "string", "description": "ASCII spelling."}, "market": {"type": "string", "enum": ["kr", "jp", "us"], "default": "kr", "description": "Target market."}}, "required": ["name"]}}}}}}, "/api/track": {"post": {"operationId": "start_tracking", "summary": "Start tracking a name", "description": "Register a launched name for monthly search-volume tracking (the name, its romanization and up to 3 '<name> <category>' phrases). Reads keyword_info now and once a month after. Returns {track:{id, keywords, runs, series}}. 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: ListeningMind keyword_info, 10 credits per phrase now and once a month. Time: 2-10 seconds.", "tags": ["run"], "x-lm-kind": "run", "x-lm-cost": "ListeningMind keyword_info, 10 credits per phrase now and once a month", "responses": {"200": {"description": "Success"}, "default": {"description": "Error (application/problem+json or JSON with detail)"}}, "requestBody": {"required": true, "content": {"application/json": {"schema": {"type": "object", "properties": {"name": {"type": "string", "description": "Name in its native spelling."}, "romanized": {"type": "string", "description": "ASCII spelling."}, "keywords": {"type": "array", "items": {"type": "string"}, "maxItems": 3, "description": "Extra phrases to watch, e.g. '<name> <category word>'."}, "market": {"type": "string", "enum": ["kr", "jp", "us"], "description": "Target market."}, "category": {"type": "string", "description": "Category label for display."}, "run_id": {"type": "string", "description": "Saved result the name came from."}}, "required": ["name"]}}}}}}, "/api/tracks": {"get": {"operationId": "list_tracks", "summary": "Tracked names", "description": "This member's tracked names with monthly volumes ({tracks:[{id,name,keywords,runs:[{at,vol,related}],series}]}). Read only, free. Time: under 1 second.", "tags": ["read"], "x-lm-kind": "read", "x-lm-cost": "free", "responses": {"200": {"description": "Success"}, "default": {"description": "Error (application/problem+json or JSON with detail)"}}}}, "/api/track/delete": {"post": {"operationId": "stop_tracking", "summary": "Stop tracking", "description": "Delete a tracked name owned by this member. 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. Time: under 1 second.", "tags": ["run"], "x-lm-kind": "run", "x-lm-cost": "free", "responses": {"200": {"description": "Success"}, "default": {"description": "Error (application/problem+json or JSON with detail)"}}, "requestBody": {"required": true, "content": {"application/json": {"schema": {"type": "object", "properties": {"id": {"type": "string", "description": "Track id from list_tracks."}}, "required": ["id"]}}}}}}}, "externalDocs": {"url": "https://daas-naming.listeningmind.ai/agents.md", "description": "Agent guide"}}