{"openapi": "3.1.0", "info": {"title": "AOO API", "version": "1.0.0", "description": "AOO (Agent Operability Optimizer) sends a real LLM agent to a domain with about ten everyday tasks (find the price, contact someone, check the refund policy), records every request and how the agent learned each URL (link, sitemap, llms.txt, web search, model recall and so on), and scores the site 0-100: discovery 20, access 30, navigation 30, completion 20. Site owners and marketers get a fix pack (robots.txt, llms.txt, JSON-LD), apply it through deploy connections and re-measure. It also has a leaderboard, company group audits and monitoring. Sites in any country can be measured; reports are in Korean, English and Japanese. Workflow: get_domain_score → get_access_status → get_engine_options → validate_domain → start_audit → submit_lead → get_audit_queue_position → get_audit → get_trace_run → get_peer_comparison → get_fixpack → download_fixpack_zip → create_connector → propose_change → approve_change → verify_change → rerun_intent → set_monitor → get_history → get_leaderboard", "contact": {"email": "m-support@listeningmind.com"}}, "servers": [{"url": "https://daas-aoo.listeningmind.ai"}], "paths": {"/api/lead": {"get": {"operationId": "get_access_status", "summary": "Get access status", "description": "Tells what this visitor may start: {gate, admin, lead, company, remaining (audits left today), daily, group_sites (max sites per group), providers, anon_remaining (free anonymous audits left), anon_providers}. Call before start_audit. Read only, free. Usually followed by: start_audit, submit_lead.", "tags": ["read"], "x-lm-kind": "read", "x-lm-cost": "free", "responses": {"200": {"description": "Success"}, "default": {"description": "Error (application/problem+json or JSON with detail)"}}}, "post": {"operationId": "submit_lead", "summary": "Submit contact details", "description": "Registers the person's company contact details, which unlocks full reports and the daily audit allowance; sets the lead cookie. Only send details the person gave for this purpose, with their privacy consent. Returns {ok} or 400 {error: invalid, field}. Changes saved data in the app; no credits. Usually followed by: start_audit, get_audit.", "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": {"company": {"type": "string", "description": "Company name (required, max 120 characters)."}, "email": {"type": "string", "description": "Work email (required)."}, "phone": {"type": "string", "description": "Phone number, 7-15 digits (required)."}, "name": {"type": "string", "description": "Person's name (optional)."}, "site_url": {"type": "string", "description": "The site or group being diagnosed (optional)."}, "lang": {"type": "string", "description": "Report language: ko, en or ja. Default ko.", "enum": ["ko", "en", "ja"], "default": "ko"}, "consent_privacy": {"type": "boolean", "description": "Must be true: the person agreed to the privacy policy."}, "consent_marketing": {"type": "boolean", "description": "True if the person agreed to marketing messages. Default false.", "default": false}, "audit_id": {"type": "string", "description": "Optional audit id (UUID) to attach to this lead so its report unlocks."}}, "required": ["company", "email", "phone", "consent_privacy"]}}}}}}, "/api/trace/runs": {"get": {"operationId": "get_engine_options", "summary": "Get engine options", "description": "Returns the agent engines this visitor can choose and whether the rendering harness is installed: {providers[], playwright, health, runs[] (30 recent single-task runs)}. Read only, free. Usually followed by: start_audit.", "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/audits/load": {"get": {"operationId": "get_queue_load", "summary": "Get queue load", "description": "Shows audit queue load: {running, queued, capacity, max_queue, start_eta_s, typical_s, full, mail_ready}. typical_s is the typical audit duration in seconds. 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/validate-domain": {"post": {"operationId": "validate_domain", "summary": "Validate domain", "description": "Checks a domain before an audit: normalizes it, follows redirects, checks robots.txt and the blocklist. Returns {ok, normalized, resolved_url, reachable, status, robots_restricted, redirect_hops, redirect_loop, www_only, scheme, https_error} or {ok:false, reason: invalid_format | unreachable | robots_disallow | blocklisted}. Pass normalized to start_audit. Sends a few requests to the site; no credits. Read only, free. Usually followed by: start_audit.", "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 or URL typed by the person, e.g. www.example.com."}}, "required": ["domain"]}}}}}}, "/api/v1/score/{domain}": {"get": {"operationId": "get_domain_score", "summary": "Get stored score", "description": "Returns the latest stored agent-operability score for a domain without running anything; 404 when the domain was never measured. include=trend adds the score history. Check this before starting a paid audit. Read only, free. Usually followed by: start_audit, get_audit.", "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": "domain", "in": "path", "required": true, "description": "Domain such as example.com (a URL is reduced to its registrable host).", "schema": {"type": "string"}}, {"name": "include", "in": "query", "required": false, "description": "Set to trend to add the score trend.", "schema": {"type": "string", "enum": ["trend"]}}]}}, "/api/audits": {"post": {"operationId": "start_audit", "summary": "Start site audit", "description": "Starts a full audit: a real LLM agent attempts about ten everyday tasks on the site (find the price, contact, refund policy...), every request is recorded, and the site is scored 0-100 on discovery, access, navigation and completion. Returns 202 {audit_id, queued, intents, report_url} or {audit_id, reused: true} when the same audit exists from the last day (no cost; pass fresh true to force a new run). Errors: 401 lead_required, 429 lead_quota or rate_limited, 503 busy (with eta_s and can_wait), 409 already_running (with audit_id). Poll get_audit. 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: LLM agent calls for about ten tasks (cost_usd is reported per task); counts against the daily allowance (1 anonymous, 3 per lead by default). Time: typically 2-3 minutes after it starts, plus queue wait. Usually followed by: get_audit, get_audit_queue_position.", "tags": ["run"], "x-lm-kind": "run", "x-lm-cost": "LLM agent calls for about ten tasks (cost_usd is reported per task); counts against the daily allowance (1 anonymous, 3 per lead by default)", "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 to audit; use normalized from validate_domain."}, "provider": {"type": "string", "description": "Agent engine that performs the tasks. gemini (default), openai or muse; only engines returned by get_engine_options are allowed (others give provider_not_public or provider_not_configured), and anonymous visitors may use gemini only. Changes which model browses, so scores and cost differ by engine.", "enum": ["gemini", "openai", "muse"], "default": "gemini"}, "harness": {"type": "string", "description": "How pages are read. fetch-agent (default) reads raw HTML, as most AI assistants do; playwright-agent renders JavaScript first (only when get_engine_options reports playwright true). The score gap between the two is the rendering gap.", "enum": ["fetch-agent", "playwright-agent"], "default": "fetch-agent"}, "lang": {"type": "string", "description": "Language of the report text and task wording: ko (default), en or ja. Part of the reuse key, so a different lang is a separate audit.", "enum": ["ko", "en", "ja"], "default": "ko"}, "intents": {"type": "array", "description": "Tasks the agent attempts, each scored as a goal. Omit for the default ten. The UI offers presets (sent as this list): default: pricing, signup, api-docs, get-started, support, contact, locations, policy, latest, compare; saas: pricing, signup, api-docs, get-started, support, contact, policy, compare, latest, docs; commerce: pricing, shipping, stock, support, contact, policy, compare, latest, locations, signup; finance: fees, eligibility, support, locations, signup, policy, docs, contact, latest, compare; healthcare: booking, locations, fees, support, eligibility, contact, policy, docs, latest, careers; travel-booking: booking, pricing, fees, support, contact, policy, compare, locations, latest, docs; travel-stay: booking, pricing, locations, support, contact, policy, compare, fees, latest, stock; public: civil, eligibility, docs, processing, contact, locations, fees, latest, support, careers; corporate: contact, careers, locations, support, pricing, latest, policy, docs, compare, signup. Picking cards in the UI sends a custom subset. Fewer tasks = lower cost and a different completion score.", "items": {"type": "string", "enum": ["pricing", "signup", "api-docs", "get-started", "support", "shipping", "contact", "fees", "eligibility", "booking", "locations", "stock", "careers", "policy", "compare", "latest", "docs", "civil", "processing"]}}, "check_webmcp": {"type": "boolean", "description": "Also measure WebMCP tools exposed by the site. Adds a measurement only; tasks and core scores stay comparable. Default false.", "default": false}, "market": {"type": "string", "description": "Country (two capital letters) whose user the agent acts as. Omit for auto-detect (page lang, path, country TLD). The UI offers KR, JP, US, GB, CN, TW, HK, SG, AU, CA, IN, DE, FR, IT, ES, NL, SE, CH, BR, MX, ID, TH, VN, MY, PH, AE; the server accepts any two-letter code.", "pattern": "^[A-Z]{2}$"}, "entry_url": {"type": "string", "description": "Optional URL on the same domain: audit only that section (for example one country edition). Robots, TLS and redirect checks still run on the origin. A different entry_url is a different target in history."}, "scope_prefix": {"type": "string", "description": "Optional path prefix that limits the section audit (used with entry_url)."}, "scope_exclude": {"type": "array", "description": "Optional path prefixes to exclude from the section audit (used with entry_url).", "items": {"type": "string"}}, "model": {"type": "string", "description": "Optional model name for the engine. Default: the engine's default model."}, "fresh": {"type": "boolean", "description": "True to run again even if an audit with the same domain, engine, harness, lang, tasks and market exists from the last day. Default false: such a request returns {audit_id, reused: true} with no new run. Set true for settings sweeps.", "default": false}, "wait": {"type": "boolean", "description": "When the queue is full, true joins it anyway and emails when done (needs notify_email).", "default": false}, "notify_email": {"type": "string", "description": "Email address to notify when the audit finishes."}}, "required": ["domain"]}}}}}, "get": {"operationId": "list_audits", "summary": "List audits", "description": "Lists stored audits newest first: {audits[{audit_id, domain, provider, harness, phase, overall, grade, intent_count, cost_usd, duration_ms, created_at, finished_at, country}], health}. Filter by domain. Read only, free. Usually followed by: get_audit.", "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": "domain", "in": "query", "required": false, "description": "Optional domain filter.", "schema": {"type": "string"}}, {"name": "limit", "in": "query", "required": false, "description": "Max audits. Default 50.", "schema": {"type": "integer", "default": 50, "minimum": 1}}]}}, "/api/audits/{audit_id}": {"get": {"operationId": "get_audit", "summary": "Get audit report", "description": "Reads an audit. Status 202 while phase is queued, probing, running or synthesizing; 200 when phase is done or failed. The document has domain, phase, score and category scores, goals with evidence, findings (worst first), synthesis.recommendations, runs[] per task with verdict and run_id, probe and market. Detail is redacted for visitors without a lead (submit_lead unlocks). Repeat until phase is done or failed. Read only, free. Waits up to about 45 s for 'phase' to reach done, failed; call again if not done. Usually followed by: get_fixpack, get_monitor, get_reruns, translate_audit, get_peer_comparison.", "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": "audit_id", "in": "path", "required": true, "description": "Audit id (UUID) returned by start_audit, e.g. from the report URL /report/{audit_id}.", "schema": {"type": "string"}}]}}, "/api/audits/{audit_id}/queue": {"get": {"operationId": "get_audit_queue_position", "summary": "Get queue position", "description": "Position of a queued audit: {queued, position, ahead, eta_s, phase}. Read only, free. Usually followed by: request_completion_email.", "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": "audit_id", "in": "path", "required": true, "description": "Audit id (UUID) returned by start_audit, e.g. from the report URL /report/{audit_id}.", "schema": {"type": "string"}}]}}, "/api/audits/{audit_id}/notify": {"post": {"operationId": "request_completion_email", "summary": "Email me when done", "description": "Asks for an email when a queued or running audit finishes. Returns {ok}; 409 already_finished; 503 when mail is not configured. 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)"}}, "parameters": [{"name": "audit_id", "in": "path", "required": true, "description": "Audit id (UUID) returned by start_audit, e.g. from the report URL /report/{audit_id}.", "schema": {"type": "string"}}], "requestBody": {"required": true, "content": {"application/json": {"schema": {"type": "object", "properties": {"email": {"type": "string", "description": "Email address."}, "lang": {"type": "string", "description": "Report language: ko, en or ja. Default ko.", "enum": ["ko", "en", "ja"], "default": "ko"}}, "required": ["email"]}}}}}}, "/api/audits/{audit_id}/resume": {"post": {"operationId": "resume_audit", "summary": "Resume interrupted audit", "description": "Puts an interrupted (failed or stalled) audit back in the queue. Returns {ok, audit_id, resumed} or {ok:false, reason: not_found | already_done | already_live}. Poll get_audit. 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: LLM agent calls for the unfinished tasks. Usually followed by: get_audit.", "tags": ["run"], "x-lm-kind": "run", "x-lm-cost": "LLM agent calls for the unfinished tasks", "responses": {"200": {"description": "Success"}, "default": {"description": "Error (application/problem+json or JSON with detail)"}}, "parameters": [{"name": "audit_id", "in": "path", "required": true, "description": "Audit id (UUID) returned by start_audit, e.g. from the report URL /report/{audit_id}.", "schema": {"type": "string"}}]}}, "/api/trace/runs/{run_id}": {"get": {"operationId": "get_trace_run", "summary": "Get task trajectory", "description": "Reads one recorded agent run (one task): {run_id, domain, intent_id, intent_text, provider, model, outcome, verdict, agent_response, cited_urls, trajectory.steps[] (each fetch with url, status and how the agent learned it), insight, cost_usd, duration_ms}. 202 {pending: true, phase} while still running. Read only, free. Usually followed by: get_trace_screenshot.", "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 (UUID) from an audit's runs[] or from rerun_intent.", "schema": {"type": "string"}}]}}, "/api/trace/runs/{run_id}/shots/{step}": {"get": {"operationId": "get_trace_screenshot", "summary": "Get step screenshot", "description": "Returns the screenshot image recorded for one step of a run (rendering harness only). 404 when none. 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 (UUID).", "schema": {"type": "string"}}, {"name": "step", "in": "path", "required": true, "description": "Step index, 0 or more.", "schema": {"type": "integer", "minimum": 0}}]}}, "/api/audits/{audit_id}/translate": {"get": {"operationId": "translate_audit", "summary": "Translate report", "description": "Translates the audit's generated text into another language: {translation, lang, source_lang}; translation is null when the report is already in that language or locked. 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: LLM translation calls.", "tags": ["run"], "x-lm-kind": "run", "x-lm-cost": "LLM translation calls", "responses": {"200": {"description": "Success"}, "default": {"description": "Error (application/problem+json or JSON with detail)"}}, "parameters": [{"name": "audit_id", "in": "path", "required": true, "description": "Audit id (UUID) returned by start_audit, e.g. from the report URL /report/{audit_id}.", "schema": {"type": "string"}}, {"name": "lang", "in": "query", "required": true, "description": "Report language: ko, en or ja. Default ko.", "schema": {"type": "string", "enum": ["ko", "en", "ja"], "default": "ko"}}]}}, "/api/v1/peer/{domain}": {"get": {"operationId": "get_peer_comparison", "summary": "Get peer comparison", "description": "Compares the domain with measured sites of the same industry and country: {domain, peer{industry, country, ...}} or peer null when not on the board. 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": "domain", "in": "path", "required": true, "description": "Domain such as example.com (a URL is reduced to its registrable host).", "schema": {"type": "string"}}]}}, "/api/audits/{audit_id}/fixpack": {"get": {"operationId": "download_fixpack_zip", "summary": "Download fix pack ZIP", "description": "Downloads the fix pack files as a ZIP (aoo-fixpack-{domain}.zip). 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": "audit_id", "in": "path", "required": true, "description": "Audit id (UUID) returned by start_audit, e.g. from the report URL /report/{audit_id}.", "schema": {"type": "string"}}, {"name": "lang", "in": "query", "required": false, "description": "Report language: ko, en or ja. Default ko.", "schema": {"type": "string", "enum": ["ko", "en", "ja"], "default": "ko"}}, {"name": "format", "in": "query", "required": true, "description": "Must be zip.", "schema": {"type": "string", "enum": ["zip"], "default": "zip"}}]}}, "/api/audits/{audit_id}/actions": {"post": {"operationId": "probe_actions", "summary": "Probe site actions", "description": "Probes what an agent could actually do on the site (forms, actions) and stores the result in the audit: {actions}. Audit must be done. Owner only: needs the lead cookie of the visitor who started the audit (see auth). 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: no credits; sends requests to the site.", "tags": ["run"], "x-lm-kind": "run", "x-lm-cost": "no credits; sends requests to the site", "responses": {"200": {"description": "Success"}, "default": {"description": "Error (application/problem+json or JSON with detail)"}}, "parameters": [{"name": "audit_id", "in": "path", "required": true, "description": "Audit id (UUID) returned by start_audit, e.g. from the report URL /report/{audit_id}.", "schema": {"type": "string"}}]}}, "/api/audits/{audit_id}/rerun": {"get": {"operationId": "get_reruns", "summary": "List task re-runs", "description": "Lists single-task re-runs of this audit: {reruns[], active[]}. Read only, free. Usually followed by: get_trace_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)"}}, "parameters": [{"name": "audit_id", "in": "path", "required": true, "description": "Audit id (UUID) returned by start_audit, e.g. from the report URL /report/{audit_id}.", "schema": {"type": "string"}}]}, "post": {"operationId": "rerun_intent", "summary": "Re-run one task", "description": "Re-runs one task of the audit after a fix, instead of a whole audit. Returns 202 {run_id}; read it with get_trace_run or get_reruns. Owner only: needs the lead cookie of the visitor who started the audit (see auth). 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: LLM agent calls for one task. Usually followed by: get_reruns, get_trace_run.", "tags": ["run"], "x-lm-kind": "run", "x-lm-cost": "LLM agent calls for one task", "responses": {"200": {"description": "Success"}, "default": {"description": "Error (application/problem+json or JSON with detail)"}}, "parameters": [{"name": "audit_id", "in": "path", "required": true, "description": "Audit id (UUID) returned by start_audit, e.g. from the report URL /report/{audit_id}.", "schema": {"type": "string"}}], "requestBody": {"required": true, "content": {"application/json": {"schema": {"type": "object", "properties": {"intent_id": {"type": "string", "description": "Task to re-run.", "enum": ["pricing", "signup", "api-docs", "get-started", "support", "shipping", "contact", "fees", "eligibility", "booking", "locations", "stock", "careers", "policy", "compare", "latest", "docs", "civil", "processing"]}}, "required": ["intent_id"]}}}}}}, "/api/audits/{audit_id}/monitor": {"get": {"operationId": "get_monitor", "summary": "Get monitoring status", "description": "Shows scheduled re-audits and changes for this site: {monitor{enabled, interval_days, next_run_at, running}, events[], prev (diff with the previous audit), newer, can_manage}. Read only, free. Usually followed by: set_monitor.", "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": "audit_id", "in": "path", "required": true, "description": "Audit id (UUID) returned by start_audit, e.g. from the report URL /report/{audit_id}.", "schema": {"type": "string"}}]}, "post": {"operationId": "set_monitor", "summary": "Set monitoring", "description": "Turns scheduled re-audits of this site on (every interval_days) or off (enabled false). Each scheduled re-audit later runs a full audit. Owner only: needs the lead cookie of the visitor who started the audit (see auth). 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)"}}, "parameters": [{"name": "audit_id", "in": "path", "required": true, "description": "Audit id (UUID) returned by start_audit, e.g. from the report URL /report/{audit_id}.", "schema": {"type": "string"}}], "requestBody": {"required": false, "content": {"application/json": {"schema": {"type": "object", "properties": {"enabled": {"type": "boolean", "description": "False turns monitoring off. Default true."}, "interval_days": {"type": "integer", "description": "Days between re-audits. Default 7.", "default": 7, "minimum": 1}}, "required": []}}}}}}, "/api/connectors": {"get": {"operationId": "list_connectors", "summary": "List connectors and changes", "description": "Lists deploy connections (github, cloudflare, wordpress, cafe24, imweb) and change requests for the audited site: {secrets_available, connections[], changes[]}. Owner only: needs the lead cookie of the visitor who started the audit (see auth). 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": "audit_id", "in": "query", "required": true, "description": "Audit id (UUID) returned by start_audit, e.g. from the report URL /report/{audit_id}.", "schema": {"type": "string"}}]}, "post": {"operationId": "rollback_change", "summary": "Roll back change", "description": "Reverts an applied change on the live site. Needs explicit human approval. Returns {change}. Owner only: needs the lead cookie of the visitor who started the audit (see auth). 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: no credits; writes to the live site.", "tags": ["run"], "x-lm-kind": "run", "x-lm-cost": "no credits; writes to the live site", "responses": {"200": {"description": "Success"}, "default": {"description": "Error (application/problem+json or JSON with detail)"}}, "requestBody": {"required": true, "content": {"application/json": {"schema": {"type": "object", "properties": {"audit_id": {"type": "string", "description": "Audit id (UUID) returned by start_audit, e.g. from the report URL /report/{audit_id}."}, "id": {"type": "string", "description": "Change id."}}, "required": ["audit_id", "id"]}}}}}}, "/api/connectors/wordpress-plugin": {"get": {"operationId": "download_wordpress_plugin", "summary": "Download WordPress plugin", "description": "Downloads the AOO Connector WordPress plugin ZIP used by wordpress connections. 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/groups/discover": {"post": {"operationId": "discover_group_domains", "summary": "Discover group domains", "description": "Finds candidate domains of a company group (subsidiaries, brands) from web search results and checks they answer. Returns candidates to review before create_group. 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: LLM web search calls. Usually followed by: create_group.", "tags": ["run"], "x-lm-kind": "run", "x-lm-cost": "LLM web search calls", "responses": {"200": {"description": "Success"}, "default": {"description": "Error (application/problem+json or JSON with detail)"}}, "requestBody": {"required": true, "content": {"application/json": {"schema": {"type": "object", "properties": {"company": {"type": "string", "description": "Company or group name."}, "provider": {"type": "string", "description": "Agent engine. Public engines are listed by get_engine_options; anonymous visitors may use gemini only. Default gemini.", "enum": ["gemini", "openai", "muse"], "default": "gemini"}, "lang": {"type": "string", "description": "Report language: ko, en or ja. Default ko.", "enum": ["ko", "en", "ja"], "default": "ko"}}, "required": ["company"]}}}}}}, "/api/groups": {"post": {"operationId": "create_group", "summary": "Start group audit", "description": "Starts audits for several sites of one company at once (a lead may add up to group_sites from get_access_status, 5 by default). Returns 202 {group_id, name, sites, rejected[], report_url}; poll get_group. 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 full audit per site (LLM agent calls); counts as one of the lead's daily runs. Usually followed by: get_group.", "tags": ["run"], "x-lm-kind": "run", "x-lm-cost": "one full audit per site (LLM agent calls); counts as one of the lead's daily runs", "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": "Group name (required, max 60 characters)."}, "company": {"type": "string", "description": "Company name. Default: name."}, "lang": {"type": "string", "description": "Report language: ko, en or ja. Default ko.", "enum": ["ko", "en", "ja"], "default": "ko"}, "provider": {"type": "string", "description": "Agent engine. Public engines are listed by get_engine_options; anonymous visitors may use gemini only. Default gemini.", "enum": ["gemini", "openai", "muse"], "default": "gemini"}, "model": {"type": "string", "description": "Optional model name."}, "battery": {"type": "string", "description": "Default task set for all sites: an industry battery, default, or custom (then intents).", "enum": ["default", "saas", "commerce", "finance", "healthcare", "travel-booking", "travel-stay", "public", "corporate", "custom"], "default": "default"}, "intents": {"type": "array", "description": "Tasks when battery is custom.", "items": {"type": "string", "enum": ["pricing", "signup", "api-docs", "get-started", "support", "shipping", "contact", "fees", "eligibility", "booking", "locations", "stock", "careers", "policy", "compare", "latest", "docs", "civil", "processing"]}}, "sites": {"type": "array", "description": "Sites to audit: objects {domain (required), name, battery, intents}.", "items": {"type": "object"}}, "discovered": {"type": "array", "description": "Optional candidate list returned by discover_group_domains, kept for the record.", "items": {"type": "object"}}}, "required": ["name", "sites"]}}}}}, "get": {"operationId": "list_groups", "summary": "List groups", "description": "Lists public groups and this lead's own groups: {groups[{group_id, name, phase, created_at, finished_at, site_count, private}]}. Read only, free. Usually followed by: get_group.", "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/groups/{group_id}": {"get": {"operationId": "get_group", "summary": "Get group report", "description": "Reads a group: {group_id, name, company, phase, provider, model, lang, progress{total, done, failed}, summary, sites[] with each audit status and score}. Repeat until phase is done. Read only, free. Waits up to about 45 s for 'phase' to reach done, failed; call again if not done. Usually followed by: get_audit.", "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": "group_id", "in": "path", "required": true, "description": "Group id (UUID).", "schema": {"type": "string"}}]}}, "/api/groups/{group_id}/resume": {"post": {"operationId": "resume_group", "summary": "Resume group audit", "description": "Re-queues the unfinished audits of an interrupted group. 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: LLM agent calls for the unfinished audits. Usually followed by: get_group.", "tags": ["run"], "x-lm-kind": "run", "x-lm-cost": "LLM agent calls for the unfinished audits", "responses": {"200": {"description": "Success"}, "default": {"description": "Error (application/problem+json or JSON with detail)"}}, "parameters": [{"name": "group_id", "in": "path", "required": true, "description": "Group id (UUID).", "schema": {"type": "string"}}]}}, "/api/v1/leaderboard": {"get": {"operationId": "get_leaderboard", "summary": "Get leaderboard", "description": "Measured sites ranked by agent operability: {entries[], categories[], industries[], stats, coverage, gated, index}. Filter by category or search text. 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": "category", "in": "query", "required": false, "description": "Category id to filter by (from categories[]).", "schema": {"type": "string"}}, {"name": "q", "in": "query", "required": false, "description": "Search text (domain or name).", "schema": {"type": "string"}}, {"name": "limit", "in": "query", "required": false, "description": "Max entries, up to 500. Default 200.", "schema": {"type": "integer", "default": 200, "maximum": 500}}]}}, "/api/history": {"get": {"operationId": "get_history", "summary": "Get history", "description": "Without domain: {domains[], audits[], runs[]} (only=domains returns just domains). With domain: {domain, trend, audits[], runs[]} for that site. Read only, free. Usually followed by: get_audit.", "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": "domain", "in": "query", "required": false, "description": "Optional domain for one site's trend.", "schema": {"type": "string"}}, {"name": "limit", "in": "query", "required": false, "description": "Optional list size (max 2000 domains, 500 audits or runs).", "schema": {"type": "integer"}}, {"name": "only", "in": "query", "required": false, "description": "Set to domains to return only the domain list.", "schema": {"type": "string", "enum": ["domains"]}}]}}, "/_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-aoo.listeningmind.ai/agents.md", "description": "Agent guide"}}