{"openapi":"3.0.0","paths":{"/api/v1":{"get":{"description":"API root metadata — name, version, current methodology version, documentation links, rate-limit policy, and the suggested citation format. Start here to discover the API.","operationId":"PublicMetaController_getIndex","parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"title":"ItemResponseOfPublicApiIndexResponse","type":"object","properties":{"item":{"$ref":"#/components/schemas/PublicApiIndexResponse"}},"required":["item"]}}}},"429":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}}},"summary":"API index","tags":["Meta"]}},"/api/v1/categories":{"get":{"description":"List every observed category with its display name, description, and the date of its latest completed ranking run. Use this to discover available category slugs before fetching a leaderboard.","operationId":"PublicCategoriesController_list","parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"title":"ListResponseOfPublicCategorySummaryResponse","type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/PublicCategorySummaryResponse"}}},"required":["items"]}}}},"429":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}}},"summary":"List categories","tags":["Categories"]}},"/api/v1/categories/{slug}":{"get":{"description":"Get the full leaderboard for a category — every ranked brand with CLAI Score, rank, trend, and per-provider rationale, plus the latest run's cycle date and methodology version. `isLatestCycle` is derived at read time and is the authoritative freshness signal.","operationId":"PublicCategoriesController_getCategory","parameters":[{"name":"slug","required":true,"in":"path","description":"Category slug","schema":{"example":"crm","type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"title":"ItemResponseOfPublicCategoryLeaderboardResponse","type":"object","properties":{"item":{"$ref":"#/components/schemas/PublicCategoryLeaderboardResponse"}},"required":["item"]}}}},"404":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"429":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}}},"summary":"Get category leaderboard","tags":["Categories"]}},"/api/v1/categories/{slug}/debate":{"get":{"description":"Get the latest inter-model debate for a category — the full transcript of ChatGPT, Claude, and Gemini arguing toward consensus on the ranking, with the agreed top-5 if they reached one.","operationId":"PublicCategoriesController_getDebate","parameters":[{"name":"slug","required":true,"in":"path","description":"Category slug","schema":{"example":"crm","type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"title":"ItemResponseOfPublicDebateResponse","type":"object","properties":{"item":{"$ref":"#/components/schemas/PublicDebateResponse"}},"required":["item"]}}}},"404":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"429":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}}},"summary":"Get latest category debate","tags":["Categories"]}},"/api/v1/categories/{slug}/brands/{domain}":{"get":{"description":"Get a single brand's standing within a category (latest cycle), including the per-provider breakdown, plus the category's latest run cycle date and methodology version.","operationId":"PublicCategoriesController_getBrand","parameters":[{"name":"slug","required":true,"in":"path","description":"Category slug","schema":{"example":"crm","type":"string"}},{"name":"domain","required":true,"in":"path","description":"Brand domain","schema":{"example":"hubspot.com","type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"title":"ItemResponseOfPublicBrandDetailResponse","type":"object","properties":{"item":{"$ref":"#/components/schemas/PublicBrandDetailResponse"}},"required":["item"]}}}},"404":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"429":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}}},"summary":"Get brand in category","tags":["Categories"]}},"/api/v1/categories/{slug}/brands/{domain}/history":{"get":{"description":"Get a brand's ranking history within a category — one entry per weekly cycle, newest first. Paginated: use `?page=` and `?limit=` to page through long histories.","operationId":"PublicCategoriesController_getHistory","parameters":[{"name":"slug","required":true,"in":"path","description":"Category slug","schema":{"example":"crm","type":"string"}},{"name":"domain","required":true,"in":"path","description":"Brand domain","schema":{"example":"hubspot.com","type":"string"}},{"name":"page","required":false,"in":"query","description":"Page number (1-indexed)","schema":{"minimum":1,"default":1,"example":1,"type":"number"}},{"name":"limit","required":false,"in":"query","description":"Number of items per page","schema":{"minimum":1,"maximum":100,"default":20,"example":20,"type":"number"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"title":"PaginatedResponseOfPublicBrandResponse","type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/PublicBrandResponse"}},"pagination":{"$ref":"#/components/schemas/PaginationMeta"}},"required":["items","pagination"]}}}},"404":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"429":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}}},"summary":"Get brand history","tags":["Categories"]}},"/api/v1/search":{"get":{"description":"Search the all-time brand index by name or domain substring (case-insensitive). Returns one hit per (category, domain) pair with the latest rank, CLAI Score, and cycle date. Paginated.","operationId":"PublicBrandsController_search","parameters":[{"name":"page","required":false,"in":"query","description":"Page number (1-indexed)","schema":{"minimum":1,"default":1,"example":1,"type":"number"}},{"name":"limit","required":false,"in":"query","description":"Items per page (max 100)","schema":{"minimum":1,"maximum":100,"default":20,"example":20,"type":"number"}},{"name":"q","required":false,"in":"query","description":"Case-insensitive substring matched against brand name and domain","schema":{"maxLength":100,"example":"hubspot","type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"title":"PaginatedResponseOfPublicSearchHitResponse","type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/PublicSearchHitResponse"}},"pagination":{"$ref":"#/components/schemas/PaginationMeta"}},"required":["items","pagination"]}}}},"429":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}}},"summary":"Search brands","tags":["Brands"]}},"/api/v1/brands/{domain}":{"get":{"description":"Get every category a brand ranks in, with its latest entry in each. Use this to see a brand's cross-category AI presence from a single domain.","operationId":"PublicBrandsController_getBrand","parameters":[{"name":"domain","required":true,"in":"path","description":"Brand domain","schema":{"example":"hubspot.com","type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"title":"ItemResponseOfPublicBrandCategoriesResponse","type":"object","properties":{"item":{"$ref":"#/components/schemas/PublicBrandCategoriesResponse"}},"required":["item"]}}}},"404":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"429":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}}},"summary":"Get brand cross-category presence","tags":["Brands"]}},"/api/v1/archive":{"get":{"description":"List every category that has archived snapshots, with all available snapshot dates (newest first). Use this to discover permalinkable historical runs.","operationId":"PublicArchiveController_index","parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"title":"ListResponseOfPublicArchiveIndexItemResponse","type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/PublicArchiveIndexItemResponse"}}},"required":["items"]}}}},"429":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}}},"summary":"Archive index","tags":["Archive"]}},"/api/v1/archive/{slug}/{date}":{"get":{"description":"Get a single archived snapshot — the leaderboard and debate exactly as they were for a category on a given date (YYYY-MM-DD), plus navigation to the adjacent snapshots.","operationId":"PublicArchiveController_run","parameters":[{"name":"slug","required":true,"in":"path","description":"Category slug","schema":{"example":"crm","type":"string"}},{"name":"date","required":true,"in":"path","description":"Snapshot date (YYYY-MM-DD, UTC)","schema":{"example":"2026-05-24","type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"title":"ItemResponseOfPublicArchiveRunResponse","type":"object","properties":{"item":{"$ref":"#/components/schemas/PublicArchiveRunResponse"}},"required":["item"]}}}},"404":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}},"429":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiErrorEnvelope"}}}}},"summary":"Get archived run","tags":["Archive"]}}},"info":{"title":"Respectarium API","description":"\nThe **Respectarium API** is a public, read-only window into the observatory: how the three largest AI systems — ChatGPT, Claude, and Gemini — rank software brands when buyers ask for recommendations.\n\nEvery week we ask each provider the same buyer-intent question per category, aggregate their answers into a single cross-LLM consensus score (the **CLAI Score**, 0–100), and publish the result. This API exposes that data — categories, leaderboards, individual brands, the inter-model debates, and the full historical archive — as structured JSON.\n\nNo authentication. No API keys. No rate-tier upsell. The observatory works best with its doors open.\n\n### Data model\n\n- **Category** — a software market we observe (e.g. `crm`, `project-management`). Each has a weekly ranking cycle.\n- **Brand** — a product ranked within a category, identified by its domain (e.g. `hubspot.com`). Carries a CLAI Score, rank, trend vs. the previous cycle, and per-provider rationale.\n- **Debate** — a transcript of the three AI providers arguing toward (or away from) consensus on a category's ranking.\n- **Archive** — every past weekly snapshot, permalinked by category + date.\n- **methodologyVersion** — the version of the ranking methodology that produced a given run. Scores are only comparable within the same major version.\n\nAll timestamps are UTC ISO-8601. `cycleDate` marks the weekly cycle a record belongs to.\n\n### Response format\n\n**Single resource:**\n```json\n{ \"item\": { \"...\": \"...\" } }\n```\n\n**Collection:**\n```json\n{ \"items\": [ \"...\" ] }\n```\n\n**Paginated collection:**\n```json\n{ \"items\": [ \"...\" ], \"pagination\": { \"page\": 1, \"limit\": 20, \"total\": 47, \"totalPages\": 3, \"hasMore\": true } }\n```\n\n**Error:**\n```json\n{ \"error\": { \"code\": \"category_not_found\", \"message\": \"Category not found\", \"status\": 404 } }\n```\n\nPagination uses `?page=1&limit=20` — 1-indexed, default 20, max 100.\n\n### Error codes\n\nEvery error carries a machine-readable `code` for programmatic handling:\n\n| Code | Status | Meaning |\n|------|--------|---------|\n| `category_not_found` | 404 | No category with that slug |\n| `brand_not_found` | 404 | Brand not ranked in the requested scope |\n| `debate_not_found` | 404 | No debate exists for the category |\n| `archive_run_not_found` | 404 | No snapshot for that category and date |\n| `invalid_parameters` | 400 | Invalid query parameters or malformed input |\n| `rate_limit_exceeded` | 429 | Too many requests — slow down |\n| `internal_error` | 500 | Unexpected server error |\n\n**Note on 5xx:** the `message` for any 5xx is the static string `\"Internal server error\"`. Branch on `code`, never pattern-match `message` for 5xx.\n\n### Rate limits\n\n60 requests per minute per IP. Exceeding it returns `429 rate_limit_exceeded`. The data changes weekly — cache aggressively and you'll never see a 429.\n\n### Citation & license\n\nRespectarium data is published under **CC BY 4.0** — free to use with attribution. Suggested citation:\n\n```\nRespectarium. (2026). CRM — AI Rankings. Retrieved 2026-05-31 from https://respectarium.com/crm\n```\n\n### Quick start\n\nList the categories:\n```bash\ncurl https://api.respectarium.com/api/v1/categories\n```\n\nGet the CRM leaderboard:\n```bash\ncurl https://api.respectarium.com/api/v1/categories/crm\n```\n\nSearch for a brand across categories:\n```bash\ncurl \"https://api.respectarium.com/api/v1/search?q=hubspot\"\n```\n","version":"1.0","contact":{}},"tags":[],"servers":[{"url":"https://api.respectarium.com","description":"Production"}],"components":{"schemas":{"ApiErrorResponse":{"type":"object","properties":{"code":{"type":"string","description":"Machine-readable error code in snake_case","example":"category_not_found"},"message":{"type":"string","description":"Human-readable error message","example":"Category not found"},"status":{"type":"number","description":"HTTP status code","example":404}},"required":["code","message","status"]},"ApiErrorEnvelope":{"type":"object","properties":{"error":{"$ref":"#/components/schemas/ApiErrorResponse"}},"required":["error"]},"PublicApiIndexResponse":{"type":"object","properties":{"name":{"type":"string","description":"API name","example":"Respectarium API"},"version":{"type":"string","description":"API version","example":"1.0"},"description":{"type":"string","description":"One-line description of what the API exposes","example":"Public, read-only access to the Respectarium observatory — how ChatGPT, Claude, and Gemini rank software brands across categories."},"documentation":{"type":"string","description":"Human-readable API documentation URL","example":"https://respectarium.com/developers/api"},"openapiSpec":{"type":"string","description":"Machine-readable OpenAPI spec URL","example":"https://api.respectarium.com/api/v1/docs/openapi.json"},"methodologyVersion":{"type":"string","description":"Current ranking methodology version","example":"2.0.0"},"rateLimit":{"type":"string","description":"Rate-limit policy","example":"60 requests/minute per IP"},"license":{"type":"string","description":"Content license","example":"CC BY 4.0"},"citation":{"type":"string","description":"Suggested citation format (placeholders to fill in)","example":"Respectarium. (YYYY). [Title]. Retrieved [YYYY-MM-DD] from [URL]"}},"required":["name","version","description","documentation","openapiSpec","methodologyVersion","rateLimit","license","citation"]},"PublicCategorySummaryResponse":{"type":"object","properties":{"slug":{"type":"string","description":"URL-safe category slug","example":"crm"},"displayName":{"type":"string","description":"Human-readable category name","example":"CRM"},"description":{"type":"string","description":"What this category observes","example":"How AI ranks Customer Relationship Management tools for B2B SaaS companies."},"latestRunCycleDate":{"type":"object","description":"ISO date (UTC) of the latest completed ranking run, or null if none yet","example":"2026-05-31T00:00:00.000Z","nullable":true}},"required":["slug","displayName","description","latestRunCycleDate"]},"PublicBrandProviderResponse":{"type":"object","properties":{"provider":{"type":"string","enum":["chatgpt","claude","gemini"],"description":"AI provider","example":"chatgpt"},"rank":{"type":"number","description":"Rank this provider gave the brand (1 = top)","example":1},"positionConfidence":{"type":"number","description":"Provider's confidence in the position, 0–1","example":0.92},"mentionContext":{"type":"string","description":"How the provider framed the mention","example":"direct_recommendation"},"rankingRationale":{"type":"string","description":"Why the provider ranked the brand where it did","example":"Widely regarded as the market leader for inbound and B2B CRM."},"pricingSignal":{"type":"string","description":"Pricing signal surfaced by the provider","example":"premium"},"targetAudience":{"type":"string","description":"Target audience the provider associated with the brand","example":"Mid-market and enterprise B2B SaaS"},"differentiationValue":{"type":"string","description":"Differentiation value the provider cited","example":"All-in-one platform with deep marketing + sales integration."}},"required":["provider","rank","positionConfidence","mentionContext","rankingRationale","pricingSignal","targetAudience","differentiationValue"]},"PublicBrandResponse":{"type":"object","properties":{"category":{"type":"string","description":"Category slug the brand ranks in","example":"crm"},"domain":{"type":"string","description":"Brand domain (canonical identifier)","example":"hubspot.com"},"brandName":{"type":"string","description":"Brand display name","example":"HubSpot"},"brandSlug":{"type":"string","description":"URL-safe brand slug (domain with dots → dashes)","example":"hubspot-com"},"claiScore":{"type":"number","description":"CLAI Score (0–100) — the cross-LLM consensus ranking signal","example":99},"rank":{"type":"number","description":"Rank within the category (1 = top)","example":1},"previousRank":{"type":"number","description":"Rank in the previous cycle, or null if the brand is new","example":2,"nullable":true},"trend":{"type":"string","enum":["up","down","stable","new"],"description":"Movement vs the previous cycle","example":"up"},"scoreDelta":{"type":"number","description":"CLAI Score change vs the previous cycle","example":3},"providerCount":{"type":"number","description":"How many of the 3 providers mentioned the brand","example":3},"providers":{"description":"Per-provider breakdown","type":"array","items":{"$ref":"#/components/schemas/PublicBrandProviderResponse"}},"bestRationale":{"type":"string","description":"Strongest rationale across providers","example":"Market leader for inbound marketing and B2B CRM."},"bestDifferentiation":{"type":"string","description":"Strongest differentiation across providers","example":"All-in-one growth platform unifying marketing, sales, and service."},"cycleDate":{"type":"string","description":"ISO date (UTC) of the cycle this entry belongs to","example":"2026-05-31T00:00:00.000Z"},"isLatestCycle":{"type":"boolean","description":"True iff this entry is the category's latest completed cycle. Derived at read time — authoritative freshness signal.","example":true}},"required":["category","domain","brandName","brandSlug","claiScore","rank","previousRank","trend","scoreDelta","providerCount","providers","bestRationale","bestDifferentiation","cycleDate","isLatestCycle"]},"PublicCategoryLeaderboardResponse":{"type":"object","properties":{"slug":{"type":"string","description":"URL-safe category slug","example":"crm"},"displayName":{"type":"string","description":"Human-readable category name","example":"CRM"},"description":{"type":"string","description":"What this category observes","example":"How AI ranks Customer Relationship Management tools for B2B SaaS companies."},"brands":{"description":"Ranked brands, best first","type":"array","items":{"$ref":"#/components/schemas/PublicBrandResponse"}},"count":{"type":"number","description":"Number of brands in this cycle","example":18},"latestRunCycleDate":{"type":"object","description":"ISO date (UTC) of the latest completed run, or null if none","example":"2026-05-31T00:00:00.000Z","nullable":true},"methodologyVersion":{"type":"object","description":"Methodology version that produced the latest run, or null if none","example":"2.0.0","nullable":true}},"required":["slug","displayName","description","brands","count","latestRunCycleDate","methodologyVersion"]},"PublicDebateMessageResponse":{"type":"object","properties":{"provider":{"type":"string","enum":["chatgpt","claude","gemini"],"description":"Provider speaking this turn","example":"claude"},"turn":{"type":"number","description":"Turn number (1 = opening statement)","example":3},"message":{"type":"string","description":"The provider's argument this turn","example":"I'm moving Salesforce above HubSpot for enterprise scale, but concede HubSpot leads mid-market."},"rankings":{"description":"The provider's current top-5 brand names","example":["HubSpot","Salesforce","Pipedrive","Zoho CRM","Freshsales"],"type":"array","items":{"type":"string"}},"timestamp":{"type":"string","description":"ISO timestamp (UTC) of the turn","example":"2026-05-31T02:14:07.918Z"}},"required":["provider","turn","message","rankings","timestamp"]},"PublicDebateResponse":{"type":"object","properties":{"id":{"type":"string","description":"Debate run identifier","example":"665f1a2b3c4d5e6f7a8b9c0d"},"category":{"type":"string","description":"Category slug","example":"crm"},"cycleDate":{"type":"string","description":"ISO date (UTC) of the cycle that produced this debate","example":"2026-05-31T00:00:00.000Z"},"consensus":{"nullable":true,"description":"Agreed top-5 if consensus was reached, else null","example":["HubSpot","Salesforce","Pipedrive","Zoho CRM","Freshsales"],"type":"array","items":{"type":"string"}},"messages":{"description":"Full transcript, in order","type":"array","items":{"$ref":"#/components/schemas/PublicDebateMessageResponse"}},"totalTurns":{"type":"number","description":"Total turns in the debate","example":7},"totalTimeMs":{"type":"number","description":"Wall-clock duration of the debate, ms","example":48213},"status":{"type":"string","enum":["started","completed","failed"],"description":"Debate lifecycle status","example":"completed"},"startedAt":{"type":"string","description":"ISO timestamp (UTC) the debate started","example":"2026-05-31T02:13:19.705Z"},"completedAt":{"type":"object","description":"ISO timestamp (UTC) the debate completed, or null if still running/failed","example":"2026-05-31T02:14:07.918Z","nullable":true},"methodologyVersion":{"type":"object","description":"Methodology version that produced this debate, or null","example":"2.0.0","nullable":true}},"required":["id","category","cycleDate","consensus","messages","totalTurns","totalTimeMs","status","startedAt","completedAt","methodologyVersion"]},"PublicCategoryRef":{"type":"object","properties":{"slug":{"type":"string","description":"URL-safe category slug","example":"crm"},"displayName":{"type":"string","description":"Human-readable category name","example":"CRM"}},"required":["slug","displayName"]},"PublicBrandDetailResponse":{"type":"object","properties":{"category":{"description":"Category the brand ranks in","allOf":[{"$ref":"#/components/schemas/PublicCategoryRef"}]},"brand":{"description":"The brand's latest entry","allOf":[{"$ref":"#/components/schemas/PublicBrandResponse"}]},"latestRunCycleDate":{"type":"object","description":"ISO date (UTC) of the latest completed run, or null if none","example":"2026-05-31T00:00:00.000Z","nullable":true},"methodologyVersion":{"type":"object","description":"Methodology version that produced the latest run, or null if none","example":"2.0.0","nullable":true}},"required":["category","brand","latestRunCycleDate","methodologyVersion"]},"PaginationMeta":{"type":"object","properties":{"page":{"type":"number","description":"Current page number (1-indexed)","example":1},"limit":{"type":"number","description":"Number of items per page","example":20},"total":{"type":"number","description":"Total number of items across all pages","example":47},"totalPages":{"type":"number","description":"Total number of pages","example":3},"hasMore":{"type":"boolean","description":"Whether more pages exist after the current page","example":true}},"required":["page","limit","total","totalPages","hasMore"]},"PublicSearchHitResponse":{"type":"object","properties":{"category":{"type":"string","description":"Category slug","example":"crm"},"domain":{"type":"string","description":"Brand domain","example":"hubspot.com"},"brandName":{"type":"string","description":"Brand display name","example":"HubSpot"},"rank":{"type":"number","description":"Latest rank in this category","example":1},"claiScore":{"type":"number","description":"Latest CLAI Score in this category","example":99},"cycleDate":{"type":"string","description":"ISO date (UTC) of the brand's latest entry in this category","example":"2026-05-31T00:00:00.000Z"},"isLatestCycle":{"type":"boolean","description":"True iff cycleDate matches the category's latest completed run","example":true}},"required":["category","domain","brandName","rank","claiScore","cycleDate","isLatestCycle"]},"PublicBrandCategoryEntry":{"type":"object","properties":{"category":{"$ref":"#/components/schemas/PublicCategoryRef"},"latestEntry":{"$ref":"#/components/schemas/PublicBrandResponse"}},"required":["category","latestEntry"]},"PublicBrandCategoriesResponse":{"type":"object","properties":{"domain":{"type":"string","description":"Brand domain","example":"hubspot.com"},"brandName":{"type":"string","description":"Brand display name","example":"HubSpot"},"categories":{"description":"Categories the brand ranks in","type":"array","items":{"$ref":"#/components/schemas/PublicBrandCategoryEntry"}}},"required":["domain","brandName","categories"]},"PublicArchiveIndexItemResponse":{"type":"object","properties":{"slug":{"type":"string","description":"URL-safe category slug","example":"crm"},"displayName":{"type":"string","description":"Human-readable category name","example":"CRM"},"dates":{"description":"Snapshot dates (YYYY-MM-DD, UTC), newest first","example":["2026-05-31","2026-05-24","2026-05-17"],"type":"array","items":{"type":"string"}}},"required":["slug","displayName","dates"]},"PublicArchiveNavigation":{"type":"object","properties":{"previous":{"type":"object","description":"Previous snapshot date (YYYY-MM-DD), or null","example":"2026-05-24","nullable":true},"next":{"type":"object","description":"Next snapshot date (YYYY-MM-DD), or null","example":"2026-06-07","nullable":true}},"required":["previous","next"]},"PublicArchiveRunResponse":{"type":"object","properties":{"category":{"description":"Category of the snapshot","allOf":[{"$ref":"#/components/schemas/PublicCategoryRef"}]},"cycleDate":{"type":"string","description":"Snapshot date (YYYY-MM-DD, UTC)","example":"2026-05-24"},"brands":{"description":"Ranked brands as of this snapshot","type":"array","items":{"$ref":"#/components/schemas/PublicBrandResponse"}},"debate":{"nullable":true,"description":"The debate from this snapshot (carries its own methodologyVersion), or null","type":"object","allOf":[{"$ref":"#/components/schemas/PublicDebateResponse"}]},"navigation":{"description":"Adjacent snapshot dates","allOf":[{"$ref":"#/components/schemas/PublicArchiveNavigation"}]}},"required":["category","cycleDate","brands","debate","navigation"]}}}}