{"openapi":"3.1.0","info":{"title":"Spook API","version":"1.0.0","description":"Free SEO tools plus the Spook agent API: find winnable Google/ChatGPT queries, generate and publish SEO articles, and run autopilot. Authenticate agent endpoints with an account API key (Authorization: Bearer spook_agent_...), generated in Spook Settings. Free tools and the domain analyzer need no key. Also available over MCP at /api/mcp.","contact":{"url":"https://www.tryspook.com"}},"servers":[{"url":"https://www.tryspook.com"}],"tags":[{"name":"free-tools","description":"No-auth SEO utilities"},{"name":"agent-public","description":"No-auth agent tools (domain teaser)"},{"name":"agent","description":"Account API-key-authenticated product actions"}],"paths":{"/api/tools/serp-preview":{"post":{"operationId":"tool_serp_preview","summary":"Preview how a page's title and meta description render in Google search, with pixel-width truncation for desktop and mobile.","tags":["free-tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["title"],"properties":{"title":{"type":"string","description":"The page title tag."},"url":{"type":"string","description":"The page URL."},"description":{"type":"string","description":"The meta description."},"device":{"type":"string","enum":["desktop","mobile"],"default":"desktop"}}}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}}}}},"/api/tools/meta-tag-generator":{"post":{"operationId":"tool_meta_tag_generator","summary":"Generate a complete set of HTML meta tags: title, description, canonical, Open Graph, and Twitter Cards.","tags":["free-tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"title":{"type":"string"},"description":{"type":"string"},"url":{"type":"string","description":"Canonical URL."},"image":{"type":"string","description":"Social share image URL."},"siteName":{"type":"string"},"ogType":{"type":"string","enum":["website","article","product","profile"],"default":"website"},"twitter":{"type":"string","description":"Twitter handle."}}}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}}}}},"/api/tools/schema-generator":{"post":{"operationId":"tool_schema_generator","summary":"Build valid JSON-LD structured data (FAQ, Article, Organization, or Product) for rich results.","tags":["free-tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["type"],"properties":{"type":{"type":"string","enum":["FAQ","Article","Organization","Product"]},"faqs":{"type":"array","items":{"type":"object","properties":{"q":{"type":"string"},"a":{"type":"string"}}}},"article":{"type":"object"},"organization":{"type":"object"},"product":{"type":"object"}}}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}}}}},"/api/tools/robots-txt-generator":{"post":{"operationId":"tool_robots_txt_generator","summary":"Build a valid robots.txt: allow or block crawlers, disallow paths, block specific bots, and link a sitemap.","tags":["free-tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"mode":{"type":"string","enum":["allow","disallow"],"default":"allow"},"disallow":{"type":"array","items":{"type":"string"}},"sitemap":{"type":"string"},"crawlDelay":{"type":"number"},"blockedBots":{"type":"array","items":{"type":"string"}}}}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}}}}},"/api/tools/word-counter":{"post":{"operationId":"tool_word_counter","summary":"Count words, characters, sentences, and paragraphs in text, plus reading and speaking time.","tags":["free-tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["text"],"properties":{"text":{"type":"string"}}}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}}}}},"/api/tools/character-counter":{"post":{"operationId":"tool_character_counter","summary":"Count characters (with and without spaces), words, sentences, and paragraphs in text.","tags":["free-tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["text"],"properties":{"text":{"type":"string"}}}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}}}}},"/api/tools/readability-checker":{"post":{"operationId":"tool_readability_checker","summary":"Score text readability with Flesch Reading Ease and Flesch-Kincaid Grade, plus a reading level.","tags":["free-tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["text"],"properties":{"text":{"type":"string"}}}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}}}}},"/api/tools/hreflang-generator":{"post":{"operationId":"tool_hreflang_generator","summary":"Generate hreflang link tags for international/multilingual pages, plus an optional x-default.","tags":["free-tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["rows"],"properties":{"rows":{"type":"array","items":{"type":"object","properties":{"lang":{"type":"string"},"url":{"type":"string"}}}},"xDefault":{"type":"string"}}}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}}}}},"/api/tools/canonical-tag-generator":{"post":{"operationId":"tool_canonical_tag_generator","summary":"Generate a rel=canonical link tag for a URL.","tags":["free-tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["url"],"properties":{"url":{"type":"string"}}}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}}}}},"/api/tools/meta-robots-generator":{"post":{"operationId":"tool_meta_robots_generator","summary":"Build a meta robots tag (and X-Robots-Tag header) from index/follow and snippet directives.","tags":["free-tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"index":{"type":"boolean","default":true},"follow":{"type":"boolean","default":true},"noarchive":{"type":"boolean"},"nosnippet":{"type":"boolean"},"noimageindex":{"type":"boolean"},"maxSnippet":{"type":"string"},"maxImagePreview":{"type":"string","enum":["","none","standard","large"]},"maxVideoPreview":{"type":"string"}}}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}}}}},"/api/tools/sitemap-generator":{"post":{"operationId":"tool_sitemap_generator","summary":"Build an XML sitemap from a list of URLs, with an optional lastmod date.","tags":["free-tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["urls"],"properties":{"urls":{"type":"array","items":{"type":"string"}},"lastmod":{"type":"string"}}}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}}}}},"/api/tools/robots-txt-tester":{"post":{"operationId":"tool_robots_txt_tester","summary":"Test whether a robots.txt allows or blocks a given URL path for a given user-agent.","tags":["free-tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["robotsTxt","url"],"properties":{"robotsTxt":{"type":"string"},"url":{"type":"string"},"userAgent":{"type":"string","default":"*"}}}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}}}}},"/api/tools/keyword-density-checker":{"post":{"operationId":"tool_keyword_density_checker","summary":"Analyze text for the most frequent words and phrases with their density, to spot keyword stuffing or thin coverage.","tags":["free-tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["text"],"properties":{"text":{"type":"string"},"n":{"type":"integer","enum":[1,2,3],"default":1,"description":"Phrase length (n-gram)."},"removeStopwords":{"type":"boolean","default":true},"limit":{"type":"integer","default":15}}}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}}}}},"/api/tools/headline-analyzer":{"post":{"operationId":"tool_headline_analyzer","summary":"Score a headline (0-100) on length, word balance, power/emotional words, numbers, and brackets.","tags":["free-tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["headline"],"properties":{"headline":{"type":"string"}}}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}}}}},"/api/tools/slug-generator":{"post":{"operationId":"tool_slug_generator","summary":"Turn a title into a clean, SEO-friendly URL slug: lowercase, hyphenated, accent-safe, optional stopword removal.","tags":["free-tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["text"],"properties":{"text":{"type":"string"},"separator":{"type":"string","default":"-"},"removeStopwords":{"type":"boolean","default":true}}}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}}}}},"/api/tools/utm-builder":{"post":{"operationId":"tool_utm_builder","summary":"Append UTM tracking parameters (source, medium, campaign, term, content) to a destination URL.","tags":["free-tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["url","source","medium","campaign"],"properties":{"url":{"type":"string"},"source":{"type":"string"},"medium":{"type":"string"},"campaign":{"type":"string"},"term":{"type":"string"},"content":{"type":"string"}}}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}}}}},"/api/tools/ctr-calculator":{"post":{"operationId":"tool_ctr_calculator","summary":"Calculate Click-through rate.","tags":["free-tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["clicks","impressions"],"properties":{"clicks":{"type":"number","description":"Clicks"},"impressions":{"type":"number","description":"Impressions"}}}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}}}}},"/api/tools/conversion-rate-calculator":{"post":{"operationId":"tool_conversion_rate_calculator","summary":"Calculate Conversion rate.","tags":["free-tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["conversions","visitors"],"properties":{"conversions":{"type":"number","description":"Conversions"},"visitors":{"type":"number","description":"Visitors"}}}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}}}}},"/api/tools/roas-calculator":{"post":{"operationId":"tool_roas_calculator","summary":"Calculate ROAS, ROAS (percentage).","tags":["free-tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["revenue","adSpend"],"properties":{"revenue":{"type":"number","description":"Revenue from ads"},"adSpend":{"type":"number","description":"Ad spend"}}}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}}}}},"/api/tools/cpm-calculator":{"post":{"operationId":"tool_cpm_calculator","summary":"Calculate Cost per 1,000 impressions (CPM).","tags":["free-tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["cost","impressions"],"properties":{"cost":{"type":"number","description":"Total cost"},"impressions":{"type":"number","description":"Impressions"}}}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}}}}},"/api/tools/cpc-calculator":{"post":{"operationId":"tool_cpc_calculator","summary":"Calculate Cost per click (CPC).","tags":["free-tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["cost","clicks"],"properties":{"cost":{"type":"number","description":"Total cost"},"clicks":{"type":"number","description":"Clicks"}}}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}}}}},"/api/tools/ai-crawler-checker":{"post":{"operationId":"tool_ai_crawler_checker","summary":"Check a robots.txt to see which AI crawlers (GPTBot, ClaudeBot, PerplexityBot, Google-Extended, ...) it currently allows or blocks.","tags":["free-tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["robotsTxt"],"properties":{"robotsTxt":{"type":"string","description":"The contents of a robots.txt file."}}}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}}}}},"/api/tools/aeo-checker":{"post":{"operationId":"tool_aeo_checker","summary":"Score content (0-100) for how easily AI answer engines (ChatGPT, Perplexity, AI Overviews) can quote it, with specific fixes.","tags":["free-tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["text"],"properties":{"text":{"type":"string"}}}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}}}}},"/api/tools/llms-txt-generator":{"post":{"operationId":"tool_llms_txt_generator","summary":"Generate an llms.txt file from a site name, one-line summary, optional details, and sections of links.","tags":["free-tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["siteName"],"properties":{"siteName":{"type":"string"},"summary":{"type":"string"},"details":{"type":"string"},"sections":{"type":"array","items":{"type":"object","properties":{"title":{"type":"string"},"links":{"type":"array","items":{"type":"object","properties":{"title":{"type":"string"},"url":{"type":"string"},"notes":{"type":"string"}}}}}}}}}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}}}}},"/api/tools/ai-prompt-generator":{"post":{"operationId":"tool_ai_prompt_generator","summary":"Generate prompts to test whether ChatGPT/Perplexity/Gemini/Claude recommend a brand, and where it's invisible.","tags":["free-tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["brand","category"],"properties":{"brand":{"type":"string"},"category":{"type":"string","description":"What the brand does / its category."},"competitors":{"type":"array","items":{"type":"string"},"description":"Competitor names (array, or a comma-separated string)."},"audience":{"type":"string"}}}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}}}}},"/api/agent/analyze_domain":{"post":{"operationId":"agent_analyze_domain","summary":"Free, no-signup SEO snapshot for any domain: the queries it already ranks on page 1-2 for (its quick-win opportunities), with search volume and estimated traffic. Great first look before signing up.","tags":["agent-public"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["domain"],"properties":{"domain":{"type":"string","description":"A domain, e.g. example.com"}}}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}}}}},"/api/agent/list_sites":{"post":{"operationId":"agent_list_sites","summary":"List the Spook sites on the account this API key belongs to, with each site's id, domain, autopilot state, and publishing setup.","tags":["agent"],"security":[{"bearerAuth":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{}}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}}}}},"/api/agent/get_site":{"post":{"operationId":"agent_get_site","summary":"Get one site's details and status by its id.","tags":["agent"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["siteId"],"properties":{"siteId":{"type":"string"}}}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}}}}},"/api/agent/list_opportunities":{"post":{"operationId":"agent_list_opportunities","summary":"The winnable search queries Spook has found for a site (scored, ranked). No cost. Pass questionsOnly to get only question-shaped queries.","tags":["agent"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["siteId"],"properties":{"siteId":{"type":"string"},"questionsOnly":{"type":"boolean"},"limit":{"type":"integer","default":20}}}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}}}}},"/api/agent/list_articles":{"post":{"operationId":"agent_list_articles","summary":"Recent articles for a site with their status (draft/review/published) and generation status.","tags":["agent"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["siteId"],"properties":{"siteId":{"type":"string"},"limit":{"type":"integer","default":20}}}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}}}}},"/api/agent/generate_article":{"post":{"operationId":"agent_generate_article","summary":"Generate a new SEO article draft for a site targeting a search query. Returns an articleId immediately; generation runs in the background - poll get_article/list_articles, or pass callbackUrl to be notified. Idempotent per query (a repeat returns the existing article). Requires an active subscription.","tags":["agent"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["siteId","query"],"properties":{"siteId":{"type":"string"},"query":{"type":"string","description":"The search query the article should target."},"callbackUrl":{"type":"string","description":"Optional https URL to POST { articleId, status, ... } to when generation finishes."}}}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}}}}},"/api/agent/get_article":{"post":{"operationId":"agent_get_article","summary":"Fetch one article by id: full markdown body, meta, FAQs, SEO score, status, and published URL. Use to review a draft before publishing.","tags":["agent"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["articleId"],"properties":{"articleId":{"type":"string"}}}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}}}}},"/api/agent/get_site_metrics":{"post":{"operationId":"agent_get_site_metrics","summary":"Read a site's performance: daily Search Console clicks/impressions trend plus cached SEO metrics (domain rating, organic traffic estimate, top keywords). No cost. Use to check whether Spook is working.","tags":["agent"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["siteId"],"properties":{"siteId":{"type":"string"},"days":{"type":"integer","default":28}}}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}}}}},"/api/agent/create_site":{"post":{"operationId":"agent_create_site","summary":"Add a new site to the account. Language/market is auto-detected from the homepage. Requires an available paid site slot (use create_checkout first if none). Returns the new siteId.","tags":["agent"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["name","domain"],"properties":{"name":{"type":"string"},"domain":{"type":"string","description":"Bare domain, e.g. example.com"},"description":{"type":"string"},"brandVoice":{"type":"string"},"niche":{"type":"string"},"publishIntegration":{"type":"string","enum":["none","webhook","wordpress","ghost","shopify","rest","nextjs"]},"publishWebhookUrl":{"type":"string"}}}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}}}}},"/api/agent/update_publishing":{"post":{"operationId":"agent_update_publishing","summary":"Configure where a site publishes. Set publishIntegration to 'nextjs' for a credential-free Spook-hosted blog (returns a blog API key), or 'webhook' with publishWebhookUrl. publishMode 'draft' or 'live'.","tags":["agent"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["siteId"],"properties":{"siteId":{"type":"string"},"publishIntegration":{"type":"string","enum":["none","webhook","wordpress","ghost","shopify","rest","nextjs"]},"publishMode":{"type":"string","enum":["draft","live"]},"publishWebhookUrl":{"type":"string"},"publishWebhookSecret":{"type":"string"}}}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}}}}},"/api/agent/create_checkout":{"post":{"operationId":"agent_create_checkout","summary":"Get a Stripe Checkout URL to add the first paid site to the account. Return the URL to the user to approve payment. Needed before create_site if the account has no available slot.","tags":["agent"],"security":[{"bearerAuth":[]}],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{}}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}}}}},"/api/agent/publish_article":{"post":{"operationId":"agent_publish_article","summary":"Publish a generated article to the site's connected CMS. Enforces Spook's SEO-score floor - a draft below it is refused (returns published:false with a reason).","tags":["agent"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["articleId"],"properties":{"articleId":{"type":"string"}}}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}}}}},"/api/agent/set_autopilot":{"post":{"operationId":"agent_set_autopilot","summary":"Turn a site's autopilot on or off. When on, Spook plans, writes, and publishes articles automatically.","tags":["agent"],"security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["siteId","enabled"],"properties":{"siteId":{"type":"string"},"enabled":{"type":"boolean"}}}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}},"401":{"description":"Missing or invalid API key","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}}}}},"/api/agent/blog-keyword-generator":{"post":{"operationId":"agent_blog-keyword-generator","summary":"Blog Keyword Generator: Generate SEO keyword ideas for a topic, with search intent and difficulty. (free, AI-generated, rate-limited).","tags":["agent-public"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"topic":{"type":"string"}},"required":["topic"]}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}}}}},"/api/agent/content-brief-generator":{"post":{"operationId":"agent_content-brief-generator","summary":"Content Brief Generator: Create a detailed SEO content brief for a target keyword. (free, AI-generated, rate-limited).","tags":["agent-public"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"keyword":{"type":"string"},"audience":{"type":"string","description":"Optional target audience."}},"required":["keyword"]}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}}}}},"/api/agent/blog-outline-generator":{"post":{"operationId":"agent_blog-outline-generator","summary":"Blog Outline Generator: Produce a structured, SEO-friendly blog post outline. (free, AI-generated, rate-limited).","tags":["agent-public"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"topic":{"type":"string"}},"required":["topic"]}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}}}}},"/api/agent/content-idea-generator":{"post":{"operationId":"agent_content-idea-generator","summary":"Content Idea Generator: Generate content ideas with formats and angles for a niche. (free, AI-generated, rate-limited).","tags":["agent-public"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"topic":{"type":"string"}},"required":["topic"]}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}}}}},"/api/agent/seo-title-generator":{"post":{"operationId":"agent_seo-title-generator","summary":"SEO Title Generator: Write catchy, SEO-friendly title tags for a topic. (free, AI-generated, rate-limited).","tags":["agent-public"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"keyword":{"type":"string"},"topic":{"type":"string"}},"required":["keyword"]}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}}}}},"/api/agent/meta-description-generator":{"post":{"operationId":"agent_meta-description-generator","summary":"Meta Description Generator: Write SEO meta descriptions that maximize click-through rate. (free, AI-generated, rate-limited).","tags":["agent-public"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"keyword":{"type":"string"},"topic":{"type":"string"},"tone":{"type":"string","description":"Optional tone, e.g. professional, playful."}},"required":["keyword"]}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}}}}},"/api/agent/headline-generator":{"post":{"operationId":"agent_headline-generator","summary":"Headline Generator: Generate catchy, click-worthy headlines. (free, AI-generated, rate-limited).","tags":["agent-public"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"topic":{"type":"string"}},"required":["topic"]}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}}}}},"/api/agent/subject-line-generator":{"post":{"operationId":"agent_subject-line-generator","summary":"Email Subject Line Generator: Write high-converting email subject lines. (free, AI-generated, rate-limited).","tags":["agent-public"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"topic":{"type":"string"}},"required":["topic"]}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}}}}},"/api/agent/cta-generator":{"post":{"operationId":"agent_cta-generator","summary":"CTA Generator: Write effective call-to-action phrases. (free, AI-generated, rate-limited).","tags":["agent-public"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"product":{"type":"string"},"topic":{"type":"string"},"goal":{"type":"string","description":"Optional CTA goal, e.g. sign up, buy."}},"required":["product"]}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}}}}},"/api/agent/ad-copy-generator":{"post":{"operationId":"agent_ad-copy-generator","summary":"Ad Copy Generator: Generate ad headlines and descriptions. (free, AI-generated, rate-limited).","tags":["agent-public"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"product":{"type":"string"},"topic":{"type":"string"},"platform":{"type":"string","description":"Optional ad platform, e.g. Google, Meta."}},"required":["product"]}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}}}}},"/api/agent/social-post-generator":{"post":{"operationId":"agent_social-post-generator","summary":"Social Media Post Generator: Write platform-specific social media posts. (free, AI-generated, rate-limited).","tags":["agent-public"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"topic":{"type":"string"},"platform":{"type":"string","description":"Optional network, e.g. LinkedIn, X."}},"required":["topic"]}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}}}}},"/api/agent/article-summarizer":{"post":{"operationId":"agent_article-summarizer","summary":"AI Article Summarizer: Condense an article into a TL;DR, key points, and summary. (free, AI-generated, rate-limited).","tags":["agent-public"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"text":{"type":"string"}},"required":["text"]}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}}}}},"/api/agent/article-rewriter":{"post":{"operationId":"agent_article-rewriter","summary":"AI Article Rewriter: Rephrase text to be clearer, unique, and engaging. (free, AI-generated, rate-limited).","tags":["agent-public"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"text":{"type":"string"},"tone":{"type":"string","description":"Optional target tone."}},"required":["text"]}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}}}}},"/api/agent/grammar-checker":{"post":{"operationId":"agent_grammar-checker","summary":"AI Grammar Checker: Fix grammar, spelling, and punctuation, and list the corrections. (free, AI-generated, rate-limited).","tags":["agent-public"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"text":{"type":"string"}},"required":["text"]}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}}}}},"/api/agent/faq-generator":{"post":{"operationId":"agent_faq-generator","summary":"FAQ Generator: Generate a set of frequently asked questions and answers for a topic. (free, AI-generated, rate-limited).","tags":["agent-public"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"topic":{"type":"string"}},"required":["topic"]}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}}}}},"/api/agent/product-description-generator":{"post":{"operationId":"agent_product-description-generator","summary":"Product Description Generator: Write persuasive product descriptions. (free, AI-generated, rate-limited).","tags":["agent-public"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"product":{"type":"string"},"features":{"type":"string","description":"Optional key features."}},"required":["product"]}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}}}}},"/api/agent/business-name-generator":{"post":{"operationId":"agent_business-name-generator","summary":"Business Name Generator: Generate brandable business name ideas. (free, AI-generated, rate-limited).","tags":["agent-public"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"topic":{"type":"string","description":"What the business is about."},"keywords":{"type":"string","description":"Optional words to work in."},"style":{"type":"string","description":"Optional naming style."}},"required":["topic"]}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}}}}},"/api/agent/youtube-title-generator":{"post":{"operationId":"agent_youtube-title-generator","summary":"YouTube Title & Description Generator: Write a YouTube title, description, and tags for a video topic. (free, AI-generated, rate-limited).","tags":["agent-public"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"topic":{"type":"string"}},"required":["topic"]}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}}}}},"/api/agent/paragraph-generator":{"post":{"operationId":"agent_paragraph-generator","summary":"Paragraph Generator: Expand a topic or sentence into a well-written paragraph. (free, AI-generated, rate-limited).","tags":["agent-public"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"topic":{"type":"string"},"tone":{"type":"string","description":"Optional tone."}},"required":["topic"]}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}}}}},"/api/agent/content-coverage-checker":{"post":{"operationId":"agent_content-coverage-checker","summary":"Content Coverage Checker: List the terms and entities an article targeting a keyword is expected to cover. (free, AI-generated, rate-limited).","tags":["agent-public"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"keyword":{"type":"string"},"language":{"type":"string"}}}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}}}}},"/api/agent/hashtag-generator":{"post":{"operationId":"agent_hashtag-generator","summary":"Hashtag Generator: Generate relevant hashtags for a topic and platform. (free, AI-generated, rate-limited).","tags":["agent-public"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"topic":{"type":"string"},"platform":{"type":"string","description":"Optional network, e.g. Instagram, TikTok."}},"required":["topic"]}}}},"responses":{"200":{"description":"Success","content":{"application/json":{"schema":{"type":"object"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}},"429":{"description":"Rate limited","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"}}}}}}}}}},"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","description":"An account API key: spook_agent_..."}}}}