# Searchable Agent Source: https://docs.searchable.com/advanced/ai-assistant Get instant SEO and AEO recommendations from your AI-powered copilot ## Overview Your AI Copilot Agent is an intelligent assistant that understands your website, business context, and SEO goals. It provides personalized recommendations and can take actions across your entire Searchable workspace. The AI Copilot is available on all plans, with advanced actions unlocking on **Professional**, **Agency**, and **Custom** tiers. ## What Your AI Copilot Can Do Review your visibility scores, prompt performance, and competitive position Get prioritized, context-aware recommendations based on your data Ask anything about your SEO, audit results, or AI visibility Create prompts, generate content, analyze competitors, and more ## How to Access Your AI Copilot is available throughout Searchable: **From the Dashboard:** * Click the **AI Assistant** icon in the top-right corner * Available on any page within your workspace * Maintains context of your current view **From Specific Pages:** * **Pages Tab**: Right-click any page → "Ask AI" for page-specific recommendations * **Issues Tab**: Click any issue → "Get AI Help" for fix guidance * **Prompts Tab**: Select prompts → "Optimize with AI" for improvement suggestions The AI Copilot learns from your knowledge base (created in Step 1 of the onboarding checklist), so train it well for better recommendations! ## Core Capabilities ### 1. Website Analysis Ask your copilot to analyze any aspect of your site: **Example questions:** * "What are my biggest SEO issues right now?" * "Why is my technical score low?" * "Which pages should I optimize first?" * "How do I improve my Core Web Vitals?" **What it does:** * Reviews your latest audit data * Identifies patterns across issues * Prioritizes by impact and effort * Provides step-by-step fix instructions ### 2. Visibility & Competitive Intelligence Get insights into your AI visibility and competitors: **Example questions:** * "How am I performing against competitors?" * "Which prompts are getting the most mentions?" * "Why isn't \[competitor] being cited for \[topic]?" * "What content gaps exist in my category?" **What it does:** * Analyzes visibility reports across 4 AI platforms * Compares your performance to competitors * Identifies opportunity topics * Recommends content strategy ### 3. Prompt Optimization Improve your AI visibility tracking: **Example questions:** * "Can you analyze my prompt performance?" * "Generate 10 new prompts for \[topic]" * "Why aren't my prompts getting mentions?" * "Optimize this prompt: \[your prompt]" **What it does:** * Reviews prompt mention rates * Generates industry-specific prompts * Suggests improvements to existing prompts * Identifies zero-mention opportunities ### 4. Content Strategy Plan and create optimized content: **Example questions:** * "What content should I create next?" * "Generate a blog post about \[topic]" * "How do I optimize my existing article on \[topic]?" * "What keywords should I target?" **What it does:** * Identifies content gaps * Generates AI-optimized articles * Provides SEO and AEO recommendations * Suggests internal linking opportunities ### 5. Integration Assistance Get help with connected platforms: **Example questions:** * "Show me my Google Search Console data" * "What keywords am I ranking for?" * "Analyze my GA4 traffic from AI platforms" **What it does:** * Retrieves data from connected integrations * Correlates metrics across platforms * Provides unified insights * Assists with publishing workflows ### 6. Technical SEO Guidance Understand and fix technical issues: **Example questions:** * "Explain this issue: \[paste issue title]" * "How do I implement structured data?" * "What's causing my slow page speed?" * "Walk me through fixing 404 errors" **What it does:** * Explains technical concepts clearly * Provides code examples and instructions * Estimates impact of fixes * Offers best practices ## Advanced Features ### Context Awareness Your AI Copilot understands: * **Your current page**: Automatically knows where you are in the app * **Your project**: Aware of your domain, industry, and goals * **Your data**: Has access to all your metrics and history * **Your knowledge base**: Trained on your brand information ### Multi-Turn Conversations Build on previous questions: ```text theme={null} You: "What are my critical issues?" Copilot: [Lists 5 critical issues] You: "Explain the first one in detail" Copilot: [Detailed explanation with fix steps] You: "Generate the code for that fix" Copilot: [Provides implementation code] ``` ### Available Actions The copilot can execute tasks on your behalf: * Create new prompts * Generate content outlines and articles * Run SERP analysis * Fetch competitor data * Analyze keyword opportunities * Export reports Analyze data, answer questions, provide recommendations Create prompts, generate content, optimize pages (with confirmation) ## Copilot Tiers by Plan | Capability | Starter (\$100) | Professional (\$300) | Agency (\$750) | Custom | | ---------------------------- | --------------- | -------------------- | -------------- | ------ | | **Basic Analysis** | ✓ | ✓ | ✓ | ✓ | | **Prompt Generation** | ✓ | ✓ | ✓ | ✓ | | **Content Creation** | ✓ | ✓ | ✓ | ✓ | | **Integration Data** | — | ✓ | ✓ | ✓ | | **Competitor Analysis** | — | ✓ | ✓ | ✓ | | **Advanced Analytics** | — | ✓ | ✓ | ✓ | | **Batch Actions** | — | Limited | ✓ | ✓ | | **Custom Tools & Workflows** | — | — | Limited | ✓ | ## Best Practices Start conversations with specific questions, not vague requests Reference specific pages, prompts, or issues for targeted help Review AI-generated content before publishing Use copilot for second opinions on strategies Build multi-turn conversations for complex topics The AI Copilot provides recommendations based on your data and industry best practices. Always verify critical changes before implementing, especially technical modifications. ## Example Workflows ### Morning SEO Check ```text theme={null} You: "What changed overnight? Any critical issues?" Copilot: Analyzes latest data and highlights: - New critical issues (if any) - Significant score changes - Visibility improvements or drops - Recommended immediate actions ``` ### Content Planning Session ```text theme={null} You: "I need content ideas for next month" Copilot: 1. Analyzes your zero-mention prompts 2. Identifies top opportunities 3. Suggests 5-10 article topics 4. Provides target keywords and structure You: "Create an outline for the first topic" Copilot: Generates comprehensive outline with: - SEO-optimized headlines - Section structure - Internal linking suggestions - Target word count ``` ### Issue Resolution ```text theme={null} You: "How do I fix my Core Web Vitals?" Copilot: 1. Reviews your specific CWV metrics 2. Identifies root causes 3. Prioritizes fixes by impact 4. Provides code examples 5. Estimates score improvement You: "Implement the first fix" Copilot: Provides step-by-step implementation guide ``` ## Privacy & Data **What the copilot knows:** * Your project data (scores, issues, prompts, content) * Your knowledge base (brand info you provided) * Your connected integration data * Industry benchmarks and best practices **What stays private:** * All conversations are private to your account * No data shared with external AI models beyond necessary processing * Training data stays within Searchable * You own all generated content and insights ## Conversation Management **Chat History:** * All conversations are saved automatically * Access past conversations from the sidebar * Search through conversation history * Delete conversations anytime **New Conversation:** * Click "New Chat" to start fresh context * Previous conversations remain accessible * Each chat maintains its own context ## Limitations The AI Copilot is powerful but has boundaries: **What it won't do:** * Make changes without your confirmation for write operations * Access websites outside your verified properties * Share your data with third parties * Guarantee specific ranking improvements (provides best practices only) ## Tips for Best Results ### Be Specific **Instead of:** "Help with SEO"\ **Try:** "Why is my technical score 62 and how can I get it to 80?" ### Provide Context **Instead of:** "Fix this issue"\ **Try:** "Explain this issue '\[paste issue title]' and show me how to fix it on a WordPress site" ### Build on Responses **Multi-turn approach:** 1. Ask for analysis first 2. Request detailed explanation 3. Get implementation steps 4. Ask for code examples 5. Request expected impact ### Use for Planning **Strategic questions:** * "Create a 30-day plan to improve AI visibility" * "What should I focus on this week?" * "Prioritize my issues by ROI" * "Build a content calendar for Q1" ## Getting Help If the copilot doesn't have enough context: * Ensure you've completed the knowledge base setup * Verify your project is properly configured * Check that integrations are connected (for integration data) * Try rephrasing your question more specifically ## Next Steps Update knowledge base for better recommendations Use copilot to create optimized content Optimize prompts with AI assistance Get AI help fixing audit issues # Advanced API Usage Source: https://docs.searchable.com/advanced/api-usage Query your AI visibility data and generate reports programmatically with the Searchable API ## Overview Searchable exposes three programmatic surfaces. Pick the one that fits your use case: 30+ read tools for Claude, Cursor, and other MCP clients — the richest way to query your data. Fetch audits & issues and generate shareable reports with an API key — see the interactive reference + playground. Send AI-bot traffic events from any language or platform. API access requires a **paid Searchable plan** — API keys can't be created on the Free plan. ## Authentication Create an API key in **Settings → Workspace → Integrations** in your Searchable dashboard. Keys start with `sea_` and are shown only once — store it securely. Send it as a Bearer token on every request: ``` Authorization: Bearer sea_your_key_here ``` | Base URL | `https://app.searchable.com` | | -------- | ---------------------------- | ### Scopes Each key carries one or more scopes. Read endpoints require `read` (the default); write endpoints require `write`. | Scope | Grants | | ------- | -------------------------------------------- | | `read` | Fetch audits, issues, and visibility data | | `write` | Everything in `read`, plus report generation | | `admin` | All scopes | A key can also be **bound to a single project**. A project-bound key only works against that project; leave a key unbound to use it across all projects you can access. ## Fetch audits + issues Retrieve the latest audit per page, when each was last completed, and optionally the open issues for each page. ``` GET /api/v1/projects/{projectId}/audits?includeIssues=true ``` ```javascript theme={null} const res = await fetch( "https://app.searchable.com/api/v1/projects/PROJECT_ID/audits?includeIssues=true", { headers: { Authorization: "Bearer sea_YOUR_KEY" } }, // requires the `read` scope ); const { summary, audits } = await res.json(); // summary.totalPages — pages with at least one completed audit (not all tracked pages) // summary.lastCompletedAt — newest completed audit across all pages // audits[].openIssues — present only when includeIssues=true ``` ## Share of voice & competitors Brand vs competitor share of voice, and the project's real/tracked competitor roster (also available as the `get_share_of_voice` and `get_competitors` MCP tools). All four endpoints accept the same filter family: `days`, `platform`, `topicId`, `unbranded`/`branded`, `country`/`locationId`. ``` GET /api/mcp/projects/{projectId}/share-of-voice GET /api/mcp/projects/{projectId}/share-of-voice/history GET /api/mcp/projects/{projectId}/competitors GET /api/mcp/projects/{projectId}/competitors/{competitorId} ``` ```javascript theme={null} const res = await fetch( "https://app.searchable.com/api/mcp/projects/PROJECT_ID/share-of-voice?days=30", { headers: { Authorization: "Bearer sea_YOUR_KEY" } }, // requires the `read` scope ); const { brand, competitors, dateRange } = await res.json(); // brand.delta / competitors[].delta are day-over-day (today vs yesterday), // not a comparison against a prior period the length of `days`. // mentions/citations are always null on this endpoint — call // GET .../competitors or GET .../competitors/{competitorId} for those counts. ``` Two things to know on the competitors endpoints: the list view's `mentions` is an **all-time** count that ignores `days` and the filters (mirrors the in-app Competitors list), and the detail view carries **two distinct metrics** — the top-level `citations` counts inline citations on responses that *mention* the competitor (any domain), while `history[].domainSources` counts source URLs (pages the engines consulted for generation, not inline citations) on the competitor's *own* domain. ## AI Traffic API First-party AI-traffic measurement — crawler visits and AI-referral sessions sourced from the tracker/CDN pipeline (also available as the `get_ai_traffic` MCP tool, `report=overview|crawlers|referrals|top_cited_pages`). ``` GET /api/mcp/projects/{projectId}/traffic/overview GET /api/mcp/projects/{projectId}/traffic/bots GET /api/mcp/projects/{projectId}/traffic/referrals GET /api/mcp/projects/{projectId}/traffic/top-cited-pages ``` ```javascript theme={null} const res = await fetch( "https://app.searchable.com/api/mcp/projects/PROJECT_ID/traffic/overview?days=30", { headers: { Authorization: "Bearer sea_YOUR_KEY" } }, // requires the `read` scope ); const { crawlers, referrals, topPages, dateRange } = await res.json(); // crawlers.total / referrals.total are window totals; byPlatform breaks each // down by AI platform (openai, anthropic, google, perplexity, microsoft, …). // topPages is crawl-ranked (top 10) — its `referrals` field is always null; // call top-cited-pages with a platform for per-page AI-referral counts. ``` `bots` returns a paginated per-page crawler-activity list — `items[]` (each with a `byPlatform` breakdown), and `pagination` (`limit`/`offset`/`returnedCount`/`hasMore`/`nextOffset`; `totalCount` is always `null` since the underlying per-vendor query doesn't cheaply support an exact cross-platform total). `referrals` returns a daily AI-referral session timeseries by platform plus window `totals`. `top-cited-pages` **requires** an explicit `platform` (one of `openai`, `anthropic`, `google`, `perplexity`, `microsoft`) and returns `400` without one. `platform` is validated strictly on every endpoint that accepts it: an unrecognized value returns `400` listing the supported keys (`bots`/`referrals` accept the full eight-platform set — the five above plus `deepseek`, `xai`, `meta`) — never a silent empty result. All four endpoints return `409 { code: "traffic_not_connected", message, howToFix }` when the project has no crawler-log, CDN, or Searchable-tracker source connected — `howToFix` links straight to **AI Traffic → Setup** in the dashboard. Connect a source there, then retry. ## Shopping visibility AI shopping/product visibility (Peec-parity) — products surfaced in AI shopping/product-carousel responses (also available as the `get_shopping_visibility` MCP tool, `view=summary|timeseries`, or pass `productId` for detail). ``` GET /api/mcp/projects/{projectId}/shopping GET /api/mcp/projects/{projectId}/shopping/products/{productId} GET /api/mcp/projects/{projectId}/shopping/timeseries ``` ```javascript theme={null} const res = await fetch( "https://app.searchable.com/api/mcp/projects/PROJECT_ID/shopping?days=30", { headers: { Authorization: "Bearer sea_YOUR_KEY" } }, // requires the `read` scope ); const { available, products, summary, dateRange } = await res.json(); // available:false (200, not an error) means no shopping/product data yet — // this is a data-presence state, not a broken integration. It appears // automatically once tracked prompts trigger an AI shopping carousel. // products[].platforms is a single-element array (the product's one // dominant platform) — call the product-detail endpoint below for a real // per-platform breakdown. ``` `productId` is the product's raw title (the `id` returned by the list endpoint above) — percent-encode it in the URL. The detail endpoint returns occurrences, vendor/pricing rows, a **real** per-platform breakdown, and up to 50 recent responses that surfaced the product. Requires a plan with **Shopping Analytics** (Scale or higher) — returns `403 { requiresUpgrade: true }` if the workspace's plan doesn't include it and the project has data to fetch (an empty project still returns `available:false` first). ## Ads Sponsored ads surfaced in AI answers — who is advertising, the actual ad creatives, ad-heavy prompts, and the frequency trend (also available as the `get_ads` MCP tool, `view=advertisers|creatives|prompts|timeseries`). ``` GET /api/mcp/projects/{projectId}/ads/advertisers GET /api/mcp/projects/{projectId}/ads/creatives GET /api/mcp/projects/{projectId}/ads/prompts GET /api/mcp/projects/{projectId}/ads/timeseries ``` ```javascript theme={null} const res = await fetch( "https://app.searchable.com/api/mcp/projects/PROJECT_ID/ads/advertisers?days=30", { headers: { Authorization: "Bearer sea_YOUR_KEY" } }, // requires the `read` scope ); const { advertisers, brand, totals, pagination } = await res.json(); // advertisers are ranked by ad volume; `brand` is your own ad share of voice // and rank among advertisers (null when you're not advertising). adCount / // appearances count ads we scraped in AI answers, not ad-platform impressions. ``` `/ads/advertisers` is offset-paginated (`{limit, offset, returnedCount, totalCount, hasMore, nextOffset}`); pass an advertiser's `advertiserKey` into `/ads/creatives` or `/ads/timeseries` to drill into one advertiser. `/ads/creatives` also accepts `promptId` and a free-text `search`; `/ads/prompts` accepts `sortBy` (`promptText|adUnits|coveragePct|engines|totalResponses`) + `sortDir`. All windows follow `days` (default 30, max 365). Ad data appears once tracked prompts surface sponsored ad units. `promptId` takes a prompt ID, not prompt text — an unrecognized ID matches nothing rather than erroring, so an empty result can mean an unresolved filter as well as no captured data. These endpoints take no topic or location filters; use the `get_ads` MCP tool for those. ## Brand profile & domain authority The knowledge-base brand profile plus AI-observed brand facts, and the domain's Moz authority history (also available via the `get_brand_profile` MCP tool, which takes `include: "domain_authority"` for the Moz block). ``` GET /api/mcp/projects/{projectId}/brand-profile GET /api/mcp/projects/{projectId}/domain-authority ``` ```javascript theme={null} const res = await fetch( "https://app.searchable.com/api/mcp/projects/PROJECT_ID/brand-profile", { headers: { Authorization: "Bearer sea_YOUR_KEY" } }, // requires the `read` scope ); const { profile, facts, factCount } = await res.json(); // profile is the user-curated knowledge base (null until onboarding creates // one): brand name, headline, category, positioning, description, topics, // business type, connected entities, competitor geography/context. // facts[] is the latest weekly batch of statements AI platforms actually make // about the brand — filter with ?platform= and ?verificationStatus= // (unverified | pass | fail). ``` `domain-authority` returns the latest Moz snapshot (`domainAuthority`, `pageAuthority`, `spamScore`, `linkingRootDomains`, `fetchedAt`) plus `history[]` over `days` (default 365, max 1095 — snapshots are roughly monthly). It reads the app-maintained cache only and never triggers a live Moz fetch: `latest` is the newest snapshot regardless of the window, and `latest: null` means the app hasn't fetched DA for this project yet. ## Prompt catalog The project's prompt configuration — what it monitors, what's paused, and what the AI has suggested but nobody has reviewed yet (also available as the `list_prompts` MCP tool). This is configuration data, not performance: for per-prompt visibility scores use `/visibility/prompts`. ``` GET /api/mcp/projects/{projectId}/prompts ``` ```javascript theme={null} const res = await fetch( "https://app.searchable.com/api/mcp/projects/PROJECT_ID/prompts?status=tracked", { headers: { Authorization: "Bearer sea_YOUR_KEY" } }, // requires the `read` scope ); const { summary, prompts, pagination } = await res.json(); // summary always reports all three counts: { tracked, untracked, suggested }. // Tracked/untracked prompts carry type, intent, branded flag, topics, // tracked locations, and keyword volume/difficulty. ``` `status` selects the slice: `tracked` (default — actively monitored), `untracked` (paused), `all` (both), or `suggested` — the pending review queue of AI-proposed prompts (from research runs and the agent) that nobody has accepted or rejected yet, each with the `reason` it was proposed and its `source`. Accepted suggestions graduate into the tracked catalog and leave the queue. `topicId` restricts any slice to one topic; `limit` (default 50, max 200) + `offset` paginate with the standard `pagination` shape. ## Prompt answers Raw, per-response AI-answer data for one prompt (Profound-parity) — platform, response date, response text, brand/competitor mentions, and the source URLs the engine consulted (`sources[]` — pages used for generation, not inline citations), one entry per AI response (also available as the `get_prompt_answers` MCP tool). ``` GET /api/mcp/projects/{projectId}/prompts/{promptId}/responses ``` ```javascript theme={null} const res = await fetch( "https://app.searchable.com/api/mcp/projects/PROJECT_ID/prompts/PROMPT_ID/responses?days=30&limit=10", { headers: { Authorization: "Bearer sea_YOUR_KEY" } }, // requires the `read` scope ); const { prompt, responses, pagination } = await res.json(); // responses[].text is hard-truncated at 2000 characters; responses[].truncated // signals the cut. citations only includes source-type citations (the same // filter /api/analytics/visibility/query-detail applies). ``` `limit` is clamped to 1–50 (default 10); `?limit=0` clamps to 1, it never silently falls back to the default. `pagination` follows the standard `{limit, offset, returnedCount, totalCount, hasMore, nextOffset}` shape (see [Pagination](/integrations/mcp#pagination)). Returns `404` if `promptId` doesn't exist or belongs to a different project. ## Generate a shareable report Generate and publish a report, and get back its public share URL. Also available as the `generate_report` MCP tool (requires the **write** scope and an explicit `confirm: true`); this REST endpoint is the direct path. ``` POST /api/mcp/projects/{projectId}/reports GET /api/mcp/projects/{projectId}/reports ``` ```javascript theme={null} const res = await fetch("https://app.searchable.com/api/mcp/projects/PROJECT_ID/reports", { method: "POST", headers: { Authorization: "Bearer sea_YOUR_KEY", "Content-Type": "application/json", }, body: JSON.stringify({ reportType: "combined", // "sentiment" | "visibility" | "combined" (default "sentiment") timeRange: "30d", // "7d" | "30d" | "90d" | "365d" (default "30d") status: "published", // "published" | "draft" (default "published") // optional filters: platforms, topicIds, locationIds (string arrays) // optional: title, unbrandedOnly, brandedOnly }), }); const { shareUrl, shareToken, reportType, success } = await res.json(); ``` `POST` requires the `write` scope and a plan that includes report sharing. `GET /reports?limit=20&offset=0` (requires only the `read` scope) lists previously generated reports for the project, newest first — `{ reports: [{id, reportType, title, status, shareUrl, createdAt}], pagination }`. It lists every currently-public report in the project (any project member's, not just reports the calling key's user created); drafts and unshared reports are excluded — a report saved with `status: "draft"` won't appear until published, and one that's later unshared drops off too. ## Period comparison `GET /visibility`, `GET /visibility/topics`, `GET /share-of-voice`, and `GET /sentiment` answer "vs last period" in one call — pass `compare=previous_period` or `compare=previous_year`: ```bash theme={null} curl -H "Authorization: Bearer $SEARCHABLE_API_KEY" \ "https://app.searchable.com/api/mcp/projects/PROJECT_ID/visibility?days=30&compare=previous_period" ``` Windows are whole UTC calendar days and never overlap: `previous_period` spans the same number of calendar days as the current window and ends the day **before** the current window's first day; `previous_year` is the current window's calendar days shifted back exactly 365 days. The `comparison.dateRange` in the response is exactly the range the previous-period query ran over. The response gains an additive `comparison` block — nothing else changes shape: ```json theme={null} { "summary": { "visibilityScore": 45.5, "...": "..." }, "comparison": { "mode": "previous_period", "dateRange": { "from": "2026-06-11T00:00:00.000Z", "to": "2026-07-11T23:59:59.999Z" }, "previous": { "visibilityScore": 40, "totalResponses": 180, "...": "..." }, "delta": { "visibilityScore": 5.5, "totalResponses": 20 } } } ``` `delta` is current minus previous for every metric computable on both sides — a metric that can't be compared is absent, never a fabricated `0`. On `/share-of-voice`, competitor rows additionally carry `previousSov` / `sovDelta` inline (matched by entity display name — the share-of-voice entity identity); on `/visibility/topics`, each topic row carries `comparison.previousMentionedPercentage` / `mentionedPercentageDelta`. On the MCP `get_visibility` tool, `compare` works with `group_by=summary` and `platform`; `prompt` and `location` return `invalid_argument` rather than silently ignoring it. ## Per-URL metrics rollup One page's three AI series in one call — AI-answer activity citing the URL, AI-referral sessions landing on it, and AI-crawler hits fetching it: ```bash theme={null} curl -H "Authorization: Bearer $SEARCHABLE_API_KEY" \ "https://app.searchable.com/api/mcp/projects/PROJECT_ID/pages/metrics?url=/pricing&days=90" ``` `url` is a full URL or a bare path (resolved against the project's domain); a query string is kept, so `/watch?v=abc` and `/watch?v=xyz` are distinct pages. The citation series reports two distinct numbers — `inlineCitations` (the AI answer linked the URL in its text) and `sourceUses` (a model consulted the URL as a source), with daily `sourceUses` buckets. The two traffic series are scoped to the verified project domain the URL's host resolves to and return `available: false` with a `reason`: `traffic_not_connected` when the [LLM Analytics integration](/setup/overview) isn't connected, or `external_url` for a host outside the project's verified domains (external pages get cited too, so the citation series still answers). A citation-lookup failure likewise degrades just that series (`citation_lookup_failed`) rather than reading as a fake zero. ## Query visibility, sources & sentiment For visibility scores, share of voice, sources, sentiment, shopping visibility, AI ads, raw AI answers, AI traffic, and GA4/GSC data, connect the **[MCP server](/integrations/mcp)** — it exposes read-only tools over the same data and handles auth for you. It's the fastest path for read-heavy automation and works directly inside Claude, Cursor, and other assistants. ## Send AI-bot traffic To report request events from your own app or CDN (so crawlers like GPTBot and ClaudeBot show up in your dashboard), use the **[REST Ingest API](/setup/rest-api)**. That endpoint uses a separate ingest key (`sk_live_…`) and a signed edge path — see its page for the full contract. ## Rate limiting Every API key is limited to **600 requests/minute** across the REST surface (`/api/mcp/*`, `/api/v1/*`, and the Looker Studio connector — MCP tool calls have their own separate concurrency limits, not this budget). Two exceptions: `/api/v1/chat` and `/api/v1/chat/stop` don't count against this budget and don't emit the rate-limit headers below (`/api/v1/chat` has its own chat-specific limiter). Every other response carries rate-limit headers, whether it succeeds or errors: ``` RateLimit: "default";r=598;t=42 RateLimit-Policy: "default";q=600;w=60 X-RateLimit-Limit: 600 X-RateLimit-Remaining: 598 X-RateLimit-Reset: 1755000042 ``` `RateLimit`/`RateLimit-Policy` follow the [IETF rate-limit header draft](https://www.ietf.org/archive/id/draft-ietf-httpapi-ratelimit-headers-08.html) (`r` = remaining, `t` = seconds until reset, `q` = quota, `w` = window in seconds). `X-RateLimit-*` is kept alongside for clients that read the older convention; `X-RateLimit-Reset` is an absolute Unix-epoch second. The limiter fails open: if its backing store is briefly unavailable, requests are **allowed** (never refused for infrastructure reasons) and the rate-limit headers are omitted from those responses — don't hard-require the headers in client code. Exceeding the limit returns `429` with a `Retry-After` header (seconds) and a `rate_limited` problem+json body — see the [error reference](/api/errors#rate-limited). ```javascript theme={null} const res = await fetch("https://app.searchable.com/api/mcp/projects", { headers: { Authorization: "Bearer sea_YOUR_KEY" }, }); if (res.status === 429) { const retryAfter = Number(res.headers.get("Retry-After") ?? "60"); // wait retryAfter seconds, then retry } ``` ## Idempotency The three mutating POST endpoints — `POST /reports`, `POST /audits`, and `POST /sitemap/refresh` — accept an `Idempotency-Key` header. Send the same key on a retry (e.g. after a timeout or a dropped connection) and the API replays the original response instead of repeating the side effect (generating a second report, starting a second audit run, or a second sitemap sync): ```javascript theme={null} const idempotencyKey = crypto.randomUUID(); const res = await fetch("https://app.searchable.com/api/mcp/projects/PROJECT_ID/reports", { method: "POST", headers: { Authorization: "Bearer sea_YOUR_KEY", "Content-Type": "application/json", "Idempotency-Key": idempotencyKey, }, body: JSON.stringify({ reportType: "sentiment" }), }); // A retry with the SAME idempotencyKey returns the same body and adds: // X-Idempotent-Replay: true ``` Notes: * Keys are scoped per API key and held for **24 hours**. * Only a **successful (2xx)** response is stored — a failed attempt (4xx/5xx) is never replayed, so retrying after a real failure with the same key simply runs the request again. * Two **concurrent** requests with the same key never both execute: the second gets `409` (`code: "idempotency_in_flight"`) with `Retry-After: 5` while the first is still running. Wait, then retry with the same key — you'll receive the first request's stored response once it completes (or a fresh run if it failed). See the [error reference](/api/errors#idempotency-in-flight). * A stored response body over **100KB** is not cached — the request still runs normally, and the response carries `X-Idempotent-Skipped: body-too-large` instead of `X-Idempotent-Replay`. * Keys are **not** fingerprinted to the request body: reusing a key with a *different* body returns the stored response from the first request. Use a fresh key for each distinct operation. * No `Idempotency-Key` header — the request behaves exactly as before; this is fully opt-in. ## Error handling Full reference with remediation for every error code: **[API Error Reference](/api/errors)**. | Status | Meaning | | ------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `400` | Bad request — check parameters / body (`code: "invalid_argument"` and related validation codes) | | `401` | Missing or malformed API key (`code: "unauthorized"`) | | `403` | Insufficient scope, plan gate, quota exceeded, or a paused/pitch project (`missing_scope`, `plan_upgrade_required`, `quota_exceeded`, `project_not_runnable`, `pitch_not_supported`) | | `404` | Project not found, or the key isn't allowed to reach it (`code: "not_found"`) | | `409` | Integration not connected — GSC/GA4 endpoints return `{ code: "gsc_not_connected" \| "ga4_not_connected", message, howToFix }` when the project has no linked Search Console site / GA4 property (connect in **Settings → Integrations**); AI Traffic endpoints return `{ code: "traffic_not_connected", message, howToFix }` when no crawler-log, CDN, or tracker source is connected (connect in **AI Traffic → Setup**). Retry after connecting | | `429` | Rate limit exceeded — see [Rate limiting](#rate-limiting) above (`code: "rate_limited"`, `Retry-After` header) | | `500` | Server error — retry with exponential backoff (`code: "internal_error"`) | | `504` | The query or report generation timed out — retryable (`code: "query_timeout"`) | Every error body is `application/problem+json`: alongside the original `error` string (unchanged, for existing integrations), it now also carries `type`, `title`, `code`, `message`, and `requestId`. See the [error reference](/api/errors) for the full body shape and every code. ## API key best practices Never commit API keys to version control — use environment variables Scope each key to the minimum it needs (`read` unless it must write) Bind a key to a single project when it only ever touches that project Use separate keys for dev and prod, and rotate them regularly Revoke compromised keys immediately in Settings → Integrations ## Need more? Higher rate limits, custom endpoints, or a dedicated integration? Contact **[support@searchable.com](mailto:support@searchable.com)**. ## Next steps Connect Claude, Cursor, and other assistants to your Searchable data. Send AI-bot traffic events from any stack. # Advanced Custom Prompts (Beta) Source: https://docs.searchable.com/advanced/custom-prompts Master advanced prompt techniques for maximum AI visibility ## Overview Advanced prompt customization allows you to create sophisticated tracking strategies using variables, templates, and automation. ## Features * **Prompt Variables**: Dynamic prompts that adapt to context * **Conditional Logic**: Different prompts based on user segments * **A/B Testing**: Test prompt variations for effectiveness * **Batch Operations**: Manage hundreds of prompts efficiently * **Performance Analytics**: Deep dive into prompt metrics ## Variable System Use variables in prompts: ```text theme={null} What are the best {category} for {audience} in {year}? ``` Variables auto-populate based on your settings. ## Templates & Patterns * Save successful prompts as templates * Apply patterns across multiple prompts * Industry-specific template libraries * Custom template creation ## Automation * Auto-generate prompts from keywords * Schedule prompt activations * Retire underperforming prompts automatically * Smart prompt suggestions ## Custom Capabilities * Multi-language prompt management * Team collaboration on prompts * Advanced attribution modeling * Custom reporting dashboards Learn more in [Working with Prompts](/using-searchable/working-with-prompts). # Teams & Collaboration (Beta) Source: https://docs.searchable.com/advanced/teams-collaboration Manage team members, permissions, and collaborative workflows ## Overview Searchable's team features enable collaborative SEO and AEO management with role-based access control and shared dashboards. ## Team Roles ### Administrator * Full access to all features * Can invite/remove team members * Manage billing and subscriptions * Configure integrations ### Editor * Edit content and settings * Run audits * Manage prompts * View analytics * Cannot manage team or billing ### Viewer * Read-only access * View dashboards and reports * Export data * Cannot make changes ## Managing Team Members Settings → Team → Invite Member * Enter email address * Select role * Send invitation * Receives email invitation * Creates account or signs in * Gains access based on role * Change roles anytime * Suspend access temporarily * Remove members * Track activity ## Agency & Custom Features Advanced security features (SSO, audit trails, custom roles) are included with Custom contracts. Agency customers can request specific capabilities through their success manager. ### SSO/SAML * Single sign-on integration * Azure AD, Okta, Google Workspace * Automatic user provisioning * Centralized access management ### Advanced Permissions * Custom role creation * Granular feature permissions * Project-level access control * IP whitelisting ### Audit Trails * Complete activity logs * Compliance reporting * Change history * Security monitoring ## Best Practices Assign clear responsibilities per team member Use comments for collaborative decision-making Regular team check-ins on progress Shared optimization priorities ## Next Steps Start collaborating See how the AI assistant supports teamwork # Get AI-ad frequency timeseries Source: https://docs.searchable.com/api-reference/ads/get-ai-ad-frequency-timeseries /api-reference/openapi.json get /api/mcp/projects/{projectId}/ads/timeseries Per-advertiser daily ad-frequency trend — one series per top advertiser (brand force-included), each with a { date, adCount } array, plus the filtered-window total ad appearances. `days` defaults to 30, max 365. # List ad-surfacing prompts Source: https://docs.searchable.com/api-reference/ads/list-ad-surfacing-prompts /api-reference/openapi.json get /api/mcp/projects/{projectId}/ads/prompts Which tracked prompts surface the most sponsored ads — per-prompt ad-unit count, ad coverage percent (share of the prompt's responses that carried an ad), response count, and the AI engines that surfaced ads. Server-sorted. `days` defaults to 30, max 365. # List AI-ad advertisers Source: https://docs.searchable.com/api-reference/ads/list-ai-ad-advertisers /api-reference/openapi.json get /api/mcp/projects/{projectId}/ads/advertisers Who is running sponsored ads in AI answers, ranked by scraped ad-appearance volume, plus the brand's own ad share of voice + rank (or null when the brand isn't advertising) and project-wide totals. Offset-paginated. adCount is ads we scraped in AI answers, not ad-platform impressions. `days` defaults to 30, max 365. # List AI-ad creatives Source: https://docs.searchable.com/api-reference/ads/list-ai-ad-creatives /api-reference/openapi.json get /api/mcp/projects/{projectId}/ads/creatives Individual ad creatives (deduped sponsored ad variations) surfaced in AI answers — advertiser, headline, body, image, landing URL, how many scraped responses each appeared in, the prompts + AI models it ran on, and first/last seen. A capped top-N by appearance count (no offset paging). `days` defaults to 30, max 365. # Agent API Source: https://docs.searchable.com/api-reference/agent-api Programmatic access to the Searchable agent Searchable's conversational agent — the same one behind the in-app chat — is available programmatically for approved customers on a case-by-case basis. This isn't part of the self-serve REST surface documented in this reference and isn't listed in the OpenAPI spec. If you have a use case for driving the agent directly from your own application or workflow, contact **[support@searchable.com](mailto:support@searchable.com)** with: * Your workspace and the project(s) involved * What you're trying to build * Expected request volume We'll follow up to scope access and any usage terms. The self-serve REST endpoints — visibility, sources, sentiment, traffic, audits, reports, and more — are documented in the rest of this reference and available today with a standard `sea_` API key. # List raw AI responses for a prompt Source: https://docs.searchable.com/api-reference/answers/list-raw-ai-responses-for-a-prompt /api-reference/openapi.json get /api/mcp/projects/{projectId}/prompts/{promptId}/responses Raw, per-response AI-answer data for one prompt (Profound-parity) — platform, response date, response text, brand/competitor mentions, and citations, one entry per AI response. text is hard-truncated at 2000 characters; truncated flags the cut. Paginated: limit (default 10, max 50) + offset. Returns 404 if promptId doesn't exist or belongs to a different project. `days` defaults to 30, max 365. # Get an article Source: https://docs.searchable.com/api-reference/articles/get-an-article /api-reference/openapi.json get /api/mcp/articles/{articleId} Full article content + SEO metadata. Checks content_pieces (v2) first, falls back to legacy articles. # List articles Source: https://docs.searchable.com/api-reference/articles/list-articles /api-reference/openapi.json get /api/mcp/projects/{projectId}/articles List content for a project — merges content_pieces (v2) and legacy articles. `status` defaults to `all` (excludes archived). `limit` defaults to 50, max 100. # Get page audits Source: https://docs.searchable.com/api-reference/audits-&-issues/get-page-audits /api-reference/openapi.json get /api/mcp/projects/{projectId}/audits Latest page audit per page (SEO + AEO scores) plus summary.lastCompletedAt. Pass includeIssues=true to nest each page's open issues. # Get page audits (v1 alias) Source: https://docs.searchable.com/api-reference/audits-&-issues/get-page-audits-v1-alias /api-reference/openapi.json get /api/v1/projects/{projectId}/audits Identical contract to `GET /api/mcp/projects/{projectId}/audits` — latest site audit per page + project-level lastCompletedAt. Pass ?includeIssues=true to nest each page's open issues. Requires the `read` scope. # List monitored pages Source: https://docs.searchable.com/api-reference/audits-&-issues/list-monitored-pages /api-reference/openapi.json get /api/mcp/projects/{projectId}/pages Monitored pages with issue counts. # List site issues Source: https://docs.searchable.com/api-reference/audits-&-issues/list-site-issues /api-reference/openapi.json get /api/mcp/projects/{projectId}/issues Site issues grouped by severity. # Refresh the project's sitemap Source: https://docs.searchable.com/api-reference/audits-&-issues/refresh-the-projects-sitemap /api-reference/openapi.json post /api/mcp/projects/{projectId}/sitemap/refresh Re-sync the project's configured sitemap — re-discovers the sitemap and reconciles monitored pages (add/update/remove) + HTTP statuses in the background; returns the coordinator job id. Read the resulting pages on GET /pages. Action endpoint — requires the write scope, enforces runnable-state, and blocks pitch projects. Supports `Idempotency-Key` replay. # Trigger a site audit Source: https://docs.searchable.com/api-reference/audits-&-issues/trigger-a-site-audit /api-reference/openapi.json post /api/mcp/projects/{projectId}/audits Trigger a site audit (technical + AEO) for the project's pages and return the orchestrator job id; results land on GET /audits. Audits every tracked page by default, or the optional pageIds. Always audits the project's own verified domain. Action endpoint — enforces runnable-state, blocks pitch projects, and consumes the monthly audit quota. Requires the `write` scope. Supports `Idempotency-Key` replay. # Get brand profile Source: https://docs.searchable.com/api-reference/brand/get-brand-profile /api-reference/openapi.json get /api/mcp/projects/{projectId}/brand-profile The project's brand profile: the knowledge-base profile (positioning, category, topics, connected entities) plus the AI-observed brand facts, optionally filtered by verification status and platform. # Get domain authority Source: https://docs.searchable.com/api-reference/brand/get-domain-authority /api-reference/openapi.json get /api/mcp/projects/{projectId}/domain-authority The project domain's authority: the latest snapshot plus its history over the requested window. # Get a competitor Source: https://docs.searchable.com/api-reference/competitors/get-a-competitor /api-reference/openapi.json get /api/mcp/projects/{projectId}/competitors/{competitorId} Full detail for one tracked competitor — the list-view fields plus a per-day history[] and up to 10 recent topPrompts[] it was mentioned in. Two distinct citation metrics: citations (top level) counts every citation on responses that mention the competitor, whatever domain it points at; history[].domainCitations counts citations whose URL is on the competitor's own domain. Returns 404 if competitorId doesn't exist or belongs to a different project. `days` defaults to 30, max 365. # List competitors Source: https://docs.searchable.com/api-reference/competitors/list-competitors /api-reference/openapi.json get /api/mcp/projects/{projectId}/competitors The project's real/tracked competitors (rows in the competitors table) with share of voice, sentiment score, and all-time mention counts. Paginated. sov/sentimentScore are windowed by days and honor the platform/topicId/unbranded/branded/country/locationId filters; mentions is always all-time and ignores days + all filters (mirrors the in-app Competitors list); visibilityScore and citations are null in the list view — see the detail endpoint for those. `days` defaults to 30, max 365. `limit` defaults to 20, max 100. # Get GA4 AI-referral visitors Source: https://docs.searchable.com/api-reference/ga4/get-ga4-ai-referral-visitors /api-reference/openapi.json get /api/mcp/projects/{projectId}/ga4/ai-referrals Per-LLM-host AI Source Visitors from GA4 (ChatGPT, Copilot, Gemini, Perplexity, DeepSeek, …): weekly visitor series + week-over-week delta + total. Use this for AI-referral attribution. `weeks` defaults to 12, max 52. Returns 409 ga4_not_connected if no GA4 property is linked. # Get GA4 top pages Source: https://docs.searchable.com/api-reference/ga4/get-ga4-top-pages /api-reference/openapi.json get /api/mcp/projects/{projectId}/ga4/top-pages GA4 top landing pages by sessions. `weeks` defaults to 12, max 52; `limit` defaults to 20, max 100. Returns 409 ga4_not_connected if no GA4 property is linked. # Get GA4 traffic sources Source: https://docs.searchable.com/api-reference/ga4/get-ga4-traffic-sources /api-reference/openapi.json get /api/mcp/projects/{projectId}/ga4/traffic-sources GA4 traffic sources by channel group + source. `weeks` defaults to 12, max 52; `limit` defaults to 20, max 100. Returns 409 ga4_not_connected if no GA4 property is linked. # Get GA4 traffic trend Source: https://docs.searchable.com/api-reference/ga4/get-ga4-traffic-trend /api-reference/openapi.json get /api/mcp/projects/{projectId}/ga4/traffic-trend GA4 daily traffic trend (users, sessions, pageviews) with totals. `weeks` defaults to 12, max 52. Returns 409 ga4_not_connected if no GA4 property is linked. # Get GSC overview Source: https://docs.searchable.com/api-reference/gsc/get-gsc-overview /api-reference/openapi.json get /api/mcp/projects/{projectId}/gsc/overview Live Google Search Console overview for the project's linked site — total clicks, impressions, CTR, average position for the window, plus an optional previous-period comparison with per-metric deltas. Data lags ~3 days (Google withholds the most recent days). Returns 409 gsc_not_connected if no site is linked. # Get GSC performance by country Source: https://docs.searchable.com/api-reference/gsc/get-gsc-performance-by-country /api-reference/openapi.json get /api/mcp/projects/{projectId}/gsc/countries Live GSC performance grouped by country (clicks, impressions, CTR, average position). `limit` defaults to 100, max 250. Returns 409 gsc_not_connected if no site is linked. # Get GSC performance by device Source: https://docs.searchable.com/api-reference/gsc/get-gsc-performance-by-device /api-reference/openapi.json get /api/mcp/projects/{projectId}/gsc/devices Live GSC performance grouped by device (desktop, mobile, tablet). Returns 409 gsc_not_connected if no site is linked. # Get GSC performance trend Source: https://docs.searchable.com/api-reference/gsc/get-gsc-performance-trend /api-reference/openapi.json get /api/mcp/projects/{projectId}/gsc/performance-trend Live GSC daily performance trend (clicks, impressions, CTR, average position per day) with window totals. Returns 409 gsc_not_connected if no site is linked. # Get GSC query distribution by position Source: https://docs.searchable.com/api-reference/gsc/get-gsc-query-distribution-by-position /api-reference/openapi.json get /api/mcp/projects/{projectId}/gsc/position-buckets Live GSC query distribution by ranking bucket (1-3, 4-10, 11-20, 20+) with clicks + impressions per bucket. Returns 409 gsc_not_connected if no site is linked. # Get GSC quick-win queries Source: https://docs.searchable.com/api-reference/gsc/get-gsc-quick-win-queries /api-reference/openapi.json get /api/mcp/projects/{projectId}/gsc/opportunities Live GSC quick-win queries — ranking positions 4-15 with high impressions and low CTR, highest-impressions first. Title/snippet optimization candidates. `limit` defaults to 20, max 100. Returns 409 gsc_not_connected if no site is linked. # Get GSC top pages Source: https://docs.searchable.com/api-reference/gsc/get-gsc-top-pages /api-reference/openapi.json get /api/mcp/projects/{projectId}/gsc/top-pages Live GSC top pages (page URL, clicks, impressions, CTR, average position), highest-clicks first. `limit` defaults to 25, max 250. Returns 409 gsc_not_connected if no site is linked. # Get GSC top queries Source: https://docs.searchable.com/api-reference/gsc/get-gsc-top-queries /api-reference/openapi.json get /api/mcp/projects/{projectId}/gsc/top-queries Live GSC top search queries (query, clicks, impressions, CTR, average position), highest-clicks first. `limit` defaults to 25, max 250. Returns 409 gsc_not_connected if no site is linked. # Getting Started Source: https://docs.searchable.com/api-reference/introduction Authentication, rate limits, idempotency, pagination, and errors for the Searchable REST API ## Overview The Searchable REST API (`/api/mcp/*` and `/api/v1/projects/{projectId}/audits`) exposes the same AI-visibility, sources, sentiment, traffic, and content data available in the Searchable dashboard and [MCP server](/integrations/mcp), over plain HTTP with a bearer API key. It's a **read-mostly** surface — every endpoint below is a GET except the three mutating POSTs (`/reports`, `/audits`, `/sitemap/refresh`). Every endpoint in the left sidebar is interactive — send a real request from the browser using your own API key. Narrative walkthroughs + curl/JavaScript examples per data area. Every error `code` this API returns, and how to fix it. ## Base URL ``` https://app.searchable.com ``` Every path in this reference (e.g. `/api/mcp/projects`) is relative to that base URL. ## Authentication Create an API key in **Settings → Workspace → Integrations** in your Searchable dashboard. Keys start with `sea_` and are shown only once — store it securely. API access requires a paid Searchable plan; keys can't be created on the Free plan. Send it as a bearer token on every request: ``` Authorization: Bearer sea_your_key_here ``` This REST surface authenticates with a static `sea_` API key only. The MCP server additionally supports an OAuth 2.1 login flow for interactive AI clients — see [MCP integration](/integrations/mcp) if you're connecting Claude, Cursor, or another MCP client instead of calling REST directly. ### Scopes Each key carries one or more scopes. Scopes are independent grants, not tiers — `write` does **not** implicitly include `read`: | Scope | Grants | | ------- | ------------------------------------------------------------------------------------- | | `read` | GET endpoints — visibility, sources, sentiment, traffic, content, audits, … | | `write` | The three action endpoints (`POST /reports`, `POST /audits`, `POST /sitemap/refresh`) | | `admin` | Every `read` and `write` endpoint | A key that only calls GET endpoints needs `read`. A key that also needs the three action endpoints needs `write` requested alongside `read` (or `admin`, which covers both). A key missing the required scope gets `403 { code: "missing_scope" }` — see [missing\_scope](/api/errors#missing-scope). ### Project binding A key can optionally be **bound to a single project** at creation time. A project-bound key can only ever act on that one project — even a request for a project its owning user can otherwise access in the dashboard returns `404 { code: "not_found" }`, indistinguishable from a project that doesn't exist. Leave a key unbound to use it across every project you can access. Bind a key when handing it to a single-tenant integration; leave it unbound for an integration that manages multiple projects. ## Pagination Two conventions appear across this API, depending on the endpoint: **Offset pagination** (`limit` + `offset`) — the standard shape for most list endpoints: ```json theme={null} { "limit": 20, "offset": 0, "returnedCount": 20, "totalCount": 143, "hasMore": true, "nextOffset": 20 } ``` Pass `nextOffset` as the next request's `offset` until `hasMore` is `false`. `totalCount` is occasionally `null` on endpoints where an exact cross-partition total isn't cheap to compute (e.g. `GET /traffic/bots`) — `hasMore`/`nextOffset` still work correctly in that case. Every offset-paginated endpoint — including `GET /issues`, `GET /opportunities`, and `GET /competitors` — now returns this full block (`hasMore` + `nextOffset` included), so one pagination loop works across the whole API. `GET /competitors` additionally keeps its legacy `total` alias inside `pagination` and its top-level `totalCount`, for backward compatibility. **Cursor pagination** (`cursor` + `nextCursor`) — used by the Sources domain's URL-listing endpoints (`GET /sources/domains/{domain}/urls`, `GET /sources/urls`), which read from a keyset-ordered store: ```json theme={null} { "urls": [/* … */], "totalUrls": 812, "nextCursor": "eyJvZmZzZXQiOjIwfQ", "hasMore": true } ``` Pass the previous response's `nextCursor` as the next request's `cursor`. Omit `cursor` for the first page. Treat the cursor as opaque — don't parse or construct it. `limit` defaults vary by endpoint (typically 20-50). The big list endpoints — cited domains, cited URLs, prompts, opportunities — accept up to **1,000 rows per page** (issues up to 5,000); values above an endpoint's cap are clamped, never rejected. See each operation's description in the sidebar. ## CSV export The five biggest list endpoints — `GET /sources/domains`, `GET /sources/urls`, `GET /prompts`, `GET /issues`, `GET /opportunities` — accept `?format=csv` and return the operation's main row set as a downloadable **UTF-8 CSV** (RFC 4180, BOM-prefixed so Excel handles non-ASCII, and spreadsheet-formula-hardened) instead of the JSON envelope: ```bash theme={null} curl -H "Authorization: Bearer $SEARCHABLE_API_KEY" \ "https://app.searchable.com/api/mcp/projects/PROJECT_ID/sources/urls?limit=1000&format=csv" \ -o cited-urls.csv ``` Pagination parameters apply unchanged — export beyond one page by walking `offset`. Nested JSON fields serialize as minified JSON inside their cell. ## Rate limiting Every API key is limited to **600 requests/minute** across this REST surface (`/api/mcp/*`, `/api/v1/*`, and the Looker Studio connector — MCP *tool calls* have their own separate concurrency limits, not this budget). Every response carries rate-limit headers, whether it succeeds or errors: ``` RateLimit: "default";r=598;t=42 RateLimit-Policy: "default";q=600;w=60 X-RateLimit-Limit: 600 X-RateLimit-Remaining: 598 X-RateLimit-Reset: 1755000042 ``` `RateLimit`/`RateLimit-Policy` follow the [IETF rate-limit header draft](https://www.ietf.org/archive/id/draft-ietf-httpapi-ratelimit-headers-08.html) (`r` = remaining, `t` = seconds until reset, `q` = quota, `w` = window in seconds). `X-RateLimit-*` is kept alongside for clients that read the older convention. The limiter fails open: if its backing store is briefly unavailable, requests are **allowed** and the rate-limit headers are simply omitted from that response — don't hard-require the headers in client code. Exceeding the limit returns `429` with a `Retry-After` header (seconds) and a `rate_limited` problem+json body. ## Idempotency The three mutating POST endpoints — `POST /reports`, `POST /audits`, and `POST /sitemap/refresh` — accept an `Idempotency-Key` header. Send the same key on a retry (after a timeout or a dropped connection) and the API replays the original response instead of repeating the side effect: ```javascript theme={null} const idempotencyKey = crypto.randomUUID(); const res = await fetch("https://app.searchable.com/api/mcp/projects/PROJECT_ID/reports", { method: "POST", headers: { Authorization: "Bearer sea_YOUR_KEY", "Content-Type": "application/json", "Idempotency-Key": idempotencyKey, }, body: JSON.stringify({ reportType: "sentiment" }), }); // A retry with the SAME idempotencyKey returns the same body and adds: // X-Idempotent-Replay: true ``` Notes: * Keys are scoped per API key and held for **24 hours**. * Only a **successful (2xx)** response is stored — a failed attempt (4xx/5xx) is never replayed; retrying after a real failure with the same key simply runs the request again. * Two **concurrent** requests with the same key never both execute: the second gets `409 { code: "idempotency_in_flight" }` with `Retry-After: 5` while the first is still running. * A stored response body over 100KB isn't cached — the request still runs normally, and the response carries `X-Idempotent-Skipped: body-too-large` instead of `X-Idempotent-Replay`. * No `Idempotency-Key` header — the request behaves exactly as before. Fully opt-in. ## Errors Every non-2xx response is [`application/problem+json`](https://www.rfc-editor.org/rfc/rfc9457) — a machine-readable envelope that additively extends the API's original `{ error: "..." }` shape, so existing integrations that only read `error` keep working unmodified: ```json theme={null} { "type": "https://docs.searchable.com/api/errors#not_found", "title": "Not Found", "status": 404, "code": "not_found", "error": "Project not found or access denied", "message": "Project not found or access denied", "requestId": "b3f1c2a0-4e9d-4a11-9c3a-8e2f6d1a7c55" } ``` `code` is the field to branch on — it's stable across releases. Full catalog, per-code remediation, and additive fields (`requiresUpgrade`, `retryable`, `current`/`limit`, …): **[API Error Reference](/api/errors)**. Beyond the statuses listed per operation, any endpoint may also return a generic `500` or `502` problem+json with `code: "internal_error"` on an unexpected internal failure (the `502` variant carries `retryable: true`) — treat both as transient and retry with exponential backoff. Every response — success or error — also carries `X-Request-Id`. Include it when contacting **[support@searchable.com](mailto:support@searchable.com)** about a specific request. ## Typed clients There's no official SDK — the OpenAPI spec **is** the contract. Call the API directly with `fetch`/`curl`/your HTTP client of choice, or generate TypeScript types straight from the spec with the MIT-licensed [`openapi-typescript`](https://openapi-ts.dev): ```bash theme={null} npx openapi-typescript https://docs.searchable.com/api-reference/openapi.json -o searchable-api.d.ts ``` That produces a `paths` / `components` type tree covering every endpoint and schema on this page — pair it with a typed `fetch` wrapper (e.g. [`openapi-fetch`](https://openapi-ts.dev/openapi-fetch/)) for end-to-end type safety with no generated SDK to maintain. An official SDK isn't planned unless customer demand shows up. ## Next steps Programmatic access to the Searchable agent, for approved customers. What's new on this API, and the deprecation policy. # List opportunities Source: https://docs.searchable.com/api-reference/opportunities/list-opportunities /api-reference/openapi.json get /api/mcp/projects/{projectId}/opportunities Actionable opportunities Searchable surfaced for the project — prioritized fix/write/audit suggestions derived from visibility, sentiment, sources, traffic, prompts, site health, and articles. Read-only. Defaults to active opportunities (pass status or includeResolved=true to widen, source/impact to narrow); returns them in the product's priority order plus global stats. Regular-project feature — pitch projects are rejected (403 pitch_not_supported). # Get a project Source: https://docs.searchable.com/api-reference/projects/get-a-project /api-reference/openapi.json get /api/mcp/projects/{projectId} Get a single project by id. # List projects Source: https://docs.searchable.com/api-reference/projects/list-projects /api-reference/openapi.json get /api/mcp/projects List all projects the API key can reach — every workspace-accessible project (owner, member, or viewer fallback access), or just the key's bound project if it's project-scoped. # Get prompt catalog Source: https://docs.searchable.com/api-reference/prompts/get-prompt-catalog /api-reference/openapi.json get /api/mcp/projects/{projectId}/prompts The project's prompt catalog: tracked (default), untracked, AI-suggested, or all prompts, with their configuration and a summary count of each status. Paginated. # Get query fanout Source: https://docs.searchable.com/api-reference/query-fanout/get-query-fanout /api-reference/openapi.json get /api/mcp/projects/{projectId}/query-fanout Query fanout — the sub-queries AI models generate when answering tracked prompts. Returns the most frequent fanout queries, per-prompt fanout counts, and a per-model breakdown. Paginated: limit/offset page the per-prompt list; topQueriesLimit bounds the top-N queries. Pass unbranded=true or branded=true to filter by prompt brand state. `days` defaults to 30, max 180. `limit` defaults to 50, max 50. # Get query fanout for a prompt Source: https://docs.searchable.com/api-reference/query-fanout/get-query-fanout-for-a-prompt /api-reference/openapi.json get /api/mcp/projects/{projectId}/query-fanout/{promptId} Detailed query fanout for a single prompt — every sub-query AI models generated for it, deduped with per-query frequency, the models that issued it, and the query type (initial_search | model_query). `days` defaults to 30, max 180. # Generate a shareable report Source: https://docs.searchable.com/api-reference/reports/generate-a-shareable-report /api-reference/openapi.json post /api/mcp/projects/{projectId}/reports Generate and publish a shareable report; returns { shareToken, shareUrl }. Set whiteLabel=true (requires a white-label-entitled plan) to apply workspace branding. Requires the `write` scope. Supports `Idempotency-Key` replay. # List shared reports Source: https://docs.searchable.com/api-reference/reports/list-shared-reports /api-reference/openapi.json get /api/mcp/projects/{projectId}/reports List previously shared reports for the project, newest first — { reports: [{id, reportType, title, status, shareUrl, createdAt}], pagination }. Only currently-live, published reports are listed (a report saved as a draft, or later unshared, won't appear). Paginated with limit/offset. `limit` defaults to 20, max 100. # Get competitor sentiment comparison Source: https://docs.searchable.com/api-reference/sentiment/get-competitor-sentiment-comparison /api-reference/openapi.json get /api/mcp/projects/{projectId}/sentiment/competitors Head-to-head sentiment comparison of the brand vs competitors — sentiment score and positive/neutral/negative share per entity. Pass unbranded=true or branded=true to filter by prompt brand state. `days` defaults to 30, max 365. `limit` defaults to 10, max 50. # Get sentiment history Source: https://docs.searchable.com/api-reference/sentiment/get-sentiment-history /api-reference/openapi.json get /api/mcp/projects/{projectId}/sentiment/history Brand sentiment trend over time — per-day sentiment score and positive/neutral/negative counts, with an improving/declining/stable trend. Pass unbranded=true or branded=true to filter by prompt brand state. `days` defaults to 90, max 365. # Get sentiment summary Source: https://docs.searchable.com/api-reference/sentiment/get-sentiment-summary /api-reference/openapi.json get /api/mcp/projects/{projectId}/sentiment Brand sentiment summary + per-platform distribution (positive/neutral/negative share, sentiment score). Pass unbranded=true or branded=true to filter by prompt brand state. `days` defaults to 30, max 365. # Get share of voice Source: https://docs.searchable.com/api-reference/share-of-voice/get-share-of-voice /api-reference/openapi.json get /api/mcp/projects/{projectId}/share-of-voice Brand vs competitor share of voice — mention-share percentage, rank among all tracked entities, and day-over-day (today vs yesterday) point change per entity. mentions/citations are always null here (not computed by the backing service, and not shown by the in-app view either) — use /competitors for those. Pass unbranded=true or branded=true to restrict by prompt brand state. `days` defaults to 30, max 365. # Get share of voice history Source: https://docs.searchable.com/api-reference/share-of-voice/get-share-of-voice-history /api-reference/openapi.json get /api/mcp/projects/{projectId}/share-of-voice/history Daily share-of-voice time series for the brand plus its top competitors (competitor set discovered from the same ranking /share-of-voice uses). `days` defaults to 30, max 365. # Get shopping activation timeseries Source: https://docs.searchable.com/api-reference/shopping/get-shopping-activation-timeseries /api-reference/openapi.json get /api/mcp/projects/{projectId}/shopping/timeseries Daily shopping-activation trend — activation rate, response/product counts, and brand visibility per day. `days` defaults to 30, max 365. # Get shopping product detail Source: https://docs.searchable.com/api-reference/shopping/get-shopping-product-detail /api-reference/openapi.json get /api/mcp/projects/{projectId}/shopping/products/{productId} Full detail for one product — occurrences, vendor/pricing rows, a real per-platform breakdown, and up to 50 recent responses that surfaced it. Requires a plan with Shopping Analytics (Scale or higher). Returns 404 if not found in the window. `days` defaults to 30, max 365. # Get shopping visibility summary Source: https://docs.searchable.com/api-reference/shopping/get-shopping-visibility-summary /api-reference/openapi.json get /api/mcp/projects/{projectId}/shopping AI shopping/product visibility (Peec-parity) — top products surfaced in AI shopping/product-carousel responses, ranked by mention volume, plus an activation-rate summary. Returns available:false (200, not an error) when the project has no shopping data yet. Returns 403 requiresUpgrade:true if the workspace's plan doesn't include Shopping Analytics (Scale+) and there is data to fetch. `days` defaults to 30, max 365. # Get per-URL metrics rollup Source: https://docs.searchable.com/api-reference/site-health/get-per-url-metrics-rollup /api-reference/openapi.json get /api/mcp/projects/{projectId}/pages/metrics One page's three AI series joined in a single call, each as daily buckets: AI-answer citations of the URL, AI-referral sessions landing on it (by platform), and AI-crawler hits fetching it (by bot). `url` is a full URL or a bare path (resolved against the project's domain). The two traffic series degrade to `available: false` when the LLM Analytics integration isn't connected; citations always answer. Default window 90 days (max 365). # Get a cited domain's detail Source: https://docs.searchable.com/api-reference/sources/get-a-cited-domains-detail /api-reference/openapi.json get /api/mcp/projects/{projectId}/sources/domains/{domain} Full detail for a single cited source domain — citation share, trend, top prompts, topics, platforms, and content-type breakdown. # Get a cited page's cached content Source: https://docs.searchable.com/api-reference/sources/get-a-cited-pages-cached-content /api-reference/openapi.json get /api/mcp/projects/{projectId}/sources/urls/{url}/content Cached scraped markdown and entity mentions (brand/competitor) for a cited page. `{url}` must be percent-encoded. Returns 404 if the URL has not been cited in the project's data window. # Get a cited URL's detail Source: https://docs.searchable.com/api-reference/sources/get-a-cited-urls-detail /api-reference/openapi.json get /api/mcp/projects/{projectId}/sources/urls/{url} Citation analytics for a single cited URL — total citations, prompts, mentions, and models that cite it. `{url}` must be percent-encoded. Pass unbranded=true to restrict to non-branded prompts. Returns 404 if the URL has not been cited in the project's data window. `days` defaults to 30. # Get cited article-type breakdown Source: https://docs.searchable.com/api-reference/sources/get-cited-article-type-breakdown /api-reference/openapi.json get /api/mcp/projects/{projectId}/sources/article-types Article/content-type breakdown by URL count and citation volume. `days` defaults to 30. # Get cited content-type distribution Source: https://docs.searchable.com/api-reference/sources/get-cited-content-type-distribution /api-reference/openapi.json get /api/mcp/projects/{projectId}/sources/content-types Content-type distribution of cited sources (Blog, Product page, How-to, etc.) with citation rates and per-competitor breakdowns. `days` defaults to 30. # Get cited-source trend Source: https://docs.searchable.com/api-reference/sources/get-cited-source-trend /api-reference/openapi.json get /api/mcp/projects/{projectId}/sources/trend Citation trend over time for source domains. group='brand' → brand's own cited sources; 'competitors' → competitor cited sources; 'top-domains' (default) → top cited domains overall. Pass unbranded=true to restrict to non-branded prompts. `days` defaults to 30. # Get cited source-type summary Source: https://docs.searchable.com/api-reference/sources/get-cited-source-type-summary /api-reference/openapi.json get /api/mcp/projects/{projectId}/sources/source-types Source-type summary (editorial, social, forum, review, institutional, etc.) showing citation counts and share per type. `days` defaults to 30. # List a domain's cited URLs Source: https://docs.searchable.com/api-reference/sources/list-a-domains-cited-urls /api-reference/openapi.json get /api/mcp/projects/{projectId}/sources/domains/{domain}/urls Cited URLs for a specific domain, with titles and content types. Cursor-paginated. `days` defaults to 30. # List AI responses that cited a domain Source: https://docs.searchable.com/api-reference/sources/list-ai-responses-that-cited-a-domain /api-reference/openapi.json get /api/mcp/projects/{projectId}/sources/domains/{domain}/responses AI responses that cited a specific domain, with the originating prompt, platform, and cited URL. Optionally filter to a specific URL. `days` defaults to 30. # List all cited URLs Source: https://docs.searchable.com/api-reference/sources/list-all-cited-urls /api-reference/openapi.json get /api/mcp/projects/{projectId}/sources/urls All cited URLs across a project, with domain, title, content type, and citation counts. Paginated by `offset` (or the legacy `cursor`). `limit` defaults to 20, max 1000 (over-cap values clamp). `days` defaults to 30. # List cited source domains Source: https://docs.searchable.com/api-reference/sources/list-cited-source-domains /api-reference/openapi.json get /api/mcp/projects/{projectId}/sources/domains Top cited source domains from AI answers — rank, citation counts, usage %, models, and top content types. Paginated and sortable. `days` defaults to 30. `limit` defaults to 20, max 1000 (over-cap values clamp). # Get prompt rankings within a topic Source: https://docs.searchable.com/api-reference/topics/get-prompt-rankings-within-a-topic /api-reference/openapi.json get /api/mcp/projects/{projectId}/topics/prompt-rankings The prompt-level drill-down into one topic: for every prompt assigned to it, the brand's average rank, its visibility, and the competitors ranking above it. Answers which specific questions a weak topic is losing on. `topicId` is required — rankings are scoped to a single topic. # Get topic by platform position heatmap Source: https://docs.searchable.com/api-reference/topics/get-topic-by-platform-position-heatmap /api-reference/openapi.json get /api/mcp/projects/{projectId}/topics/heatmap Average brand mention position per topic x AI platform — where the brand is strong on one engine and absent on another. There is deliberately no platform filter: the platform axis is the report. # Get AI-referral session timeseries Source: https://docs.searchable.com/api-reference/traffic/get-ai-referral-session-timeseries /api-reference/openapi.json get /api/mcp/projects/{projectId}/traffic/referrals First-party AI-referral session timeseries (from the Searchable tracker) — one point per day with a per-platform session breakdown, plus window totals. Returns 409 traffic_not_connected if no source is connected. `days` defaults to 30, max 365. # Get AI traffic overview Source: https://docs.searchable.com/api-reference/traffic/get-ai-traffic-overview /api-reference/openapi.json get /api/mcp/projects/{projectId}/traffic/overview First-party AI-traffic overview (crawler visits + AI-referral sessions), both broken down by platform, plus the top crawled pages. Returns 409 traffic_not_connected if no tracker/CDN/log source is connected for the project. `days` defaults to 30, max 365. # Get crawl-to-visit correlation Source: https://docs.searchable.com/api-reference/traffic/get-crawl-to-visit-correlation /api-reference/openapi.json get /api/mcp/projects/{projectId}/traffic/correlation Per page: how often AI crawlers fetched it versus the AI-referred human sessions that followed. Rows are ranked by AI-referral sessions, so a truncated response keeps the pages that actually converted. `limit` defaults to 50, max 200. # Get human traffic from AI assistants Source: https://docs.searchable.com/api-reference/traffic/get-human-traffic-from-ai-assistants /api-reference/openapi.json get /api/mcp/projects/{projectId}/traffic/human Human sessions that arrived FROM an AI assistant — total sessions and visitors for the window, the AI-referred share of them, and a per-platform split. The conversion half of the funnel that the crawler reports open. Returns 409 traffic_not_connected if no tracker/CDN/log source is connected. # Get raw request logs Source: https://docs.searchable.com/api-reference/traffic/get-raw-request-logs /api-reference/openapi.json get /api/mcp/projects/{projectId}/traffic/logs The raw request feed with the in-app Logs tab's filters (path, status code, bots-only, host, sitemap-only). Cursor-paginated: pass the previous response's `nextCursor.timestamp` and `nextCursor.event_id` back as `cursorTimestamp` and `cursorEventId`. `limit` defaults to 25, max 100. `ip_address` and `user_agent` are deliberately not returned — the IP is personal data with no analytical value once `country` is present, and the user-agent is superseded by the resolved `botName` / `botVendor`. # Get sitemap crawl coverage Source: https://docs.searchable.com/api-reference/traffic/get-sitemap-crawl-coverage /api-reference/openapi.json get /api/mcp/projects/{projectId}/traffic/sitemap-coverage How AI crawlers consume the site's sitemap: per bot, how many times it fetched the sitemap and how often, how many sitemap-listed pages it went on to discover, and the median lag from a page appearing in the sitemap to its first crawl. Use it to answer whether newly published pages are actually reaching AI crawlers. Returns 409 traffic_not_connected if no tracker/CDN/log source is connected. # Get top AI-referral pages for a platform Source: https://docs.searchable.com/api-reference/traffic/get-top-ai-referral-pages-for-a-platform /api-reference/openapi.json get /api/mcp/projects/{projectId}/traffic/top-cited-pages Top pages driving AI-referral traffic for one platform. `platform` is required (one of openai, anthropic, google, perplexity, microsoft) — 400 without one. Returns 409 traffic_not_connected if no source is connected. `days` defaults to 30, max 365. # Get traffic attribution Source: https://docs.searchable.com/api-reference/traffic/get-traffic-attribution /api-reference/openapi.json get /api/mcp/projects/{projectId}/traffic/attribution Traffic attribution by UTM tuple (source / medium / campaign) plus referrer domain and bot category, ranked by request count. `limit` defaults to 50, max 200. # List AI-crawler activity by page Source: https://docs.searchable.com/api-reference/traffic/list-ai-crawler-activity-by-page /api-reference/openapi.json get /api/mcp/projects/{projectId}/traffic/bots Per-page AI-crawler activity — each item is a page with total crawls and a per-platform breakdown (or one platform's count when filtered). Paginated. Returns 409 traffic_not_connected if no source is connected. `days` defaults to 30, max 365. # Get per-prompt visibility Source: https://docs.searchable.com/api-reference/visibility/get-per-prompt-visibility /api-reference/openapi.json get /api/mcp/projects/{projectId}/visibility/prompts Per-prompt visibility breakdown. Paginated — the response `pagination` block returns `hasMore` + `nextOffset`; pass `offset` to page through all prompts. `days` defaults to 30, max 180. `limit` defaults to 500, max 5000. # Get per-topic visibility Source: https://docs.searchable.com/api-reference/visibility/get-per-topic-visibility /api-reference/openapi.json get /api/mcp/projects/{projectId}/visibility/topics Topic-level visibility metrics. Pass unbranded=true or branded=true to restrict every metric by prompt brand state. `days` defaults to 30. # Get visibility by AI platform Source: https://docs.searchable.com/api-reference/visibility/get-visibility-by-ai-platform /api-reference/openapi.json get /api/mcp/projects/{projectId}/visibility/platforms Visibility broken down by AI platform. The same rows appear inside `GET /visibility` as `platforms[]`; this endpoint returns that breakdown on its own and can narrow to specific platforms. `platform` is comma-separated and resolved through the canonical platform map, so it accepts display names (`ChatGPT`, `AI Overviews`), aliases (`openai`, `microsoft`, `xai`), and raw model ids alike — `platform=chatgpt` matches a stored `chatgpt-4o` without also matching a `copilot-gpt-*` id, which belongs to Copilot. Filter further with `topicId` / `country` / `locationId` (each must be a UUID; a malformed value returns 400 `invalid_argument`), and pass unbranded=true or branded=true to filter by prompt brand state. `days` defaults to 30, max 365. # Get visibility by location Source: https://docs.searchable.com/api-reference/visibility/get-visibility-by-location /api-reference/openapi.json get /api/mcp/projects/{projectId}/visibility/locations Visibility broken down by tracked location (per-country/city), with share of voice, sentiment, avg position, and the change vs the prior equal-length window. Filter with `country` / `locationId` / `platform` / `topicId`. Pass unbranded=true or branded=true to filter by prompt brand state. Returns all locations when unfiltered. `days` defaults to 30, max 365. # Get visibility history Source: https://docs.searchable.com/api-reference/visibility/get-visibility-history /api-reference/openapi.json get /api/mcp/projects/{projectId}/visibility/history Visibility time-series data, one point per report. Pass unbranded=true or branded=true to compute the per-report score and stats by prompt brand state. `days` defaults to 90, max 365. # Get visibility summary Source: https://docs.searchable.com/api-reference/visibility/get-visibility-summary /api-reference/openapi.json get /api/mcp/projects/{projectId}/visibility AI visibility score + platform breakdown. Pass unbranded=true or branded=true to restrict every metric (score, mentions, citations) by prompt brand state. `days` defaults to 30, max 365. # API Error Reference Source: https://docs.searchable.com/api/errors Every error code the Searchable REST API returns, what it means, and how to fix it ## Overview Every error response from the REST API (`/api/mcp/*`, `/api/v1/*`, and the Looker Studio connector) is shaped as [`application/problem+json`](https://www.rfc-editor.org/rfc/rfc9457) — a machine-readable envelope that additively extends the API's original `{ error: "..." }` shape. Existing integrations that only read `error` keep working unmodified. ```json theme={null} { "type": "https://docs.searchable.com/api/errors#not_found", "title": "Not Found", "status": 404, "code": "not_found", "error": "Project not found or access denied", "message": "Project not found or access denied", "howToFix": "...", "requestId": "b3f1c2a0-4e9d-4a11-9c3a-8e2f6d1a7c55" } ``` | Field | Meaning | | ----------- | --------------------------------------------------------------------------------------------------- | | `type` | A URL identifying the error kind — always this page, anchored to `code` | | `title` | Human-readable summary of `code` | | `status` | The HTTP status code (matches the response status) | | `code` | Machine-readable error code — stable, safe to branch on | | `error` | **Legacy compat key.** Always equal to `message`. Existing integrations that read this keep working | | `message` | Human-readable error message (identical to `error`) | | `howToFix` | Present on actionable errors — a concrete next step | | `requestId` | The request's id. Include this when contacting support | Some errors carry additional fields beyond this base shape (e.g. `requiresUpgrade`, `retryable`, `current`/`limit` on a quota error) — those are documented per-code below and are additive, never replacing the fields above. ## Quick reference | Code | Status | Meaning | | ------------------------------------------------- | ------- | ----------------------------------------------------------------------------- | | [`unauthorized`](#unauthorized) | 401 | Missing, malformed, revoked, or expired API key | | [`forbidden`](#forbidden) | 403 | Access denied to the requested resource | | [`missing_scope`](#missing-scope) | 403 | The API key lacks the required `read`/`write` scope | | [`plan_upgrade_required`](#plan-upgrade-required) | 403 | The workspace's plan doesn't include this feature | | [`not_found`](#not-found) | 404 | The resource doesn't exist, or the key can't reach it | | [`invalid_argument`](#invalid-argument) | 400 | A query parameter, path parameter, or body field is invalid | | [`invalid_country`](#invalid-country) | 400 | An unrecognized `country` filter value | | [`no_domain`](#no-domain) | 400 | The project has no verified domain configured | | [`no_workspace`](#no-workspace) | 400/403 | The project isn't linked to a workspace | | [`no_pages`](#no-pages) | 400 | No tracked (or matching) pages to audit | | [`bulk_limit_exceeded`](#bulk-limit-exceeded) | 400 | Too many pages requested for a bulk audit on this plan | | [`quota_exceeded`](#quota-exceeded) | 403 | A monthly/concurrent usage quota is exhausted | | [`project_not_runnable`](#project-not-runnable) | 403 | The project is paused or archived — background jobs are blocked | | [`pitch_not_supported`](#pitch-not-supported) | 403 | The feature isn't available on pitch (scoped) projects | | [`rate_limited`](#rate-limited) | 429 | Too many requests — per-key REST rate limit, or a per-project concurrency cap | | [`idempotency_in_flight`](#idempotency-in-flight) | 409 | A request with the same `Idempotency-Key` is still running | | [`query_timeout`](#query-timeout) | 504 | The query took too long — narrow the request and retry | | [`gsc_not_connected`](#gsc-not-connected) | 409 | No Google Search Console site linked to the project | | [`gsc_site_not_linked`](#gsc-site-not-linked) | 404 | The linked GSC site record doesn't match the project | | [`gsc_access_denied`](#gsc-access-denied) | 403 | Google revoked/denied access — reconnect the account | | [`ga4_not_connected`](#ga4-not-connected) | 409 | No Google Analytics 4 property linked to the project | | [`traffic_not_connected`](#traffic-not-connected) | 409 | No crawler-log, CDN, or tracker source connected | | [`internal_error`](#internal-error) | 500 | An unexpected server error — retry, then contact support | ## Authentication & authorization ### `unauthorized` **401.** The request has no `Authorization: Bearer sea_...` header, the key doesn't start with `sea_`, or the key is invalid, revoked, or expired. **Fix:** Check the header is `Authorization: Bearer sea_xxxxx`. Create or rotate the key under **Settings → Workspace → Integrations**. ### `forbidden` **403.** The authenticated key's user doesn't have access to the requested resource (distinct from a missing scope or a not-found — the resource exists but this key's user isn't a member, or the project is inactive). **Fix:** Confirm the key's owning user is a member of the workspace that owns the resource. ### `missing_scope` **403.** The key doesn't carry the scope the endpoint requires. Read endpoints require `read`; write/action endpoints (report generation, triggering an audit, refreshing a sitemap) require `write`. `admin` covers both. **Fix:** Create a new key with the required scope, or use a key that already has it. See [Scopes](/advanced/api-usage#scopes). ### `plan_upgrade_required` **403.** The action is gated behind a plan the workspace isn't on (white-label branding, report sharing, Shopping Analytics, Looker Studio integration, query fanout, …). Often carries `requiresUpgrade: true`. **Fix:** Upgrade the workspace's plan under **Settings → Billing**. ## Not found & validation ### `not_found` **404.** The resource doesn't exist, or the API key's project binding doesn't allow it to reach the requested project (a project-bound key can never see another project, even one its owning user can access in-app — see [Scopes](/advanced/api-usage#scopes)). Deliberately indistinguishable from "doesn't exist" so existence never leaks to a caller who shouldn't see it. **Fix:** Double-check the id in the URL. If the key is project-bound, confirm you're calling it for its own project. ### `invalid_argument` **400.** A query parameter, path parameter, or request body failed validation (e.g. an out-of-range `days`, a malformed date, an invalid enum value, or a body that fails its schema). The response often carries `details` with the field-level breakdown. **Fix:** Check the parameter/body shape against the endpoint's documented params. ### `invalid_country` **400.** The `country` filter value isn't a recognized ISO code or name. **Fix:** Pass a valid ISO 3166-1 country code (e.g. `US`, `GB`) or `locationId` instead. ### `no_domain` **400.** The project has no verified domain — required before an audit or sitemap sync can run (the audited origin is always derived from the project's own domain, never a caller-supplied URL). **Fix:** Set the project's domain in the dashboard, then retry. ### `no_workspace` **400 or 403.** The project isn't linked to a workspace, so plan/feature checks (Looker Studio, audits) have nothing to evaluate against. **Fix:** This is an account-configuration issue — contact **[support@searchable.com](mailto:support@searchable.com)**. ### `no_pages` **400.** `POST /audits` was called with no tracked pages and no explicit `pageIds`, or every id in `pageIds` didn't match a page in this project. **Fix:** Track at least one page first, or pass valid `pageIds` for this project. ### `bulk_limit_exceeded` **400.** The requested page count for a single `POST /audits` call exceeds the workspace's plan limit. Carries `bulkLimitExceeded: true`, `requested`, and `maxAllowed`. **Fix:** Pass a smaller `pageIds` list, split the audit into multiple calls, or upgrade the plan. ## Quota & runnability ### `quota_exceeded` **403.** A monthly or concurrent usage quota (audits, reports, prompts, …) is exhausted. Carries `quotaExceeded: true`, `current`, and `limit`. **Fix:** Wait for the quota to reset (monthly quotas), reduce concurrent usage, or upgrade the plan. ### `project_not_runnable` **403.** The project is paused or archived. Background work (audits, sitemap sync, report generation) requires an active, non-archived project. **Fix:** Resume the project in the dashboard before retrying. ### `pitch_not_supported` **403.** The endpoint isn't available for pitch (scoped, pre-conversion) projects — opportunities, audits, and sitemap sync are regular-project-only features. **Fix:** This endpoint only supports regular (non-pitch) projects. ## Rate limiting & timeouts ### `rate_limited` **429.** Either the per-API-key REST rate limit (600 requests/minute) was exceeded, or — on some endpoints — a per-project concurrency cap was already held by another in-flight request from the same key. The response carries a `Retry-After` header (seconds) and `retryable: true`. See [Rate limiting](/advanced/api-usage#rate-limiting). **Fix:** Back off for `Retry-After` seconds, then retry. Spread bursts of requests across a longer window rather than firing them all at once. ### `idempotency_in_flight` **409.** Another request carrying the same `Idempotency-Key` is still executing — the duplicate was refused instead of running the side effect a second time. Carries a `Retry-After` header (5 seconds) and `retryable: true`. See [Idempotency](/advanced/api-usage#idempotency). **Fix:** Wait `Retry-After` seconds, then retry **with the same key** — once the original completes successfully you'll receive its stored response (`X-Idempotent-Replay: true`); if the original failed, the retry runs fresh. ### `query_timeout` **504.** The query took longer than the endpoint's timeout budget. Carries `timeout: true` and `retryable: true`. **Fix:** Narrow the `days` window or add filters (platform, topic, location), then retry. ## Google integrations ### `gsc_not_connected` **409.** No Google Search Console site is linked to this project. **Fix:** Connect Google Search Console under **Settings → Integrations**, then retry. ### `gsc_site_not_linked` **404.** The project has a GSC site reference that doesn't resolve — a narrower variant of "not connected" surfaced by some GSC endpoints. **Fix:** Reconnect Google Search Console under **Settings → Integrations**. ### `gsc_access_denied` **403.** Google denied the request — the connected account's token was revoked, permission to the property was removed, or the property was unshared. Distinct from `gsc_not_connected`: the integration was connected, but Google is now rejecting it. **Fix:** Reconnect the Google account under **Settings → Integrations**. ### `ga4_not_connected` **409.** No Google Analytics 4 property is linked to this project. **Fix:** Connect Google Analytics 4 under **Settings → Integrations**, then retry. ## AI Traffic ### `traffic_not_connected` **409.** No crawler-log, CDN, or Searchable-tracker data source is connected for this project. **Fix:** Connect a source under **AI Traffic → Setup**. ## Server errors ### `internal_error` **500.** An unexpected server-side failure. Never leaks internal error text — the message is always a stable, generic description. **Fix:** Retry with exponential backoff. If it persists, contact **[support@searchable.com](mailto:support@searchable.com)** with the `requestId` from the response body. ## Need more? Higher rate limits, a code not listed here, or a question about a specific response? Contact **[support@searchable.com](mailto:support@searchable.com)** with the endpoint, `requestId`, and response body. # Changelog Source: https://docs.searchable.com/changelog Updates to the Searchable REST API and MCP server Everything here is **additive** — no existing call changes shape, and every capability lands on both the MCP tools and the matching REST endpoints, which share one implementation. **Absolute date ranges (`from` / `to`).** Previously only Search Console accepted explicit dates; everything else spoke in relative `days`, so "compare March against June" or "the week of the launch" could not be expressed. Every windowed read now takes `from` and `to` (inclusive, UTC, `YYYY-MM-DD` or full ISO): `get_visibility` (all views), `get_share_of_voice`, `get_sentiment`, `get_topic_analysis`, `get_ai_traffic`, and their REST twins. Both bounds are required together and are mutually exclusive with `days` — sending both returns `400 invalid_argument` rather than silently picking one. An over-long `days` is still clamped; an over-long explicit range is **rejected**, because narrowing a range you spelled out would answer a different question. **Five new AI Traffic reports** on `get_ai_traffic` (and as REST endpoints under `/traffic/*`): | Report | Answers | | ------------------ | -------------------------------------------------------------------------------- | | `sitemap_coverage` | Per bot: sitemap fetch cadence, pages discovered, publish-to-crawl lag | | `human` | Human sessions that arrived from an AI assistant, split by platform | | `correlation` | Per page, crawls versus the AI-referred sessions that followed | | `attribution` | Traffic by UTM tuple, referrer, and bot category | | `logs` | The raw request feed — filter by path, status, bots-only, host; cursor-paginated | `logs` is row-capped (25 default, 100 max) and **never returns `ip_address` or `user_agent`**: the IP is personal data with no analytical value once `country` is present, and the user-agent is superseded by the resolved bot identity. A new `host` parameter narrows any traffic report to specific hostnames on multi-domain projects. **New views on the existing families.** * `get_share_of_voice` gains `group_by="date"` — the daily brand-versus-competitor share series, for "is our share growing". * `get_topic_analysis` gains `view="prompts"` (per-prompt rank inside one topic, with the competitors outranking you — requires `topicId`) and `view="heatmap"` (average brand position per topic x AI platform). Both are also REST endpoints: `/topics/prompt-rankings` and `/topics/heatmap`. * `get_visibility` gains `include="industry_ranking"` — the competitive leaderboard attached to the summary. * Date-series views gain `include="annotations"`: the dated markers (campaign launches, migrations) overlapping the window, so a spike arrives with its explanation. **Filters.** `list_prompts` (and `GET /prompts`) accept `search` for a case-insensitive substring match on prompt text — `%` and `_` match literally rather than as wildcards. `topicId` accepts a comma-separated list on the surfaces whose queries take several (`get_visibility`, `get_share_of_voice`, `get_sentiment`, `get_topic_analysis`, `get_competitors`, `get_shopping_visibility`); single-topic surfaces (`list_prompts`, `get_query_fanout`, `get_ads`) document and accept one id rather than advertising a list they would reject. `list_projects` returns `dataAvailableFrom` per project — the earliest date with a **completed, scored** visibility report — so a client can size its windows instead of discovering the horizon through empty results. **Reading the new reports honestly.** Three contracts are worth knowing before you parse them: * `report="human"` carries a `summarySource`. Site-wide totals come from the first-party tracker while the AI figures fall back to GA4 when no tracker is installed; in that split state every `summary` field and `percentOfTotal` are `null` rather than `0`, and a failed GA4 read arrives as `aiReferral.sourceError` instead of as zeroes. * `report="correlation"` joins crawls and AI-referred sessions over the **same window** by path. That is co-occurrence, not attribution — nothing establishes that a session followed a crawl. Its `pagesConsidered` is a floor on the page count, with `populationTruncated` flagging when the upstream per-set cap means pages are missing. * `include="industry_ranking"` returns the top 25 entities, not the whole field: `hasMore` flags a longer leaderboard, `brandRankStatus` separates "ranks below the cutoff" from "unranked", and `totalEntities` is `null` when truncated. Arguments a view cannot apply are now `invalid_argument` errors rather than silent no-ops — an `include` on a view that attaches no blocks, `topicId` on the all-topics view, `platform` on the topic x platform heatmap, an explicit range longer than `group_by=prompt`'s 180-day ceiling, and half a log cursor. Impossible calendar dates (`2026-02-30`) are rejected instead of rolling into the next month, and markdown headings name an explicit range instead of relabelling it "last N days". `logs`, `sitemap_coverage`, and `attribution` require a crawler-log source and return `traffic_not_connected` for analytics-only projects, rather than an empty `200` that reads as "no crawler traffic". **Four reads folded into their family's primary tool.** The visibility trend, the two sentiment side-views, and domain authority are now selector parameters instead of standalone tools: | Old tool | New call | | --------------------------- | --------------------------------------------------- | | `get_visibility_history` | `get_visibility` (`group_by: "date"`) | | `get_sentiment_history` | `get_sentiment` (`view: "history"`) | | `get_sentiment_competitors` | `get_sentiment` (`view: "competitors"`) | | `get_domain_authority` | `get_brand_profile` (`include: "domain_authority"`) | **The old names still work.** All four stay registered as deprecated stubs with byte-identical payloads, so existing scripts and scheduled jobs are unaffected today. They are scheduled for removal **after 2026-10-15** — the same \~60-day window the removed aliases got. An unsupported combination on the new views (for example `compare` on `view=history`, or a `platform` filter on `group_by=date`) returns `invalid_argument` instead of being silently ignored. **REST is untouched.** `GET /visibility/history`, `GET /sentiment/history`, `GET /sentiment/competitors`, and `GET /domain-authority` are not deprecated and follow the standard [12-month policy](/changelog#deprecation-policy) as before. **Leaner tool descriptions.** Tool descriptions across the server were tightened (\~18% smaller) with no behavioral facts removed — every MCP client loads the full tool list into model context each conversation, so this directly cuts per-conversation overhead. **Period comparison in one call.** `GET /visibility`, `GET /visibility/topics`, `GET /share-of-voice`, and `GET /sentiment` (and the matching MCP tools `get_visibility`, `get_share_of_voice`, `get_sentiment`) accept `compare=previous_period` or `compare=previous_year`. The response gains an additive `comparison` block — the previous window's metrics plus current-minus-previous deltas — so "how did we do vs last month?" no longer needs two calls and client-side math. On `/visibility/topics`, per-topic deltas ride inline on each topic row. On `/share-of-voice`, every competitor row gains `previousSov`/`sovDelta`. **Per-URL metrics rollup.** New `GET /projects/{projectId}/pages/metrics?url=…` (and the `get_page_metrics` MCP tool): one page's three AI series joined in a single call — citations of the URL in AI answers, AI-referral sessions landing on it (by platform), and AI-crawler hits fetching it (by bot), each as daily buckets. Traffic series degrade to `available: false` when the LLM Analytics integration isn't connected; citations always answer. **CSV export + bigger pages.** The five biggest list endpoints — cited domains, cited URLs, prompts, issues, opportunities — accept `?format=csv` (RFC 4180, BOM-prefixed, spreadsheet-formula-hardened). Page-size caps rose for bulk pulls: cited domains/URLs and prompts to **1,000** rows per page, opportunities to 1,000; values above a cap clamp instead of erroring. **Consistent pagination everywhere.** `GET /issues`, `GET /opportunities`, and `GET /competitors` now return the full standard offset block (`hasMore` + `nextOffset` included) — the derive-it-yourself caveats are gone from the docs because they're gone from the API. **New MCP orientation tools.** `get_current_date` (UTC anchor + pre-computed 7/30/90/365-day window starts, so assistants never do date arithmetic), `whoami` (who this connection is, its read/write scopes, and its visible project roster), and `search_docs` / `read_doc` (full-text search + retrieval over this documentation, served from the app's embedded corpus — assistants can answer "how is the visibility score calculated?" in-chat). Plus two MCP **resources**: `searchable://glossary` and `searchable://glossary/full` — metric and concept definitions with the tools that read each one. **`responseMentionRate` is the mention metric to use.** It is the percentage (0-100) of AI responses that mention your brand, and it means **the same thing on every endpoint** — added to both `GET /visibility` (`summary.responseMentionRate`) and `GET /visibility/history` (per data point). `GET /visibility/history` data points also now return `responsesWithBrand`, so the rate is auditable from the payload alone. **Why:** `mentionRate` does not mean the same thing on both endpoints, and never has. * On `GET /visibility` it is a **share** of responses — bounded 0-100. * On `GET /visibility/history` it is a **density**: brand mentions ÷ responses × 100. Because one response can mention a brand several times, this routinely reads **above 100%** (a real project reads 393%). That is the value it has always returned, not a recent regression. `mentionRate` and `overallMentionRate` are therefore **deprecated but unchanged** on `GET /visibility`, `GET /visibility/history`, and `GET /visibility/prompts`. They keep returning exactly what they always have — we do not silently recalculate a shipped field. There is **no removal date**; per the policy below you would get at least 12 months' notice, and this entry starts no clock. If you want the density, it stays derivable as `brandMentions / totalResponses * 100`. **Migrating:** replace `mentionRate` with `responseMentionRate` on `/visibility` and `/visibility/history`. On `/visibility/prompts`, `mentionRate` / `overallMentionRate` are exact aliases of `visibilityScore` / `overallVisibilityScore` — same value, so switching is a rename with no data change. **Also new: `GET /visibility/platforms`** — per-AI-platform visibility (the platform counterpart to `/visibility/topics` and `/visibility/locations`). `platform` is comma-separated and accepts display names, aliases, and raw model ids. **MCP: sign in instead of pasting a key.** The MCP server now supports an OAuth 2.1 login flow (PKCE + Dynamic Client Registration) — connect Claude, Cursor, or another MCP client by signing in and approving access, scoped to exactly the projects and read/write permissions you choose. The `sea_` API-key bearer path still works unchanged for scripts and headless clients. See [MCP integration](/integrations/mcp). **New data coverage**, in REST and as MCP tools: * **Share of Voice & Competitors** — brand vs. competitor mention-share ranking, its daily trend, and the full tracked-competitor roster * **AI Traffic** — first-party AI-crawler visits and AI-referral sessions, sourced from the tracker/CDN pipeline * **Shopping visibility** — AI shopping/product-carousel appearances * **Prompt Answers** — raw, per-response AI-answer data (text, mentions, citations) for a single prompt * **`GET /reports`** — list previously generated shareable reports for a project **Write actions over MCP** — `generate_report`, `trigger_audit`, and `refresh_sitemap` are now callable as MCP tools (in addition to their existing REST POST endpoints), each gated on the `write` scope and an explicit confirmation. **Hardened REST responses.** Every response now carries an `X-Request-Id` and standard rate-limit headers (600 requests/minute per API key); errors are RFC 9457 `application/problem+json` with a stable `code` field you can branch on. See the new **[error reference](/api/errors)**. The `POST /reports`, `POST /audits`, and `POST /sitemap/refresh` endpoints additionally accept an `Idempotency-Key` header, so a retry after a timeout or dropped connection never triggers the action twice. **Clearer "not connected" errors.** Google Search Console, Google Analytics 4, and AI Traffic endpoints now return an actionable `409` with a direct link to the right settings page when the integration isn't connected yet, instead of a generic failure. **This page, and the interactive [API reference](/api-reference/introduction)** — a full OpenAPI 3.1 spec with a live playground for every endpoint, generated straight from the shipped route contracts. ## Deprecation policy * **12 months' notice.** We give at least 12 months' notice before removing or changing the behavior of any documented endpoint, parameter, or response field. Adding a new endpoint or an additive response field is not a breaking change and isn't subject to this notice. * **`Deprecation` / `Sunset` headers.** Once an endpoint is scheduled for removal, its responses carry a `Deprecation` header (the date it was deprecated) and, once a removal date is fixed, a `Sunset` header (the date it stops working), per the [IETF Sunset header convention](https://www.rfc-editor.org/rfc/rfc8594). Nothing on this API is scheduled for removal today, so no `Sunset` header is in play. The `mentionRate` / `overallMentionRate` response fields are marked deprecated in the API reference (see the July 2026 entry above) — they remain fully supported with no removal date, and are superseded by `responseMentionRate`. * **Versioning posture.** `/api/mcp/*` — despite the name — is the frozen v1 REST contract: stable, versionless-by-default. New capabilities land as new endpoints or new additive fields, never as a breaking change to an existing one. `/api/v1/*` is reserved for surfaces that need independent versioning from that contract (currently just `/api/v1/projects/{projectId}/audits`, which mirrors `GET /api/mcp/projects/{projectId}/audits` exactly). * A breaking change, if one is ever required, ships as a new endpoint or a new version prefix, announced here first, with the prior version supported through the full notice window. Questions about an upcoming change? **[support@searchable.com](mailto:support@searchable.com)**. # Connecting Your First Domain Source: https://docs.searchable.com/getting-started/creating-your-project Step-by-step guide to setting up your first domain in Searchable **On this page:** What is a Domain • Before You Start • Connecting Your Domain • After Domain Setup • Domain Settings • Managing Workspaces • Common Issues • Best Practices ## What is a Domain in Searchable? In Searchable, a **domain** represents a website you want to monitor and optimize for AI visibility. Each domain (backed by a project in the API) can track multiple pages, run audits, monitor AI mentions, and generate optimized content. Most users connect **one domain per website** they manage. Under the hood, each domain is stored as a project in the API, but everywhere in the product you'll work with domains. ## Before You Start Make sure you have: Your website's primary domain (e.g., `https://yourwebsite.com`) Access to verify domain ownership (if setting up integrations) A clear understanding of your industry/niche Target keywords or topics (optional but recommended) ## Connecting Your Domain From your dashboard, click the **"Add Domain"** button in the sidebar, or open **Settings** → **Workspace & Domains** and use the domain table actions. Starter ($100/mo) is designed for a single tracked domain. Professional ($300/mo) supports two concurrent domains, Agency (\$750/mo) expands to five, and Custom plans can be tailored for additional scale. Fill in the essential details about your website: **Display name** * Choose a memorable name for internal reference (optional) * Example: "Company Blog" or "Main Website" **Website domain** * Enter your primary domain * Format: `yourwebsite.com` (we'll normalize `https://` for you) * Don't include specific pages or paths Make sure to use the correct protocol (http\:// or https\://). This affects how we crawl and analyze your site. **Industry Category** * Select your primary industry from the dropdown * Options include: Technology, Healthcare, Finance, E-commerce, Education, and more * This helps us provide industry-specific recommendations Customize how Searchable monitors your website: **Monitoring Frequency** * All plans include continuous monitoring * Audit limits vary by plan (see [Plans & Pricing](/getting-started/plans-pricing)) * Starter: 25 pages, Professional: 100 pages, Agency: 500 pages (Custom plans are tailored during onboarding) **Pages to Monitor** * Choose "Auto-discover" to let Searchable find important pages * Or manually add specific URLs to monitor * You can always add more pages later (within your plan's audit limits) Start with your most important pages to maximize your monthly audit allocation. **Target Keywords (Optional)** * Add 3-5 primary keywords relevant to your business * These help us track your AI visibility for specific topics * Example: "CRM software", "project management tool" Add initial prompts to track your brand mentions across AI platforms: **Default Prompts** * Searchable suggests prompts based on your industry * These track how AI models mention your brand **Custom Prompts** * Add industry-specific questions * Example: "What are the best CRM tools for small businesses?" * Plan limits: Starter (50), Professional (100), Agency (1,000), Custom (configured with sales) Start with 5-10 prompts and expand based on what works. Learn more in [Working with Prompts](/using-searchable/working-with-prompts). Click **"Create Project & Start Crawl"** to begin: **What Happens Next:** * Searchable crawls your website (usually takes 2-10 minutes) * Discovers pages and analyzes site structure * Runs initial technical and content audits * Generates your first AI visibility report You'll receive an email when your initial analysis is complete. Most crawls finish within 5 minutes. ## After Domain Setup Once your domain is connected, you'll land on the main dashboard where you can: ### View Initial Results See your overall technical and content quality score (0-100) Review all pages found during the initial crawl Identify urgent technical or content problems Your starting point for brand mention tracking ### Next Actions 1. **Review Discovered Pages** * Navigate to **Pages** tab * Mark important pages for priority monitoring * Remove any pages you don't want to track 2. **Fix Critical Issues** * Go to **Issues** tab * Start with critical and high-priority items * Follow our recommendations for quick wins 3. **Add More Prompts** * Visit **Prompts** tab * Add industry-specific questions * Import prompt templates 4. **Set Up Integrations** * Connect Google Search Console for keyword data * Add Google Analytics for traffic insights ## Domain Settings Access domain settings anytime via **Settings** → **Workspace & Domains** and selecting a domain. ### General Settings * **Domain name**: Update your domain display name * **Primary domain**: Change primary domain (requires re-crawl) * **Industry**: Update industry category * **Time Zone**: Set your preferred timezone for reporting ### Crawl Settings * **Crawl Frequency**: How often to audit your site * **Max Pages**: Limit pages to monitor (based on your plan) * **Crawl Depth**: How many levels deep to crawl from homepage * **Excluded Paths**: Skip certain URL patterns (e.g., `/admin/*`) ```yaml Example: Exclude Patterns theme={null} # Exclude admin pages /admin/* /wp-admin/* # Exclude user-specific pages /user/*/profile # Exclude test environments /staging/* /test/* ``` ### Notification Settings Configure when and how you receive updates: * **Email Reports**: Daily, weekly, or monthly summaries * **Issue Alerts**: Get notified when critical issues are found * **Visibility Changes**: Track significant changes in AI mentions * **Audit Completion**: Know when crawls finish ## Managing Multiple Workspaces If you manage more than one brand, upgrading increases how many domains and seats you can run in parallel: ### Understanding Workspaces Each workspace can host several domains and teammates: * **Starter (\$100)**: 1 tracked domain, 1 seat * **Professional (\$300)**: 2 tracked domains, up to 10 seats * **Agency (\$750)**: 5 tracked domains, up to 25 seats * **Custom**: Scaled during contracting ### Switching Workspaces * Use the workspace selector in the top navigation * Recently viewed workspaces appear at the top * Pin favorite workspaces for quick access ### Comparing Domains * Navigate to **Analytics** and switch between domains using the sidebar domain switcher * See performance across all domains within a workspace * Identify which sites need attention ### Team Access * Invite team members in **Settings** → **Team** * Seats included: Starter (1), Professional (10), Agency (25), Custom (tailored) * Set permissions per domain * Share dashboards and reports ## Common Issues & Solutions **Possible Causes:** * Robots.txt blocking our crawler * Slow server response times * Large site with many pages **Solutions:** * Verify Searchable's crawler is allowed in robots.txt * Check your site's performance * Start with fewer pages (within your plan's audit limit) and expand gradually **Possible Causes:** * Pages aren't linked from your homepage * Pages blocked by robots.txt or noindex tags * Pages behind authentication **Solutions:** * Manually add specific URLs in **Pages** → **Add Page** * Check internal linking structure * Verify crawl depth settings You can update your domain in **Settings** → **Workspace & Domains** → **Domain details**. This will trigger a new crawl. Alternatively, delete the domain and create a new one. Yes! Go to **Settings** → **Workspace & Domains** → **Domain details** and update your industry. This will update our recommendations and prompt suggestions. Your plan determines your monthly limits: * **Starter (\$100)**: 25 audits, 50 prompts, 5 articles * **Professional (\$300)**: 100 audits, 100 prompts, 25 articles * **Agency (\$750)**: 500 audits, 1,000 prompts, 100 articles * **Custom**: Tailored allocations and unlimited article generation Upgrade anytime in **Settings** → **Billing** or contact [support@searchable.com](mailto:support@searchable.com) for Custom provisioning. ## Best Practices Start with your most important pages rather than crawling everything Add prompts that your target customers would actually ask Set up email notifications to stay informed Review your dashboard weekly to track progress Connect integrations early for richer data ## Video Tutorial