{"openapi":"3.0.0","paths":{"/api/index/autocomplete":{"get":{"description":"Returns up to 10 suggestions matching the query string. Useful for search-as-you-type.","operationId":"SearchIndexController_autocomplete","parameters":[{"name":"q","required":true,"in":"query","description":"Search query (min 2 chars)","schema":{}}],"responses":{"200":{"description":"{ suggestions: string[] }"}},"summary":"Autocomplete business name / category / city","tags":["Public Index"]}},"/api/index/browse":{"get":{"description":"Paginated list of indexed business profiles. All filters are optional. Returns both listed (auto-discovered) and published (claimed) profiles.","operationId":"SearchIndexController_browse","parameters":[{"name":"locale","required":false,"in":"query","description":"Content locale for translated listings (en or he). IL profiles in /en show English taglines.","schema":{}},{"name":"sort","required":false,"in":"query","description":"Sort order (default: readability)","schema":{"enum":["readability","name","newest"],"type":"string"}},{"name":"offset","required":false,"in":"query","description":"Pagination offset (default 0)","schema":{}},{"name":"limit","required":false,"in":"query","description":"Results per page (default 20, max 100)","schema":{}},{"name":"country","required":false,"in":"query","description":"Filter by country (e.g. \"Israel\", \"United States\")","schema":{}},{"name":"city","required":false,"in":"query","description":"Filter by city (e.g. \"Tel Aviv-Yafo\", \"New York\")","schema":{}},{"name":"category","required":false,"in":"query","description":"Filter by primary category (e.g. \"Restaurant\", \"Dentist\", \"Software\")","schema":{}}],"responses":{"200":{"description":"{ profiles: BusinessProfile[], total: number }"}},"summary":"Browse the business index","tags":["Public Index"]}},"/api/index/categories":{"get":{"description":"Returns every category that has at least one indexed profile, with business counts. Sorted by count descending.","operationId":"SearchIndexController_getCategories","parameters":[],"responses":{"200":{"description":"{ categories: Array<{ category: string, count: number }> }"}},"summary":"List all indexed categories","tags":["Public Index"]}},"/api/index/cities":{"get":{"description":"Returns every city that has at least one indexed profile, with business counts. Sorted by count descending.","operationId":"SearchIndexController_getCities","parameters":[],"responses":{"200":{"description":"{ cities: Array<{ city: string, count: number }> }"}},"summary":"List all indexed cities","tags":["Public Index"]}},"/api/index/industry-groups":{"get":{"description":"Returns all industry groups with their nested categories and business counts. Use this to understand the full scope of the index before browsing.","operationId":"SearchIndexController_getIndustryGroups","parameters":[],"responses":{"200":{"description":"{ groups: Array<{ industry: string, categories: Array<{ category: string, count: number }>, total: number }> }"}},"summary":"Hierarchical industry taxonomy","tags":["Public Index"]}},"/api/index/normalize-industry":{"get":{"description":"Returns the broad group name for a raw industry string. Used by the directory to redirect legacy industry URLs to the correct broad group page.","operationId":"SearchIndexController_normalizeIndustry","parameters":[{"name":"raw","required":true,"in":"query","description":"Raw industry string (e.g. \"SEO platform - AI-powered SEO\")","schema":{"type":"string"}}],"responses":{"200":{"description":"{ group: string | null }"}},"summary":"Normalize a raw industry string to its broad group name","tags":["Public Index"]}},"/api/index/stats":{"get":{"description":"Returns aggregate counts for the published business index: profile count, country spread, category/industry/city counts, citation tier distribution.","operationId":"SearchIndexController_getIndexStats","parameters":[],"responses":{"200":{"description":"IndexStatsDto"}},"summary":"Global index statistics","tags":["Public Index"]}},"/api/index/slugs":{"get":{"description":"Given a comma-separated list of website URLs, returns matching profile slugs. Up to 50 URLs per request.","operationId":"SearchIndexController_lookupSlugs","parameters":[{"name":"urls","required":true,"in":"query","description":"Comma-separated website URLs (e.g. \"https://example.com,https://other.com\")","schema":{"type":"string"}}],"responses":{"200":{"description":"{ slugs: Record<string, string | null> }"}},"summary":"Batch resolve website URLs to profile slugs","tags":["Public Index"]}},"/api/index/enrichment":{"get":{"operationId":"SearchIndexController_lookupEnrichment","parameters":[{"name":"urls","required":true,"in":"query","description":"Comma-separated website URLs (up to 50)","schema":{"type":"string"}},{"name":"city","required":false,"in":"query","description":"Optional city hint — when set, prefer the chain branch matching this city over the parent profile","schema":{"type":"string"}}],"responses":{"200":{"description":"{ enrichment: Record<string, { mention_count, primary_category, slug }> }"}},"summary":"Batch enrich URLs with mention count, category, slug","tags":["Public Index"]}},"/api/index/leaderboard":{"get":{"description":"Returns listed and published profiles matching a category, ordered by AI readability score.","operationId":"SearchIndexController_leaderboard","parameters":[{"name":"category","required":true,"in":"query","description":"Category name (e.g. \"Restaurant\", \"Software - AI Software\")","schema":{"type":"string"}},{"name":"city","required":false,"in":"query","description":"Filter by city (for local scope)","schema":{"type":"string"}},{"name":"country","required":false,"in":"query","description":"Filter by country code (for regional scope)","schema":{"type":"string"}},{"name":"limit","required":false,"in":"query","description":"Max results (default 200, max 500)","schema":{"type":"string"}}],"responses":{"200":{"description":"{ profiles: BusinessProfile[], total: number }"}},"summary":"Top profiles in a category","tags":["Public Index"]}},"/api/index/profile/resolve-name":{"get":{"description":"Used by the React app when a /business/cat/city/name URL 404s — typically because the profile was renamed/moved. Returns { url_path } if exactly one active listed/published profile ends in that nameSlug. Must NOT be called from bot SSR: bots seeing stale URLs must keep returning 410 so Google deindexes them.","operationId":"SearchIndexController_resolveByNameSlug","parameters":[{"name":"name","required":true,"in":"query","description":"The last url_path segment (nameSlug)","schema":{"type":"string"}}],"responses":{"200":{"description":"{ url_path: string }"},"404":{"description":"No match or ambiguous"}},"summary":"Resolve a stale nameSlug to canonical url_path (SPA only)","tags":["Public Index"]}},"/api/index/profile/by-path":{"get":{"description":"Fetches a business profile using its semantic url_path (e.g. \"lawyers/hadera/itai-hashay\"). Use this for new-style URLs.","operationId":"SearchIndexController_getProfileByPath","parameters":[{"name":"path","required":true,"in":"query","description":"The url_path value (category/city/name)","schema":{"type":"string"}},{"name":"locale","required":false,"in":"query","description":"Content locale for translated profiles (en or he). Falls through to primary if translation unavailable.","schema":{"type":"string"}}],"responses":{"200":{"description":"{ profile: BusinessProfile }"}},"summary":"Get profile by semantic url_path","tags":["Public Index"]}},"/api/index/profile/{slug}/related":{"get":{"description":"Returns profiles in the same category or city, ordered by audit score. Used for SEO cross-linking and discovery.","operationId":"SearchIndexController_getRelated","parameters":[{"name":"slug","required":true,"in":"path","description":"Profile slug","schema":{"type":"string"}},{"name":"limit","required":false,"in":"query","description":"Max results (default 6, max 12)","schema":{"type":"string"}},{"name":"locale","required":false,"in":"query","description":"Content locale for translated taglines (en or he)","schema":{"type":"string"}}],"responses":{"200":{"description":"{ related: BusinessProfile[]; scope: \"category_city\" | \"related\" }"}},"summary":"Get related business profiles","tags":["Public Index"]}},"/api/index/profile/{slug}":{"get":{"description":"Fetch a full business profile by slug. Published profiles return all data including contact, hours, FAQ, certifications, and Schema.org JSON-LD. Listed (auto-discovered) profiles return summary data only.","operationId":"SearchIndexController_getProfile","parameters":[{"name":"slug","required":true,"in":"path","description":"Profile slug (e.g. \"aroma-cafe-tel-aviv\")","schema":{"type":"string"}},{"name":"locale","required":false,"in":"query","description":"Content locale for translated profiles (en or he). Falls through to primary if translation unavailable.","schema":{"type":"string"}}],"responses":{"200":{"description":"{ profile: BusinessProfile }"},"404":{"description":"Profile not found in index"}},"summary":"Get a single business profile","tags":["Public Index"]}},"/api/index/profile/{slug}/branches":{"get":{"description":"Returns all branch profiles linked to a parent profile (chains, franchises, clinic networks). Empty array if the profile is not a parent or has no branches.","operationId":"SearchIndexController_getBranches","parameters":[{"name":"slug","required":true,"in":"path","description":"Parent profile slug","schema":{"type":"string"}}],"responses":{"200":{"description":"{ branches: BusinessProfile[] }"}},"summary":"Get branch locations for a multi-location business","tags":["Public Index"]}},"/api/index/profile/{slug}/correction":{"post":{"description":"Report an inaccuracy in any field of a published or listed profile. Submissions are reviewed by the Vizoryo team. Open to all — no authentication required.","operationId":"SearchIndexController_submitCorrection","parameters":[{"name":"slug","required":true,"in":"path","description":"Profile slug","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProfileCorrectionDto"}}}},"responses":{"201":{"description":"{ success: true, correction_id: string }"},"404":{"description":"Profile not found in index"}},"summary":"Submit a data correction for a profile field","tags":["Public Index"]}},"/api/sitemap.xml":{"get":{"operationId":"SitemapController_getSitemapIndex","parameters":[],"responses":{"200":{"description":""}},"tags":["Sitemap"]}},"/api/sitemap-pages.xml":{"get":{"operationId":"SitemapController_getPagesSitemap","parameters":[],"responses":{"200":{"description":""}},"tags":["Sitemap"]}},"/api/sitemap-city-{slug}.xml":{"get":{"operationId":"SitemapController_getCitySitemap","parameters":[{"name":"slug","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Sitemap"]}},"/api/sitemap-nocity.xml":{"get":{"operationId":"SitemapController_getNocitySitemap","parameters":[],"responses":{"200":{"description":""}},"tags":["Sitemap"]}},"/api/llms/full.txt":{"get":{"operationId":"LlmsController_getRootMap","parameters":[],"responses":{"200":{"description":""}},"tags":["Llms"]}},"/api/llms/category/{slug}":{"get":{"operationId":"LlmsController_getCategory","parameters":[{"name":"slug","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Llms"]}},"/api/llms/city/{slug}":{"get":{"operationId":"LlmsController_getCity","parameters":[{"name":"slug","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Llms"]}}},"info":{"title":"Vizoryo AI Business Index API","description":"Public machine-readable API for the Global AI Business Visibility Index. No authentication required. Browse business profiles by category, city, and industry. Full manifest at https://www.vizoryo.com/llms-full.txt","version":"1.0","contact":{}},"tags":[],"servers":[{"url":"https://www.vizoryo.com","description":"Production"},{"url":"http://localhost:3001","description":"Local development"}],"components":{"schemas":{"ProfileCorrectionDto":{"type":"object","properties":{}}}}}